libvirt と Linux 監査サブシステムを使用して KVM のゲストを追跡する

仮想環境においてゲストとホストのイベントを監査し、フィルタリングする

libvirt は Linux ホスト上の仮想環境を管理するための重要なツールです。監視、コンプライアンス、科学的犯罪捜査、その他の目的のために、libvirt の実行中にホストで発生するイベントの監査証跡が必要になる場合がしばしばあります。この記事では、libvirt によって行われた処理をホスト上の Linux 監査サブシステムを使用して追跡する方法、それらのイベントと他のホストのイベントとを関連付け、libvirt を通じて行われた変更を一貫性のある包括的な方法で表示する方法について説明します。

Marcelo H. Cerri, Staff Software Engineer, IBM

 Photo of Marcelo CerriMarcelo Cerri はブラジルにある IBM Linux Technology Center のソフトウェア技術者であり、セキュリティー開発チームの一員として、クラウドと仮想化に関連するプロジェクトに従事しています。彼はこれまでにクラウド・コンピューティング・プラットフォームや通信課金システムの開発も経験しています。



2012年 7月 05日

概要

libvirt は Linux の仮想環境を管理するために広く使用されています。libvirt には、ゲストのライフサイクル管理、リソースの割り当て、cgroup を使用したリソース管理、SELinux によるセキュリティーの施行など、さまざまな機能があります。こうした、libvirt によって実行される処理の対象はすべて、ゲストに割り当てられた、またはゲストから解放された、ホストのリソースです。

libvirt はバージョン 0.9.0 から、ホスト上の Linux 監査サブシステムと通信することにより、いくつかの処理に関するレコードを発行できるようになっています。これは重要な機能であり、この機能を利用することで、システム管理者、監査担当者、さらには他のアプリケーションまでもが、仮想環境で行われた変更の詳細な履歴 (ゲストのライフサイクルで行われた処理や、ゲストに対して割り当てられたホストのリソースの変更など) にアクセスできるようになります。

Linux 監査サブシステムは、単に libvirt から発行された仮想化関連のイベントを処理できるだけではなく、さまざまなソースからの多様なイベントを処理することができます。Linux 監査サブシステムは多くの場合、ファイルの変更の追跡や、SELinux や AppAmor によるセキュリティー上のアクセス拒否の追跡、さらにはシステム・コールの追跡などに使用されます。これらの多種多様なイベントには、仮想マシンの監査の観点で有用な情報が含まれている場合があります。

例えば、ゲストに割り当てられたリソースへのアクセスが SELinux のポリシーによって禁止されているような場合には、そのリソースにアクセスすると AVC (Access Vector Cache) 拒否レコードが生成されることになります。このイベントは libvirt によって発行されるものではありませんが、ゲストに関連しています。同様に、多くのイベントがゲストに関連している場合があります。そうしたイベントのなかには、カーネルによって生成される例外的なイベントや、ユーザー空間に存在するプログラムによって生成される例外的なイベントがあります。

この先のセクションでは、Linux 監査サブシステムの動作、libvirt と Linux 監査サブシステムとのやり取りの方法、ゲストに関連する情報を監査ログから取得する方法について、簡単に説明します。

監査の基本

大部分の監査イベントは Linux カーネルが生成します (例えば、システム・コール・イベント、ファイル監視イベント、セキュリティー・イベントなど)。ただしユーザー・アプリケーションがイベントを生成する場合もあります。

Linux 監査サブシステムの中心コンポーネントはカーネルです。他のコンポーネントによって生成されたイベントはすべて、最初にカーネルに送信されます。カーネル内では一連のルールを適用し、イベントを破棄するかどうかを判断します。図 1 は Linux 監査サブシステムを構成するコンポーネントを示しています。

図 1. Linux 監査サブシステムのコンポーネント
Linux 監査サブシステムのコンポーネント

カーネル内の監査ルールは auditctl コマンドを使用して変更することができます。特殊機能を持つ一部のアプリケーション (libvirt デーモンなど) は、信頼できるアプリケーションとみなされ、監査イベントをカーネルに送信することができます。さまざまなルールを適用した後、カーネルはそれらのイベントを audit デーモンに送信します。次に audit デーモンはそれらのレコードをディスクに書き込み、場合によっては auditspd デーモンを使用してカスタム・アクションをディスパッチします。

他のコンポーネント (ausearch、aureport、aulast、auvirt) はユーザー空間のツールであり、監査ログの構文解析や、監査ログの情報を単純な形式で表示するために使用されます。auvirt ツールは仮想化関連のイベントとそれらの関連イベントを表示するため専用に設計されています。

