【環境】
$ cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
$ ssh -V
OpenSSH_8.0p1, OpenSSL 1.1.1c FIPS 28 May 2019
Cent8 の /etc/ssh/sshd_config に「Ciphers」を指定しても、反映されないよ・・・
という相談を受けたので、やってみた。
インストール後、特に設定を弄っていない /etc/ssh/sshd_config にて、
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
のようにいくつか設定を書いてみたが、どうも有効になっていない。
どうもCentOS 7までとは様子が違う?
次のような感じで接続を試すと、sshd_config で許可していないCiphers で接続してしまった。
$ ssh -c aes128-cbc localhost
sshd を再起動するの忘れた?とか一瞬思ったけど、そうではなかったので、
systemd 周りを見ていくことにした。
まずは、/usr/lib/systemd/system/sshd.service
[Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.target Wants=sshd-keygen.target [Service] Type=notify EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config EnvironmentFile=-/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
であり、
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
がsshdの起動コマンド。
プロセスを見てみると、
# ps aux | grep sshd ・・・ root 2592 0.0 0.3 92968 6860 ? Ss 18:58 0:00 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512 -oGSSAPIKexAlgorithms=gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 -oHostKeyAlgorithms=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=rsa-sha2-256,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,rsa-sha2-512,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa
あ、すんごぃ長い。
前述のファイルにあった「-D $OPTIONS $CRYPTO_POLICY」の部分のどちらかが長い訳で、もう少し見てみることに。
/usr/lib/systemd/system/sshd.service の中で、関係するのは以下の部分。
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config EnvironmentFile=-/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
EnvironmentFile で指定されたファイルを見てみると・・・
/etc/crypto-policies/back-ends/opensshserver.config は、
CRYPTO_POLICY='-oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512 -oGSSAPIKexAlgorithms=gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 -oHostKeyAlgorithms=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=rsa-sha2-256,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,rsa-sha2-512,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa'
変数名 CRYPTO_POLICY も一致で、先ほどのpsコマンドの結果と同じ。
これをよく見ると、「-oCiphers=」で指定されたオプションがある。
sshdが起動する際、設定ファイル(sshd_config)を読み込むものの、sshd の起動時にコマンドラインで指定されたオプションの方が優先される。
従って、sshd_config に Ciphers を設定しても、有効になっていなかった。
もう1つのファイル、/etc/sysconfig/sshd は、
# Configuration file for the sshd service. # The server keys are automatically generated if they are missing. # To change the automatic creation, adjust sshd.service options for # example using systemctl enable sshd-keygen@dsa.service to allow creation # of DSA key or systemctl mask sshd-keygen@rsa.service to disable RSA key # creation. # Do not change this option unless you have hardware random # generator and you REALLY know what you are doing SSH_USE_STRONG_RNG=0 # SSH_USE_STRONG_RNG=1 # System-wide crypto policy: # To opt-out, uncomment the following line # CRYPTO_POLICY=
となっていて、CRYPTO_POLICY はコメント行になっている。
ついでに、
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
に書かれている変数名 $OPTIONS は見当たらない・・・
これが何かは分からず(´・ω・`)
では CRYPTO_POLICY って何?という事だけど、赤帽エンジニアさんのBlogに詳しく解説があるので参考。
rheb.hatenablog.com
原因は分かったけど、どうやって対処する?というのは、以下のいずれかが考えられる。
- 方法1)crypto-policies を DEFAULT より高セキュリティへ変更
crypto-policies を変更する場合
現状確認と設定変更は以下の通り。
現状確認 # update-crypto-policies --show 設定変更 # update-crypto-policies --set FUTURE
/etc/crypto-policies/config が書き換わるらしい。
crypto-policies を変更後、sshd を再起動して ps コマンドで sshd のコマンドラインオプションを確認してみた。
DEFAULTの場合 -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc FIPSの場合 -oCiphers=aes256-gcm@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc FUTUREの場合 -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc LEGACYの場合 -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc,3des-cbc
LEGACY だと、3des が出てくる。
/etc/sysconfig/sshd に CRYPTO_POLICY= と空文字を指定し、sshd_config の記載を有効にする場合
こちらの方法は、Ciphers を細かく自由に設定できる。
また、この方法の場合、MACs や KexAlgorithms など、$CRYPTO_POLICY の変数で指定されていた項目も sshd_config で設定できるようになる。
/etc/sysconfig/sshd にて
#CRYPTO_POLICY= ↓ CRYPTO_POLICY=
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
などとし、sshd を再起動。
いずれの場合も、以下のように動作確認する
$ ssh -c aes128-cbc localhost Unable to negotiate with 127.0.0.1 port 22: no matching cipher found. Their offer: chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
ついでに、指定可能な暗号化方式は、以下のように確認できる。
$ ssh -Q cipher
3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
rijndael-cbc@lysator.liu.se
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com