인증을 위해 개인 키를 수락하세요.

인증을 위해 개인 키를 수락하세요.

연결 클라이언트가 제공하는 키를 허용하도록 OpenSSH(또는 다른 표준 sshd)를 구성할 수 있습니까?

EG는 ssh -i ~/arbitraryKey hostname로그인 셸을 부여하지만 ssh hostanmeEG는 부여하지 않습니다.

잘못 구성된 서버에 대한 일화가 있어서 이 질문을 드리는 것인데, 살펴보니 어떤 형태의 의도적인 해킹 데몬 없이는 실제로 그런 일이 일어날 수 있는 내용을 찾을 수 없습니다. (재컴파일 등)

답변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 연결이 허용됩니다. 그것은 중요하지 않습니다어느키가 사용 중입니다. 공개 키 인증이 불가능한 연결은 거부됩니다.

관련 정보