セキュリティーの強化
Red Hat Enterprise Linux 9 システムのセキュリティー強化
概要
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ を参照してください。
Red Hat ドキュメントへのフィードバック (英語のみ)
Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。
特定の文章に関するコメントの送信
- Multi-page HTML 形式でドキュメントを表示し、ページが完全にロードされてから右上隅に Feedback ボタンが表示されていることを確認します。
- カーソルを使用して、コメントを追加するテキスト部分を強調表示します。
- 強調表示されたテキストの近くに表示される Add Feedback ボタンをクリックします。
- フィードバックを追加し、Submit をクリックします。
Bugzilla からのフィードバック送信 (アカウントが必要)
- Bugzilla の Web サイトにログインします。
- Version メニューから正しいバージョンを選択します。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- Submit Bug をクリックします。
第1章 インストール時の RHEL の保護
セキュリティーへの対応は、Red Hat Enterprise Linux をインストールする前にすでに始まっています。最初からシステムのセキュリティーを設定することで、追加のセキュリティー設定を実装することがより簡単になります。
1.1. BIOS および UEFI のセキュリティー
BIOS (もしくは BIOS に相当するもの) およびブートローダーをパスワードで保護することで、システムに物理的にアクセス可能な未承認ユーザーがリムーバブルメディアを使用して起動したり、シングルユーザーモードで root 権限を取得することを防ぐことができます。このような攻撃に対するセキュリティー対策は、ワークステーションの情報の機密性とマシンの場所によって異なります。
たとえば、見本市で使用されていて機密情報を含んでいないマシンでは、このような攻撃を防ぐことが重要ではないかもしれません。しかし、同じ見本市で、企業ネットワークに対して暗号化されていない SSH 秘密鍵のある従業員のノートパソコンが、誰の監視下にもなく置かれていた場合は、重大なセキュリティー侵害につながり、その影響は企業全体に及ぶ可能性があります。
一方で、ワークステーションが権限のあるユーザーもしくは信頼できるユーザーのみがアクセスできる場所に置かれてるのであれば、BIOS もしくはブートローダーの安全確保は必要ない可能性もあります。
1.1.1. BIOS パスワード
コンピューターの BIOS をパスワードで保護する主な 2 つの理由を以下に示します。[1]:
- BIOS 設定の変更を防止する - 侵入者が BIOS にアクセスした場合は、CD-ROM やフラッシュドライブから起動するように設定できます。このようにすると、侵入者がレスキューモードやシングルユーザーモードに入ることが可能になり、システムで任意のプロセスを開始したり、機密性の高いデータをコピーできるようになってしまいます。
- システムの起動を防止する - BIOS の中には起動プロセスをパスワードで保護できるものもあります。これを有効にすると、攻撃者は BIOS がブートローダーを開始する前にパスワード入力を求められます。
BIOS パスワードの設定方法はコンピューターメーカーで異なるため、具体的な方法はコンピューターのマニュアルを参照してください。
BIOS パスワードを忘れた場合は、マザーボードのジャンパーでリセットするか、CMOS バッテリーを外します。このため、可能な場合はコンピューターのケースをロックすることが推奨されます。ただし、CMOS バッテリーを外す前にコンピューターもしくはマザーボードのマニュアルを参照してください。
1.1.2. 非 BIOS ベースシステムのセキュリティー
その他のシステムやアーキテクチャーでは、異なるプログラムを使用して x86 システムの BIOS とほぼ同等の低レベルのタスクを実行します。UEFI (Unified Extensible Firmware Interface) シェルなどがこの例になります。
BIOS のようなプログラムをパスワード保護する方法は、メーカーにお問い合わせください。
1.2. ディスクのパーティション設定
Red Hat は、/boot
、/
、/home
、/tmp
、および /var/tmp/
の各ディレクトリーに別々のパーティションを作成することを推奨します。
/boot
-
このパーティションは、システムの起動時にシステムが最初に読み込むパーティションです。Red Hat Enterprise Linux 9 でシステムを起動するのに使用するブートローダーとカーネルイメージはこのパーティションに保存されます。このパーティションは暗号化しないでください。このパーティションが
/`
に含まれており、そのパーティションが暗号化されているなどの理由で利用できなくなると、システムを起動できなくなります。 /home
-
ユーザーデータ (
/home
) が別のパーティションではなく/
に保存されていると、このパーティションが満杯になり、オペレーティングシステムが不安定になる可能性があります。また、システムを、Red Hat Enterprise Linux 9 の次のバージョンにアップグレードする際に、/home
パーティションにデータを保存できると、このデータはインストール時に上書きされないため、アップグレードが非常に簡単になります。root パーティション (/
) が破損すると、データが完全に失われます。したがって、パーティションを分けることが、データ損失に対する保護につながります。また、このパーティションを、頻繁にバックアップを作成する対象にすることも可能です。 /tmp
および/var/tmp/
-
/tmp
ディレクトリーおよび/var/tmp/
ディレクトリーは、どちらも長期保存の必要がないデータを保存するのに使用されます。しかし、このいずれかのディレクトリーでデータがあふれると、ストレージ領域がすべて使用されてしまう可能性があります。このディレクトリーは/
に置かれているため、こうした状態が発生すると、システムが不安定になり、クラッシュする可能性があります。そのため、このディレクトリーは個別のパーティションに移動することが推奨されます。
インストールプロセス時に、パーティションを暗号化するオプションがあります。パスフレーズを入力する必要があります。これは、パーティションのデータを保護するのに使用されるバルク暗号鍵を解除する鍵として使用されます。
1.3. インストールプロセス時のネットワーク接続の制限
Red Hat Enterprise Linux 9 をインストールする際に使用するインストールメディアは、特定のタイミングで作成されたスナップショットです。そのため、セキュリティー修正が最新のものではなく、このインストールメディアで設定するシステムが公開されてから修正された特定の問題に対して安全性に欠ける場合があります。
脆弱性が含まれる可能性のあるオペレーティングシステムをインストールする場合には、必ず、公開レベルを、必要最小限のネットワークゾーンに限定してください。最も安全な選択肢は、インストールプロセス時にマシンをネットワークから切断した状態にするネットワークなしのゾーンです。インターネット接続からのリスクが最も高く、一方で LAN またはイントラネット接続で十分な場合もあります。セキュリティーのベストプラクティスに従い、ネットワークから Red Hat Enterprise Linux 9 をインストールする場合は、お使いのリポジトリーに最も近いゾーンを選択するようにしてください。
1.4. 必要なパッケージの最小限のインストール
コンピューターの各ソフトウェアには脆弱性が潜んでいる可能性があるため、実際に使用するパッケージのみをインストールすることがベストプラクティスになります。インストールを DVD から行う場合は、インストールしたいパッケージのみを選択するようにします。その他のパッケージが必要になる場合は、後でいつでもシステムに追加できます。
1.5. インストール後の手順
以下は、Red Hat Enterprise Linux 9 のインストール直後に実行する必要があるセキュリティー関連の手順です。
システムを更新します。root で以下のコマンドを実行します。
# dnf update
ファイアウォールサービスの
firewalld
は、Red Hat Enterprise Linux のインストールで自動的に有効になっていますが、キックスタート設定などで明示的に無効となっている場合もあります。このような場合は、ファイアウォールを再度有効にすることが推奨されます。firewalld
を開始するには、root で次のコマンドを実行します。# systemctl start firewalld # systemctl enable firewalld
セキュリティーを強化するために、不要なサービスは無効にしてください。たとえば、使用中のコンピューターにプリンターがインストールされていなければ、以下のコマンドを使用して
cups
サービスを無効にします。# systemctl disable cups
アクティブなサービスを確認するには、次のコマンドを実行します。
$ systemctl list-units | grep service
第2章 FIPS モードでのシステムのインストール
FIPS (Federal Information Processing Standard) 140-3 による暗号化モジュールの自己チェックを有効にするには、FIPS モードで RHEL 9 を操作する必要があります。
そのためには、以下を行います。
- FIPS モードでのインストールの開始
- インストール後に FIPS モードにシステムを切り替えます。
デプロイ済みのシステムへの変換に関連するシステムコンプライアンスの暗号鍵資料の再生成や再評価を回避するために、Red Hat は FIPS モードでインストールを開始することを推奨します。
RHEL 9 の暗号化モジュールは、FIPS 140-3 の要件に対して認定されていません。
2.1. FIPS (Federal Information Processing Standard)
連邦情報処理標準 (FIPS) 140-3 は、U.S により開発されたコンピューターセキュリティー標準です。暗号化モジュールの品質を検証するために開発されたコンピューターセキュリティー標準です。NIST Computer Security Resource Center で公式の FIPS 公開を参照してください。
FIPS 140-3 標準は、暗号化ツールがアルゴリズムを正しく実装できるようにします。そのメカニズムの 1 つがランタイムのセルフチェックです。FIPS 標準の詳細とその他の仕様については、FIPS PUB 140-3 の完全な FIPS 140-3 規格を参照してください。
コンプライアンスの要件は、Red Hat Government Standards ページを参照してください。
2.2. FIPS モードが有効なシステムのインストール
FIPS (Federal Information Processing Standard) Publication 140-3 による暗号モジュールの自己チェックを有効にするには、システムのインストール時に FIPS モードを有効にします。
Red Hat は、後で FIPS モードを有効にするのではなく、FIPS モードを有効にして RHEL をインストールすることを推奨します。インストール時に FIPS モードを有効にすると、システムは FIPS で承認されるアルゴリズムと継続的な監視テストですべてのキーを生成するようになります。
手順
システムのインストール時に
fips=1
オプションをカーネルコマンドラインに追加します。ソフトウェアの選択段階で、サードパーティーのソフトウェアをインストールしないでください。
インストール後に、システムは FIPS モードで自動的に起動します。
検証
システムが起動したら、FIPS モードが有効になっていることを確認します。
$ fips-mode-setup --check FIPS mode is enabled.
関連情報
- 「RHEL インストーラーのブートオプション」ドキュメントの 起動オプションの編集 セクション
2.3. 関連情報
第3章 システム全体の暗号化ポリシーの使用
システム全体の暗号化ポリシーは、コア暗号化サブシステムを設定するシステムコンポーネントで、TLS、IPsec、SSH、DNSSec、および Kerberos の各プロトコルに対応します。これにより、管理者が選択できる小規模セットのポリシーを提供します。
3.1. システム全体の暗号化ポリシー
システム全体のポリシーを設定すると、RHEL のアプリケーションはそのポリシーに従い、ポリシーを満たしていないアルゴリズムやプロトコルを使用するように明示的に要求されない限り、その使用を拒否します。つまり、システムが提供した設定で実行する際に、デフォルトのアプリケーションの挙動にポリシーを適用しますが、必要な場合は上書きできます。
RHEL 9 には、以下の定義済みポリシーが含まれています。
| デフォルトのシステム全体の暗号化ポリシーレベルで、現在の脅威モデルに対して安全なものです。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは長さが 2048 ビット以上であれば許容されます。 |
| このポリシーにより、Red Hat Enterprise Linux 6 以前との最大の互換性が保証されます。攻撃対象範囲が広がるため、安全性が低くなります。SHA-1 は、TLS ハッシュ、署名、およびアルゴリズムとして使用できます。CBC モードの暗号は、SSH と併用できます。GnuTLS を使用するアプリケーションは、SHA-1 で署名した証明書を許可します。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは長さが 2048 ビット以上であれば許容されます。 |
| 近い将来の攻撃に耐えられると考えられている保守的なセキュリティーレベルです。このレベルでは、DNSSec または HMAC で SHA-1 を使用することができません。SHA2-224 ハッシュおよび SHA3-224 ハッシュは無効になります。128 ビット暗号は無効になります。CBC モードの暗号は、Kerberos を除き無効になります。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは、ビット長が 3072 以上だと許可されます。 |
|
FIPS140-2 要件に準拠するポリシールールです。これは、 |
Red Hat は常に、レガシーポリシーの使用時以外、全ライブラリーにセキュアなデフォルト値が提供されるように、全ポリシーレベルを調節します。レガシープロファイルではセキュアなデフォルト値が提供されませんが、簡単に悪用できるアルゴリズムは含まれません。このため、提供されたポリシーで有効なアルゴリズムのセットまたは許容可能な鍵サイズは、Red Hat Enterprise Linux の存続期間中に変更する可能性があります。
このような変更は、新しいセキュリティー標準や新しいセキュリティー調査を反映しています。Red Hat Enterprise Linux の有効期間中、特定のシステムとの相互運用性を確保する必要がある場合は、そのシステムと相互作用するコンポーネントの暗号化ポリシーから除外し、カスタムポリシーを使用して特定のアルゴリズムを再度有効にする必要があります。
カスタマーポータル API の証明書が使用する暗号化キーは FUTURE
のシステム全体の暗号化ポリシーが定義する要件を満たさないので、現時点で redhat-support-tool
ユーティリティーは、このポリシーレベルでは機能しません。
この問題を回避するには、カスタマーポータル API への接続中に DEFAULT
暗号化ポリシーを使用します。
ポリシーレベルで許可されていると記載されている特定のアルゴリズムと暗号は、アプリケーションがそれに対応している場合に限り使用できます。
暗号化ポリシーを管理するツール
現在のシステム全体の暗号化ポリシーを表示または変更するには、update-crypto-policies
ツールを使用します。以下に例を示します。
$ update-crypto-policies --show DEFAULT # update-crypto-policies --set FUTURE Setting system policy to FUTURE
暗号化ポリシーの変更を確実に適用するには、システムを再起動します。
安全ではない暗号スイートおよびプロトコルを削除した、強力な暗号デフォルト
以下の一覧は、Red Hat Enterprise Linux 9 のコア暗号ライブラリーから削除された暗号スイートとプロトコルを示しています。このアプリケーションはソースには存在しないか、またはビルド時にサポートを無効にしているため、アプリケーションは使用できません。
- DES (RHEL 7 以降)
- すべてのエクスポートグレードの暗号化スイート (RHEL 7 以降)
- 署名内の MD5 (RHEL 7 以降)
- SSLv2 (RHEL 7 以降)
- SSLv3 (RHEL 8 以降)
- 224 ビットより小さいすべての ECC 曲線 (RHEL 6 以降)
- すべてのバイナリーフィールドの ECC 曲線 (RHEL 6 以降)
すべてのポリシーレベルで無効になっているアルゴリズム
以下のアルゴリズムは、RHEL 9 に同梱される LEGACY
、DEFAULT
、FUTURE
、および FIPS
の暗号化ポリシーでは無効になっています。これらはカスタム暗号化ポリシーの適用、または個々のアプリケーションの明示的な設定によってのみ有効にできます。有効になる設定はサポートされていないと見なされます。
- バージョン 1.2 より古い TLS (RHEL 9 以降、以前では RHEL 8 の 1.0 未満)
- バージョン 1.2 より古い DTLS (RHEL 9 以降、RHEL 8 では 1.0 未満)
- パラメーターが 2048 ビット未満の DH (RHEL 9 以降、RHEL 8 では 1024 ビット未満)
- 鍵サイズ (2048 ビット 未満) の RSA (RHEL 9 以降、RHEL 8 では 1024 ビット未満)
- DSA (RHEL 9 以降、RHEL 8 では 1024 ビット未満)
- 3DES (RHEL 9 以降)
- RC4 (RHEL 9 以降)
- FFDHE-1024 (RHEL 9 以降)
- DHE-DSS (RHEL 9 以降)
- Camellia (RHEL 9 以降)
- ARIA
- IKEv1 (RHEL 8 以降)
暗号ポリシーレベルで有効なアルゴリズム
以下の表は、選択したアルゴリズムに関する、4 つの暗号ポリシーのすべてのレベルの比較を示しています。
LEGACY | DEFAULT | FIPS | FUTURE | |
---|---|---|---|---|
IKEv1 | いいえ | いいえ | いいえ | いいえ |
3DES | いいえ | いいえ | いいえ | いいえ |
RC4 | いいえ | いいえ | いいえ | いいえ |
DH | 最低 2048 ビット | 最低 2048 ビット | 最低 2048 ビット | 最低 3072 ビット |
RSA | 最低 2048 ビット | 最低 2048 ビット | 最低 2048 ビット | 最低 3072 ビット |
DSA | いいえ | いいえ | いいえ | いいえ |
TLS v1.1 以前 | いいえ | いいえ | いいえ | いいえ |
TLS v1.2 以降 | はい | はい | はい | はい |
SHA-1 デジタル署名および証明書に | はい | いいえ | いいえ | いいえ |
CBC モード暗号 | はい | いいえ[a] | いいえ[b] | いいえ[c] |
256 ビットより小さい鍵を持つ対称暗号 | はい | はい | はい | いいえ |
[a]
SSH で CBC 暗号が無効になっている
[b]
CBC 暗号は、Kerberos を除くすべてのプロトコルで無効になります。
[c]
CBC 暗号は、Kerberos を除くすべてのプロトコルで無効になります。
|
関連情報
-
update-crypto-policies(8)
の man ページ
3.2. システム全体の暗号化ポリシーを、以前のリリースと互換性のあるモードに切り替え
Red Hat Enterprise Linux 9 におけるデフォルトのシステム全体の暗号化ポリシーでは、現在は古くて安全ではないプロトコルは許可されません。Red Hat Enterprise Linux 6 およびそれ以前のリリースとの互換性が必要な場合には、安全でない LEGACY
ポリシーレベルを利用できます。
LEGACY
ポリシーレベルに設定すると、システムおよびアプリケーションの安全性が低下します。
手順
システム全体の暗号化ポリシーを
LEGACY
レベルに切り替えるには、root
で以下のコマンドを実行します。# update-crypto-policies --set LEGACY Setting system policy to LEGACY
関連情報
-
利用可能な暗号化ポリシーのレベルは、
update-crypto-policies(8)
の man ページを参照してください。 -
カスタム暗号化ポリシーの定義については、man ページの
update-crypto-policies (8)
のCustom Policies
セクションと、crypto-policies(7)
のCrypto Policy Definition Format
セクションを参照してください。
3.3. Web コンソールでシステム全体の暗号化ポリシーを設定する
事前定義されたシステム全体の暗号化ポリシーレベルから選択し、Red Hat Enterprise Linux Web コンソールインターフェイスでそれらを直接切り替えることができます。システムにカスタムポリシーを設定すると、Web コンソールの Overview ページと Change crypto policy ダイアログウィンドウにポリシーが表示されます。
前提条件
- RHEL 9 Web コンソールがインストールされている。詳細は、Web コンソールのインストールと有効化 を参照してください。
- 管理者権限があります。
手順
- RHEL Web コンソールにログインします。詳細は、Web コンソールへのログイン を参照してください。
- Overview ページの Configuration カードで、Crypto policy の横にある現在のポリシー値をクリックします。
- Change crypto policy ダイアログウィンドウで、使用を開始するポリシーレベルをクリックします。
- Apply and reboot ボタンをクリックします。
検証
- 再度ログインして、Crypto policy の値が選択した値に対応していることを確認します。
3.4. FIPS モードへのシステムの切り替え
システム全体の暗号化ポリシーには、連邦情報処理規格 (FIPS) 公開文書 140-3 の要件に準拠した暗号化モジュールのセルフチェックを有効にするポリシーレベルが含まれます。FIPS モードを有効または無効にする fips-mode-setup
ツールは、内部的に FIPS
のシステム全体の暗号化ポリシーレベルを使用します。
Red Hat は、後で FIPS モードを有効にするのではなく、FIPS モードを有効にして Red Hat Enterprise Linux 9 をインストールすることを推奨します。インストール時に FIPS モードを有効にすると、システムは FIPS で承認されるアルゴリズムと継続的な監視テストですべてのキーを生成するようになります。
RHEL 9 の暗号化モジュールは、FIPS 140-3 の要件に対して認定されていません。
手順
システムを FIPS モードに切り替えるには、以下のコマンドを実行します。
# fips-mode-setup --enable Kernel initramdisks are being regenerated. This might take some time. Setting system policy to FIPS 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. FIPS mode will be enabled. Please reboot the system for the setting to take effect.
システムを再起動して、カーネルを FIPS モードに切り替えます。
# reboot
検証
システムが再起動したら、FIPS モードの現在の状態を確認できます。
# fips-mode-setup --check FIPS mode is enabled.
関連情報
-
FIPS-mode-setup(8)
の man ページ - FIPS モードでのシステムのインストール
- NIST (National Institute of Standards and Technology) の Web サイトの Security Requirements for Cryptographic Modules。
3.5. コンテナーでの FIPS モードの有効化
Federal Information Processing Standard Publication 140-2 (FIPS モード) で義務付けられている暗号化モジュールのセルフチェックの完全なセットを有効にするには、ホストシステムのカーネルが FIPS モードで実行されている必要があります。podman
ユーティリティーは、サポートされているコンテナーで FIPS モードを自動的に有効にします。
コンテナーで fips-mode-setup
コマンドが正しく機能せず、このシナリオでこのコマンドを使用して FIPS モードを有効にしたり確認することができません。
RHEL 9 の暗号化モジュールは、FIPS 140-3 の要件に対して認定されていません。
前提条件
- ホストシステムが FIPS モードである必要があります。
手順
-
FIPS モードが有効になっているシステムでは、
podman
ユーティリティーはサポートされているコンテナーで FIPS モードを自動的に有効にします。
3.6. FIPS 140-3 に準拠していない暗号化を使用している RHEL アプリケーションのリスト
Red Hat は、FIPS 140-3 などの関連する暗号化認定をすべて渡し、RHEL システム全体の暗号化ポリシーに従うことが保証されているため、Red Hat は、コア暗号化コンポーネントからライブラリーを使用することを推奨します。
コア暗号化コンポーネントの概要、そのコンポーネントの選択方法、オペレーティングシステムへの統合方法、ハードウェアセキュリティーモジュールおよびスマートカードのサポート方法、暗号化による認定の適用方法の概要は、RHEL コア暗号化コンポーネント を参照してください。
表3.1 FIPS 140-3 に準拠していない暗号化を使用している RHEL 8 アプリケーションのリスト
アプリケーション | 詳細 |
---|---|
Bacula | CRAM-MD5 認証プロトコルを実装します。 |
Cyrus SASL | SCRAM-SHA-1 認証方式を使用します。 |
Dovecot | SCRAM-SHA-1 を使用します。 |
Emacs | SCRAM-SHA-1 を使用します。 |
FreeRADIUS | 認証プロトコルに MD5 および SHA-1 を使用します。 |
Ghostscript | ドキュメントを暗号化および復号化するためのカスタムの cryptogtaphy 実装 (MD5、RC4、SHA-2、AES) |
GRUB2 |
SHA-1 を必要とするレガシーファームウェアプロトコルをサポートし、 |
ipxe | TLS スタックを実装します。 |
Kerberos | SHA-1 (Windows との相互運用性) のサポートを維持します。 |
lasso |
|
MariaDB、MariaDB コネクター |
|
MySQL |
|
OpenIPMI | RAKP-HMAC-MD5 認証方式は、FIPS の使用が承認されておらず、FIPS モードでは機能しません。 |
OVMF (UEFI ファームウェア)、Edk2、shim | 完全な暗号スタック (OpenSSL ライブラリーの埋め込みコピー) |
perl-CPAN | MD5 認証をダイジェストします。 |
perl-Digest-HMAC、perl-Digest-SHA | HMAC、HMAC-SHA1、HMAC-MD5、SHA-1、SHA-224 などを使用します。 |
perl-Mail-DKIM | Signer クラスは、デフォルトで RSA-SHA1 アルゴリズムを使用します。 |
PKCS #12 ファイル処理 (OpenSSL、GnuTLS、NSS、Firefox、Java) | ファイル全体の HMAC の計算に使用されるキー派生関数 (KDF) が FIPS で承認されていないため、PKCS #12 のすべての使用は FIPS に準拠していません。そのため、PKCS #12 ファイルは、FIPS 準拠のためにプレーンテキストと見なされます。キー転送の目的で、FIPS 承認の暗号化方式を使用して PKCS #12 (.p12) ファイルをラップします。 |
Poppler | 元の PDF (MD5、RC4、SHA-1 など) に存在する場合は、許可されていないアルゴリズムに基づいて署名、パスワード、および暗号化を使用して PDF を保存できます。 |
PostgreSQL | KDF は SHA-1 を使用します。 |
QAT エンジン | 暗号化プリミティブの混在ハードウェアおよびソフトウェア実装 (RSA、EC、DH、AES、…) |
Ruby | 安全でないライブラリー関数 MD5 および SHA-1 を提供します。 |
Samba | RC4 および DES (Windows との相互運用性) のサポートを維持します。 |
Syslinux | BIOS パスワードは SHA-1 を使用します。 |
Unbound | DNS 仕様では、DNSSEC リゾルバーが検証のために DNSKEY レコードで SHA-1 ベースのアルゴリズムを使用する必要があります。 |
Valgrind | AES、SHA ハッシュ。[a] |
[a]
ARM 上の AES-NI、SHA-1 および SHA-2 などのソフトウェアハードウェアオフロード操作を再実装します。
|
3.7. システム全体の暗号化ポリシーに従わないようにアプリケーションを除外
アプリケーションで使用される暗号化関連の設定をカスタマイズする必要がある場合は、サポートされる暗号スイートとプロトコルをアプリケーションで直接設定することが推奨されます。
/etc/crypto-policies/back-ends
ディレクトリーからアプリケーション関連のシンボリックリンクを削除することもできます。カスタマイズした暗号化設定に置き換えることもできます。この設定により、除外されたバックエンドを使用するアプリケーションに対するシステム全体の暗号化ポリシーが使用できなくなります。この修正は、Red Hat ではサポートされていません。
3.7.1. システム全体の暗号化ポリシーを除外する例
wget
wget
ネットワークダウンローダーで使用される暗号化設定をカスタマイズするには、--secure-protocol
オプションおよび --ciphers
オプションを使用します。以下はその例です。
$ wget --secure-protocol=TLSv1_1 --ciphers="SECURE128" https://example.com
詳細は、wget(1)
man ページの HTTPS (SSL/TLS) Options のセクションを参照してください。
curl
curl
ツールで使用する暗号を指定するには、--ciphers
オプションを使用して、その値に、コロンで区切った暗号化のリストを指定します。以下はその例です。
$ curl https://example.com --ciphers '@SECLEVEL=0:DES-CBC3-SHA:RSA-DES-CBC3-SHA'
詳細は、curl(1)
の man ページを参照してください。
Firefox
Web ブラウザーの Firefox
でシステム全体の暗号化ポリシーをオプトアウトできない場合でも、Firefox の設定エディターで、対応している暗号と TLS バージョンをさらに詳細に制限できます。アドレスバーに about:config
と入力し、必要に応じて security.tls.version.min
の値を変更します。たとえば、security.tls.version.min
を 1
に設定すると、最低でも TLS 1.0 が必要になり、security.tls.version.min 2
が TLS 1.1 になります。
OpenSSH
OpenSSH クライアントに対するシステム全体の暗号化ポリシーをオプトアウトするには、以下のいずれかのタスクを実行します。
-
指定のユーザーの場合は、
~/.ssh/config
ファイルのユーザー固有の設定でグローバルのssh_config
を上書きします。 -
システム全体の場合は、辞書学的に
50-redhat.conf
ファイルよりも前に来るように、50 未満の 2 桁の接頭辞と、.conf
の接尾辞で/etc/ssh/ssh_config.d/
ディレクトリーにあるドロップイン設定ファイルに暗号ポリシーを指定します (例:49-crypto-policy-override.conf
など)。
詳細は、ssh_config(5)
の man ページを参照してください。
Libreswan
詳細は、Securing networks の Configuring IPsec connections that opt out of the system-wide crypto policies を参照してください。
関連情報
-
update-crypto-policies(8)
の man ページ
3.8. サブポリシーを使用したシステム全体の暗号化ポリシーのカスタマイズ
この手順を使用して、有効な暗号化アルゴリズムまたはプロトコルのセットを調整します。
既存のシステム全体の暗号化ポリシーの上にカスタムサブポリシーを適用するか、そのようなポリシーを最初から定義することができます。
スコープが設定されたポリシーの概念により、バックエンドごとに異なるアルゴリズムセットを有効にできます。各設定ディレクティブは、特定のプロトコル、ライブラリー、またはサービスに限定できます。
また、ディレクティブでは、ワイルドカードを使用して複数の値を指定する場合にアスタリスクを使用できます。
/etc/crypto-policies/state/CURRENT.pol
ファイルには、ワイルドカード展開後に現在適用されているシステム全体の暗号化ポリシーのすべての設定が一覧表示されます。暗号化ポリシーをより厳密にするには、/usr/share/crypto-policies/policies/FUTURE.pol
ファイルにリストされている値を使用することを検討してください。
サブポリシーの例は、/usr/share/crypto-policies/policies/modules/
ディレクトリーにあります。このディレクトリーのサブポリシーファイルには、コメントアウトされた行に説明が含まれています。
手順
/etc/crypto-policies/policies/modules/
ディレクトリーをチェックアウトします。# cd /etc/crypto-policies/policies/modules/
調整用のサブポリシーを作成します。次に例を示します。
# touch MYCRYPTO-1.pmod # touch SCOPES-AND-WILDCARDS.pmod
重要ポリシーモジュールのファイル名には大文字を使用します。
任意のテキストエディターでポリシーモジュールを開き、システム全体の暗号化ポリシーを変更するオプションを挿入します。次に例を示します。
# vi MYCRYPTO-1.pmod
min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512
# vi SCOPES-AND-WILDCARDS.pmod
# Disable the AES-128 cipher, all modes cipher = -AES-128-* # Disable CHACHA20-POLY1305 for the TLS protocol (OpenSSL, GnuTLS, NSS, and OpenJDK) cipher@TLS = -CHACHA20-POLY1305 # Allow using the FFDHE-1024 group with the SSH protocol (libssh and OpenSSH) group@SSH = FFDHE-1024+ # Disable all CBC mode ciphers for the SSH protocol (libssh and OpenSSH) cipher@SSH = -*-CBC # Allow the AES-256-CBC cipher in applications using libssh cipher@libssh = AES-256-CBC+
- 変更をモジュールファイルに保存します。
ポリシーの調整を、システム全体の暗号化ポリシーレベル
DEFAULT
に適用します。# update-crypto-policies --set DEFAULT:MYCRYPTO-1:SCOPES-AND-WILDCARDS
暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
# reboot
検証
/etc/crypto-policies/state/CURRENT.pol
ファイルに変更が含まれていることを確認します。以下に例を示します。$ cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072
関連情報
-
update-crypto-policies(8)
man ページのCustom Policies
セクション -
crypto-policies(7)
man ページのCrypto Policy Definition Format
セクション - Red Hat ブログ記事 How to customize crypto policies in RHEL 8.2
3.9. SHA-1 を再度有効に
署名を作成および検証するための SHA-1 アルゴリズムの使用は、DEFAULT
暗号化ポリシーで制限されています。シナリオで既存またはサードパーティーの暗号署名を検証するために SHA-1 を使用する必要がある場合は、RHEL 9 がデフォルトで提供する SHA1
サブポリシーを適用することで有効にできます。システムのセキュリティーが弱くなることに注意してください。
前提条件
-
このシステムは、
DEFAULT
システム全体の暗号化ポリシーを使用します。
手順
SHA1
サブポリシーをDEFAULT
暗号化ポリシーに適用します。# update-crypto-policies --set DEFAULT:SHA1 Setting system policy to DEFAULT: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.
システムを再起動します。
# reboot
検証
現在の暗号化ポリシーを表示します。
# update-crypto-policies --show DEFAULT:SHA1
update-crypto-policies --set LEGACY
コマンドを使用して LEGACY
暗号化ポリシーに切り替えると、署名に対して SHA-1 も有効になります。ただし、LEGACY
暗号化ポリシーは、他の弱い暗号化アルゴリズムも有効にすることで、システムをはるかに脆弱にします。この回避策は、SHA-1 署名以外のレガシー暗号化アルゴリズムを有効にする必要があるシナリオでのみ使用してください。
関連情報
- RHEL 9 から RHEL 6 システムへの SSH が機能しないKCS の記事
- ナレッジベースの記事 SHA-1 で署名されたパッケージはインストールまたはアップグレードできない
3.10. システム全体のカスタム暗号化ポリシーの作成および設定
以下の手順は、完全なポリシーファイルでシステム全体の暗号化ポリシーをカスタマイズする方法を示しています。
手順
カスタマイズのポリシーファイルを作成します。
# cd /etc/crypto-policies/policies/ # touch MYPOLICY.pol
または、定義されている 4 つのポリシーレベルのいずれかをコピーします。
# cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/MYPOLICY.pol
必要に応じて、テキストエディターでファイルを編集します。以下のようにしてカスタム暗号化ポリシーを使用します。
# vi /etc/crypto-policies/policies/MYPOLICY.pol
システム全体の暗号化ポリシーをカスタムレベルに切り替えます。
# update-crypto-policies --set MYPOLICY
暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
# reboot
関連情報
-
update-crypto-policies (8)
の man ページのCustom Policies
セクションと、crypto-policies(7)
のCrypto Policy Definition Format
セクションを参照してください。 - Red Hat ブログ記事 How to customize crypto policies in RHEL
第4章 crypto_policies
RHEL システムロールを使用したカスタム暗号化ポリシーの設定
管理者は、crypto_policies
RHEL システムロール を使用して、Ansible Core パッケージを使用し、多くの異なるシステムでカスタム暗号化ポリシーを迅速かつ一貫して設定できます。
4.1. crypto_policies
システムロール変数およびファクト
Ccrypto_policies
システムロール Playbook では、設定および制限に合わせて、crypto_policies
設定ファイルのパラメーターを定義できます。
変数を設定しない場合には、システムロールではシステムが設定されず、ファクトのみが報告されます。
crypto_policies
システムロールの一部の変数
crypto_policies_policy
- 管理対象ノードにシステムロールを適用する暗号化ポリシーを決定します。異なる暗号化ポリシーの詳細は、システム全体の暗号化ポリシー を参照してください。
crypto_policies_reload
-
yes
に設定すると、暗号化ポリシーの適用後に、影響を受けるサービス (現在ipsec
、バインド
、およびsshd
サービス) でリロードされます。デフォルトはyes
です。 crypto_policies_reboot_ok
-
yes
に設定されており、システムロールで暗号化ポリシーを変更した後に再起動が必要な場合には、crypto_policies_reboot_required
をyes
に設定します。デフォルトはno
です。
crypto_policies
システムロールにより設定されるファクト
crypto_policies_active
- 現在選択されているポリシーを一覧表示します。
crypto_policies_available_policies
- システムで利用可能なすべてのポリシーを表示します。
crypto_policies_available_subpolicies
- システムで利用可能なすべてのサブポリシーを表示します。
関連情報
4.2. crypto_policies
システムロールを使用したカスタム暗号化ポリシーの設定
crypto_policies
システムロールを使用して、単一のコントロールノードから多数の管理対象ノードを一貫して設定できます。
前提条件
-
crypto_policies
システムロールで設定するシステムである 1 つ以上の 管理対象ノード へのアクセスとパーミッション。 コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
コントロールノードでは、
-
ansible-core
パッケージおよびrhel-system-roles
パッケージがインストールされている。
-
RHEL 8.0-8.5 では、別の Ansible リポジトリーへのアクセス権を指定されており、Ansible をベースにする自動化用の Ansible Engine 2.9 が含まれています。Ansible Engine には、ansible
、ansible-playbook
などのコマンドラインユーティリティー、docker
や podman
などのコネクター、プラグインとモジュールが多く含まれています。Ansible Engine を入手してインストールする方法については、ナレッジベースの How to download and install Red Hat Ansible Engine を参照してください。
RHEL 8.6 および 9.0 では、Ansible Core (ansible-core
パッケージとして提供) が導入されました。これには、Ansible コマンドラインユーティリティー、コマンド、およびビルトイン Ansible プラグインのセットが含まれています。RHEL は、AppStream リポジトリーを介してこのパッケージを提供し、サポート範囲は限定的です。詳細については、ナレッジベースの Scope of support for the Ansible Core package included in the RHEL 9 and RHEL 8.6 and later AppStream repositories を参照してください。
- 管理対象ノードが記載されているインベントリーファイルがある。
手順
以下の内容を含む新しい
playbook.yml
ファイルを作成します。--- - hosts: all tasks: - name: Configure crypto policies include_role: name: rhel-system-roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
FUTURE の値は、任意の暗号化ポリシー(例:
DEFAULT
、LEGACY
、およびFIPS:OSPP
) に置き換えることができます。crypto_policies_reboot_ok: true
変数を設定すると、システムロールで暗号化ポリシーを変更した後にシステムが再起動されます。詳細については、crypto_policies システムロールの変数とファクト を参照してください。
オプション:Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory_file playbook.yml
検証
コントロールノードで (例:
verify_playbook.yml
) という名前の別の Playbook を作成します。- hosts: all tasks: - name: Verify active crypto policy include_role: name: rhel-system-roles.crypto_policies - debug: var: crypto_policies_active
この Playbook では、システムの設定は変更されず、管理対象ノードのアクティブなポリシーだけを報告します。
同じインベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory_file verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }
"crypto_policies_active":
変数は、管理対象ノードでアクティブなポリシーを表示します。
4.3. 関連情報
-
/usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md
ファイル -
ansible-playbook(1)
の man ページ。 - Preparing a control node and managed nodes to use RHEL System Roles
第5章 PKCS #11 で暗号化ハードウェアを使用するようにアプリケーションを設定
スマートカードや、エンドユーザー認証用の暗号化トークン、サーバーアプリケーション用のハードウェアセキュリティーモジュール (HSM) など、専用の暗号化デバイスで秘密情報の一部を分離することで、セキュリティー層が追加されます。RHEL では、PKCS #11 API を使用した暗号化ハードウェアへの対応がアプリケーション間で統一され、暗号ハードウェアでの秘密の分離が複雑なタスクではなくなりました。
5.1. PKCS #11 による暗号化ハードウェアへの対応
PKCS #11 (Public-Key Cryptography Standard) は、暗号化情報を保持する暗号化デバイスに、アプリケーションプログラミングインターフェイス (API) を定義し、暗号化機能を実行します。このデバイスはトークンと呼ばれ、ハードウェアまたはソフトウェアの形式で実装できます。
PKCS #11 トークンには、証明書、データオブジェクト、公開鍵、秘密鍵、または秘密鍵を含むさまざまなオブジェクトタイプを保存できます。このオブジェクトは、PKCS #11 の URI スキームにより一意に識別できます。
PKCS #11 の URI は、オブジェクト属性に従って、PKCS #11 モジュールで特定のオブジェクトを識別する標準的な方法です。これにより、URI の形式で、すべてのライブラリーとアプリケーションを同じ設定文字列で設定できます。
RHEL では、デフォルトでスマートカード用に OpenSC PKCS #11 ドライバーが提供されています。ただし、ハードウェアトークンと HSM には、システムにカウンターパートを持たない独自の PKCS #11 モジュールがあります。この PKCS #11 モジュールは p11-kit
ツールで登録できます。これは、システムの登録済みスマートカードドライバーにおけるラッパーとして機能します。
システムで独自の PKCS #11 モジュールを有効にするには、新しいテキストファイルを /etc/pkcs11/modules/
ディレクトリーに追加します。
/etc/pkcs11/modules/
ディレクトリーに新しいテキストファイルを作成すると、独自の PKCS #11 モジュールをシステムに追加できます。たとえば、p11-kit
の OpenSC 設定ファイルは、以下のようになります。
$ cat /usr/share/p11-kit/modules/opensc.module
module: opensc-pkcs11.so
5.2. スマートカードに保存された SSH 鍵の使用
Red Hat Enterprise Linux では、OpenSSH クライアントでスマートカードに保存されている RSA 鍵および ECDSA 鍵を使用できるようになりました。この手順に従って、パスワードの代わりにスマートカードを使用した認証を有効にします。
前提条件
-
クライアントで、
opensc
パッケージをインストールして、pcscd
サービスを実行している。
手順
PKCS #11 の URI を含む OpenSC PKCS #11 モジュールが提供する鍵の一覧を表示し、その出力を keys.pub ファイルに保存します。
$ ssh-keygen -D pkcs11: > keys.pub $ ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
リモートサーバー (example.com) でスマートカードを使用した認証を有効にするには、公開鍵をリモートサーバーに転送します。前の手順で作成された keys.pub で
ssh-copy-id
コマンドを使用します。$ ssh-copy-id -f -i keys.pub username@example.com
手順 1 の
ssh-keygen -D
コマンドの出力にある ECDSA 鍵を使用して example.com に接続するには、鍵を一意に参照する URI のサブセットのみを使用できます。以下に例を示します。$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $
~/.ssh/config
ファイルで同じ URI 文字列を使用して、設定を永続化できます。$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $
OpenSSH は
p11-kit-proxy
ラッパーを使用し、OpenSC PKCS #11 モジュールが PKCS#11 キットに登録されているため、以前のコマンドを簡素化できます。$ ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $
PKCS #11 の URI の id=
の部分を飛ばすと、OpenSSH が、プロキシーモジュールで利用可能な鍵をすべて読み込みます。これにより、必要な入力の量を減らすことができます。
$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $
関連情報
- Fedora 28:Better smart card support in OpenSSH
-
p11-kit(8)
、opensc.conf(5)
、pcscd(8)
、ssh(1)
、およびssh-keygen(1)
の man ページ
5.3. スマートカードから証明書を使用して認証するアプリケーションの設定
アプリケーションでスマートカードを使用した認証は、セキュリティーを強化し、自動化を簡素化する可能性があります。
wget
ネットワークダウンローダーでは、ローカルに保存された秘密鍵へのパスの代わりに PKCS #11 の URI を指定できるため、安全に保存された秘密鍵と証明書を必要とするタスク用のスクリプトの作成が容易になります。以下に例を示します。$ wget --private-key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --certificate 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
詳細は、
wget(1)
の man ページを参照してください。curl
ツールで使用する PKCS #11 の URI は、以下のように指定します。$ curl --key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --cert 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
詳細は、
curl(1)
の man ページを参照してください。注記PIN は、スマートカードに保存されているキーへのアクセスを制御するセキュリティー対策であり、設定ファイルにはプレーンテキスト形式の PIN が含まれているため、攻撃者が PIN を読み取れないように追加の保護を検討してください。たとえば、
pin-source
属性を使用して、file:
を指定できます。ファイルから PIN を読み込む URI。詳細については、RFC 7512:PKCS #11 URI Scheme Query Attribute Semantics を参照してください。コマンドパスをpin-source
属性の値として使用することには対応していないことに注意してください。-
Web ブラウザーの
Firefox
は、p11-kit-proxy
モジュールを自動的に読み込みます。つまり、システムで対応しているすべてのスマートカードが自動的に検出されます。TLS クライアント認証を使用した場合、その他に必要な設定はありません。また、サーバーがスマートカードを要求する際に、スマートカードの鍵が自動的に使用されます。
カスタムアプリケーションで PKCS #11 の URI の使用
アプリケーションが GnuTLS
ライブラリーまたは NSS
ライブラリーを使用する場合、PKCS #11 の URI は PKCS #11 の組み込みサポートで保証されます。また、OpenSSL
ライブラリーに依存するアプリケーションは、openssl-pkcs11
エンジンが生成する暗号化ハードウェアモジュールにアクセスできます。
アプリケーションでスマートカードの秘密鍵を使用する必要があり、NSS
、GnuTLS
、および OpenSSL
は使用しない場合は、p11-kit
を使用して PKCS #11 モジュールの登録を実装します。
関連情報
-
p11-kit(8)
の man ページ
5.4. Apache で秘密鍵を保護する HSM の使用
Apache
HTTP サーバーは、ハードウェアセキュリティーモジュール (HSM) に保存されている秘密鍵と連携できます。これにより、鍵の漏えいや中間者攻撃を防ぐことができます。通常、これを行うには、ビジーなサーバーに高パフォーマンスの HSM が必要になります。
HTTPS プロトコルの形式でセキュアな通信を行うために、Apache
HTTP サーバー (httpd
) は OpenSSL ライブラリーを使用します。OpenSSL は、PKCS #11 にネイティブに対応しません。HSM を使用するには、エンジンインターフェイスを介して PKCS #11 モジュールへのアクセスを提供する openssl-pkcs11
パッケージをインストールする必要があります。通常のファイル名ではなく PKCS #11 の URI を使用すると、/etc/httpd/conf.d/ssl.conf
設定ファイルでサーバーの鍵と証明書を指定できます。以下に例を示します。
SSLCertificateFile "pkcs11:id=%01;token=softhsm;type=cert" SSLCertificateKeyFile "pkcs11:id=%01;token=softhsm;type=private?pin-value=111111"
httpd-manual
パッケージをインストールして、TLS 設定を含む Apache
HTTP サーバーの完全ドキュメントを取得します。/etc/httpd/conf.d/ssl.conf
設定ファイルで利用可能なディレクティブの詳細は、/usr/share/httpd/manual/mod/mod_ssl.html
を参照してください。
5.5. Nginx で秘密鍵を保護する HSM の使用
Nginx
HTTP サーバーは、ハードウェアセキュリティーモジュール (HSM) に保存されている秘密鍵と連携できます。これにより、鍵の漏えいや中間者攻撃を防ぐことができます。通常、これを行うには、ビジーなサーバーに高パフォーマンスの HSM が必要になります。
Nginx
は暗号化操作に OpenSSL を使用するため、PKCS #11 への対応は openssl-pkcs11
エンジンを介して行う必要があります。Nginx
は現在、HSM からの秘密鍵の読み込みのみに対応します。また、証明書は通常のファイルとして個別に提供する必要があります。/etc/nginx/nginx.conf
設定ファイルの server
セクションで ssl_certificate
オプションおよび ssl_certificate_key
オプションを変更します。
ssl_certificate /path/to/cert.pem ssl_certificate_key "engine:pkcs11:pkcs11:token=softhsm;id=%01;type=private?pin-value=111111";
Nginx
設定ファイルの PKCS #11 URI に接頭辞 engine:pkcs11:
が必要なことに注意してください。これは、他の pkcs11
接頭辞がエンジン名を参照するためです。
5.6. 関連情報
-
pkcs11.conf(5)
の man ページ
第6章 polkit を使用したスマートカードへのアクセスの制御
PIN、PIN パッド、バイオメトリクスなどのスマートカードに組み込まれたメカニズムでは防ぐことができない脅威に対処するため、およびより詳細な制御のために、RHEL は polkit
フレームワークを使用してスマートカードへのアクセス制御を制御します。
システム管理者は、非特権ユーザーや非ローカルユーザー、サービスに対するスマートカードアクセスなど、特定のシナリオに合わせて polkit
を設定できます。
6.1. polkit を介したスマートカードアクセス制御
PC/SC (Personal Computer/Smart Card) プロトコルは、スマートカードとそのリーダーをコンピューティングシステムに統合するための標準を指定します。RHEL では、pcsc-lite
パッケージが、PC/SC の API を使用するスマートカードにアクセスするミドルウェアを提供します。このパッケージの一部である pcscd
(PC/SC スマートカード) デーモンにより、システムが PC/SC プロトコルを使用してスマートカードにアクセスできるようになります。
PIN、PIN パッド、バイオメトリクスなどのスマートカードに組み込まれたアクセス制御メカニズムは、考えられるすべての脅威をカバーするものではないため、RHEL は、より強力なアクセス制御に polkit
フレームワークを使用します。polkit
認可マネージャーは、特権操作へのアクセスを許可できます。ディスクへのアクセスを許可することに加えて、polkit
を使用して、スマートカードのセキュリティーを保護するポリシーを指定することもできます。たとえば、スマートカードで操作を実行できるユーザーを定義できます。
pcsc-lite
パッケージをインストールし、pcscd
デーモンを起動すると、システムは、/usr/share/polkit-1/actions/
ディレクトリーで定義されているポリシーを強制します。システム全体のデフォルトのポリシーは、/usr/share/polkit-1/actions/org.debian.pcsc-lite.policy
ファイルにあります。Polkit ポリシーファイルは XML 形式を使用し、その構文は man ページの polkit(8)
で説明されています。
polkitd
は、/etc/polkit-1/rules.d/
ディレクトリーおよび /usr/share/polkit-1/rules.d/
ディレクトリーで、これらのディレクトリーに保存されているルールファイルの変更を監視します。ファイルには、JavaScript 形式の認証ルールが含まれています。システム管理者は、両方のディレクトリーにカスタムルールファイルを追加し、polkitd
がファイル名に基づいてアルファベット順に読み込むことができます。2 つのファイルが同じ名前である場合は、最初に /etc/polkit-1/rules.d/
内のファイルが読み込まれます。
関連情報
-
man ページの
polkit(8)
、polkitd(8)
、およびpcscd(8)
6.2. PC/SC および polkit に関連する問題のトラブルシューティング
pcsc-lite
パッケージをインストールし、pcscd
デーモンを起動した後に自動的に強制される Polkit ポリシーは、ユーザーがスマートカードと直接対話しない場合でも、ユーザーのセッションで認証を求められることがあります。GNOME では、以下のエラーメッセージが表示されます。
Authentication is required to access the PC/SC daemon
opensc
などのスマートカードに関連する他のパッケージをインストールする場合は、システムが依存関係として pcsc-lite
パッケージをインストールできることに注意してください。
スマートカードとの相互作用が必要なく、PC/SC デーモンの認証要求が表示されないようにする場合は、pcsc-lite
パッケージを削除できます。必要なパッケージを最小限にとどめることが、セキュリティー上の推奨事項です。
スマートカードを使用する場合は、/usr/share/polkit-1/actions/org.debian.pcsc-lite.policy
時に、システムが提供するポリシーファイルのルールを確認して、トラブルシューティングを開始します。カスタムルールファイルは、/etc/polkit-1/rules.d/
ディレクトリーのポリシー (03-allow-pcscd.rules
など) に追加できます。ルールファイルは JavaScript 構文を使用し、ポリシーファイルは XML 形式であることに注意してください。
システムに表示される認証要求を理解するには、以下の例のように Journal ログを確認します。
$ journalctl -b | grep pcsc
...
Process 3087 (user: 1001) is NOT authorized for action: access_pcsc
...
以前のログエントリーは、ユーザーがポリシーによるアクションを実行する権限を持っていないことを示しています。この拒否を解決するには、対応するルールを /etc/polkit-1/rules.d/
に追加します。
polkitd
ユニットに関連するログエントリーも検索できます。以下に例を示します。
$ journalctl -u polkit
...
polkitd[NNN]: Error compiling script /etc/polkit-1/rules.d/00-debug-pcscd.rules
...
polkitd[NNN]: Operator of unix-session:c2 FAILED to authenticate to gain authorization for action org.debian.pcsc-lite.access_pcsc for unix-process:4800:14441 [/usr/libexec/gsd-smartcard] (owned by unix-user:group)
...
この出力では、最初のエントリーがルールファイルに構文エラーが含まれていることを示しています。2 番目のエントリーは、ユーザーが pcscd
へのアクセスを取得できなかったことを示しています。
また、短いスクリプトを使用して、PC/SC プロトコルを使用するすべてのアプリケーションを一覧表示することもできます。pcsc-apps.sh
などの実行ファイルを作成し、以下のコードを挿入します。
#!/bin/bash cd /proc for p in [0-9]* do if grep libpcsclite.so.1.0.0 $p/maps &> /dev/null then echo -n "process: " cat $p/cmdline echo " ($p)" fi done
root
でスクリプトを実行します。
# ./pcsc-apps.sh
process: /usr/libexec/gsd-smartcard (3048)
enable-sync --auto-ssl-client-auth --enable-crashpad (4828)
...
関連情報
-
man ページの
journalctl
、polkit(8)
、polkitd(8)
、およびpcscd(8)
6.3. PC/SC への polkit 認証の詳細情報の表示
デフォルト設定では、polkit
認証フレームワークは、限られた情報のみをジャーナルログに送信します。新しいルールを追加することで、PC/SC プロトコル関連の polkit
ログエントリーを拡張できます。
前提条件
-
システムに
pcsc-lite
パッケージをインストールしている。 -
pcscd
デーモンが実行中である。
手順
/etc/polkit-1/rules.d/
ディレクトリーに新規ファイルを作成します。# touch /etc/polkit-1/rules.d/00-test.rules
選択したエディターでファイルを編集します。以下に例を示します。
# vi /etc/polkit-1/rules.d/00-test.rules
以下の行を挿入します。
polkit.addRule(function(action, subject) { if (action.id == "org.debian.pcsc-lite.access_pcsc" || action.id == "org.debian.pcsc-lite.access_card") { polkit.log("action=" + action); polkit.log("subject=" + subject); } });
ファイルを保存して、エディターを終了します。
pcscd
サービスおよびpolkit
サービスを再起動します。# systemctl restart pcscd.service pcscd.socket polkit.service
検証
-
pcscd
の認可リクエストを作成します。たとえば、Firefox の Web ブラウザーを開くか、opensc
が提供するpkcs11-tool -L
を使用します。 拡張ログエントリーを表示します。以下に例を示します。
# journalctl -u polkit --since "1 hour ago" polkitd[1224]: <no filename>:4: action=[Action id='org.debian.pcsc-lite.access_pcsc'] polkitd[1224]: <no filename>:5: subject=[Subject pid=2020481 user=user' groups=user,wheel,mock,wireshark seat=null session=null local=true active=true]
関連情報
-
man ページの
polkit(8)
およびpolkitd(8)
6.4. 関連情報
- スマートカードへのアクセスの制御 Red Hat ブログの記事
第7章 設定コンプライアンスおよび脆弱性スキャンの開始
コンプライアンス監査は、指定したオブジェクトが、コンプライアンスポリシーに指定されているすべてのルールに従っているかどうかを判断するプロセスです。コンプライアンスポリシーは、コンピューティング環境で使用される必要な設定を指定するセキュリティー専門家が定義します。これは多くの場合は、チェックリストの形式を取ります。
コンプライアンスポリシーは組織により大幅に異なることがあり、同一組織内でもシステムが異なるとポリシーが異なる可能性があります。ポリシーは、各システムの目的や、組織におけるシステム重要性により異なります。カスタマイズしたソフトウェア設定や導入の特徴によっても、カスタマイズしたポリシーのチェックリストが必要になってきます。
7.1. RHEL における設定コンプライアンスツール
Red Hat Enterprise Linux は、コンプライアンス監査を完全に自動化できるツールを提供します。このツールは SCAP (Security Content Automation Protocol) 規格に基づいており、コンプライアンスポリシーの自動化に合わせるように設計されています。
-
SCAP Workbench -
scap-workbench
グラフィカルユーティリティーは、1 台のローカルシステムまたはリモートシステムで設定スキャンと脆弱性スキャンを実行するように設計されています。これらのスキャンと評価に基づくセキュリティーレポートの生成にも使用できます。 -
OpenSCAP:
OpenSCAP
ライブラリーは、付随するoscap
コマンドラインユーティリティーとともに、ローカルシステムで設定スキャンと脆弱性スキャンを実行するように設計されています。これにより、設定コンプライアンスのコンテンツを検証し、スキャンおよび評価に基づいてレポートおよびガイドを生成します。
OpenSCAP の使用中にメモリー消費の問題が発生する可能性があります。これにより、プログラムが途中で停止し、結果ファイルが生成されない可能性があります。詳細については、ナレッジベース記事 OpenSCAP のメモリー消費の問題 を参照してください。
-
SCAP Security Guide (SSG) -
scap-security-guide
パッケージは、Linux システム向けの最新のセキュリティーポリシーコレクションを提供します。このガイダンスは、セキュリティー強化に関する実践的なアドバイスのカタログから設定されます (該当する場合は、法規制要件へのリンクが含まれます)。このプロジェクトは、一般的なポリシー要件と特定の実装ガイドラインとの間にあるギャップを埋めることを目的としています。 -
Script Check Engine (SCE) - SCE は SCAP プロトコルの拡張機能であり、この機能を使用すると管理者が Bash、Python、Ruby などのスクリプト言語を使用してセキュリティーコンテンツを記述できるようになります。SCE 拡張機能は、
openscap-engine-sce
パッケージで提供されます。SCE 自体は SCAP 標準規格の一部ではありません。
複数のリモートシステムで自動コンプライアンス監査を実行する必要がある場合は、Red Hat Satellite 用の OpenSCAP ソリューションを利用できます。
関連情報
-
oscap(8)
、scap-workbench(8)
、およびscap-security-guide(8)
の man ページ - Red Hat Security Demos:Creating Customized Security Policy Content to Automate Security Compliance
- Red Hat Security Demos:Defend Yourself with RHEL Security Technologies
- Red Hat Satellite の管理ガイドのセキュリティーコンプライアンスの管理
7.2. 脆弱性スキャン
7.2.1. Red Hat Security Advisories OVAL フィード
Red Hat Enterprise Linux のセキュリティー監査機能は、標準規格セキュリティー設定共通化手順 (Security Content Automation Protocol (SCAP)) を基にしています。SCAP は、自動化された設定、脆弱性およびパッチの確認、技術的な制御コンプライアンスアクティビティー、およびセキュリティーの測定に対応している多目的な仕様のフレームワークです。
SCAP 仕様は、スキャナーまたはポリシーエディターの実装が義務付けられていなくても、セキュリティーコンテンツの形式がよく知られて標準化されているエコシステムを作成します。これにより、組織は、採用しているセキュリティーベンダーの数に関係なく、セキュリティーポリシー (SCAP コンテンツ) を構築するのは一度で済みます。
セキュリティー検査言語 OVAL (Open Vulnerability Assessment Language) は、SCAP に不可欠で最も古いコンポーネントです。その他のツールやカスタマイズされたスクリプトとは異なり、OVAL は、宣言型でリソースが必要な状態を記述します。OVAL コードは、スキャナーと呼ばれる OVAL インタープリターツールを使用して直接実行されることは決してありません。OVAL が宣言型であるため、評価されるシステムの状態が偶然修正されることはありません。
他のすべての SCAP コンポーネントと同様に、OVAL は XML に基づいています。SCAP 標準規格は、いくつかのドキュメント形式を定義します。この形式にはそれぞれ異なる種類の情報が記載され、異なる目的に使用されます。
Red Hat 製品セキュリティー を使用すると、Red Hat 製品をお使いのお客様に影響を及ぼすセキュリティー問題をすべて追跡して調査します。Red Hat カスタマーポータルで簡潔なパッチやセキュリティーアドバイザリーを適時提供します。Red Hat は OVAL パッチ定義を作成してサポートし、マシンが判読可能なセキュリティーアドバイザリーを提供します。
プラットフォーム、バージョン、およびその他の要因が異なるため、Red Hat 製品セキュリティーによる脆弱性の重大度定性評価は、サードパーティーが提供する Common Vulnerability Scoring System (CHC) のベースライン評価と完全に一致しているわけではありません。したがって、サードパーティーが提供する定義ではなく、RHSA OVAL 定義を使用することが推奨されます。
各 RHSA OVAL 定義 は完全なパッケージとして利用でき、新しいセキュリティーアドバイザリーが Red Hat カスタマーポータルで利用可能になってから 1 時間以内に更新されます。
各 OVAL パッチ定義は、Red Hat セキュリティーアドバイザリー (RHSA) と 1 対 1 にマッピングしています。RHSA には複数の脆弱性に対する修正が含まれるため、各脆弱性は、共通脆弱性識別子 (Common Vulnerabilities and Exposures (CVE)) 名ごとに表示され、公開バグデータベースの該当箇所へのリンクが示されます。
RHSA OVAL 定義は、システムにインストールされている RPM パッケージで脆弱なバージョンを確認するように設計されています。この定義は拡張でき、パッケージが脆弱な設定で使用されているかどうかを見つけるなど、さらに確認できるようにすることができます。この定義は、Red Hat が提供するソフトウェアおよび更新に対応するように設計されています。サードパーティーソフトウェアのパッチ状態を検出するには、追加の定義が必要です。
Red Hat Insights for Red Hat Enterprise Linux コンプライアンスサービス は、IT セキュリティーおよびコンプライアンス管理者が Red Hat Enterprise Linux システムのセキュリティーポリシーのコンプライアンスを評価、監視、およびレポートするのに役立ちます。また、コンプライアンスサービス UI 内で完全に SCAP セキュリティーポリシーを作成および管理することもできます。
7.2.2. システムの脆弱性のスキャン
oscap
コマンドラインユーティリティーを使用すると、ローカルシステムのスキャン、設定コンプライアンスコンテンツの確認、ならびにスキャンおよび評価を基にしたレポートとガイドの生成が可能です。このユーティリティーは、OpenSCAP ライブラリーのフロントエンドとしてサービスを提供し、その機能を処理する SCAP コンテンツのタイプに基づいてモジュール (サブコマンド) にグループ化します。
前提条件
-
openscap-scanner
およびbzip2
パッケージがインストールされます。
手順
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL9/rhel-9.oval.xml.bz2 | bzip2 --decompress > rhel-9.oval.xml
システムの脆弱性をスキャンし、vulnerability.html ファイルに結果を保存します。
# oscap oval eval --report vulnerability.html rhel-9.oval.xml
検証
結果をブラウザーで確認します。以下に例を示します。
$ firefox vulnerability.html &
関連情報
-
oscap(8)
の man ページ - Red Hat OVAL 定義
- OpenSCAP のメモリー消費の問題
7.2.3. リモートシステムの脆弱性のスキャン
SSH プロトコルで oscap-ssh
ツールを使用して、OpenSCAP スキャナーでリモートシステムの脆弱性を確認することもできます。
前提条件
-
openscap-utils
およびbzip2
パッケージは、スキャンに使用するシステムにインストールされます。 -
リモートシステムに
openscap-scanner
パッケージがインストールされている。 - リモートシステムで SSH サーバーが実行している。
手順
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL9/rhel-9.oval.xml.bz2 | bzip2 --decompress > rhel-9.oval.xml
脆弱性に対して、ホスト名 machine1、ポート 22 で実行する SSH、およびユーザー名 joesec でリモートシステムをスキャンし、結果を remote-vulnerability.html ファイルに保存します。
# oscap-ssh joesec@machine1 22 oval eval --report remote-vulnerability.html rhel-9.oval.xml
関連情報
-
oscap-ssh(8)
- Red Hat OVAL 定義
- OpenSCAP のメモリー消費の問題
7.3. 設定コンプライアンススキャン
7.3.1. RHEL の設定コンプライアンス
設定コンプライアンススキャンを使用して、特定の組織で定義されているベースラインに準拠できます。たとえば、米国政府と協力している場合は、システムを Operating System Protection Profile (OSPP) に準拠させ、支払い処理業者の場合は、システムを Payment Card Industry Data Security Standard (PCI-DSS) に準拠させなければならない場合があります。設定コンプライアンススキャンを実行して、システムセキュリティーを強化することもできます。
Red Hat は、対象コンポーネント向けの Red Hat のベストプラクティスに従っているため、SCAP Security Guide パッケージで提供される Security Content Automation Protocol (SCAP) コンテンツに従うことを推奨します。
SCAP Security Guide パッケージは、SCAP 1.2 および SCAP 1.3 標準規格に準拠するコンテンツを提供します。openscap scanner
ユーティリティーは、SCAP Security Guide パッケージで提供される SCAP 1.2 および SCAP 1.3 コンテンツの両方と互換性があります。
設定コンプライアンススキャンを実行しても、システムが準拠しているとは限りません。
SCAP セキュリティーガイドスイートは、データストリームのドキュメント形式で、複数のプラットフォームのプロファイルを提供します。データストリームは、定義、ベンチマーク、プロファイル、および個々のルールが含まれるファイルです。各ルールでは、コンプライアンスの適用性と要件を指定します。RHEL は、セキュリティーポリシーを扱う複数のプロファイルを提供します。Red Hat データストリームには、業界標準の他に、失敗したルールの修正に関する情報も含まれます。
コンプライアンススキャンリソースの構造
Data stream ├── xccdf | ├── benchmark | ├── profile | | ├──rule reference | | └──variable | ├── rule | ├── human readable data | ├── oval reference ├── oval ├── ocil reference ├── ocil ├── cpe reference └── cpe └── remediation
プロファイルは、OSPP、PCI-DSS、Health Insurance Portability and Accountability Act (HIPAA) などのセキュリティーポリシーに基づく一連のルールです。これにより、セキュリティー標準規格に準拠するために、システムを自動で監査できます。
プロファイルを変更 (調整) して、パスワードの長さなどの特定のルールをカスタマイズできます。プロファイルの調整の詳細は、SCAP Workbench を使用したセキュリティープロファイルのカスタマイズ を参照してください。
7.3.2. OpenSCAP スキャン結果の例
システムのさまざまなプロパティーと、OpenSCAP スキャンに適用されるデータストリームおよびプロファイルによっては、ルールごとに固有の結果が生成されることがあります。以下は、考えられる結果のリストで、その意味を簡単に説明します。
表7.1 OpenSCAP スキャン結果の例
結果 | 説明 |
---|---|
Pass | スキャンでは、このルールとの競合が見つかりませんでした。 |
Fail | スキャンで、このルールとの競合が検出されました。 |
Not checked | OpenSCAP はこのルールの自動評価を実行しません。システムがこのルールに手動で準拠しているかどうかを確認してください。 |
Not applicable | このルールは、現在の設定には適用されません。 |
Not selected | このルールはプロファイルには含まれません。OpenSCAP はこのルールを評価せず、結果にこのようなルールは表示されません。 |
Error |
スキャンでエラーが発生しました。詳細は、 |
Unknown |
スキャンで予期しない状況が発生しました。詳細は、 |
7.3.3. 設定コンプライアンスのプロファイルの表示
スキャンまたは修復にプロファイルを使用することを決定する前に、oscap info
サブコマンドを使用して、プロファイルを一覧表示し、詳細な説明を確認できます。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。
手順
SCAP Security Guide プロジェクトが提供するセキュリティーコンプライアンスプロファイルで利用可能なファイルをすべて表示します。
$ ls /usr/share/xml/scap/ssg/content/ ssg-rhel9-ds.xml
oscap info
サブコマンドを使用して、選択したデータストリームに関する詳細情報を表示します。データストリームを含む XML ファイルは、名前に-ds
文字列で示されます。Profiles
セクションでは、利用可能なプロファイルと、その ID の一覧を確認できます。$ oscap info /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml Profiles: ... Title: Australian Cyber Security Centre (ACSC) Essential Eight Id: xccdf_org.ssgproject.content_profile_e8 Title: Health Insurance Portability and Accountability Act (HIPAA) Id: xccdf_org.ssgproject.content_profile_hipaa Title: PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 Id: xccdf_org.ssgproject.content_profile_pci-dss ...
データストリームファイルからプロファイルを選択し、選択したプロファイルに関する追加情報を表示します。そのためには、
oscap info
に--profile
オプションを指定した後に、直前のコマンドの出力で表示された ID の最後のセクションを指定します。たとえば、HIPPA プロファイルの ID はxccdf_org.ssgproject.content_profile_hipaa
で、--profile
オプションの値はhipaa
です。$ oscap info --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml ... Profile Title: [RHEL9 DRAFT] Health Insurance Portability and Accountability Act (HIPAA) Id: xccdf_org.ssgproject.content_profile_hipaa Description: The HIPAA Security Rule establishes U.S. national standards to protect individuals’ electronic personal health information that is created, received, used, or maintained by a covered entity. The Security Rule requires appropriate administrative, physical and technical safeguards to ensure the confidentiality, integrity, and security of electronic protected health information. This profile configures Red Hat Enterprise Linux 9 to the HIPAA Security Rule identified for securing of electronic protected health information. Use of this profile in no way guarantees or makes claims against legal compliance against the HIPAA Security Rule(s).
関連情報
-
scap-security-guide (8)
の man ページ - OpenSCAP のメモリー消費の問題
7.3.4. 特定のベースラインによる設定コンプライアンスの評価
システムが特定のベースラインに準拠しているかどうかを確認するには、次の手順に従います。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。 - システムが準拠する必要があるベースライン内のプロファイルの ID を知っている必要があります。ID を見つけるには、設定コンプライアンスのプロファイルの表示 を参照してください。
手順
選択したプロファイルでそのシステムがどのように複雑であるかを評価し、スキャン内容を保存すると、以下のように HTML ファイル (report.html) に結果が表示されます。
$ oscap xccdf eval --report report.html --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
オプション:コンプライアンスに対して、ホスト名
machine1
、ポート22
で実行する SSH、およびユーザー名joesec
でリモートシステムをスキャンし、結果をremote-report.html
ファイルに保存します。$ oscap-ssh joesec@machine1 22 xccdf eval --report remote_report.html --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
関連情報
-
scap-security-guide (8)
の man ページ -
/usr/share/doc/scap-security-guide/
ディレクトリーにあるSCAP Security Guide
ドキュメント -
/usr/share/doc/scap-security-guide/guides/ssg-rhel9-guide-index.html
-scap-security-guide-doc
パッケージでインストールされた Red Hat Enterprise Linux 9 のセキュアな設定ガイド - OpenSCAP のメモリー消費の問題
7.4. 特定のベースラインに合わせたシステムの修復
この手順を使用して、特定のベースラインに合わせて RHEL システムを修正します。この例では、Health Insurance Portability and Accountability Act (HIPAA) プロファイルを使用します。
修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
RHEL システムに、
scap-security-guide
パッケージがインストールされている。
手順
oscap
コマンドに--remediate
オプションを指定して使用します。# oscap xccdf eval --profile hipaa --remediate /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
- システムを再起動します。
検証
システムの OSPP プロファイルへのコンプライアンスを評価し、スキャン結果を
ospp_report.html
ファイルに保存します。$ oscap xccdf eval --report hipaa_report.html --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
関連情報
-
scap-security-guide(8)
およびoscap(8)
の man ページ
7.5. SSG Ansible Playbook を使用して、特定のベースラインに合わせてシステムを修正する
この手順では、SCAP Security Guide プロジェクトの Ansible Playbook ファイルを使用して、特定のベースラインでシステムを修正します。この例では、Health Insurance Portability and Accountability Act (HIPAA) プロファイルを使用します。
修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
scap-security-guide
パッケージがインストールされている。 -
ansible-core
パッケージがインストールされている。詳細は、Ansible インストールガイドを参照してください。
RHEL 8.6 以降では、Ansible Engine は、組み込みモジュールのみを含む ansible-core
パッケージに置き換えられました。Ansible 修復の多くは、community コレクションおよび Portable Operating System Interface (POSIX) コレクションのモジュールを使用することに注意してください。これは組み込みモジュールには含まれていません。この場合は、Ansible 修復の代わりに Bash 修復を使用できます。RHEL 9 の Red Hat Connector には、Ansible Core で修復 Playbook を機能させるために必要な Ansible モジュールが含まれています。
手順
Ansible を使用して OSPP に合わせてシステムを修正します。
# ansible-playbook -i localhost, -c local /usr/share/scap-security-guide/ansible/rhel9-playbook-hipaa.yml
- システムを再起動します。
検証
システムの OSPP プロファイルへのコンプライアンスを評価し、スキャン結果を
ospp_report.html
ファイルに保存します。# oscap xccdf eval --profile hipaa --report hipaa_report.html /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
関連情報
-
scap-security-guide(8)
およびoscap(8)
の man ページ - Ansible ドキュメント
7.6. システムを特定のベースラインに合わせるための修復用 Ansible Playbook の作成
以下の手順に従って、必要な修復のみを含む Ansible Playbook を作成し、システムを特定のベースラインに合わせます。この例では、Health Insurance Portability and Accountability Act (HIPAA) プロファイルを使用します。この手順では、要件を満たしていない小規模の Playbook を作成します。以下の手順に従うと、システムを変更せずに、後のアプリケーション用にファイルの準備を行うだけです。
RHEL 9 では、Ansible Engine は、組み込みモジュールのみを含む ansible-core
パッケージに置き換えられました。Ansible 修復の多くは、community コレクションおよび Portable Operating System Interface (POSIX) コレクションのモジュールを使用することに注意してください。これは組み込みモジュールには含まれていません。この場合は、Bash 修復を Ansible 修復の代わりに使用できます。RHEL 9.0 の Red Hat Connector には、Ansible Core で修復 Playbook を機能させるために必要な Ansible モジュールが含まれています。
前提条件
-
scap-security-guide
パッケージがインストールされている。
手順
システムをスキャンして結果を保存します。
# oscap xccdf eval --profile hipaa --results hipaa-results.xml /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
前の手順で生成されたファイルに基づいて Ansible Playbook を生成します。
# oscap xccdf generate fix --fix-type ansible --profile hipaa --output hipaa-remediations.yml hipaa-results.xml
-
hippa-remediations.yml
ファイルには、手順 1 で実行されたスキャン中に失敗したルールの Ansible 修復が含まれています。この生成されたファイルを確認した後、ansible-playbook hipaa-remediations.yml
コマンドで適用できます。
検証
-
お使いのテキストエディターで、手順 1 で実行したスキャンで失敗したルールが
hipaa-remediations.yml
ファイルに含まれていることを確認します。
関連情報
-
scap-security-guide(8)
およびoscap(8)
の man ページ - Ansible ドキュメント
7.7. 後でアプリケーションを修復するための Bash スクリプトの作成
この手順を使用して、システムを HIPAA などのセキュリティープロファイルと調整する修正を含む Bash スクリプトを作成します。次の手順では、システムに変更を加えることなく、後のアプリケーション用にファイルを準備する方法を説明します。
前提条件
-
RHEL システムに、
scap-security-guide
パッケージがインストールされている。
手順
oscap
コマンドを使用してシステムをスキャンし、結果を XML ファイルに保存します。以下の例では、oscap
はhipaa
プロファイルに対してシステムを評価します。# oscap xccdf eval --profile hipaa --results hipaa-results.xml /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
前の手順で生成された結果ファイルに基づいて Bash スクリプトを生成します。
# oscap xccdf generate fix --profile hipaa --fix-type bash --output hipaa-remediations.sh hipaa-results.xml
-
hippa-dss-remediations.sh
ファイルには、手順 1 で実行されたスキャン中に失敗したルールの修復が含まれます。この生成されたファイルを確認したら、このファイルと同じディレクトリー内で./hipaa-remediations.sh
コマンドを使用して適用できます。
検証
-
お使いのテキストエディターで、手順 1 で実行したスキャンで失敗したルールが
hipaa-remediations.sh
ファイルに含まれていることを確認します。
関連情報
-
scap-security-guide(8)
、oscap(8)
、およびbash(1)
の man ページ
7.8. SCAP Workbench を使用したカスタムプロファイルでシステムのスキャン
SCAP Workbench
(scap-workbench
) パッケージはグラフィカルユーティリティーで、1 台のローカルシステムまたはリモートシステムで設定スキャンと脆弱性スキャンを実行し、システムの修復を実行して、スキャン評価に基づくレポートを生成します。oscap
コマンドラインユーティリティーとの比較は、SCAP Workbench
には限定的な機能しかないことに注意してください。SCAP Workbench
は、データストリームファイルの形式でセキュリティーコンテンツを処理します。
7.8.1. SCAP Workbench を使用したシステムのスキャンおよび修復
選択したセキュリティーポリシーに対してシステムを評価するには、以下の手順に従います。
前提条件
-
scap-workbench
パッケージがシステムにインストールされている。
手順
GNOME Classic
デスクトップ環境からSCAP Workbench
を実行するには、Super キーを押してアクティビティーの概要
を開き、scap-workbench
と入力して Enterを押します。または、次のコマンドを実行します。$ scap-workbench &
以下のオプションのいずれかを使用してセキュリティーポリシーを選択します。
-
開始ウィンドウの
Load Content
ボタン -
Open content from SCAP Security Guide
File
メニューのOpen Other Content
で、XCCDF、SCAP RPM、またはデータストリームファイルの各ファイルを検索します。
-
開始ウィンドウの
Remediate チェックボックスを選択して、システム設定の自動修正を行うことができます。このオプションを有効にすると、
SCAP Workbench
は、ポリシーにより適用されるセキュリティールールに従ってシステム設定の変更を試みます。このプロセスは、システムスキャン時に失敗した関連チェックを修正する必要があります。警告修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。Scan ボタンをクリックし、選択したプロファイルでシステムをスキャンします。
-
スキャン結果を XCCDF ファイル、ARF ファイル、または HTML ファイルの形式で保存するには、Save Results コンボボックスをクリックします。
HTML Report
オプションを選択して、スキャンレポートを、人間が判読できる形式で生成します。XCCDF 形式および ARF (データストリーム) 形式は、追加の自動処理に適しています。3 つのオプションはすべて繰り返し選択できます。 - 結果ベースの修復をファイルにエクスポートするには、ポップアップメニューの Generate remediation role を使用します。
7.8.2. SCAP Workbench を使用したセキュリティープロファイルのカスタマイズ
セキュリティープロファイルをカスタマイズするには、特定のルール (パスワードの最小長など) のパラメーターを変更し、別の方法で対象とするルールを削除し、追加のルールを選択して内部ポリシーを実装できます。プロファイルをカスタマイズして新しいルールの定義はできません。
以下の手順は、プロファイルをカスタマイズ (調整) するための SCAP Workbench
の使用を示しています。oscap
コマンドラインユーティリティーで使用するようにカスタマイズしたプロファイルを保存することもできます。
前提条件
-
scap-workbench
パッケージがシステムにインストールされている。
手順
-
SCAP Workbench
を実行し、Open content from SCAP Security Guide
またはFile
メニューのOpen Other Content
を使用してカスタマイズするプロファイルを選択します。 選択したセキュリティープロファイルを必要に応じて調整するには、Customize ボタンをクリックします。
これにより、元のデータストリームファイルを変更せずに現在選択されているプロファイルを変更できる新しいカスタマイズウィンドウが開きます。新しいプロファイル ID を選択します。
- 論理グループに分けられたルールを持つツリー構造を使用するか、Search フィールドを使用して変更するルールを検索します。
ツリー構造のチェックボックスを使用した include ルールまたは exclude ルール、または必要に応じてルールの値を変更します。
- OK ボタンをクリックして変更を確認します。
変更内容を永続的に保存するには、以下のいずれかのオプションを使用します。
-
File
メニューのSave Customization Only
を使用して、カスタマイズファイルを別途保存します。 File
メニューSave All
を選択して、すべてのセキュリティーコンテンツを一度に保存します。Into a directory
オプションを選択すると、SCAP Workbench
は、データストリームファイルおよびカスタマイズファイルの両方を、指定した場所に保存します。これはバックアップソリューションとして使用できます。As RPM
オプションを選択すると、SCAP Workbench
に、データストリームファイル、ならびにカスタマイズファイルを含む RPM パッケージの作成を指示できます。これは、リモートでスキャンできないシステムにセキュリティーコンテンツを配布したり、詳細な処理のためにコンテンツを配信するのに便利です。
-
SCAP Workbench
は、カスタマイズしたプロファイル向けの結果ベースの修正に対応していないため、oscap
コマンドラインユーティリティーでエクスポートした修正を使用します。
7.8.3. 関連情報
-
scap-workbench (8)
の man ページ -
scap-workbench
パッケージで提供される/usr/share/doc/scap-workbench/user_manual.html
ファイル - カスタマイズされた SCAP ポリシーを Satellite 6.x KCS でデプロイする 記事
7.9. インストール直後にセキュリティープロファイルに準拠するシステムのデプロイメント
OpenSCAP スイートを使用して、インストールプロセスの直後に、OSPP や PCI-DSS、HIPAA プロファイルなどのセキュリティープロファイルに準拠する RHEL システムをデプロイできます。このデプロイメント方法を使用すると、修正スクリプトを使用して後で適用できない特定のルール (パスワードの強度とパーティション化のルールなど) を適用できます。
7.9.1. GUI を備えたサーバーと互換性のないプロファイル
SCAP セキュリティーガイド の一部として提供される一部のセキュリティープロファイルは、Server with GUI ベースの環境の拡張パッケージセットと互換性がない場合があります。したがって、次のプロファイルのいずれかに準拠するシステムをインストールする場合は、Server with GUIを選択しないでください。
表7.2 GUI を備えたサーバーと互換性のないプロファイル
プロファイル名 | プロファイル ID | 理由 | 注記 |
---|---|---|---|
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
|
パッケージ | |
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
|
パッケージ | |
[ドラフト] DISA STIG for Red Hat Enterprise Linux 9 |
|
パッケージ | RHEL システムを DISA STIG に準拠したServer with GUI としてインストールするには、DISA STIG with GUI プロファイルを使用できます (BZ#1648162) |
7.9.2. グラフィカルインストールを使用したベースライン準拠の RHEL システムのデプロイメント
この手順を使用して、特定のベースラインに合わせた RHEL システムをデプロイします。この例では、OSPP (Protection Profile for General Purpose Operating System) を使用します。
SCAP セキュリティーガイド の一部として提供される一部のセキュリティープロファイルは、Server with GUI ベースの環境の拡張パッケージセットと互換性がない場合があります。詳細は、GUI サーバーと互換性のないプロファイル を参照してください。
前提条件
-
グラフィカル
インストールプログラムでシステムを起動している。OSCAP Anaconda アドオン はインタラクティブなテキストのみのインストールをサポートしていないことに注意してください。 -
インストール概要
画面を開いている。
手順
-
インストール概要
画面で、ソフトウェアの選択
をクリックします。ソフトウェアの選択
画面が開きます。 -
ベース環境
ペインで、サーバー
環境を選択します。ベース環境は、1 つだけ選択できます。 -
完了
をクリックして設定を適用し、インストール概要
画面に戻ります。 -
OSPP には、準拠する必要がある厳密なパーティション分割要件があるため、
/boot
、/home
、/var
、/tmp
、/var/log
、/var/tmp
、および/var/log/audit
にそれぞれパーティションを作成します。 -
セキュリティーポリシー
をクリックします。セキュリティーポリシー
画面が開きます。 -
システムでセキュリティーポリシーを有効にするには、
セキュリティーポリシーの適用
をON
に切り替えます。 -
プロファイルペインで
Protection Profile for General Purpose Operating Systems
プロファイルを選択します。 -
プロファイルの選択
をクリックして選択を確定します。 -
画面下部に表示される
Protection Profile for General Purpose Operating Systems
の変更を確定します。残りの手動変更を完了します。 グラフィカルインストールプロセスを完了します。
注記グラフィカルインストールプログラムは、インストールに成功すると、対応するキックスタートファイルを自動的に作成します。
/root/anaconda-ks.cfg
ファイルを使用して、OSPP 準拠のシステムを自動的にインストールできます。
検証
インストール完了後にシステムの現在のステータスを確認するには、システムを再起動して新しいスキャンを開始します。
# oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
関連情報
7.9.3. キックスタートを使用したベースライン準拠の RHEL システムのデプロイメント
この手順を使用して、特定のベースラインに合わせた RHEL システムをデプロイします。この例では、OSPP (Protection Profile for General Purpose Operating System) を使用します。
前提条件
-
RHEL 9 システムに、
scap-security-guide
パッケージがインストールされている。
手順
-
キックスタートファイル
/usr/share/scap-security-guide/kickstart/ssg-rhel9-ospp-ks.cfg
を、選択したエディターで開きます。 -
設定要件を満たすように、パーティション設定スキームを更新します。OSPP に準拠するには、
/boot
、/home
、/var
、/tmp
、/var/log
、/var/tmp
、および/var/log/audit
の個別のパーティションを保持する必要があります。パーティションのサイズのみ変更することができます。 - キックスタートインストールを開始する方法は、キックスタートインストールの開始を参照してください。
キックスタートファイルのパスワードでは、OSPP の要件が確認されていません。
検証
インストール完了後にシステムの現在のステータスを確認するには、システムを再起動して新しいスキャンを開始します。
# oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
7.10. コンテナーおよびコンテナーイメージの脆弱性スキャン
以下の手順を使用して、コンテナーまたはコンテナーイメージのセキュリティー脆弱性を検索します。
前提条件
-
openscap-utils
およびbzip2
パッケージがインストールされます。
手順
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL9/rhel-9.oval.xml.bz2 | bzip2 --decompress > rhel-9.oval.xml
コンテナーまたはコンテナーイメージの ID を取得します。以下に例を示します。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi9/ubi latest 096cae65a207 7 weeks ago 239 MB
コンテナーまたはコンテナーイメージで脆弱性をスキャンし、結果を vulnerability.html ファイルに保存します。
# oscap-podman 096cae65a207 oval eval --report vulnerability.html rhel-9.oval.xml
oscap-podman
コマンドには root 権限が必要で、コンテナーの ID は最初の引数であることに注意してください。
検証
結果をブラウザーで確認します。以下に例を示します。
$ firefox vulnerability.html &
関連情報
-
詳細は、
oscap-podman(8)
およびoscap(8)
の man ページを参照してください。
7.11. 特定のベースラインを使用したコンテナーまたはコンテナーイメージのセキュリティーコンプライアンスの評価
以下の手順に従い、OSPP (Operating System Protection Profile) や PCI-DSS (Payment Card Industry Data Security Standard)、Health Insurance Portability and Accountability Act (HIPAA) などの特定のセキュリティーベースラインのあるコンテナーまたはコンテナーイメージのコンプライアンスを評価します。
前提条件
-
openscap-utils
パッケージおよびscap-security-guide
パッケージがインストールされている。
手順
コンテナーまたはコンテナーイメージの ID を取得します。以下に例を示します。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi9/ubi latest 096cae65a207 7 weeks ago 239 MB
HIPAA プロファイルでコンテナーイメージのコンプライアンスを評価し、スキャン結果を report.html ファイルに保存します。
# oscap-podman 096cae65a207 xccdf eval --report report.html --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel9-ds.xml
OSPP または PCI-DSS ベースラインでセキュリティーコンプライアンスを評価する場合は、096cae65a207 をコンテナーイメージの ID に、hipaa の値を ospp または pci-dss に置き換えます。
oscap-podman
コマンドには、root 権限が必要なことに注意してください。
検証
結果をブラウザーで確認します。以下に例を示します。
$ firefox report.html &
notapplicable が付いているルールは、コンテナー化されたシステムには適用されないルールです。これらのルールは、ベアメタルおよび仮想化システムにのみ適用されます。
関連情報
-
oscap-podman(8)
およびscap-security-guide(8)
の man ページ。 -
/usr/share/doc/scap-security-guide/
ディレクトリー。
7.12. RHEL 9 で対応する SCAP セキュリティーガイドプロファイル
RHEL の特定のマイナーリリースで提供される SCAP コンテンツのみを使用します。これは、ハードニングに参加するコンポーネントが新機能で更新されるためです。SCAP コンテンツは、この更新を反映するように変更されますが、常に後方互換性があるわけではありません。
以下の表では、RHEL 9 で提供されるプロファイルと、プロファイルが適合するポリシーのバージョンを紹介しています。
表7.3 RHEL 9.2 で対応する SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Security of Information Systems (ANSSI) BP-028 Enhanced Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 High Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Intermediary Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Minimal Level |
| 1.2 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
| 1.0.0 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
| 1.0.0 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation |
| 1.0.0 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Workstation |
| 1.0.0 |
[ドラフト] Unclassified Information in Non-federal Information Systems and Organizations (NIST 800-171) |
| r2 |
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Health Insurance Portability and Accountability Act (HIPAA) |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official |
| バージョン付けなし |
Protection Profile for General Purpose Operating Systems |
| 4.2.1 |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 |
| 3.2.1 |
[ドラフト] DISA STIG for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
[ドラフト] DISA STIG with GUI for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
[a]
DISA は RHEL 9 の公式ベンチマークを公開していません。
|
表7.4 RHEL 9.1 で対応する SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Security of Information Systems (ANSSI) BP-028 Enhanced Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 High Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Intermediary Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Minimal Level |
| 1.2 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
|
RHEL 9.1.0 および RHEL 9.1.1: ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
|
RHEL 9.1.0 および RHEL 9.1.1: ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation |
|
RHEL 9.1.0 および RHEL 9.1.1: ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Workstation |
|
RHEL 9.1.0 および RHEL 9.1.1: ドラフト[a] |
[ドラフト] Unclassified Information in Non-federal Information Systems and Organizations (NIST 800-171) |
| r2 |
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Health Insurance Portability and Accountability Act (HIPAA) |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official |
| バージョン付けなし |
Protection Profile for General Purpose Operating Systems |
| 4.2.1 |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 |
| 3.2.1 |
[ドラフト] DISA STIG for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
[ドラフト] DISA STIG with GUI for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
[a]
CIS は RHEL 9 の公式ベンチマークを公開していません。
|
表7.5 RHEL 9.0 で対応する SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Security of Information Systems (ANSSI) BP-028 Enhanced Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 High Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Intermediary Level |
| 1.2 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Minimal Level |
| 1.2 |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
|
RHEL 9.0.0 〜 RHEL 9.0.6:ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
|
RHEL 9.0.0 〜 RHEL 9.0.6:ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation |
|
RHEL 9.0.0 〜 RHEL 9.0.6:ドラフト[a] |
CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Workstation |
|
RHEL 9.0.0 〜 RHEL 9.0.6:ドラフト[a] |
[ドラフト] Unclassified Information in Non-federal Information Systems and Organizations (NIST 800-171) |
| r2 |
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Health Insurance Portability and Accountability Act (HIPAA) |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official |
| バージョン付けなし |
Protection Profile for General Purpose Operating Systems |
|
RHEL 9.0.0 から RHEL 9.0.2: ドラフト |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 |
| 3.2.1 |
[ドラフト] DISA STIG for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
[ドラフト] DISA STIG with GUI for Red Hat Enterprise Linux 9 |
| ドラフト[a] |
7.13. 関連情報
- RHEL の SCAP セキュリティーガイドで対応しているバージョン
-
OpenSCAP プロジェクトページ では、
oscap
ユーティリティー、その他のコンポーネント、および SCAP に関連するプロジェクトに関する詳細情報を提供しています。 -
SCAP Workbench プロジェクトページ は、
scap-workbench
アプリケーションに関する詳細情報を提供します。 - SCAP Security Guide (SSG) プロジェクトページ は、Red Hat Enterprise Linux の最新のセキュリティーコンテンツを提供します。
- セキュリティーコンプライアンスと脆弱性スキャンに OpenSCAP を使用する: RHEL でのコンプライアンスと脆弱性スキャンのための Security Content Automation Protocol (SCAP) 標準に基づくツールの実行に関するハンズオンラボ。
- Red Hat Security Demos:Creating Customized Security Policy Content to Automate Security Compliance - RHEL に含まれるツールを使用してセキュリティーコンプライアンスを自動化し、業界標準のセキュリティーポリシーとカスタムセキュリティーポリシーの両方に準拠するためのハンズオンラボ。トレーニングや、このラボ演習へのアクセスを希望する場合は、Red Hat アカウントチームにお問い合わせください。
- Red Hat Security Demos:Defend Yourself with RHEL Security Technologies - OpenSCAP を含む RHEL で利用可能な主要なセキュリティー技術を使用して、RHEL システムの全レベルでセキュリティーを実装する方法を学ぶためのハンズオンラボ。トレーニングや、このラボ演習へのアクセスを希望する場合は、Red Hat アカウントチームにお問い合わせください。
- National Institute of Standards and Technology (NIST) SCAP のページ では、SCAP の出版物、仕様、SCAP 検出プログラムなどの SCAP 関連の資料が多数提供されます。
- National Vulnerability Database (NVD) は、SCAP コンテンツおよびその他の SCAP 標準ベースの脆弱性管理データに関する最大のリポジトリーです。
- Red Hat OVAL コンテンツリポジトリー には、RHEL システムの脆弱性に対する OVAL 定義が含まれています。このページは、脆弱性の情報を得るために確認が推奨されるページです。
- MITRE CVE - これは、MITRE corporation が提供する既知のセキュリティー脆弱性のデータベースです。RHEL の場合は、Red Hat が提供する OVAL CVE コンテンツを使用することが推奨されます。
- MITRE OVAL - このページでは、MITRE corporation が提供する OVAL 関連のプロジェクトが紹介されています。OVAL の関連情報、たとえば OVAL 言語、数千にもなる OVAL 定義が用意された OVAL コンテンツのリポジトリーがあります。RHEL のスキャンには、Red Hat が提供する OVAL CVE コンテンツを使用することが推奨されます。
- Red Hat Satellite における セキュリティーコンプライアンスの管理 - このガイドセットでは、OpenSCAP を使用して複数のシステムでシステムセキュリティーを維持する方法などが説明されています。
第8章 Keylime でシステムの整合性を確保する
Keylime を使用すると、起動時にシステムの状態を確認し、リモートシステムの整合性を継続的に監視できます。また、暗号化されたファイルを監視対象システムに送信し、監視対象システムが整合性テストに失敗するたびにトリガーされる自動アクションを指定することもできます。
8.1. Keylime の仕組み
Keylime の信頼の概念は、Trusted Platform Module (TPM) テクノロジーに基づいています。TPM は、暗号化キーが統合されたハードウェア、ファームウェア、または仮想コンポーネントです。TPM クォートをポーリングし、オブジェクトのハッシュを比較することで、Keylime はリモートシステムの初期監視と実行時監視を提供します。
Keylime は、次の 3 つの主要コンポーネントで設定されています。
- verifier は、エージェントを実行するシステムの整合性を最初から継続的に検証します。
- registrar は、すべてのエージェントのデータベースが含まれており、TPM ベンダーの公開キーをホストしています。
- agent は、verifier によって測定されるリモートシステムにデプロイメントされるコンポーネントです。
さらに、Keylime は、ターゲットシステムでのエージェントのプロビジョニングを含む多くの機能に keylime_tenant
ユーティリティーを使用します。
Keylime が監視対象システムで measured boot を実行するか、監視対象システムの runtime integrity monitoring を実行するか、またはその両方を実行するように、エージェントを設定できます。
図8.1 設定による Keylim コンポーネント間の接続

Keylime は、コンポーネントとテナントの間で交換される鍵と証明書を使用して、信頼の連鎖で監視対象システムの整合性を保証します。このチェーンの安全な基盤として、信頼できる認証局 (CA) を使用してください。
図8.2 Keylim コンポーネントの証明書と鍵の間の接続

エージェントがキーと証明書を受け取らない場合は、CA の関与なしにキーと自己署名証明書を生成します。
8.2. Keylim verifier と registrar の設定
verifier と registrar は、エージェントの監視に必要な 2 つのコンポーネントです。要件に応じて、単一のシステムまたは 2 つの別個のシステムにインストールできます。verifier と registrar を別々のシステムで実行すると、パフォーマンスが向上します。
信頼の連鎖を維持するには、verifier と registrar を実行するシステムを安全に管理してください。
- verifier は、Keylime で最も重要なコンポーネントです。システム整合性の初期および定期的なチェックを行い、エージェントを使用して暗号化キーを安全にブートストラップすることをサポートします。verifier は、その制御インターフェイスに相互 Transport Layer Security (TLS) を使用します。
- registrar は、TPM (trusted platform module) の公開キーを受け入れる HTTPS サービスです。次に、引用符をチェックするためにこれらの公開鍵を取得するためのインターフェイスを提示します。
設定ファイルをドロップインディレクトリー内に整理するには、/etc/keylime/verifier.conf.d/00-registrar-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
- Keylim コンポーネントをインストールするシステムに対する管理者権限
- システム間のネットワーク接続
Keylime が registrar と verifier からのデータを保存する 2 つのデータベースへのアクセス
次のデータベースのいずれかを使用できます。
- SQLite (デフォルト)
- PostgreSQL
- MySQL / MariaDB
- 認証局からの有効な鍵と証明書。
手順
必要な Keylim コンポーネントをインストールします。verifier と registrar は、要件に応じて、1 つのシステムまたは 2 つの別個のシステムにインストールできます。
Keylime のすべてのコンポーネントをインストールするには、以下を実行します。
# dnf install keylime
Keylime 検証ツールのみをインストールするには、以下を実行します。
# dnf install keylime-verifier
Keylime レジストラのみをインストールするには、以下を実行します。
# dnf install keylime-registrar
verifier と registrar を別々のシステムにインストールする場合は、verifier 設定で registrar の IP アドレスとポートを定義します。verifier がインストールされているシステムで、
/etc/keylime/verifier.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/verifier.conf.d/00-registrar-ip.conf
の内容は次のとおりです)。[verifier] registrar_ip = <registrar_IP_address>
-
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。 -
オプションで、
registrar_port = <registrar_port>
オプションを使用して、registrar のポートをデフォルト値の8891
から変更することもできます。
-
オプション:エージェントのリスト用に verifier のデータベースを設定します。デフォルトの設定では、verifier の
/var/lib/keylime/cv_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/verifier.conf.d/
ディレクトリーに新しい.conf
ファイルを作成することで、別のデータベースを定義できます (例:/etc/keylime/verifier.conf.d/00-db-ip.conf
の内容は次のとおりです)。[verifier] # Database URL Configuration database_url = <database_url>
<database_url>
をデータベースの URL に置き換えます。verifier に証明書とキーを追加します。verifier には、次のキーと証明書が必要です。
-
server_key
-
server_cert
-
client_key
-
client_cert
trusted_client_ca
- テナントクライアント CA 証明書へのパス
trusted_server_ca
- registrar サーバー CA 証明書へのパス
-
デフォルトの設定を使用して、キーと証明書を
/var/lib/keylime/cv_ca
ディレクトリーにロードできます。 または、設定でキーと証明書の場所を定義することもできます。
/etc/keylime/verifier.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します。たとえば、/etc/keylime/verifier.conf.d/00-keys-and-certs.conf
のように、次の内容で作成します。[verifier] tls_dir = default server_key = </path/to/server_key> server_key_password = <passphrase1> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>'] client_key = </path/to/client_key> client_key_password = <passphrase2> client_cert = </path/to/client_cert> trusted_server_ca = ['</path/to/ca/cert3>', '</path/to/ca/cert4>']
注記絶対パスを使用して、キーと証明書の場所を定義します。または、
tls_dir
オプションでディレクトリーを定義し、そのディレクトリーからの相対パスを使用することもできます。
-
オプション:エージェントのリスト用に registrar のデータベースを設定します。デフォルト設定では、registrar の
/var/lib/keylime/reg_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/registrar.conf.d/
ディレクトリーに新しい.conf
ファイルを作成できます (例:/etc/keylime/registrar.conf.d/00-db-ip.conf
の内容は次のとおりです)。[registrar] # Database URL Configuration database_url = <database_url>
<database_url>
をデータベースの URL に置き換えます。registrar に証明書とキーを追加します。registrar には、次のキーと証明書が必要です。
-
server_key
-
server_cert
trusted_client_ca
- verifier クライアント CA 証明書へのパス
- テナントクライアント CA 証明書へのパス
-
デフォルトの設定を使用して、キーと証明書を
/var/lib/keylime/reg_ca
ディレクトリーにロードできます。 または、設定でキーと証明書の場所を定義することもできます。
/etc/keylime/registrar.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/registrar.conf.d/00-keys-and-certs.conf
の内容は次のとおりです)。[registrar] tls_dir = default server_key = </path/to/server_key> server_key_password = <passphrase1> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']
注記絶対パスを使用して、キーと証明書の場所を定義します。または、
tls_dir
オプションでディレクトリーを定義し、そのディレクトリーからの相対パスを使用することもできます。
-
verifier サービスを開始します。
注記設定ファイルを正しい順序でロードできるように、registrar を開始する前に verifier を開始します。Keylime を停止する必要がある場合は、逆の順序でサービスを停止します。
$ systemctl start keylime_verifier
registrar サービスを開始します。
$ systemctl start keylime_registrar
検証
Keylime サービスのステータスを確認します。
$ systemctl status keylime_verifier ● keylime_verifier.service - The Keylime verifier Loaded: loaded (/usr/lib/systemd/system/keylime_verifier.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:08 EST; 1min 45s ago ... $ systemctl status keylime_registrar ● keylime_registrar.service - The Keylime registrar service Loaded: loaded (/usr/lib/systemd/system/keylime_registrar.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2022-11-09 10:10:17 EST; 1min 42s ago ...
verifier のステータスを確認します。
$ keylime_tenant -c cvstatus Reading configuration from ['/etc/keylime/logging.conf'] 2022-10-14 12:56:08.155 - keylime.tpm - INFO - TPM2-TOOLS Version: 5.2 Reading configuration from ['/etc/keylime/tenant.conf'] 2022-10-14 12:56:08.157 - keylime.tenant - INFO - Setting up client TLS... 2022-10-14 12:56:08.158 - keylime.tenant - INFO - Using default client_cert option for tenant 2022-10-14 12:56:08.158 - keylime.tenant - INFO - Using default client_key option for tenant 2022-10-14 12:56:08.178 - keylime.tenant - INFO - TLS is enabled. 2022-10-14 12:56:08.178 - keylime.tenant - WARNING - Using default UUID d432fbb3-d2f1-4a97-9ef7-75bd81c00000 2022-10-14 12:56:08.221 - keylime.tenant - INFO - Verifier at 127.0.0.1 with Port 8881 does not have agent d432fbb3-d2f1-4a97-9ef7-75bd81c00000.
正しくセットアップされていて、エージェントが設定されていない場合、verifier はエージェント UUID を認識しません。
registrar のステータスを確認します。
$ keylime_tenant -c regstatus Reading configuration from ['/etc/keylime/logging.conf'] 2022-10-14 12:56:02.114 - keylime.tpm - INFO - TPM2-TOOLS Version: 5.2 Reading configuration from ['/etc/keylime/tenant.conf'] 2022-10-14 12:56:02.116 - keylime.tenant - INFO - Setting up client TLS... 2022-10-14 12:56:02.116 - keylime.tenant - INFO - Using default client_cert option for tenant 2022-10-14 12:56:02.116 - keylime.tenant - INFO - Using default client_key option for tenant 2022-10-14 12:56:02.137 - keylime.tenant - INFO - TLS is enabled. 2022-10-14 12:56:02.137 - keylime.tenant - WARNING - Using default UUID d432fbb3-d2f1-4a97-9ef7-75bd81c00000 2022-10-14 12:56:02.171 - keylime.registrar_client - CRITICAL - Error: could not get agent d432fbb3-d2f1-4a97-9ef7-75bd81c00000 data from Registrar Server: 404 2022-10-14 12:56:02.172 - keylime.registrar_client - CRITICAL - Response code 404: agent d432fbb3-d2f1-4a97-9ef7-75bd81c00000 not found 2022-10-14 12:56:02.172 - keylime.tenant - INFO - Agent d432fbb3-d2f1-4a97-9ef7-75bd81c00000 does not exist on the registrar. Please register the agent with the registrar. 2022-10-14 12:56:02.172 - keylime.tenant - INFO - {"code": 404, "status": "Agent d432fbb3-d2f1-4a97-9ef7-75bd81c00000 does not exist on registrar 127.0.0.1 port 8891.", "results": {}}
正しくセットアップされていて、エージェントが設定されていない場合、registrar はエージェント UUID を認識しません。
次のステップ
Keylime verifier と registrar を設定して実行したら、監視対象システムに Keylime エージェントをデプロイして、次の機能のいずれかまたは両方を実行できます。
8.3. 測定されたブート設定証明のための Keylime のデプロイ
現在、Keylime は、Integrity Measurement Architecture (IMA) によって測定された複数のファイルにすばやく連続してアクセスするシステムの認証に失敗する可能性があります。詳細は、RHBZ#2138167 を参照してください。
測定されたブート設定証明の場合は、監視対象システムで Keylime エージェントが実行されている必要があります。keylime_tenant
ユーティリティーを使用して、Keylime エージェントをリモートでプロビジョニングできます。
エージェントをプロビジョニングするときに、Keylime が監視対象システムに送信するファイルを定義することもできます。Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。
特定のファイルまたは特定のディレクトリー内の変更を無視するには、Keylime 除外リストを設定します。
デフォルトでは、Keylime エージェントはすべてのデータを監視対象システムの /var/lib/keylime/
ディレクトリーに保存します。
設定ファイルをドロップインディレクトリー内で整理するには、/etc/keylime/agent.conf.d/00-registrar-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
- Keylime verifier と registrar へのネットワークアクセス。詳細は、「Keylim verifier と registrar の設定」 を参照してください。
- Keylim コンポーネントをインストールするシステムに対する管理者権限
システム上の TPM チップ
-
tpm2_pcrread
コマンドを入力して、システムに TPM があることを確認できます。このコマンドの出力に複数のハッシュが表示される場合は、TPM があります。
-
- エージェントシステムで有効になっている整合性測定アーキテクチャー (IMA)。詳細は、整合性測定アーキテクチャーと拡張検証モジュールの有効化 を参照してください。
手順
監視するシステムに Keylime エージェントをインストールします。
# dnf install keylime-agent
このコマンドは、
keylime-agent-rust
パッケージをインストールします。設定ファイルでレジストラの IP アドレスとポートを定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/agent.conf.d/00-registrar-ip.conf
の内容は次のとおりです)。[agent] registrar_ip = "<registrar_IP_address>"
-
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。 オプションで、
registrar_port = <registrar_port>
オプションを使用して、registrar のポートをデフォルト値の8890
から変更することもできます。注記Keylime エージェントの設定は、他のコンポーネントの設定に使用される INI 形式とは異なる TOML 形式を使用するため、IP アドレスは引用符で囲む必要があります。
-
オプション:エージェントの既存の鍵と証明書をロードします。エージェントが
server_key
とserver_cert
を受信しない場合、エージェントは独自のキーと自己署名証明書を生成します。エージェントは、次のキーと証明書を受け入れます。-
server_key
(オプション) -
server_cert
(オプション) trusted_client_ca
- verifier クライアント CA 証明書へのパス
- テナントクライアント CA 証明書へのパス
設定でキーと証明書の場所を定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/agent.conf.d/00-keys-and-certs.conf
は、次の内容を記述します)。[agent] server_key = </path/to/server_key> server_key_password = <passphrase1> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>'] enc_keyname = </path/to/derived_cti_key>
注記絶対パスを使用して、キーと証明書の場所を定義します。Keylim エージェントは相対パスを受け入れません。
-
システムの現在の状態の測定されたブートログからポリシーを生成します。
注意一部のシナリオでは、Keylime 測定ブートポリシー生成スクリプトがセグメンテーションエラーとコアダンプを引き起こす可能性があります。詳細は、RHBZ#2140670 を参照してください。
$ /usr/share/keylime/scripts/create_mb_refstate /sys/kernel/security/tpm0/binary_bios_measurements <./measured_boot_reference_state.json>
<./measured_boot_reference_state.json>
を、スクリプトが生成されたポリシーを保存するパスに置き換えます。重要create_mb_refstate
スクリプトで生成されるポリシーは、システムの現在の状態に基づいており、非常に厳格です。カーネルの更新やシステムの更新を含むシステムの変更は、ブートプロセスを変更し、システムは認証に失敗します。オプション:Keylime 測定から除外するファイルとディレクトリーのリストを定義するには、
<excludelist>
などの名前のファイルを作成し、除外するファイルとディレクトリーを入力します。除外リストは、Python の正規表現を受け入れます。詳細は、docs.python.org の正規表現の操作 を参照してください。たとえば、/tmp/
ディレクトリー内のすべてのファイルを除外するには、次のようにします。/tmp/.*
keylime_tenant
ユーティリティーを使用して新しいエージェントをプロビジョニングします。ネットワークに接続され、正しいキーと証明書が提供されている任意のシステムからエージェントをプロビジョニングできます。$ keylime_tenant -c add -t <agent.ip> -v <verifier.ip> -u <agent-uuid> --mb_refstate <./measured_boot_reference_state.json> --exclude <excludelist> -f <filetosend>
-
<agent.ip>
をエージェントの IP アドレスに置き換えます。 -
<verifier.ip>
を verifier の IP アドレスに置き換えます。 -
<agent-uuid>
をエージェントの UUID に置き換えます。 -
<./measured_boot_reference_state.json>
を、測定されたブートポリシーへのパスに置き換えます。 -
<excludelist>
を除外リストファイルへのパスに置き換えます。--exclude
オプションはオプションです。エージェントのプロビジョニングは、ファイルを配信しなくても機能します。 -
<filetosend>
を、エージェントに配信されるファイルへのパスに置き換えます。-f
オプションはオプションです。エージェントのプロビジョニングは、ファイルを配信しなくても機能します。
注記Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は
.zip
ファイルを解凍します。また、payload_script = "autorun.sh"
オプションを使用して、ファイルが復号化された後に実行するスクリプトを指定することもできます。例として、次のコマンドを使用すると、
keylime_tenant
は127.0.0.1
で UUIDd432fbb3-d2f1-4a97-9ef7-75bd81c00000
で新しい Keylime エージェントをプロビジョニングし、それを127.0.0.2
で verifier に接続します。また、payload1
という名前のファイルを暗号化し、エージェントに送信します。Keylime は、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ、ファイルを復号します。$ keylime_tenant -c add -t 127.0.0.1 -v 127.0.0.2 -u d432fbb3-d2f1-4a97-9ef7-75bd81c00000 -f payload1
-
keylime_agent
サービスを開始します。$ systemctl start keylime_agent
注記正しいキーと証明書を使用して、ネットワーク内の任意のシステムから次のコマンドを使用して、Keylime によるノードの監視を停止できます。
$ keylime_tenant -c delete -t <agent.ip> -u <agent.uuid>
検証
registrar に登録されているすべてのエージェントの UUID を一覧表示します。
$ keylime_tenant -c reglist -r <registrar_IP_address> -rp <registrar_port> 2022-10-07 13:52:54.388 - keylime.tenant - INFO - From registrar 127.0.0.1 port 8891 retrieved {"code": 200, "status": "Success", "results": {"uuids": ["d432fbb3-d2f1-4a97-9ef7-75bd81c00000"]}}
-
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。 -
オプションで、
registrar_port = <registrar_port>
オプションを使用して、registrar のポートをデフォルト値の8891
から変更することもできます。
注記エージェントを繰り返し一覧表示する必要がある場合は、
/etc/keylime/tenant.conf.d/
ディレクトリーの設定スニペットで registrar の IP アドレスとポートを定義できます。その後、-r
および-rp
オプションなしでコマンドを入力できます。-
verifier のステータスを確認します。
$ keylime_tenant -c cvstatus Reading configuration from ['/etc/keylime/logging.conf'] ... {"d432fbb3-d2f1-4a97-9ef7-75bd81c00000": {"operational_state": "Get Quote", "v": "rMUdRQtojhtoufQGLS5mur9yrH7ZDhivxAVihhMlLTc=", "ip": "127.0.0.1", "port": 9002, "tpm_policy": "{\"mask\": \"0x0\"}", "meta_data": "{\"cert_serial\": 2, \"subject\": \"OU=53,O=MITLL,L=Lexington,ST=MA,CN=d432fbb3-d2f1-4a97-9ef7-75bd81c00000,C=US\"}", "allowlist_len": 6, "mb_refstate_len": 0, "accept_tpm_hash_algs": ["sha512", "sha384", "sha256", "sha1"], "accept_tpm_encryption_algs": ["ecc", "rsa"], "accept_tpm_signing_algs": ["ecschnorr", "rsassa"], "hash_alg": "sha256", "enc_alg": "rsa", "sign_alg": "rsassa", "verifier_id": "default", "verifier_ip": "127.0.0.1", "verifier_port": 8881, "severity_level": null, "last_event_id": null, "attestation_count": 7, "last_received_quote": 1665753341}}
verifier と agent が正しく設定されている場合、出力には正しいエージェント UUID が表示され、その後に
{"operational_state":"Get Quote”
が表示されます。registrar のステータスを確認します。
$ keylime_tenant -c regstatus Reading configuration from ['/etc/keylime/logging.conf'] ... ==\n-----END CERTIFICATE-----\n", "ip": "127.0.0.1", "port": 9002, "regcount": 1, "operational_state": "Registered"}}}
registrar と agent が正しく設定されている場合、出力にはエージェントの IP アドレスとポートが表示され、その後に
"operational_state":"Registered"
が表示されます。
関連情報
-
keylime_tenant
ユーティリティーの追加の詳細オプションは、keylime_tenant -h
コマンドを入力します。
8.4. ランタイム監視のための Keylime のデプロイ
現在、Keylime は、Integrity Measurement Architecture (IMA) によって測定された複数のファイルにすばやく連続してアクセスするシステムの認証に失敗する可能性があります。詳細は、RHBZ#2138167 を参照してください。
監視対象システムの初期状態が正しいことを確認するには、監視対象システムで Keylime エージェントが実行している必要があり、Keylime に許可リストを提供する必要があります。新しいエージェントをプロビジョニングすると、Keylime は、システム上のファイルが許可リストで定義した状態に対応しているかどうかを確認し、ファイルを継続的に監視します。
最大限のセキュリティーを確保するには、完全に暗号化され、インターネットから永久に隔離されたエアギャップされたコンピューターで許可リストを作成します。許可リストを他のシステムに転送する際の改ざんを防ぐには、すべてのネットワークカードを無効にし、許可リストハッシュに署名します。
Keylime スクリプトを使用して initramfs
から許可リストを生成できますが、リモートで監視されているシステムで実行していアプリケーションファイルまたは管理スクリプトのハッシュを生成し、許可リストファイルに手動で入力することもできます。
Keylime ランタイムモニタリングは IMA (Integrity measurement architecture) を使用して多数のファイルを測定するため、システムのパフォーマンスに大きな影響を与える可能性があります。
エージェントをプロビジョニングするときに、Keylime が監視対象システムに送信するファイルを定義することもできます。Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。
特定のファイルまたは特定のディレクトリー内の変更を無視するには、Keylime 除外リストを設定します。
デフォルトでは、Keylime エージェントはすべてのデータを監視対象システムの /var/lib/keylime/
ディレクトリーに保存します。
設定ファイルをドロップインディレクトリー内で整理するには、/etc/keylime/agent.conf.d/00-registrar-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
- Keylime verifier と registrar へのネットワークアクセス。詳細は、「Keylim verifier と registrar の設定」 を参照してください。
- Keylim コンポーネントをインストールするシステムに対する管理者権限
システム上の TPM チップ
-
tpm2_pcrread
コマンドを入力して、システムに TPM があることを確認できます。このコマンドの出力に複数のハッシュが表示される場合は、TPM があります。
-
- エージェントシステムで有効になっている整合性測定アーキテクチャー (IMA)。詳細は、整合性測定アーキテクチャーと拡張検証モジュールの有効化 を参照してください。
手順
監視対象のシステムに Keylime エージェントをインストールします。
# dnf install keylime-agent
このコマンドは、
keylime-agent-rust
パッケージをインストールします。/etc/ima/ima-policy
ファイルに次の内容を入力して、新しい IMA ポリシーを作成します。# PROC_SUPER_MAGIC dont_measure fsmagic=0x9fa0 # SYSFS_MAGIC dont_measure fsmagic=0x62656572 # DEBUGFS_MAGIC dont_measure fsmagic=0x64626720 # TMPFS_MAGIC dont_measure fsmagic=0x01021994 # RAMFS_MAGIC dont_measure fsmagic=0x858458f6 # SECURITYFS_MAGIC dont_measure fsmagic=0x73636673 # SELINUX_MAGIC dont_measure fsmagic=0xf97cff8c # CGROUP_SUPER_MAGIC dont_measure fsmagic=0x27e0eb # OVERLAYFS_MAGIC dont_measure fsmagic=0x794c7630 # Don't measure log, audit or tmp files dont_measure obj_type=var_log_t dont_measure obj_type=auditd_log_t dont_measure obj_type=tmp_t # MEASUREMENTS measure func=BPRM_CHECK measure func=FILE_MMAP mask=MAY_EXEC measure func=MODULE_CHECK uid=0
デフォルトの IMA ポリシーを新しい IMA ポリシーに置き換えます。
# cat /etc/ima/ima-policy > /sys/kernel/security/ima/policy
- システムを再起動して、新しい IMA ポリシーを適用します。
システムの現在の状態から許可リストを生成します。
# /usr/share/keylime/scripts/create_allowlist.sh -o <allowlist.txt> -h sha256sum
<allowlist.txt>
を許可リストのファイル名に置き換えます。重要SHA-256 ハッシュ関数を使用します。SHA-1 は安全ではなく、RHEL 9 で廃止されました。追加情報は、SHA-1 deprecation in Red Hat Enterprise Linux 9 を参照してください。
設定ファイルでレジストラの IP アドレスとポートを定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/agent.conf.d/00-registrar-ip.conf
の内容は次のとおりです)。[agent] registrar_ip = "<registrar_IP_address>"
-
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。 オプションで、
registrar_port = <registrar_port>
オプションを使用して、registrar のポートをデフォルト値の8890
から変更することもできます。注記Keylime エージェントの設定は、他のコンポーネントの設定に使用される INI 形式とは異なる TOML 形式を使用するため、IP アドレスは引用符で囲む必要があります。
-
オプション:エージェントの既存の鍵と証明書をロードします。エージェントが
server_key
とserver_cert
を受信しない場合、エージェントは独自のキーと自己署名証明書を生成します。エージェントは、次のキーと証明書を受け入れます。-
server_key
(オプション) -
server_cert
(オプション) trusted_client_ca
- verifier クライアント CA 証明書へのパス
- テナントクライアント CA 証明書へのパス
設定でキーと証明書の場所を定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/agent.conf.d/00-keys-and-certs.conf
は、次の内容を記述します)。[agent] server_key = </path/to/server_key> server_key_password = <passphrase1> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>'] enc_keyname = </path/to/derived_cti_key>
注記絶対パスを使用して、キーと証明書の場所を定義します。Keylim エージェントは相対パスを受け入れません。
-
オプション:
<excludelist>
などの名前のファイルを作成し、除外するファイルとディレクトリーを入力することで、Keylime 測定から除外するファイルまたはディレクトリーのリストを定義できます。除外リストは、Python の正規表現を受け入れます。詳細は、docs.python.org の正規表現の操作 を参照してください。たとえば、/tmp/
ディレクトリー内のすべてのファイルを除外するには、次のように入力します。/tmp/.*
keylime_tenant
ユーティリティーを使用して新しいエージェントをプロビジョニングします。ネットワークに接続され、正しいキーと証明書が提供されている任意のシステムからエージェントをプロビジョニングできます。$ keylime_tenant -c add -t <agent.ip> -v _<verifier.ip> -u _<agent.uuid> --allowlist _<allowlist.txt> --exclude <excludelist> -f _<filetosend>
-
<agent.ip>
をエージェントの IP アドレスに置き換えます。 -
<verifier.ip>
を verifier の IP アドレスに置き換えます。 -
<agent.uuid>
をエージェントの UUID に置き換えます。 -
<allowlist.txt>
を許可リストファイルへのパスに置き換えます。 -
<excludelist>
を除外リストファイルへのパスに置き換えます。--exclude
オプションはオプションです。エージェントのプロビジョニングは、ファイルを配信しなくても機能します。 -
<filetosend>
を、エージェントに配信されるファイルへのパスに置き換えます。-f
オプションはオプションです。エージェントのプロビジョニングは、ファイルを配信しなくても機能します。
注記Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は
.zip
ファイルを解凍します。また、payload_script = "autorun.sh"
オプションを使用して、ファイルが復号化された後に実行するスクリプトを指定することもできます。例として、次のコマンドを使用すると、
keylime_tenant
は127.0.0.1
に UUIDd432fbb3-d2f1-4a97-9ef7-75bd81c00000
で新しい Keylime エージェントをプロビジョニングし、それを127.0.0.2
の verifier に接続して、allowlist1.txt
という名前の許可リストを読み込みます。また、payload1
という名前のファイルを暗号化し、エージェントに送信します。Keylime は、/etc/keylime/verifier.conf
で設定された TPM ポリシーが満たされている場合にのみ、ファイルを復号化します。$ keylime_tenant -c add -t 127.0.0.1 -v 127.0.0.2 -u d432fbb3-d2f1-4a97-9ef7-75bd81c00000 -f payload1 --allowlist allowlist1.txt
-
keylime_agent
サービスを開始します。$ systemctl start keylime_agent
注記正しいキーと証明書を使用して、ネットワーク内の任意のシステムから次のコマンドを使用して、Keylime によるノードの監視を停止できます。
$ keylime_tenant -c delete -t <agent.ip> -u <agent.uuid>
検証
たとえば、
bad-script.sh
という名前の新しいファイルを作成し、許可リストで許可されていないアクションを実行する次のコンテンツを挿入します。#!/bin/sh echo -e "Hello Evil!"
スクリプトを実行可能にします。
# chmod +x bad-script.sh
スクリプトの実行を試みます。許可リストが正しく設定されている場合は、このエージェントの Keylime 設定証明は失敗し、同様の出力が表示されます。
# ./bad-script.sh keylime.tpm - INFO - Checking IMA measurement list... keylime.ima - WARNING - File not found in allowlist: /root/bad-script.sh keylime.ima - ERROR - IMA ERRORS: template-hash 0 fnf 1 hash 0 good 781 keylime.cloudverifier - WARNING - agent D432FBB3-D2F1-4A97-9EF7-75BD81C00000 failed, stopping polling
関連情報
- IMA の詳細は、カーネル整合性サブシステムによるセキュリティーの強化 を参照してください。
第9章 AIDE で整合性の確認
AIDE
(Advanced Intrusion Detection Environment) は、システムのファイルのデータベースを作成し、そのデータベースを使用してファイルの整合性を確保し、システムの侵入を検出します。
9.1. AIDE のインストール
以下の手順は、AIDE
をインストールして、そのデータベースを開始するのに必要です。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
aide パッケージをインストールするには、次のコマンドを実行します。
# dnf install aide
初期データベースを生成するには、次のコマンドを実行します。
# aide --init
注記デフォルト設定では、
aide --init
コマンドは、/etc/aide.conf
ファイルで定義するディレクトリーとファイルのセットのみを確認します。ディレクトリーまたはファイルをAIDE
データベースに追加し、監視パラメーターを変更するには、/etc/aide.conf
を変更します。データベースの使用を開始するには、初期データベースのファイル名から末尾の
.new
を削除します。# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
-
AIDE
データベースの場所を変更するには、/etc/aide.conf
ファイルを編集して、DBDIR
値を変更します。追加のセキュリティーのデータベース、設定、/usr/sbin/aide
バイナリーファイルを、読み取り専用メディアなどの安全な場所に保存します。
9.2. AIDE
を使用した整合性チェックの実行
前提条件
-
AIDE
が適切にインストールされ、そのデータベースが初期化されている。AIDE のインストール を参照してください。
手順
手動でチェックを開始するには、以下を行います。
# aide --check Start timestamp: 2018-07-11 12:41:20 +0200 (AIDE 0.16) AIDE found differences between database and filesystem!! ... [trimmed for clarity]
最低でも、
AIDE
は週ごとに実行するようにシステムを設定します。最適な設定としては、AIDE
を毎日実行します。たとえば、AIDE
を毎日午前 04:05 に実行するようにスケジュールするには、cron
コマンドを使用して、次の行を/etc/crontab
ファイルを追加します。05 4 * * * root /usr/sbin/aide --check
9.3. AIDE データベースの更新
Red Hat は、システムの変更 (パッケージの更新、設定ファイルの修正など) を確認してから、基本となる AIDE
データベースを更新することを推奨します。
前提条件
-
AIDE
が適切にインストールされ、そのデータベースが初期化されている。AIDE のインストール を参照してください。
手順
基本となる AIDE データベースを更新します。
# aide --update
aide --update
コマンドは、/var/lib/aide/aide.db.new.gz
データベースファイルを作成します。-
整合性チェックで更新したデータベースを使用するには、ファイル名から末尾の
.new
を削除します。
9.4. ファイル整合性ツール:AIDE および IMA
Red Hat Enterprise Linux は、システム上のファイルとディレクトリーの整合性をチェックおよび保持するためのさまざまなツールを提供します。次の表は、シナリオに適したツールを決定するのに役立ちます。
表9.1 AIDE と IMA の比較
比較項目 | Advanced Intrusion Detection Environment (AIDE) | Integrity Measurement Architecture (IMA) |
---|---|---|
確認対象 | AIDE は、システム上のファイルとディレクトリーのデータベースを作成するユーティリティーです。このデータベースは、ファイルの整合性をチェックし、侵入を検出するのに役立ちます。 | IMA は、以前に保存された拡張属性と比較してファイル測定値 (ハッシュ値) をチェックすることにより、ファイルが変更されているかどうかを検出します。 |
確認方法 | AIDE はルールを使用して、ファイルとディレクトリーの整合性状態を比較します。 | IMA は、ファイルハッシュ値を使用して侵入を検出します。 |
理由 | 検出- AIDE は、ルールを検証することにより、ファイルが変更されているかどうかを検出します。 | 検出と防止- IMA は、ファイルの拡張属性を置き換えることにより、攻撃を検出および防止します。 |
使用方法 | AIDE は、ファイルまたはディレクトリーが変更されたときに脅威を検出します。 | 誰かがファイル全体の変更を試みた時に、IMA は脅威を検出します。 |
範囲 | AIDE は、ローカルシステム上のファイルとディレクトリーの整合性をチェックします。 | IMA は、ローカルシステムとリモートシステムのセキュリティーを確保します。 |
9.5. 関連情報
-
aide(1)
の man ページ - Kernel integrity subsystem
第10章 LUKS を使用したブロックデバイスの暗号化
ディスク暗号化を使用すると、ブロックデバイス上のデータを暗号化して保護できます。デバイスの復号化されたコンテンツにアクセスするには、認証としてパスフレーズまたは鍵を入力します。これは、デバイスがシステムから物理的に取り外された場合でも、デバイスのコンテンツを保護するのに役立つため、モバイルコンピューターやリムーバブルメディアにとって重要です。LUKS 形式は、Red Hat Enterprise Linux におけるブロックデバイスの暗号化のデフォルト実装です。
10.1. LUKS ディスクの暗号化
Linux Unified Key Setup-on-disk-format (LUKS) は、暗号化されたデバイスの管理を簡素化するツールセットを提供します。LUKS を使用すると、ブロックデバイスを暗号化し、複数のユーザーキーでマスターキーを復号化できるようになります。パーティションの一括暗号化には、このマスターキーを使用します。
Red Hat Enterprise Linux は、LUKS を使用してブロックデバイスの暗号化を実行します。デフォルトではインストール時に、ブロックデバイスを暗号化するオプションが指定されていません。ディスクを暗号化するオプションを選択すると、コンピューターを起動するたびにパスフレーズの入力が求められます。このパスフレーズは、パーティションを復号化するバルク暗号鍵のロックを解除します。デフォルトのパーティションテーブルを変更する場合は、暗号化するパーティションを選択できます。この設定は、パーティションテーブル設定で行われます。
- 暗号化
LUKS に使用されるデフォルトの暗号は
aes-xts-plain64
です。LUKS のデフォルトの鍵サイズは 512 ビットです。Anaconda XTS モードを使用した LUKS のデフォルトの鍵サイズは 512 ビットです。利用可能な暗号は次のとおりです。- 高度暗号化標準 (Advanced Encryption Standard, AES)
- Twofish
- Serpent
- LUKS は次の操作を実行します。
- LUKS は、ブロックデバイス全体を暗号化するため、脱着可能なストレージメディアやノート PC のディスクドライブといった、モバイルデバイスのコンテンツを保護するのに適しています。
- 暗号化されたブロックデバイスの基本的な内容は任意であり、スワップデバイスの暗号化に役立ちます。また、とりわけデータストレージ用にフォーマットしたブロックデバイスを使用する特定のデータベースに関しても有用です。
- LUKS は、既存のデバイスマッパーのカーネルサブシステムを使用します。
- LUKS はパスフレーズのセキュリティーを強化し、辞書攻撃から保護します。
- LUKS デバイスには複数のキースロットが含まれ、ユーザーはこれを使用してバックアップキーやパスフレーズを追加できます。
- LUKS は次のシナリオには推奨されません。
- LUKS などのディスク暗号化ソリューションは、システムの停止時にしかデータを保護しません。システムの電源がオンになり、LUKS がディスクを復号化すると、そのディスクのファイルは、そのファイルにアクセスできるすべてのユーザーが使用できます。
- 同じデバイスに対する個別のアクセスキーを複数のユーザーが持つ必要があるシナリオ。LUKS1 形式はキースロットを 8 個提供し、LUKS2 形式はキースロットを最大 32 個提供します。
- ファイルレベルの暗号化を必要とするアプリケーション。
10.2. RHEL の LUKS バージョン
Red Hat Enterprise Linux では、LUKS 暗号化のデフォルト形式は LUKS2 です。古い LUKS1 形式は引き続き完全にサポートされており、以前の Red Hat Enterprise Linux リリースと互換性のある形式で提供されます。LUKS2 再暗号化は、LUKS1 再暗号化と比較して、より堅牢で安全に使用できる形式と考えられています。
LUKS2 形式を使用すると、バイナリー構造を変更することなく、さまざまな部分を後に更新できます。LUKS2 は、内部的にメタデータに JSON テキスト形式を使用し、メタデータの冗長性を提供し、メタデータの破損を検出し、メタデータのコピーから自動的に修復します。
LUKS1 のみをサポートするシステムでは LUKS2 を使用しないでください。Red Hat Enterprise Linux 7 は、バージョン 7.6 以降、LUKS2 形式をサポートしています。
Red Hat Enterprise Linux 9.2 以降では、両方の LUKS バージョンで cryptsetup reencrypt
コマンドを使用してディスクを暗号化できます。
- オンラインの再暗号化
LUKS2 形式は、デバイスが使用中の間に、暗号化したデバイスの再暗号化に対応します。たとえば、以下のタスクを実行するにあたり、デバイスでファイルシステムをアンマウントする必要はありません。
- ボリュームキーの変更
暗号化アルゴリズムの変更
暗号化されていないデバイスを暗号化する場合は、ファイルシステムのマウントを解除する必要があります。暗号化の短い初期化後にファイルシステムを再マウントできます。
LUKS1 形式は、オンライン再暗号化に対応していません。
- 変換
特定の状況では、LUKS1 を LUKS2 に変換できます。具体的には、以下のシナリオでは変換ができません。
-
LUKS1 デバイスが、Policy-Based Decryption (PBD) Clevis ソリューションにより使用されているとマークされている。
cryptsetup
ツールは、luksmeta
メタデータが検出されると、そのデバイスを変換することを拒否します。 - デバイスがアクティブになっている。デバイスが非アクティブ状態でなければ、変換することはできません。
-
LUKS1 デバイスが、Policy-Based Decryption (PBD) Clevis ソリューションにより使用されているとマークされている。
10.3. LUKS2 再暗号化中のデータ保護のオプション
LUKS2 では、再暗号化プロセスで、パフォーマンスやデータ保護の優先度を設定する複数のオプションを選択できます。LUKS2 は、次のモードの resilience
オプションを備えています。cryptsetup reencrypt --resilience resilience-mode /dev/sdx
コマンドを使用すると、これらのモードのいずれかを選択できます。
checksum
デフォルトのモード。データ保護とパフォーマンスのバランスを取ります。
このモードでは、再暗号化領域内のセクターのチェックサムが個別に保存されます。チェックサムは、LUKS2 によって再暗号化されたセクターについて、復旧プロセスで検出できます。このモードでは、ブロックデバイスセクターの書き込みがアトミックである必要があります。
journal
- 最も安全なモードですが、最も遅いモードでもあります。このモードでは、再暗号化領域をバイナリー領域にジャーナル化するため、LUKS2 はデータを 2 回書き込みます。
none
-
none
モードではパフォーマンスが優先され、データ保護は提供されません。SIGTERM
シグナルやユーザーによる Ctrl+C キーの押下など、安全なプロセス終了からのみデータを保護します。予期しないシステム障害やアプリケーション障害が発生すると、データが破損する可能性があります。
LUKS2 の再暗号化プロセスが強制的に突然終了した場合、LUKS2 は以下のいずれかの方法で復旧を実行できます。
- 自動
次のいずれかのアクションを実行すると、次回の LUKS2 デバイスを開くアクション中に自動復旧アクションがトリガーされます。
-
cryptsetup open
コマンドを実行する。 -
systemd-cryptsetup
コマンドを使用してデバイスを接続する。
-
- 手動
-
LUKS2 デバイスで
cryptsetup repair /dev/sdx
コマンドを使用する。
関連情報
-
cryptsetup-reencrypt(8)
およびcryptsetup-repair(8)
man ページ
10.4. LUKS2 を使用したブロックデバイスの既存データの暗号化
LUKS2 形式を使用して、まだ暗号化されていないデバイスの既存のデータを暗号化できます。新しい LUKS ヘッダーは、デバイスのヘッドに保存されます。
前提条件
- ブロックデバイスにファイルシステムがある。
データのバックアップを作成している。
警告ハードウェア、カーネル、または人的ミスにより、暗号化プロセス時にデータが失われる場合があります。データの暗号化を開始する前に、信頼性の高いバックアップを作成してください。
手順
暗号化するデバイスにあるファイルシステムのマウントをすべて解除します。次に例を示します。
# umount /dev/mapper/vg00-lv00
LUKS ヘッダーを保存するための空き容量を確認します。シナリオに合わせて、次のいずれかのオプションを使用します。
論理ボリュームを暗号化する場合は、以下のように、ファイルシステムのサイズを変更せずに、論理ボリュームを拡張できます。以下はその例です。
# lvextend -L+32M /dev/mapper/vg00-lv00
-
parted
などのパーティション管理ツールを使用してパーティションを拡張します。 -
このデバイスのファイルシステムを縮小します。ext2、ext3、または ext4 のファイルシステムには
resize2fs
ユーティリティーを使用できます。XFS ファイルシステムは縮小できないことに注意してください。
暗号化を初期化します。
# cryptsetup reencrypt --encrypt --init-only --reduce-device-size 32M /dev/mapper/vg00-lv00 lv00_encrypted /dev/mapper/lv00_encrypted is now active and ready for online encryption.
デバイスをマウントします。
# mount /dev/mapper/lv00_encrypted /mnt/lv00_encrypted
永続的なマッピングのエントリーを
/etc/crypttab
ファイルに追加します。luksUUID
を見つけます。# cryptsetup luksUUID /dev/mapper/vg00-lv00 a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325
任意のテキストエディターで
/etc/crypttab
を開き、このファイルにデバイスを追加します。$ vi /etc/crypttab lv00_encrypted UUID=a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325 none
a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325 は、デバイスの
luksUUID
に置き換えます。dracut
で initramfs を更新します。$ dracut -f --regenerate-all
/etc/fstab
ファイルに永続的なマウントのエントリーを追加します。アクティブな LUKS ブロックデバイスのファイルシステムの UUID を見つけます。
$ blkid -p /dev/mapper/lv00_encrypted /dev/mapper/lv00-encrypted: UUID="37bc2492-d8fa-4969-9d9b-bb64d3685aa9" BLOCK_SIZE="4096" TYPE="xfs" USAGE="filesystem"
任意のテキストエディターで
/etc/fstab
を開き、このファイルにデバイスを追加します。次に例を示します。$ vi /etc/fstab UUID=37bc2492-d8fa-4969-9d9b-bb64d3685aa9 /home auto rw,user,auto 0
37bc2492-d8fa-4969-9d9b-bb64d3685aa9 は、ファイルシステムの UUID に置き換えます。
オンライン暗号化を再開します。
# cryptsetup reencrypt --resume-only /dev/mapper/vg00-lv00 Enter passphrase for /dev/mapper/vg00-lv00: Auto-detected active dm device 'lv00_encrypted' for data device /dev/mapper/vg00-lv00. Finished, time 00:31.130, 10272 MiB written, speed 330.0 MiB/s
検証
既存のデータが暗号化されているかどうかを確認します。
# cryptsetup luksDump /dev/mapper/vg00-lv00 LUKS header information Version: 2 Epoch: 4 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: a52e2cc9-a5be-47b8-a95d-6bdf4f2d9325 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 33554432 [bytes] length: (whole device) cipher: aes-xts-plain64 [...]
暗号化された空のブロックデバイスのステータスを表示します。
# cryptsetup status lv00_encrypted /dev/mapper/lv00_encrypted is active and is in use. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/mapper/vg00-lv00
関連情報
-
cryptsetup(8)
、cryptsetup-reencrypt(8)
、lvextend(8)
、resize2fs(8)
、およびparted(8)
man ページ
10.5. 独立したヘッダーがある LUKS2 を使用してブロックデバイスの既存データの暗号化
LUKS ヘッダーを保存するための空き領域を作成せずに、ブロックデバイスの既存のデータを暗号化できます。ヘッダーは、追加のセキュリティー層としても使用できる、独立した場所に保存されます。この手順では、LUKS2 暗号化形式を使用します。
前提条件
- ブロックデバイスにファイルシステムがある。
データのバックアップを作成している。
警告ハードウェア、カーネル、または人的ミスにより、暗号化プロセス時にデータが失われる場合があります。データの暗号化を開始する前に、信頼性の高いバックアップを作成してください。
手順
以下のように、そのデバイスのファイルシステムをすべてアンマウントします。
# umount /dev/nvme0n1p1
暗号化を初期化します。
# cryptsetup reencrypt --encrypt --init-only --header /home/header /dev/nvme0n1p1 nvme_encrypted WARNING! ======== Header file does not exist, do you want to create it? Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /home/header: Verify passphrase: /dev/mapper/nvme_encrypted is now active and ready for online encryption.
/home/header は、独立した LUKS ヘッダーを持つファイルへのパスに置き換えます。後で暗号化したデバイスのロックを解除するために、独立した LUKS ヘッダーにアクセスできる必要があります。
デバイスをマウントします。
# mount /dev/mapper/nvme_encrypted /mnt/nvme_encrypted
オンライン暗号化を再開します。
# cryptsetup reencrypt --resume-only --header /home/header /dev/nvme0n1p1 Enter passphrase for /dev/nvme0n1p1: Auto-detected active dm device 'nvme_encrypted' for data device /dev/nvme0n1p1. Finished, time 00m51s, 10 GiB written, speed 198.2 MiB/s
検証
独立したヘッダーがある LUKS2 を使用するブロックデバイスの既存のデータが暗号化されているかどうかを確認します。
# cryptsetup luksDump /home/header LUKS header information Version: 2 Epoch: 88 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: c4f5d274-f4c0-41e3-ac36-22a917ab0386 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 0 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] [...]
暗号化された空のブロックデバイスのステータスを表示します。
# cryptsetup status nvme_encrypted /dev/mapper/nvme_encrypted is active and is in use. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/nvme0n1p1
関連情報
-
cryptsetup(8)
およびcryptsetup-reencrypt(8)
man ページ
10.6. LUKS2 を使用した空のブロックデバイスの暗号化
LUKS2 形式を使用して、空のブロックデバイスを暗号化して、暗号化ストレージとして使用できます。
前提条件
-
空のブロックデバイス。
lsblk
などのコマンドを使用して、そのデバイス上に実際のデータ (ファイルシステムなど) がないかどうかを確認できます。
手順
暗号化した LUKS パーティションとしてパーティションを設定します。
# cryptsetup luksFormat /dev/nvme0n1p1 WARNING! ======== This will overwrite data on /dev/nvme0n1p1 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/nvme0n1p1: Verify passphrase:
暗号化した LUKS パーティションを開きます。
# cryptsetup open dev/nvme0n1p1 nvme0n1p1_encrypted Enter passphrase for /dev/nvme0n1p1:
これにより、パーティションのロックが解除され、デバイスマッパーを使用してパーティションが新しいデバイスにマッピングされます。暗号化されたデータを上書きしないように、このコマンドは、デバイスが暗号化されたデバイスであり、
/dev/mapper/device_mapped_name
パスを使用して LUKS を通じてアドレス指定されることをカーネルに警告します。暗号化されたデータをパーティションに書き込むためのファイルシステムを作成します。このパーティションには、デバイスマップ名を介してアクセスする必要があります。
# mkfs -t ext4 /dev/mapper/nvme0n1p1_encrypted
デバイスをマウントします。
# mount /dev/mapper/nvme0n1p1_encrypted mount-point
検証
空のブロックデバイスが暗号化されているかどうかを確認します。
# cryptsetup luksDump /dev/nvme0n1p1 LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: 34ce4870-ffdf-467c-9a9e-345a53ed8a25 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] [...]
暗号化された空のブロックデバイスのステータスを表示します。
# cryptsetup status nvme0n1p1_encrypted /dev/mapper/nvme0n1p1_encrypted is active and is in use. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/nvme0n1p1 sector size: 512 offset: 32768 sectors size: 20938752 sectors mode: read/write
関連情報
-
cryptsetup(8)
、cryptsetup-open (8)
、およびcryptsetup-lusFormat(8)
man ページ
10.7. storage
RHEL システムロールを使用した LUKS2 暗号化ボリュームの作成
storage
ロールを使用し、Ansible Playbook を実行して、LUKS で暗号化されたボリュームを作成および設定できます。
前提条件
-
crypto_policies
システムロールで設定するシステムである 1 つ以上の管理対象ノードへのアクセスとパーミッションがある。 - 管理対象ノードが記載されているインベントリーファイルがある。
-
コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
ansible-core
パッケージおよびrhel-system-roles
パッケージがコントロールノードにインストールされている。
RHEL 8.0-8.5 では、別の Ansible リポジトリーへのアクセス権を指定されており、Ansible をベースにする自動化用の Ansible Engine 2.9 が含まれています。Ansible Engine には、ansible
、ansible-playbook
などのコマンドラインユーティリティー、docker
や podman
などのコネクター、プラグインとモジュールが多く含まれています。Ansible Engine を入手してインストールする方法については、ナレッジベースの How to download and install Red Hat Ansible Engine を参照してください。
RHEL 8.6 および 9.0 では、Ansible Core (ansible-core
パッケージとして提供) が導入されました。これには、Ansible コマンドラインユーティリティー、コマンド、およびビルトイン Ansible プラグインのセットが含まれています。RHEL は、AppStream リポジトリーを介してこのパッケージを提供し、サポート範囲は限定的です。詳細については、ナレッジベースの Scope of support for the Ansible Core package included in the RHEL 9 and RHEL 8.6 and later AppStream repositories を参照してください。
手順
以下の内容を含む新しい
playbook.yml
ファイルを作成します。- hosts: all vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs fs_label: label-name mount_point: /mnt/data encryption: true encryption_password: your-password roles: - rhel-system-roles.storage
playbook.yml ファイルに、
encryption_key
、encryption_cipher
、encryption_key_size
、およびencryption_luks
バージョンなどの他の暗号化パラメーターを追加することもできます。オプション:Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory.file /path/to/file/playbook.yml
検証
暗号化ステータスを表示します。
# cryptsetup status sdb /dev/mapper/sdb is active and is in use. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/sdb [...]
作成された LUKS 暗号化ボリュームを確認します。
# cryptsetup luksDump /dev/sdb Version: 2 Epoch: 6 Metadata area: 16384 [bytes] Keyslots area: 33521664 [bytes] UUID: a4c6be82-7347-4a91-a8ad-9479b72c9426 Label: (no label) Subsystem: (no subsystem) Flags: allow-discards Data segments: 0: crypt offset: 33554432 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 4096 [bytes] [...]
storage
ロールがサポートするplaybook.yml
ファイル内のcryptsetup
パラメーターを表示します。# cat ~/playbook.yml - hosts: all vars: storage_volumes: - name: foo type: disk disks: - nvme0n1 fs_type: xfs fs_label: label-name mount_point: /mnt/data encryption: true #encryption_password: passwdpasswd encryption_key: /home/passwd_key encryption_cipher: aes-xts-plain64 encryption_key_size: 512 encryption_luks_version: luks2 roles: - rhel-system-roles.storage
関連情報
- LUKS を使用したブロックデバイスの暗号化
-
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
file
第11章 ポリシーベースの複号を使用して暗号化ボリュームの自動アンロックの設定
ポリシーベースの複号 (PBD) は、物理マシンおよび仮想マシンにおいて、ハードドライブで暗号化した root ボリュームおよびセカンダリーボリュームのロックを解除できるようにする一連の技術です。PBD は、ユーザーパスワード、TPM (Trusted Platform Module) デバイス、システムに接続する PKCS #11 デバイス (たとえばスマートカード) などのさまざまなロックの解除方法、もくしは特殊なネットワークサーバーを使用します。
PBD を使用すると、ポリシーにさまざまなロックの解除方法を組み合わせて、さまざまな方法で同じボリュームのロックを解除できるようにすることができます。RHEL における PBD の現在の実装は、Clevis フレームワークと、ピン と呼ばれるプラグインで構成されます。各ピンは、個別のアンロック機能を提供します。現在利用できるピンは以下のとおりです。
-
tang
- ネットワークサーバーを使用してボリュームのロックを解除できます -
tpm2
- TPM2 ポリシーを使用してボリュームのロックを解除できます -
sss
- Shamir's Secret Sharing (SSS) 暗号方式を使用して高可用性システムをデプロイできます
11.1. NBDE (Network-Bound Disk Encryption)
Network Bound Disc Encryption (NBDE) は、ポリシーベースの復号 (PBD) のサブカテゴリーであり、暗号化されたボリュームを特別なネットワークサーバーにバインドできるようにします。NBDE の現在の実装には、Tang サーバー自体と、Tang サーバー用の Clevis ピンが含まれます。
RHEL では、NBDE は次のコンポーネントとテクノロジーによって実装されます。
図11.1 LUKS1 で暗号化したボリュームを使用する場合の NBDE スキーム(luksmeta パッケージは、LUKS2 ボリュームには使用されません)

Tang は、ネットワークのプレゼンスにデータをバインドするためのサーバーです。セキュリティーが保護された特定のネットワークにシステムをバインドする際に利用可能なデータを含めるようにします。Tang はステートレスで、TLS または認証は必要ありません。エスクローベースのソリューション (サーバーが暗号鍵をすべて保存し、使用されたことがあるすべての鍵に関する知識を有する) とは異なり、Tang はクライアントの鍵と相互作用することはないため、クライアントから識別情報を得ることがありません。
Clevis は、自動化された復号用のプラグイン可能なフレームワークです。NBDE では、Clevis は、LUKS ボリュームの自動アンロックを提供します。clevis
パッケージは、クライアントで使用される機能を提供します。
Clevis ピン は、Clevis フレームワークへのプラグインです。このようなピンの 1 つは、NBDE サーバー (Tang) との相互作用を実装するプラグインです。
Clevis および Tang は、一般的なクライアントおよびサーバーのコンポーネントで、ネットワークがバインドされた暗号化を提供します。RHEL では、LUKS と組み合わせて使用され、ルートおよび非ルートストレージボリュームを暗号化および復号して、ネットワークにバインドされたディスク暗号化を実現します。
クライアントおよびサーバーのコンポーネントはともに José ライブラリーを使用して、暗号化および複号の操作を実行します。
NBDE のプロビジョニングを開始すると、Tang サーバーの Clevis ピンは、Tang サーバーの、アドバタイズされている非対称鍵の一覧を取得します。もしくは、鍵が非対称であるため、Tang の公開鍵の一覧を帯域外に配布して、クライアントが Tang サーバーにアクセスしなくても動作できるようにします。このモードは オフラインプロビジョニング と呼ばれます。
Tang 用の Clevis ピンは、公開鍵のいずれかを使用して、固有で、暗号論的に強力な暗号鍵を生成します。この鍵を使用してデータを暗号化すると、この鍵は破棄されます。Clevis クライアントは、使いやすい場所に、このプロビジョニング操作で生成した状態を保存する必要があります。データを暗号化するこのプロセスは プロビジョニング手順 と呼ばれています。
LUKS バージョン 2 (LUKS2) は、RHEL のデフォルトのディスク暗号化形式であるため、NBDE のプロビジョニング状態は、LUKS2 ヘッダーにトークンとして保存されます。luksmeta
パッケージによる NBDE のプロビジョニング状態は、LUKS1 で暗号化したボリュームにのみ使用されます。
Tang 用の Clevis ピンは、規格を必要とせずに LUKS1 と LUKS2 の両方をサポートします。Clevis はプレーンテキストファイルを暗号化できますが、ブロックデバイスの暗号化には cryptsetup
ツールを使用する必要があります。詳細については、 Encrypting block devices using LUKS を参照してください。
クライアントがそのデータにアクセスする準備ができると、プロビジョニング手順で生成したメタデータを読み込み、応答して暗号鍵を戻します。このプロセスは 復旧手順 と呼ばれます。
Clevis は、NBDE ではピンを使用して LUKS ボリュームをバインドしているため、自動的にロックが解除されます。バインドプロセスが正常に終了すると、提供されている Dracut アンロックを使用してディスクをアンロックできます。
kdump
カーネルクラッシュのダンプメカニズムが、システムメモリーのコンテンツを LUKS で暗号化したデバイスに保存するように設定されている場合には、2 番目のカーネル起動時にパスワードを入力するように求められます。
関連情報
- NBDE (Network-Bound Disk Encryption) テクノロジーの ナレッジベース記事
-
tang(8)
、clevis(1)
、jose(1)
およびclevis-luks-unlockers(7)
の man ページ - ナレッジベースの記事 How to set up Network-Bound Disk Encryption with multiple LUKS devices(Clevis + Tang unlocking)
11.2. 暗号化クライアント (Clevis) のインストール
この手順に従って、システムに Clevis プラグ可能フレームワークを使用してデプロイと起動を行います。
手順
暗号化されたボリュームを持つシステムに Clevis とそのピンをインストールするには、次のコマンドを実行します。
# dnf install clevis
データを複号するには、
clevis decrypt
コマンドを実行して、JWE (JSON Web Encryption) 形式で暗号文を指定します。以下に例を示します。$ clevis decrypt < secret.jwe
関連情報
-
clevis(1)
の man ページ 引数を指定せずに
clevis
コマンドを実行した後の組み込み CLI ヘルプ$ clevis Usage: clevis COMMAND [OPTIONS] clevis decrypt Decrypts using the policy defined at encryption time clevis encrypt sss Encrypts using a Shamir's Secret Sharing policy clevis encrypt tang Encrypts using a Tang binding server policy clevis encrypt tpm2 Encrypts using a TPM2.0 chip binding policy clevis luks bind Binds a LUKS device using the specified policy clevis luks edit Edit a binding from a clevis-bound slot in a LUKS device clevis luks list Lists pins bound to a LUKSv1 or LUKSv2 device clevis luks pass Returns the LUKS passphrase used for binding a particular slot. clevis luks regen Regenerate clevis binding clevis luks report Report tang keys' rotations clevis luks unbind Unbinds a pin bound to a LUKS volume clevis luks unlock Unlocks a LUKS volume
11.3. SELinux を Enforcing モードで有効にした Tang サーバーのデプロイメント
この手順では、Enforcing モードの SELinux で限定サービスとして、カスタムポートで実行する Tang サーバーをデプロイします。
前提条件
-
policycoreutils-python-utils
パッケージおよび依存関係がインストールされている。 -
firewalld
サービスが実行している。
手順
tang
パッケージとその依存関係をインストールするには、root
で以下のコマンドを実行します。# dnf install tang
7500/tcp などの不要なポートを選択し、
tangd
サービスがそのポートにバインドできるようにします。# semanage port -a -t tangd_port_t -p tcp 7500
ポートは 1 つのサービスのみで一度に使用できるため、すでに使用しているポートを使用しようとすると、
ValueError:Port already defined
エラーが発生します。ファイアウォールのポートを開きます。
# firewall-cmd --add-port=7500/tcp # firewall-cmd --runtime-to-permanent
tangd
サービスを有効にします。# systemctl enable tangd.socket
オーバーライドファイルを作成します。
# systemctl edit tangd.socket
以下のエディター画面で、
/etc/systemd/system/tangd.socket.d/
ディレクトリーにある空のoverride.conf
ファイルを開き、次の行を追加して、Tang サーバーのデフォルトのポートを、80 から、以前取得した番号に変更します。[Socket] ListenStream= ListenStream=7500
ファイルを保存して、エディターを終了します。
変更した設定を再読み込みします。
# systemctl daemon-reload
設定が機能していることを確認します。
# systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)
tangd
サービスを開始します。# systemctl restart tangd.socket
tangd
が、systemd
のソケットアクティベーションメカニズムを使用しているため、最初に接続するとすぐにサーバーが起動します。最初の起動時に、一組の暗号鍵が自動的に生成されます。鍵の手動生成などの暗号化操作を実行するには、jose
ユーティリティーを使用します。
関連情報
-
tang(8)
、semanage(8)
、firewall-cmd(1)
、jose(1)
、systemd.unit(5)
およびsystemd.socket(5)
の man ページ
11.4. Tang サーバーの鍵のローテーションおよびクライアントでのバインディングの更新
以下の手順に従って、Tang サーバーの鍵をローテーションし、クライアントの既存のバインディングを更新します。鍵をローテートするのに適した間隔は、アプリケーション、鍵のサイズ、および組織のポリシーにより異なります。
したがって、nbde_server
RHEL システムロールを使用して、Tang 鍵をローテーションできます。詳細は 複数の Tang サーバー設定での nbde_server システムロールの使用 を参照してください。
前提条件
- Tang サーバーが実行している。
-
clevis
パッケージおよびclevis-luks
パッケージがクライアントにインストールされている。
手順
/var/db/tang
鍵データベースディレクトリーのすべての鍵の名前の前に.
を指定して、アドバタイズメントに対して非表示にします。以下の例のファイル名は、Tang サーバーの鍵データベースディレクトリーにある一意のファイル名とは異なります。# cd /var/db/tang # ls -l -rw-r--r--. 1 root root 349 Feb 7 14:55 UV6dqXSwe1bRKG3KbJmdiR020hY.jwk -rw-r--r--. 1 root root 354 Feb 7 14:55 y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk # mv UV6dqXSwe1bRKG3KbJmdiR020hY.jwk .UV6dqXSwe1bRKG3KbJmdiR020hY.jwk # mv y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk .y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
名前が変更され、Tang サーバーのアドバタイズに対してすべての鍵が非表示になっていることを確認します。
# ls -l total 0
Tang サーバーの
/var/db/tang
で/usr/libexec/tangd-keygen
コマンドを使用して新しい鍵を生成します。# /usr/libexec/tangd-keygen /var/db/tang # ls /var/db/tang 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwk
Tang サーバーが、以下のように新規キーペアから署名キーを公開していることを確認します。
# tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54
NBDE クライアントで
clevis luks report
コマンドを使用して、Tang サーバーでアドバタイズされた鍵が同じままかどうかを確認します。clevis luks list
コマンドを使用すると、関連するバインディングのあるスロットを特定できます。以下に例を示します。# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv"}' # clevis luks report -d /dev/sda2 -s 1 ... Report detected that some keys were rotated. Do you want to regenerate luks metadata with "clevis luks regen -d /dev/sda2 -s 1"? [ynYN]
新しい鍵の LUKS メタデータを再生成するには、直前のコマンドプロンプトで
y
を押すか、clevis luks regen
コマンドを使用します。# clevis luks regen -d /dev/sda2 -s 1
すべての古いクライアントが新しい鍵を使用することを確認したら、Tang サーバーから古い鍵を削除できます。次に例を示します。
# cd /var/db/tang # rm .*.jwk
クライアントが使用している最中に古い鍵を削除すると、データが失われる場合があります。このような鍵を誤って削除した場合は、クライアントで clevis luks regen
コマンドを実行し、LUKS パスワードを手動で提供します。
関連情報
-
tang-show-keys(1)
、clevis-luks-list(1)
、clevis-luks-report(1)
、およびclevis-luks-regen(1)
の man ページ
11.5. Web コンソールで Tang 鍵を使用した自動アンロックの設定
Tang サーバーが提供する鍵を使用して、LUKS で暗号化したストレージデバイスの自動ロック解除を設定します。
前提条件
RHEL 9 Web コンソールがインストールされている。
詳細は、Web コンソールのインストール を参照してください。
-
cockpit-storaged
パッケージがシステムにインストールされている。 -
cockpit.socket
サービスがポート 9090 で実行されている。 -
clevis
パッケージ、tang
パッケージ、およびclevis-dracut
パッケージがインストールされている。 - Tang サーバーが実行している。
手順
Web ブラウザーに以下のアドレスを入力して、RHEL Web コンソールを開きます。
https://localhost:9090
リモートシステムに接続する際に、localhost の部分をリモートサーバーのホスト名または IP アドレスに置き換えます。
- 認証情報を指定して、ストレージ をクリックします。> をクリックして、Tang サーバーを使用してロックを解除する暗号化されたデバイスの詳細を展開し、Encryption をクリックします。
Keys セクションの + をクリックして Tang キーを追加します。
Tang サーバーのアドレスと、LUKS で暗号化したデバイスのロックを解除するパスワードを指定します。Add をクリックして確定します。
以下のダイアログウインドウは、鍵ハッシュが一致することを確認するコマンドを提供します。
Tang サーバーのターミナルで、
tang-show-keys
コマンドを使用して、比較のためにキーハッシュを表示します。この例では、Tang サーバーはポート 7500 で実行されています。# tang-show-keys 7500 fM-EwYeiTxS66X3s1UAywsGKGnxnpll8ig0KOQmr9CM
Web コンソールと前述のコマンドの出力のキーハッシュが同じ場合は、Trust key をクリックします。
初期ブートシステムでディスクバインディングを処理できるようにするには、左側のナビゲーションバーの下部にある Terminal をクリックし、次のコマンドを入力します。
# dnf install clevis-dracut # grubby --update-kernel=ALL --args="rd.neednet=1" # dracut -fv --regenerate-all
検証
新規に追加された Tang キーが
Keyserver
タイプの Keys セクションに一覧表示されていることを確認します。バインディングが初期ブートで使用できることを確認します。次に例を示します。
# lsinitrd | grep clevis clevis clevis-pin-sss clevis-pin-tang clevis-pin-tpm2 -rwxr-xr-x 1 root root 1600 Feb 11 16:30 usr/bin/clevis -rwxr-xr-x 1 root root 1654 Feb 11 16:30 usr/bin/clevis-decrypt ... -rwxr-xr-x 2 root root 45 Feb 11 16:30 usr/lib/dracut/hooks/initqueue/settled/60-clevis-hook.sh -rwxr-xr-x 1 root root 2257 Feb 11 16:30 usr/libexec/clevis-luks-askpass
関連情報
11.6. 基本的な NBDE および TPM2 暗号化クライアント操作
Clevis フレームワークは、プレーンテキストファイルを暗号化し、JSON Web Encryption (JWE) 形式の暗号化テキストと LUKS 暗号化ブロックデバイスの両方を復号できます。Clevis クライアントは、暗号化操作に Tang ネットワークサーバーまたは Trusted Platform Module 2.0(TPM 2.0) チップのいずれかを使用できます。
次のコマンドは、プレーンテキストファイルが含まれる例で Clevis が提供する基本的な機能を示しています。また、NBDE または Clevis + TPM のデプロイメントのトラブルシューティングにも使用できます。
Tang サーバーにバインドされた暗号化クライアント
Clevis 暗号化クライアントが Tang サーバーにバインドサれることを確認するには、
clevis encrypt tang
サブコマンドを使用します。$ clevis encrypt tang '{"url":"http://tang.srv:port"}' < input-plain.txt > secret.jwe The advertisement contains the following signing keys: _OsIk0T-E2l6qjfdDiwVmidoZjA Do you wish to trust these keys? [ynYN] y
この例の URL (http://tang.srv:port) を、
tang
がインストールされているサーバーの URL に変更します。secret.jwe 出力ファイルには、JWE 形式で暗号化した暗号文が含まれます。この暗号文は input-plain.txt 入力ファイルから読み込まれます。また、設定に SSH アクセスなしで Tang サーバーとの非対話型の通信が必要な場合は、アドバタイズメントをダウンロードしてファイルに保存できます。
$ curl -sfg http://tang.srv:port/adv -o adv.jws
ファイルやメッセージの暗号化など、次のタスクには adv.jws ファイルのアドバタイズメントを使用します。
$ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
データを複号するには、
clevis decrypt
コマンドを実行して、暗号文 (JWE) を提供します。$ clevis decrypt < secret.jwe > output-plain.txt
TPM2.0 を使用する暗号化クライアント
TPM 2.0 チップを使用して暗号化するには、JSON 設定オブジェクト形式の引数のみが使用されている
clevis encrypt tpm2
サブコマンドを使用します。$ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe
別の階層、ハッシュ、および鍵アルゴリズムを選択するには、以下のように、設定プロパティーを指定します。
$ clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jwe
データを復号するには、JSON Web Encryption (JWE) 形式の暗号文を提供します。
$ clevis decrypt < secret.jwe > output-plain.txt
ピンは、PCR (Platform Configuration Registers) 状態へのデータのシーリングにも対応します。このように、PCP ハッシュ値が、シーリング時に使用したポリシーと一致する場合にのみ、データのシーリングを解除できます。
たとえば、SHA-256 バンクに対して、インデックス 0 および 7 の PCR にデータをシールするには、以下を行います。
$ clevis encrypt tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,7"}' < input-plain.txt > secret.jwe
PCR のハッシュは書き換えることができ、暗号化されたボリュームのロックを解除することはできなくなりました。このため、PCR の値が変更された場合でも、暗号化されたボリュームのロックを手動で解除できる強力なパスフレーズを追加します。
shim-x64
パッケージのアップグレード後にシステムが暗号化されたボリュームのロックを自動的に解除できない場合は、KCS の記事Clevis TPM2 no longer decrypts LUKS devices after a restartの手順に従ってください。
関連情報
-
clevis-encrypt-tang(1)
、clevis-luks-unlockers(7)
、clevis(1)
、およびclevis-encrypt-tpm2(1)
の man ページ 以下のように引数指定せずに
clevis
、clevis decrypt
およびclevis encrypt tang
コマンドを入力したときに表示される組み込み CLI。$ clevis encrypt tang Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE ...
11.7. LUKS で暗号化したボリュームの手動登録の設定
以下の手順に従って、NBDE を使用して LUKS で暗号化されたボリュームのロック解除を設定します。
前提条件
- Tang サーバーが実行されていて、使用できるようにしてある。
手順
LUKS で暗号化した既存のボリュームを自動的にアンロックするには、サブパッケージの
clevis-luks
をインストールします。# dnf install clevis-luks
PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 12G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 11G 0 part └─luks-40e20552-2ade-4954-9d56-565aa7994fb6 253:0 0 11G 0 crypt ├─rhel-root 253:0 0 9.8G 0 lvm / └─rhel-swap 253:1 0 1.2G 0 lvm [SWAP]
clevis luks bind
コマンドを使用して、ボリュームを Tang サーバーにバインドします。# clevis luks bind -d /dev/sda2 tang '{"url":"http://tang.srv"}' The advertisement contains the following signing keys: _OsIk0T-E2l6qjfdDiwVmidoZjA Do you wish to trust these keys? [ynYN] y You are about to initialize a LUKS device for metadata storage. Attempting to initialize it may result in data loss if data was already written into the LUKS header gap in a different format. A backup is advised before initialization is performed. Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:
このコマンドは、以下の 4 つの手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
- LUKS を使用する新しい鍵を有効にします。
注記バインド手順では、空き LUKS パスワードスロットが少なくとも 1 つあることが前提となっています。そのスロットの 1 つを
clevis luks bind
コマンドが使用します。ボリュームは、現在、既存のパスワードと Clevis ポリシーを使用してロックを解除できます。
システムの起動プロセスの初期段階でディスクバインディングを処理するようにするには、インストール済みのシステムで
dracut
ツールを使用します。# dnf install clevis-dracut
RHEL 8 では、Clevis はホスト固有の設定オプションを指定せずに汎用
initrd
(initial ramdisk) を生成し、カーネルコマンドラインにrd.neednet=1
などのパラメーターを自動的に追加しません。初期の起動時にネットワークを必要とする Tang ピンを使用する場合は、--hostonly-cmdline
引数を使用し、dracut
が Tang バインディングを検出するとrd.neednet=1
を追加します。# dracut -fv --regenerate-all --hostonly-cmdline
または、
/etc/dracut.conf.d/
に .conf ファイルを作成し、以下のようにhostonly_cmdline=yes
オプションを追加します。# echo "hostonly_cmdline=yes" > /etc/dracut.conf.d/clevis.conf
注記Clevis がインストールされているシステムで
grubby
ツールを使用して、システム起動時の早い段階で Tang ピンのネットワークを利用できるようにすることができます。# grubby --update-kernel=ALL --args="rd.neednet=1"
次に、
--hostonly-cmdline
なしでdracut
を使用できます。# dracut -fv --regenerate-all
検証
Clevis JWE オブジェクトが LUKS ヘッダーに適切に置かれていることを確認するには、
clevis luks list
コマンドを使用します。# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv:port"}'
(DHCP を使用しない) 静的な IP 設定を持つクライアントに NBDE を使用するには、以下のように、手動でネットワーク設定を dracut
ツールに渡します。
# dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none"
もしくは、静的ネットワーク情報を使用して /etc/dracut.conf.d/
ディレクトリーに .conf ファイルを作成します。以下に例を示します。
# cat /etc/dracut.conf.d/static_ip.conf
kernel_cmdline="ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none"
初期 RAM ディスクイメージを再生成します。
# dracut -fv --regenerate-all
関連情報
-
clevis-luks-bind(1)
およびdracut.cmdline(7)
の man ページ。 - ネットワーク設定用キックスタートコマンド
11.8. TPM2.0 ポリシーを使用した LUKS で暗号化したボリュームの手動登録の設定
次の手順を使用して、Trusted Platform Module 2.0 (TPM 2.0) ポリシーを使用して LUKS 暗号化ボリュームのロック解除を設定します。
前提条件
- アクセス可能な TPM2.0 互換デバイス。
- システムが 64 ビット Intel アーキテクチャー、または 64 ビット AMD アーキテクチャーである。
手順
LUKS で暗号化した既存のボリュームを自動的にアンロックするには、サブパッケージの
clevis-luks
をインストールします。# dnf install clevis-luks
PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 12G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 11G 0 part └─luks-40e20552-2ade-4954-9d56-565aa7994fb6 253:0 0 11G 0 crypt ├─rhel-root 253:0 0 9.8G 0 lvm / └─rhel-swap 253:1 0 1.2G 0 lvm [SWAP]
clevis luks bind
コマンドを使用して、ボリュームを TPM 2.0 デバイスにバインドします。以下に例を示します。# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa"}' ... Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:
このコマンドは、以下の 4 つの手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
LUKS を使用する新しい鍵を有効にします。
注記バインド手順では、空き LUKS パスワードスロットが少なくとも 1 つあることが前提となっています。そのスロットの 1 つを
clevis luks bind
コマンドが使用します。あるいは、特定の Platform Configuration Registers (PCR) の状態にデータをシールする場合は、
clevis luks bind
コマンドにpcr_bank
とpcr_ids
値を追加します。以下に例を示します。# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1"}'
警告PCR ハッシュ値がシール時に使用されるポリシーと一致し、ハッシュを書き換えることができる場合にのみ、データをアンシールできるため、PCR の値が変更された場合、暗号化されたボリュームのロックを手動で解除できる強力なパスフレーズを追加します。
shim-x64
パッケージのアップグレード後にシステムが暗号化されたボリュームのロックを自動的に解除できない場合は、KCS の記事Clevis TPM2 no longer decrypts LUKS devices after a restartの手順に従ってください。
- ボリュームは、現在、既存のパスワードと Clevis ポリシーを使用してロックを解除できます。
システムの起動プロセスの初期段階でディスクバインディングを処理するようにするには、インストール済みのシステムで
dracut
ツールを使用します。# dnf install clevis-dracut # dracut -fv --regenerate-all
検証
Clevis JWE オブジェクトが LUKS ヘッダーに適切に置かれていることを確認するには、
clevis luks list
コマンドを使用します。# clevis luks list -d /dev/sda2 1: tpm2 '{"hash":"sha256","key":"rsa"}'
関連情報
-
clevis-luks-bind(1)
、clevis-encrypt-tpm2(1)
、およびdracut.cmdline(7)
の man ページ
11.9. LUKS で暗号化したボリュームからの Clevis ピンの手動削除
clevis luks bind
コマンドで作成されたメタデータを手動で削除する場合や、Clevis が追加したパスフレーズを含む鍵スロットを一掃するには、以下の手順を行います。
LUKS で暗号化したボリュームから Clevis ピンを削除する場合は、clevis luks unbind
コマンドを使用することが推奨されます。clevis luks unbind
を使用した削除手順は、1 回のステップで設定され、LUKS1 ボリュームおよび LUKS2 ボリュームの両方で機能します。以下のコマンド例は、バインディング手順で作成されたメタデータを削除し、/dev/sda2 デバイスの鍵スロット 1 を削除します。
# clevis luks unbind -d /dev/sda2 -s 1
前提条件
- Clevis バインディングを使用した LUKS 暗号化ボリューム。
手順
/dev/sda2 などのボリュームがどの LUKS バージョンであるかを確認し、Clevis にバインドされているスロットおよびトークンを特定します。
# cryptsetup luksDump /dev/sda2 LUKS header information Version: 2 ... Keyslots: 0: luks2 ... 1: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 ... Tokens: 0: clevis Keyslot: 1 ...
上記の例では、Clevis トークンは 0 で識別され、関連付けられた鍵スロットは 1 です。
LUKS2 暗号化の場合は、トークンを削除します。
# cryptsetup token remove --token-id 0 /dev/sda2
デバイスが LUKS1 で暗号化されていて、
Version:1
という文字列がcryptsetup luksDump
コマンドの出力に含まれている場合は、luksmeta wipe
コマンドでこの追加手順を実行します。# luksmeta wipe -d /dev/sda2 -s 1
Clevis パスフレーズを含む鍵スロットを削除します。
# cryptsetup luksKillSlot /dev/sda2 1
関連情報
-
clevis-luks-unbind(1)
、cryptsetup(8)
、およびluksmeta(8)
の man ページ
11.10. キックスタートを使用して、LUKS で暗号化したボリュームの自動登録の設定
この手順に従って、LUKS で暗号化されたボリュームの登録に Clevis を使用する自動インストールプロセスを設定します。
手順
一時パスワードを使用して、LUKS 暗号化が有効になっているディスクを、
/boot
以外のすべてのマウントポイントで分割するように、キックスタートに指示します。パスワードは、登録プロセスの手順に使用するための一時的なものです。part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
OSPP 準拠のシステムには、より複雑な設定が必要であることに注意してください。次に例を示します。
part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --size=2048 --encrypted --passphrase=temppass part /var --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /tmp --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /home --fstype="xfs" --ondisk=vda --size=2048 --grow --encrypted --passphrase=temppass part /var/log --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /var/log/audit --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
関連する Clevis パッケージを
%packages
セクションに追加して、インストールします。%packages clevis-dracut clevis-luks clevis-systemd %end
- オプションで、必要に応じて暗号化されたボリュームのロックを手動で解除できるようにするには、一時パスフレーズを削除する前に強力なパスフレーズを追加します。詳細については、How to add a passphrase, key, or keyfile to an existing LUKS device の記事を参照してください。
clevis luks bind
を呼び出して、%post
セクションのバインディングを実行します。その後、一時パスワードを削除します。%post clevis luks bind -y -k - -d /dev/vda2 \ tang '{"url":"http://tang.srv"}' <<< "temppass" cryptsetup luksRemoveKey /dev/vda2 <<< "temppass" dracut -fv --regenerate-all %end
設定が起動初期にネットワークを必要とする Tang ピンに依存している場合、または静的 IP 設定の NBDE クライアントを使用している場合は、Configuring manual enrollment of LUKS-encrypted volumesに従って
dracut
コマンドを変更する必要があります。clevis luks bind
コマンドの-y
オプションは、RHEL 8.3 から使用できることに注意してください。RHEL 8.2 以前では、clevis luks bind
コマンドで-y
を-f
に置き換え、Tang サーバーからアドバタイズメントをダウンロードします。%post curl -sfg http://tang.srv/adv -o adv.jws clevis luks bind -f -k - -d /dev/vda2 \ tang '{"url":"http://tang.srv","adv":"adv.jws"}' <<< "temppass" cryptsetup luksRemoveKey /dev/vda2 <<< "temppass" dracut -fv --regenerate-all %end
警告cryptsetup luksRemoveKey
コマンドは、それを適用する LUKS2 デバイスがそれ以上に管理されるのを防ぎます。LUKS1 デバイスに対してのみdmsetup
コマンドを使用して、削除されたマスターキーを回復できます。
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
関連情報
-
clevis(1)
、clevis-luks-bind(1)
、cryptsetup(8)
、およびdmsetup(8)
の man ページ - キックスタートを使用した Red Hat Enterprise Linux 9 のインストール
11.11. LUKS で暗号化されたリムーバブルストレージデバイスの自動アンロックの設定
この手順に従って、LUKS 暗号化 USB ストレージデバイスの自動ロック解除プロセスを設定します。
手順
USB ドライブなど、LUKS で暗号化したリムーバブルストレージデバイスを自動的にアンロックするには、
clevis-udisks2
パッケージをインストールします。# dnf install clevis-udisks2
システムを再起動し、LUKS で暗号化したボリュームの手動登録の設定 に従って、
clevis luks bind
コマンドを使用したバインディング手順を実行します。以下に例を示します。# clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
LUKS で暗号化したリムーバブルデバイスは、GNOME デスクトップセッションで自動的にアンロックできるようになりました。Clevis ポリシーにバインドするデバイスは、
clevis luks unlock
コマンドでアンロックできます。# clevis luks unlock -d /dev/sdb1
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
関連情報
-
clevis-luks-unlockers(7)
man ページ
11.12. 高可用性 NBDE システムのデプロイメント
Tang は、高可用性デプロイメントを構築する方法を 2 つ提供します。
- クライアントの冗長性 (推奨)
-
クライアントは、複数の Tang サーバーにバインドする機能を使用して設定する必要があります。この設定では、各 Tang サーバーに独自の鍵があり、クライアントは、このサーバーのサブセットに接続することで復号できます。Clevis はすでに、
sss
プラグインを使用してこのワークフローに対応しています。Red Hat は、高可用性のデプロイメントにこの方法を推奨します。 - 鍵の共有
-
冗長性を確保するために、Tang のインスタンスは複数デプロイできます。2 つ目以降のインスタンスを設定するには、
tang
パッケージをインストールし、SSH
経由でrsync
を使用してその鍵ディレクトリーを新規ホストにコピーします。鍵を共有すると鍵への不正アクセスのリスクが高まり、追加の自動化インフラストラクチャーが必要になるため、Red Hat はこの方法を推奨していません。
11.12.1. シャミアの秘密分散を使用した高可用性 NBDE
シャミアの秘密分散 (SSS) は、秘密を複数の固有のパーツに分割する暗号スキームです。秘密を再構築するには、いくつかのパーツが必要になります。数値はしきい値と呼ばれ、SSS はしきい値スキームとも呼ばれます。
Clevis は、SSS の実装を提供します。鍵を作成し、これをいくつかのパーツに分割します。各パーツは、SSS も再帰的に含む別のピンを使用して暗号化されます。また、しきい値 t
も定義します。NBDE デプロイメントで少なくとも t
の部分を復号すると、暗号化鍵が復元され、復号プロセスが成功します。Clevis がしきい値で指定されている数よりも小さい部分を検出すると、エラーメッセージが出力されます。
11.12.1.1. 例 1:2 台の Tang サーバーを使用した冗長性
次のコマンドは、2 台の Tang サーバーのうち少なくとも 1 台が使用可能な場合に、LUKS で暗号化されたデバイスを復号します。
# clevis luks bind -d /dev/sda1 sss '{"t":1,"pins":{"tang":[{"url":"http://tang1.srv"},{"url":"http://tang2.srv"}]}}'
上記のコマンドでは、以下の設定スキームを使用していました。
{ "t":1, "pins":{ "tang":[ { "url":"http://tang1.srv" }, { "url":"http://tang2.srv" } ] } }
この設定では、一覧に記載されている 2 台の tang
サーバーのうち少なくとも 1 つが利用可能であれば、SSS しきい値 t
が 1
に設定され、clevis luks bind
コマンドが秘密を正常に再構築します。
11.12.1.2. 例 2:Tang サーバーと TPM デバイスで共有している秘密
次のコマンドは、tang
サーバーと tpm2
デバイスの両方が利用可能な場合に、LUKS で暗号化したデバイスを正常に復号します。
# clevis luks bind -d /dev/sda1 sss '{"t":2,"pins":{"tang":[{"url":"http://tang1.srv"}], "tpm2": {"pcr_ids":"0,7"}}}'
SSS しきい値 t が 2 に設定されている設定スキームは以下のようになります。
{ "t":2, "pins":{ "tang":[ { "url":"http://tang1.srv" } ], "tpm2":{ "pcr_ids":"0,7" } } }
関連情報
-
tang(8)
(High Availability
セクション)、clevis(1)
(Shamir's Secret Sharing
セクション)、およびclevis-encrypt-sss(1)
の man ページ
11.13. NBDE ネットワークで仮想マシンのデプロイメント
clevis luks bind
コマンドは、LUKS マスター鍵を変更しません。これは、仮想マシンまたはクラウド環境で使用する、LUKS で暗号化したイメージを作成する場合に、このイメージを実行するすべてのインスタンスがマスター鍵を共有することを意味します。これにはセキュリティーの観点で大きな問題があるため、常に回避する必要があります。
これは、Clevis の制限ではなく、LUKS の設計原理です。シナリオでクラウド内のルートボリュームを暗号化する必要がある場合は、クラウド内の Red Hat Enterprise Linux の各インスタンスに対しても (通常はキックスタートを使用して) インストールプロセスを実行します。このイメージは、LUKS マスター鍵を共有しなければ共有できません。
仮想化環境で自動ロック解除を展開するには、lorax
や virt-install
などのシステムとキックスタートファイル (キックスタートを使用した LUKS 暗号化ボリュームの自動登録の設定参照) またはその他の自動プロビジョニングツールを使用して、各暗号化 VM に固有のマスターキーを確実に付与します。
関連情報
-
clevis-luks-bind(1)
man ページ
11.14. NBDE を使用してクラウド環境に自動的に登録可能な仮想マシンイメージの構築
自動登録可能な暗号化イメージをクラウド環境にデプロイすると、特有の課題が発生する可能性があります。他の仮想化環境と同様に、LUKS マスター鍵を共有しないように、1 つのイメージから起動するインスタンス数を減らすことが推奨されます。
したがって、ベストプラクティスは、どのパブリックリポジトリーでも共有されず、限られたインスタンスのデプロイメントのベースを提供するように、イメージをカスタマイズすることです。作成するインスタンスの数は、デプロイメントのセキュリティーポリシーで定義する必要があります。また、LUKS マスター鍵の攻撃ベクトルに関連するリスク許容度に基づいて決定する必要があります。
LUKS に対応する自動デプロイメントを構築するには、Lorax、virt-install などのシステムとキックスタートファイルを一緒に使用し、イメージ構築プロセス中にマスター鍵の一意性を確保する必要があります。
クラウド環境では、ここで検討する 2 つの Tang サーバーデプロイメントオプションが利用できます。まず、クラウド環境そのものに Tang サーバーをデプロイできます。もしくは、2 つのインフラストラクチャー間で VPN リンクを使用した独立したインフラストラクチャーで、クラウドの外に Tang サーバーをデプロイできます。
クラウドに Tang をネイティブにデプロイすると、簡単にデプロイできます。ただし、別のシステムの暗号文のデータ永続化層でインフラストラクチャーを共有します。Tang サーバーの秘密鍵および Clevis メタデータは、同じ物理ディスクに保存できる場合があります。この物理ディスクでは、暗号文データへのいかなる不正アクセスが可能になります。
このため、Red Hat は、データを保存する場所と、Tang が実行しているシステムを、物理的に分離させることを強く推奨します。クラウドと Tang サーバーを分離することで、Tang サーバーの秘密鍵が、Clevis メタデータと誤って結合することがないようにします。さらに、これにより、クラウドインフラストラクチャーが危険にさらされている場合に、Tang サーバーのローカル制御を提供します。
11.15. コンテナーとしての Tang のデプロイ
tang
コンテナーイメージは、OpenShift Container Platform (OCP) クラスターまたは別の仮想マシンで実行する Clevis クライアントの Tang-server 復号化機能を提供します。
前提条件
-
podman
パッケージとその依存関係がシステムにインストールされている。 -
podman login registry.redhat.io
コマンドを使用してregistry.redhat.io
コンテナーカタログにログインしている。詳細は、Red Hat コンテナーレジストリーの認証 を参照してください。 - Clevis クライアントは、Tang サーバーを使用して、自動的にアンロックする LUKS で暗号化したボリュームを含むシステムにインストールされている。
手順
registry.redhat.io
レジストリーからtang
コンテナーイメージをプルします。# podman pull registry.redhat.io/rhel9/tang
コンテナーを実行し、そのポートを指定して Tang 鍵へのパスを指定します。上記の例では、
tang
コンテナーを実行し、ポート 7500 を指定し、/var/db/tang
ディレクトリーの Tang 鍵へのパスを示します。# podman run -d -p 7500:7500 -v tang-keys:/var/db/tang --name tang registry.redhat.io/rhel9/tang
Tang はデフォルトでポート 80 を使用しますが、Apache HTTP サーバーなどの他のサービスと共存する可能性があることに注意してください。
(必要に応じて) セキュリティーを強化する場合は、Tang 鍵を定期的にローテーションします。
tangd-rotate-keys
スクリプトを使用できます。以下に例を示します。# podman run --rm -v tang-keys:/var/db/tang registry.redhat.io/rhel9/tang tangd-rotate-keys -v -d /var/db/tang Rotated key 'rZAMKAseaXBe0rcKXL1hCCIq-DY.jwk' -> .'rZAMKAseaXBe0rcKXL1hCCIq-DY.jwk' Rotated key 'x1AIpc6WmnCU-CabD8_4q18vDuw.jwk' -> .'x1AIpc6WmnCU-CabD8_4q18vDuw.jwk' Created new key GrMMX_WfdqomIU_4RyjpcdlXb0E.jwk Created new key _dTTfn17sZZqVAp80u3ygFDHtjk.jwk Keys rotated successfully.
検証
Tang サーバーが存在しているために自動アンロック用に LUKS で暗号化したボリュームが含まれているシステムで、Clevis クライアントが Tang を使用してプレーンテキストのメッセージを暗号化および復号化できることを確認します。
# echo test | clevis encrypt tang '{"url":"http://localhost:7500"}' | clevis decrypt The advertisement contains the following signing keys: x1AIpc6WmnCU-CabD8_4q18vDuw Do you wish to trust these keys? [ynYN] y test
上記のコマンド例は、localhost URL で Tang サーバーが利用できる場合にその出力の最後に
テスト
文字列を示し、ポート 7500 経由で通信します。
関連情報
-
podman(1)
、clevis(1)
およびtang(8)
の man ページ
11.16. nbde_client
および nbde_server
システムロールの概要 (Clevis および Tang)
RHEL システムロールは、複数の RHEL システムをリモートで管理する一貫した設定インターフェイスを提供する Ansible ロールおよびモジュールの集合です。
Clevis および Tang を使用した PBD (Policy-Based Decryption) ソリューションの自動デプロイメント用 Ansible ロールを使用することができます。rhel-system-roles
パッケージには、これらのシステムロール、関連する例、リファレンスドキュメントが含まれます。
nbde_client
システムロールにより、複数の Clevis クライアントを自動的にデプロイできます。nbde_client
ロールは、Tang バインディングのみをサポートしており、現時点では TPM2 バインディングには使用できない点に留意してください。
nbde_client
ロールには、LUKS を使用して暗号化済みのボリュームが必要です。このロールは、LUKS 暗号化ボリュームの 1 つ以上の Network-Bound (NBDE) サーバー (Tang サーバー) へのバインドに対応します。パスフレーズを使用して既存のボリュームの暗号化を保持するか、または削除できます。パスフレーズを削除したら、NBDE だけを使用してボリュームのロックを解除できます。これは、システムのプロビジョニング後に削除する必要がある一時鍵またはパスワードを使用して、ボリュームが最初に暗号化されている場合に役立ちます。
パスフレーズと鍵ファイルの両方を指定する場合には、ロールは最初に指定した内容を使用します。有効なバインディングが見つからない場合は、既存のバインディングからパスフレーズの取得を試みます。
PBD では、デバイスをスロットにマッピングするものとしてバインディングを定義します。つまり、同じデバイスに複数のバインディングを指定できます。デフォルトのスロットは 1 です。
nbde_client
ロールでは、state
変数も指定できます。新しいバインディングを作成するか、既存のバインディングを更新する場合は、present
を使用します。clevis luks bind
とは異なり、state: present
を使用してデバイススロットにある既存のバインディングを上書きすることもできます。absent
に設定すると、指定したバインディングが削除されます。
nbde_client
システムロールを使用すると、自動ディスク暗号化ソリューションの一部として、Tang サーバーをデプロイして管理できます。このロールは以下の機能をサポートします。
- Tang 鍵のローテーション
- Tang 鍵のデプロイおよびバックアップ
関連情報
-
NBDE (Network-Bound Disk Encryption) ロール変数の詳細は、
rhel-system-roles
パッケージをインストールし、/usr/share/doc/rhel-system-roles/nbde_client/
と/usr/share/doc/rhel-system-roles/nbde_server/
ディレクトリーのREADME.md
とREADME.html
ファイルを参照してください。 -
たとえば、system-roles Playbook の場合は、
rhel-system-roles
パッケージをインストールし、/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/
ディレクトリーを参照してください。 - RHEL システムロールの詳細は、RHEL システムロールを使用するためのコントロールノードと管理対象ノードの準備 を参照してください。
11.17. 複数の Tang サーバーをセットアップするための nbde_server
システムロールの使用
以下の手順に従って、Tang サーバー設定を含む Ansible Playbook を準備および適用します。
前提条件
-
1 つ以上の 管理対象ノード (
nbde_server
システムロールで設定するシステム) へのアクセスおよびパーミッション。 コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
コントロールノードでは、
-
ansible-core
パッケージおよびrhel-system-roles
パッケージがインストールされている。
-
RHEL 8.0-8.5 では、別の Ansible リポジトリーへのアクセス権を指定されており、Ansible をベースにする自動化用の Ansible Engine 2.9 が含まれています。Ansible Engine には、ansible
、ansible-playbook
などのコマンドラインユーティリティー、docker
や podman
などのコネクター、プラグインとモジュールが多く含まれています。Ansible Engine を入手してインストールする方法については、ナレッジベースの How to download and install Red Hat Ansible Engine を参照してください。
RHEL 8.6 および 9.0 では、Ansible Core (ansible-core
パッケージとして提供) が導入されました。これには、Ansible コマンドラインユーティリティー、コマンド、およびビルトイン Ansible プラグインのセットが含まれています。RHEL は、AppStream リポジトリーを介してこのパッケージを提供し、サポート範囲は限定的です。詳細については、ナレッジベースの Scope of support for the Ansible Core package included in the RHEL 9 and RHEL 8.6 and later AppStream repositories を参照してください。
- 管理対象ノードが記載されているインベントリーファイルがある。
手順
Tang サーバーの設定が含まれる Playbook を準備します。ゼロから開始するか、または
/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/
ディレクトリーにある Playbook のいずれかのサンプルを使用することができます。# cp /usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/simple_deploy.yml ./my-tang-playbook.yml
選択したテキストエディターで Playbook を編集します。以下に例を示します。
# vi my-tang-playbook.yml
必要なパラメーターを追加します。以下の Playbook の例では、Tang サーバーのデプロイと鍵のローテーションを確実に実行します。
--- - hosts: all vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true roles: - rhel-system-roles.nbde_server
注記nbde_server_manage_firewall
とnbde_server_manage_selinux
は両方とも true に設定されているため、nbde_server
ロールはfirewall
とselinux
ロールを使用して、nbde_server
ロールが使用するポートを管理します。終了した Playbook を適用します。
# ansible-playbook -i inventory-file my-tang-playbook.yml
ここで *
inventory-file
はインベントリーファイル、*logging-playbook.yml
は Playbook も置き換えます。
Clevis がインストールされているシステムで grubby
ツールを使用して、システム起動時の早い段階で Tang ピンのネットワークを利用できるようにするには、次のコマンドを実行します。
# grubby --update-kernel=ALL --args="rd.neednet=1"
関連情報
-
詳細は、
rhel-system-roles
パッケージをインストールして、/usr/share/doc/rhel-system-roles/nbde_server/
ディレクトリーおよびusr/share/ansible/roles/rhel-system-roles.nbde_server/
ディレクトリーを参照してください。
11.18. 複数の Clevis クライアントの設定に nbde_client
システムロールを使用
手順に従って、Clevis クライアント設定を含む Ansible Playbook を準備および適用します。
nbde_client
システムロールは、Tang バインディングのみをサポートします。これは、現時点では TPM2 バインディングに使用できないことを意味します。
前提条件
-
1 つ以上の 管理対象ノード (
nbde_client
システムロールで設定するシステム) へのアクセスおよびパーミッション。 - コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
- Ansible Core パッケージがコントロールマシンにインストールされている。
-
rhel-system-roles
パッケージが、Playbook を実行するシステムにインストールされている。
手順
Clevis クライアントの設定が含まれる Playbook を準備します。ゼロから開始するか、または
/usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/
ディレクトリーにある Playbook のいずれかのサンプルを使用することができます。# cp /usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/high_availability.yml ./my-clevis-playbook.yml
選択したテキストエディターで Playbook を編集します。以下に例を示します。
# vi my-clevis-playbook.yml
必要なパラメーターを追加します。以下の Playbook の例では、2 つの Tang サーバーのうち少なくとも 1 台が利用可能な場合に、LUKS で暗号化した 2 つのボリュームを自動的にアンロックするように Clevis クライアントを設定します。
--- - hosts: all vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com roles: - rhel-system-roles.nbde_client
終了した Playbook を適用します。
# ansible-playbook -i host1,host2,host3 my-clevis-playbook.yml
Clevis がインストールされているシステムで grubby
ツールを使用して、システム起動時の早い段階で Tang ピンのネットワークを利用できるようにするには、次のコマンドを実行します。
# grubby --update-kernel=ALL --args="rd.neednet=1"
関連情報
-
パラメーターの詳細と、NBDE Client システムロールに関する追加情報は、
rhel-system-roles
パッケージをインストールし、/usr/share/doc/rhel-system-roles/nbde_client/
および/usr/share/ansible/roles/rhel-system-roles.nbde_client/
ディレクトリーを参照してください。
第12章 システムの監査
Audit は、追加のセキュリティー機能をシステムに提供するのではありません。システムで使用されるセキュリティーポリシーの違反を発見するために使用できます。このような違反は、SELinux などの別のセキュリティー対策で防ぐことができます。
12.1. Linux の Audit
Linux の Audit システムは、システムのセキュリティー関連情報を追跡する方法を提供します。事前設定されたルールに基づき、Audit は、ログエントリーを生成し、システムで発生しているイベントに関する情報をできるだけ多く記録します。この情報は、ミッションクリティカルな環境でセキュリティーポリシーの違反者と、違反者によるアクションを判断する上で必須のものです。
以下は、Audit がログファイルに記録できる情報の概要です。
- イベントの日時、タイプ、結果
- サブジェクトとオブジェクトの機密性のラベル
- イベントを開始したユーザーの ID とイベントの関連性
- Audit 設定の全修正および Audit ログファイルへのアクセス試行
- SSH、Kerberos、およびその他の認証メカニズムの全使用
-
信頼できるデータベース (
/etc/passwd
など) への変更 - システムからの情報のインポート、およびシステムへの情報のエクスポートの試行
- ユーザー ID、サブジェクトおよびオブジェクトラベルなどの属性に基づく include または exclude イベント
Audit システムの使用は、多くのセキュリティー関連の認定における要件でもあります。Audit は、以下の認定またはコンプライアンスガイドの要件に合致するか、それを超えるように設計されています。
- Controlled Access Protection Profile (CAPP)
- Labeled Security Protection Profile (LSPP)
- Rule Set Base Access Control (RSBAC)
- NISPOM (National Industrial Security Program Operating Manual)
- Federal Information Security Management Act (FISMA)
- PCI DSS (Payment Card Industry Data Security Standard)
- セキュリティー技術実装ガイド (Security Technical Implementation Guide (STIG))
Audit は以下でも認定されています。
- National Information Assurance Partnership (NIAP) および Best Security Industries (BSI) による評価
- Red Hat Enterprise Linux 5 における LSPP/CAPP/RSBAC/EAL4 以降の認定
- Red Hat Enterprise Linux 6 における OSPP/EAL4 以降 (Operating System Protection Profile / Evaluation Assurance Level 4 以降) の認定
ユースケース
- ファイルアクセスの監視
- Audit は、ファイルやディレクトリーがアクセス、修正、または実行されたか、もしくはファイル属性が変更されたかを追跡できます。これはたとえば、重要なファイルへのアクセスを検出し、これらのファイルが破損した場合に監査証跡を入手可能とする際に役に立ちます。
- システムコールの監視
-
Audit は、一部のシステムコールが使用されるたびにログエントリーを生成するように設定できます。これを使用すると、
settimeofday
やclock_adjtime
、その他の時間関連のシステムコールを監視することで、システム時間への変更を追跡できます。 - ユーザーが実行したコマンドの記録
-
Audit はファイルが実行されたかどうかを追跡できるため、特定のコマンドの実行を毎回記録するようにルールを定義できます。たとえば、
/bin
ディレクトリー内のすべての実行可能ファイルにルールを定義できます。これにより作成されるログエントリーをユーザー ID で検索すると、ユーザーごとに実行されたコマンドの監査証跡を生成できます。 - システムのパス名の実行の記録
- ルールの呼び出し時にパスを inode に変換するファイルアクセスをウォッチする以外に、ルールの呼び出し時に存在しない場合や、ルールの呼び出し後にファイルが置き換えられた場合でも、Audit がパスの実行をウォッチできるようになりました。これにより、ルールは、プログラム実行ファイルをアップグレードした後、またはインストールされる前にも機能を継続できます。
- セキュリティーイベントの記録
-
pam_faillock
認証モジュールは、失敗したログイン試行を記録できます。Audit で失敗したログイン試行も記録するように設定すると、ログインを試みたユーザーに関する追加情報が提供されます。 - イベントの検索
-
Audit は
ausearch
ユーティリティーを提供します。これを使用すると、ログエントリーをフィルターにかけ、いくつかの条件に基づく完全な監査証跡を提供できます。 - サマリーレポートの実行
-
aureport
ユーティリティーを使用すると、記録されたイベントのデイリーレポートを生成できます。システム管理者は、このレポートを分析し、疑わしいアクティビティーをさらに調べることができます。 - ネットワークアクセスの監視
-
nftables
、iptables
、およびebtables
ユーティリティーは、Audit イベントを発生するように設定できるため、システム管理者がネットワークアクセスを監視できるようになります。
システムのパフォーマンスは、Audit が収集する情報量によって影響される可能性があります。
12.2. Audit システムのアーキテクチャー
Audit システムは、ユーザー空間アプリケーションおよびユーティリティーと、カーネル側のシステムコール処理という 2 つの主要部分で設定されます。カーネルコンポーネントは、ユーザー空間アプリケーションからシステムコールを受け、これを user、task、fstype、または exit のいずれかのフィルターで振り分けます。
システムコールが exclude フィルターを通過すると、前述のフィルターのいずれかに送られます。このフィルターにより、Audit ルール設定に基づいてシステムコールが Audit デーモンに送信され、さらに処理されます。
ユーザー空間の Audit デーモンは、カーネルから情報を収集し、ログファイルのエントリーを作成します。他のユーザー空間ユーティリティーは、Audit デーモン、カーネルの Audit コンポーネント、または Audit ログファイルと相互作用します。
-
auditctl
- Audit 制御ユーティリティーはカーネル Audit コンポーネントと相互作用し、ルールを管理するだけでなくイベント生成プロセスの多くの設定やパラメーターも制御します。 -
残りの Audit ユーティリティーは、Audit ログファイルのコンテンツを入力として受け取り、ユーザーの要件に基づいて出力を生成します。たとえば、
aureport
ユーティリティーは、記録された全イベントのレポートを生成します。
RHEL 9 では、Audit dispatcher デーモン (audisp
) 機能は、Audit デーモン (auditd
) に統合されています。監査イベントと、リアルタイムの分析プログラムの相互作用に使用されるプラグイン設定ファイルは、デフォルトで /etc/audit/plugins.d/
ディレクトリーに保存されます。
12.3. 環境を保護するための auditd の設定
デフォルトの auditd
設定は、ほとんどの環境に適しています。ただし、環境が厳格なセキュリティーポリシーを満たす必要がある場合は、/etc/audit/auditd.conf
ファイル内の Audit デーモン設定に次の設定が推奨されます。
- log_file
-
Audit ログファイル (通常は
/var/log/audit/
) を保持するディレクトリーは、別のマウントポイントにマウントされている必要があります。これにより、その他のプロセスがこのディレクトリー内の領域を使用しないようにし、Audit デーモンの残りの領域を正確に検出します。 - max_log_file
-
1 つの Audit ログファイルの最大サイズを指定します。Audit ログファイルを保持するパーティションで利用可能な領域をすべて使用するように設定する必要があります。
max_log_file`
パラメーターは、最大ファイルサイズをメガバイト単位で指定します。指定する値は、数値にする必要があります。 - max_log_file_action
-
max_log_file
に設定した制限に達したときに実行するアクションを決定します。Audit ログファイルが上書きされないようにkeep_logs
に設定する必要があります。 - space_left
-
space_left_action
パラメーターで設定されたアクションがトリガーされるディスクに残っている空き領域の量を指定します。管理者は、ディスクの領域を反映して解放するのに十分な時間を設定する必要があります。space_left
の値は、Audit ログファイルが生成されるレートによって異なります。space_left の値が整数として指定されている場合は、メガバイト (MiB) 単位の絶対サイズとして解釈されます。値が 1 〜 99 の数値の後にパーセント記号を付けて指定されている場合 (5% など)、Audit デーモンは、log_file
を含むファイルシステムのサイズに基づいて、メガバイト単位で絶対サイズを計算します。 - space_left_action
-
適切な通知方法を使用して、
space_left_action
パラメーターをemail
またはexec
に設定することをお勧めします。 - admin_space_left
-
admin_space_left_action
パラメーターで設定されたアクションがトリガーされる空きスペースの絶対最小量を指定します。これは、管理者によって実行されたアクションをログに記録するのに十分なスペースを残す値に設定する必要があります。このパラメーターの数値は、space_left の数値より小さくする必要があります。また、数値にパーセント記号を追加 (1% など) して、Audit デーモンが、ディスクパーティションサイズに基づいて、数値を計算するようにすることもできます。 - admin_space_left_action
-
single
を、システムをシングルユーザーモードにし、管理者がディスク領域を解放できるようにします。 - disk_full_action
-
Audit ログファイルが含まれるパーティションに空き領域がない場合に発生するアクションを指定します (
halt
またはsingle
に設定する必要があります)。これにより、Audit がイベントをログに記録できなくなると、システムは、シングルユーザーモードでシャットダウンまたは動作します。 - disk_error_action
-
Audit ログファイルが含まれるパーティションでエラーが検出された場合に発生するアクションを指定します。このパラメーターは、ハードウェアの機能不全処理に関するローカルのセキュリティーポリシーに基づいて、
syslog
、single
、halt
のいずれかに設定する必要があります。 - flush
-
incremental_async
に設定する必要があります。これはfreq
パラメーターと組み合わせて機能します。これは、ハードドライブとのハード同期を強制する前にディスクに送信できるレコードの数を指定します。freq
パラメーターは100
に設定する必要があります。このパラメーターにより、アクティビティーが集中した際に高いパフォーマンスを保ちつつ、Audit イベントデータがディスクのログファイルと確実に同期されるようになります。
残りの設定オプションは、ローカルのセキュリティーポリシーに合わせて設定します。
12.4. auditd の開始および制御
auditd
が設定されたら、サービスを起動して Audit 情報を収集し、ログファイルに保存します。root ユーザーで次のコマンドを実行し、auditd
を起動します。
# service auditd start
システムの起動時に auditd
が開始するように設定するには、次のコマンドを実行します。
# systemctl enable auditd
# auditctl -e 0
で auditd
を一時的に無効にし、# auditctl -e 1
で再度有効にできます。
service auditd action
コマンドを使用すると、auditd
でさまざまなアクションを実行できます。ここでの アクション は以下のいずれかになります。
stop
-
auditd
を停止します。 restart
-
auditd
を再起動します。 reload
またはforce-reload
-
/etc/audit/auditd.conf
ファイルからauditd
の設定を再ロードします。 rotate
-
/var/log/audit/
ディレクトリーのログファイルをローテーションします。 resume
- Audit イベントのログが一旦停止した後、再開します。たとえば、Audit ログファイルが含まれるディスクパーティションの未使用領域が不足している場合などです。
condrestart
またはtry-restart
-
auditd
がすでに起動している場合にのみ、これを再起動します。 status
-
auditd
の稼働状況を表示します。
service
コマンドは、auditd
デーモンと正しく相互作用する唯一の方法です。auid
値が適切に記録されるように、service
コマンドを使用する必要があります。systemctl
コマンドは、2 つのアクション (enable
および status
) にのみ使用できます。
12.5. Audit ログファイルについて
デフォルトでは、Audit システムはログエントリーを /var/log/audit/audit.log
ファイルに保存します。ログローテーションが有効になっていれば、ローテーションされた audit.log
ファイルは同じディレクトリーに保存されます。
下記の Audit ルールを追加して、/etc/ssh/sshd_config
ファイルの読み取りまたは修正の試行をすべてログに記録します。
# auditctl -w /etc/ssh/sshd_config -p warx -k sshd_config
auditd
デーモンが実行している場合は、たとえば次のコマンドを使用して、Audit ログファイルに新しいイベントを作成します。
$ cat /etc/ssh/sshd_config
このイベントは、audit.log
ファイルでは以下のようになります。
type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config" type=CWD msg=audit(1364481363.243:24287): cwd="/home/shadowman" type=PATH msg=audit(1364481363.243:24287): item=0 name="/etc/ssh/sshd_config" inode=409248 dev=fd:00 mode=0100600 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 type=PROCTITLE msg=audit(1364481363.243:24287) : proctitle=636174002F6574632F7373682F737368645F636F6E666967
上記のイベントは 4 つのレコードで設定されており、タイムスタンプとシリアル番号を共有します。レコードは、常に type=
で始まります。各レコードには、スペースまたはコンマで区切られた名前と値のペア (name=value
) が複数使用されています。上記のイベントの詳細な分析は以下のようになります。
1 つ目のレコード
type=SYSCALL
-
type
フィールドには、レコードのタイプが記載されます。この例のSYSCALL
値は、カーネルへのシステムコールによりこれが記録されたことを示しています。
msg=audit(1364481363.243:24287):
msg
フィールドには以下が記録されます。-
audit(time_stamp:ID)
形式のレコードのタイムスタンプおよび一意の ID。複数のレコードが同じ Audit イベントの一部として生成されている場合は、同じタイムスタンプおよび ID を共有できます。タイムスタンプは Unix の時間形式です (1970 年 1 月 1 日 00:00:00 UTC からの秒数)。 -
カーネル空間およびユーザー空間のアプリケーションが提供するさまざまなイベント固有の
name=value
ペア。
-
arch=c000003e
-
arch
フィールドには、システムの CPU アーキテクチャーに関する情報が含まれます。c000003e
の値は 16 進数表記で記録されます。ausearch
コマンドで Audit レコードを検索する場合は、-i
オプションまたは--interpret
オプションを使用して、16 進数の値を人間が判読できる値に自動的に変換します。c000003e
値はx86_64
として解釈されます。 syscall=2
-
syscall
フィールドは、カーネルに送信されたシステムコールのタイプを記録します。値が2
の場合は、/usr/include/asm/unistd_64.h
ファイルに、人間が判読できる値を指定できます。この場合の2
は、オープン
なシステムコールです。ausyscall
ユーティリティーでは、システムコール番号を、人間が判読できる値に変換できます。ausyscall --dump
コマンドを使用して、システムコールの一覧とその数字を表示します。詳細は、ausyscall
(8) の man ページを参照してください。 success=no
-
success
フィールドは、その特定のイベントで記録されたシステムコールが成功したかどうかを記録します。この例では、呼び出しが成功しませんでした。 exit=-13
exit
フィールドには、システムコールが返した終了コードを指定する値が含まれます。この値は、システムコールにより異なります。次のコマンドを実行すると、この値を人間が判読可能なものに変換できます。# ausearch --interpret --exit -13
この例では、監査ログに、終了コード
-13
で失敗したイベントが含まれていることが前提となります。a0=7fffd19c5592
,a1=0
,a2=7fffd19c5592
,a3=a
-
a0
からa3
までのフィールドは、このイベントにおけるシステムコールの最初の 4 つの引数を、16 進法で記録します。この引数は、使用されるシステムコールにより異なります。ausearch
ユーティリティーで解釈できます。 items=1
-
items
フィールドには、システムコールのレコードに続く PATH 補助レコードの数が含まれます。 ppid=2686
-
ppid
フィールドは、親プロセス ID (PPID) を記録します。この例では、2686
は、bash
などの親プロセスの PPID です。 pid=3538
-
pid
フィールドは、プロセス ID (PID) を記録します。この例の3538
はcat
プロセスの PID です。 auid=1000
-
auid
フィールドには、loginuid である Audit ユーザー ID が記録されます。この ID は、ログイン時にユーザーに割り当てられ、ユーザーの ID が変更した後でもすべてのプロセスに引き継がれます (たとえば、su - john
コマンドでユーザーアカウントを切り替えた場合)。 uid=1000
-
uid
フィールドは、解析しているプロセスを開始したユーザーのユーザー ID を記録します。ユーザー ID は、ausearch -i --uid UID
のコマンドを使用するとユーザー名に変換されます。 gid=1000
-
gid
フィールドは、解析しているプロセスを開始したユーザーのグループ ID を記録します。 euid=1000
-
euid
フィールドは、解析しているプロセスを開始したユーザーの実効ユーザー ID を記録します。 suid=1000
-
suid
フィールドは、解析しているプロセスを開始したユーザーのセットユーザー ID を記録します。 fsuid=1000
-
fsuid
フィールドは、解析しているプロセスを開始したユーザーのファイルシステムユーザー ID を記録します。 egid=1000
-
egid
フィールドは、解析しているプロセスを開始したユーザーの実効グループ ID を記録します。 sgid=1000
-
sgid
フィールドは、解析しているプロセスを開始したユーザーのセットグループ ID を記録します。 fsgid=1000
-
fsgid
フィールドは、解析しているプロセスを開始したユーザーのファイルシステムグループ ID を記録します。 tty=pts0
-
tty
フィールドは、解析しているプロセスが開始したターミナルを記録します。 ses=1
-
ses
フィールドは、解析しているプロセスが開始したセッションのセッション ID を記録します。 comm="cat"
-
comm
フィールドは、解析しているプロセスを開始するために使用したコマンドのコマンドライン名を記録します。この例では、この Audit イベントを発生するのに、cat
コマンドが使用されました。 exe="/bin/cat"
-
exe
フィールドは、解析しているプロセスを開始するために使用した実行可能ファイルへのパスを記録します。 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
-
subj
フィールドは、解析しているプロセスの実行時にラベル付けされた SELinux コンテンツを記録します。 key="sshd_config"
-
key
フィールドは、Audit ログでこのイベントを生成したルールに関連付けられている管理者による定義の文字列を記録します。
2 つ目のレコード
type=CWD
2 つ目のレコードの
type
フィールドの値は、CWD
(現在の作業ディレクトリー) です。このタイプは、最初のレコードで指定されたシステムコールを開始したプロセスの作業ディレクトリーを記録するために使用されます。この記録の目的は、相対パスが関連する PATH 記録に保存された場合に、現行プロセスの位置を記録することにあります。これにより、絶対パスを再構築できます。
msg=audit(1364481363.243:24287)
-
msg
フィールドは、最初のレコードと同じタイムスタンプと ID の値を保持します。タイムスタンプは Unix の時間形式です (1970 年 1 月 1 日 00:00:00 UTC からの秒数)。 cwd="/home/user_name"
-
cwd
フィールドは、システムコールが開始したディレクトリーのパスになります。
3 つ目のレコード
type=PATH
-
3 つ目のレコードでは、
type
フィールドの値はPATH
です。Audit イベントには、システムコールに引数として渡されたすべてのパスにPATH
タイプのレコードが含まれます。この Audit イベントでは、1 つのパス (/etc/ssh/sshd_config
) のみが引数として使用されます。 msg=audit(1364481363.243:24287):
-
msg
フィールドは、1 つ目と 2 つ目のレコードと同じタイムスタンプと ID になります。 item=0
-
item
フィールドは、SYSCALL
タイプレコードで参照されているアイテムの合計数のうち、現在のレコードがどのアイテムであるかを示します。この数はゼロベースで、0
は最初の項目であることを示します。 name="/etc/ssh/sshd_config"
-
name
フィールドは、システムコールに引数として渡されたファイルまたはディレクトリーのパスを記録します。この場合、これは/etc/ssh/sshd_config
ファイルです。 inode=409248
inode
フィールドには、このイベントで記録されたファイルまたはディレクトリーに関連する inode 番号が含まれます。以下のコマンドは、inode 番号409248
に関連するファイルまたはディレクトリーを表示します。# find / -inum 409248 -print /etc/ssh/sshd_config
dev=fd:00
-
dev
フィールドは、このイベントで記録されたファイルまたはディレクトリーを含むデバイスのマイナーおよびメジャーの ID を指定します。ここでは、値が/dev/fd/0
デバイスを示しています。 mode=0100600
-
mode
フィールドは、ファイルまたはディレクトリーのパーミッションを、st_mode
フィールドのstat
コマンドが返す数字表記で記録します。詳細は、stat(2)
の man ページを参照してください。この場合、0100600
は-rw-------
として解釈されます。つまり、root ユーザーにのみ、/etc/ssh/sshd_config
ファイルに読み取りおよび書き込みのパーミッションが付与されます。 ouid=0
-
ouid
フィールドは、オブジェクトの所有者のユーザー ID を記録します。 ogid=0
-
ogid
フィールドは、オブジェクトの所有者のグループ ID を記録します。 rdev=00:00
-
rdev
フィールドには、特定ファイルにのみ記録されたデバイス識別子が含まれます。ここでは、記録されたファイルは通常のファイルであるため、このフィールドは使用されません。 obj=system_u:object_r:etc_t:s0
-
obj
フィールドは、実行時に、記録されているファイルまたはディレクトリーにラベル付けする SELinux コンテキストを記録します。 nametype=NORMAL
-
nametype
フィールドは、指定したシステムコールのコンテキストで各パスのレコード操作の目的を記録します。 cap_fp=none
-
cap_fp
フィールドは、ファイルまたはディレクトリーオブジェクトで許可されたファイルシステムベースの機能の設定に関連するデータを記録します。 cap_fi=none
-
cap_fi
フィールドは、ファイルまたはディレクトリーオブジェクトの継承されたファイルシステムベースの機能の設定に関するデータを記録します。 cap_fe=0
-
cap_fe
フィールドは、ファイルまたはディレクトリーオブジェクトのファイルシステムベースの機能の有効ビットの設定を記録します。 cap_fver=0
-
cap_fver
フィールドは、ファイルまたはディレクトリーオブジェクトのファイルシステムベースの機能のバージョンを記録します。
4 つ目のレコード
type=PROCTITLE
-
type
フィールドには、レコードのタイプが記載されます。この例のPROCTITLE
値は、このレコードにより、カーネルへのシステムコールにより発生するこの監査イベントを発生させた完全なコマンドラインを提供することが指定されることを示しています。 proctitle=636174002F6574632F7373682F737368645F636F6E666967
-
proctitle
フィールドは、解析しているプロセスを開始するために使用したコマンドのコマンドラインを記録します。このフィールドは 16 進数の表記で記録され、Audit ログパーサーに影響が及ばないようにします。このテキストは、この Audit イベントを開始したコマンドに復号します。ausearch
コマンドで Audit レコードを検索する場合は、-i
オプションまたは--interpret
オプションを使用して、16 進数の値を人間が判読できる値に自動的に変換します。636174002F6574632F7373682F737368645F636F6E666967
値は、cat /etc/ssh/sshd_config
として解釈されます。
12.6. auditctl で Audit ルールを定義および実行
Audit システムは、ログファイルで取得するものを定義する一連のルールで動作します。Audit ルールは、auditctl
ユーティリティーを使用してコマンドラインで設定するか、/etc/audit/rules.d/
ディレクトリーで設定できます。
auditctl
コマンドを使用すると、Audit システムの基本的な機能を制御し、どの Audit イベントをログに記録するかを指定するルールを定義できます。
ファイルシステムのルールの例
すべての書き込みアクセスと
/etc/passwd
ファイルのすべての属性変更をログに記録するルールを定義するには、次のコマンドを実行します。# auditctl -w /etc/passwd -p wa -k passwd_changes
すべての書き込みアクセスと、
/etc/selinux/
ディレクトリー内の全ファイルへのアクセスと、その属性変更をすべてログに記録するルールを定義するには、次のコマンドを実行します。# auditctl -w /etc/selinux/ -p wa -k selinux_changes
システムロールのルールの例
システムで 64 ビットアーキテクチャーが使用され、システムコールの
adjtimex
またはsettimeofday
がプログラムにより使用されるたびにログエントリーを作成するルールを定義するには、次のコマンドを実行します。# auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
ユーザー ID が 1000 以上のシステムユーザーがファイルを削除したりファイル名を変更するたびに、ログエントリーを作成するルールを定義するには、次のコマンドを実行します。
# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-F auid!=4294967295
オプションが、ログイン UID が設定されていないユーザーを除外するために使用されています。
実行可能なファイルルール
/bin/id
プログラムのすべての実行をログに取得するルールを定義するには、次のコマンドを実行します。
# auditctl -a always,exit -F exe=/bin/id -F arch=b64 -S execve -k execution_bin_id
関連情報
-
auditctl(8)
man ページ
12.7. 永続的な Audit ルールの定義
再起動後も持続するように Audit ルールを定義するには、/etc/audit/rules.d/audit.rules
ファイルに直接追加するか、/etc/audit/rules.d/
ディレクトリーにあるルールを読み込む augenrules
プログラムを使用する必要があります。
auditd
サービスを開始すると、/etc/audit/audit.rules
ファイルが生成されることに注意してください。/etc/audit/rules.d/
のファイルは、同じ auditctl
コマンドライン構文を使用してルールを指定します。ハッシュ記号 (#) に続く空の行とテキストは無視されます。
また、auditctl
コマンドは、以下のように -R
オプションを使用して指定したファイルからルールを読み込むのに使用することもできます。
# auditctl -R /usr/share/audit/sample-rules/30-stig.rules
12.8. 事前に設定されたルールファイルの使用
/usr/share/audit/sample-rules
ディレクトリーには、audit
パッケージが各種の証明書規格に従って、事前設定ルールのファイル一式が提供されています。
- 30-nispom.rules
- NISPOM (National Industrial Security Program Operating Manual) の Information System Security の章で指定している要件を満たす Audit ルール設定
- 30-ospp-v42*.rules
- OSPP (Protection Profile for General Purpose Operating Systems) プロファイルバージョン 4.2 に定義されている要件を満たす監査ルール設定
- 30-pci-dss-v31.rules
- PCI DSS (Payment Card Industry Data Security Standard) v3.1 に設定されている要件を満たす監査ルール設定
- 30-stig.rules
- セキュリティー技術実装ガイド (STIG: Security Technical Implementation Guide) で設定されている要件を満たす Audit ルール設定
上記の設定ファイルを使用するには、/etc/audit/rules.d/
ディレクトリーにコピーして、以下のように augenrules --load
コマンドを使用します。
# cd /usr/share/audit/sample-rules/ # cp 10-base-config.rules 30-stig.rules 31-privileged.rules 99-finalize.rules /etc/audit/rules.d/ # augenrules --load
番号指定スキームを使用して監査ルールを順序付けできます。詳細は、/usr/share/audit/sample-rules/README-rules
ファイルを参照してください。
関連情報
-
audit.rules(7)
man ページ
12.9. 永続ルールを定義する augenrules の使用
augenrules
スクリプトは、/etc/audit/rules.d/
ディレクトリーにあるルールを読み込み、audit.rules
ファイルにコンパイルします。このスクリプトは、自然なソート順序の特定の順番で、.rules
で終わるすべてのファイルを処理します。このディレクトリーのファイルは、以下の意味を持つグループに分類されます。
- 10 - カーネルおよび auditctl の設定
- 20 - 一般的なルールに該当してしまう可能性もあるが、ユーザー側で独自ルールを作成することも可能
- 30 - 主なルール
- 40 - 任意のルール
- 50 - サーバー固有のルール
- 70 - システムのローカルルール
- 90 - ファイナライズ (不変)
ルールは、すべてを一度に使用することは意図されていません。ルールは考慮すべきポリシーの一部であり、個々のファイルは /etc/audit/rules.d/
にコピーされます。たとえば、STIG 設定でシステムを設定し、10-base-config
、30-stig
、31-privileged
、99-finalize
の各ルールをコピーします。
/etc/audit/rules.d/
ディレクトリーにルールを置いたら、--load
ディレクティブで augenrules
スクリプトを実行することでそれを読み込みます。
# augenrules --load
/sbin/augenrules: No change
No rules
enabled 1
failure 1
pid 742
rate_limit 0
...
関連情報
-
audit.rules(8)
およびaugenrules(8)
の man ページ
12.10. augenrules の無効化
augenrules
ユーティリティーを無効にするには、以下の手順に従います。これにより、Audit が /etc/audit/audit.rules
ファイルで定義されたルールを使用するように切り替えます。
手順
/usr/lib/systemd/system/auditd.service
ファイルを/etc/systemd/system/
ディレクトリーにコピーします。# cp -f /usr/lib/systemd/system/auditd.service /etc/systemd/system/
任意のテキストエディターで
/etc/systemd/system/auditd.service
ファイルを編集します。以下に例を示します。# vi /etc/systemd/system/auditd.service
augenrules
を含む行をコメントアウトし、auditctl -R
コマンドを含む行のコメント設定を解除します。#ExecStartPost=-/sbin/augenrules --load ExecStartPost=-/sbin/auditctl -R /etc/audit/audit.rules
systemd
デーモンを再読み込みして、auditd.service
ファイルの変更を取得します。# systemctl daemon-reload
auditd
サービスを再起動します。# service auditd restart
関連情報
-
augenrules(8)
およびaudit.rules(8)
の man ページ - auditd service restart overrides changes made to /etc/audit/audit.rules.
12.11. ソフトウェアの更新を監視するための Audit の設定
事前設定されたルール 44-installers.rules
を使用して、ソフトウェアをインストールする次のユーティリティーを監視するように Audit を設定できます。
-
dnf
[2] -
yum
-
pip
-
npm
-
cpan
-
gem
-
luarocks
rpm
ユーティリティーを監視するには、 rpm-plugin-audit
パッケージをインストールします。その後、Audit は、パッケージをインストールまたは更新するときに SOFTWARE_UPDATE
イベントを生成します。これらのイベントを一覧表示するには、コマンドラインで ausearch -m SOFTWARE_UPDATE
と入力します。
事前設定されたルールファイルは、ppc64le
および aarch64
アーキテクチャーを備えたシステムでは使用できません。
前提条件
-
auditd
が、環境を保護するための auditd の設定で提供される設定に従って定義されている。
手順
事前設定されたルールファイル
44-installers.rules
を/usr/share/audit/sample-rules/
ディレクトリーから/etc/audit/rules.d/
ディレクトリーにコピーします。# cp /usr/share/audit/sample-rules/44-installers.rules /etc/audit/rules.d/
監査ルールを読み込みます。
# augenrules --load
検証
読み込まれたルールを一覧表示します。
# auditctl -l -p x-w /usr/bin/dnf-3 -k software-installer -p x-w /usr/bin/yum -k software-installer -p x-w /usr/bin/pip -k software-installer -p x-w /usr/bin/npm -k software-installer -p x-w /usr/bin/cpan -k software-installer -p x-w /usr/bin/gem -k software-installer -p x-w /usr/bin/luarocks -k software-installer
インストールを実行します。以下に例を示します
# dnf reinstall -y vim-enhanced
Audit ログで最近のインストールイベントを検索します。次に例を示します。
# ausearch -ts recent -k software-installer –––– time->Thu Dec 16 10:33:46 2021 type=PROCTITLE msg=audit(1639668826.074:298): proctitle=2F7573722F6C6962657865632F706C6174666F726D2D707974686F6E002F7573722F62696E2F646E66007265696E7374616C6C002D790076696D2D656E68616E636564 type=PATH msg=audit(1639668826.074:298): item=2 name="/lib64/ld-linux-x86-64.so.2" inode=10092 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 type=PATH msg=audit(1639668826.074:298): item=1 name="/usr/libexec/platform-python" inode=4618433 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:bin_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 type=PATH msg=audit(1639668826.074:298): item=0 name="/usr/bin/dnf" inode=6886099 dev=fd:01 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:rpm_exec_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0 type=CWD msg=audit(1639668826.074:298): cwd="/root" type=EXECVE msg=audit(1639668826.074:298): argc=5 a0="/usr/libexec/platform-python" a1="/usr/bin/dnf" a2="reinstall" a3="-y" a4="vim-enhanced" type=SYSCALL msg=audit(1639668826.074:298): arch=c000003e syscall=59 success=yes exit=0 a0=55c437f22b20 a1=55c437f2c9d0 a2=55c437f2aeb0 a3=8 items=3 ppid=5256 pid=5375 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm="dnf" exe="/usr/libexec/platform-python3.6" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="software-installer"
dnf
は RHEL ではシンボリックリンクであるため、dnf
Audit ルールのパスにはシンボリックリンクのターゲットが含まれている必要があります。正しい Audit イベントを受信するには、path=/usr/bin/dnf
パスを /usr/bin/dnf-3
に変更して、44-installers.rules
ファイルを変更します。
12.12. Audit によるユーザーログイン時刻の監視
特定の時刻にログインしたユーザーを監視するために、特別な方法で Audit を設定する必要はありません。同じ情報を表示する異なる方法を提供する ausearch
または aureport
ツールを使用できます。
前提条件
-
auditd
が、環境を保護するための auditd の設定で提供される設定に従って定義されている。
手順
ユーザーのログイン時刻を表示するには、次のいずれかのコマンドを使用します。
監査ログで
USER_LOGIN
メッセージタイプを検索します。# ausearch -m USER_LOGIN -ts '12/02/2020' '18:00:00' -sv no time->Mon Nov 22 07:33:22 2021 type=USER_LOGIN msg=audit(1637584402.416:92): pid=1939 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login acct="(unknown)" exe="/usr/sbin/sshd" hostname=? addr=10.37.128.108 terminal=ssh res=failed'
-
-ts
オプションを使用して日付と時刻を指定できます。このオプションを使用しない場合、ausearch
は今日の結果を提供し、時刻を省略すると、ausearch
は午前 0 時からの結果を提供します。 -
成功したログイン試行を除外するには
-sv yes
オプションを、失敗したログイン試行を除外するには-sv no
を、それぞれ使用することができます。
-
ausearch
コマンドの生の出力をaulast
ユーティリティーにパイプで渡します。このユーティリティーは、last
コマンドの出力と同様の形式で出力を表示します。以下はその例です。# ausearch --raw | aulast --stdin root ssh 10.37.128.108 Mon Nov 22 07:33 - 07:33 (00:00) root ssh 10.37.128.108 Mon Nov 22 07:33 - 07:33 (00:00) root ssh 10.22.16.106 Mon Nov 22 07:40 - 07:40 (00:00) reboot system boot 4.18.0-348.6.el8 Mon Nov 22 07:33
--login -i
オプションを指定してaureport
コマンドを使用し、ログインイベントのリストを表示します。# aureport --login -i Login Report ============================================ # date time auid host term exe success event ============================================ 1. 11/16/2021 13:11:30 root 10.40.192.190 ssh /usr/sbin/sshd yes 6920 2. 11/16/2021 13:11:31 root 10.40.192.190 ssh /usr/sbin/sshd yes 6925 3. 11/16/2021 13:11:31 root 10.40.192.190 ssh /usr/sbin/sshd yes 6930 4. 11/16/2021 13:11:31 root 10.40.192.190 ssh /usr/sbin/sshd yes 6935 5. 11/16/2021 13:11:33 root 10.40.192.190 ssh /usr/sbin/sshd yes 6940 6. 11/16/2021 13:11:33 root 10.40.192.190 /dev/pts/0 /usr/sbin/sshd yes 6945
関連情報
-
ausearch(8)
の man ページ。 -
aulast(8)
の man ページ。 -
aureport(8)
の man ページ。
12.13. 関連情報
- ナレッジベースアーティクルの RHEL Audit System Reference
- ナレッジベースアーティクルの Auditd execution options in a container
- Linux Audit ドキュメントのプロジェクトページ
-
audit
パッケージが提供するドキュメントは、/usr/share/doc/audit/
ディレクトリーにあります。 -
auditd(8)
、auditctl(8)
、ausearch(8)
、audit.rules(7)
、audispd.conf(5)
、audispd(8)
、auditd.conf(5)
、ausearch-expression(5)
、aulast(8)
、aulastlog(8)
、aureport(8)
、ausyscall(8)
、autrace(8)
、およびauvirt(8)
の man ページ。
第13章 fapolicyd を使用したアプリケーションの拒否および許可
ルールセットに基づいてアプリケーションの実行を許可または拒否するポリシーを設定して有効にすることで、効率的に悪意のある一般的に知られていないソフトウェアや、害を及ぼす可能性のあるソフトウェアの実行を回避できます。
13.1. fapolicyd の概要
fapolicyd
ソフトウェアフレームワークは、ユーザー定義のポリシーに基づいてアプリケーションの実行を制御します。このフレームワークは、最適な方法で、システム上で信頼されていないアプリケーションや悪意のあるアプリケーションを実行されないようにします。
fapolicyd
フレームワークは、以下のコンテンツを提供します。
-
fapolicyd
サービス -
fapolicyd
コマンドラインユーティリティー -
fapolicyd
RPM プラグイン -
fapolicyd
ルール言語 -
fagenrules
スクリプト
管理者は、パス、ハッシュ、MIME タイプ、信頼に基づいて、すべてのアプリケーションに実行ルール allow
および deny
の両方を監査する定義できます。
fapolicyd
フレームワークにより、信頼の概念が導入されます。アプリケーションは、システムパッケージマネージャーによって適切にインストールされると信頼されるため、システムの RPM データベースに登録されます。fapolicyd
デーモンは、RPM データベースを信頼できるバイナリーとスクリプトの一覧として使用します。fapolicyd
RPM プラグインは、DNF Package Manager または RPM Package Manager のいずれかで処理されるシステム更新をすべて登録するようになりました。プラグインは、このデータベースの変更を fapolicyd
デーモンに通知します。アプリケーションを追加する他の方法では、カスタムルールを作成し、fapolicyd
サービスを再起動する必要があります。
fapolicyd
サービス設定は、次の構造を持つ /etc/fapolicyd/
ディレクトリーにあります。
-
/etc/fapolicyd/fapolicyd.trust
ファイルには、信頼できるファイルのリストが含まれています。/etc/fapolicyd/trust.d/
ディレクトリーで複数の信頼ファイルを使用することもできます。 -
allow
およびdeny
の実行ルールを含むファイルの/etc/fapolicyd/rules.d/
ディレクトリー。fagenrules
スクリプトは、これらのコンポーネントルールファイルを/etc/fapolicyd/compiled.rules
ファイルにマージします。 -
fapolicyd.conf
ファイルには、デーモンの設定オプションが含まれています。このファイルは、主にパフォーマンス調整の目的で役に立ちます。
/etc/fapolicyd/rules.d/
のルールは、それぞれ異なるポリシーゴールを表す複数のファイルで整理されます。対応するファイル名の先頭の数字によって、/etc/fapolicyd/compiled.rules
での順序が決まります。
- 10 - 言語ルール
- 20 - dracut 関連のルール
- 21 - アップデーターのルール
- 30 - パターン
- 40 - ELF ルール
- 41 - 共有オブジェクトルール
- 42 - 信頼された ELF ルール
- 70 - 信頼された言語ルール
- 72 - シェルルール
- 90 - ルールの実行を拒否
- 95 - オープンルールを許可
fapolicyd
整合性チェックには、以下のいずれかの方法を使用できます。
- file-size チェック
- SHA-256 ハッシュの比較
- Integrity Measurement Architecture (IMA) サブシステム
デフォルトでは、fapolicyd
は整合性チェックを行いません。ファイルサイズに基づいた整合性チェックは高速ですが、攻撃者はファイルの内容を置き換え、そのバイトサイズを保持することができます。SHA-256 チェックサムの計算とチェックがより安全ですが、システムのパフォーマンスに影響します。fapolicyd.conf
の integrity = ima
オプションには、実行可能ファイルを含むすべてのファイルシステムでファイル拡張属性 (xattrとしても知られている) のサポートが必要です。
関連情報
-
fapolicyd (8)
、fapolicyd.rules (5)
、fapolicyd.conf (5)
、fapolicyd.trust (13)
、fagenrules (8)
、およびfapolicyd-cli (1)
man ページ。 - Managing, monitoring, and updating the kernel の Enhancing security with the kernel integrity subsystem の章を参照してください。
-
/usr/share/doc/fapolicyd/
ディレクトリーおよび/usr/share/fapolicyd/sample-rules/README-rules
ファイルにfapolicyd
パッケージとともにインストールされるドキュメント。
13.2. fapolicyd のデプロイ
RHEL に fapolicyd
フレームワークをデプロイするには、以下を行います。
手順
fapolicyd
パッケージをインストールします。# dnf install fapolicyd
fapolicyd
サービスを有効にして開始します。# systemctl enable --now fapolicyd
検証
fapolicyd
サービスが正しく実行されていることを確認します。# systemctl status fapolicyd ● fapolicyd.service - File Access Policy Daemon Loaded: loaded (/usr/lib/systemd/system/fapolicyd.service; enabled; vendor p> Active: active (running) since Tue 2019-10-15 18:02:35 CEST; 55s ago Process: 8818 ExecStart=/usr/sbin/fapolicyd (code=exited, status=0/SUCCESS) Main PID: 8819 (fapolicyd) Tasks: 4 (limit: 11500) Memory: 78.2M CGroup: /system.slice/fapolicyd.service └─8819 /usr/sbin/fapolicyd Oct 15 18:02:35 localhost.localdomain systemd[1]: Starting File Access Policy D> Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Initialization of the da> Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Reading RPMDB into memory Oct 15 18:02:35 localhost.localdomain systemd[1]: Started File Access Policy Da> Oct 15 18:02:36 localhost.localdomain fapolicyd[8819]: Creating database
root 権限のないユーザーとしてログインし、以下のように
fapolicyd
が機能していることを確認します。$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
13.3. 信頼ソースを使用して、ファイルを信頼できるとマークします。
fapolicyd
フレームワークは、RPM データベースに含まれるファイルを信頼します。対応するエントリーを /etc/fapolicyd/fapolicyd.trust
プレーンテキストファイルまたは /etc/fapolicyd/trust.d/
ディレクトリーに追加することにより、追加のファイルを信頼済みとしてマークできます。fapolicyd.trust
または /etc/fapolicyd/trust.d
内のファイルは、テキストエディターを直接使用するか、fapolicyd-cli
コマンドを使用して変更できます。
fapolicyd.trust
または trust.d/
を使用してファイルを信頼済みとしてマークすることは、パフォーマンス上の理由から、カスタムの fapolicyd
ルールを記述するよりも優れています。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
カスタムバイナリーを必要なディレクトリーにコピーします。以下に例を示します。
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
カスタムバイナリーを信頼済みとしてマークし、対応するエントリーを
/etc/fapolicyd/trust.d/
のmyapp
ファイルに保存します。# fapolicyd-cli --file add /tmp/ls --trust-file myapp
-
--trust-file
オプションをスキップすると、前のコマンドは対応する行を/etc/fapolicyd/fapolicyd.trust
に追加します。 -
ディレクトリー内のすべての既存ファイルを信頼済みとしてマークするには、
--file
オプションの引数としてディレクトリーパスを指定します。たとえば、fapolicyd-cli --file add/tmp/my_bin_dir/--trust-file myapp
です。
-
fapolicyd
データベースを更新します。# fapolicyd-cli --update
信頼されたファイルまたはディレクトリーの内容を変更すると、それらのチェックサムが変更されるため、fapolicyd
はそれらを信頼済みと見なしなくなります。
新しいコンテンツを再び信頼できるようにするには、fapolicyd-cli --file update
コマンドを使用してファイル信頼データベースを更新します。引数を何も指定しない場合、データベース全体が更新されます。または、特定のファイルまたはディレクトリーへのパスを指定できます。次に、fapolicyd-cli --update
を使用してデータベースを更新します。
検証
たとえば、カスタムバイナリーが実行できることを確認します。
$ /tmp/ls ls
関連情報
-
fapolicyd.trust (13)
man ページ。
13.4. fapolicyd のカスタムの許可および拒否ルールの追加
fapolicyd
パッケージのデフォルトのルールセットは、システム機能に影響しません。バイナリーやスクリプトを標準以外のディレクトリーに保存する、または dnf
または rpm
インストーラーを使用せずにアプリケーションを追加するなどのカスタムシナリオでは、追加のファイルを信頼済みとしてマークするか、新しいカスタムルールを追加する必要があります。
基本的なシナリオでは、信頼の追加ソースを使用してファイルを信頼済みとしてマークする ことをお勧めします。特定のユーザーおよびグループ ID に対してのみカスタムバイナリーの実行を許可するなど、より高度なシナリオでは、新しいカスタムルールを /etc/fapolicyd/rules.d/
ディレクトリーに追加します。
次の手順は、新しいルールを追加してカスタムバイナリーを許可する方法を示しています。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
カスタムバイナリーを必要なディレクトリーにコピーします。以下に例を示します。
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
fapolicyd
サービスを停止します。# systemctl stop fapolicyd
デバッグモードを使用して、対応するルールを識別します。
fapolicyd --debug
コマンドの出力は冗長で、Ctrl+C を押すか、対応するプロセスを強制終了するだけで停止できるため、エラー出力をファイルにリダイレクトします。この場合、--debug
の代わりに--debug-deny
オプションを使用して、アクセス拒否のみに出力を制限できます。# fapolicyd --debug-deny 2> fapolicy.output & [1] 51341
または、別の端末で
fapolicyd
デバッグモードを実行できます。fapolicyd
が拒否したコマンドを繰り返します。$ /tmp/ls bash: /tmp/ls: Operation not permitted
デバッグモードをフォアグラウンドで再開し、Ctrl+C を押して停止します。
# fg fapolicyd --debug 2> fapolicy.output ^C ...
または、
fapolicyd
デバッグモードのプロセスを強制終了します。# kill 51341
アプリケーションの実行を拒否するルールを見つけます。
# cat fapolicy.output | grep 'deny_audit' ... rule=13 dec=deny_audit perm=execute auid=0 pid=6855 exe=/usr/bin/bash : path=/tmp/ls ftype=application/x-executable trust=0
カスタムバイナリーの実行を妨げたルールを含むファイルを見つけます。この場合、
deny_audit perm=execute
ルールは90-deny-execute.rules
ファイルに属します。# ls /etc/fapolicyd/rules.d/ 10-languages.rules 40-bad-elf.rules 72-shell.rules 20-dracut.rules 41-shared-obj.rules 90-deny-execute.rules 21-updaters.rules 42-trusted-elf.rules 95-allow-open.rules 30-patterns.rules 70-trusted-lang.rules # cat /etc/fapolicyd/rules.d/90-deny-execute.rules # Deny execution for anything untrusted deny_audit perm=execute all : all
/etc/fapolicyd/rules.d/
ディレクトリー内のカスタムバイナリーの実行を拒否するルールを含むルールファイルの前にあるファイルに、新しいallow
ルールを追加します。# touch /etc/fapolicyd/rules.d/80-myapps.rules # vi /etc/fapolicyd/rules.d/80-myapps.rules
以下のルールを
80-myapps.rules
ファイルに挿入します。allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0
または、
/etc/fapolicyd/rules.d/
のルールファイルに次のルールを追加して、/tmp
ディレクトリー内のすべてのバイナリーの実行を許可することもできます。allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ trust=0
カスタムバイナリーのコンテンツの変更を防ぐには、SHA-256 チェックサムを使用して必要なルールを定義します。
$ sha256sum /tmp/ls 780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836 ls
ルールを以下の定義に変更します。
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
コンパイル済みのリストが
/etc/fapolicyd/rules.d/
に設定されているルールと異なることを確認し、/etc/fapolicyd/compiled.rules
ファイルに保存されているリストを更新します。# fagenrules --check /usr/sbin/fagenrules: Rules have changed and should be updated # fagenrules --load
カスタムルールが、実行を妨げたルールの前に
fapolicyd
ルールのリストにあることを確認します。# fapolicyd-cli --list ... 13. allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0 14. deny_audit perm=execute all : all ...
fapolicyd
サービスを開始します。# systemctl start fapolicyd
検証
たとえば、カスタムバイナリーが実行できることを確認します。
$ /tmp/ls ls
関連情報
-
fapolicyd.rules (5)
およびfapolicyd-cli (1)
の man ページ。 -
/usr/share/fapolicyd/sample-rules/README-rules
ファイルのfapolicyd
パッケージでインストールされるドキュメント。
13.5. fapolicyd 整合性チェックの有効化
デフォルトでは、fapolicyd
は整合性チェックを実行しません。ファイルサイズまたは SHA-256 ハッシュのいずれかを比較して整合性チェックを実行するように fapolicyd
を設定できます。Integrity Measurement Architecture (IMA) サブシステムを使用して整合性チェックを設定することもできます。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
任意のテキストエディターで
/etc/fapolicyd/fapolicyd.conf
ファイルを開きます。以下に例を示します。# vi /etc/fapolicyd/fapolicyd.conf
整合性
オプションの値をnone
からsha256
に変更し、ファイルを保存してエディターを終了します。integrity = sha256
fapolicyd
サービスを再起動します。# systemctl restart fapolicyd
検証
検証に使用するファイルのバックアップを作成します。
# cp /bin/more /bin/more.bak
/bin/more
バイナリーの内容を変更します。# cat /bin/less > /bin/more
変更したバイナリーを一般ユーザーとして使用します。
# su example.user $ /bin/more /etc/redhat-release bash: /bin/more: Operation not permitted
変更を元に戻します。
# mv -f /bin/more.bak /bin/more
13.6. fapolicyd に関連する問題のトラブルシューティング
次のセクションでは、fapolicyd
アプリケーションフレームワークの基本的なトラブルシューティングのヒントと、rpm
コマンドを使用してアプリケーションを追加するためのガイダンスを示します。
rpm
を使用したアプリケーションのインストール
rpm
コマンドを使用してアプリケーションをインストールする場合は、fapolicyd
RPM データベースの手動更新を実行する必要があります。アプリケーション をインストールします。
# rpm -i application.rpm
データベースを更新します。
# fapolicyd-cli --update
この手順を飛ばすとシステムがフリーズする可能性があるため、再起動する必要があります。
サービスのステータス
fapolicyd
が正しく機能しない場合は、サービスステータスを確認します。# systemctl status fapolicyd
fapolicyd-cli
チェックとリスト
--check-config
、--check-watch_fs
、および--check-trustdb
オプションは、構文エラー、まだ監視されていないファイルシステム、およびファイルの不一致を見つけるのに役立ちます。次に例を示します。# fapolicyd-cli --check-config Daemon config is OK # fapolicyd-cli --check-trustdb /etc/selinux/targeted/contexts/files/file_contexts miscompares: size sha256 /etc/selinux/targeted/policy/policy.31 miscompares: size sha256
--list
オプションを使用して、ルールの現在のリストとその順序を確認します。# fapolicyd-cli --list ... 9. allow perm=execute all : trust=1 10. allow perm=open all : ftype=%languages trust=1 11. deny_audit perm=any all : ftype=%languages 12. allow perm=any all : ftype=text/x-shellscript 13. deny_audit perm=execute all : all ...
デバッグモード
デバッグモードは、一致したルール、データベースステータスなどに関する詳細情報を提供します。
fapolicyd
をデバッグモードに切り替えるには、以下を行います。fapolicyd
サービスを停止します。# systemctl stop fapolicyd
デバッグモードを使用して、対応するルールを識別します。
# fapolicyd --debug
fapolicyd --debug
コマンドの出力は冗長であるため、エラー出力をファイルにリダイレクトできます。# fapolicyd --debug 2> fapolicy.output
または、
fapolicyd
がアクセスを拒否した場合にのみ出力をエントリーに制限するには、--debug-deny
オプションを使用します。# fapolicyd --debug-deny
fapolicyd
データベースの削除
fapolicyd
データベースに関連する問題を解決するには、データベースファイルを削除してください。# systemctl stop fapolicyd # fapolicyd-cli --delete-db
警告/var/lib/fapolicyd/
ディレクトリーを削除しないでください。fapolicyd
フレームワークは、このディレクトリー内のデータベースファイルのみを自動的に復元します。
fapolicyd
データベースの削除
fapolicyd
には、有効なすべての信頼ソースからのエントリーが含まれます。データベースをダンプした後にエントリーを確認できます。# fapolicyd-cli --dump-db
アプリケーションパイプ
まれに、
fapolicyd
パイプファイルを削除するとロックアップが解決する場合があります。# rm -f /var/run/fapolicyd/fapolicyd.fifo
関連情報
-
fapolicyd-cli(1)
の man ページ
13.7. 関連情報
-
man -k fapolicyd
コマンドを使用して一覧表示されるfapolicyd
関連の man ページ。 - FOSDEM 2020 fapolicyd プレゼンテーション。
第14章 侵入型 USB デバイスに対するシステムの保護
USB デバイスには、スパイウェア、マルウェア、またはトロイの木馬が読み込まれ、データを盗んだり、システムを損傷する可能性があります。Red Hat Enterprise Linux 管理者は、USBGuard でこのような USB 攻撃を防ぐことができます。
14.1. USBGuard
USBGuard ソフトウェアフレームワークを使用すると、カーネルの USB デバイス認証機能に基づいて許可されたデバイスおよび禁止されているデバイスの基本リストを使用して、侵入型 USB デバイスからシステムを保護できます。
USBGuard フレームワークは、次を提供します。
- 動的対話およびポリシー強制向けの IPC (inter-process communication) インターフェイスを使用したシステムサービスコンポーネント
-
実行中の
usbguard
システムサービスと対話するコマンドラインインターフェイス - USB デバイス認証ポリシーを記述するルール言語
- 共有ライブラリーに実装されたシステムサービスコンポーネントと対話する C++ API
usbguard
システムサービス設定ファイル (/etc/usbguard/usbguard-daemon.conf
) には、IPC インターフェイスを使用するためのユーザーおよびグループを認証するオプションが含まれます。
システムサービスは、USBGuard パブリック IPC インターフェイスを提供します。Red Hat Enterprise Linux では、このインターフェイスへのアクセスはデフォルトで root ユーザーに限定されています。
IPC インターフェイスへのアクセスを制限するには、IPCAccessControlFiles
オプション (推奨)、IPCAllowedUsers
オプション、および IPCAllowedGroups
オプションを設定することを検討してください。
アクセス制御リスト (ACL) を未設定のままにしないでください。設定しないと、すべてのローカルユーザーに IPC インターフェイスが公開され、USB デバイスの認証状態を操作して USBGuard ポリシーを変更できるようになります。
14.2. USBGuard のインストール
この手順を使用して、USBGuard
フレームワークをインストールし、開始します。
手順
usbguard
パッケージをインストールします。# dnf install usbguard
初期ルールセットを作成します。
# usbguard generate-policy > /etc/usbguard/rules.conf
usbguard
デーモンを起動し、システムの起動時に自動的に起動することを確認します。# systemctl enable --now usbguard
検証
usbguard
サービスが実行していることを確認します。# systemctl status usbguard ● usbguard.service - USBGuard daemon Loaded: loaded (/usr/lib/systemd/system/usbguard.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2019-11-07 09:44:07 CET; 3min 16s ago Docs: man:usbguard-daemon(8) Main PID: 6122 (usbguard-daemon) Tasks: 3 (limit: 11493) Memory: 1.2M CGroup: /system.slice/usbguard.service └─6122 /usr/sbin/usbguard-daemon -f -s -c /etc/usbguard/usbguard-daemon.conf Nov 07 09:44:06 localhost.localdomain systemd[1]: Starting USBGuard daemon... Nov 07 09:44:07 localhost.localdomain systemd[1]: Started USBGuard daemon.
USBGuard
が認識する USB デバイスの一覧を表示します。# usbguard list-devices 4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...
関連情報
-
usbguard(1)
およびusbguard-daemon.conf(5)
の man ページ
14.3. CLI で USB デバイスのブロックおよび認証
この手順では、usbguard
コマンドを使用して USB デバイスを認証してブロックする方法を説明します。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
USBGuard
が認識する USB デバイスの一覧を表示します。# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
デバイス 6 を認証してシステムと対話します。
# usbguard allow-device 6
デバイス 6 の認証を解除し、削除します。
# usbguard reject-device 6
デバイス 6 の認可を解除し、保持します。
# usbguard block-device 6
USBGuard
では、block および reject は以下の意味で使用されます。
- block - 今は、このデバイスと対話しない
- reject - このデバイスを、存在しないかのように無視する
関連情報
-
usbguard(1)
の man ページ -
usbguard --help
コマンドを使用して一覧表示される組み込みヘルプ。
14.4. USB デバイスの永続的なブロックおよび認証
-p
オプションを使用すると、USB デバイスを永続的にブロックして認証できます。これにより、デバイス固有のルールが現在のポリシーに追加されます。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
usbguard
デーモンがルールの書き込みを許可するように SELinux を設定します。usbguard
に関連するsemanage
ブール値を表示します。# semanage boolean -l | grep usbguard usbguard_daemon_write_conf (off , off) Allow usbguard to daemon write conf usbguard_daemon_write_rules (on , on) Allow usbguard to daemon write rules
オプション:
usbguard_daemon_write_rules
のブール値が無効になっている場合は、有効にします。# semanage boolean -m --on usbguard_daemon_write_rules
USBGuard が認識する USB デバイスの一覧を表示します。
# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
デバイス 6 を永続的に認証してシステムと対話します。
# usbguard allow-device 6 -p
デバイス 6 の認証を完全に解除して削除します。
# usbguard reject-device 6 -p
デバイス 6 の認証を永続的に解除し、デバイスは保持します。
# usbguard block-device 6 -p
USBGuard
では、block および reject は以下の意味で使用されます。
- block - 今は、このデバイスと対話しない
- reject - このデバイスを、存在しないかのように無視する
検証
USBGuard
ルールに変更が含まれていることを確認します。# usbguard list-rules
関連情報
-
usbguard(1)
の man ページ -
usbguard --help
コマンドを使用して一覧表示される組み込みヘルプ。
14.5. USB デバイス用のカスタムポリシーの作成
以下の手順では、シナリオの要件を反映する USB デバイス用のルールセットを作成する手順を説明します。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
/etc/usbguard/rules.conf
ファイルには、usbguard generate-policy
コマンドで生成した初期ルールセットが含まれます。
手順
現在接続している USB デバイスを認証するポリシーを作成し、生成されたルールを
rules.conf
ファイルに保存します。# usbguard generate-policy --no-hashes > ./rules.conf
--no-hashes
オプションは、デバイスのハッシュ属性を生成しません。設定設定のハッシュ属性は永続的ではない可能性があるため、回避してください。選択したテキストエディターで
rules.conf
ファイルを編集します。次に例を示します。# vi ./rules.conf
必要に応じて、ルールを追加、削除、または編集します。たとえば、以下のルールを使用すると、大容量ストレージインターフェイスが 1 つあるデバイスのみがシステムと対話できます。
allow with-interface equals { 08:*:* }
詳細なルール言語の説明とその他の例は、
usbguard-rules.conf(5)
の man ページを参照してください。更新したポリシーをインストールします。
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
検証
カスタムルールがアクティブポリシーにあることを確認します。以下に例を示します。
# usbguard list-rules ... 4: allow with-interface 08:*:* ...
関連情報
-
usbguard-rules.conf(5)
man ページ
14.6. USB デバイス用に構造化されたカスタムポリシーの作成
カスタム USBGuard ポリシーは、/etc/usbguard/rules.d/
ディレクトリー内の複数の .conf
ファイルで整理できます。次に、usbguard-daemon
は、メインの rules.conf
ファイルを、ディレクトリー内の .conf
ファイルをアルファベット順で組み合わせます。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
現在接続している USB デバイスを認証するポリシーを作成し、生成されたルールを、新しい
.conf
ファイル (例:policy.conf
) ファイルに保存します。# usbguard generate-policy --no-hashes > ./policy.conf
--no-hashes
オプションは、デバイスのハッシュ属性を生成しません。設定設定のハッシュ属性は永続的ではない可能性があるため、回避してください。任意のテキストエディターで
rules.conf
ファイルを編集します。次に例を示します。# vi ./policy.conf ... allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...
選択した行を別の
.conf
ファイルに移動します。注記ファイル名の先頭にある 2 つの数字は、デーモンが設定ファイルを読み込む順序を指定します。
たとえば、キーボードのルールを新規
.conf
ファイルにコピーします。# grep "USB Keyboard" ./policy.conf > ./10keyboards.conf
新しいポリシーを
/etc/usbguard/rules.d/
ディレクトリーにインストールします。# install -m 0600 -o root -g root 10keyboards.conf /etc/usbguard/rules.d/10keyboards.conf
残りの行をメインの
rules.conf
ファイルに移動します。# grep -v "USB Keyboard" ./policy.conf > ./rules.conf
残りのルールをインストールします。
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
検証
アクティブな USBGuard ルールをすべて表示します。
# usbguard list-rules ... 15: allow id 04f2:0833 serial "" name "USB Keyboard" hash "kxM/iddRe/WSCocgiuQlVs6Dn0VEza7KiHoDeTz0fyg=" parent-hash "2i6ZBJfTl5BakXF7Gba84/Cp1gslnNc1DM6vWQpie3s=" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...
rules.conf
ファイルと、/etc/usbguard/rules.d/
ディレクトリー内の.conf
ファイルの内容をすべて表示します。# cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
- アクティブなルールに、ファイルのすべてのルールが正しく、正しい順序で含まれていることを確認します。
関連情報
-
usbguard-rules.conf(5)
man ページ
14.7. USBGuard IPC インターフェイスを使用するユーザーおよびグループの認証
この手順を使用して、特定のユーザーまたはグループが USBGuard のパブリック IPC インターフェイスを使用するように認証します。デフォルトでは、root ユーザーだけがこのインターフェイスを使用できます。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
/etc/usbguard/rules.conf
ファイルには、usbguard generate-policy
コマンドで生成した初期ルールセットが含まれます。
手順
任意のテキストエディターで
/etc/usbguard/usbguard-daemon.conf
ファイルを編集します。# vi /etc/usbguard/usbguard-daemon.conf
たとえば、
wheel
グループの全ユーザーが IPC インターフェイスを使用できるように、ルールがある行を追加して、ファイルを保存します。IPCAllowGroups=wheel
usbguard
コマンドで、ユーザーまたはグループを追加することもできます。たとえば、次のコマンドを使用すると、joesec ユーザーがDevices
セクションおよびExceptions
セクションに完全アクセスできます。さらに、joesec は現行ポリシーの一覧表示および変更を行うことができます。# usbguard add-user joesec --devices ALL --policy modify,list --exceptions ALL
joesec ユーザーに付与されたパーミッションを削除するには、
usbguard remove-user joesec
コマンドを使用します。usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
関連情報
-
usbguard(1)
およびusbguard-rules.conf(5)
の man ページ
14.8. Linux 監査ログへの USBguard 認証イベントの記録
以下の手順に従って、USBguard 認証イベントのログと標準の Linux 監査ログを 1 つにまとめます。デフォルトでは、usbguard
デーモンは /var/log/usbguard/usbguard-audit.log
ファイルにイベントを記録します。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
auditd
サービスが実行している。
手順
usbguard-daemon.conf
ファイルを、選択したテキストエディターで編集します。# vi /etc/usbguard/usbguard-daemon.conf
AuditBackend
オプションを、FileAudit
からLinuxAudit
に変更します。AuditBackend=LinuxAudit
usbguard
デーモンを再起動して、設定変更を適用します。# systemctl restart usbguard
検証
監査
デーモンログを USB 認証イベントに対してクエリーします。次に例を示します。# ausearch -ts recent -m USER_DEVICE
関連情報
-
usbguard-daemon.conf(5)
の man ページ
14.9. 関連情報
-
usbguard(1)
、usbguard-rules.conf(5)
、usbguard-daemon(8)
、およびusbguard-daemon.conf(5)
の man ページ - USBGuard ホームページ
第15章 リモートロギングソリューションの設定
環境内の各種マシンからのログをロギングサーバーに集中的に記録するために、クライアントシステムからサーバーに特定の基準に合致するログを記録するように Rsyslog アプリケーションを設定できます。
15.1. Rsyslog ロギングサービス
Rsyslog アプリケーションは、systemd-journald
サービスと組み合わせて、Red Hat Enterprise Linux でローカルおよびリモートのロギングサポートを提供します。rsyslogd
デーモンは、ジャーナルから systemd-journald
サービスが受信した syslog
メッセージを継続的に読み取り、rsyslogd
がこのような syslog
イベントにフィルターを設定して処理し、rsyslog
ログファイルに記録するか、その設定に応じて他のサービスに転送します。
rsyslogd
デーモンは、拡張されたフィルターリング、暗号化で保護されたメッセージのリレー、入出力モジュール、TCP プロトコルおよび UDP プロトコルを使用した転送のサポートも提供します。
rsyslog
の主な設定ファイルである /etc/rsyslog.conf
では、どの rsyslogd
がメッセージを処理するかに応じてルールを指定できます。通常は、ソースおよびトピック (ファシリティー) 別および緊急度 (優先度) 別にメッセージを分類し、メッセージがその基準に合致したときに実行するアクションを割り当てることができます。
/etc/rsyslog.conf
では、rsyslogd
が維持するログファイルの一覧も確認できます。ほとんどのログファイルは /var/log/
ディレクトリーにあります。httpd
、samba
などの一部のアプリケーションは、ログファイルを /var/log/
内のサブディレクトリーに保存します。
関連情報
-
man ページの
rsyslogd(8)
およびrsyslog.conf(5)
-
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。
15.2. Rsyslog ドキュメントのインストール
Rsyslog アプリケーションには、https://www.rsyslog.com/doc/ で利用可能な詳細なオンラインドキュメントがありますが、rsyslog-doc
ドキュメントパッケージをローカルにインストールすることもできます。
前提条件
-
システムで
AppStream
リポジトリーをアクティベートしている。 -
sudo
を使用して新規パッケージをインストールする権限がある。
手順
rsyslog-doc
パッケージをインストールします。# dnf install rsyslog-doc
検証
任意のブラウザーで
/usr/share/doc/rsyslog/html/index.html
ファイルを開きます。次に例を示します。$ firefox /usr/share/doc/rsyslog/html/index.html &
15.3. TCP でのリモートロギング用のサーバーの設定
Rsyslog アプリケーションを使用すると、ロギングサーバーを実行し、個別のシステムがログファイルをロギングサーバーに送信するように設定できます。TCP 経由でリモートロギングを使用するには、サーバーとクライアントの両方を設定します。サーバーは、クライアントシステムにより送信されたログを収集し、分析します。
Rsyslog アプリケーションを使用すると、ログメッセージがネットワークを介してサーバーに転送される中央ロギングシステムを維持できます。サーバーが利用できない場合にメッセージが失われないようにするには、転送アクションのアクションキューを設定します。これにより、送信に失敗したメッセージは、サーバーが再度到達可能になるまでローカルに保存されます。このようなキューは、UDP プロトコルを使用する接続用に設定できないことに注意してください。
omfwd
プラグインは、UDP または TCP による転送を提供します。デフォルトのプロトコルは UDP です。このプラグインは組み込まれているため、読み込む必要はありません。
デフォルトでは、rsyslog
はポート 514
で TCP を使用します。
前提条件
- rsyslog がサーバーシステムにインストールされている。
-
サーバーに
root
としてログインしている。 -
policycoreutils-python-utils
パッケージは、semanage
コマンドを使用して任意の手順でインストールします。 -
firewalld
サービスが実行している。
手順
オプション:
rsyslog
トラフィックに別のポートを使用するには、SELinux タイプsyslogd_port_t
をポートに追加します。たとえば、ポート30514
を有効にします。# semanage port -a -t syslogd_port_t -p tcp 30514
オプション:
rsyslog
トラフィックに別のポートを使用するには、firewalld
がそのポートでの着信rsyslog
トラフィックを許可するように設定します。たとえば、ポート30514
で TCP トラフィックを許可します。# firewall-cmd --zone=<zone-name> --permanent --add-port=30514/tcp success # firewall-cmd --reload
/etc/rsyslog.d/
ディレクトリーに新規ファイル (例:remotelog.conf
) を作成し、以下のコンテンツを挿入します。# Define templates before the rules that use them # Per-Host templates for remote systems template(name="TmplAuthpriv" type="list") { constant(value="/var/log/remote/auth/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } template(name="TmplMsg" type="list") { constant(value="/var/log/remote/msg/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } # Provides TCP syslog reception module(load="imtcp") # Adding this ruleset to process remote messages ruleset(name="remote1"){ authpriv.* action(type="omfile" DynaFile="TmplAuthpriv") *.info;mail.none;authpriv.none;cron.none action(type="omfile" DynaFile="TmplMsg") } input(type="imtcp" port="30514" ruleset="remote1")
-
/etc/rsyslog.d/remotelog.conf
ファイルへの変更を保存します。 /etc/rsyslog.conf
ファイルの構文をテストします。# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run... rsyslogd: End of config validation run. Bye.
Rsyslog
サービスがロギングサーバーで実行中で、有効になっていることを確認します。# systemctl status rsyslog
rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:
rsyslog
が有効になっていない場合は、再起動後にrsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
環境内の他のシステムからログファイルを受け取り、保存するように、ログサーバーが設定されています。
関連情報
-
rsyslogd(8)
、rsyslog.conf(5)
、semanage(8)
、およびfirewall-cmd(1)
man ページ。 -
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。
15.4. TCP 経由のサーバーへのリモートロギングの設定
以下の手順に従って、TCP プロトコルを介してサーバーにログメッセージを転送するようにシステムを設定します。omfwd
プラグインは、UDP または TCP による転送を提供します。デフォルトのプロトコルは UDP です。プラグインは組み込まれているのでロードする必要はありません。
前提条件
-
rsyslog
パッケージが、サーバーに報告する必要のあるクライアントシステムにインストールされている。 - リモートロギング用にサーバーを設定している。
- 指定したポートが SELinux で許可され、ファイアウォールで開いている。
-
システムには、
policycoreutils-python-utils
パッケージが含まれています。このパッケージは、標準以外のポートを SELinux 設定に追加するためのsemanage
コマンドを提供します。
手順
/etc/rsyslog.d/
ディレクトリーに新規ファイル (例:10-remotelog.conf
) を作成し、以下のコンテンツを挿入します。*.* action(type="omfwd" queue.type="linkedlist" queue.filename="example_fwd" action.resumeRetryCount="-1" queue.saveOnShutdown="on" target="example.com" port="30514" protocol="tcp" )
詳細は以下のようになります。
-
queue.type="linkedlist"
は、LinkedList インメモリーキューを有効にします。 -
queue.filename
はディスクストレージを定義します。バックアップファイルは、前のグローバルのworkDirectory
ディレクティブで指定された作業ディレクトリーにexample_fwd
接頭辞を付けて作成されます。 -
action.resumeRetryCount -1
設定は、サーバーが応答しない場合に接続を再試行するときにrsyslog
がメッセージを破棄しないようにします。 -
rsyslog
がシャットダウンすると、有効になっているqueue.saveOnShutdown="on"
はインメモリーデータを保存します。 最後の行は受信メッセージをすべてロギングサーバーに転送します。ポートの指定は任意です。
この設定では、
rsyslog
はメッセージをサーバーに送信しますが、リモートサーバーに到達できない場合には、メッセージをメモリーに保持します。ディスク上にあるファイルは、設定されたメモリーキュー領域がrsyslog
で不足するか、シャットダウンする必要がある場合にのみ作成されます。これにより、システムパフォーマンスが向上します。
注記Rsyslog は設定ファイル
/etc/rsyslog.d/
を字句順に処理します。-
rsyslog
サービスを再起動します。# systemctl restart rsyslog
検証
クライアントシステムがサーバーにメッセージを送信することを確認するには、以下の手順に従います。
クライアントシステムで、テストメッセージを送信します。
# logger test
サーバーシステムで、
/var/log/messages
ログを表示します。以下に例を示します。# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
hostname はクライアントシステムのホスト名です。ログには、
logger
コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
-
rsyslogd(8)
およびrsyslog.conf(5)
man ページ。 -
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。
15.5. TLS 暗号化リモートロギングの設定
デフォルトでは、Rsyslog はプレーンテキスト形式でリモートロギング通信を送信します。シナリオでこの通信チャネルのセキュリティーを確保する必要がある場合は、TLS を使用して暗号化できます。
TLS を介した暗号化されたトランスポートを使用するには、サーバーとクライアントの両方を設定します。サーバーは、クライアントシステムにより送信されたログを収集し、分析します。
ossl
ネットワークストリームドライバー (OpenSSL) または gtls
ストリームドライバー (GnuTLS) のいずれかを使用できます。
ネットワークに接続されていない、厳格な認可を受けているなど、セキュリティーが強化された別のシステムがある場合は、その別のシステムを認証局 (CA) として使用します。
前提条件
-
クライアントシステムとサーバーシステムの両方に
root
にアクセスできる。 -
rsyslog
パッケージおよびrsyslog-openssl
パッケージは、サーバーおよびクライアントシステムにインストールされている。 -
gtls
ネットワークストリームドライバーを使用する場合は、rsyslog-openssl
の代わりにrsyslog-gnutls
をインストールしてください。 -
certtool
を使用して証明書を生成する場合は、gnutls-utils
をインストールします。 ログサーバーの
/etc/pki/ca-trust/source/anchors/
ディレクトリーには、次の証明書があり、update-ca-trust
コマンドを使用してシステム設定を更新します。-
ca-cert.pem
- ログサーバーとクライアントで鍵と証明書を検証できる CA 証明書。 -
server-cert.pem
- ロギングサーバーの公開鍵。 -
server-key.pem
- ロギングサーバーの秘密鍵。
-
ログクライアントでは、次の証明書が
/etc/pki/ca-trust/source/anchors/
ディレクトリーにあり、update-ca-trust
を使用してシステム設定を更新します。-
ca-cert.pem
- ログサーバーとクライアントで鍵と証明書を検証できる CA 証明書。 -
client-cert.pem
- クライアントの公開鍵。 -
client-key.pem
- クライアントの秘密鍵。
-
手順
クライアントシステムから暗号化したログを受信するようにサーバーを設定します。
-
/etc/rsyslog.d/
ディレクトリーに、新規ファイル (securelogser.conf
など) を作成します。 通信を暗号化するには、設定ファイルに、サーバーの証明書ファイルへのパス、選択した認証方法、および TLS 暗号化に対応するストリームドライバーが含まれている必要があります。
/etc/rsyslog.d/securelogser.conf
に以下の行を追加します。# Set certificate files global( DefaultNetstreamDriverCAFile="/etc/pki/ca-trust/source/anchors/ca-cert.pem" DefaultNetstreamDriverCertFile="/etc/pki/ca-trust/source/anchors/server-cert.pem" DefaultNetstreamDriverKeyFile="/etc/pki/ca-trust/source/anchors/server-key.pem" ) # TCP listener module( load="imtcp" PermittedPeer=["client1.example.com", "client2.example.com"] StreamDriver.AuthMode="x509/name" StreamDriver.Mode="1" StreamDriver.Name="ossl" ) # Start up listener at port 514 input( type="imtcp" port="514" )
注記GnuTLS ドライバーが必要な場合は、
StreamDriver.Name="gtls"
設定オプションを使用します。x509/name
よりも厳密ではない認証モードの詳細は、rsyslog-doc
にインストールされているドキュメントを参照してください。-
変更を
/etc/rsyslog.d/securelogser.conf
ファイルに保存します。 /etc/rsyslog.conf
ファイルの構文と/etc/rsyslog.d/
ディレクトリー内のすべてのファイルを確認します。# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run (level 1)... rsyslogd: End of config validation run. Bye.
Rsyslog
サービスがロギングサーバーで実行中で、有効になっていることを確認します。# systemctl status rsyslog
rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:rsyslog が有効になっていない場合は、再起動後に
rsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
-
暗号化したログをサーバーに送信するようにクライアントを設定するには、以下のコマンドを実行します。
-
クライアントシステムで、
/etc/rsyslog.d/
ディレクトリーに、新規ファイル (securelogcli.conf
など) を作成します。 /etc/rsyslog.d/securelogcli.conf
に以下の行を追加します。# Set certificate files global( DefaultNetstreamDriverCAFile="/etc/pki/ca-trust/source/anchors/ca-cert.pem" DefaultNetstreamDriverCertFile="/etc/pki/ca-trust/source/anchors/client-cert.pem" DefaultNetstreamDriverKeyFile="/etc/pki/ca-trust/source/anchors/client-key.pem" ) # Set up the action for all messages *.* action( type="omfwd" StreamDriver="ossl" StreamDriverMode="1" StreamDriverPermittedPeers="server.example.com" StreamDriverAuthMode="x509/name" target="server.example.com" port="514" protocol="tcp" )
注記GnuTLS ドライバーが必要な場合は、
StreamDriver.Name="gtls"
設定オプションを使用します。-
変更を
/etc/rsyslog.d/securelogser.conf
ファイルに保存します。 /etc/rsyslog.conf
ファイルの構文と/etc/rsyslog.d/
ディレクトリー内のその他のファイルを確認します。# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run (level 1)... rsyslogd: End of config validation run. Bye.
Rsyslog
サービスがロギングサーバーで実行中で、有効になっていることを確認します。# systemctl status rsyslog
rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:rsyslog が有効になっていない場合は、再起動後に
rsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
-
クライアントシステムで、
検証
クライアントシステムがサーバーにメッセージを送信することを確認するには、以下の手順に従います。
クライアントシステムで、テストメッセージを送信します。
# logger test
サーバーシステムで、
/var/log/messages
ログを表示します。以下に例を示します。# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
hostname
はクライアントシステムのホスト名に置き換えます。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
-
certtool(1)
、openssl(1)
、update-ca-trust(8)
、rsyslogd(8)
、およびrsyslog.conf(5)
man ページ -
/usr/share/doc/rsyslog/html/index.html
にrsyslog-doc
パッケージでインストールされたドキュメント。 - TLS での logging システムロールの使用
15.6. UDP でリモートロギング情報を受信するためのサーバー設定
Rsyslog アプリケーションを使用すると、リモートシステムからロギング情報を受信するようにシステムを設定できます。UDP 経由でリモートロギングを使用するには、サーバーとクライアントの両方を設定します。受信サーバーは、クライアントシステムが送信したログの収集および分析を行います。デフォルトでは、rsyslog
はポート 514
で UDP を使用して、リモートシステムからログ情報を受信します。
以下の手順に従って、UDP プロトコルでクライアントシステムが送信したログの収集および分析を行うサーバーを設定します。
前提条件
- rsyslog がサーバーシステムにインストールされている。
-
サーバーに
root
としてログインしている。 -
policycoreutils-python-utils
パッケージは、semanage
コマンドを使用して任意の手順でインストールします。 -
firewalld
サービスが実行している。
手順
オプション:デフォルトのポート
514
以外のrsyslog
トラフィックに別のポートを使用するには、次のコマンドを実行します。SELinux ポリシー設定に
syslogd_port_t
SELinux タイプを追加し、portno
はrsyslog
で使用するポート番号に置き換えます。# semanage port -a -t syslogd_port_t -p udp portno
rsyslog
の受信トラフィックを許可するようにfirewalld
を設定します。portno
はポート番号に、zone
はrsyslog
が使用するゾーンに置き換えます。# firewall-cmd --zone=zone --permanent --add-port=portno/udp success # firewall-cmd --reload
ファイアウォールルールを再読み込みします。
# firewall-cmd --reload
/etc/rsyslog.d/
ディレクトリーに.conf
の新規ファイル (例:remotelogserv.conf
) を作成し、以下のコンテンツを挿入します。# Define templates before the rules that use them # Per-Host templates for remote systems template(name="TmplAuthpriv" type="list") { constant(value="/var/log/remote/auth/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } template(name="TmplMsg" type="list") { constant(value="/var/log/remote/msg/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } # Provides UDP syslog reception module(load="imudp") # This ruleset processes remote messages ruleset(name="remote1"){ authpriv.* action(type="omfile" DynaFile="TmplAuthpriv") *.info;mail.none;authpriv.none;cron.none action(type="omfile" DynaFile="TmplMsg") } input(type="imudp" port="514" ruleset="remote1")
514
は、rsyslog
がデフォルトで使用するポート番号です。代わりに別のポートを指定できます。/etc/rsyslog.conf
ファイルの構文と/etc/rsyslog.d/
ディレクトリー内の全.conf
ファイルを確認します。# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run...
rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:
rsyslog
が有効になっていない場合は、再起動後にrsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
関連情報
-
rsyslogd(8)
、rsyslog.conf(5)
、semanage(8)
、およびfirewall-cmd(1)
man ページ。 -
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。
15.7. UDP 経由のサーバーへのリモートロギングの設定
以下の手順に従って、UDP プロトコルを介してサーバーにログメッセージを転送するようにシステムを設定します。omfwd
プラグインは、UDP または TCP による転送を提供します。デフォルトのプロトコルは UDP です。プラグインは組み込まれているのでロードする必要はありません。
前提条件
-
rsyslog
パッケージが、サーバーに報告する必要のあるクライアントシステムにインストールされている。 - UDP でリモートロギング情報を受信するためのサーバー設定 で説明されているように、リモートロギング用にサーバーを設定している。
手順
/etc/rsyslog.d/
ディレクトリーに.conf
の新規ファイル (例:10-remotelogcli.conf
) を作成し、以下のコンテンツを挿入します。*.* action(type="omfwd" queue.type="linkedlist" queue.filename="example_fwd" action.resumeRetryCount="-1" queue.saveOnShutdown="on" target="example.com" port="portno" protocol="udp" )
詳細は以下のようになります。
-
queue.type="linkedlist"
は、LinkedList インメモリーキューを有効にします。 -
queue.filename
はディスクストレージを定義します。バックアップファイルは、前のグローバルのworkDirectory
ディレクティブで指定された作業ディレクトリーにexample_fwd
接頭辞を付けて作成されます。 -
action.resumeRetryCount -1
設定は、サーバーが応答しない場合に接続を再試行するときにrsyslog
がメッセージを破棄しないようにします。 -
rsyslog
がシャットダウンすると、有効になっている queue.saveOnShutdown="on"
はインメモリーデータを保存します。 -
portno
は、rsyslog
で使用するポート番号です。デフォルト値は514
です。 最後の行は受信メッセージをすべてロギングサーバーに転送します。ポートの指定は任意です。
この設定では、
rsyslog
はメッセージをサーバーに送信しますが、リモートサーバーに到達できない場合には、メッセージをメモリーに保持します。ディスク上にあるファイルは、設定されたメモリーキュー領域がrsyslog
で不足するか、シャットダウンする必要がある場合にのみ作成されます。これにより、システムパフォーマンスが向上します。
注記Rsyslog は設定ファイル
/etc/rsyslog.d/
を字句順に処理します。-
rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:
rsyslog
が有効になっていない場合は、再起動後にrsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
検証
クライアントシステムがサーバーにメッセージを送信することを確認するには、以下の手順に従います。
クライアントシステムで、テストメッセージを送信します。
# logger test
サーバーシステムで、
/var/log/remote/msg/hostname/root.log
ログを表示します。以下に例を示します。# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
hostname
はクライアントシステムのホスト名です。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
-
rsyslogd(8)
およびrsyslog.conf(5)
man ページ。 -
/usr/share/doc/rsyslog/html/index.html
にrsyslog-doc
パッケージでインストールされたドキュメント。
15.8. rsyslog の負荷分散ヘルパー
RebindInterval
設定では、現行接続を切断して再確立する間隔を指定します。この設定は、TCP、UDP、および RELP のトラフィックに適用されます。ロードバランサーはこれを新しい接続と認識し、メッセージを別の物理ターゲットシステムに転送します。
RebindInterval
設定は、ターゲットシステムの IP アドレスが変更した場合にシナリオで役に立ちます。Rsyslog アプリケーションは、接続の確立時に IP アドレスをキャッシュするため、メッセージは同じサーバーに送信されます。IP アドレスが変更すると、Rsyslog サービスが再起動するまで UDP パケットが失われます。接続を再確立すると、IP が DNS により再度解決されます。
action(type=”omfwd” protocol=”tcp” RebindInterval=”250” target=”example.com” port=”514” …) action(type=”omfwd” protocol=”udp” RebindInterval=”250” target=”example.com” port=”514” …) action(type=”omrelp” RebindInterval=”250” target=”example.com” port=”6514” …)
15.9. 信頼できるリモートロギングの設定
Reliable Event Logging Protocol (RELP) を使用すると、メッセージ損失のリスクを大幅に軽減して TCP で syslog
メッセージを送受信できます。RELP は、信頼できるイベントメッセージを配信するので、メッセージ損失が許されない環境で有用です。RELP を使用するには、imrelp
の入力モジュール (サーバー上での実行とログの受信) と omrelp
出力モジュール (クライアント上での実行とロギングサーバーへのログの送信) を設定します。
前提条件
-
rsyslog
パッケージ、librelp
パッケージ、およびrsyslog-relp
パッケージをサーバーおよびクライアントシステムにインストールしている。 - 指定したポートが SELinux で許可され、ファイアウォール設定で開放されている。
手順
信頼できるリモートロギング用にクライアントシステムを設定します。
クライアントシステムの
/etc/rsyslog.d/
ディレクトリーに、relpclient.conf
などと名前を指定して新しい.conf
ファイルを作成し、以下のコンテンツを挿入します。module(load="omrelp") *.* action(type="omrelp" target="_target_IP_" port="_target_port_")
詳細は以下のようになります。
-
target_IP
は、ロギングサーバーの IP アドレスに置き換えます。 -
target_port
はロギングサーバーのポートに置き換えます。
-
-
変更を
/etc/rsyslog.d/relpclient.conf
ファイルに保存します。 rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:
rsyslog
が有効になっていない場合は、再起動後にrsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
信頼できるリモートロギング用にサーバーシステムを設定します。
サーバーシステムの
/etc/rsyslog.d/
ディレクトリーに、relpserv.conf
などと名前を指定して新しい.conf
ファイルを作成し、以下のコンテンツを挿入します。ruleset(name="relp"){ *.* action(type="omfile" file="_log_path_") } module(load="imrelp") input(type="imrelp" port="_target_port_" ruleset="relp")
詳細は以下のようになります。
-
log_path
は、メッセージを保存するパスを指定します。 -
target_port
はロギングサーバーのポートに置き換えます。クライアント設定ファイルと同じ値を使用します。
-
-
/etc/rsyslog.d/relpserv.conf
ファイルへの変更を保存します。 rsyslog
サービスを再起動します。# systemctl restart rsyslog
オプション:
rsyslog
が有効になっていない場合は、再起動後にrsyslog
サービスが自動的に起動するようにします。# systemctl enable rsyslog
検証
クライアントシステムがサーバーにメッセージを送信することを確認するには、以下の手順に従います。
クライアントシステムで、テストメッセージを送信します。
# logger test
サーバーシステムで、指定された
log_path
でログを表示します。以下に例を示します。# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
hostname
はクライアントシステムのホスト名です。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
-
rsyslogd(8)
およびrsyslog.conf(5)
man ページ。 -
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。
15.10. サポート対象の Rsyslog モジュール
Rsyslog アプリケーションの機能を拡張するために、特定のモジュールを使用できます。モジュールは、追加の入力 (入力モジュール)、出力 (出力モジュール)、およびその他の機能を提供します。モジュールは、モジュールの読み込み後に利用可能な設定ディレクティブを追加で提供することも可能です。
以下のコマンドを使用して、システムにインストールされている入出力モジュールを一覧表示できます。
# ls /usr/lib64/rsyslog/{i,o}m*
rsyslog-doc
パッケージをインストールした後、/usr/share/doc/rsyslog/html/configuration/modules/idx_output.html
ファイルで使用可能なすべての rsyslog
モジュールのリストを表示できます。
15.11. カーネルメッセージをリモートホストに記録するように netconsole サービスを設定
ディスクへのログインやシリアルコンソールの使用ができない場合は、netconsole
カーネルモジュールおよび同じ名前のサービスを使用して、ネットワーク経由でカーネルメッセージをリモートの rsyslog
サービスに記録できます。
前提条件
-
rsyslog
などのシステムログサービスがリモートホストにインストールされている。 - リモートシステムログサービスは、このホストから受信ログエントリーを受け取るように設定されています。
手順
netconsole-service
パッケージをインストールします。# dnf install netconsole-service
/etc/sysconfig/netconsole
ファイルを編集し、SYSLOGADDR
パラメーターをリモートホストの IP アドレスに設定します。# SYSLOGADDR=192.0.2.1
netconsole
サービスを有効にして起動します。# systemctl enable --now netconsole
検証手順
-
リモートシステムログサーバーの
/var/log/messages
ファイルを表示します。
関連情報
15.12. 関連情報
-
/usr/share/doc/rsyslog/html/index.html
ファイルにrsyslog-doc
パッケージでインストールされたドキュメント。 -
rsyslog.conf(5)
およびrsyslogd(8)
man ページ - ナレッジベースの記事 Configuring system logging without journald
- ナレッジベースの記事 Negative effects of the RHEL default logging setup on performance and their mitigations
- Logging System Role の使用 の章
第16章 Logging
システムロールの使用
システム管理者は、Logging
システムロールを使用して、RHEL ホストをロギングサーバーとして設定し、多くのクライアントシステムからログを収集できます。
16.1. Logging
システムロール
Logging
システムロールを使用すると、ローカルおよびリモートホストにロギング設定をデプロイできます。
Logging
システムロールを 1 つ以上のシステムに適用するには、Playbook でロギング設定を定義します。Playbook は、1 つ以上の play の一覧です。Playbook は YAML 形式で表現され、人が判読できるようになっています。Playbook の詳細は、Ansible ドキュメントの Working with playbooks を参照してください。
Playbook に従って設定するシステムのセットは、インベントリーファイル で定義されます。インベントリーの作成および使用に関する詳細は、Ansible ドキュメントの How to build your inventory を参照してください。
ロギングソリューションは、ログと複数のロギング出力を読み取る複数の方法を提供します。
たとえば、ロギングシステムは以下の入力を受け取ることができます。
- ローカルファイル
-
systemd/journal
- ネットワーク上で別のロギングシステム
さらに、ロギングシステムでは以下を出力できます。
-
/var/log
ディレクトリーのローカルファイルに保存されているログ - Elasticsearch に送信されたログ
- 別のロギングシステムに転送されたログ
Logging
システムロールでは、シナリオに合わせて入出力を組み合わせることができます。たとえば、journal
からの入力をローカルのファイルに保存しつつも、複数のファイルから読み込んだ入力を別のロギングシステムに転送してそのローカルのログファイルに保存するようにロギングソリューションを設定できます。
16.2. Logging
システムロールのパラメーター
logging
システムロール Playbook では、logging_inputs
パラメーターで入力を、logging_outputs
パラメーターで出力を、そして logging_flows
パラメーターで入力と出力の関係を定義します。Logging
システムロールは、ロギングシステムの追加設定オプションで、上記の変数を処理します。暗号化や自動ポート管理を有効にすることもできます。
現在、Logging
システムロールで利用可能な唯一のロギングシステムは Rsyslog です。
logging_inputs
:ロギングソリューションの入力一覧。-
name
:入力の一意の名前。logging_flows
での使用: 入力一覧および生成されたconfig
ファイル名の一部で使用されます。 type
:入力要素のタイプ。type は、roles/rsyslog/{tasks,vars}/inputs/
のディレクトリー名に対応するタスクタイプを指定します。basics
:systemd
ジャーナルまたはunix
ソケットからの入力を設定する入力。-
kernel_message
:true
に設定されている場合は、imklog
をロードします。デフォルトはfalse
です。 -
use_imuxsock
:imjournal
の代わりにimuxsock
を使用します。デフォルトはfalse
です。 -
ratelimit_burst
:ratelimit_interval
内に出力できるメッセージの最大数。use_imuxsock
が false の場合、デフォルトで20000
に設定されます。use_imuxsock
が true の場合、デフォルトで200
に設定されます。 -
ratelimit_interval
:ratelimit_burst
を評価する間隔。use_imuxsock
が false の場合、デフォルトで 600 秒に設定されます。use_imuxsock
が true の場合、デフォルトで 0 に設定されます。0 はレート制限がオフであることを示します。 -
persist_state_interval
:ジャーナルの状態は、value
メッセージごとに永続化されます。デフォルトは10
です。use_imuxsock
が false の場合のみ、有効です。
-
-
files
:ローカルファイルからの入力を設定する入力。 -
remote
:ネットワークを介して他のロギングシステムからの入力を設定する入力。
-
state
:設定ファイルの状態。present
またはabsent
。デフォルトはpresent
です。
-
logging_outputs
:ロギングソリューションの出力一覧。-
files
:ローカルファイルへの出力を設定する出力。 -
forwards
:別のロギングシステムへの出力を設定する出力。 -
remote_files
:別のロギングシステムからの出力をローカルファイルに設定する出力。
-
logging_flows
:logging_inputs
およびlogging_outputs
の関係を定義するフローの一覧。logging_flows
変数には以下が含まれます。-
name
:フローの一意の名前。 -
inputs
:logging_inputs
名の値の一覧。 -
outputs
:logging_outputs
名の値の一覧。
-
-
logging_manage_firewall
:true
に設定すると、変数はfirewall
ロールを使用して、logging
ロール内からのポートアクセスを自動的に管理します。 -
logging_manage_selinux
:true
に設定すると、変数はselinux
ロールを使用して、logging
ロール内からポートアクセスを自動的に管理します。
関連情報
-
rhel-system-roles
パッケージでインストールされたドキュメント (/usr/share/ansible/roles/rhel-system-roles.logging/README.html
)
16.3. ローカルの Logging
システムロールの適用
Ansible Playbook を準備して適用し、別のマシンにロギングソリューションを設定します。各マシンはログをローカルに記録します。
前提条件
-
Logging システムロールを設定する
管理対象ノード
1 つ以上へのアクセスおよびパーミッション。 コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
コントロールノードでは、
-
ansible-core
パッケージおよびrhel-system-roles
パッケージがインストールされている。
-
RHEL 8.0-8.5 では、別の Ansible リポジトリーへのアクセス権を指定されており、Ansible をベースにする自動化用の Ansible Engine 2.9 が含まれています。Ansible Engine には、ansible
、ansible-playbook
などのコマンドラインユーティリティー、docker
や podman
などのコネクター、プラグインとモジュールが多く含まれています。Ansible Engine を入手してインストールする方法については、ナレッジベースの How to download and install Red Hat Ansible Engine を参照してください。
RHEL 8.6 および 9.0 では、Ansible Core (ansible-core
パッケージとして提供) が導入されました。これには、Ansible コマンドラインユーティリティー、コマンド、およびビルトイン Ansible プラグインのセットが含まれています。RHEL は、AppStream リポジトリーを介してこのパッケージを提供し、サポート範囲は限定的です。詳細については、ナレッジベースの Scope of support for the Ansible Core package included in the RHEL 9 and RHEL 8.6 and later AppStream repositories を参照してください。
- 管理対象ノードが記載されているインベントリーファイルがある。
デプロイメント時にシステムロールが rsyslog
をインストールするため、rsyslog
パッケージをインストールする必要はありません。
手順
必要なロールを定義する Playbook を作成します。
新しい YAML ファイルを作成し、これをテキストエディターで開きます。以下に例を示します。
# vi logging-playbook.yml
以下の内容を挿入します。
--- - name: Deploying basics input and implicit files output hosts: all roles: - rhel-system-roles.logging vars: logging_inputs: - name: system_input type: basics logging_outputs: - name: files_output type: files logging_flows: - name: flow1 inputs: [system_input] outputs: [files_output]
特定のインベントリーで Playbook を実行します。
# ansible-playbook -i inventory-file /path/to/file/logging-playbook.yml
詳細は以下のようになります。
-
inventory-file
はインベントリーファイルに置き換えます。 -
logging-playbook.yml
は、使用する Playbook に置き換えます。
-
検証
/etc/rsyslog.conf
ファイルの構文をテストします。# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.
システムがログにメッセージを送信していることを確認します。
テストメッセージを送信します。
# logger test
/var/log/messages ログ
を表示します。以下に例を示します。# cat /var/log/messages Aug 5 13:48:31 hostname root[6778]: test
`hostname` はクライアントシステムのホスト名です。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合は
root
) が含まれていることに注意してください。
16.4. ローカルの Logging
システムロールでのログのフィルターリング
rsyslog
プロパティーベースのフィルターをもとにログをフィルターするロギングソリューションをデプロイできます。
前提条件
-
Logging システムロールを設定する
管理対象ノード
1 つ以上へのアクセスおよびパーミッション。 コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
コントロールノードでは、
- Red Hat Ansible Core がインストールされている。
-
rhel-system-roles
パッケージがインストールされている。 - 管理対象ノードが記載されているインベントリーファイルがある。
デプロイメント時にシステムロールが rsyslog
をインストールするため、rsyslog
パッケージをインストールする必要はありません。
手順
以下の内容を含む新しい
playbook.yml
ファイルを作成します。--- - name: Deploying files input and configured files output hosts: all roles: - linux-system-roles.logging vars: logging_inputs: - name: files_input type: basics logging_outputs: - name: files_output0 type: files property: msg property_op: contains property_value: error path: /var/log/errors.log - name: files_output1 type: files property: msg property_op: "!contains" property_value: error path: /var/log/others.log logging_flows: - name: flow0 inputs: [files_input] outputs: [files_output0, files_output1]
この設定を使用すると、
error
文字列を含むメッセージはすべて/var/log/errors.log
に記録され、その他のメッセージはすべて/var/log/others.log
に記録されます。error
プロパティーの値はフィルターリングする文字列に置き換えることができます。設定に合わせて変数を変更できます。
オプション:Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory_file /path/to/file/playbook.yml
検証
/etc/rsyslog.conf
ファイルの構文をテストします。# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.
システムが
error
文字列を含むメッセージをログに送信していることを確認します。テストメッセージを送信します。
# logger error
以下のように
/var/log/errors.log
ログを表示します。# cat /var/log/errors.log Aug 5 13:48:31 hostname root[6778]: error
hostname
はクライアントシステムのホスト名に置き換えます。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
-
rhel-system-roles
パッケージでインストールされたドキュメント (/usr/share/ansible/roles/rhel-system-roles.logging/README.html
)
16.5. Logging
システムロールを使用したリモートロギングソリューションの適用
以下の手順に従って、Red Hat Ansible Core Playbook を準備および適用し、リモートロギングソリューションを設定します。この Playbook では、1 つ以上のクライアントが systemd-journal
からログを取得し、リモートサーバーに転送します。サーバーは、remote_rsyslog
および remote_files
からリモート入力を受信し、リモートホスト名によって名付けられたディレクトリーのローカルファイルにログを出力します。
前提条件
-
Logging システムロールを設定する
管理対象ノード
1 つ以上へのアクセスおよびパーミッション。 コントロールノード (このシステムから Red Hat Ansible Core は他のシステムを設定) へのアクセスおよびパーミッション。
コントロールノードでは、
-
ansible-core
パッケージおよびrhel-system-roles
パッケージがインストールされている。 - 管理対象ノードが記載されているインベントリーファイルがある。
-
デプロイメント時にシステムロールが rsyslog
をインストールするため、rsyslog
パッケージをインストールする必要はありません。
手順
必要なロールを定義する Playbook を作成します。
新しい YAML ファイルを作成し、これをテキストエディターで開きます。以下に例を示します。
# vi logging-playbook.yml
以下の内容をファイルに挿入します。
--- - name: Deploying remote input and remote_files output hosts: server roles: - rhel-system-roles.logging vars: logging_inputs: - name: remote_udp_input type: remote udp_ports: [ 601 ] - name: remote_tcp_input type: remote tcp_ports: [ 601 ] logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: flow_0 inputs: [remote_udp_input, remote_tcp_input] outputs: [remote_files_output] - name: Deploying basics input and forwards output hosts: clients roles: - rhel-system-roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: forward_output0 type: forwards severity: info target: _host1.example.com_ udp_port: 601 - name: forward_output1 type: forwards facility: mail target: _host1.example.com_ tcp_port: 601 logging_flows: - name: flows0 inputs: [basic_input] outputs: [forward_output0, forward_output1] [basic_input] [forward_output0, forward_output1]
host1.example.com
はロギングサーバーに置き換えます。注記必要に応じて、Playbook のパラメーターを変更することができます。
警告ロギングソリューションは、サーバーまたはクライアントシステムの SELinux ポリシーで定義され、ファイアウォールで開放されたポートでしか機能しません。デフォルトの SELinux ポリシーには、ポート 601、514、6514、10514、および 20514 が含まれます。別のポートを使用するには、クライアントシステムおよびサーバーシステムで SELinux ポリシーを変更 します。
サーバーおよびクライアントを一覧表示するインベントリーファイルを作成します。
新しいファイルを作成してテキストエディターで開きます。以下に例を示します。
# vi inventory.ini
以下のコンテンツをインベントリーファイルに挿入します。
[servers] server ansible_host=host1.example.com [clients] client ansible_host=host2.example.com
詳細は以下のようになります。
-
host1.example.com
はロギングサーバーです。 -
host2.example.com
はロギングクライアントです。
-
インベントリーで Playbook を実行します。
# ansible-playbook -i /path/to/file/inventory.ini /path/to/file/_logging-playbook.yml
詳細は以下のようになります。
-
inventory.ini
はインベントリーファイルに置き換えます。 -
logging-playbook.yml
は作成した Playbook に置き換えます。
-
検証
クライアントとサーバーシステムの両方で、
/etc/rsyslog.conf
ファイルの構文をテストします。# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf rsyslogd: End of config validation run. Bye.
クライアントシステムがサーバーにメッセージを送信することを確認します。
クライアントシステムで、テストメッセージを送信します。
# logger test
サーバーシステムで、
/var/log/messages
ログを表示します。以下に例を示します。# cat /var/log/messages Aug 5 13:48:31 host2.example.com root[6778]: test
host2.example.com
は、クライアントシステムのホスト名です。ログには、logger コマンドを入力したユーザーのユーザー名 (この場合はroot
) が含まれていることに注意してください。
関連情報
- Preparing a control node and managed nodes to use RHEL System Roles
-
rhel-system-roles
パッケージでインストールされたドキュメント (/usr/share/ansible/roles/rhel-system-roles.logging/README.html
) - RHEL システムロール のナレッジベース記事
16.6. TLS での logging
システムロールの使用
Transport Layer Security (TLS) は、コンピューターネットワーク上で安全に通信するために設計された暗号プロトコルです。
管理者は、logging
RHEL システムロールを使用し、Red Hat Ansible Automation Platform を使用したセキュアなログ転送を設定できます。
16.6.1. TLS を使用したクライアントロギングの設定
logging
システムロールを使用して、ローカルマシンにログインしている RHEL システムでロギングを設定し、Ansible Playbook を実行して、ログを TLS でリモートロギングシステムに転送できます。
この手順では、Ansible インベントリーの client グループ内の全ホストに TLS を設定します。TLS プロトコルは、メッセージ送信を暗号化し、ネットワーク経由でログを安全に転送します。
前提条件
- TLS を設定する管理ノードで Playbook の実行権限がある。
- 管理対象ノードがコントロールノードのインベントリーファイルに記載されている。
-
ansible
パッケージおよびrhel-system-roles
パッケージがコントロールノードにインストールされている。
手順
以下の内容を含む
playbook.yml
ファイルを作成します。--- - name: Deploying files input and forwards output with certs hosts: clients roles: - rhel-system-roles.logging vars: logging_pki_files: - ca_cert_src: /local/path/to/ca_cert.pem cert_src: /local/path/to/cert.pem private_key_src: /local/path/to/key.pem logging_inputs: - name: input_name type: files input_log_path: /var/log/containers/*.log logging_outputs: - name: output_name type: forwards target: your_target_host tcp_port: 514 tls: true pki_authmode: x509/name permitted_server: 'server.example.com' logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
Playbook は以下のパラメーターを使用します。
logging_pki_files
-
このパラメーターを使用して、TLS を設定し、
ca_cert_src
、cert_src
およびprivate_key_src
パラメーターを指定する必要があります。 ca_cert
-
CA 証明書へのパスを表します。デフォルトのパスは
/etc/pki/tls/certs/ca.pem
で、ファイル名はユーザーが設定します。 cert
-
証明書へのパスを表します。デフォルトのパスは
/etc/pki/tls/certs/server-cert.pem
で、ファイル名はユーザーが設定します。 private_key
-
秘密鍵へのパスを表します。デフォルトのパスは
/etc/pki/tls/private/server-key.pem
で、ファイル名はユーザーが設定します。 ca_cert_src
-
ローカルの CA 証明書ファイルパスを表します。これはターゲットホストにコピーされます。
ca_cert
を指定している場合は、その場所にコピーされます。 cert_src
-
ローカルの証明書ファイルパスを表します。これはターゲットホストにコピーされます。
cert
を指定している場合には、その証明書が場所にコピーされます。 private_key_src
-
ローカルキーファイルのパスを表します。これはターゲットホストにコピーされます。
private_key
を指定している場合は、その場所にコピーされます。 tls
-
このパラメーターを使用すると、ネットワーク経由でログを安全に転送できるようになります。セキュアなラッパーが必要ない場合は、
tls: true
と設定できます。
Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory_file playbook.yml
16.6.2. TLS を使用したサーバーロギングの設定
logging
システムロールを使用して、RHEL システムのログインをサーバーとして設定し、Ansible Playbook を実行して TLS でリモートロギングシステムからログを受信できます。
以下の手順では、Ansible インベントリーの server グループ内の全ホストに TLS を設定します。
前提条件
- TLS を設定する管理ノードで Playbook の実行権限がある。
- 管理対象ノードがコントロールノードのインベントリーファイルに記載されている。
-
ansible
パッケージおよびrhel-system-roles
パッケージがコントロールノードにインストールされている。
手順
以下の内容を含む
playbook.yml
ファイルを作成します。--- - name: Deploying remote input and remote_files output with certs hosts: server roles: - rhel-system-roles.logging vars: logging_pki_files: - ca_cert_src: /local/path/to/ca_cert.pem cert_src: /local/path/to/cert.pem private_key_src: /local/path/to/key.pem logging_inputs: - name: input_name type: remote tcp_ports: 514 tls: true permitted_clients: ['clients.example.com'] logging_outputs: - name: output_name type: remote_files remote_log_path: /var/log/remote/%FROMHOST%/%PROGRAMNAME:::secpath-replace%.log async_writing: true client_count: 20 io_buffer_size: 8192 logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
Playbook は以下のパラメーターを使用します。
logging_pki_files
-
このパラメーターを使用して、TLS を設定し、
ca_cert_src
、cert_src
およびprivate_key_src
パラメーターを指定する必要があります。 ca_cert
-
CA 証明書へのパスを表します。デフォルトのパスは
/etc/pki/tls/certs/ca.pem
で、ファイル名はユーザーが設定します。 cert
-
証明書へのパスを表します。デフォルトのパスは
/etc/pki/tls/certs/server-cert.pem
で、ファイル名はユーザーが設定します。 private_key
-
秘密鍵へのパスを表します。デフォルトのパスは
/etc/pki/tls/private/server-key.pem
で、ファイル名はユーザーが設定します。 ca_cert_src
-
ローカルの CA 証明書ファイルパスを表します。これはターゲットホストにコピーされます。
ca_cert
を指定している場合は、その場所にコピーされます。 cert_src
-
ローカルの証明書ファイルパスを表します。これはターゲットホストにコピーされます。
cert
を指定している場合には、その証明書が場所にコピーされます。 private_key_src
-
ローカルキーファイルのパスを表します。これはターゲットホストにコピーされます。
private_key
を指定している場合は、その場所にコピーされます。 tls
-
このパラメーターを使用すると、ネットワーク経由でログを安全に転送できるようになります。セキュアなラッパーが必要ない場合は、
tls: true
と設定できます。
Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory_file playbook.yml
16.7. RELP での logging
システムロールの使用
Reliable Event Logging Protocol (RELP) とは、TCP ネットワークを使用する、データとメッセージロギング用のネットワーキングプロトコルのことです。イベントメッセージを確実に配信するので、メッセージの損失が許されない環境で使用できます。
RELP の送信側はコマンド形式でログエントリーを転送し、受信側は処理後に確認応答します。RELP は、一貫性を保つために、転送されたコマンドごとにトランザクション番号を保存し、各種メッセージの復旧します。
RELP Client と RELP Server の間に、リモートロギングシステムを検討することができます。RELP Client はリモートロギングシステムにログを転送し、RELP Server はリモートロギングシステムから送信されたすべてのログを受け取ります。
管理者は logging
システムロールを使用して、ログエントリーが確実に送受信されるようにロギングシステムを設定することができます。
16.7.1. RELP を使用したクライアントロギングの設定
logging
システムロールを使用して、ローカルマシンにログインしている RHEL システムでロギングを設定し、Ansible Playbook を実行して、ログを RELP でリモートロギングシステムに転送できます。
この手順では、Ansible インベントリーの client
グループ内の全ホストに RELP を設定します。RELP 設定は Transport Layer Security (TLS) を使用して、メッセージ送信を暗号化し、ネットワーク経由でログを安全に転送します。
前提条件
- RELP を設定する管理ノードで Playbook の実行権限がある。
- 管理対象ノードがコントロールノードのインベントリーファイルに記載されている。
-
ansible
パッケージおよびrhel-system-roles
パッケージがコントロールノードにインストールされている。
手順
以下の内容を含む
playbook.yml
ファイルを作成します。--- - name: Deploying basic input and relp output hosts: clients roles: - rhel-system-roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: relp_client type: relp target: _logging.server.com_ port: 20514 tls: true ca_cert: _/etc/pki/tls/certs/ca.pem_ cert: _/etc/pki/tls/certs/client-cert.pem_ private_key: _/etc/pki/tls/private/client-key.pem_ pki_authmode: name permitted_servers: - '*.server.example.com' logging_flows: - name: _example_flow_ inputs: [basic_input] outputs: [relp_client]
Playbook は、以下の設定を使用します。
-
target
:リモートロギングシステムが稼働しているホスト名を指定する必須パラメーターです。 -
port
:リモートロギングシステムがリッスンしているポート番号です。 tls
:ネットワーク上でログをセキュアに転送します。セキュアなラッパーが必要ない場合は、tls
変数をfalse
に設定します。デフォルトではtls
パラメーターは true に設定されますが、RELP を使用する場合には鍵/証明書およびトリプレット {ca_cert
、cert
、private_key
} や {ca_cert_src
、cert_src
、private_key_src
} が必要です。-
{
ca_cert_src
、cert_src
、private_key_src
} のトリプレットを設定すると、デフォルトの場所 (/etc/pki/tls/certs
と/etc/pki/tls/private
) を、コントロールノードから転送する管理対象ノードの宛先として使用します。この場合、ファイル名はトリプレットの元の名前と同じです。 -
{
ca_cert
、cert
、private_key
} トリプレットが設定されている場合には、ファイルはロギング設定の前にデフォルトのパスを配置する必要があります。 - トリプレットの両方が設定されている場合には、ファイルはコントロールノードのローカルのパスから管理対象ノードの特定のパスへ転送されます。
-
{
-
ca_cert
:CA 証明書へのパスを表します。デフォルトのパスは/etc/pki/tls/certs/ca.pem
で、ファイル名はユーザーが設定します。 -
cert
:証明書へのパスを表します。デフォルトのパスは/etc/pki/tls/certs/server-cert.pem
で、ファイル名はユーザーが設定します。 -
private_key
:秘密鍵へのパスを表します。デフォルトのパスは/etc/pki/tls/private/server-key.pem
で、ファイル名はユーザーが設定します。 -
ca_cert_src
:ローカルの CA 証明書ファイルパスを表します。これはターゲットホストにコピーされます。ca_cert が指定している場合は、その場所にコピーされます。 -
cert_src
:ローカルの証明書ファイルパスを表します。これはターゲットホストにコピーされます。cert を指定している場合には、その証明書が場所にコピーされます。 -
private_key_src
:ローカルキーファイルのパスを表します。これはターゲットホストにコピーされます。private_key を指定している場合には、その場所にコピーされます。 -
pki_authmode
:name
またはfingerprint
の認証モードを使用できます。 -
permitted_servers
:ロギングクライアントが、TLS 経由での接続およびログ送信を許可するサーバーの一覧。 -
inputs
:ロギング入力ディクショナリーの一覧。 -
outputs
:ロギング出力ディクショナリーの一覧。
-
オプション:Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
Playbook を実行します。
# ansible-playbook -i inventory_file playbook.yml
16.7.2. RELP を使用したサーバーログの設定
logging
システムロールを使用して、RHEL システムのログインをサーバーとして設定し、Ansible Playbook を実行して RELP でリモートロギングシステムからログを受信できます。
以下の手順では、Ansible インベントリーの server
グループ内の全ホストに RELP を設定します。RELP 設定は TLS を使用して、メッセージ送信を暗号化し、ネットワーク経由でログを安全に転送します。
前提条件
- RELP を設定する管理ノードで Playbook の実行権限がある。
- 管理対象ノードがコントロールノードのインベントリーファイルに記載されている。
-
ansible
パッケージおよびrhel-system-roles
パッケージがコントロールノードにインストールされている。
手順
以下の内容を含む
playbook.yml
ファイルを作成します。--- - name: Deploying remote input and remote_files output hosts: server roles: - rhel-system-roles.logging vars: logging_inputs: - name: relp_server type: relp port: 20514 tls: true ca_cert: _/etc/pki/tls/certs/ca.pem_ cert: _/etc/pki/tls/certs/server-cert.pem_ private_key: _/etc/pki/tls/private/server-key.pem_ pki_authmode: name permitted_clients: - '_*example.client.com_' logging_outputs: - name: _remote_files_output_ type: _remote_files_ logging_flows: - name: _example_flow_ inputs: _relp_server_ outputs: _remote_files_output_
Playbook は、以下の設定を使用します。
-
port
:リモートロギングシステムがリッスンしているポート番号です。 tls
:ネットワーク上でログをセキュアに転送します。セキュアなラッパーが必要ない場合は、tls
変数をfalse
に設定します。デフォルトではtls
パラメーターは true に設定されますが、RELP を使用する場合には鍵/証明書およびトリプレット {ca_cert
、cert
、private_key
} や {ca_cert_src
、cert_src
、private_key_src
} が必要です。-
{
ca_cert_src
、cert_src
、private_key_src
} のトリプレットを設定すると、デフォルトの場所 (/etc/pki/tls/certs
と/etc/pki/tls/private
) を、コントロールノードから転送する管理対象ノードの宛先として使用します。この場合、ファイル名はトリプレットの元の名前と同じです。 -
{
ca_cert
、cert
、private_key
} トリプレットが設定されている場合には、ファイルはロギング設定の前にデフォルトのパスを配置する必要があります。 - トリプレットの両方が設定されている場合には、ファイルはコントロールノードのローカルのパスから管理対象ノードの特定のパスへ転送されます。
-
{
-
ca_cert
:CA 証明書へのパスを表します。デフォルトのパスは/etc/pki/tls/certs/ca.pem
で、ファイル名はユーザーが設定します。 -
cert
:証明書へのパスを表します。デフォルトのパスは/etc/pki/tls/certs/server-cert.pem
で、ファイル名はユーザーが設定します。 -
private_key
:秘密鍵へのパスを表します。デフォルトのパスは/etc/pki/tls/private/server-key.pem
で、ファイル名はユーザーが設定します。 -
ca_cert_src
:ローカルの CA 証明書ファイルパスを表します。これはターゲットホストにコピーされます。ca_cert が指定している場合は、その場所にコピーされます。 -
cert_src
:ローカルの証明書ファイルパスを表します。これはターゲットホストにコピーされます。cert を指定している場合には、その証明書が場所にコピーされます。 -
private_key_src
:ローカルキーファイルのパスを表します。これはターゲットホストにコピーされます。private_key を指定している場合には、その場所にコピーされます。 -
pki_authmode
:name
またはfingerprint
の認証モードを使用できます。 -
permitted_clients
:ロギングサーバーが TLS 経由での接続およびログ送信を許可するクライアントの一覧。 -
inputs
:ロギング入力ディクショナリーの一覧。 -
outputs
:ロギング出力ディクショナリーの一覧。
-
オプション:Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
Playbook を実行します。
# ansible-playbook -i inventory_file playbook.yml
16.8. 関連情報
- Preparing a control node and managed nodes to use RHEL System Roles
-
rhel-system-roles
パッケージでインストールされたドキュメントは、/usr/share/ansible/roles/rhel-system-roles.logging/README.html
にあります。 - RHEL システムロール
-
ansible-playbook(1)
の man ページ。