Keylimeを使用したSLE Microのセキュリティ保護
- 概要
Keylimeは、TPMベースのリモートブートの検証とランタイムの整合性の測定です。
- 目的
この記事では、SLE MicroでKeylimeを設定および実行する方法について説明します。
- 所要時間
この記事の理解には25分ほどを要します。
- 目標
Keylimeの仕組み、設定方法、および実行方法について詳しく理解します。
- 要件
SLE Microの実行中のインスタンス。
1 Keylimeを使用したリモート検証 #
不正な変更からデバイスを保護する機能の要望が強くなるに伴い、セキュリティメカニズムとして「リモート検証(RA)」が広く使用されるようになっています。RAを使用すると、ホスト(クライアント)は、ブートチェーンのステータスと実行中のソフトウェアをリモートホスト(ベリファイア)で認証できます。RAは、公開鍵暗号化(TPM2を使用)と組み合わされることが多いため、送信された情報を読み込めるのは検証を要求したサービスだけであり、データの有効性を検証できます。
SLE Microのリモート検証は、Keylimeで実装されます。
1.1 用語集 #
リモート検証テクノロジでは次の用語を使用します。
- 検証キー(AK)
データが本物のTPMからのもので、改ざんされていないことを証明するデータ署名キー。
- Core Root of Trust for Measurement
自身のハッシュと、ブートプロセスの次のステップのハッシュを計算し、測定のチェーンを開始します。
- エンドースメントキー(EK)
TPMの製造時にそれに永続的に埋め込まれる暗号化キー。TPMに保存されているキーの公開部分と証明書を使用して、本物のTPMを認識します。
- Integrity Management Architecture (IMA)
ファイルに対する悪意のある変更を検出する手段を提供するカーネル整合性サブシステム。
- メジャーブート
ブートシーケンスの各コンポーネントで、次のコンポーネントのハッシュを計算したうえで実行をそのコンポーネントに委任する手法。このハッシュは、TPMの1つまたは複数のPCRを拡張した値です。測定が行われた場所と測定内容に関する情報を含むイベントが作成されます。このようなイベントは拡張されたPCR値とともにイベントログに収集され、正常なシステムであることを示す期待値と比較できます。
- Platform Configuration Register (PCR)
TPMの内部メモリの中で、ブートレイヤのハッシュなどを保存する場所。PCRは非可逆的操作(
extend
)のみを使用して更新できます。現在のPCR値の署名済みリストは、TPMのquote
コマンドで取得することができ、このQuoteをサードパーティが検証プロセス中に検証できます。- セキュアブート
ブートプロセスの各ステップでは、次のステップにある実行可能ファイルの暗号署名が確認されます。その確認を経たうえでその実行可能ファイルが実行されます。
- Trusted Platform Module (TPM)
自己完結型のセキュリティ暗号プロセッサ。ハードウェアでシステムに搭載されているか、信頼の基点(Root of Trust)として機能するファームウェアに実装されています。TPMは、ブートレイヤのハッシュを保存したPCRを提供します。一般的なTPMは、乱数ジェネレータ、カウンタ、ローカルクロックなどの機能を提供します。また、サポート対象の暗号ハッシュ関数(SHA1、SHA256、SHA384、SHA512)ごとにバンク別にグループ化した24個のPCRを保存します。
注記デフォルトでは、TPMの使用は無効になっています。したがって、メジャーブートは実行されません。リモート検証を有効にするには、EFI/BIOSメニューでTPMを有効にします。
- セキュアペイロード
暗号化したデータを正常なエージェントに配信するメカニズム。ペイロードを使用して、エージェントで使用するキー、パスワード、証明書、設定、スクリプトを提供します。
1.2 Keylimeとは #
Keylimeはリモート検証ソリューションであり、TPMを測定の信頼の基点として使用し、リモートノードの状態を監視できます。Keylimeを使用すると、次のようなタスクを実行できます。
メジャーブート中に、拡張されたPCRを検証する。
イベントログの分析を作成し、アサーションを設定する。
リモートシステムで任意のPCR値のアサーションを設定する。
開いているファイルまたは実行されたファイルの有効性を監視する。
「セキュアペイロード」を使用して、検証済みノードに暗号化データを配信する。
コンピュータが検証済みの測定に失敗した場合にトリガするカスタムスクリプトを実行する。
1.3 アーキテクチャ #
Keylimeは、エージェント、ベリファイア、レジストラ、コマンドラインツール(テナント)で構成されます。エージェントは検証が必要なシステム上に置かれます。ベリファイアとレジストラは、エージェントの登録と検証を実行するリモートシステム上に置かれます。SLE Microではエージェント役割のみがあります。各コンポーネントの詳細については以下の該当するセクションを参照してください。
1.3.1 Keylimeのエージェント #
エージェントは、検証を受ける必要があるシステム上で実行されるサービスです。エージェントは、イベントログ、IMAハッシュ、および測定されたブートに関する情報をベリファイアに送信します。その際に、ローカルTPMをデータの有効性の証明者として使用します。
新しいエージェントが開始したときは、まず、そのエージェント自体をレジストラに登録する必要があります。その登録には、接続を確立するためのTLS証明書がエージェントに必要です。TLS証明書はレジストラで生成されますが、手動でエージェントにインストールする必要があります。登録後、エージェントはその検証キーとエンドースメントキーの公開部分をレジストラに送信します。レジストラは、資格情報のアクティベーションプロセスでエージェントにチャレンジで応答します。このプロセスは、エージェントのTPMの検証を目的としています。エージェントが登録されると、それを検証で使用できるようになります。
1.3.2 Keylimeのレジストラ #
レジストラを使用して、検証を受ける必要があるエージェントを登録します。レジストラは、エージェントの検証キー、エンドースメントキーの公開部分、およびエンドースメントキー証明書を収集し、エージェントの検証キーがエンドースメントキーに属することを検証します。
1.3.3 Keylimeのベリファイア #
ベリファイアはエージェントの実際の検証を行い、必要な検証データをエージェントから継続的に取得します(特に、PCR値、IMAログ、およびUEFIイベントログ)。
2 Podmanを使用したKeylimeワークロードの実行 #
Keylimeは、リモートノードのヘルスを監視できるリモート検証ソリューションです。「ベリファイア」と「レジストラ」は、リモートシステム上のKeylimeの重要なコンポーネントであり、Keylimeエージェントの登録と検証を実行します。
この記事で説明するコンテナは、Keylimeプロジェクトの一部であるコントロールプレーンサービスの「ベリファイア」と「レジストラ」、および「テナント」コマンドラインツール(CLI)を提供します。
エージェントのインストールと登録を開始する前に、次の手順で説明するように、リモートホスト上でベリファイアとレジストラを準備します。
Keylimeワークロードのイメージを特定します。
#
podman search keylime [...] registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-planeそのイメージをレジストリから取得します。
#
podman pull\ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latestkeylime-control-plane
ボリュームを作成して、検証プロセス中に必要なデータベースと証明書を永続化します。#
podman container runlabel install \ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latestコンテナと関連するサービスを開始します。
#
podman container runlabel run \ registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latestkeylime-control-plane
コンテナが作成されます。ここには、設定されて実行中のレジストラサービスとベリファイアサービスが含まれます。内部では、コンテナは、デフォルト値を使用してポート8881、8890、および8891をホストに公開します。ファイアウォール設定を検証し、これらのポートへのアクセスを許可します。また、テナントCLIで必要になるため、コンテナ間の通信も許可します。
Keylimeサービスを停止する場合は次のコマンドを実行します。
#
podman kill keylime-control-plane-container
2.1 Keylimeサービスの監視 #
ホスト上で実行しているコンテナのステータスを取得するには次のコマンドを実行します。
#
podman ps
Keylimeサービスのログを表示するには次のコマンドを実行します。
#
podman logs keylime-control-plane-container
2.2 テナントCLIの実行 #
テナントCLIツールはコンテナに含まれており、ホストのファイアウォールがKeylimeサービスによって公開されるポートに干渉しなければ、同じイメージを使用して実行できます。次に例を示します。
#
podman run --rm \ -v keylime-control-plane-volume:/var/lib/keylime/ \ keylime-control-plane:latest \ keylime_tenant -v 10.88.0.1 -r 10.88.0.1 --cert default -c reglist
2.3 Keylime証明書の抽出 #
Keylimeコンテナを初めて実行したときに、いくつかのエージェントが必要とする証明書がそのコンテナのサービスによって作成されます。コンテナから証明書を抽出して、エージェントの/var/lib/keylime/cv_ca/
ディレクトリにコピーする必要があります。
#
podman cp \ keylime-control-plane-container:/var/lib/keylime/cv_ca/cacert.crt .
#
scp cacert.crt AGENT_HOST:/var/lib/keylime/cv_ca/
エージェントのインストールの詳細については3項 「Keylimeエージェントのインストール」を参照してください。
3 Keylimeエージェントのインストール #
Keylimeは、リモートノードのヘルスを監視できるリモート検証ソリューションです。Keylimeエージェントは、検証が必要なシステム上で実行され、イベントログ、IMAハッシュ、および測定されたブートに関する情報をベリファイアに送信するサービスです。
Keylimeエージェントは、デフォルトではSLE Microに存在しないため、手動でインストールする必要があります。このエージェントをインストールするには次の手順に従います。
次のようにrust-keylimeのパッケージをインストールします。
#
transactional-update pkg in rust-keylime続いてシステムを再起動します。
エージェントのデフォルトの設定を調整します。
指定した変更を収めた新しい設定ファイルを保存するディレクトリを
/etc/keylime/agent.conf.d/
に作成します。デフォルトの設定は/usr/etc/keylime/agent.conf
に保存されていますが、このファイルは今後のシステム更新で上書きされることがあるので、このデフォルトのディレクトリへの保存はお勧めできません。#
mkdir -p /etc/keylime/agent.conf.d新しいファイル
/etc/keylime/agent.conf.d/agent.conf
を作成します。#
cat << EOF > /etc/keylime/agent.conf.d/agent.conf [agent] uuid = "d111ec46-34d8-41af-ad56-d560bc97b2e8"1 registrar_ip = "<REMOTE_IP>"2 revocation_notification_ip = "<REMOTE_IP>"3 EOF/etc/keylime/
ディレクトリの所有者をkeylime:tss
に変更します。#
chown -R keylime:tss /etc/keylime/etc/keylime/
ディレクトリに対する許可を次のように変更します。#
chmod -R 600 /etc/keylime
CAで生成された証明書をエージェントノードにコピーします。エージェントノードで次の手順を実行します。
証明書のディレクトリを用意します。
#
mkdir -p /var/lib/keylime/cv_caエージェントに証明書をコピーします。
#
scpCERT_SERVER_ADDRESS:/var/lib/keylime/cv_ca/cacert.crt /var/lib/keylime/cv_ca証明書の所有者を
keylime:tss
に変更します。#
chown -R keylime:tss /var/lib/keylime/cv_ca
keylime_agent.service
を開始して有効にします。#
systemctl enable --now keylime_agent.service
4 Keylimeエージェントの登録 #
Keylimeは、リモートノードのヘルスを監視できるリモート検証ソリューションです。Keylimeエージェントは、検証が必要なシステム上で実行され、イベントログ、IMAハッシュ、および測定されたブートに関する情報をベリファイアに送信するサービスです。
新しいエージェントを登録するには、テナントCLIを使用するか、ベリファイアの設定を編集します。ベリファイアのホスト上でテナントを使用して、次のコマンドを実行します。
#
keylime_tenant -v 127.0.0.1 \
-tAGENT \1
-u UUID \2
--cert default \
-c add
[--include PATH_TO_ZIP_FILE]3
AGENTは、登録するエージェントのIPアドレスです。 | |
UUIDは、エージェント固有の識別子です。 | |
|
登録済みエージェントを列挙するには、ベリファイアのホスト上で次のようにreglist
コマンドを使用します。
#
keylime_tenant -v 127.0.0.1 \
--cert default \
-c reglist
登録済みエージェントを削除するには、次のように、-t
オプションと-u
オプション、および-c
delete
コマンドを使用してエージェントを指定します。
#
keylime_tenant -v 127.0.0.1 \
-tAGENT \
-u UUID \
-c delete
5 Keylimeセキュアペイロード #
Keylimeは、リモートノードのヘルスを監視できるリモート検証ソリューションです。
5.1 セキュアペイロードとは #
Keylimeのセキュアペイロードを使用すると、正常なエージェントに暗号化データを配信できます。ペイロードを使用して、後工程でKeylimeエージェントが使用するキー、パスワード、証明書、設定、スクリプトを提供します。
5.2 セキュアペイロードの動作 #
セキュアペイロードは、zip
ファイルに収めてエージェントに配信されます。このファイルには、シェルスクリプトautorun.sh
を収めておく必要があります。このスクリプトは、エージェントが適切に登録および検証されている場合にのみ実行されます。zip
ファイルを配信するには、keylime_tenant
コマンドで--include
オプションを指定します。
たとえば、次のautorun.sh
スクリプトは、ディレクトリ構造を作成して、そこにSSHキーをコピーします。関連するzip
アーカイブには、これらのSSHキーが記述されている必要があります。
>
cat autorun.sh
#!/bin/bash
mkdir -p /root/.ssh/
cp id_rsa* /root/.ssh/
chmod 600 /root/.ssh/id_rsa*
cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
6 KeylimeのIMA追跡の有効化 #
Keylimeは、リモートノードのヘルスを監視できるリモート検証ソリューションです。Integrity management architecture (IMA)は、ファイルに対する悪意のある変更を検出する手段を提供するカーネル整合性サブシステムです。
IMAを使用すると、アクセス先ファイルのハッシュがカーネルによって計算されます。その後、このハッシュを使用して、TPMのPCR 10を拡張し、さらにアクセスされたファイルのリストも記録します。ベリファイアは、PCR 10の署名付き予測をエージェントに要求して、すべてのアクセス先ファイルのログ記録をファイルハッシュ付きで取得できます。続いて、ベリファイアは、承認済みファイルのローカル許可リストとアクセス先ファイルを比較します。いずれかのハッシュが認識されない場合、システムは安全ではないと見なされ、取り消しイベントがトリガされます。
Keylimeで情報を収集できるようになるまで、IMA/EVMを有効にしておく必要があります。このプロセスを有効にするには、エージェントのカーネルを、ima_appraise=log
パラメータとima_policy=tcb
パラメータを指定してブートします。
/etc/default/grub
にあるパラメータでGRUB_CMDLINE_LINUX_DEFAULT
オプションを更新します。GRUB_CMDLINE_LINUX_DEFAULT="ima_appraise=log ima_policy=tcb"
次のコマンドを実行して
grub.cfg
を再生成します。#
transactional-update grub.cfgシステムを再起動します。
上記の手順では、カーネルでデフォルトのIMAポリシーを使用しています。監視するファイルが多すぎるために長大なログが作成されるのを回避するには、新しいカスタムポリシーを作成します。詳細については、Keylime documentationを参照してください。
想定されるハッシュが示されるようにするには、エージェントを登録するときにkeylime_tenant
コマンドで--allowlist
オプションを指定します。除外されたファイルまたは無視されたファイルを確認するには、keylime_tenant
コマンドで--exclude
オプションを指定します。
#
keylime_tenant --allowlist
-v 127.0.0.1 \
-uUUID
7 詳細情報 #
Keylimeのホームページはhttps://keylime.devです。
Keylimeの最新ドキュメントはhttps://keylime.readthedocs.io/en/latest/にあります。
IMA/EVMの概要についてはhttps://en.opensuse.org/SDB:Ima_evm#Introductionを参照してください。
新しいカーネルIMAポリシーを作成する方法についてはhttps://keylime-docs.readthedocs.io/en/latest/user_guide/runtime_ima.htmlを参照してください。
8 法的事項 #
Copyright © 2006–2024 SUSE LLC and contributors. All rights reserved.
この文書は、GNUフリー文書ライセンスのバージョン1.2または(オプションとして)バージョン1.3の条項に従って、複製、頒布、および/または改変が許可されています。ただし、この著作権表示およびライセンスは変更せずに記載すること。ライセンスバージョン1.2のコピーは、「GNUフリー文書ライセンス」セクションに含まれています。
SUSEの商標については、https://www.suse.com/company/legal/を参照してください。その他の第三者のすべての商標は、各社の所有に帰属します。商標記号(®、™など)は、SUSEおよび関連会社の商標を示します。アスタリスク(*)は、第三者の商標を示します。
本書のすべての情報は、細心の注意を払って編集されています。しかし、このことは正確性を完全に保証するものではありません。SUSE LLC、その関係者、著者、翻訳者のいずれも誤りまたはその結果に対して一切責任を負いかねます。