FIPS コンプライアンスの確保は、機密データの保護とコンプライアンス目標の達成に必須です。FIPS (連邦情報処理標準、Federal Information Processing Standards) と聞いてもピンとこない方に説明すると、これは NIST (米国国立標準技術研究所、U.S. National Institute of Standards and Technology) により制定された、米連邦政府のコンピュータシステムで運用するための、一連の標準とガイドラインです。本記事では、Oracle Linux 9 で MySQL の FIPS モードを有効にするためのステップバイステップガイドを提供し、OpenSSL、SSH、および MySQL 自体の重要な構成について説明します。

この記事を読む前に、まず以前の記事「OpenSSL、FIPS、MySQL について深く学ぶ」をぜひお読みください。

それでは、FIPS を有効にするために必要な 10 のステップを確認していきます。

ステップ 1 – FIPS 認証済みの Linux と OpenSSL 3 対応 OS を選択

認証状態を確認します。

この記事では Oracle Linux 9 を例として用います。

ステップ 2 – サーバーを評価

  • インストールされている OpenSSL のバージョン確認
  • OS が FIPS モードか否か
  • OpenSSL 設定が FIPS モードか否か

インストールされている OpenSSL のバージョン確認は以下のようにします。

# openssl version -v
OpenSSL 3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022)

これは少し古いですね。アップデートが必要です。

# sudo dnf update openssl
# openssl version -v
OpenSSL 3.2.2 4 Jun 2024 (Library: OpenSSL 3.2.2 4 Jun 2024)

これで大丈夫です。

OS は FIPS モードでしょうか。

# sudo fips-mode-setup --check
FIPS mode is disabled.

OpenSSL 設定は FIPS モードでしょうか。

# openssl list --providers
Providers:
  default
    name: OpenSSL Default Provider
    version: 3.2.2
    status: active

FIPS プロバイダーがリストされません。すなわち、OpenSSL は FIPS モードになっていません。

ステップ 3 – MySQL のインストール

MySQL が OpenSSL 3 にリンクされているか確認します。

# ldd /usr/sbin/mysqld | grep ssl
       libssl.so.3 => /lib64/libssl.so.3 (0x00007fa868470000)

MySQL はローカルの OpenSSL にリンクされているようです。「libssl.so.3」は OpenSSL 3 を使用していることを示しています。

そうでない場合は、以下のような原因を確認してください。

  • 間違ったイメージのインストール(例えば、OL9 OS への OL8 イメージのインストール)
  • 古い「Generic Linux」tarball からのインストール
  • 同梱される MySQL OpenSSL 3 ライブラリにリンクされた、新しい「Generic Linux」tarball のインストール
  • LD_LIBRARY_PATH が間違っている
  • OpenSSL 3 を含まない古い OS

MySQL Server を起動します。

# sudo systemctl start mysqld

ステップ 4 – FIPS 有効化の後もこのサーバーへの SSH アクセスが機能することを確認

これが正しく行われていないと、サーバーの再起動後に ssh 経由でサーバーにアクセスできなくなります。

クライアント側で以下を実行します(テスト環境の元の PEM では、FIPS 準拠でなかったため失敗しています)。

# ssh -i rsa512 localhost
sign_and_send_pubkey: signing failed: error:04066078:rsa
routines:RSA_EAY_PRIVATE_ENCRYPT:key size too small
  • パスワード付きの PEM EC 秘密鍵を作成する必要
  • 鍵を作成する際には、ecdsa-sha2-nistp256 またはその他の FIPS 準拠の暗号を使用する必要

サーバー側で、opensshd から非 FIPS 暗号を削除します。

# sudo vi /etc/crypto-policies/back-ends/opensshserver.config
# sudo systemctl restart sshd

テストサーバーでは、Ciphers、MACs、KexAlgorithms から非 FIPS を削除した後、以下のようになりました。

Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes128-gcm@openssh.com,aes128-ctr
MACs 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
GSSAPIKexAlgorithms gss-curve25519-sha256-,gss-nistp256-sha256-,gss-group14-sha256-,gss-group16-sha512-
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
HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,sk-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,sk-ssh-ed25519@openssh.com,sk-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
PubkeyAcceptedAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,sk-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,sk-ssh-ed25519@openssh.com,sk-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
CASignatureAlgorithms ecdsa-sha2-nistp256,sk-ecdsa-sha2-nistp256@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,sk-ssh-ed25519@openssh.com,rsa-sha2-256,rsa-sha2-512