注意すべき重要な点として、監査イベントと監査レコードの違いがあります。監査イベントは、ユーザーまたは何らかのアプリケーションによって開始されたアクションであり、監査の対象にすることができます。例えば、ファイル・オープンは監査の対象にすることができるイベントです。一方、監査レコードには、イベントの 1 つの側面にのみ関連する情報が含まれます。このため、1 つのイベントが監査ログの 1 つ以上のレコードにわたる場合があります。ファイル・オープンの例で考えると、このイベントは、呼び出された open システム・コールに関する情報を含むレコードと、アクセスされたファイルに関する情報を含むレコードを生成します (その例を示したリスト 1 を参照)。

リスト 1. ファイル・オープン・イベントに対する監査レコード (見やすいように行を折り返しています)
type=SYSCALL msg=audit(1328292445.908:40194): arch=c000003e syscall=2 
 success=yes exit=3 a0=7fffe3d2e85c a1=941 a2=1b6 a3=7fffe3d2c570 items=3
 ppid=26377 pid=26677 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0
 fsgid=0 tty=pts8 ses=1 comm="touch" exe="/bin/touch"
 subj=unconfined_u:unconfined_r:unconfined_t:s0 key=(null) 

type=CWD msg=audit(1328292445.908:40194):  cwd="/home/mhcerri" 

type=PATH msg=audit(1328292445.908:40194): item=0 name="/tmp/file" 
 inode=1196 dev=fd:01 mode=0100775 ouid=500 ogid=501 rdev=00:00 
 obj=unconfined_u:object_r:user_tmp_t:s0

各レコードのタイプが異なり、3 つのレコードすべてに “1328292445.908:40194” という同じストリングが含まれていることに注意してください。このストリングはイベント識別子です。コロン (:) の前にある最初の 2 つの数字はイベントのタイムスタンプであり、最初の数字は UNIX 時刻の秒の値を表し、2 番目の数字はミリ秒の値を表します。3 番目の数字は生成されたシリアル番号です。また、監査レコードに使用されているフォーマットが単純ではないことにも注意してください。そのため、Linux 監査サブシステムには監査ログの視覚化を補助するツールがいくつか用意されています。


libvirt と監査

libvirt は基本的に、3 つの異なるタイプのレコードを生成します。この 3 つのレコードにはすべて、「uuid」フィールドという 1 つの共通レコードがあります。uuid は Universal Unique Identifier であり、libvirt によって発行されるすべてのレコードにおいて、単一のゲストを特定することができます。libvirt が使用するレコードのタイプは以下のとおりです。

  • VIRT_CONTROL: 仮想マシンのライフサイクルのすべてのステップにおいて、ゲストが起動または停止された時に生成されます。このレコードには、処理が行われた理由やゲストの名前などのフィールドが含まれます。
  • VIRT_MACHINE_ID: libvirt がセキュリティー・ラベルをゲストに割り当てようとした時に生成されます。QEMU で sVirt を使用する場合、このレコードには、QEMU プロセスのセキュリティー・ラベルと、ゲストに追加されたディスクのセキュリティー・ラベルが含まれます。
  • VIRT_RESOURCE: ゲストのリソースの割り当てが変更された時 (例えば、ゲストからディスクが削除された時や、新しいネットワーク機器がゲストに追加された時など) に生成されます。

auvirt

auvirt ツールは libvirt によって生成されたレコードを監査ログの中から検索し、仮想マシン・セッションの一覧を表示します。また auvirt ツールは他のイベントも検索することができます (ホストのシャットダウン、ゲストに関連する AVC 拒否、QEMU プロセスに関連する例外的なイベントなど)。リスト 2 は auvirt の出力の例です。1 番目のフィールドにはゲストの名前が示されており、2 番目のフィールドにはゲストを起動したユーザーが、そして 3 番目のフィールドにはゲストが実行されていた時刻の範囲が示されています。Arch の最初の実行が失敗し、次の Arch を現在実行中であることに注意してください。

リスト 2. auvirt の出力
# auvirt
Fedora                 	root       	Tue Jan 24 16:28 - 16:28  (00:00)
Fedora                 	root       	Wed Jan 25 10:31 - 10:34  (00:02)
CentOS                 	root       	Wed Jan 25 10:34 - 13:50  (03:16)
Fedora                 	root       	Wed Jan 25 13:51 - 13:54  (00:03)
Fedora                 	root       	Wed Jan 25 13:54 - 13:55  (00:00)
Arch                   	root       	Wed Jan 25 13:55 - failed
Arch                   	root       	Wed Jan 25 13:56

