CentOS 8 の sshd_config で Ciphers が効かない?

【環境】
$ 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 より高セキュリティへ変更
  • 方法2)/etc/sysconfig/sshd に CRYPTO_POLICY= と空文字を指定し、sshd_config の記載を有効にする

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=

/etc/ssh/sshd_config にて

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