3.5 プロファイルの方法

3.1項 「プロファイルコンポーネントおよび構文」 (↑Novell AppArmor 2.0アドミニストレーションガイド)でNovell AppArmorプロファイルの構文があれば、ツールを使用せずにプロファイルを作成することができます。しかしそれには、相当の労力が必要です。このような面倒を避けるには、Novell AppArmorツールを使用してプロファイルの作成および改良を自動化します。

Novell AppArmorプロファイル作成へのアプローチには2種類あり、それらの方法をサポートするツールを含みます。

スタンドアロンプロファイル

メールクライアントのようなクライアントアプリケーションのように、ランタイムに限りのある小規模のアプリケーションをプロファイルするのに適した方法です。詳細については、3.5.1項 「スタンドアロンプロファイル」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

全体に及ぶプロファイル

大量のプログラムをすべて一度にプロファイルする場合、および数日、数週間または再起動に左右されず継続的に実行するアプリケーションをプロファイルするのに適した方法です。Webサーバ、メールサーバなどのサーバアプリケーションがこれに含まれます。詳細については、3.5.2項 「全体に及ぶプロファイル」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

Novell AppArmorツールを使用すると、自動化されたプロファイルの展開はより管理しやすくなります。

  1. どのプロファイル方法がニーズに合うかを決定してください。

  2. 静的な分析を行います。選択したプロファイル方法により、genprofまたはautodepを実行します。

  3. 動的ラーニングを行えるようにします。プロファイルされたプログラムすべてのラーニングモードを有効にします。

3.5.1 スタンドアロンプロファイル

スタンドアロンプロファイルの生成および改良は、genprofと呼ばれるプログラムにより管理されます。genprofはすべてを管理するため、この方法は簡単です。しかしgenprofはプログラムのテストランの期間中ずっど稼動する必要があるため、限りがあります(プロファイルを展開している間はマシンを再起動できません)。

プロファイルのスタンドアロン方式にgenprofを使用するには、3.5.3.4項 「genprof」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

3.5.2 全体に及ぶプロファイル

この方法は、スタンドアロンプロファイルまたはgenprofが対象とする一つまたはいくつかのプロファイルではなく、システム上のすべてのプロファイルを一度に更新するため、全体に及ぶプロファイルと呼ばれます。

全体に及ぶプロファイルを使用すると、プロファイルの構築および改良はそれほど自動化されませんが、より柔軟になります。この方法は、再起動後も動作するような長時間実行するアプリケーションや、多数のプログラムで一度にすべてプロファイルする場合に適しています。