以下のオプションを使用すると、ログの期間を指定して出力することができます。

  • --start <日付> [<時刻>] : 出力対象とするログの期間の開始日時を指定します。
  • --end <日付> [<時刻>] : 出力対象とするログの期間の終了日時を指定します。

<時刻> を省略したときに設定されるデフォルトの時刻は、--start の場合は「00:00:00」、--end の場合は「23:59:59」となります。

リスト 3. auvirt の出力を時刻によってフィルタリングする
# auvirt --start 01/25/2012 12:00:00 --end  01/25/2012
Fedora                  root        Wed Jan 25 13:51 - 13:54  (00:03)
Fedora                  root        Wed Jan 25 13:54 - 13:55  (00:00)
Arch                    root        Wed Jan 25 13:55 - failed
Arch                    root        Wed Jan 25 13:56

結果を単一のゲストのみに制限することも可能です。ゲストを指定するためには、ゲストの名前、またはゲストの UUID を使用します。デフォルトで、auvirt ツールは UUID を表示せずにシンプルな出力を表示しますが、--show-uuid オプションを指定することで出力に UUID を含めることができます。

リスト 4. 名前と UUID を指定することで、auvirt の出力をゲストごとにフィルタリングする (見やすいように行を折り返しています)
# auvirt --vm Fedora
Fedora                  root        Tue Jan 24 16:28 - 16:28  (00:00)
Fedora                  root        Wed Jan 25 10:31 - 10:34  (00:02)
Fedora                  root        Wed Jan 25 13:51 - 13:54  (00:03)
Fedora                  root        Wed Jan 25 13:54 - 13:55  (00:00)

# auvirt --show-uuid --uuid cabf9532-99f1-3756-930f-59e8f19d4144 
Arch                    cabf9532-99f1-3756-930f-59e8f19d4144    root
 Wed Jan 25 13:55 - failed
Arch                    cabf9532-99f1-3756-930f-59e8f19d4144    root 
 Wed Jan 25 13:56

デフォルトで、auvirt はシンプルな出力を表示します。仮想化に関連するイベントをすべて表示する場合には、--all-events オプションを指定することができます。このオプションを使用すると、auvirt はすべての開始および終了イベントのレコード、リソース割り当てのレコード、関連イベントのレコードを表示します。--all-events オプションの使い方の例をリスト 5 に示します。

リスト 5. auvirt の詳細な出力 (見やすいように編集してあります。この出力の完全版は「ダウンロード」セクションを参照してください)
# auvirt --vm CentOS --all-events
down                            root            Wed Jan 25 08:34
res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)
 cgroup          allow           major   rw      pty

[...]

avc   CentOS                    root            Wed Jan 25 10:34
 relabelto       denied          libvirtd        CentOS.img
 system_u:object_r:svirt_image_t:s0:c6,c883

[...]

res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)
 disk            start           /var/lib/libvirt/images/CentOS.img
res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)
 net             start           52:54:00:DB:AE:B4
res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)
 mem             start           1048576
res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)
 vcpu            start           1
start CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)

[...]

stop  CentOS                    root            Wed Jan 25 13:50

最初のフィールドはイベントのタイプを示し、取り得る値は、start、stop、res、avc、anom、down (ホストのシャットダウン) です。

リソース割り当てのレコードと AVC のレコードには、その詳細を示すための追加フィールドがあります。リソース割り当てのための追加フィールドは以下のとおりです。

  • リソース・タイプ: ゲストに割り当て可能なリソースのタイプ (例えば、ディスク、仮想 CPU、メモリー、ネットワーク機器など) が示されます。また、各ゲストが使用するリソースを cgroup を使用して制限するように libvirt を設定することもでき、それもリソース・イベントとしてログに記録されます。このフィールドが取り得る値は、vcpu、mem、disk、net、cgroup です。
  • 理由: どのアクションによってリソース割り当てイベントが発生したかが示されます。例えば、ゲストの起動時あるいは稼働中にそのゲストに対してディスクが割り当てられる場合、取り得る値はそれぞれ start、attach です。cgroup のイベントの場合、このフィールドはリソースが許可されているか拒否されているかを示し、取り得る値は allow または deny です。
  • リソース: ゲストに割り当てられているリソース (ディスク・リソースへのパス、メモリーのメガバイト数、ネットワーク機器の MAC アドレス、仮想 CPU の数) が示されます。cgroup のイベントの場合、この値は 3 つのコンポーネント (タイプ、ACL、リソース) で構成されます。

