11.3.1 実行前に行うこと
自動ルール生成では、cgmakeruleというコマンドを使用しますが、実行に先立って、
実行時のコンパートメントとケーパビリティに制限があります。
-systemコンパートメントにあること
-CAP_MAC_ADMIN、CAP_MAC_ALARMの両ケーパビリティを有していること
確認には、cgstatcapコマンドを使用します。
確認が済んだら、cgmakeruleコマンドを検索パスに含めます。
11.3.2 初期化
初期化を行うと、Compartment GuardはPass throughモードに移行し、ルールが 許可しないイベント操作を行っても、拒否されなくなります。ただし、Pass through モー ドにあっても、アプリケーションの振舞いは常に監視されています。
また、初期化時には、アプリケーションの実行ファイルとコンパートメントの対応付けを 行い、初期ルールを生成します。この対応付けは、コンパートメントの遷移が発生する 起点となる実行ファイルについてのみ行います。
例えば、Web サービスを提供する実行ファイルが/usr/sbin/httpd であったとすると、
# export PATH=$PATH:/opt/hpcg/cgmakerule/bin
# cgstatcap
Compartment: system MAC capabilities:
pie CAP̲MAC̲ADMIN pie CAP̲MAC̲SETCID ̲̲̲ ‑CAP̲MAC̲OVERRIDE̲NET pie CAP̲MAC̲OVERRIDE̲FS
̲̲̲ ‑CAP̲MAC̲IGNORE̲SIGNAL̲SHIELD ̲̲̲ ‑CAP̲MAC̲SIGNAL̲SHIELD
pie CAP̲CHOWN
実行ファイル/usr/sbin/httpdについてコンパートメントの指定を行えば、httpdプロセ スから起動される実行ファイルについて、指定する必要はありません(派生プロセスの コンパートメントを別に分けたい場合を除きます)。
以下のコマンドを実行します。
コマンド実行例)
初期化ファイルの書式は以下の通りです。
初期化ファイル例)
11.3.3 イベントの発生(1)
一旦、自動ルール生成が始まったら、アプリケーションのルール生成の元となるイベン トを発生させる必要があります。
例えば、Webサービスならば、Web サービス起動・停止スクリプトを使い、サービスを 起動及び停止させることによって、イベントを発生させます。
# cgmakerule ?init 初期化ファイル
# cgmakerule ?init httpd.init adding compartment httpd csec.pass̲through = all csec.log̲denial = none
実行ファイル(絶対パス)遷移元コンパートメント遷移先コンパートメント
/usr/sbin/httpd httpd hpcg_httpd
# /etc/rc.d/init.d/httpd start Starting httpd: [ OK ]
# /etc/rc.d/init.d/httpd stop Stopping httpd: [ OK ]
11.3.4 ルール生成の進行(1)
イベントを発生させたら、それを元にしたルール生成を試みます。
以下のコマンドを実行します。
コマンド実行例)
ここで生成されたルールは、やや精度が低く、更につづけてアプリケーションの振舞い を観察する必要があります。
11.3.5 イベントの発生(2)
サービスを起動し、ネットワークアクセスなど、さまざまなアクセスを試みて、出来るだ け多くのイベント発生を試みます。
11.3.6 ルール生成の進行(2)
一通り、イベントの発生を試みたら、再度ルール生成を試みます。
以下のコマンドを実行します。
コマンド実行例)
# cgmakerule --next
# cgmakerule –next csec.log_denial = none 431 event(s) caught 42 rule(s) generated 20 rule(s) deleted 42 rule(s) added csec.log_denial = all
# cgmakerule --next
ここで生成されたルールの精度は「11.3.4 ルール生成の進行(1)」の時点より上がっ ていますが、十分な精度が得られているかどうかを判断するため、更にアプリケーショ ンの振舞いを観察します。
11.3.7 イベントの発生(3)
「11.3.5 イベントの発生(2)」と同様にイベントを発生させます。
11.3.8 ルール生成の進行(3)
十分な精度が得られたかどうかを確認するために、ルール生成を進めます。新たなル ールが生成されなければ、収束した状態であり、ルールを確定する準備が出来たこと になります。
ルール生成を進めるには、以下のコマンドを実行します。
コマンド実行例)
11.3.9 ルールの確定
収束状態になったら、ルールを確定できます。
ルールを確定するためには、コンパートメントとそれが属するCompartment Guard 上のサービス名の対応を記述したファイルが必要です。Compartment Guard 上の
# cgmakerule –next csec.log_denial = none 19 event(s) caught 40 rule(s) generated 2 rule(s) deleted 0 rule(s) added csec.log_denial = all
# cgmakerule –next csec.log_denial = none 0 event(s) caught
No new rules are generated. Ready to commit csec.log_denial = all
# cgmakerule --next
サービス名は、通常、アプリケーションサービス名の前に”hpcg_”がつきます。例えば、
httpdサービスなら、hpcg_httpd という名前とします。
ルールを確定することで、Pass throughモードから通常のモードに移行します。すな わち、ルールで許可されないアプリケーションの振舞いは禁止されます。
このあと、(経過を観察し)問題がなければ、ルール生成は完了します。問題があれば、
「11.3.11 ルールの確定解除」の手順に従ってルールの確定を解除し、「11.3.7 イベ ントの発生(2)」の手順から繰り返します。
ルールを確定するには、以下のコマンドを実行します。
コマンド実行例)
サービス定義ファイルは、以下の書式で記述します。
サービス定義ファイル例)
11.3.10 ルール生成の完了
ルールを確定して問題がなければ、ルール生成を完了できます。ルール生成を完了し た後は、別のアプリケーションのルール生成を開始することが出来ます。
コマンド実行例)
# cgmakerule –commit サービス定義ファイル
# cgmakerule –commit httpd.serv csec.log_denial = all
csec.pass_through = none
コンパートメント名 Compartment Guard サービス名
httpd hpcg_httpd
# cgmakerule –complete
11.3.11 ルールの確定解除
ルールを確定した後、問題が発生した場合、一旦ルールの確定を解除して新しいルー ルを生成させることが出来ます。
コマンド実行例)
11.3.12 イベント発生状況の確認
処理に時間のかかるアプリケーションのイベントを発生させている時、以下のコマンド を実行して、イベント発生数を確認することが出来ます。
コマンド実行例)
11.3.13 ルール生成完了後のルール更新
自動ルール生成が完了したサービスについて、自動ルール生成によってルールの更 新を行いたいときは、ルールを自動生成過程に戻すことが出来ます。この際は、
「11.3.9 ルールの確定」で使用したコンパートメントとそれに属するCompartment
# cgmakerule –complete Rule generation summary 40 rule(s) total
1 compartment(s) total 1 service(s) total
# cgmakerule –uncomplete
# cgmakerule –uncomplete csec.log_denial = all
csec.pass_through = all
# cgmakerule –count
# cgmakerule –count 391 event(s) caught
Guard上でのサービス名の対応を記述したファイルが必要です。
以下のコマンドによって、ルールの確定状態に戻ります。
コマンド実行例)
この後、「11.3.11 ルールの確定解除」の手順に従って確定解除を行って、ルール生 成を行ってください。
このコマンドを誤って発行してしまった場合は、以下のコマンドで元に戻ります。
11.3.14 ルール生成の中止
ルール生成を途中で止めたい場合、以下のコマンドを実行して初期化前の状態に復 帰できます。
コマンド実行例)
ただし、このコマンドは、ルール確定後は実行できません。ルール確定後にルール生 成を止めたい場合は、「11.3.11 ルールの確定解除」の手順により、ルール確定を解 除してから実行してください。
# cgmakerule –count
# cgmakerule –revise httpd.serv csec.log_denial = all
csec.pass_through = none
Ready to uncommit in order to revise rules for following compartment(s).
httpd
# cgmakerule –complete
# cgmakerule –abort
# cgmakerule –abort csec.log_denial = none csec.pass_through = none