노출 된 RPC로 Tezos 노드를 호스팅하기위한 모범 사례는 무엇입니까?
4 대답
- 투표
-
- 2019-02-06
다음 중 하나 :
- RPC를 전혀 노출하지 마십시오 (!) 또는
- 최대 제한 허용 목록 으로 프록시를 앞에 배치합니다.
물론 허용 목록이 도움이 되려면 허용 목록에 잠재적으로 유해한 엔드 포인트를 포함해서는 안됩니다. 무해 해 보이는 엔드 포인트도 서비스 거부에 사용될 수 있으며 일부 엔드 포인트는 놀랍게도 유해합니다.
Either:
- don't expose the RPC at all (!), or
- put a proxy in front with a maximally restrictive whitelist.
Of course, for a whitelist to help, you must not include potentially harmful endpoints in your whitelist... Even seemingly harmless endpoints might be used for denial of service, and some endpoints are surprisingly harmful.
-
- 2019-02-06
TezRPC (TezBox를 구동)를 위해 우리가하는 일은 각 서버에서 프록시를 실행하는 것입니다. 이 프록시 내에서 공용 엔드 포인트를 차단,제한 및 사용자 지정할 수 있습니다.
현재 NodeJS로 빌드 된 가벼운 프록시를 사용하고 있지만nginx 스타일 프록시로 전환 할 예정입니다 (더 나은 성능).
다음은 거의 모든 엔드 포인트를 차단하는node.js 프록시의 예입니다 (포트 8732에서 로컬 RPC API 수신).
var express = require('express'); var request = require('request'); var app = express(); var cors = require('cors') var apiServerHost = "http://localhost:8732"; app.use(cors()) app.use('/', function(req, res) { // Whitelist. Be afraid. if (req.url === '/chains/main/blocks/head' || req.url === '/chains/main/blocks/head/hash') { var url = apiServerHost + req.url; req.pipe(request(url)).pipe(res); } else { res.status(404).send('Not available'); } }); app.listen(process.env.PORT || 3000, function () { console.log('TZProxy running') })
What we do for TezRPC (which powers TezBox) is run a proxy on each server. Within this proxy, you can then block, restrict and customize public facing endpoints.
We currently use a light proxy built with NodeJS, but will switch over to a nginx style proxy (better performance).
Here is an example of a node.js proxy that blocks almost all endpoints (listening to the local RPC API on port 8732):
var express = require('express'); var request = require('request'); var app = express(); var cors = require('cors') var apiServerHost = "http://localhost:8732"; app.use(cors()) app.use('/', function(req, res) { // Whitelist. Be afraid. if (req.url === '/chains/main/blocks/head' || req.url === '/chains/main/blocks/head/hash') { var url = apiServerHost + req.url; req.pipe(request(url)).pipe(res); } else { res.status(404).send('Not available'); } }); app.listen(process.env.PORT || 3000, function () { console.log('TZProxy running') })
-
예를 들어 여기에있는 블랙리스트는 질문의 새 엔드 포인트를 허용합니다.:(So your blacklist here will allow the new endpoints in the question, for example. :(
- 0
- 2019-02-06
- Tom
-
사용자가 요청하는 사용자 지정 프록시를 배포하는 방법에 대한 예제를 게시했습니다.언급했듯이 "일부 엔드 포인트"를 차단합니다.I was simply posting an example of how to deploy a custom proxy, which is what the user is asking for. As mentioned, it blocks "some endpoints".
- 0
- 2019-02-06
- Stephen Andrews
-
나는 실제로 오늘 일찍 당신의 노드를 가지고 놀았는데,꽤 긴 응답 시간 ~ 700ms (유럽에서)를 발견했습니다.I was actually playing around with your nodes earlier today, noticed pretty long response times ~700ms (from Europe).
- 0
- 2019-02-06
- Matej maht0rz Šima
-
네,nginx 스위치가 속도를 높이 길 바래요Yep hoping the nginx switch will speed it up
- 0
- 2019-02-06
- Stephen Andrews
-
블랙리스트 접근 방식을 제안하는 것은 제한적인 화이트리스트를 사용하는 것보다 확실히 덜 안전합니다.질문이 모범 사례와 관련되어 있으므로 예제를 화이트리스트로 변경하여 답변을 개선 할 수 있으며 블랙리스트 접근 방식에는 많은 보안 단점이 있습니다.Owasp는이 주제에 대한 좋은 리소스를 가지고 있습니다. https://www.owasp.org/index.php/Input_Validation_Cheat_SheetProposing a blacklist approach is certainly less secure than using a restrictive whitelist. Since the question is related to best practice, the answer could be improved by changing the example to a whitelist, the blacklist approach has many security shortcomings. Owasp have a good resource on this topic https://www.owasp.org/index.php/Input_Validation_Cheat_Sheet
- 2
- 2019-02-06
- xtzbaker
-
Stephen-지리적 위치와도 관련이있을 수 있지만 여기서 주요 주제는 아닙니다.Stephen - it could be related to geolocation as well, but that's not the main topic here.
- 0
- 2019-02-06
- Matej maht0rz Šima
-
화이트리스트를 사용하도록 예제를 업데이트했습니다.이전 및 새 불량 엔드 포인트를 제외합니다.예를 들어 [스냅 샷 관련 RPC] (https://gitlab.com/nomadic-labs/tezos/commit/3345423ebaa9b5ebd3f075124eaa7f0b47acaed3)를 추가하는 아이디어가있었습니다.내가 허용 한 두 끝 점이 합리적으로 안전하기를 바랍니다.I updated the example to use a whitelist. This will exclude old and new bad endpoints. For example, there was some idea to add [snapshot-related RPCs](https://gitlab.com/nomadic-labs/tezos/commit/3345423ebaa9b5ebd3f075124eaa7f0b47acaed3). I hope the two endpoints I allowed are reasonably safe...
- 0
- 2019-07-04
- Tom
-
- 2019-02-06
제가 생각할 수있는 대안 중 하나는
Conseil
을 사용하는 것입니다. https://github.com/Cryptonomic/ConseilConseil이하는 일을 겸손하게 이해하는 것은tezos-node/rpc 위에 확장 된 API를 제공하는 것입니다.그리고 아마도 (?) 엔드 포인트 또는 기타 보안 조치를 활성화/비활성화 할 수있는 몇 가지 추가 기능입니다.
One of the alternatives i could think of, is using
Conseil
: https://github.com/Cryptonomic/ConseilIn my humble understanding what Conseil does, is provide an extended API on top of a tezos-node/rpc. And perhaps (?) some extra features which could allow enabling/disabling endpoints or other security measures.
-
답변을 확장 해 주시겠습니까?감사!Could you please expand on your answer ? Thanks!
- 1
- 2019-02-06
- Ezy
-
예제와 설명으로 주석을 업데이트했습니다.Updated the comment with examples and explanation.
- 1
- 2019-02-06
- Matej maht0rz Šima
-
- 2019-02-09
RPC 만 필요한 경우 ssh 로컬 포트 포워딩을 사용하여 원격 시스템의 로컬 호스트에서 로컬 시스템의 로컬 호스트로 RPC를 전달할 수도 있습니다.
예를 들어 백그라운드 프로세스 :
ssh -fNT -L 8732:localhost:8732 user@hostname
이게 얼마나 안전한지 모르겠습니다.
When you only need the RPC for yourself you could also use ssh local port forwarding to forward the RPC from the localhost of your remote machine to the localhost of your local machine.
For instance, as a background process:
ssh -fNT -L 8732:localhost:8732 user@hostname
I don't know how safe this is though.
내 자신의 노드를 호스팅하는 경우 (예 :
TezBox
처럼 특정 RPC 엔드 포인트의 접근성과 관련하여 가장 좋은 방법은 무엇입니까?TzScan은 여기에 설명 된 처럼 특정 호출을 이미 제한하고 있습니다.
Tezos 문서 는 다음과 같이 조언합니다.
<인용구>클라이언트가 다음을 수행하려면 RPC 인터페이스를 활성화해야합니다. 노드와 통신하지만 공개적으로 액세스 할 수 없어야합니다. 인터넷.
새로운 메모리 관리 업데이트 ,추가 RPC 엔드 포인트를 사용할 수 있으며 알지 못하는 사이에 공개적으로 노출되면 위험 할 수 있습니다.