Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
コンテンツコンテンツ
セキュリティ強化ガイド
  1. 前書き
  2. 1 セキュリティと機密保持
  3. 2 コモンクライテリア (Common Criteria)
  4. I 認証
    1. 3 PAM を利用した認証
    2. 4 NIS の使用
    3. 5 YaST を利用した認証クライアントの設定
    4. 6 389 LDAP ディレクトリサービス
    5. 7 Kerberos を利用したネットワーク認証
    6. 8 Active Directory サポート
    7. 9 FreeRADIUS サーバの構築
  5. II ローカルセキュリティ
    1. 10 物理的なセキュリティ
    2. 11 seccheck を利用した自動的なセキュリティチェック
    3. 12 ソフトウエア管理
    4. 13 ファイルの管理
    5. 14 パーティションやファイルの暗号化
    6. 15 cryptctl を利用したアプリケーション向けのストレージ暗号化
    7. 16 ユーザ管理
    8. 17 Spectre/Meltdown チェッカー
    9. 18 YaST を利用したセキュリティの設定
    10. 19 PolKit による認可制御
    11. 20 Linux でのアクセス制御リスト
    12. 21 証明書ストア
    13. 22 AIDE を利用した侵入検知
  6. III ネットワークセキュリティ
    1. 23 X Window System と X 認証
    2. 24 SSH: 機密を保持するネットワーク操作
    3. 25 マスカレードとファイアウオール
    4. 26 VPN サーバの設定
    5. 27 X Window System で動作する PKI マネージャ XCA による管理
  7. IV AppArmor による権限の制限
    1. 28 AppArmor の紹介
    2. 29 入門
    3. 30 プログラムに対する予防接種
    4. 31 プロファイルのコンポーネントと文法
    5. 32 AppArmor のプロファイルリポジトリ
    6. 33 YaST を利用したプロファイルの構築と管理
    7. 34 コマンドラインからのプロファイル構築
    8. 35 チェンジハット機能による Web アプリケーションのプロファイル作成
    9. 36 pam_apparmor によるユーザの制限
    10. 37 プロファイルを作成したアプリケーションの管理
    11. 38 サポート
    12. 39 AppArmor 用語集
  8. V SELinux
    1. 40 SELinux の設定
  9. VI Linux 監査フレームワーク
    1. 41 Linux 監査システムの概要
    2. 42 Linux 監査フレームワークの設定
    3. 43 監査ルールセットの紹介
    4. 44 その他の情報源
  10. A GNU ライセンス
ナビゲーション
適用先 openSUSE Leap 15.2

34 コマンドラインからのプロファイル構築

AppArmor® には、システムのセキュリティを管理するにあたって、グラフィカルなインターフェイスだけでなく、コマンドラインインターフェイスも用意されています。 AppArmor のコマンドラインツールでは、 AppArmor の状態確認のほか、プロファイルの作成や削除、修正などを行うことができます。

ヒント
ヒント: 背景となる情報について

AppArmor のコマンドラインツールでプロファイルを管理し始める前に、まずは 第30章 「プログラムに対する予防接種第31章 「プロファイルのコンポーネントと文法 にある AppArmor の一般的な情報をお読みください。

34.1 AppArmor の状態確認

AppArmor は下記に示す 3 種類の状態のいずれかになります:

未読み込み (Unloaded)

AppArmor がカーネル内に読み込まれていない状態です。

動作中 (Running)

AppArmor がカーネル内に読み込まれていて、 AppArmor がプログラムポリシーを強制している状態です。

停止済み (Stopped)

AppArmor がカーネル内に読み込まれていますが、何もポリシーを適用していない状態です。

/sys/kernel/security/apparmor/profiles ファイルに書かれた内容を読むことで、 AppArmor の状態を検知することができます。 cat /sys/kernel/security/apparmor/profiles を実行すると、プロファイルの一覧と AppArmor の動作状態が表示されます。中身が空であった場合、 AppArmor は停止していることになります。また、ファイルが存在していない場合は、未読み込みの状態であることを示しています。

AppArmorsystemctl コマンドで管理することができます。下記のとおり入力して実行することで、それぞれの処理を実行することができます:

sudo systemctl start apparmor

その時点での AppArmor の状態に応じて動作が変わります。未読み込みの状態であった場合、 start コマンドを実行すると AppArmor を読み込んで起動し、動作中の状態にします。停止済みの状態であった場合は、通常は /etc/apparmor.d ディレクトリ内にある AppArmor プロファイルを読み込み直して、動作中の状態にします。既に AppArmor が動作中であった場合は、警告メッセージを表示して何もしません。

注記
注記: 既に動作中のプロセスについて

既に動作中のプロセスに対して AppArmor のプロファイルを適用するには、それらを再起動する必要があります。

sudo systemctl stop apparmor

AppArmor が動作中であった場合は、すべてのプロファイルをカーネルのメモリから削除して、すべてのアクセス制御を無効化したあと、停止状態に移行します。 AppArmor が既に停止していた場合も同様の処理を行おうとしますが、特に何も起こりません。

sudo systemctl reload apparmor

既に動作中で制限を設定しているプロセスに影響を与えることなく、 AppArmor のモジュールに対してプロファイルの再スキャンを求めます。 これにより、 /etc/apparmor.d ディレクトリ内にある新しいプロファイルが適用されるほか、削除されたプロファイルがあればメモリ内からも削除されます。

34.2 AppArmor プロファイルの構築

AppArmor のプロファイル定義は /etc/apparmor.d ディレクトリ内に存在していて、プロファイル自身はテキストファイルで記述されています。これらのファイルの書式について、詳しくは 第31章 「プロファイルのコンポーネントと文法 をお読みください。

/etc/apparmor.d ディレクトリ内にあるすべてのファイルはプロファイルとして扱われ、読み込まれます。ディレクトリ内でのファイル名の変更は、プロファイルを削除するにあたっては不適切です。特定のプロファイルを読み込まれないように設定したい場合は、このディレクトリからファイルを削除するか、プロファイルに対して aa-disable を実行してください。これにより、 /etc/apparmor.d/disabled/ 内にシンボリックリンクが作成されます。

プロファイルを読み書きしたい場合は、 vi のようなテキストエディタをお使いください。下記の章には、プロファイルを作成するための説明が書かれています:

AppArmor プロファイルの追加と作成

34.3項 「AppArmor プロファイルの追加と作成」 をお読みください

AppArmor プロファイルの編集

34.4項 「AppArmor プロファイルの編集」 をお読みください

AppArmor プロファイルの削除

34.6項 「AppArmor プロファイルの削除」 をお読みください。

34.3 AppArmor プロファイルの追加と作成

特定のアプリケーションに対して AppArmor のプロファイルを追加もしくは作成するにあたっては、一括プロファイル作成と単独プロファイル作成のいずれかの方式をとることができます。この 2 種類の方式について、詳しい説明は 34.7項 「2 種類のプロファイル作成方法」 をお読みください。

34.4 AppArmor プロファイルの編集

