설명
SSH(Secure Shell) 프로토콜에서는 원격 호스트의 신원을 확인하기 위해 호스트 키(host key) 를 사용합니다.
호스트 키 검증 없이 자동으로 허용하면 중간자 공격(Man-in-the-Middle, MitM) 에 취약해질 수 있습니다.
paramiko.SSHClient.set_missing_host_key_policy(AutoAddPolicy)를 사용하면 보안 위협이 발생할 수 있습니다.
이 정책을 사용하면 신뢰할 수 없는 호스트 키도 자동으로 허용되므로 공격자가 가짜 서버를 이용해 접속을 가로챌 가능성이 있습니다.
잠재적 영향
- 중간자 공격(MitM): 공격자가 가짜 SSH 서버를 설정하여 사용자의 인증 정보를 탈취할 수 있음.
- 세션 조작: 악성 연결 상대가 명령을 수신하고 반환하는 응답을 조작할 수 있음.
- 데이터 조작: 공격자가 SSH 통신을 가로채고 조작할 수 있음.
해결 방법
-
AutoAddPolicy사용 금지AutoAddPolicy를 사용하면 인증되지 않은 호스트 키도 자동으로 저장되므로 보안에 취약함.- 대신,
RejectPolicy를 사용하여 신뢰할 수 없는 호스트 키를 거부해야 합니다.
-
신뢰할 수 있는 호스트 키를
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)를 사용하여 미검증 호스트 키를 거부함.