신뢰할 수 없는 SSH 호스트 키 허용 (Paramiko Missing Host Key Validation)

Accepting Unknown SSH Host Keys when using Paramiko

설명

SSH(Secure Shell) 프로토콜에서는 원격 호스트의 신원을 확인하기 위해 호스트 키(host key) 를 사용합니다.
호스트 키 검증 없이 자동으로 허용하면 중간자 공격(Man-in-the-Middle, MitM) 에 취약해질 수 있습니다.

paramiko.SSHClient.set_missing_host_key_policy(AutoAddPolicy)를 사용하면 보안 위협이 발생할 수 있습니다.
이 정책을 사용하면 신뢰할 수 없는 호스트 키도 자동으로 허용되므로 공격자가 가짜 서버를 이용해 접속을 가로챌 가능성이 있습니다.

잠재적 영향

  • 중간자 공격(MitM): 공격자가 가짜 SSH 서버를 설정하여 사용자의 인증 정보를 탈취할 수 있음.
  • 세션 조작: 악성 연결 상대가 명령을 수신하고 반환하는 응답을 조작할 수 있음.
  • 데이터 조작: 공격자가 SSH 통신을 가로채고 조작할 수 있음.

해결 방법

  1. AutoAddPolicy 사용 금지

    • AutoAddPolicy를 사용하면 인증되지 않은 호스트 키도 자동으로 저장되므로 보안에 취약함.
    • 대신, RejectPolicy를 사용하여 신뢰할 수 없는 호스트 키를 거부해야 합니다.
  2. 신뢰할 수 있는 호스트 키를 load_host_keys() 또는 known_hosts 파일에서 로드

    • 신뢰할 수 있는 별도 경로에서 호스트 키의 지문을 확인한 뒤 등록하세요. 키가 변경되면 원인을 확인하고 승인된 값으로 갱신하세요. 같은 연결에서 받은 키를 검증 없이 등록하지 마세요.

예시

변경 전

python
from paramiko.client import SSHClient, AutoAddPolicy

client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy) # 보안 취약
client.connect("example.com")

변경 후

python
from paramiko.client import SSHClient, RejectPolicy

client = SSHClient()
client.load_system_host_keys() # known_hosts에서 호스트 키 로드
client.set_missing_host_key_policy(RejectPolicy) # 신뢰할 수 없는 호스트 키 거부
client.connect("example.com")

설명:

  • 변경 전:
    • set_missing_host_key_policy(AutoAddPolicy)를 사용하여 미검증 호스트 키를 자동으로 허용함.
  • 변경 후:
    • load_system_host_keys()를 사용하여 로컬의 ~/.ssh/known_hosts 파일에서 신뢰할 수 있는 호스트 키를 로드함.
    • set_missing_host_key_policy(RejectPolicy)를 사용하여 미검증 호스트 키를 거부함.

참조