AppArmor のプロファイルを編集するには、下記の手順を実施します:

  1. root でログインしていない場合は、端末ウインドウ内で su と入力して実行します。

  2. root のパスワード入力を求められた場合は、そのパスワードを入力します。

  3. cd /etc/apparmor.d/ と入力して実行し、プロファイルのディレクトリに移動します。

  4. ls と入力して実行すると、現在インストールされているすべてのプロファイルの一覧を表示することができます。

  5. 編集したいプロファイルをテキストエディタ (例: vim) で開きます。

  6. 必要な変更を行ったあと、ファイルを保存して終了します。

  7. 端末ウインドウ内で systemctl reload apparmor と入力して実行し、 AppArmor を再起動します。

34.5 未知の AppArmor プロファイルの読み込み解除

警告
警告: 読み込み解除の危険性について

aa-remove-unknown を実行すると、 /etc/apparmor.d ディレクトリ内に存在しないすべてのプロファイル (たとえば自動生成された LXD プロファイルなど) の読み込みが解除されます。これにより、システムのセキュリティが危険にさらされる場合があります。読み込みを解除する前に -n パラメータを付けて実行し、どのプロファイルの読み込みが解除されるのかを調べてから実行しておくことをお勧めします。

/etc/apparmor.d/ ディレクトリ内に存在していないすべての AppArmor プロファイルについて、それらの読み込みを解除したい場合は、下記のように入力して実行します:

tux > sudo aa-remove-unknown

読み込みが解除されるプロファイルの一覧を表示したい場合は、下記のようにします:

tux > sudo aa-remove-unknown -n

34.6 AppArmor プロファイルの削除

AppArmor のプロファイルを削除するには、下記の手順を実施します:

  1. まずはカーネルから AppArmor の定義を削除します:

    tux > sudo apparmor_parser -R /etc/apparmor.d/プロファイルのファイル名
  2. プロファイルのファイルそのものを削除します:

    tux > sudo rm /etc/apparmor.d/プロファイルのファイル名
        tux > sudo rm /var/lib/apparmor/cache/プロファイルのファイル名

34.7 2 種類のプロファイル作成方法

第31章 「プロファイルのコンポーネントと文法AppArmor のプロファイル文法に関する説明があるとおり、 AppArmor ツールを使用せずにプロファイルを作成することもできます。しかしながら、何もない状態からプロファイルを作成するのは手間がかかります。そのため、 AppArmor の各種ツールを利用して、プロファイルを自動作成したり、自動的に調整したりする機能を利用することをお勧めします。

AppArmor のプロファイルを作成するにあたっては、下記に示す 2 種類の方法があります。いずれの方法であっても、ツールを利用して行うことができます。

単独プロファイル作成

電子メールクライアントなど、アプリケーション自体が比較的小規模で、かつ必要に応じて起動したり終了したりするようなものにお勧めです。詳しくは 34.7.1項 「単独プロファイル作成」 をお読みください。

一括プロファイル作成

多数のプログラムに対してプロファイルを一括作成するような場合に適切であるほか、 Web サーバやメールサーバなどのように、常に動作し続け、システムを再起動した後にも、すぐに動作させる必要があるもののような場合にも適切です。詳しくは 34.7.2項 「一括プロファイル作成」 をお読みください。

プロファイルを自動生成することで、 AppArmor のツールによる管理がよりやりやすくなります:

  1. まずは要件にあったプロファイル方法を選びます。

  2. 静的な分析を行います。選択した方法にあわせて、 aa-genprof もしくは aa-autodep のいずれかを実行します。

  3. 動的な学習を有効化します。プロファイルを作成したすべてのプログラムに対して、学習モードを有効化します。

34.7.1 単独プロファイル作成

単独でプロファイルを作成して改善していく場合は、 aa-genprof と呼ばれるプログラムを利用します。この方法では、 aa-genprof が様々な作業を代行してもらえるため、作業が簡単になる一方、プログラムを起動してから終了するまでの間、 aa-genprof を実行し続けなければならない、という制限が発生します (つまり、プロファイルの作成中はマシンの再起動を行うこともできなくなります) 。

単独プロファイル作成で aa-genprof を使用する場合は、 34.7.3.8項 「aa-genprof: プロファイルの生成」 をお読みください。

34.7.2 一括プロファイル作成

この方法は、 aa-genprof で行う単独 (もしくは少数) のプロファイル作成とは異なり、システム内にある複数のプロファイルを一括で更新することから、 一括プロファイル作成 と呼ばれています。一括プロファイル作成ではプロファイルの構築と改善を自動化することができず、手作業が発生しますが、より柔軟に対応することができます。この方法は、システムが再起動しても動作し続ける長期稼働型のアプリケーションや、多数のプログラムに対して一括でプロファイルを作成したい場合に便利です。

