labunix's blog

labunixのラボUnix

sshdで弱い暗号方式を使用しないようにする。

■sshdで弱い暗号方式を使用しないようにする。
 以下がとてもわかりやすい。

 SSHサーバセキュリティ設定ガイド
 http://www.nca.gr.jp/imgs/nca_ssh_server_config_v01.pdf

 ただ、「弱い暗号方式やメッセージ認証コードを利用しない【オプション】」が、
 若干分かりにくかったのと、CBCだけでなく、
 RC4やMD5、SHA-1の無効を追加したかったので、やってみた。

■今回テストしたバージョンは以下のとおり。

$ lsb_release -d
Description:	Debian GNU/Linux 8.3 (jessie)

$ ssh -V
OpenSSH_6.7p1 Debian-5+deb8u1, OpenSSL 1.0.1k 8 Jan 2015

$ sudo sshd -v 2>&1 | awk '/Open/'
OpenSSH_6.7p1 Debian-5+deb8u1, OpenSSL 1.0.1k 8 Jan 2015

■デフォルト設定で、sshクライアントがサポートする
 3つの暗号方式の種類を区別せずに一覧にすると
 以下のようになる。
 ※クライアントである点に注意。

$ echo $(ssh -Q cipher;ssh -Q mac;ssh -Q kex) | sed -e 's/ /\n/g' | awk '/cbc/'
3des-cbc
blowfish-cbc
cast128-cbc
aes128-cbc
aes192-cbc
aes256-cbc
[email protected]

■CBCとRC4(またはarcfour)を除いたCiphersを設定したい場合。
 SSHクライアントの条件として下記暗号方式を
 サポートしていることを確認するようなクセを付ければ良い。

$ ssh -Q cipher | \
    awk 'BEGIN{printf "Ciphers "};(!/cbc/&&!/rc4/&&!/arcfour/){printf "%s,",$0};END{printf "\n"}' | \
    sed -e 's/,$//g'
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],[email protected]

■CBCとRC4(またはarcfour)、MD5とSHA1を除いたMACsを設定したい場合。

$ ssh -Q mac | \
    awk 'BEGIN{printf "MACs "};(!/cbc/ && !/md/ && !/sha1/ && !/rc4/ && !/arcfour/){printf "%s,",$0};END{printf "\n"}' | \
    sed -e 's/,$//g'
MACs hmac-sha2-256,hmac-sha2-512,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256[email protected],hmac-sha2-512[email protected],umac-64[email protected],umac-128[email protected]

■設定変更前に実際どれを使ってログインしているか確認する。
 条件に一致したコマンドしか見えないようにするので、
 「exit」コマンド入力時に表示されない点に注意。

$ ssh -vv localhost 2>&1 | awk '(/kex/ && (/server/ || /client/))' 
debug1: kex: server->client aes128-ctr hmac-sha2-256 none
debug1: kex: client->server aes128-ctr hmac-sha2-256 none

■CBCだけでなく、RC4やMD5、SHA-1をsshクライアントが使っていないだけでなく、
 sshクライアントが使用している暗号方式をサポートしたリストであることが分かる。

$ ssh -Q cipher | grep "aes128-ctr$"; \
  ssh -Q mac | grep "hmac-sha2-256$"
aes128-ctr
hmac-sha2-256

■例えば、putty0.59のように、
 Cipherの「aes128-ctr」はサポートしているけど、
 MACsの「hmac-sha2-256」はサポートしていないような
 古いsshクライアントは使えません。

 sshクライアント情報を確認出来るパケットキャプチャ環境を構築してみる。
 http://labunix.hateblo.jp/?page=1456586770

$ sudo tshark -V -r ssh_20160228_004907.pcap -n -nn \
    -d "tcp.port==22,ssh" -Y "ssh.protocol" 2>/dev/null | \
      grep --color -A 30 "0.59" | \
      grep "client_to_server string" | \
      sed -e 's/.*: //g' -e 's/,/\n/g' | \
      grep "ctr\|sha"
aes256-ctr
aes192-ctr
aes128-ctr
blowfish-ctr
3des-ctr
hmac-sha1
hmac-sha1-96

■設定したら、問題ないかテストできる。
 エラーがある場合のみエラー内容が表示される。

$ sudo ssh -t

■sshdサービスの再起動

$ sudo service ssh status | awk '/Main PID/'; \
    sudo service ssh restart; \
    sudo service ssh status | awk '/Main PID/'
 Main PID: 11975 (sshd)
 Main PID: 12030 (sshd)

■sshdサービス再起動後も問題なくログイン出来ることを
 忘れずに確認しましょう。

$ ssh -vv localhost 2>&1 | awk '(/kex/ && (/server/ || /client/))' 
debug1: kex: server->client aes128-ctr hmac-sha2-256 none
debug1: kex: client->server aes128-ctr hmac-sha2-256 none