의도치 않은 SSH Security Guideline 따르기 — ssh_scan

예전에 Y모사에서는 SSH 잘 모른다고 옥상에 불러놓고 막 그랬다고 한다

요즘 메일을 보고 있다가 “이런 취약점이 있으니 서둘러 수정해주세요”라는 내용을 자주 보게 되었다. 대개 보고 있으면 ‘굳이 이런 서버에 이런 것까지…’ 라는 생각이 안드는 것도 아니다. 그렇다고 무시하며 취약점을 수정하지 않으면 입금이 되지 않거나, 나랑 싸우자는 것이냐 같은 언성이 오갈 우려가 있으니 대개는 수정하기 마련일 것이다.

스크립트를 돌려서 취약점을 뽑아내서, 로그를 보고 엑셀에 정리를 하고, 위험도에 따라서 색을 알록달록하게 하는 등등의 일들을 누군가가 하고 있다. 취약점이나 이런 것들을 무시하는 것은 아니다. 결국은 업무루틴 안에 상세하게 정착되지 않았기에 누군가는 엑셀을 열어서 증적자료를 채워넣어야 하는 상황이 계속 반복되는 것이 아닐까?

서두가 길었지만 지금 말하고자 하는 것은 그런 것들을 자동화하는 것은 아니다. 다만 다른 누군가가 뭐라고 하기 전에 선제적으로 적어도 이런 가이드에 따른 설정을 준수하고 있다고 미리 박아놓으면 나중에 소소한 행복을 미리 누릴 수 있지 않을까?

그렇다고 모든 서비스 데몬들에 대해 이런 것들을 시리즈로 제공하려는 계획은 없으며, 그럴 의도도 없다. 서두가 길었지만 뭐 말하고자 하는 것은 이거다.

마침 참고하면 좋을 SSH Security Guideline을 발견하여 공유하고자 한다.

https://wiki.mozilla.org/Security/Guidelines/OpenSSH

다름아닌 Mozilla 에서 제시한 가이드라인이니까 우린 최소한 이 수준에 맞추고 있다고 자랑할 수 있을 것이다. SSH Server와 SSH Client의 설정, 키 생성과 관리 요령, 점프호스트(jumphost)/배스쳔(bastion)을 거쳐서 다른 서버에 접근할 때의 방법 등에 대해서 소개되어 있다. 특히 ProxyCommandnc를 막 쓰던 것이 Older versions로 분류되어 매도당하는 기분은 나처럼 이런 식으로 서버 경유를 하고 있는 사람이라면 같이 느껴볼 만하다.

https://github.com/mozilla/ssh_scan

또한 Mozilla에서는 이런 가이드라인에 맞춘 정책으로 안전하게 SSH 통신을 할수 있는지를 ssh_scan이라는 툴을 사용해서 확인할 수 있다. 이 툴을 사용해서 나는 널리 알려진 취약점에 드러나지 않은 안전한 통신을 하고 있는지 알 수 있다. 다음은 Ubuntu 16.04의 기본 설정을 사용하고 있는 서버에 돌려본 결과이다.