以下のように、アプリケーションのグループへのNovell AppArmorプロファイルを構築します。

  1. アプリケーションを作成する個々のプログラムへのプロファイルを作成します。.  このアプローチはプログラム全体に及ぶものですが、Novell AppArmorではプロファイルを持ち、子が存在するプログラムのみ監視します。そのため、Novell AppArmorがプログラム全体を網羅するには、少なくともautodepで適切なプロファイルを作成する必要があります。この適切なプロファイルを作成するには、3.5.3.1項 「autodep」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

  2. 関連するプロファイルを、ラーニングモードまたはコンプレインモードにします。.  rootとしてログインしている間に、ターミナルウィンドウでcomplain /etc/apparmor.d/*と入力し、すべてのプロファイルされたプログラムのラーニングモードまたはコンプレインモードを有効にします。

    ラーニングモードのとき、アクセスの要求は、プロファイルが指示したとしてもブロックされませんそのため複数のテストを行うことができ、(ステップ 3 (↑Novell AppArmor 2.0アドミニストレーションガイド)に示す通り)、正しく実行されるようプログラムのアクセスの必要性を知ることができます。この情報により、プロファイルの作成は非常に安全であることが分かります。

    ラーニングモードまたはコンプレインモードの詳細の説明については、3.5.3.2項 「コンプレインモードまたはラーニングモード」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

  3. アプリケーションを使用する。.  アプリケーションを実行し、機能を使用します。どの程度アプリケーションを使用するかは任意ですが、アクセスする必要がある各ファイルにプログラムがアクセスする必要があります。この処理はgenprofにより監視されないため、このステップは数日または数週間続き、システムを完全に再起動する必要があるかもしれません。

  4. ログを分析する。.  全体に及ぶプロファイルでは、genprofがlogprofを実行するのではなく(スタンドアロンプロファイルのときのように)、logprofは直接実行します。以下はlogprofの一般的な形式です。

    logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]

    logprofの使用に関する詳細の情報については、3.5.3.5項 「logprof」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

  5. ステップ3-4を繰り返す。.  これを行うと最適なプロファイルを生成できます。繰り返しのアプローチにより、より小さなデータセットを捉え、ポリシーエンジンにリロードすることができます。その後繰り返すことにより、生成されるメッセージは減り、早く実行できるようになります。

  6. プロファイルを編集する。.  生成されたプロファイルを確認します。vmを使用して/etc/apparmor.d/にあるプロファイルを開き、編集することができます。vimを最大限に利用するためのヘルプは、3.5.3.8項 「apparmor.vim」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

  7. 強制」モードに戻る。.  これはシステムが、ログ情報だけでなく、プロファイルの規則を強制するモードに戻るときを指します。この処理は、手動によりプロファイルからflags=(complain)テキストを削除するか、または強制コマンドを使用して自動的に行います。強制コマンドはコンプレインコマンドと同じように機能しますが、プロファイルを強制モードに設定します。

    すべてのプロファイルを、コンプレインモードからはずして強制モードにするには、enforce /etc/apparmor.d/*と入力します。

  8. すべてのプロファイルを再びスキャンする。.  Novell AppArmorがすべてのプロファイルを再びスキャンして、カーネル内の強制モードを変更するように設定するには、/etc/init.d/apparmor restartと入力します。

3.5.3 ツールのプロファイルの概要

Novell AppArmorプロファイルユーティリティは、すべてapparmor-utilsRPMパッケージにより提供され、大抵の場合/usr/sbinに保存されます。以下のセクションでは、各ツールを紹介します。

3.5.3.1 autodep

autdepしているプログラムまたはアプリケーションへの近似プロファイルを作成します。バイナリ実行ファイルおよび解釈済みスクリプトプログラムへの近似プロファイルを生成できます。作成されたプロファイルは「近似」と呼ばれます。プログラムがNovell AppArmorにより正しく制限される必要があるプロファイルエントリを、必ずしもすべて含む必要がないためです。最小限のautodep近似プロファイルは少なくとも、ディレクティブを含む基本要素を備えています。ディレクティブは、ほとんどのプログラムで必要な、基本的なプロファイルエントリを含んでいます。特定のプログラムのために、autodepではより広範なプロファイルを生成します。プロファイルは、コマンドラインに一覧表示された実行ファイル上でldd(1)を繰り返し呼び出すことにより生成されます。

近似プロファイルを生成するには、autodepプログラムを使用します。プログラムの引数は、autodepがシェルのパス変数を検索して見つける単純なプログラム名、もしくは完全修飾パスのいずれかです。プログラム自体は任意の種類ですが(ELFバイナリ、シェルスクリプト、Perlスクリプトなど)、autodepは近似プロファイルを生成し、それは後に動的プロファイルにより改良されます。  

作成された近似プロファイルは/etc/apparmor.dディレクトリに書き込まれます。名前はNovell AppArmorプロファイルの名前付けの慣習に従い、プログラムの絶対パスから名前をとります。パスのスラッシュ(/)はピリオド(.)に置き換えます。autodepの一般的な形態は、rootとしてログインしている間に、ターミナルウィンドウで以下のコマンドを入力することです。

autodep [ -d /path/to/profiles ] [program1 program2...]

プログラム名を入力しないと、入力するよう求められます。 /path/to/profiles/etc/apparmor.dのデフォルトのロケーションを上書きします。

プロファイルを開始するには、アプリケーションの一部である主な実行可能なサービス(すでにプロファイルを持つその他のプログラムの子にはならずに開始するものすべて)それぞれに対し、プロファイルを作成します。このようなプログラムをすべて検索するのは、該当するアプリケーションによって異なります。プログラムを検索するための方法として、以下があります。

ディレクトリ

プロファイルしたいプログラムがすべて一つのディレクトリ内にあり、そのディレクトリに他のプログラムが存在しない場合、コマンドautodep /path/to/your/programs/*を使用すると、そのディレクトリ内のプログラムすべての理論上のプロファイルを作成できます。

psコマンド

アプリケーションを実行し、Linuxの標準コマンドpsを使用して、実行しているすべてのプロセスを検索します。その後これらのプログラムの場所を手動で追跡し、それぞれに対しautodepプログラムを実行する必要があります。プログラムがパス内にある場合、autodepはそれを検索します。プログラムがパス内にない場合、Linuxの標準コマンドlocateがプログラムを検索するのに役立つかもしれません。locateが機能しない場合(SUSE Linux上にデフォルトでインストールされていません)、findを使用します。-name '*foo*' -print.

3.5.3.2 コンプレインモードまたはラーニングモード

コンプレインモードまたはラーニングモードツールでは、プロファイルされたプログラムがプロファイルにより許可されていないファイルにアクセスするというような、Novell AppArmorプロファイルルールの違反を検出します。ルール違反は許可されますが、ログに記録されます。プロファイルを改良するには、コンプレインモードをオンにし、テストスイートを使用してプログラムを実行してプログラムのアクセスの必要性を表すログイベントを生成し、Novell AppArmorツールを使用してログの後処理を行い、ログイベントを拡張したプロファイルに変換します。

(コマンドラインを使用して)コンプレインモードを有効にするには、プロファイルの先頭にフラグを立て、/bin/foo/bin/foo flags=(complain)となるようにします。コンプレインモードを使用するには、ターミナルウィンドウを開き、rootユーザとして以下の行から一つを入力します。

  • 例のプログラム(program1)がパス内にある場合、以下となります。

    complain [program1 program2 ...]
  • プログラムがパス内にない場合、以下のように完全パスを指定します。

    complain /sbin/program1
    
  • プロファイルが/etc/apparmor.d内にない場合、以下をタイプしてデフォルトの場所を上書きします。

    complain /path/to/profiles/ program1
         
  • 以下のように、program1へのプロファイルを指定します。

    complain /etc/apparmor.d/sbin.program1

これらの各コマンドは、挙げられたプロファイル/プログラムのコンプレインモードを有効にします。コマンドはプログラムまたはプロファイルのどちらかを表示します。プログラム名が完全パスを含まない場合、$PATHを使用してプログラムを検索します。たとえば、complain /usr/sbin/*では/usr/sbin内のすべてのプログラムに関連するプロファイルを検索してそれらをコンプレインモードに設定し、complain /etc/apparmor.d/*では/etc/apparmor.d内のすべてのプロファイルをコンプレインモードに設定します。

3.5.3.3 強制モード

強制モードツールでは、プロファイルされたプログラムがプロファイルにより許可されていないファイルにアクセスするというような、Novell AppArmorプロファイルルールの違反を検出します。ルール違反はログに記録され、許可されません。デフォルトでは、強制モードはオンになっています。Novell AppArmorプロファイルがプロファイルされたプログラムへのアクセスを制御する設定にする場合、コンプレインモードをオンにします。強制モードはコンプレインモードに切り替わります。

(コマンドラインを使用して)強制モードを有効にするには、プロファイルの先頭にフラグを立て、/bin/foo/bin/foo flags=(enforce)となるようにします。強制モードを使用するには、ターミナルウィンドウを開き、rootユーザとして以下の行のうちの一つを入力します。

  • 例のプログラム(program1)がパス内にある場合、以下となります。

    enforce [program1 program2 ...]
  • プログラムがパス内にない場合、以下のように完全パスを指定します。

    enforce /sbin/program1 
  • プロファイルが/etc/apparmor.d内にない場合、以下をタイプしてデフォルトの場所を上書きします。

    enforce /path/to/profiles/ program1 
  • 以下のように、program1へのプロファイルを指定します。

    enforce /etc/apparmor.d/sbin.program1

これらの各コマンドは、挙げられたプロファイルおよびプログラムの強制モードを有効にします。

プログラム名またはプロファイル名を入力しないと、入力するよう求められます。/path/to/profiles/etc/apparmor.dのデフォルトのロケーションを上書きします。

引数は、プログラムの一覧またはプロファイルの一覧のいずれかです。プログラム名が完全パスを含まない場合、$PATHを強制してプログラムを検索します。たとえば、enforce /usr/sbin/*では/usr/sbin内のすべてのプログラムに関連するプロファイルを検索してそれらを強制モードに設定し、enforce /etc/apparmor.d/*では/etc/apparmor.d内のすべてのプロファイルを強制モードに設定します。

3.5.3.4 genprof

genprof(またはプロファイルの生成)はNovell AppArmorのプロファイル生成ユーティリティです。genprofは特定のプログラム上でautodepを実行し、近似プロファイルを作成し(プロファイルが存在しない場合)、プロファイルをコンプレインモードに設定し、Novell AppArmorに再ロードし、syslogを記録し、ユーザがプログラムを実行して機能を行使するよう求めます。構文は以下となります。

genprof [ -d /path/to/profiles ]  program

Apache Webサーバプログラムhttpd2-preforkのプロファイルを作成する場合、rootシェルで以下の処理を行います。

  1. rcapache2 stop」と入力します。

  2. 次に、「rcapache2 stop」と入力します。

    genprofでは以下の処理を行います。

    • シェルのパス変数に基づき、httpd2-preforkのフルパスを変換します。フルパスを指定することもできます。SUSE Linuxでは、フルパスは/usr/sbin/httpd2-preforkです。

    • httpd2-preforkのプロファイルが存在するか確認します。存在する場合、プロファイルは更新されます。存在しない場合、3.5.3項 「ツールのプロファイルの概要」 (↑Novell AppArmor 2.0アドミニストレーションガイド)で説明しているautodepプログラムを使用してプロファイルを作成します。

      [Note]注意

      名前付けの慣習があり、プログラムのフルパスをプロファイルのファイル名に関連付けます。さまざまなNovell AppArmorプロファイルツールが一貫してこの慣習に従います。慣習では、スラッシュ(/)をピリオド(.)に置き換え、/usr/sbin/httpd2-preforkのプロファイルは/etc/apparmor.d/usr.sbin.httpd2-preforkに保管されます。

    • このプログラムへのプロファイルをラーニングまたはコンプレインモードに設定し、プロファイルの違反はログに記憶される一方、処理の進行は許可されるようにします。ログイベントは以下の形式をとります。

      Oct  9 15:40:31 AppArmor:/etc/apache2/httpd.conf (httpd2-prefork(6068) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)へのアクセス許可
    • 検討するログイベントの先頭に印を付け、syslogをマークします。例:

      Sep 13 17:48:52 h2o root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. ツールが求める場合、アプリケーションを実行して他のターミナルウィンドウでプロファイルします。また、できるだけ多くのアプリケーション機能を実行して、ラーニングモードが、正しく機能するためにプログラムがアクセスを必要とするファイルおよびディレクトリをログに記録できるようにします。たとえば、ターミナルウィンドウでrcapache2 startと入力します。

  4. 以下のオプションから選択します。これらはプログラムの機能を実行した後に使用します。

    • S genprofが起動してプロファイルを再ロードするとき、マークが行われたたシステムログに対してlogprofを実行します。

      ログにシステムイベントが存在する場合、Novell AppArmorはラーニングモードログファイルを解析します。セキュリティプロファイルを生成する際に、genprofを誘導するため答える必要がある一連の質問が生成されます。

    • F ツールを終了しメインメニューに戻ります。

  5. 2種類の質問に答えます。

    これらのカテゴリはそれぞれ、リソースをプロファイルに追加するとき、またはプログラムをプロファイルに追加するときに回答する必要がある一連の質問となって現れます。以下の2つの図は、各カテゴリの例を示します。後のステップでは、これらの質問に回答する際のオプションについて記載します。

    例 3.1 ラーニングモードの例外:特定のリソースへのアクセス制御

    /var/log/messagesからログエントリを読み取ります。
    /etc/apparmor.d内のapparmorプロファイルを更新します。
    
    プロファイル:/usr/sbin/xinetd 
    Execute:/usr/sbin/vsftpd
    
    [(I)nherit] / (P)rofile / (U)nconfined / (D)eny / Abo(r)t / (F)inish) 

    実行権限を扱うのは、複雑です。以下の3種類の実行権限のうちプログラムに付与するものを決定する必要があります。

    継承 (ix)

    子は親のプロファイルを継承し、親と同じアクセス権で実行されます。このモードは、制限されたプログラムが、対象プロファイルの許可を得ずに、または現在のプロファイルの許可を失わずに、その他の制限されたプログラムを呼び出すときに有効です。 このモードは、子プログラムがヘルパーアプリケーションであるときにしばしば使用されます。例として、ページャとしてのプログラムをあまり使用しない/usr/bin/mailクライアント、またはAcrobatプログラムを使用してPDFファイルを表示するMozilla Webブラウザがあります。    

    プロファイル (px)

    子は実行されるとき、カーネルにロードされる自分自身のプロファイルを使用します。プロファイルが存在しない場合、アクセスが拒否され、子を実行する試みは失敗します。親ファイルがグローバルサービスを使用していると、非常に有効です。グローバルサービスとは、DNSルックアップまたはシステムのMTAを使用するメール送信などです。

    unconfined (ux)

    Novell AppArmorプロファイルが実行済みリソースに適用されなければ、子は完全に制限なしで実行されます。

    例 3.2 ラーニングモードの例外:エントリへの実行権限を定義する

    プロファイルに/bin/ps ixを追加する。
    
    プロファイル:/usr/sbin/xinetd
    Path:/etc/hosts.allow
    New Mode:r
    
    [1 - /etc/hosts.allow]
    
    [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish 

    上のメニューは、プロファイルしているアプリケーションがアクセスしたディレクトリパスエントリをNovell AppArmorが提示していることを表します。さらに、エントリへの実行権限を定義することが必要な場合があります。

    Novell AppArmorは1つ以上のパス名またはincludeを備えています。オプション番号をクリックして、以下のオプションから1つ以上を選択し、次のステップに進んでください。

    [Note]注意

    必ずしもこれらのオプションがすべてNovell AppArmorメニューに表示されるわけではありません。

    #include

    このセクションでは、includeファイルを参照するNovell AppArmorプロファイルについて説明します。includeファイルはプログラムへのアクセス権を取得します。includeを使用すると、その他のプログラムもまた必要とするディレクトリパスまたはファイルへのアクセス権を、プログラムに備えることができます。 includeを使用すると、プロファイルのサイズを縮小できます。提案されたときにincludeを選択するのは、良い習慣です。

    グロッビングされたバージョン

    以下のステップで説明するように、[グロッビング]をクリックしてアクセスします。詳細については、3.6項 「パス名およびグロッビング」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

    実際のパス名

    正しく実行されるよう、プログラムがアクセスを必要とする完全なパスです。

  6. パス名またはincludeを選択したら、[許可]または[拒否]をクリックして、それらをNovell AppArmorプロファイルへのエントリとして処理できます。表示されるディレクトリパスに満足しない場合は、[グロッビング]または[編集]できます。

    ラーニングモードエントリの処理およびプロファイルの構築では、以下のオプションを使用できます。

    Enterを押す

    選択したディレクトリパスにアクセスできます。

    許可

    選択したディレクトリパスエントリにアクセスできます。Novell AppArmorはファイルのアクセス権を示唆します。詳細については、3.7項 「ファイルアクセス権限モード」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

    拒否

    プログラムが指定したディレクトリパスエントリにアクセスするのを防ぎます。その後Novell AppArmorは次のイベントに進みます。

    このイベントへの独自のルールを入力するよう求められます。希望する正規表現の形式を任意に指定できます。入力した表現が実際に、最初に質問を促したイベントに沿わない場合、Novell AppArmorは表現を確認し、再入力するよう求めます。

    グロッビング

    これをクリックすると、(ワイルドカードを使用して)ディレクトリが変更され、提示されたエントリディレクトリ内のすべてのファイルが含まれます。ダブルクリックすると、表示されたファイル以下のすべてのファイルおよびサブディレクトリへのアクセスが許可されます。

    構文のグロッビングに関する情報の詳細については、3.6項 「パス名およびグロッビング」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

    拡張子を付けてグロッビング

    これをクリックすると、もとのディレクトリパスが変更される一方、ファイル名の拡張子は保持されます。たとえば、/etc/apache2/file.ext/etc/apache2/*.extとなります。ファイル名の替わりにワイルドカード(アスタリスク)を追加しています。これによりプログラムは、提案されたディレクトリ内にある、.ext拡張子で終わるすべてのファイルにアクセスできます。ダブルクリックすると、表示されたファイル以下のすべてのファイルおよびサブディレクトリへのアクセスが許可されます。

    編集

    選択した行を編集できます。新しく編集された行は、リストの最後に表示されます。

    停止

    これまでに入力した変更を排除し、すべてのプロファイルを制限なしのままにして、logprofを停止します。

    完了

    これまでに入力した変更を保存し、すべてのプロファイルを変更して、logprofを閉じます。

  7. vmを使用してプロファイルを参照および編集するには、ターミナルウィンドウでvim /etc/apparmor.d/profilenameと入力します。vimでNovell AppArmorプロファイルを編集するときに構文カラーを有効にするには、:syntax onコマンドを使用し、続いて:set syntax=apparmorコマンドを使用します。vimカラーおよび構文カラーに関する情報の詳細については、3.5.3.8項 「apparmor.vim」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

3.5.3.5 logprof

logprofは対話型のツールで、syslogエントリ内にあるラーニングモードの出力、およびコンプレインモードの出力を見直し、Novell AppArmorセキュリティプロファイル内で新しいエントリを生成するために使用されます。

logprofは実行されると、ラーニングモードまたはコンプレインモードで作成されたログファイルのスキャンを開始し、既存のプロファイルセットが使用されていない新しいセキュリティイベントがある場合、そのプロファイルを変更するよう提案します。ラーニングモードまたはコンプレインモードはプログラムの動作を追跡し、それをsyslogに入力します。logprofはこの情報を使用してプログラムの動作を観察します。

制限されたプログラムが他のプログラムを分岐および実行する場合、logprofはこれを参照して、子のプロセスを開始するときにどちらの実行モードを使用するか尋ねます。以下の実行モードは、子のプロセスを起動する際のオプションです。ixpxおよびux。子のプロセス用の別のプロファイルが存在する場合、デフォルトの選択はpxです。別のプロファイルが存在しない場合、プロファイルのデフォルトはixです。別のプロファイルがある子のプロセスには、子プロセス上で実行するautodepがあり、autodepが実行している場合、子プロセスはNovell AppArmorにロードされます。

logprofが終了すると、プロファイルは変更を伴い更新されます。AppArmorモジュールが実行しているとき、更新されたプロファイルは再ロードされ、セキュリティイベントを生成した任意のプロセスがnull-complainプロファイル内で実行していれば、これらのプロセスは正しいプロファイルの下で実行するよう設定されます。

logprofを実行するには、rootとしてログインしている間に、ターミナルウィンドウで「logprof」と入力します。以下のオプションもまた、logprofに使用できます。

logprof -d /path/to/profile/directory/

標準ディレクトリ/etc/apparmor.d/にプロファイルが配置されていない場合、そのプロファイルの場所へのフルパスを指定します。

logprof -f /path/to/logfile/

ログファイルがデフォルトのディレクトリ/var/log/messagesに配置されていない場合、そのログファイルの場所へのフルパスを指定します。

logprof -m "string marker in logfile"

logprofが参照するシステムログの最初の地点をマークします。logprofはマークが指定されるまでは、システムログ内のすべてのイベントを無視します。マークにスペースがある場合、正しく動作させるには、スペースを引用符で囲む必要があります。例:logprof -m e2ff78636296f16d0b5301209a04430d

logprofはログに記録されたイベントの処理方法について尋ね、そのログをスキャンします。各質問は、Novell AppArmorルールの番号化されたリストを表示します。リストは、リスト上にある項目の数を押して追加できます。

デフォルトでは、logprof は/etc/apparmor.d/内のプロファイルを探し、/var/log/messages内のログをスキャンします。そのため多くの場合、プロファイルを作成するには、rootとしてlogprofを実行すれば十分です。

しかし、アーカイブされたログファイルを検索する必要がある場合があります。プログラムの実行期間がログローテーションウィンドウを超える場合(ログファイルがアーカイブされ、新しいログファイルが起動するとき)などです。このような場合、zcat -f `ls -1tr /var/log/messages*` | logprof -f -を入力できます。

3.5.3.6 logprofの例 1

httpd2-preforkのファイル/etc/groupへのアクセスを、logprofが扱うときの例を以下に示します。この例では、[]はデフォルトのオプションを示します。

この例では、 /etc/groupへのアクセスは、httpd2-preforkが名前サービスにアクセスする動作の一部です。適切な応答は1です。これは定義済みのNovell AppArmorルールセットを取得します名前サービスパッケージは、#include1を選択して、DNSルックアップに関連するそれ以降の質問をすべて解決します。また、DNS設定および関連する名前サービスプロファイルパッケージの任意の変更は一度だけ行うことができ、多くのプロファイルを修正する必要がないという点で、プロファイルの不安定さを緩和します。

プロファイル:/usr/sbin/httpd2-prefork 
Path:/etc/group 
New Mode:r

[1 - #include <abstractions/nameservice>]
 2 - /etc/group
 [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

次のレスポンスのうち1つを選択します。

Enterを押す

選択したディレクトリパスにアクセスできます。

許可

選択したディレクトリパスエントリにアクセスできます。Novell AppArmorはファイルのアクセス権を示唆します。詳細については、3.7項 「ファイルアクセス権限モード」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

拒否

プログラムが指定したディレクトリパスエントリにアクセスするのを防ぎます。その後Novell AppArmorは次のイベントに進みます。

このイベントへの独自のルールを入力するよう求められます。希望する正規表現の形式を任意に指定できます。入力した表現が実際に、最初に質問を促したイベントに沿わない場合、Novell AppArmorは表現を確認し、再入力するよう求めます。

グロッビング

これをクリックすると、(ワイルドカードを使用して)ディレクトリが変更され、提示されたエントリディレクトリ内のすべてのファイルが含まれます。ダブルクリックすると、表示されたファイル以下のすべてのファイルおよびサブディレクトリへのアクセスが許可されます。

構文のグロッビングに関する情報の詳細については、3.6項 「パス名およびグロッビング」 (↑Novell AppArmor 2.0アドミニストレーションガイド)を参照してください。

拡張子を付けてグロッビング

これをクリックすると、もとのディレクトリパスが変更される一方、ファイル名の拡張子は保持されます。たとえば、/etc/apache2/file.ext/etc/apache2/*.extとなります。ファイル名の替わりにワイルドカード(アスタリスク)を追加しています。これによりプログラムは、提案されたディレクトリ内にある、.ext拡張子で終わるすべてのファイルにアクセスできます。ダブルクリックすると、表示されたファイル以下のすべてのファイルおよびサブディレクトリへのアクセスが許可されます。

編集

選択した行を編集できます。新しく編集された行は、リストの最後に表示されます。

停止

これまでに入力した変更を排除し、すべてのプロファイルを制限なしのままにして、logprofを停止します。

完了

これまでに入力した変更を保存し、すべてのプロファイルを変更して、logprofを閉じます。

3.5.3.7 logprofの例 2

profiling vsftpdからの例には、以下の質問があります。

プロファイル:/usr/sbin/xinetd 
Path:/y2k.jpg 
New Mode:r

 [1 - /y2k.jpg]

(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish 

この質問内に必要な項目が表示されます。第一に、デフォルトで/srv/ftpからのFTPファイルをSUSE Linux上のvsftpdが処理するとしても、vsftpdはツリー最上位のパスエントリを要求することに注意してください。この理由は、httpd2-preforkはchrootを使用し、chroot jail内のコードの一部に向けて、Novell AppArmorはグローバル絶対パスではなく 環境に関してファイルのアクセスを参照するためです。

必要な項目の2つ目は、FTPにディレクトリ内のすべてのJPEGファイルへのアクセスを与えたい場合です。これを行うと、[Glob w/Ext]および提示される/*.jpgのパスを使用できます。この処理を行うと、個々の.jpgファイルへのアクセスを許可するこれまでのルールすべてが失われ、.jpgファイルへのアクセスに関する将来の任意の問題を未然に阻止します。

最後に、FTPファイルへのより一般的なアクセスを与えたい場合があります。最後のエントリで[グロッビング]を選択すると、logprofは/y2k.jpgの提示されたパスを/*に置き換えます。あるいはディレクトリツリー全体へのアクセスをさらに与えたい場合があります。この場合、[新規]パスオプションを使用して/**.jpgと入力するか(ディレクトリツリー全体にあるすべての.jpgファイルへのアクセスを与えます)、または「/**」と入力します(ディレクトリツリー内のすべてのファイルへのアクセスを与えます)。

上記の説明は、読み取りアクセスを対処しています。書き込みアクセスは読み取りアクセスに似ていますが、書き込みアクセスへの正規表現の使用に関して、より保守的になることはよいポリシーです。

実行権限を扱うのは、より複雑です。以下の3種類の実行権限のうち、付与する権限を決定する必要があります。

継承 (ix)

子は親のプロファイルを継承し、親と同じアクセス権で実行されます。このモードは、制限されたプログラムが、対象プロファイルの許可を得ずに、または現在のプロファイルの許可を失わずに、その他の制限されたプログラムを呼び出すときに有効です。 このモードは、子プログラムがヘルパーアプリケーションであるときにしばしば使用されます。例として、ページャとしてのプログラムをあまり使用しない/usr/bin/mailクライアント、またはAcrobatプログラムを使用してPDFファイルを表示するMozilla Webブラウザがあります。    

プロファイル (px)

子は実行されるとき、カーネルにロードされる自分自身のプロファイルを使用します。プロファイルが存在しない場合、アクセスが拒否され、子を実行する試みは失敗します。親ファイルがグローバルサービスを使用していると、非常に有効です。グローバルサービスとは、DNSルックアップまたはシステムのMTAを使用するメール送信などです。

unconfined (ux)

Novell AppArmorプロファイルが実行済みリソースに適用されなければ、子は完全に制限なしで実行されます。

以下の例では、/usr/bin/mailメールクライアントがプロファイルされており、長いメールメッセージを「ページ」するヘルパーアプリケーションとして、/usr/bin/mail/usr/bin/lessを実行することをlogprof が検出しています。したがって、以下のプロンプトが表示されます。

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (U)nconstrained / (D)eny
[Tip]ティップ

/usr/bin/mailへの実際の実行可能ファイルは/usr/bin/nailとなりますが、これは誤字ではありません。

プログラム/usr/bin/lessは、1画面の長さより長いテキスト、および実際に/usr/bin/mailでこのプログラムを使用しているテキストをスクロールするための単純なプログラムであるように見えます。しかし、lessは実際に大規模で強力なプログラムで、tarやrpmのような、その他多くのヘルパーアプリケーションを利用します。

[Tip]ティップ

tarボールまたはRPMファイル上でlessを実行すると、これらのコンテナの一覧表が表示されます。

メールメッセージを読んでいるときに、rpmを自動的に実行することを望まないでしょう(rpmにはシステムプログラムをインストールおよび変更する権限があるため、実行すると、Microsoft* Outlookスタイルのウィルス攻撃を直接引き起こします)。そのため最善の選択は、[継承]を使用することです。この結果、/usr/bin/mailのプロファイルの下で稼動する、このコンテキストから実行されるプログラムは減少します。これは2つの結果をもたらします。

  • /usr/bin/lessへの基本的なファイルアクセスのすべてを、/usr/bin/mailのプロファイルに追加する必要があります。

  • tarおよびrpmのようなヘルパーアプリケーションを/usr/bin/mailプロファイルに追加するのを避けることができます。このコンテキストで/usr/bin/mail/usr/bin/mail/lessを実行するとき、プログラムが少なければNovell AppArmor保護なしの状態よりはるかに安全です。

その他の状況では、[プロファイル]オプションを使用する場合があります。このオプションはlogprofに2つの効果を及ぼします。

  • プロファイルに書き込まれるルールはpxです。pxは子自身のプロファイルへの移行を強制します。

  • logprofは子のプロファイルを構築し、親プロファイルをビルドしたときと同じようにビルドを開始します。その際、 子のプロファイルにより、子のプロセスへのイベントが生じるとして、logprofユーザに上記の質問を尋ねます。

最後に、[制限なし]を指定して、子のプロセスに非常に強力なアクセスを許可する場合があります。この処理では親プロファイルにuxを書き込み、子が実行されるとき、Novell AppArmorプロファイルはまったく適用されません。これは保護なしで実行することであり、不可欠なときにだけ使用してください。

3.5.3.8 apparmor.vim

色を使用して、Novell AppArmorプロファイルのさまざまな機能をvimテキストエディタが強調表示するための、構文カラーファイルです。 vimおよびvimへのNovell AppArmor構文モードを使用すると、色の強調表示でプロファイルの意味上の含みを把握できます。ターミナルウィンドウでvimrと入力して、vimを使用してプロファイルを参照および編集してください。

vimでNovell AppArmorプロファイルを編集するときに構文カラーを有効にするには、:syntax onコマンドを使用し、続いて:set syntax=apparmorコマンドを使用します。または、これらの行を~/.vimrcファイル内に配置できます。

syntax on
set modeline
set modelines=5

この機能を有効にすると、vimはプロファイルの該当する行の色を変えます。

他のNovell AppArmorルールを取得する#includeの行および#で始まるコメント

通常の読み取りアクセスの行

茶色

capability文およびコンプレインフラグ

黄色

書き込み権限を付与する行

実行権限を付与する行(ixまたはpx)

制限なしのアクセスを許可する行(ux)

赤い背景色

AppArmorモジュールに正しくロードされない構文エラー

[Note]注意

これらの行を.vimrcファイルで使用するときはセキュリティリスクがあります。これらにより、編集しているファイルに表示される構文モードをvimが信頼するためです。これらを利用して、vimで開く、何かしら危険なファイルを攻撃者が送信してくるかもしれません。

構文の強調表示に関する詳細のvimのヘルプは、apparmor.vimおよびvimのマンページ、vimエディタ内からの:help構文を使用してください。  Novell AppArmor構文は/usr/share/vim/current/syntax/apparmor.vimに格納されます。

3.5.3.9 制限なし

[制限なし]コマンドはシステム上のオープンネットワークポートを検査し、それをシステムにロードされたプロファイルセットと比較し、Novell AppArmorプロファイルがないネットワークサービスをレポートします。root権限およびNovell AppArmorプロファイルにより制限されていないことが必要です。

制限なしはrootとして実行し、ファイルシステムからプロセス実行可能リンクを取得する必要があります。このプログラムは以下の競合を引き起こす可能性があります。

  • リンクのない実行可能ファイルを誤って操作する

  • 制限なしで実行されているにもかかわらず、Novell AppArmorプロファイルがロードされる前に起動した実行可能ファイルが出力されない

  • netstat(8)とさらに詳細な検査の間で停止するプロセスを誤って操作する

[Note]注意

このプログラムでは、TCPおよびUDPのみを使用するプロセスを一覧表示します。つまり、このプログラムは科学捜査への使用には適さず、研究室でネットワーク可能なプロセスをすべてプロファイルするときの支援として提供されているだけです。

Novell AppArmorの科学およびセキュリティに関する詳細の情報は、以下の文書を参照してください。

サブドメイン:Parsimonious Server Security by Crispin Cowan, Steve Beattie, Greg Kroah-Hartman, Calton Pu, Perry Wagle, and Virgil Gligor

Novell AppArmorの初期デザインおよび導入について記載しています。2000年12月にルイジアナ州ニューオーリンズで行われたUSENIX LISA Conferenceの会報にて刊行

現在ではこの文書は古く、現在のNovell AppArmor製品とは異なる構文および機能について記載されています。この文書は技術的文書としてではなく、科学的な背景知識のために使用することを推奨します。

Defcon Capture the Flag:Defending Vulnerable Code from Intense Attack by Crispin Cowan, Seth Arnold, Steve Beattie, Chris Wright, and John Viega

深刻なセキュリティ問題を非常に短い期間内に解決するために、戦略的および計画的にNovell AppArmorを使用するのによいガイドです。2003年4月にワシントンで行われたProceedings of the DARPA Information Survivability Conference and Expo (DISCEX III)の会報にて刊行