auvirt によってレポートされる AVC イベントは、ゲストによるアクセスが拒否されたイベントではなく、ホスト内の別プロセスによるゲストのリソースへのアクセスが拒否されたイベントです。AVC イベントのための追加フィールドは以下のとおりです。

  • 処理: 別プロセスによる実行が拒否された処理です。例としては、read、write、open、relabelto、relabelfrom などがあります。
  • 処理結果: 通常は denied です。
  • プログラム: 拒否された処理を実行しようとしたプロセスのプログラム名です。
  • 対象: 拒否された処理の対象です。例えば、ホスト内のプロセスがゲストのディスク・イメージ・ファイルにアクセスしようとし、そのアクセスが SELinux によって拒否された場合であれば、このフィールドには、そのディスク・イメージ・ファイルの名前が含まれます。
  • コンテキスト: relabelto 処理と relabelfrom 処理の場合に、関連するセキュリティー・コンテキストを示すためのフィールドとして含まれます (relabelto の場合、ターゲット・コンテキストを示し、relabelfrom の場合、ソース・コンテキストを示します)。

生データにアクセスする

auvirt の出力はユーザーにとって使いやすいものになっており、必ずしも監査ログのイベント情報がすべて含まれているわけではありません。そのため、出力には含まれていない情報が役立つような場合には、より詳細な情報を得るために生データにアクセスする必要があります。auvirt の --proof オプションを使用すると、各レコードの生成に使用した監査イベントの ID を出力に表示することができます。

リスト 6. auvirt の --proof オプション
# auvirt --vm Fedora -ts 01/23/2012 00:00 -te 01/23/2012 17:30 --proof 
Fedora                      root        Mon Jan 23 17:02 - 17:27  (00:24)
    Proof: 1327345338.087:41631, 1327346831.548:41702

リスト 6 は、レコードの作成に使用された開始イベントの ID と終了イベントの ID を auvirt によって表示する例です。この情報を ausearch ツールで使用すると、監査ログから生のレコードを抽出することができます (リスト 7)。

リスト 7. ausearch を使用して生のレコードを取得する (見やすいように行を折り返しています)
# ausearch -a 41631 --start 01/23/2012 17:02:00 --end 01/23/2012 17:27:59 
---- 
time->Mon Jan 23 17:02:18 2012 
type=VIRT_CONTROL msg=audit(1327345338.087:41631): user pid=2433 uid=0
 auid=4294967295 ses=4294967295 subj=system_u:system_r:initrc_t:s0 msg='virt=kvm 
 op=start reason=booted vm="Fedora" uuid=7bcae45c-c179-6cea-a185-c7abe50520c7: 
 exe="/usr/sbin/libvirtd" hostname=? addr=? terminal=? res=success'

この例では、指定されたシリアル番号を持つレコードのみに出力を制限する -a オプションと、auvirt のオプションと同じように機能する --start オプションと --end オプションを使用しています。生のレコードには、理由、実行可能ファイルの名前、pid などの追加情報が含まれていることに注意してください。


さらに詳しく調べてください

クラウド・コンピューティングが広く利用されるようになるにつれ、仮想化が重要な技術となりました。こうした状況下では、仮想環境で何が起きているかを明確に理解することが次第に重要になってきています。また、政府や金融などの特定の業界では、監査が必須要件の場合があります。この記事では、仮想化に関連するホストの監査イベントをフィルタリングするために使用できる監査ツールの概要について説明しました。これらのツールを使用すると、ゲストで発生するゲスト・イベントとホストで発生するゲスト・イベントの両方を考慮することができるため、ゲストに対する監査証跡をより完全に近い形で得ることができます。

参考文献

学ぶために

製品や技術を入手するために

  • 皆さんに最適な方法で IBM 製品を評価してください。製品の試用版をダウンロードする方法、オンラインで製品を試す方法、クラウド環境で製品を使う方法、あるいは SOA Sandbox で数時間を費やし、サービス指向アーキテクチャーの効率的な実装方法を学ぶ方法などがあります。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source, Cloud computing
ArticleID=823510
ArticleTitle=libvirt と Linux 監査サブシステムを使用して KVM のゲストを追跡する
publish-date=07052012