様々な Linux での DISA STIG (国防情報システム局 セキュリティ技術実装ガイド / Defense Information Systems Agency  Security Technical Implementation Guide) は、 FIPS モードでの OpenSSH 設定に関する要件を定義しています。DISA STIG コンプライアンスが必要な場合は、それらのドキュメントを参照してください。

ステップ 5 – OS FIPS を有効にする

# sudo fips-mode-setup –enable
# sudo fips-mode-setup --check
Installation of FIPS modules is not completed.
FIPS mode is disabled.

再起動の前に、以下を行っていない場合は行ってください。

  • 対応機で、パスワード付きの秘密鍵を作成
  • 公開鍵を作成
  • SSH 用の公開鍵を更新
    • # cd .ssh/
      # vi authorized_keys

ステップ 6 – Linux を再起動

# sudo reboot

SSH でサーバーに再接続し、FIPS のステータスを確認します。

# sudo fips-mode-setup --check
FIPS mode is enabled.

もしくは:

# openssl list –providers
  …
fips
    name: Oracle Linux 9 OpenSSL FIPS Provider
    version: 3.0.7-b27cdeb3ba51be46
    status: active

これでカーネルが FIPS モードになりました。

ステップ 7 – MySQL でいくつかのテストを実行

# mysql -u root -p
mysql> show variables like '%fips%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| ssl_fips_mode | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

これは予想通りの結果です。MySQL OpenSSL FIPS は OS を介して有効になっていますから。

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES128-CCM:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES128-CCM:DHE-RSA-CHACHA20-POLY1305

FIPS 対応ではない暗号形式、たとえば TLS_CHACHA20_POLY1305_SHA256 など、がみえています。

しかし、FIPS は強制されていますので、非 FIPS 暗号を使用すると失敗します。

# mysql -u root -p --host=localhost --protocol=TCP --ssl-mode=REQUIRED --tls-version=TLSv1.3 --tls-ciphersuites=TLS_CHACHA20_POLY1305_SHA256
Enter password:
ERROR 2026 (HY000): SSL connection error: error:0A0000B5:SSL routines::no ciphers available
------------

ではいよいよ、FIPS 準拠のアルゴリズムを試してみましょう。

# mysql -u root -p --host=localhost --protocol=TCP --ssl-mode=REQUIRED --tls-version=TLSv1.3 --tls-ciphersuites=TLS_AES_128_CCM_SHA256

For a MySQL TCP connection - non-FIPS is not working – FIPS is enforced – good!
The kernel setting limited the TLS connections

今度は別の非 FIPS 暗号テストを行いましょう。

mysql> select md5(8);show warnings;
+----------------------------------+
| md5(8)                           |
+----------------------------------+
| c9f0f895fb98ab9159f51fd0297e236d |
+----------------------------------+

MD5 は FIPS 140-2 / 3 に準拠していないのに、なぜこのテストは機能するのでしょう?

  • OS カーネルレベルの FIPS モードは、OpenSSL の設定ファイルのデフォルトプロバイダー設定を変更はしない
  • MySQL が TLS 接続を作成する際は、OS システムコールを使用するため、その場合は FIPS 規制がカーネル呼び出しによって強制される(訳者註: しかし、OS システムコールを使用しない内部の関数まで、FIPS 動作を強制するわけではないので、md5 関数の呼び出しはこのままでは成功してしまうことを説明しています)
  • MySQL での FIPS 設定は、ユースケースの特性に依存して、OS の FIPS フラグを ON/OFF に設定したあと、必要に応じ OpenSSL FIPS を有効にする

ステップ 8 – OpenSSL で FIPS を有効にする

このステップでは、https://docs.openssl.org/3.0/man7/fips_module/#making-all-applications-use-the-fips-module-by-default での手順に従っています。

# openssl version -d
OPENSSLDIR: "/etc/pki/tls”

# sudo ls  /etc/pki/tls/
cert.pem  certs  ct_log_list.cnf  fips_local.cnf  misc  openssl.cnf  openssl.d  private

openssl.cnf を編集して fips_local.cnf への参照を追加し、以下のように編集します。

# sudo vi /etc/pki/tls/openssl.cnf

… 上記のドキュメントから追加 …

config_diagnostics = 1
openssl_conf = openssl_init

.include /usr/local/ssl/fipsmodule.cnf

[openssl_init]
providers = provider_sect
alg_section = algorithm_sect

[provider_sect]
fips = fips_sect
default = default_sect

[default_sect]
activate = 1