$ ./bin/ssh_scan -t xx.xxx.xxx.xxxx
[
{
"ssh_scan_version": "0.0.22",
"ip": "xx.xxx.xxx.xxx",
"hostname": "ec2-xx-xxx-xxx-xxx.ap-northeast-2.compute.amazonaws.com",
"port": 22,
"server_banner": "SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.2",
"ssh_version": 2.0,
"os": "ubuntu",
"os_cpe": "o:canonical:ubuntu:16.04",
"ssh_lib": "openssh",
"ssh_lib_cpe": "a:openssh:openssh:7.2p2",
"key_algorithms": [
"curve25519-sha256@libssh.org",
"ecdh-sha2-nistp256",
"ecdh-sha2-nistp384",
"ecdh-sha2-nistp521",
"diffie-hellman-group-exchange-sha256",
"diffie-hellman-group14-sha1"
],
"encryption_algorithms_client_to_server": [
"chacha20-poly1305@openssh.com",
"aes128-ctr",
"aes192-ctr",
"aes256-ctr",
"aes128-gcm@openssh.com",
"aes256-gcm@openssh.com"
],
"encryption_algorithms_server_to_client": [
"chacha20-poly1305@openssh.com",
"aes128-ctr",
"aes192-ctr",
"aes256-ctr",
"aes128-gcm@openssh.com",
"aes256-gcm@openssh.com"
],
"mac_algorithms_client_to_server": [
"umac-64-etm@openssh.com",
"umac-128-etm@openssh.com",
"hmac-sha2-256-etm@openssh.com",
"hmac-sha2-512-etm@openssh.com",
"hmac-sha1-etm@openssh.com",
"umac-64@openssh.com",
"umac-128@openssh.com",
"hmac-sha2-256",
"hmac-sha2-512",
"hmac-sha1"
],
"mac_algorithms_server_to_client": [
"umac-64-etm@openssh.com",
"umac-128-etm@openssh.com",
"hmac-sha2-256-etm@openssh.com",
"hmac-sha2-512-etm@openssh.com",
"hmac-sha1-etm@openssh.com",
"umac-64@openssh.com",
"umac-128@openssh.com",
"hmac-sha2-256",
"hmac-sha2-512",
"hmac-sha1"
],
"compression_algorithms_client_to_server": [
"none",
"zlib@openssh.com"
],
"compression_algorithms_server_to_client": [
"none",
"zlib@openssh.com"
],
"languages_client_to_server": [
],
"languages_server_to_client": [
],
"auth_methods": [
"publickey"
],
"fingerprints": {
"rsa": {
"known_bad": "false",
"md5": "7a:2a:12:27:5d:d3:a2:fb:0c:7e:51:04:e6:14:a3:ab",
"sha1": "66:4f:f0:b3:b8:84:c4:fe:72:d5:16:63:91:bc:b8:c6:32:57:f5:12",
"sha256": "20:dc:5e:f2:50:dc:ce:e6:28:9b:e8:4d:42:af:b8:5a:73:c0:f1:10:d0:f8:fe:d4:d8:a1:4d:63:66:83:05:0e"
}
},
"duplicate_host_key_ips": [
],
"compliance": {
"policy": "Mozilla Modern",
"compliant": false,
"recommendations": [
"Remove these key exchange algorithms: diffie-hellman-group14-sha1",
"Remove these MAC algorithms: umac-64-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64@openssh.com, hmac-sha1"
],
"references": [
"https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
]
},
"start_time": "2017-06-09 17:21:03 +0900",
"end_time": "2017-06-09 17:21:03 +0900",
"scan_duration_seconds": 0.421795
}
]

Mozilla Modern 정책을 준수하지 않는 순종적이지 않은 서버라고 한다. 그럼 위의 가이드라인에 따라서 서버의 /etc/ssh/sshd_config 를 수정해보고,

/etc/ssh/sshd_config


KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
MACs hmac-sha2–512-etm@openssh.com,hmac-sha2–256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2–512,hmac-sha2–256,umac-128@openssh.com

다시 ssh_scan을 돌리면 ,

    "compliance": {
"policy": "Mozilla Modern",
"compliant": true,
"recommendations": [
      ],
"references": [
"https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
]
},

이렇게 정책에 순종적인( .compliance.compliant=true) 상황이 되었다. 기본적인 정책 파일은 아래와 같다.

https://github.com/mozilla/ssh_scan/blob/master/config/policies/mozilla_modern.yml

인증방식을 공개 키 방식으로 하거나, 키 교환 방식 등을 안전하다고 알려진 알고리즘만을 사용하도록 하는 것이다. SSH 기본 포트를 바꾸는 곳도 자주 보는데, 그걸 툴에서는 커버하는 -p 옵션도 있다. 스캔 대상은 -t 로 지정한다. 다만 이 때 ~/.ssh/config 에 정의한 Host는 참고하지 않는다.

https://wiki.mozilla.org/Security/Automation/Winter_Of_Security_2016

Mozilla는 보안 관련 커리큘럼을 듣고 있는 학생들을 프로젝트에 참여할 수 있도록 하는 The Winter Of Security 프로그램을 운영하고 있는데, 이 ssh_scan은 이 프로그램의 생산물로 나온 것으로 보인다.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.