セキュリティーの強化
Red Hat Enterprise Linux 10 システムのセキュリティー強化
概要
Red Hat ドキュメントへのフィードバック (英語のみ)
Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。
Jira からのフィードバック送信 (アカウントが必要)
- Jira の Web サイトにログインします。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
第1章 FIPS モードへの RHEL の切り替え
Federal Information Processing Standard (FIPS) 140-3 で義務付けられている暗号化モジュールのセルフチェックを有効にするには、Red Hat Enterprise Linux 10 を FIPS モードで運用する必要があります。
Red Hat Enterprise Linux 10 では、インストール後にシステムを FIPS モードに切り替えることはサポートされていません。fips-mode-setup
ツールは削除されました。
システムをシステム全体の暗号化ポリシー (FIPS
) に切り替えるだけでは、FIPS モードを有効にして FIPS 140 標準への準拠を保証することはできません。
FIPS モードを無効にするには、FIPS モードを有効にせずにシステムを再インストールしてください。
1.1. Federal Information Processing Standards 140 および FIPS モード
Federal Information Processing Standards (FIPS) Publication 140 は、暗号化モジュールの品質を確保するために National Institute of Standards and Technology (NIST) によって開発された一連のコンピューターセキュリティー標準です。FIPS 140 標準は、暗号化ツールがアルゴリズムを正しく実装できるようにします。この標準の要件を満たす暗号化がシステムで使用されていることを確認するメカニズムとして、ランタイム暗号化アルゴリズムや整合性自己テストなどがあります。
FIPS モードの RHEL
RHEL システムで FIPS 承認のアルゴリズムだけを使用してすべての暗号鍵を生成および使用するには、RHEL を FIPS モードに切り替える必要があります。
FIPS モードを有効にするには、FIPS モードでインストールを開始してください。これにより、デプロイ済みのシステムの変換に伴う暗号鍵マテリアルの再生成と、変換後のシステムのコンプライアンス再評価を行う必要がなくなります。FIPS モードが有効かどうかに基づいてアルゴリズムの選択を変更するコンポーネントは、正しいアルゴリズムを選択します。たとえば、LUKS ディスク暗号化は、FIPS モードでのインストール時には PBKDF2 鍵導出関数 (KDF) を使用しますが、FIPS モードでない場合は FIPS 非準拠の Argon2 KDF を選択します。したがって、ディスク暗号化を使用する非 FIPS システムの場合、インストール後に FIPS モードに切り替えると、システムが非準拠になるか、起動できなくなる可能性があります。
FIPS 準拠のシステムを運用するには、すべての暗号鍵マテリアルを FIPS モードで作成してください。さらに、暗号鍵マテリアルは、セキュアにラップされていない限り、絶対に FIPS 環境の外部に出さないでください。また、絶対に FIPS 以外の環境でラップを解除しないでください。
FIPS モードのステータス
FIPS モードが有効かどうかは、カーネルコマンドラインの fips=1
ブートオプションによって決まります。システム全体の暗号化ポリシーは、update-crypto-policies --set FIPS
コマンドを使用して明示的に設定されていない場合、自動的にこの設定に従います。/boot
用に個別のパーティションが設定されているシステムでは、boot=UUID=<uuid-of-boot-disk>
カーネルコマンドライン引数も必要です。インストーラーを FIPS モードで起動すると、必要な変更がインストーラーによって実行されます。
FIPS モードで要求される制限の適用は、/proc/sys/crypto/fips_enabled
ファイルの内容によって決まります。ファイルに 1
が含まれている場合、RHEL コア暗号化コンポーネントは、FIPS 承認の暗号化アルゴリズムの実装のみを使用するモードに切り替わります。/proc/sys/crypto/fips_enabled
に 0
が含まれている場合、暗号化コンポーネントは FIPS モードを有効にしません。
暗号化ポリシーにおける FIPS
FIPS
システム全体の暗号化ポリシーは、より高いレベルの制限を設定するのに役立ちます。したがって、暗号化の俊敏性をサポートする通信プロトコルは、選択時にシステムが拒否する暗号をアナウンスしません。たとえば、ChaCha20 アルゴリズムは FIPS によって承認されておらず、FIPS
暗号化ポリシーは、TLS サーバーおよびクライアントが TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS 暗号スイートをアナウンスしないようにします。これは、そのような暗号を使用しようとすると失敗するためです。
RHEL を FIPS モードで操作し、独自の FIPS モード関連の設定オプションを提供するアプリケーションを使用する場合は、これらのオプションと対応するアプリケーションのガイダンスを無視してください。FIPS モードで実行されているシステムとシステム全体の暗号化ポリシーは、FIPS 準拠の暗号化のみを適用します。たとえば、システムが FIPS モードで実行されている場合、Node.js 設定オプション --enable-fips
は無視されます。FIPS モードで実行されていないシステムで --enable-fips
オプションを使用すると、FIPS-140 準拠の要件を満たせなくなります。
RHEL 10.0 の OpenSSL FIPS インジケーター
RHEL はアップストリームの OpenSSL より前に OpenSSL FIPS インジケーターを導入しました。両者は設計が異なるため、このインジケーターは RHEL 10 の今後のマイナーバージョンで変更される可能性があります。アップストリームの API が導入された場合、RHEL 10.0 のインジケーターは、結果ではなく "unsupported" というエラーメッセージを返す可能性があります。詳細は、OpenSSL FIPS Indicators の GitHub ドキュメントを参照してください。
RHEL 10 の暗号化モジュールは、National Institute of Standards and Technology (NIST) の Cryptographic Module Validation Program (CMVP) による FIPS 140-3 要件の認定をまだ受けていません。暗号化モジュールの検証ステータスは、Red Hat カスタマーポータルの Product compliance ページの FIPS - Federal Information Processing Standards セクションで確認できます。
1.2. FIPS モードが有効なシステムのインストール
連邦情報処理規格 (FIPS) 140 で義務付けられている暗号化モジュールの自己チェックを有効にするには、システムのインストール時に FIPS モードを有効にします。
FIPS モードのセットアップを完了した後、FIPS モードをオフにすると、システムが必ず不整合な状態になります。このような変更が必要な場合、システムを完全に再インストールするのが唯一の正しい方法です。
手順
システムのインストール開始時に、Red Hat Enterprise Linux ブートウィンドウが開き、利用可能なブートオプションが表示されたら、カーネルコマンドラインに
fips=1
オプションを追加します。UEFI システムでは、e キーを押してカーソルを
linuxefi
カーネルコマンドラインの末尾に移動し、この行の末尾にfips=1
を追加します。次に例を示します。linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.\ check quiet fips=1
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.\ check quiet fips=1
Copy to Clipboard Copied! BIOS システムでは、Tab キーを押してカーソルをカーネルコマンドラインの末尾に移動し、この行の末尾に
fips=1
を追加します。次に例を示します。> vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet fips=1
> vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=RHEL-10-0-BaseOS-x86_64 rd.live.check quiet fips=1
Copy to Clipboard Copied!
- ソフトウェアの選択段階で、サードパーティーのソフトウェアをインストールしないでください。
- インストール後に、システムは FIPS モードで自動的に起動します。
検証
システムが起動したら、FIPS モードが有効になっていることを確認します。
cat /proc/sys/crypto/fips_enabled 1
$ cat /proc/sys/crypto/fips_enabled 1
Copy to Clipboard Copied!
1.3. RHEL Image Builder を使用した FIPS モードの有効化
カスタマイズしたイメージを作成し、FIPS 対応の RHEL イメージを起動できます。イメージを作成する前に、ブループリント内の fips
ディレクティブの値を変更する必要があります。
前提条件
-
root ユーザーまたは
weldr
グループのメンバーであるユーザーとしてログインしている。
手順
次の内容を含む、Tom’s Obvious, Minimal Language (TOML) 形式のプレーンテキストファイルを作成します。
name = "system-fips-mode-enabled" description = "blueprint with FIPS enabled " version = "0.0.1" [customizations] fips = true [[customizations.user]] name = "admin" password = "admin" groups = ["users", "wheel"]
name = "system-fips-mode-enabled" description = "blueprint with FIPS enabled " version = "0.0.1" [customizations] fips = true [[customizations.user]] name = "admin" password = "admin" groups = ["users", "wheel"]
Copy to Clipboard Copied! ブループリントを RHEL Image Builder サーバーにインポートします。
composer-cli blueprints push blueprint-name.toml
# composer-cli blueprints push blueprint-name.toml
Copy to Clipboard Copied! 既存のブループリントをリスト表示して、作成されたブループリントが正常にインポートされて存在するかどうかを確認します。
composer-cli blueprints show blueprint-name
# composer-cli blueprints show blueprint-name
Copy to Clipboard Copied! ブループリントに記載されているコンポーネントおよびバージョンと、その依存関係が有効かどうかを確認します。
composer-cli blueprints depsolve blueprint-name
# composer-cli blueprints depsolve blueprint-name
Copy to Clipboard Copied! カスタマイズした RHEL イメージをビルドします。
composer-cli compose start \ blueprint-name \ image-type \
# composer-cli compose start \ blueprint-name \ image-type \
Copy to Clipboard Copied! イメージのステータスを確認します。
composer-cli compose status UUID FINISHED date blueprint-name blueprint-version image-type
# composer-cli compose status … $ UUID FINISHED date blueprint-name blueprint-version image-type …
Copy to Clipboard Copied! イメージをダウンロードします。
composer-cli compose image UUID
# composer-cli compose image UUID
Copy to Clipboard Copied! RHEL Image Builder により、イメージがカレントディレクトリーパスにダウンロードされます。UUID 番号とともにイメージサイズが表示されます。
UUID-image-name.type: size MB
$ UUID-image-name.type: size MB
Copy to Clipboard Copied!
検証
- ブループリントで設定したユーザー名とパスワードを使用してシステムイメージにログインします。
FIPS モードが有効になっているかどうかを確認します。
cat /proc/sys/crypto/fips_enabled 1
$ cat /proc/sys/crypto/fips_enabled 1
Copy to Clipboard Copied!
1.4. FIPS 対応システム用の起動可能なディスクイメージの作成
Anaconda インストールを実行するときに、ディスクイメージを作成し、FIPS モードを有効化できます。ディスクイメージを起動するときに、fips=1
カーネル引数を追加する必要があります。
前提条件
- ホストマシンに Podman がインストールされている。
-
ホストマシンに
virt-install
がインストールされている。 -
bootc-image-builder
ツールを実行し、コンテナーを--privileged
モードで実行して、イメージをビルドするための root アクセスがある。
手順
01-fips.toml
を作成して FIPS の有効化を設定します。次に例を示します。Enable FIPS
# Enable FIPS kargs = ["fips=1"]
Copy to Clipboard Copied! 次の指示を含む Containerfile を作成して、
fips=1
カーネル引数を有効にし、暗号化ポリシーを調整します。FROM registry.redhat.io/rhel10/rhel-bootc:latest # Enable fips=1 kernel argument: https://bootc-dev.github.io/bootc/building/kernel-arguments.html COPY 01-fips.toml /usr/lib/bootc/kargs.d/ # Install and enable the FIPS crypto policy RUN dnf install -y crypto-policies-scripts && update-crypto-policies --no-reload --set FIPS
FROM registry.redhat.io/rhel10/rhel-bootc:latest # Enable fips=1 kernel argument: https://bootc-dev.github.io/bootc/building/kernel-arguments.html COPY 01-fips.toml /usr/lib/bootc/kargs.d/ # Install and enable the FIPS crypto policy RUN dnf install -y crypto-policies-scripts && update-crypto-policies --no-reload --set FIPS
Copy to Clipboard Copied! カレントディレクトリーの
Containerfile
を使用して、bootc<image>
と互換性のあるベースディスクイメージを作成します。sudo podman run \ --rm \ -it \ --privileged \ --pull=newer \ --security-opt label=type:unconfined_t \ -v $(pwd)/config.toml:/config.toml:ro \ -v $(pwd)/output:/output \ -v /var/lib/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel10/bootc-image-builder:latest \ --local
$ sudo podman run \ --rm \ -it \ --privileged \ --pull=newer \ --security-opt label=type:unconfined_t \ -v $(pwd)/config.toml:/config.toml:ro \ -v $(pwd)/output:/output \ -v /var/lib/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel10/bootc-image-builder:latest \ --local --type qcow2 \ --type iso \ quay.io/<namespace>/<image>:<tag>
Copy to Clipboard Copied! システムのインストール中に FIPS モードを有効にします。
RHEL Anaconda インストーラーを起動するときに、インストール画面で TAB キーを押して、
fips=1
カーネル引数を追加します。インストール後に、システムは FIPS モードで自動的に起動します。
検証
システムにログインした後、FIPS モードが有効になっていることを確認します。
cat /proc/sys/crypto/fips_enabled 1 update-crypto-policies --show FIPS
$ cat /proc/sys/crypto/fips_enabled 1 $ update-crypto-policies --show FIPS
Copy to Clipboard Copied!
1.5. FIPS 140-3 に準拠していない暗号化を使用している RHEL アプリケーションのリスト
FIPS 140-3 などの関連するすべての暗号化認定に合格するには、コア暗号化コンポーネントセットのライブラリーを使用します。これらのライブラリーは、libgcrypt
を除き、RHEL システム全体の暗号化ポリシーに従います。
コア暗号化コンポーネントの概要、そのコンポーネントの選択方法、オペレーティングシステムへの統合方法、ハードウェアセキュリティーモジュールおよびスマートカードのサポート方法、暗号化による認定の適用方法の概要は、Red Hat ナレッジベースの記事 RHEL core cryptographic components を参照してください。
FIPS 140-3 に準拠していない暗号化を使用している RHEL 10 アプリケーションのリスト
- Bacula
- CRAM-MD5 認証プロトコルを実装します。
- Cyrus SASL
- SCRAM-SHA-1 認証方式を使用します。
- Dovecot
- SCRAM-SHA-1 を使用します。
- Emacs
- SCRAM-SHA-1 を使用します。
- FreeRADIUS
- 認証プロトコルに MD5 および SHA-1 を使用します。
- Ghostscript
- ドキュメントを暗号化および復号化するためのカスタムの cryptography 実装 (MD5、RC4、SHA-2、AES)
- GRUB2
-
SHA-1 を必要とするレガシーファームウェアプロトコルをサポートし、
libgcrypt
ライブラリーを含みます。 - iPXE
- TLS スタックを実装します。
- Kerberos
- SHA-1 (Windows との相互運用性) のサポートを維持します。
- Lasso
-
lasso_wsse_username_token_derive_key ()
鍵導出関数 (KDF) は SHA-1 を使用します。 - MariaDB、MariaDB コネクター
-
mysql_native_password
認証プラグインは SHA-1 を使用します。 - MySQL
-
mysql_native_password
は SHA-1 を使用します。 - OpenIPMI
- RAKP-HMAC-MD5 認証方式は、FIPS の使用が承認されておらず、FIPS モードでは機能しません。
- OVMF (UEFI ファームウェア)、Edk2、shim
- 完全な暗号スタック (OpenSSL ライブラリーの埋め込みコピー)。
- Perl
- HMAC、HMAC-SHA1、HMAC-MD5、SHA-1、SHA-224 などを使用します。
- Pidgin
- DES および RC4 暗号を実装します。
- 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
- Blowfish、DES、MD5 を実装します。KDF は SHA-1 を使用します。
- QAT エンジン
- 暗号化プリミティブのハードウェアおよびソフトウェア実装 (RSA、EC、DH、AES、…)
- Ruby
- 安全でないライブラリー関数 MD5 および SHA-1 を提供します。
- Samba
- RC4 および DES (Windows との相互運用性) のサポートを維持します。
- Syslinux
- BIOS パスワードは SHA-1 を使用します。
- SWTPM
- OpenSSL の使用時に FIPS モードを明示的に無効にします。
- Unbound
- DNS 仕様では、DNSSEC リゾルバーが検証のために DNSKEY レコードで SHA-1 ベースのアルゴリズムを使用する必要があります。
- Valgrind
- AES、SHA ハッシュ。[1]
- zip
- パスワードを使用してアーカイブを暗号化および復号化するためのカスタム暗号化実装 (セキュアでない PKWARE 暗号化アルゴリズム)。
第2章 システム全体の暗号化ポリシーの使用
システム全体の暗号化ポリシーは、コア暗号化サブシステムを設定するシステムコンポーネントで、TLS、IPsec、SSH、DNSSec、および Kerberos の各プロトコルに対応します。これにより、管理者が選択できる小規模セットのポリシーを提供します。
2.1. システム全体の暗号化ポリシー
システム全体のポリシーを設定すると、RHEL のアプリケーションはそのポリシーに従い、ポリシーを満たしていないアルゴリズムやプロトコルを使用するように明示的に要求されない限り、その使用を拒否します。つまり、システムが提供した設定で実行する際に、デフォルトのアプリケーションの挙動にポリシーを適用しますが、必要な場合は上書きできます。
RHEL 10 には、次の定義済みポリシーが含まれています。
DEFAULT
- デフォルトのシステム全体の暗号化ポリシーレベルで、現在の脅威モデルに対して安全なものです。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは長さが 2048 ビット以上であれば許容されます。RSA 鍵交換を使用する TLS 暗号は拒否されます。
LEGACY
- Red Hat Enterprise Linux 6 以前との互換性を最大限に確保します。攻撃対象領域が増えるため、セキュリティーが低下します。CBC モードの暗号は、SSH と併用できます。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは長さが 2048 ビット以上であれば許容されます。SHA-1 署名が TLS の外部で許可されます。RSA 鍵交換を使用する暗号が許容されます。
FUTURE
将来の潜在的なポリシーをテストすることを目的とした、より厳格な将来を見据えたセキュリティーレベル。このポリシーでは、DNSSec または HMAC としての SHA-1 の使用は許可されません。SHA2-224 および SHA3-224 ハッシュは拒否されます。128 ビット暗号は無効になります。CBC モードの暗号は、Kerberos を除き無効になります。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは、ビット長が 3072 以上だと許可されます。システムが公共のインターネット上で通信する場合、相互運用性の問題が発生する可能性があります。
重要カスタマーポータル API の証明書が使用する暗号化鍵は
FUTURE
のシステム全体の暗号化ポリシーが定義する要件を満たさないので、現時点でredhat-support-tool
ユーティリティーは、このポリシーレベルでは機能しません。この問題を回避するには、カスタマーポータル API への接続中に
DEFAULT
暗号化ポリシーを使用します。FIPS
FIPS 140 要件に準拠します。FIPS モードの Red Hat Enterprise Linux システムはこのポリシーを使用します。
注記FIPS
暗号化ポリシーを設定すると、システムが FIPS 非準拠になります。RHEL システムを FIPS 140 標準に準拠させる唯一の正しい方法は、FIPS モードでシステムをインストールすることです。また、RHEL はシステム全体のサブポリシー
FIPS:OSPP
を提供します。これには、Common Criteria (CC) 認証に必要な暗号化アルゴリズムに関する追加の制限が含まれています。このサブポリシーを設定すると、システムの相互運用性が低下します。たとえば、3072 ビットより短い RSA 鍵と DH 鍵、追加の SSH アルゴリズム、および複数の TLS グループを使用できません。また、FIPS:OSPP
を設定すると、Red Hat コンテンツ配信ネットワーク (CDN) 構造への接続が防止されます。さらに、FIPS:OSPP
を使用する IdM デプロイメントには Active Directory (AD) を統合できません。FIPS:OSPP
を使用する RHEL ホストと AD ドメイン間の通信が機能しないか、一部の AD アカウントが認証できない可能性があります。注記FIPS:OSPP
暗号化サブポリシーを設定すると、システムが CC 非準拠になります。RHEL システムを CC 標準に準拠させる唯一の正しい方法は、cc-config
パッケージで提供されているガイダンスに従うことです。認定済み RHEL バージョン、検証レポート、CC ガイドへのリンクのリストについては、Red Hat カスタマーポータルの Product compliance ページの Common Criteria セクションを参照してください。
Red Hat は、LEGACY
ポリシーを使用する場合を除き、すべてのライブラリーがセキュアなデフォルト値を提供するように、すべてのポリシーレベルを継続的に調整します。LEGACY
プロファイルはセキュアなデフォルト値を提供しませんが、このプロファイルには、簡単に悪用できるアルゴリズムは含まれていません。このため、提供されたポリシーで有効なアルゴリズムのセットまたは許容可能な鍵サイズは、Red Hat Enterprise Linux の存続期間中に変更する可能性があります。
このような変更は、新しいセキュリティー標準や新しいセキュリティー調査を反映しています。Red Hat Enterprise Linux のライフサイクル全体にわたって特定のシステムとの相互運用性を確保する必要がある場合は、そのシステムと対話するコンポーネントのシステム全体の暗号化ポリシーからオプトアウトするか、カスタム暗号化ポリシーを使用して特定のアルゴリズムを再度有効にする必要があります。
ポリシーレベルで許可されていると記載されている特定のアルゴリズムと暗号は、アプリケーションがそれらをサポートしている場合にのみ使用できます。
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 | はい[a] | いいえ | いいえ | いいえ |
CBC モード暗号 | はい | いいえ[b] | いいえ[c] | いいえ[d] |
256 ビットより小さい鍵を持つ対称暗号 | はい | はい | はい | いいえ |
[a]
SHA-1 署名は TLS コンテキストでは無効になります。
[b]
CBC 暗号は SSH で無効になります。
[c]
CBC 暗号は、Kerberos を除くすべてのプロトコルで無効になります。
[d]
CBC 暗号は、Kerberos を除くすべてのプロトコルで無効になります。
|
2.2. システム全体の暗号化ポリシーの変更
update-crypto-policies
ツールを使用してシステムを再起動すると、システム全体の暗号化ポリシーを変更できます。
前提条件
- システムの root 権限がある。
手順
オプション: 現在の暗号化ポリシーを表示します。
update-crypto-policies --show
$ update-crypto-policies --show DEFAULT
Copy to Clipboard Copied! 新しい暗号化ポリシーを設定します。
update-crypto-policies --set <POLICY>
# update-crypto-policies --set <POLICY> <POLICY>
Copy to Clipboard Copied! <POLICY>
は、設定するポリシーまたはサブポリシー (FUTURE
、LEGACY
、FIPS:OSPP
など) に置き換えます。システムを再起動します。
reboot
# reboot
Copy to Clipboard Copied!
検証
現在の暗号化ポリシーを表示します。
update-crypto-policies --show
$ update-crypto-policies --show <POLICY>
Copy to Clipboard Copied!
2.3. システム全体の暗号化ポリシーを以前のリリースと互換性のあるモードに切り替える
Red Hat Enterprise Linux 10 におけるデフォルトのシステム全体の暗号化ポリシーでは、セキュアでない古いプロトコルを使用した通信は許可されません。Red Hat Enterprise Linux 6 およびそれ以前のリリースとの互換性が必要な場合には、安全でない LEGACY
ポリシーレベルを利用できます。
LEGACY
ポリシーレベルに設定すると、システムおよびアプリケーションの安全性が低下します。
手順
システム全体の暗号化ポリシーを
LEGACY
レベルに切り替えるには、root
で以下のコマンドを実行します。update-crypto-policies --set LEGACY
# update-crypto-policies --set LEGACY Setting system policy to LEGACY
Copy to Clipboard Copied!
2.4. Web コンソールでシステム全体の暗号化ポリシーを設定する
RHEL Web コンソールインターフェイスで、システム全体の暗号化ポリシーとサブポリシーのいずれかを直接設定できます。グラフィカルインターフェイスでは、事前定義された 3 つのシステム全体の暗号化ポリシーの他に、次の LEGACY
ポリシーと AD-SUPPORT
サブポリシーを組み合わせて適用することもできます。
LEGACY:AD-SUPPORT
-
Active Directory サービスの相互運用性を向上させる、セキュリティーの低い設定を含む
LEGACY
ポリシー。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
sudo
を使用して管理コマンドを入力するための root
権限または権限がある。
手順
RHEL 10 Web コンソールにログインします。
詳細は、Web コンソールへのログイン を参照してください。
Overview ページの Configuration カードで、Crypto policy の横にある現在のポリシー値をクリックします。
Change crypto policy ダイアログウィンドウで、システムで使用を開始するポリシーをクリックします。
- ボタンをクリックします。
検証
再起動後、Web コンソールに再度ログインし、暗号化ポリシー の値が選択したものと一致していることを確認します。
あるいは、
update-crypto-policies --show
コマンドを入力して、現在のシステム全体の暗号化ポリシーをターミナルに表示することもできます。
2.5. システム全体の暗号化ポリシーに従わないようにアプリケーションを除外
アプリケーションで使用される暗号化関連の設定をカスタマイズする必要がある場合は、サポートされる暗号スイートとプロトコルをアプリケーションで直接設定することが推奨されます。
/etc/crypto-policies/back-ends
ディレクトリーからアプリケーション関連のシンボリックリンクを削除することもできます。カスタマイズした暗号化設定に置き換えることもできます。この設定により、除外されたバックエンドを使用するアプリケーションに対するシステム全体の暗号化ポリシーが使用できなくなります。この修正は、Red Hat ではサポートされていません。
2.5.1. システム全体の暗号化ポリシーを除外する例
wget
wget
ネットワークダウンローダーで使用される暗号化設定をカスタマイズするには、--secure-protocol
オプションおよび --ciphers
オプションを使用します。以下に例を示します。
wget --secure-protocol=TLSv1_1 --ciphers="SECURE128" https://example.com
$ 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 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 サーバーのシステム全体の暗号化ポリシーをオプトアウトするには、/etc/ssh/sshd_config.d/
ディレクトリーにあるドロップイン設定ファイルに暗号化ポリシーを指定します。このとき、辞書式順序で 50-redhat.conf
ファイルよりも前に来るように、50 未満の 2 桁の数字接頭辞と、.conf
という接尾辞を付けます (例: 49-crypto-policy-override.conf
)。
詳細は、sshd_config(5)
の man ページを参照してください。
OpenSSH クライアントのシステム全体の暗号化ポリシーをオプトアウトするには、次のいずれかのタスクを実行します。
-
指定のユーザーの場合は、
~/.ssh/config
ファイルのユーザー固有の設定でグローバルのssh_config
を上書きします。 -
システム全体の場合は、
/etc/ssh/ssh_config.d/
ディレクトリーにあるドロップイン設定ファイルに暗号化ポリシーを指定します。このとき、辞書式順序で50-redhat.conf
ファイルよりも前に来るように、50 未満の 2 桁の接頭辞と、.conf
という接尾辞を付けます (例:49-crypto-policy-override.conf
)。
詳細は、ssh_config(5)
の man ページを参照してください。
Libreswan
詳細は、ネットワークのセキュリティー保護 ドキュメントの システム全体の暗号化ポリシーをオプトアウトする IPsec 接続の設定 を参照してください。
2.6. サブポリシーを使用したシステム全体の暗号化ポリシーのカスタマイズ
この手順を使用して、有効な暗号化アルゴリズムまたはプロトコルのセットを調整します。
既存のシステム全体の暗号化ポリシーの上にカスタムサブポリシーを適用するか、そのようなポリシーを最初から定義することができます。
スコープが設定されたポリシーの概念により、バックエンドごとに異なるアルゴリズムセットを有効にできます。各設定ディレクティブは、特定のプロトコル、ライブラリー、またはサービスに限定できます。
また、ディレクティブでは、ワイルドカードを使用して複数の値を指定する場合にアスタリスクを使用できます。
/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/
# cd /etc/crypto-policies/policies/modules/
Copy to Clipboard Copied! 調整用のサブポリシーを作成します。次に例を示します。
touch MYCRYPTO-1.pmod touch SCOPES-AND-WILDCARDS.pmod
# touch MYCRYPTO-1.pmod # touch SCOPES-AND-WILDCARDS.pmod
Copy to Clipboard Copied! 重要ポリシーモジュールのファイル名には大文字を使用します。
任意のテキストエディターでポリシーモジュールを開き、システム全体の暗号化ポリシーを変更するオプションを挿入します。次に例を示します。
vi MYCRYPTO-1.pmod
# vi MYCRYPTO-1.pmod
Copy to Clipboard Copied! min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512
min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512
Copy to Clipboard Copied! vi SCOPES-AND-WILDCARDS.pmod
# vi SCOPES-AND-WILDCARDS.pmod
Copy to Clipboard Copied! Disable the AES-128 cipher, all modes Disable CHACHA20-POLY1305 for the TLS protocol (OpenSSL, GnuTLS, NSS, and OpenJDK) Allow using the FFDHE-1024 group with the SSH protocol (libssh and OpenSSH) Disable all CBC mode ciphers for the SSH protocol (libssh and OpenSSH) Allow the AES-256-CBC cipher in applications using libssh
# 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+
Copy to Clipboard Copied! - 変更をモジュールファイルに保存します。
ポリシーの調整を、システム全体の暗号化ポリシーレベル
DEFAULT
に適用します。update-crypto-policies --set DEFAULT:MYCRYPTO-1:SCOPES-AND-WILDCARDS
# update-crypto-policies --set DEFAULT:MYCRYPTO-1:SCOPES-AND-WILDCARDS
Copy to Clipboard Copied! 暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
reboot
# reboot
Copy to Clipboard Copied!
検証
/etc/crypto-policies/state/CURRENT.pol
ファイルに変更が含まれていることを確認します。以下に例を示します。cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072
$ cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072
Copy to Clipboard Copied!
2.7. システム全体のカスタム暗号化ポリシーの作成および設定
完全なポリシーファイルを作成して使用することで、システム全体の暗号化ポリシーを特定の状況向けにカスタマイズできます。
手順
カスタマイズのポリシーファイルを作成します。
cd /etc/crypto-policies/policies/ touch MYPOLICY.pol
# cd /etc/crypto-policies/policies/ # touch MYPOLICY.pol
Copy to Clipboard Copied! または、定義されている 4 つのポリシーレベルのいずれかをコピーします。
cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/MYPOLICY.pol
# cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/MYPOLICY.pol
Copy to Clipboard Copied! 必要に応じて、テキストエディターでファイルを編集します。以下のようにしてカスタム暗号化ポリシーを使用します。
vi /etc/crypto-policies/policies/MYPOLICY.pol
# vi /etc/crypto-policies/policies/MYPOLICY.pol
Copy to Clipboard Copied! システム全体の暗号化ポリシーをカスタムレベルに切り替えます。
update-crypto-policies --set MYPOLICY
# update-crypto-policies --set MYPOLICY
Copy to Clipboard Copied! 暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
reboot
# reboot
Copy to Clipboard Copied!
2.8. システム全体での耐量子計算機アルゴリズムの有効化
TEST-PQ
サブポリシーを適用することで、システム全体で耐量子計算機暗号 (PQC) を有効にできます。FIPS 203 ドラフトに準拠した Module-Lattice-Based Key-Encapsulation Mechanism (ML-KEM) 標準を使用する耐量子計算機鍵交換アルゴリズムを、OpenSSL、GnuTLS、および NSS の TLS 接続と、OpenSSH の SSH 接続で利用できます。
Red Hat Enterprise Linux 10 のすべての PQC アルゴリズムは、テクノロジープレビュー機能として提供されます。耐量子計算機暗号がテクノロジープレビュー状態を終えるときに、パッケージおよびシステム全体の暗号化ポリシー名が変更される可能性があります。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
前提条件
-
crypto-policies-scripts
パッケージがシステムにインストールされている。
-
sudo
または root ユーザーアクセス権によって提供される管理者特権。これは先頭にコマンドプロンプト#
が付いているコマンドに必要です。sudo
アクセス権を設定する方法については、非特権ユーザーが特定のコマンドを実行できるようにする を参照してください。
手順
crypto-policies-pq-preview
パッケージをインストールします。dnf install -y crypto-policies-pq-preview
# dnf install -y crypto-policies-pq-preview
Copy to Clipboard Copied! 現在のシステム全体のポリシーに加えて
TEST-PQ
暗号化サブポリシーを有効にします。次に例を示します。update-crypto-policies --show update-crypto-policies --set DEFAULT:TEST-PQ
# update-crypto-policies --show DEFAULT # update-crypto-policies --set DEFAULT:TEST-PQ
Copy to Clipboard Copied! システムを再起動します。
reboot
# reboot
Copy to Clipboard Copied!
検証
/etc/crypto-policies/state/CURRENT.pol
ファイルに PQC が含まれていることを確認します。次に例を示します。cat /etc/crypto-policies/state/CURRENT.pol | grep MLKEM512 group = MLKEM512 P256-MLKEM512 X25519-MLKEM512 MLKEM768 P384-MLKEM768 X448-MLKEM768 MLKEM768-X25519 X25519-MLKEM768 P256-MLKEM768 MLKEM1024 P521-MLKEM1024 P384-MLKEM1024 X25519 SECP256R1 X448 SECP521R1 SECP384R1 FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192
$ cat /etc/crypto-policies/state/CURRENT.pol | grep MLKEM512 group = MLKEM512 P256-MLKEM512 X25519-MLKEM512 MLKEM768 P384-MLKEM768 X448-MLKEM768 MLKEM768-X25519 X25519-MLKEM768 P256-MLKEM768 MLKEM1024 P521-MLKEM1024 P384-MLKEM1024 X25519 SECP256R1 X448 SECP521R1 SECP384R1 FFDHE-2048 FFDHE-3072 FFDHE-4096 FFDHE-6144 FFDHE-8192
Copy to Clipboard Copied!
2.9. crypto_policies
RHEL システムロールを使用した FUTURE
暗号化ポリシーによるセキュリティーの強化
crypto_policies
RHEL システムロールを使用して、管理対象ノードで FUTURE
ポリシーを設定できます。このポリシーは、たとえば次のことを実現するのに役立ちます。
- 将来の新たな脅威への対応: 計算能力の向上を予測します。
- セキュリティーの強化: 強力な暗号化標準により、より長い鍵長とよりセキュアなアルゴリズムを必須にします。
- 高度なセキュリティー標準への準拠: 医療、通信、金融などの分野ではデータの機密性が高く、強力な暗号化を利用できることが重要です。
通常、FUTURE
は、機密性の高いデータを扱う環境、将来の規制に備える環境、長期的なセキュリティーストラテジーを採用する環境に適しています。
レガシーのシステムやソフトウェアでは、FUTURE
ポリシーによって強制される、より最新しく厳格なアルゴリズムやプロトコルをサポートする必要はありません。たとえば、古いシステムでは TLS 1.3 以上の鍵サイズがサポートされていない可能性があります。これにより互換性の問題が発生する可能性があります。
また、強力なアルゴリズムを使用すると、通常、計算負荷が増加し、システムのパフォーマンスに悪影響が及ぶ可能性があります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
--- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
Copy to Clipboard Copied! サンプル Playbook で指定されている設定は次のとおりです。
crypto_policies_policy: FUTURE
-
管理対象ノードで必要な暗号化ポリシー (
FUTURE
) を設定します。これは、基本ポリシー、またはいくつかのサブポリシーを含む基本ポリシーのどちらかです。指定した基本ポリシーとサブポリシーが、管理対象ノードで使用可能である必要があります。デフォルト値はnull
です。つまり、設定は変更されず、crypto_policies
RHEL システムロールは Ansible fact のみを収集します。 crypto_policies_reboot_ok: true
-
すべてのサービスとアプリケーションが新しい設定ファイルを読み取るように、暗号化ポリシーの変更後にシステムを再起動します。デフォルト値は
false
です。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md
ファイルを参照してください。Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
検証
コントロールノードで、たとえば
verify_playbook.yml
という名前の別の Playbook を作成します。--- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active
--- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: redhat.rhel_system_roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active
Copy to Clipboard Copied! サンプル Playbook で指定されている設定は次のとおりです。
crypto_policies_active
-
crypto_policies_policy
変数で受け入れられる形式の現在アクティブなポリシー名が含まれているエクスポートされた Ansible fact。
Playbook の構文を検証します。
ansible-playbook --syntax-check ~/verify_playbook.yml
$ ansible-playbook --syntax-check ~/verify_playbook.yml
Copy to Clipboard Copied! Playbook を実行します。
ansible-playbook ~/verify_playbook.yml
$ ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }
Copy to Clipboard Copied! crypto_policies_active
変数は、管理対象ノード上のアクティブなポリシーを示します。
第3章 PKCS #11 で暗号化ハードウェアを使用するようにアプリケーションを設定
スマートカードや、エンドユーザー認証用の暗号化トークン、サーバーアプリケーション用のハードウェアセキュリティーモジュール (HSM) など、専用の暗号化デバイスで秘密情報の一部を分離することで、セキュリティー層が追加されます。Red Hat Enterprise Linux では、PKCS #11 API を介した暗号化ハードウェアのサポートがさまざまなアプリケーション間で一貫しており、暗号化ハードウェア上のシークレットの分離が複雑な作業ではありません。
3.1. PKCS #11 による暗号化ハードウェアへの対応
Public-Key Cryptography Standard (PKCS) #11 は、暗号化情報を保持し、暗号化機能を実行する暗号化デバイスへのアプリケーションプログラミングインターフェイス (API) を定義します。
PKCS #11 では、各ハードウェアまたはソフトウェアデバイスを統一された方法でアプリケーションに提示するオブジェクトである 暗号化トークン が導入されています。したがって、アプリケーションは、通常はユーザーによって使用されるスマートカードなどのデバイスや、通常はコンピューターによって使用されるハードウェアセキュリティーモジュールを PKCS #11 暗号化トークンとして認識します。
PKCS #11 トークンには、証明書、データオブジェクト、公開鍵、秘密鍵、または秘密鍵を含むさまざまなオブジェクトタイプを保存できます。これらのオブジェクトは、PKCS #11 Uniform Resource Identifier (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
$ cat /usr/share/p11-kit/modules/opensc.module
module: opensc-pkcs11.so
3.2. スマートカードに保存した SSH 鍵による認証
スマートカードに ECDSA 鍵と RSA 鍵を作成して保存し、そのスマートカードを使用して OpenSSH クライアントで認証することができます。スマートカード認証は、デフォルトのパスワード認証に代わるものです。
前提条件
-
クライアントで、
opensc
パッケージをインストールして、pcscd
サービスを実行している。
手順
PKCS #11 の URI を含む OpenSC PKCS #11 モジュールが提供する鍵のリストを表示し、その出力を
keys.pub
ファイルに保存します。ssh-keygen -D pkcs11: > keys.pub
$ ssh-keygen -D pkcs11: > keys.pub
Copy to Clipboard Copied! 公開鍵をリモートサーバーに転送します。
ssh-copy-id
コマンドを使用し、前の手順で作成したkeys.pub
ファイルを指定します。ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
$ ssh-copy-id -f -i keys.pub <username@ssh-server-example.com>
Copy to Clipboard Copied! ECDSA 鍵を使用して
<ssh-server-example.com>
に接続します。鍵を一意に参照する URI のサブセットのみを使用することもできます。次に例を示します。ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com>
$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! OpenSSH は
p11-kit-proxy
ラッパーを使用し、OpenSC PKCS #11 モジュールがp11-kit
ツールに登録されているため、前のコマンドを簡略化できます。ssh -i "pkcs11:id=%01" <ssh-server-example.com>
$ ssh -i "pkcs11:id=%01" <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! PKCS #11 の URI の
id=
の部分を飛ばすと、OpenSSH が、プロキシーモジュールで利用可能な鍵をすべて読み込みます。これにより、必要な入力の量を減らすことができます。ssh -i pkcs11: <ssh-server-example.com>
$ ssh -i pkcs11: <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! オプション:
~/.ssh/config
ファイルで同じ URI 文字列を使用して、設定を永続的にすることができます。cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" ssh <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh <ssh-server-example.com> Enter PIN for 'SSH key': [ssh-server-example.com] $
Copy to Clipboard Copied! ssh
クライアントユーティリティーが、この URI とスマートカードの鍵を自動的に使用するようになります。
3.3. スマートカード上の証明書を使用して認証するアプリケーションの設定
アプリケーションでスマートカードを使用して認証することにより、セキュリティーが強化され、自動化が簡素化される場合があります。次の方法を使用して、Public Key Cryptography Standard (PKCS) #11 URI をアプリケーションに統合できます。
-
Firefox
Web ブラウザーは、p11-kit-proxy
PKCS #11 モジュールを自動的にロードします。つまり、システムで対応しているすべてのスマートカードが自動的に検出されます。TLS クライアント認証を使用する場合、追加のセットアップは必要ありません。サーバーが要求したときにスマートカードの鍵と証明書が自動的に使用されます。 -
アプリケーションが
GnuTLS
またはNSS
ライブラリーを使用している場合、PKCS #11 URI はすでにサポートされています。また、OpenSSL
ライブラリーに依存するアプリケーションは、pkcs11-provider
パッケージによってインストールされる PKCS #11 プロバイダーを通じて、スマートカードを含む暗号化ハードウェアモジュールにアクセスできます。 -
スマートカード上の秘密鍵を操作する必要があり、
NSS
、GnuTLS
、OpenSSL
を使用しないアプリケーションは、特定の PKCS #11 モジュールの PKCS #11 API を使用するのではなく、p11-kit
API を直接使用して、スマートカードを含む暗号化ハードウェアモジュールを操作できます。 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 --private-key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --certificate 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
Copy to Clipboard Copied! また、
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 --key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --cert 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
Copy to Clipboard Copied! 注記PIN は、スマートカードに保存されている鍵へのアクセスを制御するセキュリティー対策であり、設定ファイルにはプレーンテキスト形式の PIN が含まれているため、攻撃者が PIN を読み取れないように追加の保護を検討してください。たとえば、
pin-source
属性を使用して、ファイルから PIN を読み取るためのfile:
URI を指定できます。詳細は、RFC 7512: PKCS #11 URI Scheme Query Attribute Semantics を参照してください。コマンドパスをpin-source
属性の値として使用することには対応していないことに注意してください。
3.4. Apache で秘密鍵を保護する HSM の使用
Apache
HTTP サーバーは、ハードウェアセキュリティーモジュール (HSM) に保存されている秘密鍵と連携できます。これにより、鍵の漏えいや中間者攻撃を防ぐことができます。通常、これを行うには、ビジーなサーバーに高パフォーマンスの HSM が必要になります。
HTTPS プロトコルの形式でセキュアな通信を行うために、Apache
HTTP サーバー (httpd
) は OpenSSL ライブラリーを使用します。OpenSSL は、PKCS #11 にネイティブに対応しません。HSM を使用するには、PKCS #11 モジュールへのアクセスを提供する pkcs11-provider
パッケージをインストールする必要があります。通常のファイル名ではなく 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"
SSLCertificateFile "pkcs11:id=%01;token=softhsm;type=cert"
SSLCertificateKeyFile "pkcs11:id=%01;token=softhsm;type=private?pin-value=111111"
TLS 設定を含む Apache
HTTP Server の完全なドキュメントを取得するには、httpd-manual
パッケージをインストールします。/etc/httpd/conf.d/ssl.conf
設定ファイルで利用可能なディレクティブの詳細は、/usr/share/httpd/manual/mod/mod_ssl.html
を参照してください。
第4章 polkit を使用したスマートカードへのアクセスの制御
PIN、PIN パッド、生体認証など、スマートカードに組み込まれたメカニズムでは防止できない可能性のある脅威に対処し、よりきめ細かい制御を行うために、Red Hat Enterprise Linux では、スマートカードへのアクセス制御を管理する polkit
フレームワークを使用します。
システム管理者は、非特権ユーザーや非ローカルユーザー、サービスに対するスマートカードアクセスなど、特定のシナリオに合わせて polkit
を設定できます。
4.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/
内のファイルが読み込まれます。
4.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
# touch /etc/polkit-1/rules.d/00-test.rules
Copy to Clipboard Copied! 選択したエディターでファイルを編集します。以下に例を示します。
vi /etc/polkit-1/rules.d/00-test.rules
# vi /etc/polkit-1/rules.d/00-test.rules
Copy to Clipboard Copied! 以下の行を挿入します。
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); } });
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); } });
Copy to Clipboard Copied! ファイルを保存して、エディターを終了します。
pcscd
サービスおよびpolkit
サービスを再起動します。systemctl restart pcscd.service pcscd.socket polkit.service
# systemctl restart pcscd.service pcscd.socket polkit.service
Copy to Clipboard Copied!
検証
-
pcscd
の認可リクエストを作成します。たとえば、Firefox の Web ブラウザーを開くか、opensc
が提供するpkcs11-tool -L
を使用します。 拡張ログエントリーを表示します。以下に例を示します。
journalctl -u polkit --since "1 hour ago"
# 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]
Copy to Clipboard Copied!
第5章 設定コンプライアンスを確保するためのシステムのスキャン
コンプライアンス監査は、指定したオブジェクトが、コンプライアンスポリシーに指定されているすべてのルールに従っているかどうかを判断するプロセスです。コンプライアンスポリシーは、コンピューティング環境で使用される必要な設定を指定するセキュリティー専門家が定義します。これは多くの場合は、チェックリストの形式を取ります。
コンプライアンスポリシーは組織により大幅に異なることがあり、同一組織内でもシステムが異なるとポリシーが異なる可能性があります。ポリシーは、各システムの目的や、組織におけるシステム重要性により異なります。カスタマイズしたソフトウェア設定や導入の特徴によっても、カスタマイズしたポリシーのチェックリストが必要になってきます。
5.1. RHEL における設定コンプライアンスツール
次の設定コンプライアンスツールを使用すると、Red Hat Enterprise Linux で完全に自動化されたコンプライアンス監査を実行できます。このツールは SCAP (Security Content Automation Protocol) 規格に基づいており、コンプライアンスポリシーの自動化に合わせるように設計されています。
- OpenSCAP
OpenSCAP
ライブラリーは、付随するoscap
コマンドラインユーティリティーとともに、ローカルシステムで設定スキャンと脆弱性スキャンを実行するように設計されています。これにより、設定コンプライアンスのコンテンツを検証し、スキャンおよび評価に基づいてレポートおよびガイドを生成します。重要OpenSCAP の使用中にメモリー消費の問題が発生する可能性があります。これにより、プログラムが途中で停止し、結果ファイルが生成されない可能性があります。詳細は、ナレッジベース記事 OpenSCAP のメモリー消費の問題 を参照してください。
- SCAP Security Guide (SSG)
-
scap-security-guide
パッケージは、Linux システム用のセキュリティーポリシーのコレクションを提供します。このガイダンスは、セキュリティー強化に関する実践的なアドバイスのカタログで構成されています (該当する場合は、法規制要件へのリンクが含まれます)。このプロジェクトは、一般的なポリシー要件と特定の実装ガイドラインとの間にあるギャップを埋めることを目的としています。 - Script Check Engine (SCE)
-
SCAP プロトコルの拡張機能である SCE を使用すると、管理者は Bash、Python、Ruby などのスクリプト言語を使用してセキュリティーコンテンツを作成できます。SCE 拡張機能は、
openscap-engine-sce
パッケージで提供されます。SCE 自体は SCAP 標準規格の一部ではありません。
複数のリモートシステムで自動コンプライアンス監査を実行する必要がある場合は、Red Hat Satellite 用の OpenSCAP ソリューションを利用できます。
5.2. 設定コンプライアンススキャン
5.2.1. RHEL の設定コンプライアンス
設定コンプライアンススキャンを使用して、特定の組織で定義されているベースラインに準拠できます。たとえば、決済処理業者の場合は、システムを 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 Security Guide スイートは、データストリームドキュメントの形式で、複数のプラットフォームのプロファイルを提供します。データストリームは、定義、ベンチマーク、プロファイル、および個々のルールが含まれるファイルです。各ルールでは、コンプライアンスの適用性と要件を指定します。RHEL は、セキュリティーポリシーを扱う複数のプロファイルを提供します。Red Hat データストリームには、業界標準の他に、失敗したルールの修正に関する情報も含まれます。
コンプライアンススキャンリソースの構造
Data stream ├── xccdf | ├── benchmark | ├── profile | | ├──rule reference | | └──variable | ├── rule | ├── human readable data | ├── ocil reference ├── ocil ├── cpe reference └── cpe └── remediation
Data stream
├── xccdf
| ├── benchmark
| ├── profile
| | ├──rule reference
| | └──variable
| ├── rule
| ├── human readable data
| ├── ocil reference
├── ocil ├── cpe reference
└── cpe └── remediation
プロファイルは、PCI-DSS や Health Insurance Portability and Accountability Act (HIPAA) などのセキュリティーポリシーに基づく一連のルールです。これにより、セキュリティー標準規格に準拠するために、システムを自動で監査できます。
プロファイルを変更 (調整) して、パスワードの長さなどの特定のルールをカスタマイズできます。
プロファイルのカスタマイズの詳細は、autotailor を使用したセキュリティープロファイルのカスタマイズ を参照してください。
5.2.2. OpenSCAP スキャン結果の例
OpenSCAP スキャンに適用されるデータストリームとプロファイル、およびシステムのさまざまなプロパティーに応じて、各ルールから特定の結果が生成される場合があります。以下に考えられる結果とその意味の簡単な説明を示します。
- Pass
- スキャンでは、このルールとの競合が見つかりませんでした。
- Fail
- スキャンで、このルールとの競合が検出されました。
- Not checked
- OpenSCAP はこのルールの自動評価を実行しません。システムがこのルールに手動で準拠しているかどうかを確認してください。
- Not applicable
- このルールは、現在の設定には適用されません。
- Not selected
- このルールはプロファイルには含まれません。OpenSCAP はこのルールを評価せず、結果にこのようなルールは表示されません。
- Error
-
スキャンでエラーが発生しました。詳細は、
--verbose DEVEL
オプションを指定してoscap
コマンドで確認できます。Red Hat カスタマーポータル でサポートケースを作成するか、Red Hat Jira の RHEL プロジェクト でチケットを作成します。 - Unknown
-
スキャンで予期しない状況が発生しました。詳細は、
--verbose DEVEL
オプションを指定してoscap
コマンドで確認できます。Red Hat カスタマーポータル でサポートケースを作成するか、Red Hat Jira の RHEL プロジェクト でチケットを作成します。
5.2.3. 設定コンプライアンスのプロファイルの表示
スキャンまたは修復にプロファイルを使用することを決定する前に、oscap info
サブコマンドを使用してプロファイルをリスト表示し、詳細な説明を確認できます。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。
手順
SCAP Security Guide プロジェクトが提供するセキュリティーコンプライアンスプロファイルで利用可能なファイルをすべて表示します。
ls /usr/share/xml/scap/ssg/content/
$ ls /usr/share/xml/scap/ssg/content/ ssg-rhel9-ds.xml
Copy to Clipboard Copied! oscap info
サブコマンドを使用して、選択したデータストリームに関する詳細情報を表示します。データストリームを含む XML ファイルは、名前に-ds
文字列で示されます。Profiles
セクションでは、利用可能なプロファイルと、その ID のリストを確認できます。oscap info /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap info /usr/share/xml/scap/ssg/content/ssg-rhel10-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 …
Copy to Clipboard Copied! データストリームファイルからプロファイルを選択し、選択したプロファイルに関する追加情報を表示します。そのためには、
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-rhel10-ds.xml
$ oscap info --profile hipaa /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml … Profile Title: Health Insurance Portability and Accountability Act (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. …
Copy to Clipboard Copied!
5.2.4. 特定のベースラインによる設定コンプライアンスの評価
oscap
コマンドラインツールを使用して、システムまたはリモートシステムが特定のベースラインに準拠しているかどうかを判断し、結果をレポートに保存できます。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。 - システムが準拠する必要があるベースライン内のプロファイルの ID を知っている必要があります。ID を見つけるには、設定コンプライアンスのプロファイルの表示 セクションを参照してください。
手順
ローカルシステムをスキャンして、選択したプロファイルへの準拠を評価し、スキャン結果をファイルに保存します。
oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! 以下のように置き換えます。
-
<scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。 -
<profile_ID>
は、システムが準拠する必要があるプロファイル ID (例:hipaa
) に置き換えます。
-
オプション: リモートシステムをスキャンして、選択したプロファイルへの準拠を評価し、スキャン結果をファイルに保存します。
oscap-ssh <username>@<hostname> <port> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap-ssh <username>@<hostname> <port> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! 以下のように置き換えます。
-
<username>@<hostname>
は、リモートシステムのユーザー名とホスト名に置き換えます。 -
<port>
は、リモートシステムにアクセスできるポート番号です。 -
<scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。 -
<profile_ID>
は、システムが準拠する必要があるプロファイル ID (例:hipaa
) に置き換えます。
-
5.2.5. 特定のベースラインを使用したコンテナーまたはコンテナーイメージのセキュリティーコンプライアンスの評価
コンテナーまたはコンテナーイメージが、Payment Card Industry Data Security Standard (PCI-DSS) や Health Insurance Portability and Accountability Act (HIPAA) などの特定のセキュリティーベースラインに準拠しているかどうかを評価できます。
前提条件
-
openscap-utils
パッケージおよびscap-security-guide
パッケージがインストールされている。 - システムへの root アクセス権があります。
手順
コンテナーまたはコンテナーイメージの ID を見つけます。
-
コンテナーの ID を見つけるには、
podman ps -a
コマンドを入力します。 -
コンテナーイメージの ID を見つけるには、
podman images
コマンドを入力します。
-
コンテナーの ID を見つけるには、
コンテナーまたはコンテナーイメージがプロファイルに準拠しているかどうかを評価し、スキャン結果をファイルに保存します。
oscap-podman <ID> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap-podman <ID> xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! 以下のように置き換えます。
-
<ID>
は、コンテナーまたはコンテナーイメージの ID に置き換えます。 -
<scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。 -
<profile_ID>
は、システムが準拠する必要があるプロファイル ID (例:hipaa
またはpci-dss
) に置き換えます。
-
検証
結果をブラウザーで確認します。以下に例を示します。
firefox <scan_report.html> &
$ firefox <scan_report.html> &
Copy to Clipboard Copied!
notapplicable
とマークされたルールは、ベアメタルおよび仮想化システムにのみ適用され、コンテナーまたはコンテナーイメージには適用されません。
5.3. 設定コンプライアンスの修正
システムを特定のプロファイルに自動的に準拠させるには、修正を実行します。SCAP Security Guide で提供されるプロファイルに合わせてシステムを修正できます。
5.3.1. 特定のベースラインに合わせたシステムの修正
特定のベースラインに合わせて RHEL システムを修正できます。SCAP Security Guide で提供されるプロファイルに合わせてシステムを修正できます。
使用可能なプロファイルのリスト表示の詳細は、設定コンプライアンスのプロファイルの表示 セクションを参照してください。
Remediate
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーハードニング関連の修復によって行われた変更を自動的に元に戻す方法は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
scap-security-guide
パッケージがインストールされている。
手順
--remediate
オプションを指定したoscap
コマンドを使用してシステムを修復します。oscap xccdf eval --profile <profile_ID> --remediate /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --remediate /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! <profile_ID>
は、システムが準拠する必要があるプロファイル ID (例:hipaa
) に置き換えます。- システムを再起動します。
検証
システムがプロファイルに準拠しているかどうかを評価し、スキャン結果をファイルに保存します。
oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf eval --report <scan_report.html> --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! 以下のように置き換えます。
-
<scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。 -
<profile_ID>
は、システムが準拠する必要があるプロファイル ID (例:hipaa
) に置き換えます。
-
5.3.2. SSG Ansible Playbook を使用した特定のベースラインに合わせたシステムの修正
SCAP Security Guide プロジェクトの Ansible Playbook ファイルを使用して、特定のベースラインに合わせてシステムを修正できます。SCAP Security Guide によって提供されるすべてのプロファイルに合わせて修正できます。
Remediate
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーハードニング関連の修復によって行われた変更を自動的に元に戻す方法は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
scap-security-guide
パッケージがインストールされている。 -
ansible-core
パッケージがインストールされている。詳細は、Ansible インストールガイド を参照してください。 -
rhc-worker-playbook
パッケージがインストールされている。 - システムの修正に使用するプロファイルの ID がわかっている。詳細は、設定コンプライアンスのプロファイルの表示 を参照してください。
手順
Ansible を使用して、選択したプロファイルに準拠するようにシステムを修正します。
ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local /usr/share/scap-security-guide/ansible/rhel10-playbook-<profile_ID>.yml
# ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local /usr/share/scap-security-guide/ansible/rhel10-playbook-<profile_ID>.yml
Copy to Clipboard Copied! このコマンドで Playbook を実行するには、
ANSIBLE_COLLECTIONS_PATH
環境変数が必要です。<profile_ID>
は、選択したプロファイルのプロファイル ID に置き換えます。- システムを再起動します。
検証
システムが選択したプロファイルに準拠しているかどうかを評価し、スキャン結果をファイルに保存します。
oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! <scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。
5.3.3. システムを特定のベースラインに合わせるための修復用 Ansible Playbook の作成
システムを特定のベースラインに合わせるために必要な修復のみを含む Ansible Playbook を作成できます。この Playbook は、すでに満たされている要件を含んでいないため、小型です。Playbook を作成しても、システムは一切変更されません。ここでは、後で適用するためのファイルを準備するだけです。
前提条件
-
scap-security-guide
パッケージがインストールされている。 -
ansible-core
パッケージがインストールされている。詳細は、Ansible インストールガイド を参照してください。 -
rhc-worker-playbook
パッケージがインストールされている。 - システムの修正に使用するプロファイルの ID がわかっている。詳細は、設定コンプライアンスのプロファイルの表示 を参照してください。
手順
システムをスキャンして結果を保存します。
oscap xccdf eval --profile <profile_ID> --results <profile_results.xml> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --results <profile_results.xml> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! 結果が含まれるファイルで、結果 ID の値を見つけます。
oscap info <profile_results.xml>
# oscap info <profile_results.xml>
Copy to Clipboard Copied! ステップ 1 で生成されたファイルに基づいて Ansible Playbook を生成します。
oscap xccdf generate fix --fix-type ansible --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_<profile_ID> --output <profile_remediations.yml> <profile_results.xml>
# oscap xccdf generate fix --fix-type ansible --result-id xccdf_org.open-scap_testresult_xccdf_org.ssgproject.content_profile_<profile_ID> --output <profile_remediations.yml> <profile_results.xml>
Copy to Clipboard Copied! -
生成された
<profile_remediations.yml>
ファイルに、ステップ 1 で実行したスキャンで失敗したルールに対する Ansible 修復が含まれていることを確認します。 Ansible を使用して、選択したプロファイルに準拠するようにシステムを修正します。
ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local <profile_remediations.yml>`
# ANSIBLE_COLLECTIONS_PATH=/usr/share/rhc-worker-playbook/ansible/collections/ansible_collections/ ansible-playbook -i "localhost," -c local <profile_remediations.yml>`
Copy to Clipboard Copied! このコマンドで Playbook を実行するには、
ANSIBLE_COLLECTIONS_PATH
環境変数が必要です。警告Remediate
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーハードニング関連の修復によって行われた変更を自動的に元に戻す方法は提供していません。修復は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
検証
システムが選択したプロファイルに準拠しているかどうかを評価し、スキャン結果をファイルに保存します。
oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --profile <profile_ID> --report <scan_report.html> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! <scan_report.html>
は、oscap
がスキャン結果を保存するファイル名に置き換えます。
5.4. キックスタートを使用した RHEL のハードニングインストール
DISA STIG、CIS、ANSSI などの特定のセキュリティープロファイルにシステムを準拠させる必要がある場合は、ハードニングの設定を定義したキックスタートファイルを準備し、テーラリングファイルを使用して設定をカスタマイズし、ハードニングされたシステムの自動インストールを開始できます。
前提条件
-
openscap-scanner
がシステムにインストールされている。 scap-security-guide
パッケージがシステムにインストールされている。パッケージのバージョンが、インストールする必要がある RHEL のバージョンと一致している。詳細は、Supported versions of the SCAP Security Guide in RHEL を参照してください。異なるバージョンを使用すると競合が発生する可能性があります。注記システムの RHEL のバージョンが、インストールする必要があるバージョンと同じ場合は、
scap-security-guide
パッケージを直接インストールできます。
手順
データストリームファイルからセキュリティープロファイルの ID を見つけます。
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap info /usr/share/xml/scap/ssg/content/ssg-rhel10-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 10 Id: xccdf_org.ssgproject.content_profile_pci-dss …
Copy to Clipboard Copied! -
オプション: XCCDF テーラリングファイルを使用してハードニングをカスタマイズする場合は、
openscap-utils
パッケージで提供されるautotailor
コマンドを使用できます。詳細は、autotailor を使用したセキュリティープロファイルのカスタマイズ を参照してください。 SCAP ソースデータストリームからキックスタートファイルを生成します。
oscap xccdf generate fix --profile <profile_ID> --output <kickstart_file>.cfg --fix-type kickstart /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
$ oscap xccdf generate fix --profile <profile_ID> --output <kickstart_file>.cfg --fix-type kickstart /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! テーラリングファイルを使用する場合は、
--tailoring-file tailoring.xml
オプションとカスタムプロファイル ID を使用して、生成されたキックスタートファイルにテーラリングファイルを埋め込みます。次に例を示します。oscap xccdf generate fix --tailoring-file tailoring.xml --profile <custom_profile_ID> --output <kickstart_file>.cfg --fix-type kickstart ./ssg-rhel10-ds.xml
$ oscap xccdf generate fix --tailoring-file tailoring.xml --profile <custom_profile_ID> --output <kickstart_file>.cfg --fix-type kickstart ./ssg-rhel10-ds.xml
Copy to Clipboard Copied! 生成された
<kickstart_file>.cfg
を確認し、デプロイメントのニーズに合わせて必要に応じて手動で変更します。ファイル内のコメントの指示に従ってください。注記変更の内容によっては、キックスタートファイルによってインストールされるシステムのコンプライアンスに影響が及ぶ可能性があります。たとえば、一部のセキュリティーポリシーには、定義済みのパーティションや特定のパッケージおよびサービスが必要です。
- インストール用のキックスタートファイルを使用します。インストーラーがキックスタートを使用できるように、キックスタートを Web サーバー経由で提供するか、PXE で提供するか、ISO イメージに埋め込みます。詳細な手順については、「RHEL の自動インストール」ドキュメントの RHEL の完全自動および半自動インストール の章を参照してください。
-
インストールが完了すると、システムが自動的に再起動します。再起動後、ログインして、
/root
ディレクトリーに保存されているインストール SCAP レポートを確認します。
検証
システムのコンプライアンスをスキャンし、レポートを HTML ファイルに保存して確認します。
元のプロファイルを使用する場合:
oscap xccdf eval --report report.html --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --report report.html --profile <profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied! カスタマイズしたプロファイルを使用する場合:
oscap xccdf eval --report report.html --tailoring-file tailoring.xml --profile <custom_profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
# oscap xccdf eval --report report.html --tailoring-file tailoring.xml --profile <custom_profile_ID> /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml
Copy to Clipboard Copied!
5.5. autotailor を使用したセキュリティープロファイルのカスタマイズ
セキュリティープロファイルをカスタマイズして、特定のニーズに合わせて調整できます。たとえば、公式プロファイルとは異なる内部ポリシーを実装できます。プロファイルをカスタマイズする際には、追加のルールを選択したり、別のルールに含めるルールを削除したり、パスワード最小長など、特定のルールのパラメーターを変更したりできます。プロファイルをカスタマイズするときに新しいルールを定義することはできません。
autotailor
ユーティリティーを使用すると、元のプロファイルの変更がすべて含まれた XCCDF テーラリングファイルが作成されます。その後、SCAP プロファイルに従ってシステムをスキャン、修正、またはインストールするときに、このテーラリングファイルを oscap
コマンドラインユーティリティーに渡します。
前提条件
-
openscap-utils
パッケージがシステムにインストールされている。 - カスタマイズするベースライン内のプロファイルの ID がわかっている。ID を見つけるには、設定コンプライアンスのプロファイルの表示 セクションを参照してください。
手順
autotailor
コマンドを使用して、プロファイルのテーラリングファイルを作成します。次に例を示します。autotailor \ --select=<rule_ID_1> \ --select=<rule_ID_2> \ --unselect=<rule_ID_3> \ --var-value=<value_ID_1>=<value_1> \ --var-value=<value_ID_2>=<value_2> \ --output=<tailoring.xml> \ --tailored-profile-id=<custom_profile_ID> \ /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml <profile_ID>
$ autotailor \ --select=<rule_ID_1> \ --select=<rule_ID_2> \ --unselect=<rule_ID_3> \ --var-value=<value_ID_1>=<value_1> \ --var-value=<value_ID_2>=<value_2> \ --output=<tailoring.xml> \ --tailored-profile-id=<custom_profile_ID> \ /usr/share/xml/scap/ssg/content/ssg-rhel10-ds.xml <profile_ID>
Copy to Clipboard Copied! 詳細は以下のようになります。
<customization_options>
はプロファイルの変更内容です。次の 1 つ以上のオプションを使用します。--select=<rule_ID>
- 既存のルールをプロファイルに追加します。
--unselect=<rule_ID>
- プロファイルからルールを削除します。
--var-value=<value_ID>=<value>
-
事前設定された値をオーバーライドします。たとえば、
var_sshd_max_sessions
を10
に設定するには、--var-value=var_sshd_max_sessions=10
を使用します。
-
<tailoring.xml>
は、autotailor
がテーラリングを保存するファイル名です。 -
<custom_profile_ID>
は、autotailor
がカスタマイズを保存するプロファイル ID です (例:custom_cis
)。 -
<profile_ID>
は、システムが準拠する必要があるプロファイル ID です (例:cis
)。
注記すべてのプロファイル、ルール、および変数 XCCDF ID に、完全な名前空間識別子または短縮 ID のいずれかを使用できます。短縮 ID は、
autotailor
により、名前空間接頭辞を使用して自動的に拡張されます。たとえば、cis
はxccdf_org.ssgproject.content_profile_cis
と同等です。--id-namespace
オプションを使用すると、デフォルトの名前空間org.ssgproject.content
をオーバーライドできます。オプション: JSON Tailoring 形式で定義したカスタマイズに基づいてテーラリングファイルを作成します。
autotailor --output=<tailoring.xml> --json-tailoring=<json_tailoring.json>
$ autotailor --output=<tailoring.xml> --json-tailoring=<json_tailoring.json>
Copy to Clipboard Copied! 以下のように置き換えます。
-
<json_tailoring.json>
は、JSON Tailoring 定義を含むファイル名です。
注記--json-tailoring
は、コマンドラインのカスタマイズ--select
、--unselect
、および--var-value
と組み合わせることができます。その場合、コマンドラインのカスタマイズが JSON Tailoring よりも優先されます。-
5.6. RHEL 10 でサポートされている SCAP Security Guide プロファイル
RHEL の特定のマイナーリリースで提供される SCAP コンテンツだけを使用してください。これは、ハードニングに関与するコンポーネントが新しい機能で更新されることがあるためです。SCAP コンテンツは、この更新を反映するように変更されますが、以前のバージョンと互換性があるとは限りません。
oscap info
コマンドを使用すると、システムにインストールされている scap-security-guide
RPM のバージョンに関連する情報を取得できます。詳細は、設定コンプライアンスのプロファイルの表示 を参照してください。
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Security of Information Systems (ANSSI) BP-028 Enhanced Level |
| 2.0 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 High Level |
| 2.0 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Intermediary Level |
| 2.0 |
French National Agency for the Security of Information Systems (ANSSI) BP-028 Minimal Level |
| 2.0 |
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Server |
| ドラフト |
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Server |
| ドラフト |
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 1 - Workstation |
| ドラフト |
[ドラフト] CIS Red Hat Enterprise Linux 9 Benchmark for Level 2 - Workstation |
| ドラフト |
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Health Insurance Portability and Accountability Act (HIPAA) |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official - Base |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official - Secret |
| バージョン付けなし |
Australian Cyber Security Centre (ACSC) ISM Official - Top Secret |
| バージョン付けなし |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 9 |
| 4.0 |
The Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Enterprise Linux 10 |
| vendor |
The Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) with GUI for Red Hat Enterprise Linux 10 |
| vendor |
第6章 Keylime でシステムの整合性を確保する
Keylime を使用すると、リモートシステムの整合性を継続的に監視し、起動時にシステムの状態を確認できます。また、暗号化されたファイルを監視対象システムに送信し、監視対象システムが整合性テストに失敗するたびにトリガーされる自動アクションを指定することもできます。
6.1. Keylime の仕組み
Keylime エージェントを設定すると、次の操作を 1 つ以上実行できます。
- ランタイム整合性監視
- Keylime のランタイム整合性監視では、エージェントがデプロイされているシステムを継続的に監視し、許可リストに含まれるファイルと除外リストに含まれないファイルの整合性を評価します。
- ブート測定
- Keylime のブート測定では、起動時にシステムの状態を検証します。
Keylime の信頼の概念は、Trusted Platform Module (TPM) テクノロジーに基づいています。TPM は、暗号化鍵が統合されたハードウェア、ファームウェア、または仮想コンポーネントです。TPM クォートをポーリングし、オブジェクトのハッシュを比較することで、Keylime はリモートシステムの初期監視とランタイム監視を提供します。
Keylime を仮想マシン内で実行するか、仮想 TPM を使用するかは、基盤となるホストの整合性によって異なります。仮想環境での Keylime 測定を利用する前に、必ずホスト環境を信頼してください。
Keylime は、次の 3 つの主要コンポーネントで構成されています。
- verifier
-
エージェントを実行するシステムの整合性を最初から継続的に検証します。verifier は、パッケージからデプロイすることも、コンテナーとしてデプロイすることも、
keylime_server
RHEL システムロールを使用してデプロイすることもできます。 - registrar
-
すべてのエージェントのデータベースを含んでおり、TPM ベンダーの公開鍵をホストします。registrar は、パッケージからデプロイすることも、コンテナーとしてデプロイすることも、
keylime_server
RHEL システムロールを使用してデプロイすることもできます。 - エージェント
- verifier によって測定されるリモートシステムにデプロイされます。
さらに、Keylime は、ターゲットシステムでのエージェントのプロビジョニングを含む多くの機能に keylime_tenant
ユーティリティーを使用します。
図6.1 設定による Keylime コンポーネント間の接続