[algorithm_sect]
default_properties = fips=yes

これらの変更を行った後、FIPS プロバイダーがリストされていることを確認してください。

# openssl list –providers 

リンクされたすべてのアプリケーションが OpenSSL の FIPS モードを使用していることを確認するため、次にサーバーの再起動が必要です。

ステップ 9 – FIPS のテストを実行   

# mysql -u root -p --host=localhost --protocol=TCP --ssl-mode=REQUIRED --tls-version=TLSv1.3 --tls-ciphersuites=TLS_CHACHA20_POLY1305_SHA256
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:0A0000B5:SSL routines::no ciphers available
------------

このエラーは予想通りです。FIPS 準拠していることが確認できます。

mysql -u root -p --host=localhost --protocol=TCP --ssl-mode=REQUIRED --tls-version=TLSv1.3 --tls-ciphersuites=TLS_AES_128_CCM_SHA256

mysql> select md5(8);show warnings;
+----------------------------------+
| md5(8)                           |
+----------------------------------+
| 00000000000000000000000000000000 |
+----------------------------------+
1 row in set, 1 warning (0.00 sec)
+---------+------+------------------------------------------------------------------------+
| Level   | Code | Message                                                                |
+---------+------+------------------------------------------------------------------------+
| Warning | 4073 | SSL fips mode error: FIPS mode ON/STRICT: MD5 digest is not supported. |
+---------+------+------------------------------------------------------------------------+
1 row in set (0.00 sec)

これで、OS と OpenSSL — つまり MySQL Server も — が、FIPS モードで動作しています。

ステップ 10 – スタックをテストする

以下のような挙動を確認してみてください。

  • FIPS モードが TLS 接続に与える影響
    • FIPS 準拠でない暗号アルゴリズムを使用する、TCP/IP 上の MySQL 接続は失敗 
    • このサーバー上からの接続だけではなく、全てのユーザー、アプリケーションからの接続で失敗
    • このようなエラーは、通常は FIPS 準拠をサポートしない古いバージョンの MySQL ドライバーにおいてのみ発生
    • あるいは、接続文字列で明確に非 FIPS 暗号アルゴリズムを指定している場合にも発生
  • Linux サーバーの FIPS 対応状況の確認 
    • Linux サーバー上で実行されているすべてのアプリケーションとサービスに影響する可能性
    • エージェントやサーバーへの接続なども影響を受ける可能性
    • sudo systemctl list-units –type services コマンドを用い、現在アクティブなサービスユニットをリストアップし、その中で FIPS による影響を受ける可能性のあるサービスを確認
  • FIPS 非対応の可能性があるサービス例
    • CIFS マウント (Windows ネットワーク共有)
    • SSSD (System Security Services Daemon – 認証サービス)
    • Jenkins (CI/CDツール)
    • Samba (ファイル共有サービス)

まとめ

本記事では、Oracle Linux 9 で MySQL の FIPS モードを有効にするための手順について説明し、OS / OpenSSL / MySQL 構成間の関連に焦点を当てました。

OpenSSL の更新方法、OS レベルでの FIPS コンプライアンスの検証方法、MySQL のインストールと構成方法、そして重要な手順として、FIPS 有効化後のロックアウトを防ぐための SSH アクセスの対処方法を示しました。OpenSSH 構成を細かく調整し、FIPS 準拠の暗号化アルゴリズムが使用されることを確認することで、リモートアクセスを安全に保護しました。

さらに、MySQL 内で FIPS 準拠を強制するための要点を示し、TLS 接続に対する OS レベルの FIPS 強制と、MySQL クエリ内の MD5 のような非準拠アルゴリズムを制限するための明示的な OpenSSL 構成による FIPS 強制の、適用範囲の違いを強調しました。テストによって FIPS モードの動作を確認し、OS カーネルが TLS のようなシステムレベルの暗号化操作に対して FIPS を強制する一方で、OpenSSL の構成がアプリケーション固有の暗号化使用を制御することを確認することを示唆しました。

この手順により、システムが厳格なセキュリティ標準に準拠し、機密データのための堅牢で準拠した環境を提供することが保証されます。SSH アクセスに関する綿密な計画とテストが、FIPS モードへのスムーズな移行には不可欠であることを忘れないでください。これらのステップに従い、基本原則を理解することで、Oracle Linux 9 上で FIPS 準拠の MySQL サーバーを自信を持って導入および管理できます。

参照情報:

(訳者註: 本記事の元記事は、2025年3月7日に公開されました)