システム全体の暗号強度設定を統合するcrypto-policiesのカスタマイズ

Red Hatの森若です。

今回は、 crypto-policiesのカスタマイズ機能を紹介します。

crypto-policiesそのものについては、以下の記事で紹介しました。 rheb.hatenablog.com

crypto-policiesはあらかじめ定義された数種類のプロファイルから選択することで、システムで利用される多数の暗号化ソフトウェアの設定を一括で行うものです。 まとめて設定をおこなうことで、webサーバのHTTPSでは強力な暗号化スイートを設定しているのに、sshでは脆弱な暗号化アルゴリズムを使ってしまうようなことがなくなります。 このような暗号の強弱にかたよりがある場合、一番弱いサービスを入口として攻撃されると考えるべきでしょう。

RHEL 8.2からは、crypto-policiesが強化されて既存のポリシーを選択・適用するだけでなく、管理者がポリシーをカスタマイズしたり、ポリシー全体を新規に定義できるようになりました。 ポリシーはcrypto-policies独自の設定ファイルでおこない、あらかじめ用意されているポリシーと同様に多数のソフトウェアに適用されます。

ポリシーはどう定義されている?

カスタマイズをおこなう前に、プリセットで提供されているポリシーを見てみましょう。旧版では生成済みの設定文字列だけがパッケージに含まれていましたが、8.2からはポリシーの 定義も含まれています。

crypto-policiesのポリシーは、 .pol で終わるファイルにテキストで定義されています。

# rpm -ql crypto-policies| grep pol$
/usr/share/crypto-policies/policies/DEFAULT.pol
/usr/share/crypto-policies/policies/EMPTY.pol
/usr/share/crypto-policies/policies/FIPS.pol
/usr/share/crypto-policies/policies/FUTURE.pol
/usr/share/crypto-policies/policies/LEGACY.pol

デフォルトのポリシーであるDEFAULT.pol を見てみましょう。 key = values の形式で、それぞれの用途で利用可能なプロトコル、アルゴリズム、パラメータの長さ、真偽値が列挙されています。 それぞれの key の意味は man 7 crypto-policies の CRYPTO POLICY DEFINITON FORMAT の章で確認できます。

# 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-CBC)
# 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

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

sign = RSA-SHA2-256 ECDSA-SHA2-256 RSA-SHA2-384 ECDSA-SHA2-384 \
    RSA-SHA2-512 ECDSA-SHA2-512 RSA-SHA3-256 ECDSA-SHA3-256 \
    RSA-SHA3-384 ECDSA-SHA3-384 RSA-SHA3-512 ECDSA-SHA3-512 \
    EDDSA-ED25519 EDDSA-ED448 \
    RSA-PSS-SHA2-256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 \
    RSA-SHA2-224 ECDSA-SHA2-224 RSA-PSS-SHA1 RSA-SHA1 ECDSA-SHA1

tls_cipher = AES-256-GCM AES-256-CCM CHACHA20-POLY1305 AES-256-CBC \
    AES-128-GCM AES-128-CCM AES-128-CBC

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

# '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

protocol = TLS1.3 TLS1.2 DTLS1.2
ike_protocol = IKEv2

min_tls_version = TLS1.2
min_dtls_version = DTLS1.2

# 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

ポリシー全体を独自に定義することもできます。作成したポリシーは /etc/crypto-policies/policies/ 以下に拡張子 .pol で配置することで利用可能になります。

ポリシーモディファイア(またはサブポリシー)

ポリシーをカスタマイズする場合は、もとになるポリシーに対する差分を表現した、ポリシーモディファイア(ポリシーを変更するもの、拡張子 .pmod。 サブポリシーともいう)を作成して利用します。 ポリシーの定義に対して、追加・削除・再定義することでカスタマイズをおこないます。

/usr/share/crypto-policies/policies/modules に典型的なポリシーモディファイアの例が置かれています。

  • NO-CAMELLIA.pmod: 暗号化にCamelliaアルゴリズムを利用しない
  • NO-SHA1.pmod: ハッシュ関数にSHA1を利用しない
  • OSPP.pmod: Common Criteria OSPP プロファイル用

NO-SHA1.pmodをみてみましょう。

# This is example subpolicy dropping the SHA1 hash and signature support

hash = -SHA1

sign = -RSA-PSS-SHA1 -RSA-SHA1 -ECDSA-SHA1

ポリシー定義とおなじ key = values の書式ですが、valueの先頭に - がついていることでその値を削除することを示しています。追加する場合には先頭に + をつけ、定義しなおす場合には+も-もつけずに値をそのまま書きます。

自分でポリシーモディファイアを作成した場合には、/etc/crypto-policies/policies/modules に拡張子 .pmod で配置します。

ポリシーの適用

ポリシーの適用は 以前とおなじく、 update-crypto-policies コマンドで行います。ただしポリシーモディファイアがある場合は : で名前をつなげます。ポリシーモディファイアは:で繋げることで複数指定できます。

# update-crypto-policies --set DEFAULT:NO-SHA1
Setting system policy to DEFAULT:NO-SHA1
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.

メッセージにも出力されていますが、update-crypto-policiesは設定を生成するだけで、現在実行中のソフトウェアの動作は変わりません。再起動することで設定を有効にします。

カスタマイズの制限

カスタマイズが可能といっても、何でも好きに変更できるわけではありません。 たとえばRHEL 8の暗号化ライブラリでは、SSL v3や DESなどは含まれていませんので、設定しても実際に動作することはありません。

特定のソフトウェア、たとえばcurlでだけ動作を変更したいというような場合は、crypto-policiesのポリシーモディファイアは目的にあいません。明示的にオプションを指定してcrypto-policiesでの設定をオーバーライドして使いましょう。

参考リンク

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。