CentOS 8:sshdで使用する暗号方式の設定

# sshdで弱い暗号方式を利用しないように設定

CentOS Stream8のインストール直後のsshdを確認すると、高セキュリティシステムでは推奨されない
暗号方式、ハッシュ関数も利用できるように設定されています。
で、それらを無効化した時の手順をメモに残します。
※RHEL8でも同じ手順で設定出来ました。

## セキュリティ対策として必要そうな設定

* cipher に cbc(Cipher Block Chaining) を使用しない。[VU#958563](https://www.kb.cert.org/vuls/id/958563)
* ハッシュ関数 sha1を使用しない。  
HMAC-SHA1の構成品として使われているSHA-1は、2024年時点でも安全性に問題はないといわれていますが、構成品であってもSHA1を避ける動きがあるため、削除対象にします。  

## 設定手順概要

CentOS7 の頃と違って sshd_config に記載するだけでは設定が反映されません。
設定方法は大きく以下の二つになるっぽい

1. CentOS8 から採用されている一括して暗号方式を設定する仕組み**crypto-policies**を利用する  
  ただ、標準でいくつか用意されてるポリシーでは目的通りに無効化出来ないためカスタムポリシーを作成する必要があります。
2. **crypto-policies** の影響を受けない設定を行い、従来通りsshd_configで設定する

2でやった方が楽そうだけど、、、
とりあえず、両方試してみます。

## crypt-policies のカスタムポリシー設定例

**この設定は、沢山のサービスに影響します。**
man update-crypto-policies で対象サービスを確認しましょう。
2021/1/3 に確認した時は以下のものが対象になっていました。
GnuTLS library,OpenSSL library,NSS library,OpenJDK,Libkrb5,BIND,OpenSSH,Libreswan,libssh

大まかな作業の流れ
1. 現在の設定状況を確認
1. 基準となるポリシーをコピー：標準のDEFAULTをベースに使ってみました。
絞り込みすぎると互換性がなくなるため、どういった設定にするかはよく検討しましょう。
検討の際 [Redhat のマニュアル：3.1. システム全体の暗号化ポリシー](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening#system-wide-crypto-policies_using-the-system-wide-cryptographic-policies) が参考になります。
1. コピーしたポリシーを編集：SHA1と付いてるものを削除／SSHに関してcbcって付いてるやつを削除
1. 作成したポリシーを適用
1. 対象サービスを再起動

### 現在の設定状況を確認
```r
[user01@centos8st ~]$ update-crypto-policies --show
DEFAULT
[user01@centos8st ~]$
```

### 基準となるポリシーをコピー

```r
[user01@centos8st ~]$ sudo cp /usr/share/crypto-policies/policies/DEFAULT.pol ¥
/usr/share/crypto-policies/policies/MYPOLICY.pol
[sudo] user01 のパスワード:
[user01@centos8st ~]$
```

### コピーしたポリシーを編集

mac／mac@Kerberos から HMAC-SHA1 を削除
hash／sign から SHA1 が使用されている物を削除
ファイル末尾に "cipher@SSH = -*-CBC" の記述を追加

```r
[user01@centos8st ~]$ sudo vi /usr/share/crypto-policies/policies/MYPOLICY.pol
# A reasonable default for today's standards. It should provide
# 112-bit security with the exception of SHA1 signatures needed for DNSSec
# and other still prevalent legacy use of SHA1 signatures.

# MACs: all HMAC with SHA1 or better + all modern MACs (Poly1305 etc)
# Curves: all prime >= 255 bits (including Bernstein curves)
# Signature algorithms: with SHA-1 hash or better (no DSA)
# TLS Ciphers: >= 128-bit key, >= 128-bit block (AES, ChaCha20, including AES-CB
C)
# non-TLS Ciphers: as TLS Ciphers with added Camellia
# key exchange: ECDHE, RSA, DHE (no DHE-DSS)
# DH params size: >= 2048
# RSA params size: >= 2048
# TLS protocols: TLS >= 1.2, DTLS >= 1.2

mac = AEAD HMAC-SHA2-256 HMAC-SHA1 UMAC-128 HMAC-SHA2-384 HMAC-SHA2-512 # HMAC-SHA1を削除
mac@Kerberos = HMAC-SHA2-384 HMAC-SHA2-256 AEAD UMAC-128 HMAC-SHA2-512 HMAC-SHA1 # HMAC-SHA1を削除

group = X25519 X448 SECP256R1 SECP384R1 SECP521R1 \
    FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192

hash = SHA2-256 SHA2-384 SHA2-512 SHA3-256 SHA3-384 SHA3-512 SHA2-224 SHA1  # SHA1 を削除

sign = ECDSA-SHA3-256 ECDSA-SHA2-256 \
       ECDSA-SHA3-384 ECDSA-SHA2-384 \
       ECDSA-SHA3-512 ECDSA-SHA2-512 \
       EDDSA-ED25519 EDDSA-ED448 \
       RSA-PSS-SHA2-256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 \
       RSA-SHA3-256 RSA-SHA2-256 \
       RSA-SHA3-384 RSA-SHA2-384 \
       RSA-SHA3-512 RSA-SHA2-512 \
       ECDSA-SHA2-224 RSA-PSS-SHA2-224 RSA-SHA2-224 \  # 末尾の \ を削除
       ECDSA-SHA1 RSA-PSS-SHA1 RSA-SHA1  # この行を削除

cipher = AES-256-GCM AES-256-CCM CHACHA20-POLY1305 CAMELLIA-256-GCM \
    AES-256-CTR AES-256-CBC CAMELLIA-256-CBC AES-128-GCM AES-128-CCM \
    CAMELLIA-128-GCM AES-128-CTR AES-128-CBC CAMELLIA-128-CBC

cipher@TLS = AES-256-GCM AES-256-CCM CHACHA20-POLY1305 AES-256-CBC \
    AES-128-GCM AES-128-CCM AES-128-CBC

# 'RSA' is intentionally before DHE ciphersuites, as the DHE ciphersuites have
# interoperability issues in TLS.
key_exchange = ECDHE RSA DHE DHE-RSA PSK DHE-PSK ECDHE-PSK ECDHE-GSS DHE-GSS

protocol@TLS = TLS1.3 TLS1.2 DTLS1.2
protocol@IKE = IKEv2

# Parameter sizes
min_dh_size = 2048
min_dsa_size = 2048
min_rsa_size = 2048

# GnuTLS only for now
sha1_in_certs = 1

arbitrary_dh_groups = 1
ssh_certs = 1
ssh_etm = 1

# Disable CBC in OpenSSH  # 追加
cipher@SSH = -*-CBC  # 追加

[user01@centos8st ~]$
```

### 作成したポリシーを適用／対象サービス再起動

```r
[user01@centos8st ~]$ sudo update-crypto-policies --set MYPOLICY
Setting system policy to MYPOLICY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
[user01@centos8st ~]$ sudo systemctl restart sshd
```

### 設定変更前後の暗号方式／ハッシュアルゴリズムの状態

外部から nmapで確認してみました。

#### 設定変更前

```r
$ nmap -p 22 192.168.1.30 -Pn -sV --script ssh2-enum-algos.nse
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-16 15:57 JST
Nmap scan report for 192.168.1.30
Host is up (0.0016s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.0 (protocol 2.0)
| ssh2-enum-algos:
|   kex_algorithms: (12)
|       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
|       kex-strict-s-v00@openssh.com
|   server_host_key_algorithms: (5)
|       rsa-sha2-512
|       rsa-sha2-256
|       ssh-rsa
|       ecdsa-sha2-nistp256
|       ssh-ed25519
|   encryption_algorithms: (7)
|       aes256-gcm@openssh.com
|       chacha20-poly1305@openssh.com
|       aes256-ctr
|       aes256-cbc
|       aes128-gcm@openssh.com
|       aes128-ctr
|       aes128-cbc
|   mac_algorithms: (8)
|       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
|   compression_algorithms: (2)
|       none
|_      zlib@openssh.com

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.39 seconds

$
```

#### 設定変更後

CBC/SHA1関連の暗号方式／ハッシュアルゴリズムが排除されてます。

```r
$ nmap -p 22 192.168.1.30 -Pn -sV --script ssh2-enum-algos.nse
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-16 15:55 JST
Nmap scan report for 192.168.1.30
Host is up (0.0030s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.0 (protocol 2.0)
| ssh2-enum-algos:
|   kex_algorithms: (10)
|       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
|       kex-strict-s-v00@openssh.com
|   server_host_key_algorithms: (4)
|       rsa-sha2-512
|       rsa-sha2-256
|       ecdsa-sha2-nistp256
|       ssh-ed25519
|   encryption_algorithms: (5)
|       aes256-gcm@openssh.com
|       chacha20-poly1305@openssh.com
|       aes256-ctr
|       aes128-gcm@openssh.com
|       aes128-ctr
|   mac_algorithms: (6)
|       hmac-sha2-256-etm@openssh.com
|       umac-128-etm@openssh.com
|       hmac-sha2-512-etm@openssh.com
|       hmac-sha2-256
|       umac-128@openssh.com
|       hmac-sha2-512
|   compression_algorithms: (2)
|       none
|_      zlib@openssh.com

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds

$
```

## 従来通りsshd_configで設定する場合

* 昔ながらの設定方法でわかりやすい。
* 影響範囲がsshdだけに限定されるからシステム全体の責任を持ってない場合はこっちの方が良いかな。

**設定の流れ**

1. 現在sshdに設定されている暗号方式／ハッシュアルゴリズムの確認
1. CRYPTO_POLICY変数の無効化（値なしの CRYPT_POLICY 変数を設定する）
1. sshd_configでの設定
1. sshdサービスの再起動

### 現在設定されている暗号方式／ハッシュアルゴリズムの確認

crypto-policiesを利用していると、daemon起動時にコマンドラインオプションとして暗号方式／ハッシュアルゴリズムなどが設定されているから ps コマンドで確認出来ます。
ここで得られた値をもとに、不要な暗号方式／ハッシュアルゴリズムを除外して設定します。

```r
[user01@centos8st ~]$ ps -ef|grep sshd
root        5843       1  0 15:59 ?        00:00: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-curve25519-sha256-,gss-nistp256-sha256-,gss-group14-sha256-,gss-group16-sha512-,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=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-256,rsa-sha2-512,ssh-rsa

[user01@centos8st ~]$
```

### CRYPTO_POLICY変数の無効化

コメントアウトを解除し空の状態で変数を宣言する事でdaemon起動時に設定されるCRYPTO_POLICYを無効化出来ます。
この例だと18行目の記述がそうです。

```r
[user01@centos8st ~]$ sudo vi /etc/sysconfig/sshd

     15 # System-wide crypto policy:
     16 # To opt-out, uncomment the following line
     17 # CRYPTO_POLICY=
     18 CRYPTO_POLICY=
     
[user01@centos8st ~]$
```
### sshd_configでの設定 と sshd再起動

psコマンドで得られた値から Ciphers/MACs/KeyAlgorithms/HostKeyAlgorithms の値を加工し 36,37,38,39,40 行目に追加しました。

```r
[user01@centos8st ~]$ sudo vi /etc/ssh/sshd_config

     30 # This system is following system-wide crypto policy. The changes to
     31 # crypto properties (Ciphers, MACs, ...) will not have any effect here.
     32 # They will be overridden by command-line options passed to the server
     33 # on command line.
     34 # Please, check manual pages for update-crypto-policies(8) and sshd_conf        ig(5).
     35
     36 # Override CRYPTO_POLICY
     37 Ciphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes128-gcm@openssh.com,aes128-ctr
     38 MACs=hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,umac-128@openssh.com,hmac-sha2-512
     39 KexAlgorithms=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
     40 HostKeyAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com
     41
     42 # Logging
     43 #SyslogFacility AUTH

[user01@centos8st ~]$ sudo systemctl restart sshd
```

### 設定変更後の暗号方式／ハッシュアルゴリズムの状態

```r
$ nmap -p 22 192.168.1.30 -Pn -sV --script ssh2-enum-algos.nse
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-16 16:42 JST
Nmap scan report for 192.168.1.30
Host is up (0.0018s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.0 (protocol 2.0)
| ssh2-enum-algos:
|   kex_algorithms: (10)
|       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
|       kex-strict-s-v00@openssh.com
|   server_host_key_algorithms: (4)
|       rsa-sha2-512
|       rsa-sha2-256
|       ecdsa-sha2-nistp256
|       ssh-ed25519
|   encryption_algorithms: (5)
|       aes256-gcm@openssh.com
|       chacha20-poly1305@openssh.com
|       aes256-ctr
|       aes128-gcm@openssh.com
|       aes128-ctr
|   mac_algorithms: (6)
|       hmac-sha2-256-etm@openssh.com
|       umac-128-etm@openssh.com
|       hmac-sha2-512-etm@openssh.com
|       hmac-sha2-256
|       umac-128@openssh.com
|       hmac-sha2-512
|   compression_algorithms: (2)
|       none
|_      zlib@openssh.com

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds

$
```

## ついでに

rootでのssh接続が許可されているから無効化しておこう。
PermitRootLogin を no に設定します。

```r
[user01@centos8st ~]$ sudo vi /etc/ssh/sshd_config

     47 # Authentication:
     48
     49 #LoginGraceTime 2m
     50 PermitRootLogin no
     51 #StrictModes yes
     52 #MaxAuthTries 6
     53 #MaxSessions 10
     54

[user01@centos8st ~]$ sudo systemctl restart sshd
[user01@centos8st ~]$ ssh root@localhost
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
```
rootでのssh接続を無効化しても認証動作は行われます。
ただし、正しいパスワードを入力しても認証は失敗するようになります。


参考：
[赤帽エンジニアブログ](https://rheb.hatenablog.com/entry/rhel8-crypto-policies)
[How to customize crypto policies in RHEL 8.2](https://www.redhat.com/ja/blog/how-customize-crypto-policies-rhel-82)
[https://docs.redhat.com/ Red Hat Enterprise Linux 8：3.1. システム全体の暗号化ポリシー](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening#system-wide-crypto-policies_using-the-system-wide-cryptographic-policies)