2012-06-27 2 views
3

user : password @ host를 사용하지 않고 xmlrpc 서버 (P2P 네트워크의 노드에서 실행 됨)에 인증을 추가하려고합니다. 모든 공격자에게. 인증은 기본적으로 개인 네트워크를 생성하여 권한이없는 사용자가 액세스하지 못하게합니다.(파이썬) 트위스트 xmlrpc 서버에 인증을 추가하는 방법

내 솔루션은 this과 매우 비슷한 도전 응답 시스템을 만드는 것이지만 xmlrpc 서버 코드에이를 추가하는 방법을 알지 못합니다. 유사한 질문 (사용자 지정 인증이 필요한 곳) here가 있습니다.

그래서 클라이언트가 서버에 연결될 때마다 호출되는 모듈을 만들려고했습니다. 이것은 클라이언트에서 실행중인 시도 응답 서버에 연결되며 클라이언트가 올바르게 응답하면 True를 반환합니다. 유일한 문제는 모듈을 한 번 호출하면 원자로를 다시 시작할 수 없다는 것입니다. 그래서 "check()"함수가 호출되어 연결할 때마다 클래스를 가질 수있는 방법이 있습니까?

SSL을 사용하여 연결하는 것이 가장 간단한 방법일까요? 그건 비밀 번호를 보호할까요? 모든 노드에 대해 SSL 인증서를 생성하지 않아도되기 때문에이 솔루션이 최적은 아니지만.

답변

2

아래의 전체 예제를 찾고있는 사람은 제 것이 옳습니다 (올바른 방향으로 나를 가리키며 Rakis에게 감사드립니다). 여기에서 사용자와 암호는 'passwd'파일에 저장됩니다 (자세한 내용과 변경 방법은 첫 번째 유용한 링크 참조).

서버 :

#!/usr/bin/env python 
import bjsonrpc 
from SRPSocket import SRPSocket 
import SocketServer 
from bjsonrpc.handlers import BaseHandler 
import time 

class handler(BaseHandler): 
    def time(self): 
     return time.time() 

class SecureServer(SRPSocket.SRPHost): 
    def auth_socket(self, socket): 
     server = bjsonrpc.server.Server(socket, handler_factory=handler) 
     server.serve() 

s = SocketServer.ForkingTCPServer(('', 1337), SecureServer) 
s.serve_forever() 

클라이언트 :

#! /usr/bin/env python 
import bjsonrpc 
from bjsonrpc.handlers import BaseHandler 
from SRPSocket import SRPSocket 
import time 

class handler(BaseHandler): 
    def time(self): 
     return time.time() 

socket, key = SRPSocket.SRPSocket('localhost', 1337, 'dht', 'testpass') 

connection = bjsonrpc.connection.Connection(socket, handler_factory=handler) 

test = connection.call.time() 
print test 
time.sleep(1) 

몇 가지 유용한 링크 :

2

고유 한 인증 체계를 고안하지 마십시오. 이미 많은 훌륭한 계획이 있으며, 귀하는 귀하의 발명에 존재하는 취약점에 대한 보안 연구를 수행하는 것에 대한 책임을지고 싶지 않습니다.

HTTP (XML-RPC가 실행되는 방식으로 XML-RPC에 적용됨)에 대해 널리 인증되는 두 가지 인증 메커니즘이 있습니다. 하나는 "기본"이고 다른 하나는 "다이제스트"입니다. "Basic"은 SSL을 통해 실행하기로 결정한 경우에 적합합니다. SSL을 사용할 수 없다면 다이제스트가 더 적절합니다.

둘 다 twisted.web.guard.HTTPAuthSessionWrapper을 통해 Twisted Web에서 지원되며 copious documentation입니다.

+0

유일한 문제는 서버가 신뢰할 수 있다고 가정합니다. P2P 노드가 실수로 공격자의 IP를 받았다면 user : pass @ host를 사용하여 로그인 세부 정보를 제공합니다.내 인증은 상호이므로 서버가 암호를 알고 있음을 보장합니다. – bradleyjkemp

+0

다이제스트 인증은 일반 텍스트 암호를 서버에 표시하지 않습니다. 그러나 SSL을 사용하는 것이 더 나을 것 같습니다. 모든 노드에 대해 SSL 인증서를 생성하는 것은 그렇게 어렵지 않으며 훨씬 강력한 보증을 제공합니다. –

+0

내가하고 싶은 것은 연결하려는 노드가 네트워크의 일부가 될 수 있는지 확인하는 것입니다. SSL에서 이렇게하려면 모든 인증서에 서명하고 그 인증서 만 신뢰하는 인증 기관이 필요합니다. 병렬 Python은 내가 만들려고하는 것과 유사한 시스템을 가지고 있지만 어떻게 구현되는지는 확신 할 수 없습니다. – bradleyjkemp

2

문제 설명에 따라 Secure Remote Password Protocol 명이 찾고있는 것 같습니다. SSL 인증서 관리의 복잡성없이 강력한 상호 인증을 제공하는 암호 기반 메커니즘입니다. SSL 인증서만큼 유연하지는 않지만 사용하기 쉽고 이해하기 쉽습니다 (전체 프로토콜 설명은 단일 페이지에 맞습니다). 저는 종종 신뢰할 수있는 제 3 자 (일명 Kerberos/CA 기관)가 적절하지 않은 상황에서 유용한 도구라고 생각했습니다.

+0

고마워요. 제가 찾던 바로 그 거예요. 내가 왜 이것을 꼬인 곳에 추가 할 것인지 어떻게 아는가? 하나의 문제는 XMLRPC가 무 상태이므로 다른 상태 저장 프로토콜을 사용해야 할 수도 있습니다. – bradleyjkemp

관련 문제