Keylime は、コンポーネントとテナントの間で交換される鍵と証明書を使用して、信頼の連鎖で監視対象システムの整合性を保証します。このチェーンの安全な基盤として、信頼できる認証局 (CA) を使用してください。
エージェントが鍵と証明書を受け取らない場合は、CA の関与なしに鍵と自己署名証明書を生成します。
図6.2 Keylime コンポーネントの証明書と鍵の間の接続

6.2. パッケージから Keylime verifier をデプロイする
verifier は、Keylime で最も重要なコンポーネントです。システム整合性の初期および定期的なチェックを行い、エージェントを使用して暗号化鍵を安全にブートストラップすることをサポートします。verifier は、制御インターフェイスに相互 TLS 暗号化を使用します。
信頼の連鎖を維持するには、verifier を実行するシステムをセキュアに管理してください。
要件に応じて、verifier を別のシステムにインストールすることも、Keylime registrar と同じシステムにインストールすることもできます。verifier と registrar を別々のシステムで実行すると、パフォーマンスが向上します。
設定ファイルをドロップインディレクトリー内に整理するには、/etc/keylime/verifier.conf.d/00-verifier-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
-
root
権限と、Keylime コンポーネントをインストールするシステムへのネットワーク接続がある。 - 認証局からの有効な鍵と証明書がある。
オプション: Keylime が verifier からのデータを保存するデータベースにアクセスできます。次のデータベース管理システムのいずれかを使用できます。
- SQLite (デフォルト)
- PostgreSQL
- MySQL
- MariaDB
手順
Keylime verifier をインストールします。
dnf install keylime-verifier
# dnf install keylime-verifier
Copy to Clipboard Copied! /etc/keylime/verifier.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/verifier.conf.d/00-verifier-ip.conf
など) を作成して、verifier の IP アドレスとポートを定義します。[verifier] ip = <verifier_IP_address>
[verifier] ip = <verifier_IP_address>
Copy to Clipboard Copied! -
<verifier_IP_address>
は、verifier の IP アドレスに置き換えます。あるいは、ip = *
またはip = 0.0.0.0
を使用して、使用可能なすべての IP アドレスに verifier をバインドします。 -
必要に応じて、
port
オプションを使用して、verifier のポートをデフォルト値8881
から変更することもできます。
-
オプション: エージェントのリスト用に verifier のデータベースを設定します。デフォルトの設定では、verifier の
/var/lib/keylime/cv_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/verifier.conf.d/
ディレクトリーに次の内容の新しい.conf
ファイル (/etc/keylime/verifier.conf.d/00-db-url.conf
など) を作成することで、別のデータベースを定義できます。[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
Copy to Clipboard Copied! <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
は、データベースの URL (例:postgresql://verifier:UQ?nRNY9g7GZzN7@198.51.100.1/verifierdb
) に置き換えます。使用する認証情報が、Keylime にデータベース構造を作成するための権限を提供していることを確認してください。
verifier に証明書と鍵を追加します。Keylime にそれらを生成させることも、既存の鍵と証明書を使用することもできます。
-
デフォルトの
tls_dir =generate
オプションを使用すると、Keylime は verifier、registrar、およびテナントの新しい証明書を/var/lib/keylime/cv_ca/
ディレクトリーに生成します。 既存の鍵と証明書を設定にロードするには、verifier 設定でそれらの場所を定義します。Keylime サービスの実行者である
keylime
ユーザーが証明書にアクセスできる必要があります。/etc/keylime/verifier.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/verifier.conf.d/00-keys-and-certs.conf
など) を作成します。[verifier] tls_dir = /var/lib/keylime/cv_ca 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>']
[verifier] tls_dir = /var/lib/keylime/cv_ca 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>']
Copy to Clipboard Copied! 注記絶対パスを使用して、鍵と証明書の場所を定義します。また、相対パスは
tls_dir
オプションで定義されたディレクトリーから解決されます。
-
デフォルトの
ファイアウォールでポートを開きます。
firewall-cmd --add-port 8881/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8881/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! 別のポートを使用する場合は、
8881
を.conf
ファイルで定義されているポート番号に置き換えます。verifier サービスを開始します。
systemctl enable --now keylime_verifier
# systemctl enable --now keylime_verifier
Copy to Clipboard Copied! 注記デフォルト設定では、verifier が他の Keylime コンポーネントの CA と証明書を作成するため、
keylime_registrar
サービスを起動する前にkeylime_verifier
を起動します。カスタム証明書を使用する場合、この順序で起動する必要はありません。
検証
keylime_verifier
サービスがアクティブで実行中であることを確認します。systemctl status keylime_verifier
# 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
Copy to Clipboard Copied!
6.3. Keylime verifier をコンテナーとしてデプロイする
Keylime verifier は、システム整合性の初期チェックと定期チェックを実行し、エージェントを使用した暗号化鍵のセキュアなブートストラップをサポートします。Keylime verifier は、ホスト上にバイナリーやパッケージがなくても、RPM 方式ではなくコンテナーとして設定できます。コンテナーとしてデプロイすることにより、Keylime コンポーネントの分離性、モジュール性、再現性が向上します。
コンテナーを起動すると、Keylime verifier がデフォルトの設定ファイルとともにデプロイされます。次の 1 つ以上の方法を使用して設定をカスタマイズできます。
- 設定ファイルを含むホストのディレクトリーをコンテナーにマウントします。
- コンテナーで環境変数を直接変更します。環境変数を変更すると、設定ファイルの値がオーバーライドされます。
前提条件
-
podman
パッケージとその依存関係がシステムにインストールされている。 オプション: Keylime が verifier からのデータを保存するデータベースにアクセスできます。次のデータベース管理システムのいずれかを使用できます。
- SQLite (デフォルト)
- PostgreSQL
- MySQL
- MariaDB
- 認証局からの有効な鍵と証明書がある。
手順
オプション: 設定ファイルにアクセスするには、
keylime-verifier
パッケージをインストールします。このパッケージがなくてもコンテナーを設定することはできますが、パッケージに付属する設定ファイルを変更する方が簡単な場合があります。dnf install keylime-verifier
# dnf install keylime-verifier
Copy to Clipboard Copied! /etc/keylime/verifier.conf.d/
ディレクトリーに新しい.conf
ファイル (例:/etc/keylime/verifier.conf.d/00-verifier-ip.conf
) を作成し、次の内容を記述して、verifier をすべての使用可能な IP アドレスにバインドします。[verifier] ip = *
[verifier] ip = *
Copy to Clipboard Copied! -
必要に応じて、
port
オプションを使用して、verifier のポートをデフォルト値8881
から変更することもできます。
-
必要に応じて、
オプション: エージェントのリスト用に verifier のデータベースを設定します。デフォルトの設定では、verifier の
/var/lib/keylime/cv_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/verifier.conf.d/
ディレクトリーに次の内容の新しい.conf
ファイル (/etc/keylime/verifier.conf.d/00-db-url.conf
など) を作成することで、別のデータベースを定義できます。[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[verifier] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
Copy to Clipboard Copied! <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
は、データベースの URL (例:postgresql://verifier:UQ?nRNY9g7GZzN7@198.51.100.1/verifierdb
) に置き換えます。使用する認証情報に、Keylime がデータベース構造を作成するための権限があることを確認してください。
verifier に証明書と鍵を追加します。Keylime にそれらを生成させることも、既存の鍵と証明書を使用することもできます。
-
デフォルトの
tls_dir =generate
オプションを使用すると、Keylime は verifier、registrar、およびテナントの新しい証明書を/var/lib/keylime/cv_ca/
ディレクトリーに生成します。 既存の鍵と証明書を設定にロードするには、verifier 設定でそれらの場所を定義します。Keylime プロセスの実行者である
keylime
ユーザーが証明書にアクセスできる必要があります。/etc/keylime/verifier.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/verifier.conf.d/00-keys-and-certs.conf
など) を作成します。[verifier] tls_dir = /var/lib/keylime/cv_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>'] client_key = </path/to/client_key> client_cert = </path/to/client_cert> trusted_server_ca = ['</path/to/ca/cert3>', '</path/to/ca/cert4>']
[verifier] tls_dir = /var/lib/keylime/cv_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>'] client_key = </path/to/client_key> client_cert = </path/to/client_cert> trusted_server_ca = ['</path/to/ca/cert3>', '</path/to/ca/cert4>']
Copy to Clipboard Copied! 注記絶対パスを使用して、鍵と証明書の場所を定義します。また、相対パスは
tls_dir
オプションで定義されたディレクトリーから解決されます。
-
デフォルトの
ファイアウォールでポートを開きます。
firewall-cmd --add-port 8881/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8881/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! 別のポートを使用する場合は、
8881
を.conf
ファイルで定義されているポート番号に置き換えます。コンテナーを実行します。
podman run --name keylime-verifier \ -p 8881:8881 \ -v /etc/keylime/verifier.conf.d:/etc/keylime/verifier.conf.d:Z \ -v /var/lib/keylime/cv_ca:/var/lib/keylime/cv_ca:Z \ -d \ -e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1> \ -e KEYLIME_VERIFIER_CLIENT_KEY_PASSWORD=<passphrase2> \ registry.access.redhat.com/rhel9/keylime-verifier
$ podman run --name keylime-verifier \ -p 8881:8881 \ -v /etc/keylime/verifier.conf.d:/etc/keylime/verifier.conf.d:Z \ -v /var/lib/keylime/cv_ca:/var/lib/keylime/cv_ca:Z \ -d \ -e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1> \ -e KEYLIME_VERIFIER_CLIENT_KEY_PASSWORD=<passphrase2> \ registry.access.redhat.com/rhel9/keylime-verifier
Copy to Clipboard Copied! -
-p
オプションは、ホスト上とコンテナー上のデフォルトポート8881
を開きます。 -v
オプションは、コンテナーへのディレクトリーのバインドマウントを作成します。-
Z
オプションを指定すると、Podman がコンテンツにプライベート非共有ラベルを付けます。つまり、現在のコンテナーだけがプライベートボリュームを使用できます。
-
-
-d
オプションは、コンテナーをデタッチしてバックグラウンドで実行します。 -
オプション
-e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1>
は、サーバーの鍵のパスフレーズを定義します。 -
オプション
-e KEYLIME_VERIFIER_CLIENT_KEY_PASSWORD=<passphrase2>
は、クライアントの鍵のパスフレーズを定義します。 -
オプション
-e KEYLIME_VERIFIER_<ENVIRONMENT_VARIABLE>=<value>
を指定すると、環境変数で設定オプションをオーバーライドできます。複数のオプションを変更するには、環境変数ごとに-e
オプションを個別に挿入します。環境変数とそのデフォルト値の完全なリストは、Keylime の環境変数 を参照してください。
-
検証
コンテナーが実行されていることを確認します。
podman ps -a
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80b6b9dbf57c registry.access.redhat.com/rhel9/keylime-verifier:latest keylime_verifier 14 seconds ago Up 14 seconds 0.0.0.0:8881->8881/tcp keylime-verifier
Copy to Clipboard Copied!
6.4. パッケージから Keylime registrar をデプロイする
registrar は、すべてのエージェントのデータベースを含む Keylime コンポーネントであり、TPM ベンダーの公開鍵をホストします。registrar の HTTPS サービスは、Trusted Platform Module (TPM) 公開鍵を受け入れると、クォートを確認するためにこれらの公開鍵を取得するインターフェイスを提供します。
信頼の連鎖を維持するには、registrar を実行するシステムをセキュアに管理してください。
要件に応じて、registrar を別のシステムにインストールすることも、Keylime verifier と同じシステムにインストールすることもできます。verifier と registrar を別々のシステムで実行すると、パフォーマンスが向上します。
設定ファイルをドロップインディレクトリー内に整理するには、/etc/keylime/registrar.conf.d/00-registrar-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
- Keylime verifier がインストールされ実行されているシステムへのネットワークアクセスがある。詳細は以下を参照してください。
「パッケージから Keylime verifier をデプロイする」
-
root
権限と、Keylime コンポーネントをインストールするシステムへのネットワーク接続がある。 Keylime が registrar からのデータを保存するデータベースにアクセスできる。次のデータベース管理システムのいずれかを使用できます。
- SQLite (デフォルト)
- PostgreSQL
- MySQL
- MariaDB
- 認証局からの有効な鍵と証明書がある。
手順
Keylime registrar をインストールします。
dnf install keylime-registrar
# dnf install keylime-registrar
Copy to Clipboard Copied! /etc/keylime/registrar.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/registrar.conf.d/00-registrar-ip.conf
など) を作成して、registrar の IP アドレスとポートを定義します。[registrar] ip = <registrar_IP_address>
[registrar] ip = <registrar_IP_address>
Copy to Clipboard Copied! -
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。あるいは、ip = *
またはip = 0.0.0.0
を使用して、使用可能なすべての IP アドレスに registrar をバインドします。 -
必要に応じて、
port
オプションを使用して、Keylime エージェントが接続するポートを変更します。デフォルト値は8890
です。 -
必要に応じて、
tls_port
オプションを使用して、Keylime verifier とテナントが接続する TLS ポートを変更します。デフォルト値は8891
です。
-
オプション: エージェントのリスト用に registrar のデータベースを設定します。デフォルト設定では、registrar の
/var/lib/keylime/reg_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/registrar.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/registrar.conf.d/00-db-url.conf
など) を作成できます。[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
Copy to Clipboard Copied! <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
は、データベースの URL (例:postgresql://registrar:EKYYX-bqY2?#raXm@198.51.100.1/registrardb
) に置き換えます。使用する認証情報に、Keylime がデータベース構造を作成するための権限があることを確認してください。
registrar に証明書と鍵を追加します。
-
デフォルトの設定を使用して、鍵と証明書を
/var/lib/keylime/reg_ca
ディレクトリーにロードできます。 または、設定で鍵と証明書の場所を定義することもできます。
/etc/keylime/registrar.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/registrar.conf.d/00-keys-and-certs.conf
の内容は次のとおりです)。[registrar] tls_dir = /var/lib/keylime/reg_ca 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>']
[registrar] tls_dir = /var/lib/keylime/reg_ca 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>']
Copy to Clipboard Copied! 注記絶対パスを使用して、鍵と証明書の場所を定義します。または、
tls_dir
オプションでディレクトリーを定義し、そのディレクトリーからの相対パスを使用することもできます。
-
デフォルトの設定を使用して、鍵と証明書を
ファイアウォールでポートを開きます。
firewall-cmd --add-port 8890/tcp --add-port 8891/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8890/tcp --add-port 8891/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! 別のポートを使用する場合は、
8890
または8891
を.conf
ファイルで定義されているポート番号に置き換えます。keylime_registrar
サービスを起動します。systemctl enable --now keylime_registrar
# systemctl enable --now keylime_registrar
Copy to Clipboard Copied! 注記デフォルト設定では、verifier が他の Keylime コンポーネントの CA と証明書を作成するため、
keylime_registrar
サービスを起動する前にkeylime_verifier
を起動します。カスタム証明書を使用する場合、この順序で起動する必要はありません。
検証
keylime_registrar
サービスがアクティブで実行中であることを確認します。systemctl status keylime_registrar
# 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 ...
Copy to Clipboard Copied!
次のステップ
6.5. Keylime registrar をコンテナーとしてデプロイする
registrar は、すべてのエージェントのデータベースを格納する Keylime コンポーネントであり、Trusted Platform Module (TPM) ベンダーの公開鍵をホストします。registrar の HTTPS サービスは、TPM 公開鍵を受け入れると、クォートをチェックするために、この公開鍵を取得するためのインターフェイスを提供します。Keylime registrar は、ホスト上にバイナリーやパッケージがなくても、RPM 方式ではなくコンテナーとして設定できます。コンテナーとしてデプロイすることにより、Keylime コンポーネントの分離性、モジュール性、再現性が向上します。
コンテナーを起動すると、Keylime registrar がデフォルトの設定ファイルとともにデプロイされます。次の 1 つ以上の方法を使用して設定をカスタマイズできます。
- 設定ファイルを含むホストのディレクトリーをコンテナーにマウントします。これは、RHEL 9 のすべてのバージョンで使用できます。
- コンテナーで環境変数を直接変更します。これは、RHEL 9.3 以降のバージョンで使用できます。環境変数を変更すると、設定ファイルの値がオーバーライドされます。
前提条件
-
podman
パッケージとその依存関係がシステムにインストールされている。 オプション: Keylime が registrar からデータを保存するデータベースにアクセスできます。次のデータベース管理システムのいずれかを使用できます。
- SQLite (デフォルト)
- PostgreSQL
- MySQL
- MariaDB
- 認証局からの有効な鍵と証明書がある。
手順
オプション: 設定ファイルにアクセスするには、
keylime-registrar
パッケージをインストールします。このパッケージがなくてもコンテナーを設定することはできますが、パッケージに付属する設定ファイルを変更する方が簡単な場合があります。dnf install keylime-registrar
# dnf install keylime-registrar
Copy to Clipboard Copied! /etc/keylime/registrar.conf.d/
ディレクトリーに新しい.conf
ファイル (例:/etc/keylime/registrar.conf.d/00-registrar-ip.conf
) を作成し、次の内容を記述して、registrar を使用可能なすべての IP アドレスにバインドします。[registrar] ip = *
[registrar] ip = *
Copy to Clipboard Copied! -
必要に応じて、
port
オプションを使用して、Keylime エージェントが接続するポートを変更します。デフォルト値は8890
です。 -
必要に応じて、
tls_port
オプションを使用して、Keylime テナントが接続する TLS ポートを変更します。デフォルト値は8891
です。
-
必要に応じて、
オプション: エージェントのリスト用に registrar のデータベースを設定します。デフォルト設定では、registrar の
/var/lib/keylime/reg_data.sqlite
ディレクトリーにある SQLite データベースを使用します。/etc/keylime/registrar.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/registrar.conf.d/00-db-url.conf
など) を作成できます。[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
[registrar] database_url = <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
Copy to Clipboard Copied! <protocol>://<name>:<password>@<ip_address_or_hostname>/<properties>
は、データベースの URL (例:postgresql://registrar:EKYYX-bqY2?#raXm@198.51.100.1/registrardb
) に置き換えます。使用する認証情報に、Keylime がデータベース構造を作成するための権限があることを確認してください。
registrar に証明書と鍵を追加します。
-
デフォルトの設定を使用して、鍵と証明書を
/var/lib/keylime/reg_ca
ディレクトリーにロードできます。 または、設定で鍵と証明書の場所を定義することもできます。
/etc/keylime/registrar.conf.d/
ディレクトリーに新しい.conf
ファイルを作成します (例:/etc/keylime/registrar.conf.d/00-keys-and-certs.conf
の内容は次のとおりです)。[registrar] tls_dir = /var/lib/keylime/reg_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']
[registrar] tls_dir = /var/lib/keylime/reg_ca server_key = </path/to/server_key> server_cert = </path/to/server_cert> trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']
Copy to Clipboard Copied! 注記絶対パスを使用して、鍵と証明書の場所を定義します。または、
tls_dir
オプションでディレクトリーを定義し、そのディレクトリーからの相対パスを使用することもできます。
-
デフォルトの設定を使用して、鍵と証明書を
ファイアウォールでポートを開きます。
firewall-cmd --add-port 8890/tcp --add-port 8891/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 8890/tcp --add-port 8891/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! 別のポートを使用する場合は、
8890
または8891
を.conf
ファイルで定義されているポート番号に置き換えます。コンテナーを実行します。
podman run --name keylime-registrar \ -p 8890:8890 \ -p 8891:8891 \ -v /etc/keylime/registrar.conf.d:/etc/keylime/registrar.conf.d:Z \ -v /var/lib/keylime/reg_ca:/var/lib/keylime/reg_ca:Z \ -d \ -e KEYLIME_REGISTRAR_SERVER_KEY_PASSWORD=<passphrase1> \ registry.access.redhat.com/rhel9/keylime-registrar
$ podman run --name keylime-registrar \ -p 8890:8890 \ -p 8891:8891 \ -v /etc/keylime/registrar.conf.d:/etc/keylime/registrar.conf.d:Z \ -v /var/lib/keylime/reg_ca:/var/lib/keylime/reg_ca:Z \ -d \ -e KEYLIME_REGISTRAR_SERVER_KEY_PASSWORD=<passphrase1> \ registry.access.redhat.com/rhel9/keylime-registrar
Copy to Clipboard Copied! -
-p
オプションは、ホスト上とコンテナー上のデフォルトポート8890
および8881
を開きます。 -v
オプションは、コンテナーへのディレクトリーのバインドマウントを作成します。-
Z
オプションを指定すると、Podman がコンテンツにプライベート非共有ラベルを付けます。つまり、現在のコンテナーだけがプライベートボリュームを使用できます。
-
-
-d
オプションは、コンテナーをデタッチしてバックグラウンドで実行します。 -
オプション
-e KEYLIME_VERIFIER_SERVER_KEY_PASSWORD=<passphrase1>
は、サーバーの鍵のパスフレーズを定義します。 -
オプション
-e KEYLIME_REGISTRAR__<ENVIRONMENT_VARIABLE>=<value>
を指定すると、環境変数で設定オプションをオーバーライドできます。複数のオプションを変更するには、環境変数ごとに-e
オプションを個別に挿入します。環境変数とそのデフォルト値の完全なリストは、「Keylime の環境変数」 を参照してください。
-
検証
コンテナーが実行されていることを確認します。
podman ps -a
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 07d4b4bff1b6 localhost/keylime-registrar:latest keylime_registrar 12 seconds ago Up 12 seconds 0.0.0.0:8881->8881/tcp, 0.0.0.0:8891->8891/tcp keylime-registrar
Copy to Clipboard Copied!
次のステップ
6.6. RHEL システムロールを使用して Keylime サーバーをデプロイする
keylime_server
RHEL システムロールを使用して、Keylime サーバーのコンポーネントである verifier と registrar をセットアップできます。keylime_server
ロールは、verifier コンポーネントと registrar コンポーネントの両方を各ノードに共にインストールして設定します。
Ansible コントロールノードで以下の手順を実行します。
Keylime の詳細は、Keylime の仕組み を参照してください。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
必要なロールを定義する Playbook を作成します。
新しい YAML ファイルを作成し、これをテキストエディターで開きます。以下に例を示します。
vi keylime-playbook.yml
# vi keylime-playbook.yml
Copy to Clipboard Copied! 以下の内容を挿入します。
--- - name: Manage keylime servers hosts: all vars: keylime_server_verifier_ip: "{{ ansible_host }}" keylime_server_registrar_ip: "{{ ansible_host }}" keylime_server_verifier_tls_dir: <ver_tls_directory> keylime_server_verifier_server_cert: <ver_server_certfile> keylime_server_verifier_server_key: <ver_server_key> keylime_server_verifier_server_key_passphrase: <ver_server_key_passphrase> keylime_server_verifier_trusted_client_ca: <ver_trusted_client_ca_list> keylime_server_verifier_client_cert: <ver_client_certfile> keylime_server_verifier_client_key: <ver_client_key> keylime_server_verifier_client_key_passphrase: <ver_client_key_passphrase> keylime_server_verifier_trusted_server_ca: <ver_trusted_server_ca_list> keylime_server_registrar_tls_dir: <reg_tls_directory> keylime_server_registrar_server_cert: <reg_server_certfile> keylime_server_registrar_server_key: <reg_server_key> keylime_server_registrar_server_key_passphrase: <reg_server_key_passphrase> keylime_server_registrar_trusted_client_ca: <reg_trusted_client_ca_list> roles: - rhel-system-roles.keylime_server
--- - name: Manage keylime servers hosts: all vars: keylime_server_verifier_ip: "{{ ansible_host }}" keylime_server_registrar_ip: "{{ ansible_host }}" keylime_server_verifier_tls_dir: <ver_tls_directory> keylime_server_verifier_server_cert: <ver_server_certfile> keylime_server_verifier_server_key: <ver_server_key> keylime_server_verifier_server_key_passphrase: <ver_server_key_passphrase> keylime_server_verifier_trusted_client_ca: <ver_trusted_client_ca_list> keylime_server_verifier_client_cert: <ver_client_certfile> keylime_server_verifier_client_key: <ver_client_key> keylime_server_verifier_client_key_passphrase: <ver_client_key_passphrase> keylime_server_verifier_trusted_server_ca: <ver_trusted_server_ca_list> keylime_server_registrar_tls_dir: <reg_tls_directory> keylime_server_registrar_server_cert: <reg_server_certfile> keylime_server_registrar_server_key: <reg_server_key> keylime_server_registrar_server_key_passphrase: <reg_server_key_passphrase> keylime_server_registrar_trusted_client_ca: <reg_trusted_client_ca_list> roles: - rhel-system-roles.keylime_server
Copy to Clipboard Copied! 変数の詳細は、keylime_server RHEL システムロールの変数 を参照してください。
Playbook を実行します。
ansible-playbook <keylime-playbook.yml>
$ ansible-playbook <keylime-playbook.yml>
Copy to Clipboard Copied!
検証
keylime_verifier
サービスがアクティブであり、管理対象ホスト上で実行されていることを確認します。systemctl status keylime_verifier
# 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
Copy to Clipboard Copied! keylime_registrar
サービスがアクティブで実行中であることを確認します。systemctl status keylime_registrar
# 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 ...
Copy to Clipboard Copied!
次のステップ
6.7. keylime_server RHEL システムロールの変数
keylime_server
RHEL システムロールを使用して Keylime サーバーをセットアップする場合、registrar と verifier の次の変数をカスタマイズできます。
Keylime verifier を設定するための keylime_server
RHEL システムロール変数のリスト
keylime_server_verifier_ip
- verifier の IP アドレスを定義します。
keylime_server_verifier_tls_dir
-
キーと証明書が保存されるディレクトリーを指定します。デフォルトに設定されている場合、verifier は
/var/lib/keylime/cv_ca
ディレクトリーを使用します。 keylime_server_verifier_server_key_passphrase
- サーバーの秘密鍵を復号化するためのパスフレーズを指定します。値が空の場合、秘密鍵は暗号化されません。
keylime_server_verifier_server_cert
: Keylime verifier サーバー証明書ファイルを指定します。
keylime_server_verifier_trusted_client_ca
-
信頼できるクライアント CA 証明書のリストを定義します。ファイルは、
keylime_server_verifier_tls_dir
オプションで設定されたディレクトリーに保存する必要があります。 keylime_server_verifier_client_key
- Keylime verifier のクライアントの秘密鍵を含むファイルを定義します。
keylime_server_verifier_client_key_passphrase
- クライアントの秘密鍵ファイルを復号化するためのパスフレーズを定義します。値が空の場合、秘密鍵は暗号化されません。
keylime_server_verifier_client_cert
- Keylime verifier クライアント証明書ファイルを定義します。
keylime_server_verifier_trusted_server_ca
-
信頼できるサーバー CA 証明書のリストを定義します。ファイルは、
keylime_server_verifier_tls_dir
オプションで設定されたディレクトリーに保存する必要があります。
keylime_server RHEL システムロールをセットアップするための registrar 変数のリスト
keylime_server_registrar_ip
- registrar の IP アドレスを定義します。
keylime_server_registrar_tls_dir
-
registrar のキーと証明書を保存するディレクトリーを指定します。デフォルトに設定すると、registrar は
/var/lib/keylime/reg_ca
ディレクトリーを使用します。 keylime_server_registrar_server_key
- Keylime registrar のプライベートサーバーキーファイルを定義します。
keylime_server_registrar_server_key_passphrase
- registrar のサーバー秘密鍵を復号化するためのパスフレーズを指定します。値が空の場合、秘密鍵は暗号化されません。
keylime_server_registrar_server_cert
- Keylime registrar サーバー証明書ファイルを指定します。
keylime_server_registrar_trusted_client_ca
-
信頼できるクライアント CA 証明書のリストを定義します。ファイルは、
keylime_server_registrar_tls_dir
オプションで設定されたディレクトリーに保存する必要があります。
6.8. パッケージから Keylime テナントをデプロイする
Keylime は、ターゲットシステム上でのエージェントのプロビジョニングなど、多くの機能に keylime_tenant
ユーティリティーを使用します。keylime_tenant
は、要件に応じて、他の Keylime コンポーネントを実行するシステムを含む任意のシステムにインストールすることも、別のシステムにインストールすることもできます。
前提条件
-
root
権限と、Keylime コンポーネントをインストールするシステムへのネットワーク接続がある。 他の Keylime コンポーネントが設定されているシステムへのネットワークアクセスがある。
- verifier
- 詳細は、「パッケージから Keylime verifier をデプロイする」 を参照してください。
- registrar
- 詳細は、「パッケージから Keylime registrar をデプロイする」 を参照してください。
手順
Keylime テナントをインストールします。
dnf install keylime-tenant
# dnf install keylime-tenant
Copy to Clipboard Copied! /etc/keylime/tenant.conf.d/00-verifier-ip.conf
ファイルを編集して、Keylime verifier へのテナントの接続を定義します。[tenant] verifier_ip = <verifier_ip>
[tenant] verifier_ip = <verifier_ip>
Copy to Clipboard Copied! -
<verifier_ip>
は、verifier のシステムの IP アドレスに置き換えます。 -
verifier がデフォルト値
8881
とは異なるポートを使用する場合は、verifier_port = <verifier_port>
設定を追加します。
-
/etc/keylime/tenant.conf.d/00-registrar-ip.conf
ファイルを編集して、Keylime registrar へのテナントの接続を定義します。[tenant] registrar_ip = <registrar_ip>
[tenant] registrar_ip = <registrar_ip>
Copy to Clipboard Copied! -
<registrar_ip>
は、registrar のシステムの IP アドレスに置き換えます。 -
registrar がデフォルト値
8891
とは異なるポートを使用する場合は、registrar_port = <registrar_port>
設定を追加します。
-
テナントに証明書と鍵を追加します。
-
デフォルトの設定を使用して、鍵と証明書を
/var/lib/keylime/cv_ca
ディレクトリーにロードできます。 または、設定で鍵と証明書の場所を定義することもできます。
/etc/keylime/tenant.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/tenant.conf.d/00-keys-and-certs.conf
など) を作成します。[tenant] tls_dir = /var/lib/keylime/cv_ca client_key = tenant-key.pem client_key_password = <passphrase1> client_cert = tenant-cert.pem trusted_server_ca = ['</path/to/ca/cert>']
[tenant] tls_dir = /var/lib/keylime/cv_ca client_key = tenant-key.pem client_key_password = <passphrase1> client_cert = tenant-cert.pem trusted_server_ca = ['</path/to/ca/cert>']
Copy to Clipboard Copied! trusted_server_ca
パラメーターは、verifier および registrar サーバーの CA 証明書へのパスを受け入れます。verifier と registrar が異なる CA を使用する場合などに、複数のコンマ区切りのパスを指定できます。注記絶対パスを使用して、鍵と証明書の場所を定義します。または、
tls_dir
オプションでディレクトリーを定義し、そのディレクトリーからの相対パスを使用することもできます。
-
デフォルトの設定を使用して、鍵と証明書を
-
オプション:
/var/lib/keylime/tpm_cert_store
ディレクトリー内の証明書を使用して Trusted Platform Module (TPM) の保証鍵 (EK) を検証できない場合は、証明書をそのディレクトリーに追加します。これは、エミュレートされた TPM を備えた仮想マシンを使用する場合に特に発生する可能性があります。
検証
verifier のステータスを確認します。
keylime_tenant -c cvstatus
# 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.
Copy to Clipboard Copied! 正しくセットアップされていて、エージェントが設定されていない場合、verifier は、デフォルトのエージェント UUID を認識しないと応答します。
registrar のステータスを確認します。
keylime_tenant -c regstatus
# 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": {}}
Copy to Clipboard Copied! 正しくセットアップされていて、エージェントが設定されていない場合、registrar は、デフォルトのエージェント UUID を認識しないと応答します。
6.9. パッケージから Keylime エージェントをデプロイする
Keylime エージェントは、Keylime によって監視されるすべてのシステムにデプロイされるコンポーネントです。
デフォルトでは、Keylime エージェントはすべてのデータを監視対象システムの /var/lib/keylime/
ディレクトリーに保存します。
設定ファイルをドロップインディレクトリー内で整理するには、/etc/keylime/agent.conf.d/00-registrar-ip.conf
のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。
前提条件
-
監視対象システムに対する
root
権限がある。 -
監視対象システムに Trusted Platform Module (TPM) が搭載されている。確認するには、
tpm2_pcrread
コマンドを入力します。出力が複数のハッシュを返す場合は、TPM が使用可能です。 他の Keylime コンポーネントが設定されているシステムへのネットワークアクセスがある。
- verifier
- 詳細は、パッケージから Keylime verifier をデプロイする を参照してください。
- registrar
- 詳細は、パッケージから Keylime registrar をデプロイする を参照してください。
- テナント
- 詳細は、パッケージから Keylime テナントをデプロイする 参照してください。
- 監視対象システムで Integrity Measurement Architecture (IMA) が有効になっている。詳細は、整合性測定アーキテクチャーと拡張検証モジュールの有効化 を参照してください。
手順
Keylime エージェントをインストールします。
dnf install keylime-agent
# dnf install keylime-agent
Copy to Clipboard Copied! このコマンドは、
keylime-agent-rust
パッケージをインストールします。設定ファイルでエージェントの IP アドレスとポートを定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/agent.conf.d/00-agent-ip.conf
など) を作成します。[agent] ip = '<agent_ip>'
[agent] ip = '<agent_ip>'
Copy to Clipboard Copied! 注記Keylime エージェントの設定では TOML 形式が使用されます。これは、他のコンポーネントの設定に使用される INI 形式とは異なります。したがって、値は有効な TOML 構文で入力してください。たとえば、パスは一重引用符で囲み、複数のパスの配列は角括弧で囲みます。
-
<agent_IP_address>
は、エージェントの IP アドレスに置き換えます。あるいは、ip = '*'
またはip = '0.0.0.0'
を使用して、使用可能なすべての IP アドレスにエージェントをバインドします。 -
必要に応じて、
port = '<agent_port>'
オプションを使用して、エージェントのポートをデフォルト値9002
から変更することもできます。
-
設定ファイルで registrar の IP アドレスとポートを定義します。
/etc/keylime/agent.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/agent.conf.d/00-registrar-ip.conf
など) を作成します。[agent] registrar_ip = '<registrar_IP_address>'
[agent] registrar_ip = '<registrar_IP_address>'
Copy to Clipboard Copied! -
<registrar_IP_address>
を registrar の IP アドレスに置き換えます。 -
必要に応じて、
registrar_port = '<registrar_port>'
オプションを使用して、registrar のポートをデフォルト値8890
から変更することもできます。
-
オプション: エージェントの汎用一意識別子 (UUID) を定義します。定義されていない場合は、デフォルトの UUID が使用されます。
/etc/keylime/agent.conf.d/
ディレクトリーに、次の内容の新しい.conf
ファイル (/etc/keylime/agent.conf.d/00-agent-uuid.conf
など) を作成します。[agent] uuid = '<agent_UUID>'
[agent] uuid = '<agent_UUID>'
Copy to Clipboard Copied! -
<agent_UUID>
は、エージェントの UUID に置き換えます (例:d432fbb3-d2f1-4a97-9ef7-abcdef012345)
。uuidgen
ユーティリティーを使用して UUID を生成できます。
-
オプション: エージェントの既存のキーと証明書を読み込みます。エージェントが
server_key
とserver_cert
を受信しない場合、エージェントは独自の鍵と自己署名証明書を生成します。設定で鍵と証明書の場所を定義します。
/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/cert3>, </path/to/ca/cert4>]'
[agent] server_key = '</path/to/server_key>' server_key_password = '<passphrase1>' server_cert = '</path/to/server_cert>' trusted_client_ca = '[</path/to/ca/cert3>, </path/to/ca/cert4>]'
Copy to Clipboard Copied! 注記絶対パスを使用して、鍵と証明書の場所を定義します。Keylime エージェントは相対パスを受け入れません。
ファイアウォールでポートを開きます。
firewall-cmd --add-port 9002/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port 9002/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! 別のポートを使用する場合は、
9002
を.conf
ファイルで定義されているポート番号に置き換えます。keylime_agent
サービスを有効にして起動します。systemctl enable --now keylime_agent
# systemctl enable --now keylime_agent
Copy to Clipboard Copied! オプション: Keylime テナントが設定されているシステムから、エージェントが正しく設定されており、registrar に接続できることを確認します。
keylime_tenant -c regstatus --uuid <agent_uuid>
# keylime_tenant -c regstatus --uuid <agent_uuid> Reading configuration from ['/etc/keylime/logging.conf'] ... ==\n-----END CERTIFICATE-----\n", "ip": "127.0.0.1", "port": 9002, "regcount": 1, "operational_state": "Registered"}}}
Copy to Clipboard Copied! <agent_uuid>
は、エージェントの UUID に置き換えます。registrar と agent が正しく設定されている場合、出力にはエージェントの IP アドレスとポートが表示され、その後に
"operational_state": "Registered"
が表示されます。
/etc/ima/ima-policy
ファイルに次の内容を入力して、新しい IMA ポリシーを作成します。PROC_SUPER_MAGIC = 0x9fa0 SYSFS_MAGIC = 0x62656572 DEBUGFS_MAGIC = 0x64626720 TMPFS_MAGIC = 0x01021994 RAMFS_MAGIC DEVPTS_SUPER_MAGIC=0x1cd1 BINFMTFS_MAGIC=0x42494e4d SECURITYFS_MAGIC=0x73636673 SELINUX_MAGIC=0xf97cff8c SMACK_MAGIC=0x43415d53 NSFS_MAGIC=0x6e736673 EFIVARFS_MAGIC CGROUP_SUPER_MAGIC=0x27e0eb CGROUP2_SUPER_MAGIC=0x63677270 OVERLAYFS_MAGIC when containers are used we almost always want to ignore them MEASUREMENTS
# PROC_SUPER_MAGIC = 0x9fa0 dont_measure fsmagic=0x9fa0 # SYSFS_MAGIC = 0x62656572 dont_measure fsmagic=0x62656572 # DEBUGFS_MAGIC = 0x64626720 dont_measure fsmagic=0x64626720 # TMPFS_MAGIC = 0x01021994 dont_measure fsmagic=0x1021994 # RAMFS_MAGIC dont_measure fsmagic=0x858458f6 # DEVPTS_SUPER_MAGIC=0x1cd1 dont_measure fsmagic=0x1cd1 # BINFMTFS_MAGIC=0x42494e4d dont_measure fsmagic=0x42494e4d # SECURITYFS_MAGIC=0x73636673 dont_measure fsmagic=0x73636673 # SELINUX_MAGIC=0xf97cff8c dont_measure fsmagic=0xf97cff8c # SMACK_MAGIC=0x43415d53 dont_measure fsmagic=0x43415d53 # NSFS_MAGIC=0x6e736673 dont_measure fsmagic=0x6e736673 # EFIVARFS_MAGIC dont_measure fsmagic=0xde5e81e4 # CGROUP_SUPER_MAGIC=0x27e0eb dont_measure fsmagic=0x27e0eb # CGROUP2_SUPER_MAGIC=0x63677270 dont_measure fsmagic=0x63677270 # OVERLAYFS_MAGIC # when containers are used we almost always want to ignore them dont_measure fsmagic=0x794c7630 # MEASUREMENTS measure func=BPRM_CHECK measure func=FILE_MMAP mask=MAY_EXEC measure func=MODULE_CHECK uid=0
Copy to Clipboard Copied! このポリシーは、実行されたアプリケーションのランタイム監視をターゲットとしています。このポリシーは状況に応じて調整できます。MAGIC 定数については、
statfs(2)
man ページを参照してください。カーネルパラメーターを更新します。
grubby --update-kernel DEFAULT --args 'ima_appraise=fix ima_canonical_fmt ima_policy=tcb ima_template=ima-ng'
# grubby --update-kernel DEFAULT --args 'ima_appraise=fix ima_canonical_fmt ima_policy=tcb ima_template=ima-ng'
Copy to Clipboard Copied! - システムを再起動して、新しい IMA ポリシーを適用します。
検証
エージェントが実行されていることを確認します。
systemctl status keylime_agent
# systemctl status keylime_agent ● keylime_agent.service - The Keylime compute agent Loaded: loaded (/usr/lib/systemd/system/keylime_agent.service; enabled; preset: disabled) Active: active (running) since ...
Copy to Clipboard Copied!
次のステップ
監視対象のすべてのシステムでエージェントを設定したら、Keylime をデプロイして、次の機能のいずれかまたは両方を実行できます。
6.10. ランタイム監視用に Keylime を設定する
監視対象システムの状態が正しいことを確認するには、Keylime エージェントが監視対象システム上で実行されている必要があります。
Keylime のランタイム監視は、Integrity Measurement Architecture (IMA) を使用して多数のファイルを測定するため、システムのパフォーマンスに重大な影響を与える可能性があります。
エージェントをプロビジョニングするときに、Keylime が監視対象システムに送信するファイルを定義することもできます。Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。
Keylime の除外リストを設定することで、Keylime が特定のファイルまたは特定のディレクトリー内の変更を無視するようにできます。ファイルを除外しても、そのファイルは引き続き IMA によって測定されます。
許可リストと除外リストは、Keylime ランタイムポリシーに統合されます。
前提条件
Keylime コンポーネントが設定されているシステムへのネットワークアクセスがある。
- verifier
- 詳細は、パッケージから Keylime verifier をデプロイする を参照してください。
- registrar
- 詳細は、パッケージから Keylime registrar をデプロイする を参照してください。
- テナント
- 詳細は、パッケージから Keylime テナントをデプロイする 参照してください。
- エージェント
- 詳細は、パッケージから Keylime エージェントをデプロイする を参照してください。
手順
Keylime エージェントが設定され実行されている監視対象システムに、
keylime-policy
ツールを含むpython3-keylime
パッケージをインストールします。dnf -y install python3-keylime
# dnf -y install python3-keylime
Copy to Clipboard Copied! エージェントシステムの現在の状態からランタイムポリシーを作成します。
keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>
# keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>
Copy to Clipboard Copied! このコマンドの詳細は次のとおりです。
-
<policy.json>
はランタイムポリシーのファイル名に置き換えます。 次のディレクトリーは測定から自動的に除外されます。
-
/sys
-
/run
-
/proc
-
/lost+found
-
/dev
-
/media
-
/snap
-
/mnt
-
/var
-
/tmp
-
-
必要に応じて、
--excludelist <excludelist.txt>
オプションを追加して、追加の特定のパスを測定から除外することもできます。除外リストでは、1 行に 1 つの Python 正規表現を使用できます。特殊文字の完全なリストは、docs.python.org の Regular expression operations を参照してください。
-
生成されたランタイムポリシーを、
keylime_tenant
ユーティリティーが設定されているシステムにコピーします。次に例を示します。scp <policy.json> root@<tenant.ip>:/root/<policy.json>
# scp <policy.json> root@<tenant.ip>:/root/<policy.json>
Copy to Clipboard Copied! Keylime テナントが設定されているシステムで、
keylime_tenant
ユーティリティーを使用してエージェントをプロビジョニングします。keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert default
# keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert default
Copy to Clipboard Copied! -
<agent_ip>
は、エージェントの IP アドレスに置き換えます。 -
<agent_uuid>
は、エージェントの UUID に置き換えます。 -
<policy.json>
を Keylime ランタイムポリシーファイルへのパスに置き換えます。 --cert
オプションを使用すると、テナントは、指定されたディレクトリーまたはデフォルトの/var/lib/keylime/ca/
ディレクトリーにある CA 証明書と鍵を使用して、エージェントの証明書を生成し、署名します。ディレクトリーに CA 証明書と鍵が含まれていない場合、テナントは/etc/keylime/ca.conf
ファイルの設定に従ってそれらを自動的に生成し、指定されたディレクトリーに保存します。その後、テナントはこれらの鍵と証明書をエージェントに送信します。CA 証明書または署名エージェント証明書を生成するときに、CA 秘密鍵にアクセスするためのパスワードの入力を求められる (
Please enter the password to decrypt your keystore:
) 場合があります。注記Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は送信された
.zip
ファイルを展開します。
たとえば、次のコマンドを使用すると、
keylime_tenant
は UUIDd432fbb3-d2f1-4a97-9ef7-75bd81c00000
を持つ新しい Keylime エージェントを127.0.0.1
にプロビジョニングし、policy.json
というランタイムポリシーをロードします。また、デフォルトのディレクトリーに証明書を生成し、その証明書ファイルをエージェントに送信します。Keylime は、/etc/keylime/verifier.conf
で設定された TPM ポリシーが満たされている場合にのみ、ファイルを復号化します。keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert default
# keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert default
Copy to Clipboard Copied! 注記# keylime_tenant --command delete --uuid <agent_uuid>
コマンドを使用して、Keylime によるノードの監視を停止できます。keylime_tenant --command update
コマンドを使用して、すでに登録されているエージェントの設定を変更できます。-
検証
- オプション: 監視対象システムを再起動して、設定が永続的であることを確認します。
エージェントのアテステーションが成功することを確認します。
keylime_tenant --command cvstatus --uuid <agent_uuid>
# keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...
Copy to Clipboard Copied! <agent_uuid>
は、エージェントの UUID に置き換えます。operational_state
の値がGet Quote
で、attestation_count
が 0 以外の場合、このエージェントのアテステーションは成功しています。Operational_state
の値がInvalid Quote
かFailed
の場合、アテステーションは失敗し、次のようなコマンド出力が表示されます。{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
Copy to Clipboard Copied! アテステーションが失敗した場合は、verifier ログで詳細を表示します。
journalctl --unit keylime_verifier
# journalctl --unit keylime_verifier 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
Copy to Clipboard Copied!
6.11. ブート測定のアテステーション用に Keylime を設定する
Keylime をブート測定のアテステーション用に設定すると、Keylime は、測定対象システム上のブートプロセスが、定義した状態と一致しているかどうかを確認します。
前提条件
Keylime コンポーネントが設定されているシステムへのネットワークアクセスがある。
- verifier
- 詳細は、パッケージから Keylime verifier をデプロイする を参照してください。
- registrar
- 詳細は、パッケージから Keylime registrar をデプロイする を参照してください。
- テナント
- 詳細は、パッケージから Keylime テナントをデプロイする 参照してください。
- エージェント
- 詳細は、パッケージから Keylime エージェントをデプロイする を参照してください。
- Unified Extensible Firmware Interface (UEFI) がエージェントシステムで有効になっている。
手順
Keylime エージェントが設定され実行されている監視対象システムに、
keylime-policy
ツールを含むpython3-keylime
パッケージをインストールします。dnf -y install python3-keylime
# dnf -y install python3-keylime
Copy to Clipboard Copied! 監視対象システムで、
keylime-policy
ツールを使用して、システムの現在の状態を測定したブートログからポリシーを生成します。keylime-policy create measured-boot --eventlog-file /sys/kernel/security/tpm0/binary_bios_measurements --output <./measured_boot_reference_state.json>
# keylime-policy create measured-boot --eventlog-file /sys/kernel/security/tpm0/binary_bios_measurements --output <./measured_boot_reference_state.json>
Copy to Clipboard Copied! -
<./measured_boot_reference_state.json>
は、keylime-policy
によって生成されるポリシーが保存されるパスに置き換えます。 UEFI システムでセキュアブートが有効になっていない場合は、
--without-secureboot
引数を渡します。重要keylime-policy
によって生成されるポリシーは、システムの現在の状態に基づいており、非常に厳格です。カーネルの更新やシステムの更新を含め、システムに変更を加えると、ブートプロセスが変更され、システムはアテステーションに失敗します。
-
生成されたポリシーを、
keylime_tenant
ユーティリティーが設定されているシステムにコピーします。次に例を示します。scp root@<agent_ip>:<./measured_boot_reference_state.json> <./measured_boot_reference_state.json>
# scp root@<agent_ip>:<./measured_boot_reference_state.json> <./measured_boot_reference_state.json>
Copy to Clipboard Copied! Keylime テナントが設定されているシステムで、
keylime_tenant
ユーティリティーを使用してエージェントをプロビジョニングします。keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --mb_refstate <./measured_boot_reference_state.json> --cert default
# keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --mb_refstate <./measured_boot_reference_state.json> --cert default
Copy to Clipboard Copied! -
<agent_ip>
は、エージェントの IP アドレスに置き換えます。 -
<agent_uuid>
は、エージェントの UUID に置き換えます。 -
<./measured_boot_reference_state.json>
を、ブート測定ポリシーへのパスに置き換えます。
ランタイム監視と一緒にブート測定を設定する場合は、
keylime_tenant --command add
コマンドを入力するときに両方のユースケースのオプションをすべて指定します。注記# keylime_tenant --command delete --targethost <agent_ip> --uuid <agent_uuid>
コマンドを使用して、Keylime によるノードの監視を停止できます。keylime_tenant --command update
コマンドを使用して、すでに登録されているエージェントの設定を変更できます。-
検証
監視対象システムを再起動し、エージェントのアテステーションが成功することを確認します。
keylime_tenant --command cvstatus --uuid <agent_uuid>
# keylime_tenant --command cvstatus --uuid <agent_uuid> ... {"<agent_uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...
Copy to Clipboard Copied! <agent_uuid>
は、エージェントの UUID に置き換えます。operational_state
の値がGet Quote
で、attestation_count
が 0 以外の場合、このエージェントのアテステーションは成功しています。Operational_state
の値がInvalid Quote
かFailed
の場合、アテステーションは失敗し、次のようなコマンド出力が表示されます。{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
{"<agent_uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
Copy to Clipboard Copied! アテステーションが失敗した場合は、verifier ログで詳細を表示します。
journalctl -u keylime_verifier
# journalctl -u keylime_verifier {"d432fbb3-d2f1-4a97-9ef7-75bd81c00000": {"operational_state": "Tenant Quote Failed", ... "last_event_id": "measured_boot.invalid_pcr_0", "attestation_count": 0, "last_received_quote": 1684487093, "last_successful_attestation": 0}}
Copy to Clipboard Copied!
6.12. Keylime の環境変数
podman run
コマンドで -e
オプションを使用してコンテナーを起動するときなどに、Keylime の環境変数を設定すると、設定ファイルの値をオーバーライドできます。
環境変数の構文は次のとおりです。
KEYLIME_<SECTION>_<ENVIRONMENT_VARIABLE>=<value>
KEYLIME_<SECTION>_<ENVIRONMENT_VARIABLE>=<value>
ここでは、以下のようになります。
-
<SECTION>
は Keylime 設定ファイルのセクションです。 -
<ENVIRONMENT_VARIABLE>
は環境変数です。 -
<value>
は環境変数に設定する値です。
たとえば、-e KEYLIME_VERIFIER_MAX_RETRIES=6
は、[verifier]
セクションの max_retries
設定オプションを 6
に設定します。
verifier の設定
設定オプション | 環境変数 | デフォルト値 |
---|---|---|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
registrar の設定
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
テナント設定
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CA 設定
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
エージェント設定
設定オプション | 環境変数 | デフォルト値 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
ロギング設定
設定オプション | 環境変数 | デフォルト値 |
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
|
|
|
|
|
|
|
|
|
|
|
設定オプション | 環境変数 | デフォルト値 |
|
| |
|
|
|
|
|
|
第7章 AIDE で整合性の確認
Advanced Intrusion Detection Environment (AIDE) は、システムにファイルのデータベースを作成し、そのデータベースを使用してファイルの整合性を確保し、システムの侵入を検出するユーティリティーです。
7.1. AIDE のインストール
AIDE を使用してファイル整合性チェックを開始するには、対応するパッケージをインストールし、AIDE データベースを初期化する必要があります。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
aide
パッケージをインストールします。dnf install aide
# dnf install aide
Copy to Clipboard Copied! 初期データベースを生成します。
aide --init
# aide --init Start timestamp: 2024-07-08 10:39:23 -0400 (AIDE 0.16) AIDE initialized database at /var/lib/aide/aide.db.new.gz Number of entries: 55856 --------------------------------------------------- The attributes of the (uncompressed) database(s): --------------------------------------------------- /var/lib/aide/aide.db.new.gz … SHA512 : mZaWoGzL2m6ZcyyZ/AXTIowliEXWSZqx IFYImY4f7id4u+Bq8WeuSE2jasZur/A4 FPBFaBkoCFHdoE/FW/V94Q==
Copy to Clipboard Copied! -
オプション: デフォルト設定では、
aide --init
コマンドは、/etc/aide.conf
ファイルで定義するディレクトリーとファイルのセットのみを確認します。ディレクトリーまたはファイルを AIDE データベースに追加し、監視パラメーターを変更するには、/etc/aide.conf
を変更します。 データベースの使用を開始するには、初期データベースのファイル名から末尾の
.new
を削除します。mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
Copy to Clipboard Copied! -
オプション: AIDE データベースの場所を変更するには、
/etc/aide.conf
ファイルを編集し、DBDIR
値を変更します。追加のセキュリティーのデータベース、設定、/usr/sbin/aide
バイナリーファイルを、読み取り専用メディアなどの安全な場所に保存します。
7.2. AIDE を使用した整合性チェックの実行
crond
サービスを使用すると、AIDE で定期的なファイル整合性チェックをスケジュールできます。
前提条件
- AIDE が適切にインストールされ、データベースが初期化されている。AIDE のインストール を参照してください。
手順
手動でチェックを開始するには、以下を行います。
aide --check
# aide --check Start timestamp: 2024-07-08 10:43:46 -0400 (AIDE 0.16) AIDE found differences between database and file system!! Summary: Total number of entries: 55856 Added entries: 0 Removed entries: 0 Changed entries: 1 --------------------------------------------------- Changed entries: --------------------------------------------------- f ... ..S : /root/.viminfo --------------------------------------------------- Detailed information about changes: --------------------------------------------------- File: /root/.viminfo SELinux : system_u:object_r:admin_home_t:s | unconfined_u:object_r:admin_home 0 | _t:s0 …
Copy to Clipboard Copied! 少なくとも、AIDE を毎週実行するようにシステムを設定します。最適な設定としては、AIDE を毎日実行します。たとえば、
cron
コマンドを使用して毎日午前 04:05 に AIDE を実行するようにスケジュールするには、/etc/crontab
ファイルに次の行を追加します。05 4 * * * root /usr/sbin/aide --check
05 4 * * * root /usr/sbin/aide --check
Copy to Clipboard Copied!
7.3. AIDE データベースの更新
パッケージの更新や設定ファイルの調整など、システムの変更が確認できたら、基本となる AIDE データベースも更新します。
前提条件
- AIDE が適切にインストールされ、データベースが初期化されている。AIDE のインストール を参照してください。
手順
基本となる AIDE データベースを更新します。
aide --update
# aide --update
Copy to Clipboard Copied! aide --update
コマンドは、/var/lib/aide/aide.db.new.gz
データベースファイルを作成します。-
整合性チェックで更新したデータベースを使用するには、ファイル名から末尾の
.new
を削除します。
7.4. ファイル整合性ツール:AIDE および IMA
Red Hat Enterprise Linux は、システム上のファイルとディレクトリーの整合性をチェックおよび保持するためのさまざまなツールを提供します。次の表は、シナリオに適したツールを決定するのに役立ちます。
比較項目 | Advanced Intrusion Detection Environment (AIDE) | Integrity Measurement Architecture (IMA) |
---|---|---|
確認対象 | AIDE は、システム上のファイルとディレクトリーのデータベースを作成するユーティリティーです。このデータベースは、ファイルの整合性をチェックし、侵入を検出するのに役立ちます。 | IMA は、以前に保存された拡張属性と比較してファイル測定値 (ハッシュ値) をチェックすることにより、ファイルが変更されているかどうかを検出します。 |
確認方法 | AIDE はルールを使用して、ファイルとディレクトリーの整合性状態を比較します。 | IMA は、ファイルハッシュ値を使用して侵入を検出します。 |
理由 | 検出 - AIDE は、ルールを検証することにより、ファイルが変更されているかどうかを検出します。 | 検出と防止 - IMA は、ファイルの拡張属性を置き換えることにより、攻撃を検出および防止します。 |
使用方法 | AIDE は、ファイルまたはディレクトリーが変更されたときに脅威を検出します。 | 誰かがファイル全体の変更を試みた時に、IMA は脅威を検出します。 |
範囲 | AIDE は、ローカルシステム上のファイルとディレクトリーの整合性をチェックします。 | IMA は、ローカルシステムとリモートシステムのセキュリティーを確保します。 |
7.5. aide RHEL システムロールを使用したファイル整合性チェックの設定
aide
RHEL システムロールを使用すると、複数のシステムにわたり一貫して Advanced Intrusion Detection Environment (AIDE) を設定できます。このロールは、すべての管理対象ノードに aide
パッケージを自動的にインストールし、設定に応じて次のアクションを実行できます。
- AIDE データベースを初期化し、コントロールノードに保存する
- 管理対象ノードで AIDE 整合性チェックを実行する
- AIDE データベースを更新し、コントロールノードに保存する
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Configure system integrity hosts: managed-node-01.example.com tasks: - name: Configure file integrity checks with AIDE ansible.builtin.include_role: name: rhel-system-roles.aide.aide vars: aide_db_fetch_dir: files aide_init: true aide_check: false aide_update: false aide_cron_check: true aide_cron_interval: 0 12 * * *
--- - name: Configure system integrity hosts: managed-node-01.example.com tasks: - name: Configure file integrity checks with AIDE ansible.builtin.include_role: name: rhel-system-roles.aide.aide vars: aide_db_fetch_dir: files aide_init: true aide_check: false aide_update: false aide_cron_check: true aide_cron_interval: 0 12 * * *
Copy to Clipboard Copied! サンプル Playbook で指定されている設定は次のとおりです。
aide_db_fetch_dir: files
-
リモートノードから取得した AIDE データベースを保存するための Ansible コントロールノード (ACN) 上のディレクトリーを指定します。デフォルトの
files
値では、Playbook と同じディレクトリーにデータベースが保存されます。データベースファイルを別の場所に保存するには、別のパスを指定します。 aide_check: false
- リモートノードで整合性チェックを実行します。
aide_update: false
- AIDE データベースを更新し、コントロールノードに保存します。
aide_cron_check: true
-
管理対象ノードで AIDE 整合性チェックをアクティブ化する定期的な
cron
ジョブを設定します。 aide_cron_interval: 0 12 * * *
cron
ジョブの間隔を<minute> <hour> <day_of_month> <month> <day of week>
という形式で設定します。値を0 12 * * *
にすると、毎日正午にジョブを実行するように設定されます。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.aide/README.md
ファイルを参照してください。
Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第8章 sudo アクセスの管理
システム管理者は、root 以外のユーザーに、通常 root ユーザー用に予約されている管理コマンドを実行できるようにする sudo
アクセスを付与できます。これにより、root 以外のユーザーは、root ユーザーアカウントにログインせずに、このようなコマンドを実行できます。
8.1. sudoers のユーザー認可
/etc/sudoers
ファイルは、どのユーザーが sudo
コマンドを使用して他のコマンドを実行できるかを指定します。ルールは、個別のユーザーおよびユーザーグループに適用できます。エイリアスを使用して、ホスト、コマンド、さらにはユーザーのグループに対するルールをより簡単に定義することもできます。デフォルトのエイリアスは、/etc/sudoers
ファイルの最初の部分で定義されます。
認可されていないユーザーが sudo
を使用してコマンドを入力すると、システムは文字列 <username> : user NOT in sudoers
を含むメッセージをジャーナルログに記録します。
デフォルトの /etc/sudoers
ファイルは、認可の情報と例を提供します。対応する行をコメント解除すると、特定のルール例をアクティブにできます。ユーザー認可に関するセクションには、以下の概要が示されます。
## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems).
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
次の形式を使用して、新しい sudoers
認可を作成したり、既存の認可を変更したりできます。
<username> <hostname.example.com>=(<run_as_user>:<run_as_group>) <path/to/command>
<username> <hostname.example.com>=(<run_as_user>:<run_as_group>) <path/to/command>
詳細は以下のようになります。
-
<username>
はコマンドを入力するユーザーです (例:user1
)。値が%
で始まる場合はグループを定義します (例:%group1
)。 -
<hostname.example.com>
は、ルールが適用されるホストの名前です。 -
セクション
(<run_as_user>:<run_as_group>)
は、コマンドを実行するユーザーまたはグループを定義します。このセクションを省略すると、<username>
は root としてコマンドを実行できます。 -
<path/to/command>
は、コマンドへの完全な絶対パスです。また、コマンドパスの後にオプションを追加することにより、特定のオプションおよび引数を指定したコマンドのみを実行するようにユーザーを制限することもできます。オプションを指定しないと、すべてのオプションが有効な状態でコマンドを使用できます。
これらの変数のいずれかを ALL
に置き換えることで、ルールをすべてのユーザー、ホスト、またはコマンドに適用できます。
ALL ALL=(ALL) ALL
などの過度に寛容なルールを使用すると、すべてのユーザーがすべてのコマンドを、いずれのホストのいずれのユーザーとしても使用できます。これは重大なセキュリティーリスクをもたらします。
!
演算子を使用して引数を負の値で指定できます。たとえば、!root
は root 以外のすべてのユーザーを指定します。特定のユーザー、グループ、およびコマンドを許可する方が、特定のユーザー、グループ、およびコマンドを拒否するよりも安全です。これは、許可ルールにより、認可されていない新規ユーザーまたはグループもブロックされるためです。
alias
コマンドでコマンドの名前を変更すると、このような規則が上書きされるため、コマンドに否定的な規則を使用しないでください。
システムは、/etc/sudoers
ファイルを最初から最後まで読み取ります。したがって、ファイルにユーザーの複数のエントリーが含まれている場合、エントリーは順番に適用されます。値が競合する場合は、最も具体的な一致ではない場合でも、システムは最後の一致を使用します。
システム更新中にルールを保持し、エラーを簡単に修正するには、ルールを /etc/sudoers
ファイルに直接入力するのではなく、/etc/sudoers.d/
ディレクトリーに新しいファイルを作成して、新しいルールを入力します。システムは、/etc/sudoers
ファイル内で以下の行に到達する際に、/etc/sudoers.d
ディレクトリー内のファイルを読み取ります。
#includedir /etc/sudoers.d
#includedir /etc/sudoers.d
この行の頭にある番号記号 (#
) は構文の一部であり、行がコメントであることを意味するものではありません。そのディレクトリー内のファイル名にはピリオドを使用することができません。また、末尾にチルダ (~
) を使用することもできません。
8.2. ユーザーへの sudo アクセス権限の付与
システム管理者は、root 以外のユーザーに sudo
アクセスを付与することで、管理コマンドの実行を許可できます。sudo
コマンドは、root ユーザーのパスワードを使用せずに、管理アクセスを持つユーザーを提供する方法です。
ユーザーが管理コマンドを実行する必要がある場合、そのコマンドの前に sudo
を付けることができます。ユーザーがコマンドに対する認可を持っている場合、コマンドは root であるかのように実行されます。
以下の制限事項に注意してください。
-
sudo
コマンドを使用できるのは、/etc/sudoers
設定ファイルにリストされているユーザーだけです。 -
コマンドは、root シェルではなく、ユーザーのシェルで実行されます。ただし、例外があります。たとえば、すべてのユーザーに完全な
sudo
権限が付与されている場合などです。このような場合、ユーザーは root シェルでコマンドを切り替えて実行できます。以下に例を示します。 -
sudo -i
-
sudo su -
前提条件
- システムへの root アクセス権があります。
手順
root で
/etc/sudoers
ファイルを開きます。visudo
# visudo
Copy to Clipboard Copied! /etc/sudoers
ファイルは、sudo
コマンドによって適用されるポリシーを定義するものです。/etc/sudoers
ファイルで、wheel
管理グループのユーザーにsudo
アクセスを付与する行を見つけます。## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
Copy to Clipboard Copied! -
%wheel
で始まる行が番号記号 (#
) でコメントアウトされていないことを確認してください。 - 変更を保存し、エディターを終了します。
sudo
アクセスを付与するユーザーを、wheel
管理グループに追加します。usermod --append -G wheel <username>
# usermod --append -G wheel <username>
Copy to Clipboard Copied! <username>
は、ユーザー名に置き換えます。
検証
ユーザーが
wheel
管理グループに含まれていることを確認します。id <username>
# id <username> uid=5000(<username>) gid=5000(<username>) groups=5000(<username>),10(wheel)
Copy to Clipboard Copied!
8.3. 非特権ユーザーが特定のコマンドを実行できるようにする
管理者は、/etc/sudoers.d/
ディレクトリーにポリシーを設定することで、非特権ユーザーが特定のワークステーションに特定のコマンドを入力できるようにすることができます。これを行うと、ユーザーに完全な sudo
アクセス権を付与したり、ユーザーに root パスワードを付与したりするよりも、セキュリティーが向上します。その理由は次のとおりです。
- 特権を必要とする操作のより細かい制御。ユーザーに完全な管理アクセス権を付与せずに、特定のホストで特定の操作を実行することを許可できます。
-
ロギングの改善。ユーザーが
sudo
を通じて操作を実行したときに、その操作が root だけでなくユーザー名とともにログに記録されます。 -
透明性のある制御。ユーザーが
sudo
権限の使用を試みるたびにメール通知を送信するように設定できます。
前提条件
- システムへの root アクセス権があります。
手順
root として、
/etc/
の下に新しいsudoers.d/
ディレクトリーを作成します。mkdir -p /etc/sudoers.d/
# mkdir -p /etc/sudoers.d/
Copy to Clipboard Copied! /etc/sudoers.d/
ディレクトリーに新しいファイルを作成します。visudo -f /etc/sudoers.d/<filename>
# visudo -f /etc/sudoers.d/<filename>
Copy to Clipboard Copied! ファイルが自動的に開きます。
次の行を
/etc/sudoers.d/<filename>
ファイルに追加します。<username> <hostname.example.com> = (<run_as_user>:<run_as_group>) <path/to/command>
<username> <hostname.example.com> = (<run_as_user>:<run_as_group>) <path/to/command>
Copy to Clipboard Copied! -
<username>
は、ユーザー名に置き換えます。 -
<hostname.example.com>
は、ホストの URL に置き換えます。 -
(<run_as_user>:<run_as_group>)
は、コマンドを実行できるユーザーまたはグループに置き換えます。このセクションを省略すると、<username>
は root としてコマンドを実行できます。 -
<path/to/command>
は、コマンドへの完全な絶対パスに置き換えます。また、コマンドパスの後にオプションを追加することにより、特定のオプションおよび引数を指定したコマンドのみを実行するようにユーザーを制限することもできます。オプションを指定しないと、すべてのオプションが有効な状態でコマンドを使用できます。 同じホストで 2 つ以上のコマンドを 1 行で許可するには、コンマで区切り、コンマの後にスペースを付けることができます。
たとえば、
user1
がhost1.example.com
でdnf
およびreboot
コマンドを実行できるようにするには、user1 host1.example.com = /bin/dnf, /sbin/reboot
と入力します。
-
オプション: ユーザーが
sudo
権限を使用しようとするたびにメール通知を受け取るには、ファイルに次の行を追加します。Defaults mail_always Defaults mailto="<email@example.com>"
Defaults mail_always Defaults mailto="<email@example.com>"
Copy to Clipboard Copied! - 変更を保存し、エディターを終了します。
検証
ユーザーが
sudo
特権でコマンドを実行できるかどうかを確認するには、アカウントを切り替えます。su <username> -
# su <username> -
Copy to Clipboard Copied! ユーザーとして、
sudo
コマンドを使用してコマンドを入力します。sudo <command>
$ sudo <command> [sudo] password for <username>:
Copy to Clipboard Copied! ユーザーの
sudo
パスワードを入力します。特権が正しく設定されている場合、システムはコマンドとオプションのリストを表示します。たとえば、
dnf
コマンドを使用すると、次の出力が表示されます。… usage: dnf [options] COMMAND …
… usage: dnf [options] COMMAND …
Copy to Clipboard Copied! システムが
<username> is not in the sudoers file. This incident will be reported
というエラーメッセージを返した場合、/etc/sudoers.d/
に<username>
のファイルが存在しません。システムが
<username> is not allowed to run sudo on <host.example.com>
というエラーメッセージを返した場合、設定が正しく完了していません。root としてログインしていること、および設定が正しく実行されていることを確認してください。システムが
Sorry, user <username> is not allowed to execute '<path/to/command>' as root on <host.example.com>.
というエラーメッセージを返した場合、コマンドがユーザーのルールで正しく定義されていません。
8.4. RHEL システムロールを使用したカスタム sudoers
設定の適用
sudo
RHEL システムロールを使用して、管理対象ノードにカスタムの sudoers
設定を適用できます。これにより、どのユーザーがどのホストでどのコマンドを実行できるかを定義することで、設定の効率が向上し、よりきめ細かい制御が可能になります。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: "Configure sudo" hosts: managed-node-01.example.com tasks: - name: "Apply custom /etc/sudoers configuration" ansible.builtin.include_role: name: redhat.rhel_system_roles.sudo vars: sudo_sudoers_files: - path: "/etc/sudoers" user_specifications: - users: - <user_name> hosts: - <host_name> commands: - <path_to_command_binary>
--- - name: "Configure sudo" hosts: managed-node-01.example.com tasks: - name: "Apply custom /etc/sudoers configuration" ansible.builtin.include_role: name: redhat.rhel_system_roles.sudo vars: sudo_sudoers_files: - path: "/etc/sudoers" user_specifications: - users: - <user_name> hosts: - <host_name> commands: - <path_to_command_binary>
Copy to Clipboard Copied! Playbook で指定する設定は次のとおりです。
users
- ルールを適用するユーザーのリスト。
hosts
-
ルールを適用するホストのリスト。すべてのホストの場合は
ALL
を使用できます。 commands
ルールを適用するコマンドのリスト。すべてのコマンドの場合は
ALL
を使用できます。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.sudo/README.md
ファイルを参照してください。
Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
検証
管理対象ノードで、Playbook によって新しいルールが適用されたことを確認します。
cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>
# cat /etc/sudoers | tail -n1 <user_name> <host_name>= <path_to_command_binary>
Copy to Clipboard Copied!
第9章 ポリシーベースの復号を使用した暗号化ボリュームの自動ロック解除の設定
ポリシーベースの複号 (PBD) は、物理マシンおよび仮想マシンにおいて、ハードドライブで暗号化した root ボリュームおよびセカンダリーボリュームのロックを解除できるようにする一連の技術です。PBD は、ユーザーパスワード、TPM (Trusted Platform Module) デバイス、システムに接続する PKCS #11 デバイス (たとえばスマートカード) などのさまざまなロックの解除方法、もくしは特殊なネットワークサーバーを使用します。
PBD を使用すると、ポリシーにさまざまなロックの解除方法を組み合わせて、さまざまな方法で同じボリュームのロックを解除できるようにすることができます。Red Hat Enterprise Linux における PBD の現在の実装は、Clevis フレームワークと ピン と呼ばれるプラグインで構成されています。ピンはそれぞれ個別のロック解除機能を提供します。現在利用できるピンは以下のとおりです。
tang
- ネットワークサーバーを使用してボリュームのロックを解除できます。
tpm2
- TPM2 ポリシーを使用してボリュームのロックを解除できます。
pkcs11
- PKCS #11 URI を使用してボリュームのロックを解除できます。
sss
- Shamir’s Secret Sharing (SSS) 暗号化スキームを使用して高可用性システムをデプロイできます。
9.1. Network-Bound Disk Encryption
Network Bound Disc Encryption (NBDE) は、ポリシーベースの復号 (PBD) のサブカテゴリーであり、暗号化されたボリュームを特別なネットワークサーバーにバインドできるようにします。NBDE の現在の実装には、Tang サーバー自体と、Tang サーバー用の Clevis ピンが含まれます。
RHEL では、NBDE は次のコンポーネントとテクノロジーによって実装されます。
図9.1 LUKS1 で暗号化したボリュームを使用する場合の NBDE スキーム(luksmeta パッケージは、LUKS2 ボリュームには使用されません)

Tang は、ネットワークのプレゼンスにデータをバインドするためのサーバーです。セキュリティーが保護された特定のネットワークにシステムをバインドする際に利用可能なデータを含めるようにします。Tang はステートレスで、TLS または認証は必要ありません。エスクローベースのソリューション (サーバーが暗号鍵をすべて保存し、使用されたことがあるすべての鍵に関する知識を有する) とは異なり、Tang はクライアントの鍵と相互作用することはないため、クライアントから識別情報を得ることがありません。
Clevis は、自動化された復号用のプラグイン可能なフレームワークです。NBDE では、Clevis は、LUKS ボリュームの自動アンロックを提供します。clevis
パッケージは、クライアントで使用される機能を提供します。
Clevis ピン は、Clevis フレームワークへのプラグインです。このようなピンの 1 つに、Tang があります。これは NBDE サーバーとのやり取りを実装するプラグインです。
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
ツールを使用する必要があります。
クライアントがそのデータにアクセスする準備ができると、プロビジョニング手順で生成したメタデータを読み込み、応答して暗号鍵を戻します。このプロセスは 復旧手順 と呼ばれます。
NBDE では、LUKS ボリュームを自動的にロック解除できるように、Clevis がピンを使用してボリュームをバインドします。バインドプロセスが正常に終了すると、提供されている Dracut アンロックを使用してディスクをアンロックできます。
kdump
カーネルクラッシュのダンプメカニズムが、システムメモリーのコンテンツを LUKS で暗号化したデバイスに保存するように設定されている場合には、2 番目のカーネル起動時にパスワードを入力するように求められます。
9.2. enforcing モードの SELinux を使用して Tang サーバーをデプロイする
Tang サーバーを使用して、Clevis 対応クライアント上の LUKS 暗号化ボリュームのロックを自動的に解除できます。最小限のシナリオでは、tang
パッケージをインストールし、systemctl enable tangd.socket --now
コマンドを入力することにより、ポート 80 に Tang サーバーをデプロイします。次の手順の例では、SELinux 強制モードの限定サービスとしてカスタムポートで実行されている Tang サーバーのデプロイメントを示しています。
前提条件
-
policycoreutils-python-utils
パッケージおよび依存関係がインストールされている。 -
firewalld
サービスが実行中である。
手順
tang
パッケージとその依存関係をインストールするには、root
で以下のコマンドを実行します。dnf install tang
# dnf install tang
Copy to Clipboard Copied! 7500/tcp などの不要なポートを選択し、
tangd
サービスがそのポートにバインドできるようにします。semanage port -a -t tangd_port_t -p tcp 7500
# semanage port -a -t tangd_port_t -p tcp 7500
Copy to Clipboard Copied! ポートは 1 つのサービスのみで一度に使用できるため、すでに使用しているポートを使用しようとすると、
ValueError: Port already defined
エラーが発生します。ファイアウォールのポートを開きます。
firewall-cmd --add-port=7500/tcp firewall-cmd --runtime-to-permanent
# firewall-cmd --add-port=7500/tcp # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied! tangd
サービスを有効にします。systemctl enable tangd.socket
# systemctl enable tangd.socket
Copy to Clipboard Copied! オーバーライドファイルを作成します。
systemctl edit tangd.socket
# systemctl edit tangd.socket
Copy to Clipboard Copied! 以下のエディター画面で、
/etc/systemd/system/tangd.socket.d/
ディレクトリーにある空のoverride.conf
ファイルを開き、次の行を追加して、Tang サーバーのデフォルトのポートを、80 から、以前取得した番号に変更します。[Socket] ListenStream= ListenStream=7500
[Socket] ListenStream= ListenStream=7500
Copy to Clipboard Copied! 重要# Anything between here
と# Lines below this
で始まる行の間に以前のコードスニペットを挿入します。挿入しない場合、システムは変更を破棄します。-
変更を保存し、エディターを終了します。デフォルトの
vi
エディターでこれを実行するには、Esc キーを押してコマンドモードに切り替え、:wq
と入力して Enter キーを押します。 変更した設定を再読み込みします。
systemctl daemon-reload
# systemctl daemon-reload
Copy to Clipboard Copied! 設定が機能していることを確認します。
systemctl show tangd.socket -p Listen
# systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)
Copy to Clipboard Copied! tangd
サービスを開始します。systemctl restart tangd.socket
# systemctl restart tangd.socket
Copy to Clipboard Copied! tangd
が、systemd
のソケットアクティベーションメカニズムを使用しているため、最初に接続するとすぐにサーバーが起動します。最初の起動時に、一組の暗号鍵が自動的に生成されます。鍵の手動生成などの暗号化操作を実行するには、jose
ユーティリティーを使用します。
検証
NBDE クライアントで、次のコマンドを使用して、Tang サーバーが正しく動作していることを確認します。このコマンドにより、暗号化と復号化に渡すものと同じメッセージが返される必要があります。
echo test | clevis encrypt tang '{"url":"<tang.server.example.com:7500>"}' -y | clevis decrypt
# echo test | clevis encrypt tang '{"url":"<tang.server.example.com:7500>"}' -y | clevis decrypt test
Copy to Clipboard Copied!
9.3. Tang サーバーの鍵のローテーションおよびクライアントでのバインディングの更新
セキュリティー上の理由から、Tang サーバーの鍵をローテーションし、クライアント上の既存のバインディングを定期的に更新してください。鍵をローテートするのに適した間隔は、アプリケーション、鍵のサイズ、および組織のポリシーにより異なります。
したがって、nbde_server
RHEL システムロールを使用して、Tang 鍵をローテーションできます。詳細は、複数の Tang サーバーを設定する nbde_server システムロールの使用 を参照してください。
前提条件
- Tang サーバーが実行している。
-
clevis
パッケージおよびclevis-luks
パッケージがクライアントにインストールされている。
手順
/var/db/tang
鍵データベースディレクトリーのすべての鍵の名前の前に.
を指定して、アドバタイズメントに対して非表示にします。以下の例のファイル名は、Tang サーバーの鍵データベースディレクトリーにある一意のファイル名とは異なります。cd /var/db/tang ls -l mv UV6dqXSwe1bRKG3KbJmdiR020hY.jwk .UV6dqXSwe1bRKG3KbJmdiR020hY.jwk mv y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk .y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
# 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
Copy to Clipboard Copied! 名前が変更され、Tang サーバーのアドバタイズに対してすべての鍵が非表示になっていることを確認します。
ls -l
# ls -l total 0
Copy to Clipboard Copied! Tang サーバーの
/var/db/tang
で/usr/libexec/tangd-keygen
コマンドを使用して新しい鍵を生成します。/usr/libexec/tangd-keygen /var/db/tang ls /var/db/tang
# /usr/libexec/tangd-keygen /var/db/tang # ls /var/db/tang 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwk
Copy to Clipboard Copied! Tang サーバーが、以下のように新規キーペアから署名キーを公開していることを確認します。
tang-show-keys 7500
# tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54
Copy to Clipboard Copied! NBDE クライアントで
clevis luks report
コマンドを使用して、Tang サーバーでアドバタイズされた鍵が同じままかどうかを確認します。clevis luks list
コマンドを使用すると、関連するバインディングのあるスロットを特定できます。以下に例を示します。clevis luks list -d /dev/sda2 clevis luks report -d /dev/sda2 -s 1
# 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]
Copy to Clipboard Copied! 新しい鍵の LUKS メタデータを再生成するには、直前のコマンドプロンプトで
y
を押すか、clevis luks regen
コマンドを使用します。clevis luks regen -d /dev/sda2 -s 1
# clevis luks regen -d /dev/sda2 -s 1
Copy to Clipboard Copied! すべての古いクライアントが新しい鍵を使用することを確認したら、Tang サーバーから古い鍵を削除できます。次に例を示します。
cd /var/db/tang rm .*.jwk
# cd /var/db/tang # rm .*.jwk
Copy to Clipboard Copied!
クライアントが使用している最中に古い鍵を削除すると、データが失われる場合があります。このような鍵を誤って削除した場合は、クライアントで clevis luks regen
コマンドを実行し、LUKS パスワードを手動で提供します。
9.4. Web コンソールで Tang キーを使用して自動ロック解除を設定する
Tang サーバーが提供する鍵を使用して、LUKS で暗号化されたストレージデバイスの自動ロック解除を設定できます。
前提条件
RHEL 10 Web コンソールがインストールされている。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
-
cockpit-storaged
とclevis-luks
パッケージがシステムにインストールされている。 -
cockpit.socket
サービスがポート 9090 で実行されている。 - Tang サーバーを利用できる。詳細は、Deploying a Tang server with SELinux in enforcing mode 参照してください。
-
sudo
を使用して管理コマンドを入力するための root
権限または権限がある。
手順
RHEL 10 Web コンソールにログインします。
詳細は、Web コンソールへのログイン を参照してください。
- 管理者アクセスに切り替え、認証情報を入力して、Storage テーブルで、自動的にロックを解除するために追加する予定の暗号化ボリュームが含まれるディスクをクリックします。 をクリックします。
次のページに選択したディスクの詳細が表示されたら、Keys セクションの をクリックして Tang 鍵を追加します。
Key source
としてTang keyserver
を選択し、Tang サーバーのアドレスと、LUKS で暗号化されたデバイスのロックを解除するパスワードを入力します。 をクリックして確定します。以下のダイアログウインドウは、鍵ハッシュが一致することを確認するコマンドを提供します。
Tang サーバーのターミナルで、
tang-show-keys
コマンドを使用して、比較のためにキーハッシュを表示します。この例では、Tang サーバーはポート 7500 で実行されています。tang-show-keys 7500
# tang-show-keys 7500 x100_1k6GPiDOaMlL3WbpCjHOy9ul1bSfdhI3M08wO0
Copy to Clipboard Copied! Web コンソールと前述のコマンドの出力のキーハッシュが同じ場合は、
をクリックします。
暗号化されたルートファイルシステムと Tang サーバーを選択した後、カーネルコマンドラインへの rd.neednet=1
パラメーターの追加、clevis-dracut
パッケージのインストール、および初期 RAM ディスク (initrd
) の再生成をスキップできます。非ルートファイルシステムの場合、Web コンソールは、remote-cryptsetup.target
および clevis-luks-akspass.path
systemd
ユニットを有効にし、clevis-systemd
パッケージをインストールし、_netdev
パラメーターを fstab
および crypttab
設定ファイルに追加するようになりました。
検証
新規に追加された Tang キーが
Keyserver
タイプの Keys セクションにリスト表示されていることを確認します。バインディングが初期ブートで使用できることを確認します。次に例を示します。
lsinitrd | grep clevis-luks
# lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
Copy to Clipboard Copied!
9.5. 基本的な 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
$ 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
Copy to Clipboard Copied! 上記の例の
http://tang.srv:port
URL は、tang
がインストールされているサーバーの URL と一致するように変更します。secret.jwe
出力ファイルには、JWE 形式で暗号化した暗号文が含まれます。この暗号文はinput-plain.txt
入力ファイルから読み込まれます。また、設定に SSH アクセスなしで Tang サーバーとの非対話型の通信が必要な場合は、アドバタイズメントをダウンロードしてファイルに保存できます。
curl -sfg http://tang.srv:port/adv -o adv.jws
$ curl -sfg http://tang.srv:port/adv -o adv.jws
Copy to Clipboard Copied! adv.jws
ファイル内のアドバタイズメントは、ファイルやメッセージの暗号化など、後続のタスクに使用します。echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
$ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
Copy to Clipboard Copied! データを複号するには、暗号文 (JWE) を指定して
clevis decrypt
コマンドを実行します。clevis decrypt < secret.jwe > output-plain.txt
$ clevis decrypt < secret.jwe > output-plain.txt
Copy to Clipboard Copied!
TPM 2.0 を使用する暗号化クライアント
TPM 2.0 チップを使用して暗号化するには、JSON 設定オブジェクト形式の引数だけを指定した
clevis encrypt tpm2
サブコマンドを使用します。clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe
$ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe
Copy to Clipboard Copied! 別の階層、ハッシュ、および鍵アルゴリズムを選択するには、以下のように、設定プロパティーを指定します。
clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jwe
$ clevis encrypt tpm2 '{"hash":"sha256","key":"rsa"}' < input-plain.txt > secret.jwe
Copy to Clipboard Copied! データを復号するには、JSON Web Encryption (JWE) 形式の暗号文を提供します。
clevis decrypt < secret.jwe > output-plain.txt
$ clevis decrypt < secret.jwe > output-plain.txt
Copy to Clipboard Copied!
ピンは、PCR (Platform Configuration Registers) 状態へのデータのシーリングにも対応します。このように、PCR ハッシュ値が、シーリング時に使用したポリシーと一致する場合にのみ、データのシーリングを解除できます。
たとえば、SHA-256 バンクに対して、インデックス 0 および 7 の PCR にデータをシールするには、以下を行います。
clevis encrypt tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,7"}' < input-plain.txt > secret.jwe
$ 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 の手順に従ってください。
9.6. LUKS 暗号化ボリュームのロックを自動解除するように NBDE クライアントを設定する
Clevis フレームワークを使用すると、選択した Tang サーバーが使用可能な場合に、LUKS 暗号化ボリュームのロックを自動解除するようにクライアントを設定できます。これにより、Network-Bound Disk Encryption (NBDE) デプロイメントが作成されます。
前提条件
- Tang サーバーが実行されていて、使用できるようにしてある。
手順
既存の LUKS 暗号化ボリュームのロックを自動的に解除するには、
clevis-luks
サブパッケージをインストールします。dnf install clevis-luks
# dnf install clevis-luks
Copy to Clipboard Copied! PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
lsblk
# 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]
Copy to Clipboard Copied! clevis luks bind
コマンドを使用してボリュームを Tang サーバーにバインドします。clevis luks bind -d /dev/sda2 tang '{"url":"http://tang.srv"}'
# 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:
Copy to Clipboard Copied! このコマンドは、以下の 4 つの手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
- LUKS を使用する新しい鍵を有効にします。
注記このバインド手順では、少なくとも 1 つの LUKS パスワードの空きスロットがヘッダーにあることを前提としています。そのスロットの 1 つを
clevis luks bind
コマンドが使用します。これで、既存のパスワードと Clevis ポリシーを使用してボリュームのロックを解除できるようになりました。
システムの起動プロセスの初期段階でディスクバインディングを処理するには、インストール済みのシステムで
dracut
ツールを使用します。RHEL では、Clevis はホスト固有の設定オプションを指定せずに汎用initrd
(初期 RAM ディスク) を生成し、カーネルコマンドラインにrd.neednet=1
などのパラメーターを自動的に追加しません。初期の起動時にネットワークを必要とする Tang ピンを使用する場合は、--hostonly-cmdline
引数を使用し、dracut
が Tang バインディングを検出するとrd.neednet=1
を追加します。clevis-dracut
パッケージをインストールします。dnf install clevis-dracut
# dnf install clevis-dracut
Copy to Clipboard Copied! 初期 RAM ディスクを再生成します。
dracut -fv --regenerate-all --hostonly-cmdline
# dracut -fv --regenerate-all --hostonly-cmdline
Copy to Clipboard Copied! または、
/etc/dracut.conf.d/
ディレクトリーに .conf ファイルを作成し、そのファイルにhostonly_cmdline=yes
オプションを追加します。すると、--hostonly-cmdline
なしでdracut
を使用できます。次に例を示します。echo "hostonly_cmdline=yes" > /etc/dracut.conf.d/clevis.conf dracut -fv --regenerate-all
# echo "hostonly_cmdline=yes" > /etc/dracut.conf.d/clevis.conf # dracut -fv --regenerate-all
Copy to Clipboard Copied! Clevis がインストールされているシステムで
grubby
ツールを使用して、システム起動時の早い段階で Tang ピンのネットワークを利用できるようにすることができます。grubby --update-kernel=ALL --args="rd.neednet=1"
# grubby --update-kernel=ALL --args="rd.neednet=1"
Copy to Clipboard Copied!
検証
Clevis JWE オブジェクトが LUKS ヘッダーに正常に配置されていることを確認します。
clevis luks list
コマンドを使用します。clevis luks list -d /dev/sda2
# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv:port"}'
Copy to Clipboard Copied! バインディングが初期ブートで使用できることを確認します。次に例を示します。
lsinitrd | grep clevis-luks
# lsinitrd | grep clevis-luks lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
Copy to Clipboard Copied!
9.7. 静的な IP 設定を持つ NBDE クライアントの設定
(DHCP を使用しない) 静的な IP 設定を持つクライアントに NBDE を使用するには、ネットワーク設定を dracut
ツールに手動で渡す必要があります。
前提条件
- Tang サーバーが実行されていて、使用できるようにしてある。
Tang サーバーによって暗号化されたボリュームのロックを自動解除するように NBDE クライアントが設定されている。
詳細は、LUKS 暗号化ボリュームのロックを自動解除するように NBDE クライアントを設定する を参照してください。
手順
静的ネットワーク設定を、
dracut
コマンドのkernel-cmdline
オプションの値として指定できます。次に例を示します。dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100"
# dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none nameserver=192.0.2.100"
Copy to Clipboard Copied! または、静的ネットワーク情報を含む .conf ファイルを
/etc/dracut.conf.d/
ディレクトリーに作成し、初期 RAM ディスクイメージを再生成します。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 nameserver=192.0.2.100" dracut -fv --regenerate-all
# 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 nameserver=192.0.2.100" # dracut -fv --regenerate-all
Copy to Clipboard Copied!
9.8. TPM 2.0 ポリシーを使用して LUKS 暗号化ボリュームの手動登録を設定する
Trusted Platform Module 2.0 (TPM 2.0) ポリシーを使用して、LUKS 暗号化ボリュームのロック解除を設定できます。
前提条件
- アクセス可能な TPM2.0 互換デバイス。
- システムが 64 ビット Intel アーキテクチャー、または 64 ビット AMD アーキテクチャーである。
手順
clevis-luks
サブパッケージをインストールします。dnf install clevis-luks
# dnf install clevis-luks
Copy to Clipboard Copied! PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
lsblk
# 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]
Copy to Clipboard Copied! clevis luks bind
コマンドを使用してボリュームを TPM 2.0 デバイスにバインドします。次に例を示します。clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa"}'
# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:
Copy to Clipboard Copied! このコマンドは、以下の 4 つの手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
LUKS を使用する新しい鍵を有効にします。
注記バインド手順では、空き LUKS パスワードスロットが少なくとも 1 つあることが前提となっています。そのスロットの 1 つを
clevis luks bind
コマンドが使用します。または、特定の Platform Configuration Register (PCR) の状態にデータをシールする場合は、
pcr_bank
およびpcr_ids
値をclevis luks bind
コマンドに追加します。次に例を示します。clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1"}'
# clevis luks bind -d /dev/sda2 tpm2 '{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1"}'
Copy to Clipboard Copied! 重要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
# dnf install clevis-dracut # dracut -fv --regenerate-all
Copy to Clipboard Copied!
検証
Clevis JWE オブジェクトが LUKS ヘッダーに適切に置かれていることを確認するには、
clevis luks list
コマンドを使用します。clevis luks list -d /dev/sda2
# clevis luks list -d /dev/sda2 1: tpm2 '{"hash":"sha256","key":"rsa"}'
Copy to Clipboard Copied!
9.9. PKCS #11 ピンを使用して LUKS 暗号化ボリュームのロック解除を設定する
PKCS #11 と互換性のあるデバイス (スマートカードまたはハードウェアセキュリティーモジュール (HSM)) を使用して、LUKS で暗号化されたボリュームのロック解除を設定できます。
Clevis PKCS #11 ピンを使用して暗号化されたボリュームを自動的にロック解除するには、/etc/crypttab
ファイルの変更も必要です。この変更により、コンソールでユーザーにプロンプトを表示する代わりに、AF_UNIX
ソケットを使用して、ボリュームのロックを解除するためのキーフレーズを待機するように systemd
マネージャーを設定します。
Clevis PKCS #11 のユニットファイルは、ディスクのロック解除に関する情報を送受信するためのソケットを /run/systemd/clevis-pkcs11.sock
ファイル内に設定します。Clevis PKCS #11 ピンによってロック解除されるディスクの場合は、ソケットファイルをキーファイルとして設定する必要があります。
前提条件
- PKCS #11 デバイスがすでに設定されており、アクセス可能である。
-
clevis-pin-pkcs11
パッケージがインストールされている。 -
clevis luks bind
コマンド用に、LUKS パスワードの空きスロットが少なくとも 1 つある。
手順
PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
lsblk
# 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]
Copy to Clipboard Copied! ボリュームのロック解除に使用する PKCS #11 デバイスの URI を特定します。次に例を示します。
pkcs11-tool -L | grep uri
$ pkcs11-tool -L | grep uri uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=42facd1f749ece7f;token=clevis uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29
Copy to Clipboard Copied! clevis luks bind
コマンドを使用してボリュームを PKCS #11 デバイスにバインドします。次に例を示します。clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}'
# clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public"}' … Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:
Copy to Clipboard Copied! このコマンドは、次の手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
- LUKS を使用する新しい鍵を有効にします。
オプション: 使用するモジュールを指定する必要がある場合は、module-path URI パラメーターを追加します。
clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2";model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public}'
# clevis luks bind -d /dev/sda2 pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2";model=PKCS%2315%20emulated;manufacturer=OpenPGP%20project;serial=000f06080f4f;token=OpenPGP%20card%20%28User%20PIN%29;id=%03;object=Authentication%20key;type=public}'
Copy to Clipboard Copied! clevis-luks-pkcs11-askpass.socket
ユニットを有効にします。systemctl enable --now clevis-luks-pkcs11-askpass.socket
# systemctl enable --now clevis-luks-pkcs11-askpass.socket
Copy to Clipboard Copied! テキストエディターで
/etc/crypttab
ファイルを開き、PKCS #11 ピンでロックを解除する LUKS 暗号化ボリュームを含む行を特定します。次に例を示します。luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -
luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 - -
Copy to Clipboard Copied! ダッシュを
/run/systemd/clevis-pkcs11.sock
ファイルパスとkeyfile-timeout
オプションに置き換えます。luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30s
luks-6e38d5e1-7f83-43cc-819a-7416bcbf9f84 UUID=6e38d5e1-7f83-43cc-819a-7416bcbf9f84 /run/systemd/clevis-pkcs11.sock keyfile-timeout=30s
Copy to Clipboard Copied! keyfile-timeout
オプションは、ロック解除エラーが発生し、システムがコンソールからパスフレーズを手動で入力する必要がある場合に、次の処理に移行する仕組みを提供します。- 変更を保存し、エディターを終了します。
システムの起動プロセスの初期段階で、ルートファイルシステムのロックを解除するために必要なディスクバインディングを処理するには、インストール済みのシステムで
dracut
ツールを使用します。dracut -fv --regenerate-all
# dracut -fv --regenerate-all
Copy to Clipboard Copied! システムを再起動します。
次回のブートプロセス中に、PKCS #11 デバイス PIN の入力が要求されます。正しい PIN を入力した場合にのみ、対応する設定済みの暗号化ディスクが復号化されます。
検証
ブートプロセスを手動でテストする代わりに、次のコマンドを使用してテキストメッセージを暗号化および復号化できます。
echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=<PIN>"}' | clevis decrypt
# echo "top secret" | clevis encrypt pkcs11 '{"uri":"pkcs11:module-path=/usr/lib64/libykcs11.so.2?pin-value=<PIN>"}' | clevis decrypt
Copy to Clipboard Copied! <PIN>
は PIN 値に置き換えます。メッセージを復号化するには、この PIN 値を入力する必要があります。Clevis JWE オブジェクトが LUKS ヘッダーに正常に配置されていることを確認するには、
clevis luks list
コマンドを使用します。次に例を示します。clevis luks list -d /dev/sda2
# clevis luks list -d /dev/sda2 1: pkcs11 '{"uri": "pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II; serial=0a35ba26b062b9c5;token=clevis;id=%02;object=Encryption%20Key? module-path=/usr/lib64/libykcs11.so.2"}'
Copy to Clipboard Copied!
9.10. 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 unbind -d /dev/sda2 -s 1
前提条件
- Clevis バインディングを使用した LUKS 暗号化ボリューム。
手順
/dev/sda2
などのボリュームがどの LUKS バージョンであるかを確認し、Clevis にバインドされているスロットおよびトークンを特定します。cryptsetup luksDump /dev/sda2
# 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 ...
Copy to Clipboard Copied! 上記の例では、Clevis トークンは
0
で識別され、関連付けられたキースロットは1
です。LUKS2 暗号化の場合は、トークンを削除します。
cryptsetup token remove --token-id 0 /dev/sda2
# cryptsetup token remove --token-id 0 /dev/sda2
Copy to Clipboard Copied! デバイスを LUKS1 で暗号化し、
cryptsetup luksDump
コマンドの出力にVersion: 1
文字列が示されている場合は、luksmeta wipe
コマンドでこの追加手順を行います。luksmeta wipe -d /dev/sda2 -s 1
# luksmeta wipe -d /dev/sda2 -s 1
Copy to Clipboard Copied! Clevis パスフレーズを含む鍵スロットを削除します。
cryptsetup luksKillSlot /dev/sda2 1
# cryptsetup luksKillSlot /dev/sda2 1
Copy to Clipboard Copied!
9.11. キックスタートを使用して LUKS 暗号化ボリュームの自動登録を設定する
LUKS で暗号化されたボリュームの登録に Clevis を使用する自動インストールプロセスを設定できます。
手順
一時パスワードを使用して、LUKS 暗号化が有効になっているディスクを、
/boot
以外のすべてのマウントポイントで分割するように、キックスタートに指示します。パスワードは、登録プロセスの手順に使用するための一時的なものです。part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
Copy to Clipboard Copied! 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
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
Copy to Clipboard Copied! 関連する Clevis パッケージを
%packages
セクションに追加して、インストールします。%packages clevis-dracut clevis-luks clevis-systemd %end
%packages clevis-dracut clevis-luks clevis-systemd %end
Copy to Clipboard Copied! - オプション: 必要に応じて暗号化されたボリュームのロックを手動で解除できるようにするには、一時パスフレーズを削除する前に強力なパスフレーズを追加します。詳細は、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
%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
Copy to Clipboard Copied! 起動初期にネットワークを必要とする Tang ピンに設定が依存している場合、または静的 IP 設定の NBDE クライアントを使用している場合は、静的な IP 設定を持つ NBDE クライアントの設定 の説明に従って
dracut
コマンドを変更する必要があります。警告cryptsetup luksRemoveKey
コマンドは、それを適用する LUKS2 デバイスがそれ以上に管理されるのを防ぎます。LUKS1 デバイスに対してのみdmsetup
コマンドを使用して、削除されたマスターキーを回復できます。
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
9.12. LUKS で暗号化されたリムーバブルストレージデバイスの自動ロック解除を設定する
LUKS 暗号化 USB ストレージデバイスの自動ロック解除プロセスを設定できます。
手順
USB ドライブなど、LUKS で暗号化されたリムーバブルストレージデバイスを自動的にロック解除するには、
clevis-udisks2
パッケージをインストールします。dnf install clevis-udisks2
# dnf install clevis-udisks2
Copy to Clipboard Copied! システムを再起動し、LUKS 暗号化ボリュームのロックを自動解除するように NBDE クライアントを設定する の説明に従って、
clevis luks bind
コマンドを使用してバインド手順を実行します。次に例を示します。clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
# clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
Copy to Clipboard Copied! これで、LUKS で暗号化されたリムーバブルデバイスを、GNOME デスクトップセッションで自動的にロック解除できるようになりました。
clevis luks unlock
コマンドで、Clevis ポリシーにバインドされたデバイスのロックを解除することもできます。clevis luks unlock -d /dev/sdb1
# clevis luks unlock -d /dev/sdb1
Copy to Clipboard Copied!
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
9.13. 高可用性 NBDE システムをデプロイする
Tang は、高可用性デプロイメントを構築する方法を 2 つ提供します。
- クライアントの冗長性 (推奨)
-
クライアントは、複数の Tang サーバーにバインドする機能を使用して設定する必要があります。この設定では、各 Tang サーバーに独自の鍵があり、クライアントは、このサーバーのサブセットに接続することで復号できます。Clevis はすでに、
sss
プラグインを使用してこのワークフローに対応しています。Red Hat は、高可用性のデプロイメントにこの方法を推奨します。 - 鍵の共有
-
冗長性を確保するために、Tang のインスタンスは複数デプロイできます。2 つ目以降のインスタンスを設定するには、
tang
パッケージをインストールし、SSH
経由でrsync
を使用してその鍵ディレクトリーを新規ホストにコピーします。鍵を共有すると鍵への不正アクセスのリスクが高まり、追加の自動化インフラストラクチャーが必要になるため、Red Hat はこの方法を推奨していません。
シャミアの秘密分散を使用した高可用性 NBDE
シャミアの秘密分散 (SSS) は、秘密を複数の固有のパーツに分割する暗号スキームです。秘密を再構築するには、いくつかのパーツが必要になります。数値はしきい値と呼ばれ、SSS はしきい値スキームとも呼ばれます。
Clevis は、SSS の実装を提供します。鍵を作成し、これをいくつかのパーツに分割します。各パーツは、SSS も再帰的に含む別のピンを使用して暗号化されます。また、しきい値 t
も定義します。NBDE デプロイメントで少なくとも t
の部分を復号すると、暗号化鍵が復元され、復号プロセスが成功します。Clevis がしきい値で指定されている数よりも小さい部分を検出すると、エラーメッセージが出力されます。
例 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"}]}}'
# 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" } ] } }
{
"t":1,
"pins":{
"tang":[
{
"url":"http://tang1.srv"
},
{
"url":"http://tang2.srv"
}
]
}
}
この設定では、リストに記載されている 2 台の tang
サーバーのうち少なくとも 1 つが利用可能であれば、SSS しきい値 t
が 1
に設定され、clevis luks bind
コマンドが秘密を正常に再構築します。
例 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"}}}'
# 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" } } }
{
"t":2,
"pins":{
"tang":[
{
"url":"http://tang1.srv"
}
],
"tpm2":{
"pcr_ids":"0,7"
}
}
}
9.14. NBDE ネットワークで仮想マシンをデプロイする
clevis luks bind
コマンドは、LUKS マスター鍵を変更しません。これは、仮想マシンまたはクラウド環境で使用する、LUKS で暗号化したイメージを作成する場合に、このイメージを実行するすべてのインスタンスがマスター鍵を共有することを意味します。これにはセキュリティーの観点で大きな問題があるため、常に回避する必要があります。
これは、Clevis の制限ではなく、LUKS の設計原理です。シナリオでクラウド内のルートボリュームを暗号化する必要がある場合は、クラウド内の Red Hat Enterprise Linux の各インスタンスに対しても (通常はキックスタートを使用して) インストールプロセスを実行します。このイメージは、LUKS マスター鍵を共有しなければ共有できません。
仮想化環境で自動ロック解除をデプロイする場合は、lorax
や virt-install
などのシステムを、キックスタートファイル (キックスタートを使用して LUKS 暗号化ボリュームの自動登録を設定する を参照) または別の自動プロビジョニングツールとともに使用して、暗号化された各仮想マシンに一意のマスター鍵を確実に提供してください。
9.15. NBDE を使用してクラウド環境用の自動登録可能な仮想マシンイメージをビルドする
自動登録可能な暗号化イメージをクラウド環境にデプロイすると、特有の課題が発生する可能性があります。他の仮想化環境と同様に、LUKS マスター鍵を共有しないように、1 つのイメージから起動するインスタンス数を減らすことが推奨されます。
したがって、ベストプラクティスは、どのパブリックリポジトリーでも共有されず、限られたインスタンスのデプロイメントのベースを提供するように、イメージをカスタマイズすることです。作成するインスタンスの数は、デプロイメントのセキュリティーポリシーで定義する必要があります。また、LUKS マスター鍵の攻撃ベクトルに関連するリスク許容度に基づいて決定する必要があります。
LUKS に対応する自動デプロイメントを構築するには、Lorax、virt-install などのシステムとキックスタートファイルを一緒に使用し、イメージ構築プロセス中にマスター鍵の一意性を確保する必要があります。
クラウド環境では、ここで検討する 2 つの Tang サーバーデプロイメントオプションが利用できます。まず、クラウド環境そのものに Tang サーバーをデプロイできます。もしくは、2 つのインフラストラクチャー間で VPN リンクを使用した独立したインフラストラクチャーで、クラウドの外に Tang サーバーをデプロイできます。
クラウドに Tang をネイティブにデプロイすると、簡単にデプロイできます。ただし、別のシステムの暗号文のデータ永続化層でインフラストラクチャーを共有します。Tang サーバーの秘密鍵および Clevis メタデータは、同じ物理ディスクに保存できる場合があります。この物理ディスクでは、暗号文データへのいかなる不正アクセスが可能になります。
データを保存する場所と Tang を実行するシステムを、常に物理的に分離してください。クラウドと Tang サーバーを分離することで、Tang サーバーの秘密鍵が、Clevis メタデータと誤って結合することがないようにします。さらに、これにより、クラウドインフラストラクチャーが危険にさらされている場合に、Tang サーバーのローカル制御を提供します。
9.16. コンテナーとしての 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/rhel10/tang
# podman pull registry.redhat.io/rhel10/tang
Copy to Clipboard Copied! コンテナーを実行し、そのポートを指定して Tang 鍵へのパスを指定します。上記の例では、
tang
コンテナーを実行し、ポート 7500 を指定し、/var/db/tang
ディレクトリーの Tang 鍵へのパスを示します。podman run -d -p 7500:7500 -v tang-keys:/var/db/tang --name tang registry.redhat.io/rhel10/tang
# podman run -d -p 7500:7500 -v tang-keys:/var/db/tang --name tang registry.redhat.io/rhel10/tang
Copy to Clipboard Copied! Tang はデフォルトでポート 80 を使用しますが、Apache HTTP サーバーなどの他のサービスと共存する可能性があることに注意してください。
オプション: セキュリティーを強化する場合は、Tang 鍵を定期的にローテーションします。
tangd-rotate-keys
スクリプトを使用できます。以下に例を示します。podman run --rm -v tang-keys:/var/db/tang registry.redhat.io/rhel10/tang tangd-rotate-keys -v -d /var/db/tang
# podman run --rm -v tang-keys:/var/db/tang registry.redhat.io/rhel10/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.
Copy to Clipboard Copied!
検証
Tang サーバーが存在しているために自動アンロック用に LUKS で暗号化したボリュームが含まれているシステムで、Clevis クライアントが Tang を使用してプレーンテキストのメッセージを暗号化および復号化できることを確認します。
echo test | clevis encrypt tang '{"url":"http://localhost:7500"}' | clevis decrypt
# 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
Copy to Clipboard Copied! 上記のコマンド例は、localhost URL で Tang サーバーが利用できる場合にその出力の最後に
テスト
文字列を示し、ポート 7500 経由で通信します。
9.17. RHEL システムロールを使用した NBDE の設定
nbde_client
および nbde_server
RHEL システムロールを使用すると、Clevis および Tang を使用して Policy-Based Decryption (PBD) ソリューションを自動でデプロイできます。rhel-system-roles
パッケージには、これらのシステムロール、関連する例、リファレンスドキュメントが含まれます。
9.17.1. 複数の Tang サーバーのセットアップに nbde_server
RHEL システムロールを使用する
nbde_server
システムロールを使用すると、自動ディスク暗号化ソリューションの一部として、Tang サーバーをデプロイして管理できます。このロールは以下の機能をサポートします。
- Tang 鍵のローテーション
- Tang 鍵のデプロイおよびバックアップ
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Deploy a Tang server hosts: tang.server.example.com tasks: - name: Install and configure periodic key rotation ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_server vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true
--- - name: Deploy a Tang server hosts: tang.server.example.com tasks: - name: Install and configure periodic key rotation ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_server vars: nbde_server_rotate_keys: yes nbde_server_manage_firewall: true nbde_server_manage_selinux: true
Copy to Clipboard Copied! このサンプル Playbook により、Tang サーバーのデプロイと鍵のローテーションが実行されます。
サンプル Playbook で指定されている設定は次のとおりです。
nbde_server_manage_firewall: true
-
firewall
システムロールを使用して、nbde_server
ロールで使用されるポートを管理します。 nbde_server_manage_selinux: true
selinux
システムロールを使用して、nbde_server
ロールで使用されるポートを管理します。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.nbde_server/README.md
ファイルを参照してください。
Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
検証
NBDE クライアントで、次のコマンドを使用して、Tang サーバーが正しく動作していることを確認します。このコマンドにより、暗号化と復号化に渡すものと同じメッセージが返される必要があります。
ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt'
# ansible managed-node-01.example.com -m command -a 'echo test | clevis encrypt tang '{"url":"<tang.server.example.com>"}' -y | clevis decrypt' test
Copy to Clipboard Copied!
9.17.2. nbde_client
RHEL システムロールを使用して DHCP を使用する Clevis クライアントを設定する
nbde_client
システムロールにより、複数の Clevis クライアントを自動的にデプロイできます。
このロールを使用すると、LUKS で暗号化されたボリュームを 1 つ以上の Network-Bound (NBDE) サーバー (Tang サーバー) にバインドすることが可能です。パスフレーズを使用して既存のボリュームの暗号化を保持するか、削除できます。パスフレーズを削除したら、NBDE だけを使用してボリュームのロックを解除できます。これは、システムのプロビジョニング後に削除する必要がある一時鍵またはパスワードを使用して、ボリュームが最初に暗号化されている場合に役立ちます。
パスフレーズと鍵ファイルの両方を指定する場合には、ロールは最初に指定した内容を使用します。有効なバインディングが見つからない場合は、既存のバインディングからパスフレーズの取得を試みます。
Policy-Based Decryption (PBD) では、デバイスとスロットのマッピングの形でバインディングを定義します。そのため、同じデバイスに対して複数のバインドを設定できます。デフォルトのスロットは 1 です。
nbde_client
システムロールは、Tang バインディングのみをサポートします。したがって、TPM2 バインディングには使用できません。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - LUKS を使用してすでに暗号化されているボリューム。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_client vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile nbde_client_early_boot: true state: present 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
--- - name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.nbde_client vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile nbde_client_early_boot: true state: present 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
Copy to Clipboard Copied! このサンプル Playbook は、2 台の Tang サーバーのうち少なくとも 1 台が利用可能な場合に、LUKS で暗号化した 2 つのボリュームを自動的にアンロックするように Clevis クライアントを設定します。
サンプル Playbook で指定されている設定は次のとおりです。
state: present
-
state
の値は、Playbook を実行した後の設定を示します。新しいバインディングを作成するか、既存のバインディングを更新する場合は、present
を使用します。clevis luks bind
とは異なり、state: present
を使用してデバイススロットにある既存のバインディングを上書きすることもできます。absent
に設定すると、指定したバインディングが削除されます。 nbde_client_early_boot: true
nbde_client
ロールは、デフォルトで、起動初期段階で Tang ピン用のネットワークを利用可能にします。この機能を無効にする必要がある場合は、Playbook にnbde_client_early_boot: false
変数を追加します。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.nbde_client/README.md
ファイルを参照してください。
Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
検証
NBDE クライアントで、Tang サーバーによって自動的にロック解除される暗号化ボリュームの LUKS ピンに、対応する情報が含まれていることを確認します。
ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root'
# ansible managed-node-01.example.com -m command -a 'clevis luks list -d /dev/rhel/root' 1: tang '{"url":"<http://server1.example.com/>"}' 2: tang '{"url":"<http://server2.example.com/>"}'
Copy to Clipboard Copied! nbde_client_early_boot: false
変数を使用しない場合は、起動初期にバインディングが使用できることを確認します。次に例を示します。ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks'
# ansible managed-node-01.example.com -m command -a 'lsinitrd | grep clevis-luks' lrwxrwxrwx 1 root root 48 Jan 4 02:56 etc/systemd/system/cryptsetup.target.wants/clevis-luks-askpass.path -> /usr/lib/systemd/system/clevis-luks-askpass.path …
Copy to Clipboard Copied!
9.17.3. nbde_client
RHEL システムロールを使用して静的 IP Clevis クライアントを設定する
nbde_client
RHEL システムロールは、Dynamic Host Configuration Protocol (DHCP) を使用する環境にのみ対応しています。静的 IP 設定の NBDE クライアントでは、ネットワーク設定をカーネルブートパラメーターとして渡す必要があります。
通常、管理者は Playbook を再利用します。Ansible が起動初期段階で静的 IP アドレスを割り当てるホストごとに、個別の Playbook を管理することはありません。そうすることにより、Playbook 内の変数を使用し、外部ファイルで設定を提供できます。そのため、必要なのは Playbook 1 つと設定を含むファイル 1 つだけです。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。 - LUKS を使用してすでに暗号化されているボリューム。
手順
ホストのネットワーク設定を含むファイル (例:
static-ip-settings-clients.yml
) を作成し、ホストに動的に割り当てる値を追加します。clients: managed-node-01.example.com: ip_v4: 192.0.2.1 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0 managed-node-02.example.com: ip_v4: 192.0.2.2 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0
clients: managed-node-01.example.com: ip_v4: 192.0.2.1 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0 managed-node-02.example.com: ip_v4: 192.0.2.2 gateway_v4: 192.0.2.254 netmask_v4: 255.255.255.0 interface: enp1s0
Copy to Clipboard Copied! 次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。- name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com,managed-node-02.example.com vars_files: - ~/static-ip-settings-clients.yml tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.network 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 - name: Configure a Clevis client with static IP address during early boot ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: ALL options: - name: ip value: "{{ clients[inventory_hostname]['ip_v4'] }}::{{ clients[inventory_hostname]['gateway_v4'] }}:{{ clients[inventory_hostname]['netmask_v4'] }}::{{ clients[inventory_hostname]['interface'] }}:none"
- name: Configure clients for unlocking of encrypted volumes by Tang servers hosts: managed-node-01.example.com,managed-node-02.example.com vars_files: - ~/static-ip-settings-clients.yml tasks: - name: Create NBDE client bindings ansible.builtin.include_role: name: redhat.rhel_system_roles.network 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 - name: Configure a Clevis client with static IP address during early boot ansible.builtin.include_role: name: redhat.rhel_system_roles.bootloader vars: bootloader_settings: - kernel: ALL options: - name: ip value: "{{ clients[inventory_hostname]['ip_v4'] }}::{{ clients[inventory_hostname]['gateway_v4'] }}:{{ clients[inventory_hostname]['netmask_v4'] }}::{{ clients[inventory_hostname]['interface'] }}:none"
Copy to Clipboard Copied! この Playbook は、
~/static-ip-settings-clients.yml
ファイルにリストされている各ホストの特定の値を動的に読み取ります。Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.network/README.md
ファイルを参照してください。Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
第10章 fapolicyd を使用したアプリケーションの拒否および許可
ルールセットに基づいてアプリケーションの実行を許可または拒否するポリシーを設定して有効にすることで、効率的に悪意のある一般的に知られていないソフトウェアや、害を及ぼす可能性のあるソフトウェアの実行を回避できます。
10.1. fapolicyd の概要
fapolicyd
ソフトウェアフレームワークは、ユーザー定義のポリシーに基づいてアプリケーションの実行を制御します。このフレームワークは、最適な方法で、システム上で信頼されていないアプリケーションや悪意のあるアプリケーションを実行されないようにします。
fapolicyd
フレームワークは、以下のコンテンツを提供します。
-
fapolicyd
サービス -
fapolicyd
コマンドラインユーティリティー -
fapolicyd
RPM プラグイン -
fapolicyd
ルール言語 -
fagenrules
スクリプト
管理者は、パス、ハッシュ、MIME タイプ、信頼に基づいて、すべてのアプリケーションに実行ルール allow
および deny
の両方を監査する定義できます。
fapolicyd
フレームワークにより、信頼の概念が導入されます。アプリケーションは、システムパッケージマネージャーによって適切にインストールされると信頼されるため、システムの RPM データベースに登録されます。fapolicyd
デーモンは、RPM データベースを信頼できるバイナリーとスクリプトのリストとして使用します。fapolicyd
RPM プラグインは、{PackageManagerName} 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
とも呼ばれます) のサポートが必要です。
10.2. fapolicyd のデプロイ
fapolicyd
アプリケーションの許可リストフレームワークをデプロイする場合は、最初に permissive モードで設定を最初に試すか、デフォルト設定でサービスを直接有効にできます。
手順
fapolicyd
パッケージをインストールします。dnf install fapolicyd
# dnf install fapolicyd
Copy to Clipboard Copied! オプション: 最初に設定を試すには、モードを permissive に変更します。
任意のテキストエディターで
/etc/fapolicyd/fapolicyd.conf
ファイルを開きます。以下に例を示します。vi /etc/fapolicyd/fapolicyd.conf
# vi /etc/fapolicyd/fapolicyd.conf
Copy to Clipboard Copied! permissive
オプションの値を0
から1
に変更し、ファイルを保存してエディターを終了します。permissive = 1
permissive = 1
Copy to Clipboard Copied! または、サービスを開始する前に
fapolicyd --debug-deny --permissive
コマンドを使用して設定をデバッグできます。詳細は、fapolicyd に関連する問題のトラブルシューティング セクションを参照してください。
fapolicyd
サービスを有効にして開始します。systemctl enable --now fapolicyd
# systemctl enable --now fapolicyd
Copy to Clipboard Copied! /etc/fapolicyd/fapolicyd.conf
を使用して permissive モードを有効にした場合:fapolicyd
イベントを記録する Audit サービスを設定します。auditctl -w /etc/fapolicyd/ -p wa -k fapolicyd_changes service try-restart auditd
# auditctl -w /etc/fapolicyd/ -p wa -k fapolicyd_changes # service try-restart auditd
Copy to Clipboard Copied! - アプリケーションを使用します。
監査ログで
fanotify
拒否を確認します。以下に例を示します。ausearch -ts recent -m fanotify
# ausearch -ts recent -m fanotify
Copy to Clipboard Copied! デバッグしたら、対応する値を
permissive = 0
に戻して permissive モードを無効にし、サービスを再起動します。systemctl restart fapolicyd
# systemctl restart fapolicyd
Copy to Clipboard Copied!
検証
fapolicyd
サービスが正しく実行されていることを確認します。systemctl status fapolicyd
# systemctl status fapolicyd ● fapolicyd.service - File Access Policy Daemon Loaded: loaded (/usr/lib/systemd/system/fapolicyd.service; enabled; preset: disabled) Active: active (running) since Tue 2024-10-08 05:53:50 EDT; 11s ago … Oct 08 05:53:51 machine1.example.com fapolicyd[4974]: Loading trust data from rpmdb backend Oct 08 05:53:51 machine1.example.com fapolicyd[4974]: Loading trust data from file backend Oct 08 05:53:51 machine1.example.com fapolicyd[4974]: Starting to listen for events
Copy to Clipboard Copied! root 権限のないユーザーとしてログインし、以下のように
fapolicyd
が機能していることを確認します。cp /bin/ls /tmp /tmp/ls
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
Copy to Clipboard Copied!
10.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
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
Copy to Clipboard Copied! カスタムバイナリーを信頼済みとしてマークし、対応するエントリーを
/etc/fapolicyd/trust.d/
のmyapp
ファイルに保存します。fapolicyd-cli --file add /tmp/ls --trust-file myapp
# fapolicyd-cli --file add /tmp/ls --trust-file myapp
Copy to Clipboard Copied! -
--trust-file
オプションをスキップすると、前のコマンドは対応する行を/etc/fapolicyd/fapolicyd.trust
に追加します。 -
ディレクトリー内のすべての既存ファイルを信頼済みとしてマークするには、
--file
オプションの引数としてディレクトリーパスを指定します。たとえば、fapolicyd-cli --file add/tmp/my_bin_dir/--trust-file myapp
です。
-
fapolicyd
データベースを更新します。fapolicyd-cli --update
# fapolicyd-cli --update
Copy to Clipboard Copied!
信頼されたファイルまたはディレクトリーの内容を変更すると、それらのチェックサムが変更されるため、fapolicyd
はそれらを信頼済みと見なしなくなります。
新しいコンテンツを再び信頼できるようにするには、fapolicyd-cli --file update
コマンドを使用してファイル信頼データベースを更新します。引数を何も指定しない場合、データベース全体が更新されます。または、特定のファイルまたはディレクトリーへのパスを指定できます。次に、fapolicyd-cli --update
を使用してデータベースを更新します。
検証
たとえば、カスタムバイナリーが実行できることを確認します。
/tmp/ls
$ /tmp/ls ls
Copy to Clipboard Copied!
10.4. fapolicyd のカスタムの許可および拒否ルールの追加
fapolicyd
パッケージのデフォルトのルールセットは、システム機能に影響しません。バイナリーやスクリプトを標準以外のディレクトリーに保存する、または dnf
または rpm
インストーラーを使用せずにアプリケーションを追加するなどのカスタムシナリオでは、追加のファイルを信頼済みとしてマークするか、新しいカスタムルールを追加する必要があります。
基本的なシナリオでは、信頼の追加ソースを使用してファイルを信頼済みとしてマークする ことを推奨します。特定のユーザーおよびグループ ID に対してのみカスタムバイナリーの実行を許可するなど、より高度なシナリオでは、新しいカスタムルールを /etc/fapolicyd/rules.d/
ディレクトリーに追加します。
次の手順は、新しいルールを追加してカスタムバイナリーを許可する方法を示しています。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
カスタムバイナリーを必要なディレクトリーにコピーします。以下に例を示します。
cp /bin/ls /tmp /tmp/ls
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
Copy to Clipboard Copied! fapolicyd
サービスを停止します。systemctl stop fapolicyd
# systemctl stop fapolicyd
Copy to Clipboard Copied! デバッグモードを使用して、対応するルールを識別します。
fapolicyd --debug
コマンドの出力は冗長で、Ctrl+C を押すか、対応するプロセスを強制終了するだけで停止できるため、エラー出力をファイルにリダイレクトします。この場合、--debug
の代わりに--debug-deny
オプションを使用して、アクセス拒否のみに出力を制限できます。fapolicyd --debug-deny 2> fapolicy.output &
# fapolicyd --debug-deny 2> fapolicy.output & [1] 51341
Copy to Clipboard Copied! または、別の端末で
fapolicyd
デバッグモードを実行できます。fapolicyd
が拒否したコマンドを繰り返します。/tmp/ls
$ /tmp/ls bash: /tmp/ls: Operation not permitted
Copy to Clipboard Copied! デバッグモードをフォアグラウンドで再開し、Ctrl+C を押して停止します。
fg
# fg fapolicyd --debug 2> fapolicy.output ^C ...
Copy to Clipboard Copied! または、
fapolicyd
デバッグモードのプロセスを強制終了します。kill 51341
# kill 51341
Copy to Clipboard Copied! アプリケーションの実行を拒否するルールを見つけます。
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
# 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
Copy to Clipboard Copied! カスタムバイナリーの実行を妨げたルールを含むファイルを見つけます。この場合、
deny_audit perm=execute
ルールは90-deny-execute.rules
ファイルに属します。ls /etc/fapolicyd/rules.d/ cat /etc/fapolicyd/rules.d/90-deny-execute.rules Deny execution for anything untrusted
# 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
Copy to Clipboard Copied! /etc/fapolicyd/rules.d/
ディレクトリー内のカスタムバイナリーの実行を拒否するルールを含むルールファイルよりも辞書順で 前にある ファイルに、新しいallow
ルールを追加します。touch /etc/fapolicyd/rules.d/80-myapps.rules vi /etc/fapolicyd/rules.d/80-myapps.rules
# touch /etc/fapolicyd/rules.d/80-myapps.rules # vi /etc/fapolicyd/rules.d/80-myapps.rules
Copy to Clipboard Copied! 以下のルールを
80-myapps.rules
ファイルに挿入します。allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0
allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0
Copy to Clipboard Copied! または、
/etc/fapolicyd/rules.d/
のルールファイルに次のルールを追加して、/tmp
ディレクトリー内のすべてのバイナリーの実行を許可することもできます。allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ trust=0
allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ trust=0
Copy to Clipboard Copied! 重要指定したディレクトリーの下にあるすべてのディレクトリーに対してルールを再帰的に有効にするには、ルール内の
dir=
パラメーターの値に末尾のスラッシュを追加します (上記の例の/tmp/
)。カスタムバイナリーのコンテンツの変更を防ぐには、SHA-256 チェックサムを使用して必要なルールを定義します。
sha256sum /tmp/ls
$ sha256sum /tmp/ls 780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836 ls
Copy to Clipboard Copied! ルールを以下の定義に変更します。
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
Copy to Clipboard Copied! コンパイル済みのリストが
/etc/fapolicyd/rules.d/
に設定されているルールと異なることを確認し、/etc/fapolicyd/compiled.rules
ファイルに保存されているリストを更新します。fagenrules --check fagenrules --load
# fagenrules --check /usr/sbin/fagenrules: Rules have changed and should be updated # fagenrules --load
Copy to Clipboard Copied! カスタムルールが、実行を妨げたルールの前に
fapolicyd
ルールのリストにあることを確認します。fapolicyd-cli --list
# 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 ...
Copy to Clipboard Copied! fapolicyd
サービスを開始します。systemctl start fapolicyd
# systemctl start fapolicyd
Copy to Clipboard Copied!
検証
たとえば、カスタムバイナリーが実行できることを確認します。
/tmp/ls
$ /tmp/ls ls
Copy to Clipboard Copied!
10.5. fapolicyd 整合性チェックの有効化
デフォルトでは、fapolicyd
は整合性チェックを実行しません。ファイルサイズまたは SHA-256 ハッシュのいずれかを比較して整合性チェックを実行するように fapolicyd
を設定できます。Integrity Measurement Architecture (IMA) サブシステムを使用して整合性チェックを設定することもできます。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
任意のテキストエディターで
/etc/fapolicyd/fapolicyd.conf
ファイルを開きます。以下に例を示します。vi /etc/fapolicyd/fapolicyd.conf
# vi /etc/fapolicyd/fapolicyd.conf
Copy to Clipboard Copied! 整合性
オプションの値をnone
からsha256
に変更し、ファイルを保存してエディターを終了します。integrity = sha256
integrity = sha256
Copy to Clipboard Copied! fapolicyd
サービスを再起動します。systemctl restart fapolicyd
# systemctl restart fapolicyd
Copy to Clipboard Copied!
検証
検証に使用するファイルのバックアップを作成します。
cp /bin/more /bin/more.bak
# cp /bin/more /bin/more.bak
Copy to Clipboard Copied! /bin/more
バイナリーの内容を変更します。cat /bin/less > /bin/more
# cat /bin/less > /bin/more
Copy to Clipboard Copied! 変更したバイナリーを一般ユーザーとして使用します。
su example.user /bin/more /etc/redhat-release
# su example.user $ /bin/more /etc/redhat-release bash: /bin/more: Operation not permitted
Copy to Clipboard Copied! 変更を元に戻します。
mv -f /bin/more.bak /bin/more
# mv -f /bin/more.bak /bin/more
Copy to Clipboard Copied!
10.7. fapolicyd
RHEL システムロールを使用してユーザーによる信頼できないコードの実行を防止する
fapolicyd
RHEL システムロールを使用すると、fapolicyd
サービスのインストールと設定を自動化できます。このロールを使用すると、RPM データベースや許可リストに指定されているアプリケーションなど、信頼できるアプリケーションのみをユーザーが実行できるようにサービスをリモートで設定できます。さらに、サービスは許可されたアプリケーションを実行する前に整合性チェックを実行できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo
権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml
) を作成します。--- - name: Configuring fapolicyd hosts: managed-node-01.example.com tasks: - name: Allow only executables installed from RPM database and specific files ansible.builtin.include_role: name: redhat.rhel_system_roles.fapolicyd vars: fapolicyd_setup_permissive: false fapolicyd_setup_integrity: sha256 fapolicyd_setup_trust: rpmdb,file fapolicyd_add_trusted_file: - <path_to_allowed_command> - <path_to_allowed_service>
--- - name: Configuring fapolicyd hosts: managed-node-01.example.com tasks: - name: Allow only executables installed from RPM database and specific files ansible.builtin.include_role: name: redhat.rhel_system_roles.fapolicyd vars: fapolicyd_setup_permissive: false fapolicyd_setup_integrity: sha256 fapolicyd_setup_trust: rpmdb,file fapolicyd_add_trusted_file: - <path_to_allowed_command> - <path_to_allowed_service>
Copy to Clipboard Copied! サンプル Playbook で指定されている設定は次のとおりです。
fapolicyd_setup_permissive: <true|false>
-
ポリシーの決定をカーネルに送信して適用することを有効または無効にします。デバッグおよびテスト目的の場合、この変数を
false
に設定します。 fapolicyd_setup_integrity: <type_type>
整合性チェック方法を定義します。次のいずれかの値を設定できます。
-
none
(デフォルト): 整合性チェックを無効にします。 -
size
: サービスにより、許可されたアプリケーションのファイルサイズのみを比較します。 -
ima
: サービスにより、カーネルの Integrity Measurement Architecture (IMA) がファイルの拡張属性に保存した SHA-256 ハッシュをチェックします。さらに、サイズチェックも実行します。ロールは IMA カーネルサブシステムを設定しないことに注意してください。このオプションを使用するには、IMA サブシステムを手動で設定する必要があります。 -
sha256
: サービスにより、許可されたアプリケーションの SHA-256 ハッシュを比較します。
-
fapolicyd_setup_trust: <trust_backends>
-
信頼バックエンドのリストを定義します。
file
バックエンドを含める場合は、fapolicyd_add_trusted_file
リストで許可されている実行可能ファイルを指定します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.fapolicyd.README.md
ファイルを参照してください。Playbook の構文を検証します。
ansible-playbook ~/playbook.yml --syntax-check
$ ansible-playbook ~/playbook.yml --syntax-check
Copy to Clipboard Copied! このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
検証
許可リストにないバイナリーアプリケーションをユーザーとして実行します。
ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>'
$ ansible managed-node-01.example.com -m command -a 'su -c "/bin/not_authorized_application " <user_name>' bash: line 1: /bin/not_authorized_application: Operation not permitted non-zero return code
Copy to Clipboard Copied!
第11章 侵入型 USB デバイスに対するシステムの保護
USB デバイスには、スパイウェア、マルウェア、またはトロイの木馬が読み込まれ、データを盗んだり、システムを損傷する可能性があります。Red Hat Enterprise Linux 管理者は、USBGuard でこのような USB 攻撃を防ぐことができます。
11.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 ポリシーを変更できるようになります。
11.2. USBGuard のインストール
この手順を使用して、USBGuard フレームワークをインストールして開始します。
手順
usbguard
パッケージをインストールします。dnf install usbguard
# dnf install usbguard
Copy to Clipboard Copied! 初期ルールセットを作成します。
usbguard generate-policy > /etc/usbguard/rules.conf
# usbguard generate-policy > /etc/usbguard/rules.conf
Copy to Clipboard Copied! usbguard
デーモンを起動し、システムの起動時に自動的に起動することを確認します。systemctl enable --now usbguard
# systemctl enable --now usbguard
Copy to Clipboard Copied!
検証
usbguard
サービスが実行中であることを確認します。systemctl status 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.
Copy to Clipboard Copied! USBGuard が認識する USB デバイスのリストを表示します。
usbguard list-devices
# usbguard list-devices 4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...
Copy to Clipboard Copied!
11.3. CLI を使用した USB デバイスのブロックと許可
ターミナルで usbguard
コマンドを使用すると、特定の USB デバイスを許可、ブロック、または拒否するように USBGuard を設定できます。この設定は、USBGuard が実行されている限り維持されます。USBGuard では、block
および reject
は以下の意味で使用されます。
block
- 今はこのデバイスとやり取りしません。
reject
- このデバイスは存在しないものとして無視します。
前提条件
-
usbguard
サービスがインストールされ、実行中である。
手順
USBGuard によって認識されるデバイスをリスト表示して、USB デバイスの ID を特定します。
usbguard list-devices
# 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
Copy to Clipboard Copied! デバイスがシステムとやり取りすることを許可します。
usbguard allow-device <ID>
# usbguard allow-device <ID>
Copy to Clipboard Copied! デバイスの許可を解除し、デバイスを削除します。
usbguard reject-device <ID>
# usbguard reject-device <ID>
Copy to Clipboard Copied! デバイスの許可を解除し、デバイスを保持します。
usbguard block-device <ID>
# usbguard block-device <ID>
Copy to Clipboard Copied!
11.4. USB デバイスの永続的なブロックおよび許可
-p
オプションを使用すると、USB デバイスを永続的にブロックおよび許可できます。これにより、デバイス固有のルールが現在のポリシーに追加され、再起動やリブート後も保持されます。USBGuard では、block
および reject
は以下の意味で使用されます。
block
- 今はこのデバイスとやり取りしません。
reject
- このデバイスは存在しないものとして無視します。
前提条件
-
usbguard
サービスがインストールされ、実行中である。
手順
usbguard
デーモンがルールの書き込みを許可するように SELinux を設定します。usbguard
に関連するsemanage
ブール値を表示します。semanage boolean -l | grep usbguard
# 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
Copy to Clipboard Copied! usbguard_daemon_write_rules
のブール値が無効になっている場合は、有効にします。semanage boolean -m --on usbguard_daemon_write_rules
# semanage boolean -m --on usbguard_daemon_write_rules
Copy to Clipboard Copied!
USBGuard によって認識されるデバイスをリスト表示して、USB デバイスの ID を特定します。
usbguard list-devices
# 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
Copy to Clipboard Copied! デバイスがシステムとやり取りすることを永続的に許可します。
usbguard allow-device <ID> -p
# usbguard allow-device <ID> -p
Copy to Clipboard Copied! デバイスの許可を永続的に解除し、デバイスを削除します。
usbguard reject-device <ID> -p
# usbguard reject-device <ID> -p
Copy to Clipboard Copied! デバイスの許可を永続的に解除し、デバイスを保持します。
usbguard block-device <ID> -p
# usbguard block-device <ID> -p
Copy to Clipboard Copied!
検証
USBGuard ルールに加えた変更が含まれていることを確認します。
usbguard list-rules
# usbguard list-rules
Copy to Clipboard Copied!
11.5. USB デバイス用のカスタムポリシーの作成
以下の手順では、シナリオの要件を反映する USB デバイス用のルールセットを作成する手順を説明します。
前提条件
-
usbguard
サービスがインストールされ、実行中である。 -
/etc/usbguard/rules.conf
ファイルに、usbguard generate-policy
コマンドによって生成された初期ルールセットが含まれている。
手順
現在接続している USB デバイスを許可するポリシーを作成し、生成されたルールを
rules.conf
ファイルに保存します。usbguard generate-policy --no-hashes > ./rules.conf
# usbguard generate-policy --no-hashes > ./rules.conf
Copy to Clipboard Copied! --no-hashes
オプションは、デバイスのハッシュ属性を生成しません。設定のハッシュ属性は永続的ではない可能性があるため、回避してください。rules.conf
ファイルで、テキストエディターを使用して必要に応じてルールを追加、削除、または編集します。たとえば、以下のルールを使用すると、大容量ストレージインターフェイスが 1 つあるデバイスのみがシステムと対話できます。allow with-interface equals { 08:*:* }
allow with-interface equals { 08:*:* }
Copy to Clipboard Copied! 詳細なルール言語の説明とその他の例は、
usbguard-rules.conf(5)
の man ページを参照してください。更新したポリシーをインストールします。
install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
Copy to Clipboard Copied! usbguard
デーモンを再起動して、変更を適用します。systemctl restart usbguard
# systemctl restart usbguard
Copy to Clipboard Copied!
検証
カスタムルールがアクティブポリシーにあることを確認します。以下に例を示します。
usbguard list-rules
# usbguard list-rules ... 4: allow with-interface 08:*:* ...
Copy to Clipboard Copied!
11.6. USB デバイス用の構造化されたカスタムポリシーの作成
/etc/usbguard/rules.d/
ディレクトリー内の複数の .conf
ファイルで、カスタムの USBGuard ポリシーを整理できます。usbguard-daemon
により、メインの rules.conf
ファイルとディレクトリー内の .conf
ファイルがアルファベット順に結合されます。
前提条件
-
usbguard
サービスがインストールされ、実行中である。
手順
現在接続している USB デバイスを許可するポリシーを作成し、生成されたルールを、新しい
.conf
ファイル (例:policy.conf
) ファイルに保存します。usbguard generate-policy --no-hashes > ./<policy.conf>
# usbguard generate-policy --no-hashes > ./<policy.conf>
Copy to Clipboard Copied! --no-hashes
オプションは、デバイスのハッシュ属性を生成しません。設定のハッシュ属性は永続的ではない可能性があるため、回避してください。任意のテキストエディターで
<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" ...
... allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...
Copy to Clipboard Copied! 選択した行を別の
.conf
ファイルにコピーします。注記ファイル名の先頭にある 2 つの数字は、デーモンが設定ファイルを読み込む順序を指定します。
たとえば、キーボードのルールを新しい
.conf
ファイルにコピーするには、次のコマンドを実行します。grep "USB Keyboard" ./<policy.conf> > ./<10keyboards.conf>
# grep "USB Keyboard" ./<policy.conf> > ./<10keyboards.conf>
Copy to Clipboard Copied! 新しいポリシーを
/etc/usbguard/rules.d/
ディレクトリーにインストールします。install -m 0600 -o root -g root <10keyboards.conf> /etc/usbguard/rules.d/<10keyboards.conf>
# install -m 0600 -o root -g root <10keyboards.conf> /etc/usbguard/rules.d/<10keyboards.conf>
Copy to Clipboard Copied! 残りの行をメインの
rules.conf
ファイルに移動します。grep -v "USB Keyboard" ./policy.conf > ./rules.conf
# grep -v "USB Keyboard" ./policy.conf > ./rules.conf
Copy to Clipboard Copied! 残りのルールをインストールします。
install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
Copy to Clipboard Copied! usbguard
デーモンを再起動して、変更を適用します。systemctl restart usbguard
# systemctl restart usbguard
Copy to Clipboard Copied!
検証
アクティブな USBGuard ルールをすべて表示します。
usbguard list-rules
# 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" ...
Copy to Clipboard Copied! rules.conf
ファイルと、/etc/usbguard/rules.d/
ディレクトリー内の.conf
ファイルの内容をすべて表示します。cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
# cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
Copy to Clipboard Copied! - アクティブなルールに、ファイルのすべてのルールが正しく、正しい順序で含まれていることを確認します。
11.7. USBGuard IPC インターフェイスを使用するユーザーおよびグループの許可
デフォルトでは、USBGuard のパブリック IPC インターフェイスを使用できるのは root ユーザーのみです。root に加えて、特定のユーザーまたはグループにこのインターフェイスの使用を許可できます。これを実行するには、/etc/usbguard/usbguard-daemon.conf
ファイルを編集するか、usbguard add-user
サブコマンドを使用します。
前提条件
-
usbguard
サービスがインストールされ、実行中である。 -
/etc/usbguard/rules.conf
ファイルに、usbguard generate-policy
コマンドによって生成された初期ルールセットが含まれている。
手順
/etc/usbguard/usbguard-daemon.conf
ファイルを編集し、必要なルールを追加します。たとえば、wheel
グループ内のすべてのユーザーに IPC インターフェイスの使用を許可するには、次の行を追加します。IPCAllowGroups=wheel
IPCAllowGroups=wheel
Copy to Clipboard Copied! usbguard
コマンドで、ユーザーまたはグループを追加することもできます。たとえば、次のコマンドを実行すると、ユーザーがDevices
およびExceptions
セクションに完全にアクセスし、現在のポリシーのリスト表示と変更を実行できるようになります。usbguard add-user <user_name> --devices ALL --policy modify,list --exceptions ALL
# usbguard add-user <user_name> --devices ALL --policy modify,list --exceptions ALL
Copy to Clipboard Copied! <user_name>
は、この権限を付与するユーザー名に置き換えます。usbguard remove-user <user_name>
コマンドを使用すると、ユーザーに付与した権限を削除できます。usbguard
デーモンを再起動して、変更を適用します。systemctl restart usbguard
# systemctl restart usbguard
Copy to Clipboard Copied!
11.8. Linux 監査ログへの USBguard 許可イベントの記録
デフォルトでは、usbguard
デーモンは /var/log/usbguard/usbguard-audit.log
ファイルにイベントを記録します。USBguard 許可イベントのロギングを標準の Linux 監査ログに統合できます。
前提条件
-
usbguard
サービスがインストールされ、実行中である。 -
auditd
サービスが実行中である。
手順
/etc/usbguard/usbguard-daemon.conf
ファイルで、AuditBackend
オプションをFileAudit
からLinuxAudit
に変更します。AuditBackend=LinuxAudit
AuditBackend=LinuxAudit
Copy to Clipboard Copied! usbguard
デーモンを再起動して、設定変更を適用します。systemctl restart usbguard
# systemctl restart usbguard
Copy to Clipboard Copied!
検証
audit
デーモンログで USB 許可イベントを照会します。次に例を示します。ausearch -ts recent -m USER_DEVICE
# ausearch -ts recent -m USER_DEVICE
Copy to Clipboard Copied!