目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / Keylimeを使用したSLE Microのセキュリティ保護

Keylimeを使用したSLE Microのセキュリティ保護

発行日: 12/12/2024
概要

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)を提供します。

エージェントのインストールと登録を開始する前に、次の手順で説明するように、リモートホスト上でベリファイアとレジストラを準備します。

  1. Keylimeワークロードのイメージを特定します。

    # podman search keylime
    [...]
    registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane
  2. そのイメージをレジストリから取得します。

    # podman pull\
      registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest
  3. keylime-control-planeボリュームを作成して、検証プロセス中に必要なデータベースと証明書を永続化します。

    # podman container runlabel install \
      registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest
  4. コンテナと関連するサービスを開始します。

    # podman container runlabel run \
      registry.opensuse.org/devel/microos/containers/containerfile/opensuse/keylime-control-plane:latest

    keylime-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に存在しないため、手動でインストールする必要があります。このエージェントをインストールするには次の手順に従います。

  1. 次のようにrust-keylimeのパッケージをインストールします。

    # transactional-update pkg in rust-keylime

    続いてシステムを再起動します。

  2. エージェントのデフォルトの設定を調整します。

    1. 指定した変更を収めた新しい設定ファイルを保存するディレクトリを/etc/keylime/agent.conf.d/に作成します。デフォルトの設定は/usr/etc/keylime/agent.confに保存されていますが、このファイルは今後のシステム更新で上書きされることがあるので、このデフォルトのディレクトリへの保存はお勧めできません。

      # mkdir -p /etc/keylime/agent.conf.d
    2. 新しいファイル/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

      1

      エージェントを実行するたびに固有の識別子が生成されます。このオプションでは、その識別子に特定の値を定義できます。

      2

      レジストラのIPアドレス。

      3

      ベリファイアのIPアドレス。

    3. /etc/keylime/ディレクトリの所有者をkeylime:tssに変更します。

      # chown -R keylime:tss /etc/keylime
    4. /etc/keylime/ディレクトリに対する許可を次のように変更します。

      # chmod -R 600 /etc/keylime
  3. CAで生成された証明書をエージェントノードにコピーします。エージェントノードで次の手順を実行します。

    1. 証明書のディレクトリを用意します。

      # mkdir -p /var/lib/keylime/cv_ca
    2. エージェントに証明書をコピーします。

      # scpCERT_SERVER_ADDRESS:/var/lib/keylime/cv_ca/cacert.crt /var/lib/keylime/cv_ca
    3. 証明書の所有者をkeylime:tssに変更します。

      # chown -R keylime:tss /var/lib/keylime/cv_ca
  4. 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

1

AGENTは、登録するエージェントのIPアドレスです。

2

UUIDは、エージェント固有の識別子です。

3

includeオプションで渡したファイルを使用してエージェントにシークレットペイロードのデータが配信されます。詳細については、5項 「Keylimeセキュアペイロード」を参照してください。

登録済みエージェントを列挙するには、ベリファイアのホスト上で次のように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パラメータを指定してブートします。

  1. /etc/default/grubにあるパラメータでGRUB_CMDLINE_LINUX_DEFAULTオプションを更新します。

    GRUB_CMDLINE_LINUX_DEFAULT="ima_appraise=log ima_policy=tcb"
  2. 次のコマンドを実行してgrub.cfgを再生成します。

    # transactional-update grub.cfg
  3. システムを再起動します。

上記の手順では、カーネルでデフォルトのIMAポリシーを使用しています。監視するファイルが多すぎるために長大なログが作成されるのを回避するには、新しいカスタムポリシーを作成します。詳細については、Keylime documentationを参照してください。

想定されるハッシュが示されるようにするには、エージェントを登録するときにkeylime_tenantコマンドで--allowlistオプションを指定します。除外されたファイルまたは無視されたファイルを確認するには、keylime_tenantコマンドで--excludeオプションを指定します。

# keylime_tenant --allowlist
    -v 127.0.0.1 \
    -uUUID

7 詳細情報