一括で AppArmor のプロファイルを作成するには、下記の手順で行います:

  1. まずはお使いのアプリケーションの各プログラムに対して、プロファイルを作成します。

    この方式を使用する際には、あらかじめプログラムに対する AppArmor のプロファイルを作成しておかなければなりません。これは、 AppArmor がプロファイルのあるプログラムのみを監視するためです。これに対応させるために、 aa-autodep を利用して、プログラムに対する近似プロファイルを作成してください。詳しくは 34.7.3.1項 「aa-autodep: 近似プロファイルの作成」 をお読みください。

  2. 対応するプロファイルを学習 (不平) モードに設定します。

    プロファイルの存在するすべてのプログラムに対して、プロファイルを学習 (不平) モードに切り替えたい場合は、 端末内で root になり、 下記のように実行します:

    tux > sudo aa-complain /etc/apparmor.d/*

    この機能は、 YaST のプロファイルモジュールでも設定することができます。詳しくは 33.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。

    学習モードの場合、プロファイル側で明示的に禁止されている場合であっても、実際にアクセス制限が発動されることはありません。これにより、ステップ 3 で示しているとおり、様々なテストを実施して、プログラムにとって必要なアクセス権を正しく検出することができるようになります。また、この情報を利用することで、プロファイル内でどこまでの許可を与えればよいのかがわかるようにもなります。

    学習 (不平) モードへの切り替えについて、詳しくは 34.7.3.2項 「aa-complain: 不平モード (学習モード) への突入」 をお読みください。

  3. 対象のアプリケーションを様々にテストします。

    アプリケーション内にある様々な機能を動作させて試します。どれだけプログラムを試せばよいのかはプログラム次第ですが、少なくともプログラム側からアクセスする必要のあるファイルに対して、一通りアクセスするようにしてください。なお、処理は aa-genprof の監視下で動作しているわけではありませんので、何日も何週間も動作させたままでかまいませんし、システムを再起動してもかまいません。

  4. ログを分析します。

    一括プロファイル作成では、単独プロファイル時のように aa-genprof から aa-logprof を実行するのではなく、 aa-logprof を直接実行します。 aa-logprof は下記のように入力して実行します:

    tux > sudo aa-logprof [ -d プロファイルのパス ] [ -f /ログファイルのパス ]

    aa-logprof の使用方法について、詳しくは 34.7.3.9項 「aa-logprof: システムログのスキャン」 をお読みください。

  5. ステップ 3ステップ 4 を繰り返し実施します。

    これにより、最適なプロファイルを作成することができるようになります。このように繰り返し実施することで、分析対象のログファイルを小さくすることができますので、より素早くプロファイルに反映できるようになります。また、繰り返すたびにログの出力も減るはずですので、処理も高速化されます。

  6. プロファイルを編集します。

    生成されたプロファイルの内容を確認します。具体的には、テキストエディタなどで /etc/apparmor.d/ ディレクトリ内のファイルを開いて、必要であれば編集を行います。

  7. 強制モードに戻します。

    強制モードに戻すことで、プロファイルのルールに対して、その違反を記録するだけでなく、違反を明示的に禁止することができるようになります。この作業は、プロファイルをテキストエディタなどで開いて、 flags=(complain) と書かれた箇所を削除して保存するか、もしくは aa-enforce コマンドを使用することで行うことができます (aa-enforce コマンドは、aa-complain と同じように使用することができるもので、強制モードに移行させることができます) 。また、この作業は YaST のプロファイルモジュールでも実施することができます。詳しくは 33.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。

    すべてのプロファイルを不平モードから強制モードに移行させたい場合は、 aa-enforce /etc/apparmor.d/* と入力して実行します。

  8. 再度すべてのプロファイルをスキャンします。

    AppArmor に対してすべてのプロファイルを再スキャンさせ、カーネル内を強制モードに変更するには、 systemctl reload apparmor と入力して実行します。

34.7.3 プロファイル作成ツールの概要

AppArmor におけるプロファイルユーティリティは、 apparmor-utils パッケージ内にすべて含まれていて、 /usr/sbin 内にインストールされます。それぞれのツールの概要は下記のとおりです。

34.7.3.1 aa-autodep: 近似プロファイルの作成

このプログラムは、選択したプログラムやアプリケーションに対応する、近似プロファイルを作成するツールです。バイナリ実行ファイルやインタプリタ型のスクリプトプログラムに対応しています。生成されたプロファイルは、 AppArmor で適切に制限を設定するにあたって、完全なものではないことから、 近似 プロファイルと呼ばれます。 aa-autodep で生成される近似プロファイルには、ほとんどのプログラムで必要な項目を列挙した、基本的な include ディレクティブのみが含まれる最小限のプロファイルとなります。また、特定の種類のプログラムであれば、 aa-autodep はさらに詳しいプロファイルを生成します。コマンドラインで指定したプログラムに対して ldd(1) を再帰的に呼び出し、プロファイルを生成しようとします。

近似プロファイルを生成するには aa-autodep プログラムを使用します。パラメータとしてプログラム名を単純に指定した場合は、 aa-autodep がシェルの PATH 環境変数を展開してプログラムを探します。フルパスを指定してもかまいません。また、プログラムそれ自身は任意のものでかまいません (ELF バイナリであっても、シェルや Perl のスクリプトであってもかまいません) 。 aa-autodep は、後続の動的プロファイル作成で改善を行うための、ベースとなる近似プロファイルを生成します。

生成された近似プロファイルは、 /etc/apparmor.d ディレクトリ内に、 AppArmor のプロファイル命名規約に従って出力されます。具体的には、スラッシュ ( / ) をピリオド ( . ) に置き換えたファイル名になります。 aa-autodep のコマンドの書式は下記のとおりです:

tux > sudo aa-autodep [ -d プロファイルのパス ] [プログラム_1 プログラム_2...]

プログラム名を入力しない場合は、入力を求められます。また、 プロファイルのパス を指定した場合は、既定のプロファイル保存先である /etc/apparmor.d を変更し、既定の場所以外にプロファイルを保存することができます。

プロファイル作成を開始するにあたっては、まずお使いのアプリケーションを構成するメインの実行ファイル (プロファイルが存在しておらず、他のプログラムから呼び出されることのない実行ファイル) に対して、プロファイルを作成しなければなりません。このような条件に該当するプログラムを、お使いのアプリケーション内ですべて見つけてから、プロファイルを作成してください。このようなプログラムを見つける方法には、下記のような方法があります:

ディレクトリ

プロファイルを作成すべきプログラムが特定の 1 つのディレクトリ内にのみ存在し、それ以外には存在しない場合であれば、 aa-autodep プログラムのパス/* のように実行することで、そのディレクトリ内にあるすべてのプログラムに対して、近似プロファイルを作成することができます。

pstree -p

アプリケーションを起動したあと、標準的な Linux コマンドである pstree を使用することで、動作中のすべてのプロセスを取得することができます。あとはプログラムがどこに配置されているのかを突き止めて、それぞれに対して aa-autodep を実行します。なお、プログラムがお使いのパス内に存在している状態であれば、 aa-autodep を実行するだけで、実際のコマンドパスを自動的に検索させることができます。パス内に存在していない場合は、標準的な Linux コマンドである find を使用して、プログラムパスを探してください。たとえば find / -name ' アプリケーション名 ' -print のように実行することで、アプリケーションのパスを取得することができます。また、必要であればワイルドカードを使用してもかまいません。

34.7.3.2 aa-complain: 不平モード (学習モード) への突入

不平モード (学習モード) ツール ( aa-complain ) は、指定した AppArmor のプロファイルルールのモードを変更するツールです。不平モードに設定したプロファイルに対しては、ルールへの違反が許容されるものの、ログに記録されるようになります。これはプロファイルを改善していくための仕組みで、いったん不平モードを設定した後、さまざまなプログラム処理を実施して、プログラムのアクセス要件をログに記録させて、そのログを元にプロファイルを改善する流れを取ります。

コマンドラインから不平モードを手作業で有効化すると、プロファイルの冒頭にフラグを設定し、 /bin/foo のような項目が /bin/foo flags=(complain) のようになります。不平モードを使用するには、 端末ウインドウを開いて、 root で下記のように入力して実行します:

  • プログラム ( プログラム_1 ) がパス内に存在する場合は、下記のように実行します:

    tux > sudo aa-complain [プログラム_1 プログラム_2 ...]
  • プログラムがパス内に存在しない場合は、下記のようにフルパスで指定します:

    tux > sudo aa-complain /sbin/プログラム_1
  • また、プロファイルが /etc/apparmor.d 内に存在しない場合は、下記のように配置場所を指定します:

    tux > sudo aa-complain プロファイルのパスプログラム_1
  • /sbin/program1 のプロファイルを指定したい場合は、下記のように入力して実行します:

    tux > sudo aa-complain /etc/apparmor.d/sbin.プログラム_1

上述のコマンドはいずれも、指定したプロファイルやプログラムを不平モードに切り替える処理を行います。プログラムの指定の際、これをフルパスで指定しないと、 aa-complain$PATH 内を検索して、プログラムの場所を判断します。たとえば aa-complain /usr/sbin/* のように入力して実行すると、 /usr/sbin 内に存在するすべてのプログラムに対して、対応するプロファイルを検索し、それらすべてを不平モードに設定します。また、 aa-complain /etc/apparmor.d/* のように入力して実行すると、 /etc/apparmor.d 内にあるすべてのプロファイルを不平モードに切り替えます。

ヒント
ヒント: YaST を利用したプロファイルの切り替えについて

YaST には、不平モードと強制モードを切り替えることのできるグラフィカルなフロントエンドが用意されています。詳しくは 33.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。

34.7.3.3 aa-decode: AppArmor ログファイル内にある 16 進数にエンコードされた文字列のデコード

aa-decode は、 AppArmor のログ出力内に存在する 16 進数で書かれた文字列をデコードすることができます。標準入力から監査ログを入力させることもできますし、 AppArmor のログ内にある 16 進数の文字列をデコードして、標準出力に書き出すこともできます。

34.7.3.4 aa-disable: AppArmor セキュリティプロファイルの無効化

aa-disable コマンドは、 1 つもしくは複数の AppArmor プロファイルの強制モードを無効化するために使用します。このコマンドを実行すると、カーネルからプロファイルの読み込みを解除して開放し、 AppArmor の起動時にもプロファイルが読み込まれないようにします。この動作を変更したい場合は、 aa-enforce もしくは aa-complain の各ツールをお使いください。

34.7.3.5 aa-easyprof: 簡易プロファイル生成

aa-easyprofAppArmor のプロファイル生成に対して、簡易的なインターフェイスを提供する仕組みです。 aa-easyprof ではテンプレート (雛形) やグループ化の仕組みを使用して、アプリケーションのプロファイルを素早く作成することができます。 aa-easyprof はプロファイル生成の支援を行いますが、これは使用するテンプレートの品質とプロファイルのグループ、および抽象に依存しています。また、このツールは手作業でプロファイルを作成する場合や、 aa-genprofaa-logprof を利用してプロファイルを作成する場合に比べると、制限の緩いプロファイルを作成することになります。

詳しくは aa-easyprof (8) のマニュアルページをお読みください。

34.7.3.6 aa-enforce: 強制モードへの突入

強制モードでは、プロファイルで許可されていないファイルへのアクセスが禁止されるなど、 AppArmor のプロファイルルールへの違反を検知することができます。このモードでは、違反はログに記録されるだけでなく、許可もされません。そのため、普段使用する場合は強制モードの適用を推奨します。違反を記録するのみで禁止したくない場合は、不平モードに設定してください。

コマンドラインから強制モードを手作業で設定すると、プロファイルの冒頭にあるフラグを削除し、 /bin/foo flags=(complain) のような項目が /bin/foo のようになります。強制モードを使用するには、端末ウインドウを開いて、 root で下記のいずれかのように入力して実行します:

  • プログラム ( プログラム_1 ) がパス内に存在する場合は、下記のように実行します:

    tux > sudo aa-enforce [プログラム_1 プログラム_2 ...]
  • プログラムがパス内に存在しない場合は、下記のようにフルパスで指定します:

    tux > sudo aa-enforce /sbin/プログラム_1
  • また、プロファイルが /etc/apparmor.d 内に存在しない場合は、下記のように配置場所を指定します:

    tux > sudo aa-enforce -d プロファイルのパス     プログラム_1
  • /sbin/program1 のプロファイルを指定したい場合は、下記のように入力して実行します:

    tux > sudo aa-enforce /etc/apparmor.d/sbin.プログラム_1

上述のコマンドはいずれも、指定したプロファイルやプログラムを強制モードに切り替える処理を行います。

プログラム名やプロファイル名を入力しない場合は、入力を求められます。また、 プロファイルのパス を指定した場合は、既定のプロファイル保存先である /etc/apparmor.d を変更し、既定の場所以外にあるプロファイルを使用することができます。

パラメータには、複数のプログラムやプロファイルを指定することができます。また、プログラムの指定の際、これをフルパスで指定しないと、 aa-complain$PATH 内を検索して、プログラムの場所を判断します。

ヒント
ヒント: YaST を利用したプロファイルの切り替えについて

YaST には、不平モードと強制モードを切り替えることのできるグラフィカルなフロントエンドが用意されています。詳しくは 33.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。

34.7.3.7 aa-exec: 指定したプロファイルによるプログラムの制限

aa-exec は指定したプロファイルやプロファイルネームスペースで、特定のプログラムを起動するためのツールです。プロファイルとネームスペースの両方を指定した場合、プログラムは新しいネームスペース内のプロファイルで制限を受けることになります。ネームスペースのみを指定した場合は、現在の制限内にあるプロファイル名を使用します。いずれも指定しない場合は、コマンドは標準的なプロファイル適用をそのまま使用します (つまり、 aa-exec コマンドを使用せずに起動した場合と同じ動作になります) 。

子マントのオプションについて、詳しくは man 8 aa-exec にあるマニュアルページをお読みください。

34.7.3.8 aa-genprof: プロファイルの生成

aa-genprofAppArmor におけるプロファイル生成ユーティリティです。プロファイルが存在しない場合は、指定したプログラムに対して aa-autodep を実行して近似プロファイルを作成したあと、プロファイルを不平モードに設定して AppArmor を再読み込みさせ、ログに印を付けます。その後、ユーザに対してプログラムを実行し、その機能を一通り試すように依頼します。コマンドの書式は下記のとおりです:

tux > sudo aa-genprof [ -d プロファイルのパス ]  プログラム

Apache Web サーバである httpd2-prefork に対してプロファイルを作成したい場合は、 root で下記のように実行します:

  1. systemctl stop apache2 と入力して実行します。

  2. 続けて aa-genprof httpd2-prefork と入力して実行します。

    すると、 aa-genprof は下記のような処理を行います:

    1. お使いのシェルの PATH 環境変数を利用して httpd2-prefork のフルパスを取得します。もちろん最初からフルパスで指定してもかまいません。 openSUSE Leap では、このプログラムのフルパスは /usr/sbin/httpd2-prefork であるはずです。

    2. まずは httpd-prefork に対して、既存のプロファイルが存在していないかどうかを確認します。プロファイルが存在した場合はそれを更新しようとします。存在しない場合は、 34.7.3項 「プロファイル作成ツールの概要」 で説明している aa-autodep を使用して、プロファイルを作成します。

    3. 指定したプログラムに対するプロファイルを学習 (不平) モードに設定し、プロファイルへの違反を記録するだけで、禁止を行わないようにします。違反の記録は、たとえば下記のようになります (/var/log/audit/audit.log 内に記録されます):

      type=APPARMOR_ALLOWED msg=audit(1189682639.184:20816): \
      apparmor="DENIED" operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0

      監査デーモンを動作させていない場合、 AppArmor のイベントは systemd ジャーナルに直接記録されます (詳しくは 第11章 「journalctl : systemd ジャーナルへの問い合わせコマンド をお読みください):

      Sep 13 13:20:30 K23 kernel: audit(1189682430.672:20810): \
      apparmor="DENIED" operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0

      dmesg コマンドを利用して表示することもできます:

      audit(1189682430.672:20810): apparmor="DENIED" \
      operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0
    4. ログ内に印を付けて、作業の開始位置判断とします。たとえば下記のように出力されます:

      Sep 13 17:48:52 figwit root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. ツール側から問い合わせメッセージが表示されたら、もう 1 つの端末ウインドウを開いてプロファイルを作成するアプリケーションを起動し、可能な限り様々な処理を実施させます。これにより、学習モード下でプログラムが必要とする様々なファイルやディレクトリなどにアクセスすることになります。この例では、たとえば新しい端末ウインドウを開いて、 systemctl start apache2 と入力し実行します。

  4. 様々なプログラムの機能を利用したあとは、 aa-genprof の端末ウインドウ内で下記のような入力を行うことができます:

    • S と入力すると、 aa-genprof は先ほど印を付けた箇所以降のシステムログを検索する処理を実施します。ログ内に何らかのシステムイベントが見つかった場合、 AppArmor はそれらを読み込んで判断します。これにより、セキュリティプロファイルを生成するにあたっての様々な質問を生成します。

    • F と入力すると、ツールを終了することができます。

    注記
    注記

    ハット (hat) を追加するように求められた場合は、 第35章 「チェンジハット機能による Web アプリケーションのプロファイル作成 をお読みください。

  5. あとは下記に示す 2 種類の質問に答えていきます:

    いずれの分類の質問であっても、プロファイル内にリソースやプログラムを追加するために回答しなければならない質問になります。 例34.1「学習モードの例外: 特定のリソースへのアクセス制御」例34.2「学習モードの例外: 項目に対する許可の設定」 には、それぞれ質問の例が示されています。続く手順では、それぞれの質問に対する回答方法を示しています。

    • 実行権限の取り扱いは複雑です。それぞれ表示された内容に対して、どのような実行権限を与えるのかを決定しなければなりません:

      例 34.1: 学習モードの例外: 特定のリソースへのアクセス制御
      Reading log entries from /var/log/audit/audit.log.
      Updating AppArmor profiles in /etc/apparmor.d.
      
      Profile:  /usr/sbin/cupsd
      Program:  cupsd
      Execute:  /usr/lib/cups/daemon/cups-lpd
      Severity: unknown
      
      (I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny / Abo(r)t / (F)inish
      Inherit (ix)

      子プロセスに対して親と同じプロファイルを適用し、親と同じアクセス権限を継承するように指定します。このモードは、制限を受けているプログラムから他のプログラムを呼び出す際、新しい許可を設定したくない場合や、既にある許可を失いたくない場合に指定します。このモードは、たとえば /usr/bin/mail のメールクライアントが less をページャとして使用する場合など、 ヘルパーアプリケーション のようなプログラムを呼び出す際にしばしば用いられます。

      Profile (px/Px)

      子プロセスに対して、カーネル内に読み込まなければならない独自のプロファイルを適用するように指定します。プロファイルが存在しない場合、子プロセスの実行はアクセス拒否として失敗します。これは、親プログラムから DNS の参照やお使いのシステムの MTA を介したメール送信など、グローバルサービスを実行するような場合に有用です。

      profile with clean exec (クリーン実行付きプロファイル) (Px) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。

      Child (cx/Cx)

      サブプロファイルへの遷移を設定します。 px/Px での遷移と同様ですが、子プロファイルへの遷移という点が異なります。

      profile with clean exec (クリーン実行付きプロファイル) (Cx) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。

      Unconfined (ux/Ux)

      子プロセスに対して AppArmor のプロファイルを一切適用せず、リソースに対する制限を一切行わないようにします。

      unconfined with clean exec (クリーン実行付き無制限) (Ux) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。ただし、制限を取り外してしまうことはセキュリティ面での脆弱性を生む行為であり、危険であることに注意してください。そのため、それ以外の選択肢ではどうしても解決できない場合にのみ、指定してください。

      mmap (m)

      この許可を設定すると、そのプロファイルが適用されるプログラムに対して、 mmap システムコールの際に PROT_EXEC フラグを設定できるようになります。これにより、データとして割り当てたメモリを実行することができるようになります。プロファイル生成時に求められた場合にのみ、この許可を設定してください。

      Deny

      プロファイルに対して deny ルールを追加して、指定したディレクトリパス項目に対するアクセスを明示的に禁止するようにします。 AppArmor はそのまま次のイベントの処理に移ります。

      Abort

      aa-logprof を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。

      Finish

      aa-logprof を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。

    • 例34.2「学習モードの例外: 項目に対する許可の設定」 には、 AppArmor がグロブパターン /var/run/nscd/* を利用して読み込みアクセスを許可し、一般的な Apache 関連のアクセスルールをカバーするため、抽象を使用しようとしている様子を示しています。

      例 34.2: 学習モードの例外: 項目に対する許可の設定
      Profile:  /usr/sbin/httpd2-prefork
      Path:     /var/run/nscd/dbSz9CTr
      Mode:     r
      Severity: 3
      
        1 - /var/run/nscd/dbSz9CTr
       [2 - /var/run/nscd/*]
      
      (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
      Adding /var/run/nscd/* r to profile.
      
      Profile:  /usr/sbin/httpd2-prefork
      Path:     /proc/11769/attr/current
      Mode:     w
      Severity: 9
      
       [1 - #include <abstractions/apache2-common>]
        2 - /proc/11769/attr/current
        3 - /proc/*/attr/current
      
      (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
      Adding #include <abstractions/apache2-common> to profile.

      AppArmor には様々なパスやインクルードが用意されています。選択肢の番号を入力することで必要なオプションを選択し、次のステップに進むことができます。

      注記
      注記

      AppArmor のメニューでは、一部の選択肢のみが表示される場合もあります。

      #include

      これは AppArmor プロファイル内の記述で、他のファイルを参照するように設定するためのディレクティブです。これにより、他のファイル内に書かれているアクセス権を振り込むことができるようになります。また、 include を使用することで、複数のプログラムでアクセス許可の設定を共有することもできます。この仕組みにより、プロファイルのサイズを小さくすることにも繋がります。 include を使用するように提案された場合は、提案を受け入れるのがよいでしょう。

      グロブ版

      次の手順で説明しているように、 Glob を選択することでアクセスすることができます。グロブの書式に関する詳細は、 31.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。

      実際のパス

      プログラムが必要とするパスを直接指定して、正しく動作するように設定します。

      パスまたはインクルードの設定を行った後は、 Allow (許可) または Deny (拒否) を選択して、対応する項目を AppArmor のプロファイルに追加します。表示されたディレクトリパスの項目で問題があるとお考えの場合は、 Glob (グロブ) を選択することもできます。

      学習モードで生成された項目を処理し、プロファイルにする方法には、下記のものがあります:

      単に Enter を押す

      選択したディレクトリパスに対して、アクセスを許可します。

      Allow

      選択したディレクトリパスの項目に対して、アクセスを許可します。 AppArmor では、アクセスモードの提案も行います。詳しくは 31.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。

      Deny

      指定したディレクトリパスの項目に対して、プログラムからのアクセスを拒否します。 AppArmor はそのまま次のイベントの処理に移ります。

      New

      このイベントに対応するルールを独自に作成します。ここでは、正規表現による指定にも対応しています。表現の指定がイベントの要件と合致しない場合、 AppArmor は確認メッセージを表示して再入力を求めます。

      Glob

      ワイルドカードを利用して幅広くマッチするルールを作成します。提示されたパスのうちのいずれかを選択するには、パスの前に示されている数字を入力して進めます。

      グロブの書式に関する詳細は、 31.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。

      Glob w/Ext

      元のディレクトリパス情報を変更して、ファイル名の拡張子だけをマッチングルールとして残すグロブを生成します。たとえば /etc/apache2/file.ext というファイルへのアクセスであった場合、ファイル名の部分だけをワイルドカードにして /etc/apache2/*.ext のような形式に変更します。これにより、特定のディレクトリ内にある同じ拡張子 (.ext) のファイルすべてに対して、許可するルールを作成することができます。

      Abort

      aa-logprof を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。

      Finish

      aa-logprof を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。

  6. vi を利用してプロファイルの表示や編集を行いたい場合は、端末ウインドウ内で vi /etc/apparmor.d/ プロファイル名 のように入力して実行してください。 vim 内で AppArmor のプロファイルを編集するにあたり、文法ハイライト機能を有効化したい場合は、 :syntax on と入力してから :set syntax=apparmor と入力します。 vim および文法ハイライト機能に関する詳細については、 34.7.3.14項 「apparmor.vim」 をお読みください。

  7. systemctl reload apparmor コマンドを実行し、 AppArmor を再起動して、プロファイルセットを再読み込みします。これにより、新しく作成したプロファイルが読み込まれるようになります。

グラフィカルなフロントエンドを利用して AppArmor のプロファイルを作成する場合と同様に、 YaST のプロファイル追加ウイザードや aa-genprof でも、 /usr/share/apparmor/extra-profiles 内にあるローカルプロファイルを使用することができます。

ローカルリポジトリにあるプロファイルを使用するには、下記のようにして行います:

  1. 上述の手順で aa-genprof を起動します。

    aa-genprof が無効化されているローカルプロファイルを検出すると、端末ウインドウ内に下記のような内容が表示されます:

    Profile: /usr/bin/opera
    
     [1 - Inactive local profile for /usr/bin/opera]
    
    [(V)iew Profile] / (U)se Profile / (C)reate New Profile / Abo(r)t / (F)inish
  2. 提示されたプロファイルを使用するには U ( Use Profile ) と入力し、上述のプロファイル生成手順に従って続けます。

    有効化する前にプロファイルの内容を確認したい場合は、 V ( View Profile ) と入力します。

    既存のプロファイルを無視したい場合は、 C ( Create New Profile ) と入力して、上述のプロファイル生成手順で、何もない状態からプロファイルを作成していきます。

  3. すべての作業が終わったら、 F ( Finish ) と入力すると、変更点を保存して終了することができます。

34.7.3.9 aa-logprof: システムログのスキャン

aa-logprof は不平モードや強制モードで記録され、 /var/log/audit/audit.log 内もしくは systemd ジャーナル (詳しくは 第11章 「journalctl : systemd ジャーナルへの問い合わせコマンド を参照) 内に直接保存されているログを処理して、 AppArmor のセキュリティプロファイル内の新しい項目を生成することができる対話型ツールです。

aa-logprof を実行すると、まずは不平モードや強制モードで記録されたログファイルを読み込んで処理し、既存のプロファイルセット内でカバーされていない新しいセキュリティイベントが見つかった場合に、既存のプロファイルを変更するための確認メッセージを表示します。 aa-logprof では、ログファイル内の情報からプログラムの挙動を確認します。

制限を受けているプログラムが fork() したり他のプログラムを起動したりした場合、 aa-logprof はそれを検出すると、 fork() したプログラムや他のプログラムに対して適用すべき実行モードを尋ねます。実行モードは ix , px , Px , ux , Ux , cx , Cx のいずれか、もしくは名前付きプロファイルで、指定した実行モードで子プロセスを開始することになります。子プロセス向けのプロファイルが個別に存在する場合は、既定の選択肢は Px になります。逆に、プロファイルが存在しない場合は ix になります。個別のプロファイルが存在する子プロセスに対しては、 aa-autodep が実行され、動作中であれば AppArmor 内に読み込まれるようになります。

aa-logprof が終了すると、プロファイルは変更した内容に応じて更新されます。 AppArmor が有効化されていれば、更新されたプロファイルが読み込まれ。セキュリティイベントを生成したプロセスが現在も null-XXXX プロファイル (不平モードで作成される一時的なプロファイル) で動作していれば、対応する適切なプロファイルが適用されるようになります。

aa-logprof を実行するには、 root でログインしている状態で、端末ウインドウ内で aa-logprof と入力します。また、 aa-logprof では下記のようなオプションを指定することができます:

aa-logprof -d プロファイルディレクトリのパス

プロファイルが標準ディレクトリ /etc/apparmor.d/ 以外の場所にある場合は、上記のようにしてフルパスを指定します。

aa-logprof -f ログファイルのパス

ログファイルが標準ディレクトリパス /var/log/audit/audit.log 以外の場所にある場合は、上記のようにしてログファイルのフルパスを指定します。

aa-logprof -m "ログファイル内に記録するマーカー文字列"

システムログ内に、 aa-logprof が後から参照できるように、開始点の印を付けます。 aa-logprof は、指定した印以前のイベントはすべて無視します。なお、印内にスペースが含まれている場合は、正しく引用符で括らなければなりません。たとえば下記のようになります:

root # aa-logprof -m "17:04:21"

もしくは

root # aa-logprof -m e2ff78636296f16d0b5301209a04430d

aa-logprof はログを読み込んでから、それぞれのイベントに対して処理方法を尋ねます。それぞれの質問には番号付きのリストが示され、プロファイル内にどれを追加すべきなのかを尋ねます。

既定では、 aa-logprof/etc/apparmor.d/ 内にプロファイルがあるものとして検索します。また、 aa-logprof でプロファイルを更新する場合、 root での実行であれば十分です。ただし、長期にわたるログを読み込ませる場合など、過去の分も含めた複数のログファイルを処理させたい場合は、 zcat -f `ls -1tr ログファイルのパス/* ` | aa-logprof -f - のように実行してください。

34.7.3.10 aa-logprof 例 1

下記の例では、 httpd2-prefork が /etc/group ファイルへのアクセスを行う際、 aa-logprof 側でどのような対応を行うのかについて説明しています。なお、 [] は既定値を表わしています。

この例では、 /etc/group へのアクセスは httpd2-prefork による名前サービスの処理時に発生します。適切な回答は 1 で、これによってあらかじめ定義された AppArmor ルールを取り込むことができるようになります。 1 を選択すると、 #include によって名前サービス向けのルール一式が取り込まれ、以後に発生する DNS 関連のイベントすべてを解決することができるようになります。また、 DNS 関連の設定が変わったような場合でも、このファイルを修正すれば済むことになりますので、関連する多数のプロファイルを編集せずに済むことになります。

Profile:  /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

下記のいずれかの回答をすることができます:

単に Enter を押す

既定の動作を実行します。この例では、表示されているディレクトリパスに対して、アクセスを許可します。

Allow

表示されているディレクトリパスに対して、アクセスを許可します。詳しくは 31.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。

Deny

表示されているディレクトリパスに対して、恒久的にアクセスを拒否します。 AppArmor はそのまま次のイベントの処理に移ります。

New

このイベントに対応するルールを独自に作成します。ここでは、正規表現による指定にも対応しています。表現の指定がイベントの要件と合致しない場合、 AppArmor は確認メッセージを表示して再入力を求めます。

Glob

ワイルドカードを利用して幅広くマッチするルールを作成します。提示されたパスのうちのいずれかを選択するには、パスの前に示されている数字を入力して進めます。

グロブの書式に関する詳細は、 31.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。

Glob w/Ext

元のディレクトリパス情報を変更して、ファイル名の拡張子だけをマッチングルールとして残すグロブを生成します。たとえば /etc/apache2/file.ext というファイルへのアクセスであった場合、ファイル名の部分だけをワイルドカードにして /etc/apache2/*.ext のような形式に変更します。これにより、特定のディレクトリ内にある同じ拡張子 (.ext) のファイルすべてに対して、許可するルールを作成することができます。

Abort

aa-logprof を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。

Finish

aa-logprof を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。

34.7.3.11 aa-logprof 例 2

この例では、 vsftpd に対するプロファイル作成時の質問を示しています:

Profile:  /usr/sbin/vsftpd
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

この質問には、いくつかの興味深い点があります。まず vsftpd がルートディレクトリに対するアクセス許可を求めています。ところが、 openSUSE Leap では、 vsftpd は既定で /srv/ftp 内のコンテンツを提供しているはずです。 これは、 vsftpd が chroot 環境 (jail) で動作していることによるもので、プログラム上のコードではルートディレクトリにアクセスしているつもりであるため、 AppArmor のログファイル内でも元のパスではなく、ルートディレクトリであるかのように表示されてしまいます。

次に興味深い点はファイル名です。 FTP クライアントから、ディレクトリ内にあるすべての JPEG ファイルに対するアクセスを許可したい場合は、 Glob w/Ext を選んで /*.jpg に変更して処理を進めます。これにより、個別の .jpg ファイルに対していちいち許可を設定する必要がなくなるほか、将来的に .jpg ファイルが増えたような場合でも、問題なく対応できることになります。

最後に興味深い点は、 FTP ファイル全体に対する点です。 Glob を選んで、 aa-logprof からの提案を /y2k.jpg から /* に変更します。それ以外にも、ディレクトリツリー全体に対してアクセスを許可してしまう方法もあります。この場合は New を選んで /**.jpg のように入力します。これにより、ディレクトリツリー全体に対して、すべての .jpg ファイルへのアクセスを許可します。それ以外にも、 /** と指定する方法もあります。この場合は、ディレクトリツリー全体のすべてのファイルに対して、アクセスを許可することになります。

ここまでは、読み込みアクセスに関する話題を扱ってきました。書き込みアクセスについても同様に対応することができますが、書き込みアクセスを付与するにあたっては、より保守的に (制限を厳しくする方向に) 設定しておくことをお勧めします。また、実行アクセスについてはさらに複雑です。詳しい例については 例34.1「学習モードの例外: 特定のリソースへのアクセス制御」 をお読みください。

下記の例では、 /usr/bin/mail に対してプロファイルを作成していて、 /usr/bin/mail/usr/bin/less をヘルパーアプリケーションとして起動した際の質問の例です。 /usr/bin/less は、長いメールメッセージを ページ分割 するために使用しています:

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny
注記
注記

/usr/bin/mail の実際の実行ファイルが /usr/bin/nail となっていますが、これはスペルミスなどではなく、実際に存在するプログラム名です。

プログラム /usr/bin/less は非常にシンプルなプログラムで、 1 画面以上にわたる長いテキストをスクロールしながら読むことができるプログラムです。このような便利な仕組みであることから、 /usr/bin/mail でも使用されているわけです。なお、 less はシンプルな仕組みでありながらも、同時に巨大でパワフルなプログラムでもあり、 tarrpm などのプログラムをさらに呼び出すこともできます。

ヒント
ヒント

tar ファイルや RPM ファイルに対して less を実行すると、その中に含まれている内容を表示することができます。

ですが、メールメッセージを読む際には、 rpm コマンドを自動的に実行してしまうのは危険です。なぜなら、 RPM プログラムにはシステムにプログラムをインストールしたり、プログラムを修正したりする機能が含まれるため、 Microsoft* Outlook でよく見つかるようなウイルス感染の経路になってしまうためです。そのため、ここで選ぶべき選択肢は Inherit (継承) になります。継承を指定すると、 /usr/bin/mail から実行される状況下で less プログラムを実行する場合、 /usr/bin/mail のプロファイルを適用し続けることになります。これには下記の 2 つの意味が含まれます:

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

  • tarrpm などのヘルパーアプリケーションを /usr/bin/mail に登録することを避けることで、 /usr/bin/mail/usr/bin/less を実行しても、 AppArmor が存在すれば非常に安全に動作することになります。もう 1 つの選択肢としては Cx 実行モードがあります。実行モードに関する詳細は、 31.12項 「実行モード」 をお読みください。

その他の状況下では、 Profile オプションを選択する必要があるかもしれません。この場合は、 aa-logprof に対して下記のような効果があります:

  • 現在のプロファイル内に px/Px モードのルールが書き込まれ、子プロセスに対する独自のプロファイルに遷移するようになります。

  • aa-logprof が子プロセスに対するプロファイルを作成し、構築を開始します。これは親プロセスのプロファイルと同じ方法で行われ、親プロセスのイベントは親のプロファイルに、子プロセスのイベントは子のプロファイルにそれぞれ保存されるようになります。 aa-logprof での質問は、両方をあわせて表示します。このプロファイルは、単独のプログラムを子として実行した場合にも当てはまります。

制限を受けているプログラムが fork() したり他のプログラムを起動したりした場合、 aa-logprof はそれを検出すると、 fork() したプログラムや他のプログラムに対して適用すべき実行モードを尋ねます。実行モードは継承 (ix) , プロファイル (px , Px) , 無制限 (ux , Ux) , 子プロセス (cx , Cx) , 名前付きプロファイルのほか、実行拒否を設定することもできます。

子プロセス向けのプロファイルが個別に存在する場合は、既定の選択肢はプロファイル (Px) になります。逆に、プロファイルが存在しない場合は継承 (ix) になります。許可の詳細については、 31.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。

プロファイル (px , Px) を選択した場合、子プロセス側のプログラムでは、独自のプロファイルを使用して実行します。この場合、親プロセスから子プロセスに対して環境変数を継承するにあたって、危険性のある変数の内容を削除するかどうかを尋ねます。削除するよう選択した場合は、プロファイル内に Px が書き込まれ、削除しないように選択した場合は、プロファイル内に px が書き込まれます。なお、プロファイル実行モードを選択した場合の既定値は Px です。

無制限実行モードは非推奨であり、そのプログラムに対するプロファイルをどうやっても作成することができず、それ以外の選択肢が存在しない場合にのみ選択すべきものです。無制限実行モードを選択すると、警告メッセージが表示されて確認を求められますので、 Yes を入力して進めてください。また、危険性のある変数の内容を削除するかどうかを尋ねます。削除するよう選択した場合は、プロファイル内に Ux が書き込まれ、削除しないように選択した場合は、プロファイル内に ux が書き込まれます。なお、無制限実行モードを選択した場合の既定値は Ux です。

重要
重要: 無制限での実行について

uxUx の使用は非常に危険です。子プロセスの実行に際して、セキュリティ面でのポリシー強制が一切働かなくなります。

34.7.3.12 aa-unconfined: 保護されていないプロセスの識別

aa-unconfined コマンドは、お使いのシステムで開いているネットワークポートを調べ、システム内に読み込まれているプロファイルセットと比較を行い、 AppArmor のプロファイルのないネットワークサービスを報告します。このコマンドの実行にあたっては root の権限が必要となるほか、 AppArmor のプロファイルで制限を受けていない状況下で実行する必要があります。

aa-unconfined/proc ファイルシステムから実行ファイルの情報を取得する仕組みであるため、 root で実行しなければなりません。また、下記のような競合状態が発生する可能性があります:

  • コマンドの実行時に削除された実行ファイルがある場合、その扱いを誤ることがあります

  • netstat(8) を実行してから後続のチェックを行うまでに、プロセスが終了したような場合、その扱いを誤ることがあります

注記
注記

このプログラムは TCP と UDP を使用するプロセスのみを一覧表示します。その他のプロトコルを利用する通信については無視されます。そのため、フォレンジック用途にはお使いいただけません。検証環境内で、ネットワークにアクセスするプロセスに対してプロファイルを作成する用途にのみお使いください。

34.7.3.13 aa-notify

aa-notify は、お使いのデスクトップ環境内に AppArmor の通知を表示することのできる、便利なユーティリティです。 AppArmor のログファイルを直接調査したくなく、代わりにポリシーに違反した通知のみをデスクトップに表示したい場合に有用です。 AppArmor のデスクトップ通知機能を有効化するには、下記のように入力して aa-notify を実行します:

tux > sudo aa-notify -p -u ユーザ名 --display ディスプレイ番号

ここで、 ユーザ名 には現在ログインしているユーザのユーザ名を、 ディスプレイ番号 には現在使用しているディスプレイのディスプレイ番号 (例: :0) をそれぞれ指定します。プログラムは裏で動作する仕組みで、拒否イベントが発生するたびに通知が表示されます。

ヒント
ヒント

なお、現在使用している X Window のディスプレイ番号は、 $DISPLAY という環境変数に保存されていますので、 --display $DISPLAY と入力することで、現在のディスプレイをそのまま使用することができます。

GNOME 内での aa-notify メッセージ
図 34.1: GNOME 内での aa-notify メッセージ

なお、 -s 日数 というオプションを指定すると、指定した過去日数分の通知概要を表示することができます。 aa-notify の詳細については、 man 8 aa-notify で表示されるマニュアルページをお読みください。

34.7.3.14 apparmor.vim

vim テキストエディタ向けの文法ハイライト機能を利用することで、 AppArmor のプロファイル内にある様々な機能を色付きで表示することができます。 vim と vim 向けの AppArmor 文法モードでは、プロファイルの意味を色で識別することができますので、端末ウインドウ内で入力を行いながら内容を確認することができます。

vim で AppArmor のプロファイルを編集している際、文法ハイライト機能を有効にするには、 :syntax on を実行してから :set syntax=apparmor を実行します。また、 vim 側でファイルを正しく AppArmor のプロファイルとして認識しているかどうかを調べるには、下記の内容をプロファイルの末尾に入力します:

# vim:ft=apparmor

"\n \n"

ヒント
ヒント

なお、 vim を利用した場合、 /etc/apparmor.d/ ディレクトリ内のファイルを編集すると、自動的に文法ハイライト機能が有効化されます。

この機能を利用した場合は、 vim ではプロファイルの内容を下記のように表示します:

コメント

通常の読み込みアクセスの行

ケーパビリティの項目および不平モードのフラグ

書き込み権のあるアクセスの行

実行許可 (ix もしくは px) を与えている行

無制限アクセス (ux) を設定している行

赤い背景

正しく AppArmor モジュールに読み込むことのできない、文法エラーのある行

vim での文法ハイライト機能について、詳しくは apparmor.vim および vim の各マニュアルページ、もしくは vim エディタ内から :help syntax と入力して実行することで表示される、ヘルプをお読みください。また、文法ハイライトに関わる設定は、 /usr/share/vim/current/syntax/apparmor.vim. 内にあります。

34.8 主なファイル名とディレクトリ

下記の一覧には、 AppArmor フレームワークで使用される最も重要なファイルとディレクトリが列挙されています。プロファイルを手作業で管理もしくはトラブルシューティングしたい場合は、下記のファイルやディレクトリについて知っておく必要があります:

/sys/kernel/security/apparmor/profiles

現在読み込まれているプロファイルセットを表示することのできる、仮想ファイルです。

/etc/apparmor/

AppArmor の設定ファイルの配置場所です。

/usr/share/apparmor/extra-profiles

AppArmor に同梱されているプロファイルのローカルリポジトリです。既定では有効化されていません。

/etc/apparmor.d/

プロファイルを保存するためのディレクトリです。なお、パス内の /. に置き換えたファイル名 (ただしルートディレクトリを表わす冒頭の / は除きます) で作成するのが慣習となっています。これにより、プロファイルのファイル名を分かりやすくしています。たとえば /usr/sbin/smbd というプログラム向けのプロファイルは、 usr.sbin.smbd というファイル名になっています。

/etc/apparmor.d/abstractions/

抽象を保存しておくためのディレクトリです。

/etc/apparmor.d/program-chunks/

プログラムチャンクを保存しておくためのディレクトリです。

/proc/*/attr/current

このファイルの内容を出力することで、そのプロセスに対する制限状況と、適用されているプロファイルを表示することができます。また、 ps auxZ のように入力して実行すると、この情報を自動的に取得することができます。