연결 클라이언트가 제공하는 키를 허용하도록 OpenSSH(또는 다른 표준 sshd)를 구성할 수 있습니까?
EG는 ssh -i ~/arbitraryKey hostname
로그인 셸을 부여하지만 ssh hostanme
EG는 부여하지 않습니다.
잘못 구성된 서버에 대한 일화가 있어서 이 질문을 드리는 것인데, 살펴보니 어떤 형태의 의도적인 해킹 데몬 없이는 실제로 그런 일이 일어날 수 있는 내용을 찾을 수 없습니다. (재컴파일 등)
답변1
PAM을 사용하여 모든 비밀번호를 허용하도록 SSH 서버를 구성하는 것은 쉽습니다. 스택 pam_permit
에 비밀번호를 올려두기만 auth
하면 됩니다. 이러한 개방형 시스템을 잘못 구성할 가능성은 PAM의 유연성에 내재되어 있습니다. 이를 통해 필요한 만큼 많은 테스트를 연결할 수 있으므로 테스트가 0이 될 가능성은 피할 수 없습니다(적어도 모든 경우에 이상한 이상 현상을 처리할 수 없게 되는 것은 아닙니다). .
키 인증은 PAM을 거치지 않으며 "모든 키 허용"에 대한 구성 설정이 없습니다. 이는 드문 경우(테스트 또는 허니팟)에만 유용하므로 옵션으로 제공할 가치가 없습니다(구성 오류의 위험이 내재되어 있음).
답변2
Gilles는 익명의 SSH 구성이 "극히 드문 경우에만 유용하다"고 제안하지만 그러한 드문 경우 중 하나는 다음과 같습니다.특수 매트페어 프로그래밍 및 기타 유형의 공유 터미널 세션을 위해 전 세계 개발자가 사용하는 서비스입니다.
당신은 그것을 사용할 수 있습니다파라미코ssh
공개 키를 사용하여 연결을 허용하는 서버를 생성하기 위한 Python 라이브러리입니다.거부하다연결을 위한 키가 제공되지 않습니다.
예를 들어:
#!/usr/bin/python
import paramiko
import socket
import threading
host_key = paramiko.RSAKey(filename='hostkey')
class Server(paramiko.ServerInterface):
def __init__(self):
self.event = threading.Event()
def check_channel_request(self, kind, chanid):
if kind == 'session':
return paramiko.OPEN_SUCCEEDED
def check_auth_publickey(self, username, key):
return paramiko.AUTH_SUCCESSFUL
def get_allowed_auths(self, username):
return 'publickey'
def check_channel_exec_request(self, channel, command):
# This is the command we need to parse
print('client sent command: {}'.format(command))
self.event.set()
return True
def listener():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 2222))
sock.listen(100)
client, addr = sock.accept()
t = paramiko.Transport(client)
t.set_gss_host(socket.getfqdn(""))
t.load_server_moduli()
t.add_server_key(host_key)
server = Server()
t.start_server(server=server)
# Wait 30 seconds for a command
server.event.wait(30)
t.close()
while True:
try:
listener()
except KeyboardInterrupt:
pass
이렇게 하면 사용 가능한 개인 키를 사용하여 SSH 연결이 허용됩니다. 그것은 중요하지 않습니다어느키가 사용 중입니다. 공개 키 인증이 불가능한 연결은 거부됩니다.