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

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

発行日: 20/03/2025
概要

Keylimeは、TPMベースのリモートブートの検証とランタイムの整合性の測定です。

目的

この記事では、SUSE Linux MicroでKeylimeを設定および実行する方法について説明します。

所要時間

この記事の理解には25分ほどを要します。

目標

Keylimeの仕組み、設定方法、および実行方法について詳しく理解します。

要件
  • SUSE Linux Microの実行中のインスタンス。

1 Keylimeを使用したリモート検証

不正な変更からデバイスを保護する機能の要望が強くなるに伴い、セキュリティメカニズムとして「リモート検証(RA)」が広く使用されるようになっています。RAを使用すると、ホスト(クライアント)はそのブートチェーンのステータスとリモートホスト(ベリファイア)で実行中のソフトウェアを認証できます。RAは、公開鍵暗号化(TPM2を使用)と組み合わされることが多いため、送信された情報を読み込めるのは検証を要求したサービスだけであり、データの有効性を検証できます。

SUSE Linux 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)のみを使用して更新できます。TPMに対するquoteコマンドで、現在のPCR値の署名付きリストを取得できます。このPCR値は、検証プロセスで第三者が確認できます。

セキュアブート

ブートプロセスの各ステップでは、次のステップにある実行可能ファイルの暗号署名が確認されます。その確認を経たうえでその実行可能ファイルが実行されます。

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は、エージェント、ベリファイア、レジストラ、コマンドラインツール(テナント)で構成されます。エージェントは検証が必要なシステム上に置かれます。ベリファイアとレジストラは、エージェントの登録と検証を実行するリモートシステム上に置かれます。SUSE Linux Microではエージェント役割のみがあります。各コンポーネントの詳細については以下の該当するセクションを参照してください。

1.3.1 Keylimeのエージェント

エージェントは、検証を受ける必要があるシステム上で実行されるサービスです。エージェントは、ローカルTPMをデータ有効性の認証機能として使用し、イベントログ、IMAハッシュ、メジャーブートに関する情報をベリファイアに送信します。

新しいエージェントが開始したときは、まず、そのエージェント自体をレジストラに登録する必要があります。その登録には、接続を確立するための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エージェントは、デフォルトではSUSE Linux 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. エージェントに証明書をコピーします。

      # scp CERT_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 \
  -t AGENT \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 \
  -t AGENT \
  -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 \
    -u UUID

7 詳細情報