RHEL／CentOSでの暗号化ポリシーで、Javaのセキュリティ設定が変わるという話

# What's？

Red Hat Enterprise Linuxでは、システムの暗号化ポリシーを設定できます。

[システム全体の暗号化ポリシーの使用](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening)

この内容で、Javaのセキュリティ設定も変わりますよ、という話です。


# 環境

CentOS 8で確認してみます。

```shell
$ cat /etc/redhat-release 
CentOS Linux release 8.3.2011
```

使用するJavaは、OpenJDK 8とします。

```shell
$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
```


# 確認

たとえば、`jdk.tls.disabledAlgorithms`という暗号化において無効化するアルゴリズムを指定するプロパティがあります。

[Java Secure Socket Extension (JSSE)リファレンス・ガイド](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/jsse/JSSERefGuide.html)

[Java暗号化アーキテクチャOracleプロバイダのドキュメント(JDK 8用)](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/SunProviders.html)

こちらを出力するプログラムを書いてみます。

```java:App.java
import java.security.Security;

public class App {
	public static void main(String... args) {
		System.out.printf("jdk.tls.disabledAlgorithms = %s%n", Security.getProperty("jdk.tls.disabledAlgorithms"));
	}
}
```

ここで、`java.security`の設定を見てみます。

```shell
$ grep ^jdk.tls.disabledAlgorithms -A 2 /usr/lib/jvm/java-1.8.0-openjdk/jre/lib/security/java.security
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
    EC keySize < 224, 3DES_EDE_CBC, anon, NULL

```

作成したプログラムを実行してみます。

```shell
$ javac App.java
```

…まったく異なる値が得られました。

```shell
$ java App
jdk.tls.disabledAlgorithms = DH keySize < 2048, SSLv2, SSLv3, TLSv1, TLSv1.1, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
```

ここで、現在の暗号化ポリシーの設定を見てみます。`DEFAULT`となっています。

```shell
$ update-crypto-policies --show
DEFAULT
```

暗号化ポリシーには、`DEFAULT`、`LEGACY`、`FUTURE`、`FIPS`の4つのプロファイルがあります。

[システム全体の暗号化ポリシーの使用](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/security_hardening/using-the-system-wide-cryptographic-policies_security-hardening)

ここで、`/usr/share/crypto-policies`ディレクトリを確認してみます。

各プロファイルごとの設定が配置されているのですが、この中で`DEFAULT`プロファイルのJava用の設定を見てみます。

```shell
$ grep ^jdk.tls.disabledAlgorithms /usr/share/crypto-policies/DEFAULT/java.txt 
jdk.tls.disabledAlgorithms=DH keySize < 2048, SSLv2, SSLv3, TLSv1, TLSv1.1, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
```

これ、先ほどのプログラムの出力結果と一致します。

ここで、暗号化ポリシーのプロファイルを`LEGACY`に変えてみます。

```shell
$ sudo update-crypto-policies --set LEGACY
Setting system policy to LEGACY
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.
```

変更したらOSを再起動。

```shell
$ sudo reboot
```

暗号化ポリシーのプロファイルが変わったことが確認できました。

```shell
$ update-crypto-policies --show
LEGACY
```

先ほどのプログラムを再度実行してみます。

```shell
$ java App 
jdk.tls.disabledAlgorithms = DH keySize < 1023, SSLv2, SSLv3, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, DES_CBC, RC4_40, DES40_CBC, RC2, HmacMD5
```

`$JAVA_HOME/jre/lib/security/java.security`ファイルは変更していないのに、設定が変わりました。

ここで、`LEGACY`プロファイルのJavaの設定を見てみます。`java.txt`というファイルです。

```shell
$ grep ^jdk.tls.disabledAlgorithms /usr/share/crypto-policies/LEGACY/java.txt 
jdk.tls.disabledAlgorithms=DH keySize < 1023, SSLv2, SSLv3, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, DES_CBC, RC4_40, DES40_CBC, RC2, HmacMD5
```

この値と同じになっていますね。

どうやって反映しているのかはわかりませんでしたが、これは知らなかったです…。

プロファイルを選択したり、カスタマイズもできるようですが、`LEGACY`は選ぶべきではないでしょうね。RHEL 5互換に近づくということらしいですが。

最後に、各プロファイルのJavaの設定を見てみましょう。

`DEFAULT`

```shell:/usr/share/crypto-policies/DEFAULT/java.txt
jdk.tls.ephemeralDHKeySize=2048
jdk.certpath.disabledAlgorithms=MD2, MD5, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=DH keySize < 2048, SSLv2, SSLv3, TLSv1, TLSv1.1, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
jdk.tls.legacyAlgorithms=
```

`FUTURE`

```shell:/usr/share/crypto-policies/FUTURE/java.txt
jdk.tls.ephemeralDHKeySize=3072
jdk.certpath.disabledAlgorithms=MD2, SHA224, SHA1, MD5, DSA, RSA keySize < 3072
jdk.tls.disabledAlgorithms=DH keySize < 3072, SSLv2, SSLv3, TLSv1, TLSv1.1, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, AES_128_GCM, AES_128_CCM, AES_256_CBC, AES_128_CBC, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacSHA1, HmacMD5
jdk.tls.legacyAlgorithms=
```

`FIPS`

```shell:/usr/share/crypto-policies/FIPS/java.txt
jdk.tls.ephemeralDHKeySize=2048
jdk.certpath.disabledAlgorithms=MD2, SHA1, MD5, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=DH keySize < 2048, SSLv2, SSLv3, TLSv1, TLSv1.1, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
jdk.tls.legacyAlgorithms=
```

`LEGACY`

```shell:/usr/share/crypto-policies/LEGACY/java.txt
jdk.tls.ephemeralDHKeySize=1023
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1023
jdk.tls.disabledAlgorithms=DH keySize < 1023, SSLv2, SSLv3, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, DES_CBC, RC4_40, DES40_CBC, RC2, HmacMD5
jdk.tls.legacyAlgorithms=3DES_EDE_CBC, RC4_128
```

項目数からして、`$JAVA_HOME/jre/lib/security/java.security`との差分な気がするので、このファイルとOS側の暗号化ポリシーの両方を見た方が良さそうですね。

# 参考

[システム全体の暗号強度設定を統合するcrypto-policiesのカスタマイズ](https://rheb.hatenablog.com/entry/2020/09/10/crypto-policies-mod)

[RHEL8のシステム全体の暗号化ポリシー](https://access.redhat.com/articles/3666211)