AppArmor® には、システムのセキュリティを管理するにあたって、グラフィカルなインターフェイスだけでなく、コマンドラインインターフェイスも用意されています。 AppArmor のコマンドラインツールでは、 AppArmor の状態確認のほか、プロファイルの作成や削除、修正などを行うことができます。
AppArmor のコマンドラインツールでプロファイルを管理し始める前に、まずは 第29章 「プログラムに対する予防接種」 と 第30章 「プロファイルのコンポーネントと文法」 にある AppArmor の一般的な情報をお読みください。
AppArmor は下記に示す 3 種類の状態のいずれかになります:
AppArmor がカーネル内に読み込まれていない状態です。
AppArmor がカーネル内に読み込まれていて、 AppArmor がプログラムポリシーを強制している状態です。
AppArmor がカーネル内に読み込まれていますが、何もポリシーを適用していない状態です。
/sys/kernel/security/apparmor/profiles
ファイルに書かれた内容を読むことで、 AppArmor の状態を検知することができます。 cat /sys/kernel/security/apparmor/profiles
を実行すると、プロファイルの一覧と AppArmor の動作状態が表示されます。中身が空であった場合、 AppArmor は停止していることになります。また、ファイルが存在していない場合は、未読み込みの状態であることを示しています。
AppArmor は systemctl
コマンドで管理することができます。下記のとおり入力して実行することで、それぞれの処理を実行することができます:
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
ディレクトリ内にある新しいプロファイルが適用されるほか、削除されたプロファイルがあればメモリ内からも削除されます。
AppArmor のプロファイル定義は /etc/apparmor.d
ディレクトリ内に存在していて、プロファイル自身はテキストファイルで記述されています。これらのファイルの書式について、詳しくは 第30章 「プロファイルのコンポーネントと文法」 をお読みください。
/etc/apparmor.d
ディレクトリ内にあるすべてのファイルはプロファイルとして扱われ、読み込まれます。ディレクトリ内でのファイル名の変更は、プロファイルを削除するにあたっては不適切です。特定のプロファイルを読み込まれないように設定したい場合は、このディレクトリからファイルを削除するか、プロファイルに対して aa-disable
を実行してください。これにより、 /etc/apparmor.d/disabled/
内にシンボリックリンクが作成されます。
プロファイルを読み書きしたい場合は、 vi
のようなテキストエディタをお使いください。下記の章には、プロファイルを作成するための説明が書かれています:
33.3項 「AppArmor プロファイルの追加と作成」 をお読みください
33.4項 「AppArmor プロファイルの編集」 をお読みください
33.6項 「AppArmor プロファイルの削除」 をお読みください
特定のアプリケーションに対して AppArmor のプロファイルを追加もしくは作成するにあたっては、一括プロファイル作成と単独プロファイル作成のいずれかの方式をとることができます。この 2 種類の方式について、詳しい説明は 33.7項 「2 種類のプロファイル作成方法」 をお読みください。
AppArmor のプロファイルを編集するには、下記の手順を実施します:
root
でログインしていない場合は、端末ウインドウ内で su
と入力して実行します。
root
のパスワード入力を求められた場合は、そのパスワードを入力します。
cd /etc/apparmor.d/
と入力して実行し、プロファイルのディレクトリに移動します。
ls
と入力して実行すると、現在インストールされているすべてのプロファイルの一覧を表示することができます。
編集したいプロファイルをテキストエディタ (例: vim) で開きます。
必要な変更を行ったあと、ファイルを保存して終了します。
端末ウインドウ内で systemctl reload apparmor
と入力して実行し、 AppArmor を再起動します。
aa-remove-unknown
を実行すると、 /etc/apparmor.d
ディレクトリ内に存在しないすべてのプロファイル (たとえば自動生成された LXD プロファイルなど) の読み込みが解除されます。これにより、システムのセキュリティが危険にさらされる場合があります。読み込みを解除する前に -n
パラメータを付けて実行し、どのプロファイルの読み込みが解除されるのかを調べてから実行しておくことをお勧めします。
/etc/apparmor.d/
ディレクトリ内に存在していないすべての AppArmor プロファイルについて、それらの読み込みを解除したい場合は、下記のように入力して実行します:
>
sudo
aa-remove-unknown
読み込みが解除されるプロファイルの一覧を表示したい場合は、下記のようにします:
>
sudo
aa-remove-unknown -n
AppArmor のプロファイルを削除するには、下記の手順を実施します:
まずはカーネルから AppArmor の定義を削除します:
>
sudo
apparmor_parser -R /etc/apparmor.d/プロファイルのファイル名
プロファイルのファイルそのものを削除します:
>
sudo
rm /etc/apparmor.d/プロファイルのファイル名
>
sudo
rm /var/lib/apparmor/cache/プロファイルのファイル名
第30章 「プロファイルのコンポーネントと文法」 に AppArmor のプロファイル文法に関する説明があるとおり、 AppArmor ツールを使用せずにプロファイルを作成することもできます。しかしながら、何もない状態からプロファイルを作成するのは手間がかかります。そのため、 AppArmor の各種ツールを利用して、プロファイルを自動作成したり、自動的に調整したりする機能を利用することをお勧めします。
AppArmor のプロファイルを作成するにあたっては、下記に示す 2 種類の方法があります。いずれの方法であっても、ツールを利用して行うことができます。
電子メールクライアントなど、アプリケーション自体が比較的小規模で、かつ必要に応じて起動したり終了したりするようなものにお勧めです。詳しくは 33.7.1項 「単独プロファイル作成」 をお読みください。
多数のプログラムに対してプロファイルを一括作成するような場合に適切であるほか、 Web サーバやメールサーバなどのように、常に動作し続け、システムを再起動した後にも、すぐに動作させる必要があるもののような場合にも適切です。詳しくは 33.7.2項 「一括プロファイル作成」 をお読みください。
プロファイルを自動生成することで、 AppArmor のツールによる管理がよりやりやすくなります:
まずは要件にあったプロファイル方法を選びます。
静的な分析を行います。選択した方法にあわせて、 aa-genprof
もしくは aa-autodep
のいずれかを実行します。
動的な学習を有効化します。プロファイルを作成したすべてのプログラムに対して、学習モードを有効化します。
単独でプロファイルを作成して改善していく場合は、 aa-genprof
と呼ばれるプログラムを利用します。この方法では、 aa-genprof
が様々な作業を代行してもらえるため、作業が簡単になる一方、プログラムを起動してから終了するまでの間、 aa-genprof
を実行し続けなければならない、という制限が発生します (つまり、プロファイルの作成中はマシンの再起動を行うこともできなくなります) 。
単独プロファイル作成で aa-genprof
を使用する場合は、 33.7.3.8項 「aa-genprof: プロファイルの生成」 をお読みください。
この方法は、 aa-genprof
で行う単独 (もしくは少数) のプロファイル作成とは異なり、システム内にある複数のプロファイルを一括で更新することから、 一括プロファイル作成 と呼ばれています。一括プロファイル作成ではプロファイルの構築と改善を自動化することができず、手作業が発生しますが、より柔軟に対応することができます。この方法は、システムが再起動しても動作し続ける長期稼働型のアプリケーションや、多数のプログラムに対して一括でプロファイルを作成したい場合に便利です。
一括で AppArmor のプロファイルを作成するには、下記の手順で行います:
まずはお使いのアプリケーションの各プログラムに対して、プロファイルを作成します。
この方式を使用する際には、あらかじめプログラムに対する AppArmor のプロファイルを作成しておかなければなりません。これは、 AppArmor がプロファイルのあるプログラムのみを監視するためです。これに対応させるために、 aa-autodep
を利用して、プログラムに対する近似プロファイルを作成してください。詳しくは 33.7.3.1項 「aa-autodep: 近似プロファイルの作成」 をお読みください。
対応するプロファイルを学習 (不平) モードに設定します。
プロファイルの存在するすべてのプログラムに対して、プロファイルを学習 (不平) モードに切り替えたい場合は、 端末内で root
になり、 下記のように実行します:
>
sudo
aa-complain /etc/apparmor.d/*
この機能は、 YaST のプロファイルモジュールでも設定することができます。詳しくは 32.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。
学習モードの場合、プロファイル側で明示的に禁止されている場合であっても、実際にアクセス制限が発動されることはありません。これにより、ステップ 3 で示しているとおり、様々なテストを実施して、プログラムにとって必要なアクセス権を正しく検出することができるようになります。また、この情報を利用することで、プロファイル内でどこまでの許可を与えればよいのかがわかるようにもなります。
学習 (不平) モードへの切り替えについて、詳しくは 33.7.3.2項 「aa-complain: 不平モード (学習モード) への突入」 をお読みください。
対象のアプリケーションを様々にテストします。
アプリケーション内にある様々な機能を動作させて試します。どれだけプログラムを試せばよいのかはプログラム次第ですが、少なくともプログラム側からアクセスする必要のあるファイルに対して、一通りアクセスするようにしてください。なお、処理は aa-genprof
の監視下で動作しているわけではありませんので、何日も何週間も動作させたままでかまいませんし、システムを再起動してもかまいません。
ログを分析します。
一括プロファイル作成では、単独プロファイル時のように aa-genprof
から aa-logprof
を実行するのではなく、 aa-logprof
を直接実行します。 aa-logprof
は下記のように入力して実行します:
>
sudo
aa-logprof [ -d プロファイルのパス ] [ -f /ログファイルのパス ]
aa-logprof
の使用方法について、詳しくは 33.7.3.9項 「aa-logprof: システムログのスキャン」 をお読みください。
これにより、最適なプロファイルを作成することができるようになります。このように繰り返し実施することで、分析対象のログファイルを小さくすることができますので、より素早くプロファイルに反映できるようになります。また、繰り返すたびにログの出力も減るはずですので、処理も高速化されます。
プロファイルを編集します。
生成されたプロファイルの内容を確認します。具体的には、テキストエディタなどで /etc/apparmor.d/
ディレクトリ内のファイルを開いて、必要であれば編集を行います。
強制モードに戻します。
強制モードに戻すことで、プロファイルのルールに対して、その違反を記録するだけでなく、違反を明示的に禁止することができるようになります。この作業は、プロファイルをテキストエディタなどで開いて、 flags=(complain)
と書かれた箇所を削除して保存するか、もしくは aa-enforce
コマンドを使用することで行うことができます (aa-enforce
コマンドは、aa-complain
と同じように使用することができるもので、強制モードに移行させることができます) 。また、この作業は YaST のプロファイルモジュールでも実施することができます。詳しくは 32.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。
すべてのプロファイルを不平モードから強制モードに移行させたい場合は、 aa-enforce /etc/apparmor.d/*
と入力して実行します。
再度すべてのプロファイルをスキャンします。
AppArmor に対してすべてのプロファイルを再スキャンさせ、カーネル内を強制モードに変更するには、 systemctl reload apparmor
と入力して実行します。
AppArmor におけるプロファイルユーティリティは、 apparmor-utils
パッケージ内にすべて含まれていて、 /usr/sbin
内にインストールされます。それぞれのツールの概要は下記のとおりです。
このプログラムは、選択したプログラムやアプリケーションに対応する、近似プロファイルを作成するツールです。バイナリ実行ファイルやインタプリタ型のスクリプトプログラムに対応しています。生成されたプロファイルは、 AppArmor で適切に制限を設定するにあたって、完全なものではないことから、 「近似」 プロファイルと呼ばれます。 aa-autodep
で生成される近似プロファイルには、ほとんどのプログラムで必要な項目を列挙した、基本的な include ディレクティブのみが含まれる最小限のプロファイルとなります。また、特定の種類のプログラムであれば、 aa-autodep
はさらに詳しいプロファイルを生成します。コマンドラインで指定したプログラムに対して ldd(1)
を再帰的に呼び出し、プロファイルを生成しようとします。
近似プロファイルを生成するには aa-autodep
プログラムを使用します。パラメータとしてプログラム名を単純に指定した場合は、 aa-autodep
がシェルの PATH 環境変数を展開してプログラムを探します。フルパスを指定してもかまいません。また、プログラムそれ自身は任意のものでかまいません (ELF バイナリであっても、シェルや Perl のスクリプトであってもかまいません) 。 aa-autodep
は、後続の動的プロファイル作成で改善を行うための、ベースとなる近似プロファイルを生成します。
生成された近似プロファイルは、 /etc/apparmor.d
ディレクトリ内に、 AppArmor のプロファイル命名規約に従って出力されます。具体的には、スラッシュ ( /
) をピリオド ( .
) に置き換えたファイル名になります。 aa-autodep
のコマンドの書式は下記のとおりです:
>
sudo
aa-autodep [ -d プロファイルのパス ] [プログラム_1 プログラム_2...]
プログラム名を入力しない場合は、入力を求められます。また、 プロファイルのパス を指定した場合は、既定のプロファイル保存先である /etc/apparmor.d
を変更し、既定の場所以外にプロファイルを保存することができます。
プロファイル作成を開始するにあたっては、まずお使いのアプリケーションを構成するメインの実行ファイル (プロファイルが存在しておらず、他のプログラムから呼び出されることのない実行ファイル) に対して、プロファイルを作成しなければなりません。このような条件に該当するプログラムを、お使いのアプリケーション内ですべて見つけてから、プロファイルを作成してください。このようなプログラムを見つける方法には、下記のような方法があります:
プロファイルを作成すべきプログラムが特定の 1 つのディレクトリ内にのみ存在し、それ以外には存在しない場合であれば、 aa-autodep
プログラムのパス/* のように実行することで、そのディレクトリ内にあるすべてのプログラムに対して、近似プロファイルを作成することができます。
アプリケーションを起動したあと、標準的な Linux コマンドである pstree
を使用することで、動作中のすべてのプロセスを取得することができます。あとはプログラムがどこに配置されているのかを突き止めて、それぞれに対して aa-autodep
を実行します。なお、プログラムがお使いのパス内に存在している状態であれば、 aa-autodep
を実行するだけで、実際のコマンドパスを自動的に検索させることができます。パス内に存在していない場合は、標準的な Linux コマンドである find
を使用して、プログラムパスを探してください。たとえば find / -name '
アプリケーション名 ' -print のように実行することで、アプリケーションのパスを取得することができます。また、必要であればワイルドカードを使用してもかまいません。
不平モード (学習モード) ツール ( aa-complain
) は、指定した AppArmor のプロファイルルールのモードを変更するツールです。不平モードに設定したプロファイルに対しては、ルールへの違反が許容されるものの、ログに記録されるようになります。これはプロファイルを改善していくための仕組みで、いったん不平モードを設定した後、さまざまなプログラム処理を実施して、プログラムのアクセス要件をログに記録させて、そのログを元にプロファイルを改善する流れを取ります。
コマンドラインから不平モードを手作業で有効化すると、プロファイルの冒頭にフラグを設定し、 /bin/foo
のような項目が /bin/foo flags=(complain)
のようになります。不平モードを使用するには、 端末ウインドウを開いて、 root
で下記のように入力して実行します:
プログラム ( プログラム_1 ) がパス内に存在する場合は、下記のように実行します:
>
sudo
aa-complain [プログラム_1 プログラム_2 ...]
プログラムがパス内に存在しない場合は、下記のようにフルパスで指定します:
>
sudo
aa-complain /sbin/プログラム_1
また、プロファイルが /etc/apparmor.d
内に存在しない場合は、下記のように配置場所を指定します:
>
sudo
aa-complain プロファイルのパスプログラム_1
/sbin/program1 のプロファイルを指定したい場合は、下記のように入力して実行します:
>
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 には、不平モードと強制モードを切り替えることのできるグラフィカルなフロントエンドが用意されています。詳しくは 32.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。
aa-decode
は、 AppArmor のログ出力内に存在する 16 進数で書かれた文字列をデコードすることができます。標準入力から監査ログを入力させることもできますし、 AppArmor のログ内にある 16 進数の文字列をデコードして、標準出力に書き出すこともできます。
aa-disable
コマンドは、 1 つもしくは複数の AppArmor プロファイルの強制モードを無効化するために使用します。このコマンドを実行すると、カーネルからプロファイルの読み込みを解除して開放し、 AppArmor の起動時にもプロファイルが読み込まれないようにします。この動作を変更したい場合は、 aa-enforce
もしくは aa-complain
の各ツールをお使いください。
aa-easyprof
は AppArmor のプロファイル生成に対して、簡易的なインターフェイスを提供する仕組みです。 aa-easyprof
ではテンプレート (雛形) やグループ化の仕組みを使用して、アプリケーションのプロファイルを素早く作成することができます。 aa-easyprof
はプロファイル生成の支援を行いますが、これは使用するテンプレートの品質とプロファイルのグループ、および抽象に依存しています。また、このツールは手作業でプロファイルを作成する場合や、 aa-genprof
と aa-logprof
を利用してプロファイルを作成する場合に比べると、制限の緩いプロファイルを作成することになります。
詳しくは aa-easyprof
(8) のマニュアルページをお読みください。
強制モードでは、プロファイルで許可されていないファイルへのアクセスが禁止されるなど、 AppArmor のプロファイルルールへの違反を検知することができます。このモードでは、違反はログに記録されるだけでなく、許可もされません。そのため、普段使用する場合は強制モードの適用を推奨します。違反を記録するのみで禁止したくない場合は、不平モードに設定してください。
コマンドラインから強制モードを手作業で設定すると、プロファイルの冒頭にあるフラグを削除し、 /bin/foo flags=(complain)
のような項目が /bin/foo
のようになります。強制モードを使用するには、端末ウインドウを開いて、 root
で下記のいずれかのように入力して実行します:
プログラム ( プログラム_1 ) がパス内に存在する場合は、下記のように実行します:
>
sudo
aa-enforce [プログラム_1 プログラム_2 ...]
プログラムがパス内に存在しない場合は、下記のようにフルパスで指定します:
>
sudo
aa-enforce /sbin/プログラム_1
また、プロファイルが /etc/apparmor.d 内に存在しない場合は、下記のように配置場所を指定します:
>
sudo
aa-enforce -d プロファイルのパス プログラム_1
/sbin/program1 のプロファイルを指定したい場合は、下記のように入力して実行します:
>
sudo
aa-enforce /etc/apparmor.d/sbin.プログラム_1
上述のコマンドはいずれも、指定したプロファイルやプログラムを強制モードに切り替える処理を行います。
プログラム名やプロファイル名を入力しない場合は、入力を求められます。また、 プロファイルのパス を指定した場合は、既定のプロファイル保存先である /etc/apparmor.d
を変更し、既定の場所以外にあるプロファイルを使用することができます。
パラメータには、複数のプログラムやプロファイルを指定することができます。また、プログラムの指定の際、これをフルパスで指定しないと、 aa-complain
は $PATH
内を検索して、プログラムの場所を判断します。
YaST には、不平モードと強制モードを切り替えることのできるグラフィカルなフロントエンドが用意されています。詳しくは 32.4.2項 「個別のプロファイルに対するモード変更」 をお読みください。
aa-exec
は指定したプロファイルやプロファイルネームスペースで、特定のプログラムを起動するためのツールです。プロファイルとネームスペースの両方を指定した場合、プログラムは新しいネームスペース内のプロファイルで制限を受けることになります。ネームスペースのみを指定した場合は、現在の制限内にあるプロファイル名を使用します。いずれも指定しない場合は、コマンドは標準的なプロファイル適用をそのまま使用します (つまり、 aa-exec
コマンドを使用せずに起動した場合と同じ動作になります) 。
子マントのオプションについて、詳しくは man 8 aa-exec
にあるマニュアルページをお読みください。
aa-genprof
は AppArmor におけるプロファイル生成ユーティリティです。プロファイルが存在しない場合は、指定したプログラムに対して aa-autodep
を実行して近似プロファイルを作成したあと、プロファイルを不平モードに設定して AppArmor を再読み込みさせ、ログに印を付けます。その後、ユーザに対してプログラムを実行し、その機能を一通り試すように依頼します。コマンドの書式は下記のとおりです:
>
sudo
aa-genprof [ -d プロファイルのパス ] プログラム
Apache Web サーバである httpd2-prefork に対してプロファイルを作成したい場合は、 root
で下記のように実行します:
systemctl stop apache2
と入力して実行します。
続けて aa-genprof httpd2-prefork
と入力して実行します。
すると、 aa-genprof
は下記のような処理を行います:
お使いのシェルの PATH 環境変数を利用して httpd2-prefork のフルパスを取得します。もちろん最初からフルパスで指定してもかまいません。 openSUSE Leap では、このプログラムのフルパスは /usr/sbin/httpd2-prefork
であるはずです。
まずは httpd-prefork に対して、既存のプロファイルが存在していないかどうかを確認します。プロファイルが存在した場合はそれを更新しようとします。存在しない場合は、 33.7.3項 「プロファイル作成ツールの概要」 で説明している aa-autodep
を使用して、プロファイルを作成します。
指定したプログラムに対するプロファイルを学習 (不平) モードに設定し、プロファイルへの違反を記録するだけで、禁止を行わないようにします。違反の記録は、たとえば下記のようになります (/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
ログ内に印を付けて、作業の開始位置判断とします。たとえば下記のように出力されます:
Sep 13 17:48:52 figwit root: GenProf: e2ff78636296f16d0b5301209a04430d
ツール側から問い合わせメッセージが表示されたら、もう 1 つの端末ウインドウを開いてプロファイルを作成するアプリケーションを起動し、可能な限り様々な処理を実施させます。これにより、学習モード下でプログラムが必要とする様々なファイルやディレクトリなどにアクセスすることになります。この例では、たとえば新しい端末ウインドウを開いて、 systemctl start apache2
と入力し実行します。
様々なプログラムの機能を利用したあとは、 aa-genprof
の端末ウインドウ内で下記のような入力を行うことができます:
S と入力すると、 aa-genprof
は先ほど印を付けた箇所以降のシステムログを検索する処理を実施します。ログ内に何らかのシステムイベントが見つかった場合、 AppArmor はそれらを読み込んで判断します。これにより、セキュリティプロファイルを生成するにあたっての様々な質問を生成します。
F と入力すると、ツールを終了することができます。
ハット (hat) を追加するように求められた場合は、 第34章 「チェンジハット機能による Web アプリケーションのプロファイル作成」 をお読みください。
あとは下記に示す 2 種類の質問に答えていきます:
プロファイル対象のプログラムから特定のリソースへのアクセスが要求されたものの、プロファイル内には許可が書かれていないもの (詳しくは 例33.1「学習モードの例外: 特定のリソースへのアクセス制御」 をお読みください) 。
プロファイル対象のプログラムからプログラムが実行されたものの、セキュリティドメイン遷移が定義されていないもの (詳しくは 例33.2「学習モードの例外: 項目に対する許可の設定」 をお読みください) 。
いずれの分類の質問であっても、プロファイル内にリソースやプログラムを追加するために回答しなければならない質問になります。 例33.1「学習モードの例外: 特定のリソースへのアクセス制御」 や 例33.2「学習モードの例外: 項目に対する許可の設定」 には、それぞれ質問の例が示されています。続く手順では、それぞれの質問に対する回答方法を示しています。
実行権限の取り扱いは複雑です。それぞれ表示された内容に対して、どのような実行権限を与えるのかを決定しなければなりません:
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
子プロセスに対して親と同じプロファイルを適用し、親と同じアクセス権限を継承するように指定します。このモードは、制限を受けているプログラムから他のプログラムを呼び出す際、新しい許可を設定したくない場合や、既にある許可を失いたくない場合に指定します。このモードは、たとえば /usr/bin/mail
のメールクライアントが less
をページャとして使用する場合など、 ヘルパーアプリケーション のようなプログラムを呼び出す際にしばしば用いられます。
子プロセスに対して、カーネル内に読み込まなければならない独自のプロファイルを適用するように指定します。プロファイルが存在しない場合、子プロセスの実行はアクセス拒否として失敗します。これは、親プログラムから DNS の参照やお使いのシステムの MTA を介したメール送信など、グローバルサービスを実行するような場合に有用です。
(クリーン実行付きプロファイル) (Px) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。
サブプロファイルへの遷移を設定します。 px/Px での遷移と同様ですが、子プロファイルへの遷移という点が異なります。
(クリーン実行付きプロファイル) (Cx) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。
子プロセスに対して AppArmor のプロファイルを適用せず、リソースに対する制限を行わないようにします。
(クリーン実行付き無制限) (Ux) を選択すると、子プロセスに環境変数を渡す際、その実行に影響があるような環境変数を削除して実行することができます。ただし、制限を取り外してしまうことはセキュリティ面での脆弱性を生む行為であり、危険であることに注意してください。そのため、それ以外の選択肢ではどうしても解決できない場合にのみ、指定してください。
この許可を設定すると、そのプロファイルが適用されるプログラムに対して、 mmap システムコールの際に PROT_EXEC
フラグを設定できるようになります。これにより、データとして割り当てたメモリを実行することができるようになります。プロファイル生成時に求められた場合にのみ、この許可を設定してください。
プロファイルに対して deny
ルールを追加して、指定したディレクトリパス項目に対するアクセスを明示的に禁止するようにします。 AppArmor はそのまま次のイベントの処理に移ります。
aa-logprof
を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。
aa-logprof
を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。
例33.2「学習モードの例外: 項目に対する許可の設定」 には、 AppArmor がグロブパターン /var/run/nscd/*
を利用して読み込みアクセスを許可し、一般的な Apache 関連のアクセスルールをカバーするため、抽象を使用しようとしている様子を示しています。
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 を使用するように提案された場合は、提案を受け入れるのがよいでしょう。
次の手順で説明しているように、 30.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。
を選択することでアクセスすることができます。グロブの書式に関する詳細は、プログラムが必要とするパスを直接指定して、正しく動作するように設定します。
パスまたはインクルードの設定を行った後は、 AppArmor のプロファイルに追加します。表示されたディレクトリパスの項目で問題があるとお考えの場合は、 (グロブ) を選択することもできます。
(許可) または (拒否) を選択して、対応する項目を学習モードで生成された項目を処理し、プロファイルにする方法には、下記のものがあります:
選択したディレクトリパスに対して、アクセスを許可します。
選択したディレクトリパスの項目に対して、アクセスを許可します。 AppArmor では、アクセスモードの提案も行います。詳しくは 30.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。
指定したディレクトリパスの項目に対して、プログラムからのアクセスを拒否します。 AppArmor はそのまま次のイベントの処理に移ります。
このイベントに対応するルールを独自に作成します。ここでは、正規表現による指定にも対応しています。表現の指定がイベントの要件と合致しない場合、 AppArmor は確認メッセージを表示して再入力を求めます。
ワイルドカードを利用して幅広くマッチするルールを作成します。提示されたパスのうちのいずれかを選択するには、パスの前に示されている数字を入力して進めます。
グロブの書式に関する詳細は、 30.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。
元のディレクトリパス情報を変更して、ファイル名の拡張子だけをマッチングルールとして残すグロブを生成します。たとえば /etc/apache2/file.ext
というファイルへのアクセスであった場合、ファイル名の部分だけをワイルドカードにして /etc/apache2/*.ext
のような形式に変更します。これにより、特定のディレクトリ内にある同じ拡張子 (.ext
) のファイルすべてに対して、許可するルールを作成することができます。
aa-logprof
を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。
aa-logprof
を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。
vi
を利用してプロファイルの表示や編集を行いたい場合は、端末ウインドウ内で vi /etc/apparmor.d/
プロファイル名 のように入力して実行してください。 vim 内で AppArmor のプロファイルを編集するにあたり、文法ハイライト機能を有効化したい場合は、 :syntax on
と入力してから :set syntax=apparmor
と入力します。 vim および文法ハイライト機能に関する詳細については、 33.7.3.14項 「apparmor.vim」 をお読みください。
systemctl reload apparmor
コマンドを実行し、 AppArmor を再起動して、プロファイルセットを再読み込みします。これにより、新しく作成したプロファイルが読み込まれるようになります。
グラフィカルなフロントエンドを利用して AppArmor のプロファイルを作成する場合と同様に、 YaST のプロファイル追加ウイザードや aa-genprof
でも、 /usr/share/apparmor/extra-profiles
内にあるローカルプロファイルを使用することができます。
ローカルリポジトリにあるプロファイルを使用するには、下記のようにして行います:
上述の手順で 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
提示されたプロファイルを使用するには U ( ) と入力し、上述のプロファイル生成手順に従って続けます。
有効化する前にプロファイルの内容を確認したい場合は、 V ( ) と入力します。
既存のプロファイルを無視したい場合は、 C ( ) と入力して、上述のプロファイル生成手順で、何もない状態からプロファイルを作成していきます。
すべての作業が終わったら、 F ( ) と入力すると、変更点を保存して終了することができます。
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
は、指定した印以前のイベントはすべて無視します。なお、印内にスペースが含まれている場合は、正しく引用符で括らなければなりません。たとえば下記のようになります:
#
aa-logprof -m "17:04:21"
もしくは
#
aa-logprof -m e2ff78636296f16d0b5301209a04430d
aa-logprof
はログを読み込んでから、それぞれのイベントに対して処理方法を尋ねます。それぞれの質問には番号付きのリストが示され、プロファイル内にどれを追加すべきなのかを尋ねます。
既定では、 aa-logprof
は /etc/apparmor.d/
内にプロファイルがあるものとして検索します。また、 aa-logprof
でプロファイルを更新する場合、 root
での実行であれば十分です。ただし、長期にわたるログを読み込ませる場合など、過去の分も含めた複数のログファイルを処理させたい場合は、 zcat -f `ls -1tr
ログファイルのパス/* ` | aa-logprof -f - のように実行してください。
下記の例では、 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
下記のいずれかの回答をすることができます:
既定の動作を実行します。この例では、表示されているディレクトリパスに対して、アクセスを許可します。
表示されているディレクトリパスに対して、アクセスを許可します。詳しくは 30.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。
表示されているディレクトリパスに対して、恒久的にアクセスを拒否します。 AppArmor はそのまま次のイベントの処理に移ります。
このイベントに対応するルールを独自に作成します。ここでは、正規表現による指定にも対応しています。表現の指定がイベントの要件と合致しない場合、 AppArmor は確認メッセージを表示して再入力を求めます。
ワイルドカードを利用して幅広くマッチするルールを作成します。提示されたパスのうちのいずれかを選択するには、パスの前に示されている数字を入力して進めます。
グロブの書式に関する詳細は、 30.6項 「プロファイル名/フラグ/パス/グロブ」 をお読みください。
元のディレクトリパス情報を変更して、ファイル名の拡張子だけをマッチングルールとして残すグロブを生成します。たとえば /etc/apache2/file.ext
というファイルへのアクセスであった場合、ファイル名の部分だけをワイルドカードにして /etc/apache2/*.ext
のような形式に変更します。これにより、特定のディレクトリ内にある同じ拡張子 (.ext
) のファイルすべてに対して、許可するルールを作成することができます。
aa-logprof
を中止し、ここまでに入力したルール変更を破棄して終了します。プロファイルの修正は行いません。
aa-logprof
を終了し、ここまでに入力したルール変更を保存し、プロファイルの修正を行います。
この例では、 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 ファイルに対するアクセスを許可したい場合は、 /*.jpg
に変更して処理を進めます。これにより、個別の .jpg
ファイルに対していちいち許可を設定する必要がなくなるほか、将来的に .jpg
ファイルが増えたような場合でも、問題なく対応できることになります。
最後に興味深い点は、 FTP ファイル全体に対する点です。 aa-logprof
からの提案を /y2k.jpg
から /*
に変更します。それ以外にも、ディレクトリツリー全体に対してアクセスを許可してしまう方法もあります。この場合は を選んで /**.jpg
のように入力します。これにより、ディレクトリツリー全体に対して、すべての .jpg
ファイルへのアクセスを許可します。それ以外にも、 /**
と指定する方法もあります。この場合は、ディレクトリツリー全体のすべてのファイルに対して、アクセスを許可することになります。
ここまでは、読み込みアクセスに関する話題を扱ってきました。書き込みアクセスについても同様に対応することができますが、書き込みアクセスを付与するにあたっては、より保守的に (制限を厳しくする方向に) 設定しておくことをお勧めします。また、実行アクセスについてはさらに複雑です。詳しい例については 例33.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
はシンプルな仕組みでありながらも、同時に巨大でパワフルなプログラムでもあり、 tar
や rpm
などのプログラムをさらに呼び出すこともできます。
tar ファイルや RPM ファイルに対して less
を実行すると、その中に含まれている内容を表示することができます。
ですが、メールメッセージを読む際には、 rpm
コマンドを自動的に実行してしまうのは危険です。なぜなら、 RPM プログラムにはシステムにプログラムをインストールしたり、プログラムを修正したりする機能が含まれるため、 Microsoft* Outlook でよく見つかるようなウイルス感染の経路になってしまうためです。そのため、ここで選ぶべき選択肢は (継承) になります。継承を指定すると、 /usr/bin/mail
から実行される状況下で less プログラムを実行する場合、 /usr/bin/mail
のプロファイルを適用し続けることになります。これには下記の 2 つの意味が含まれます:
/usr/bin/less
に対する基本的なファイルアクセス設定を、 /usr/bin/mail
のプロファイル内に追加する必要があります。
tar
や rpm
などのヘルパーアプリケーションを /usr/bin/mail
に登録することを避けることで、 /usr/bin/mail
が /usr/bin/less
を実行しても、 AppArmor が存在すれば非常に安全に動作することになります。もう 1 つの選択肢としては Cx 実行モードがあります。実行モードに関する詳細は、 30.12項 「実行モード」 をお読みください。
その他の状況下では、 aa-logprof
に対して下記のような効果があります:
現在のプロファイル内に px/Px モードのルールが書き込まれ、子プロセスに対する独自のプロファイルに遷移するようになります。
aa-logprof
が子プロセスに対するプロファイルを作成し、構築を開始します。これは親プロセスのプロファイルと同じ方法で行われ、親プロセスのイベントは親のプロファイルに、子プロセスのイベントは子のプロファイルにそれぞれ保存されるようになります。 aa-logprof
での質問は、両方をあわせて表示します。このプロファイルは、単独のプログラムを子として実行した場合にも当てはまります。
制限を受けているプログラムが fork() したり他のプログラムを起動したりした場合、 aa-logprof
はそれを検出すると、 fork() したプログラムや他のプログラムに対して適用すべき実行モードを尋ねます。実行モードは継承 (ix) , プロファイル (px , Px) , 無制限 (ux , Ux) , 子プロセス (cx , Cx) , 名前付きプロファイルのほか、実行拒否を設定することもできます。
子プロセス向けのプロファイルが個別に存在する場合は、既定の選択肢はプロファイル (Px) になります。逆に、プロファイルが存在しない場合は継承 (ix) になります。許可の詳細については、 30.7項 「ファイルアクセス許可のアクセスモード」 をお読みください。
プロファイル (px , Px) を選択した場合、子プロセス側のプログラムでは、独自のプロファイルを使用して実行します。この場合、親プロセスから子プロセスに対して環境変数を継承するにあたって、危険性のある変数の内容を削除するかどうかを尋ねます。削除するよう選択した場合は、プロファイル内に Px
が書き込まれ、削除しないように選択した場合は、プロファイル内に px
が書き込まれます。なお、プロファイル実行モードを選択した場合の既定値は Px
です。
無制限実行モードは非推奨であり、そのプログラムに対するプロファイルをどうやっても作成することができず、それ以外の選択肢が存在しない場合にのみ選択すべきものです。無制限実行モードを選択すると、警告メッセージが表示されて確認を求められますので、 Ux
が書き込まれ、削除しないように選択した場合は、プロファイル内に ux
が書き込まれます。なお、無制限実行モードを選択した場合の既定値は Ux
です。
ux
や Ux
の使用は非常に危険です。子プロセスの実行に際して、セキュリティ面でのポリシー強制が一切働かなくなります。
aa-unconfined
コマンドは、お使いのシステムで開いているネットワークポートを調べ、システム内に読み込まれているプロファイルセットと比較を行い、 AppArmor のプロファイルのないネットワークサービスを報告します。このコマンドの実行にあたっては root
の権限が必要となるほか、 AppArmor のプロファイルで制限を受けていない状況下で実行する必要があります。
aa-unconfined
は /proc
ファイルシステムから実行ファイルの情報を取得する仕組みであるため、 root
で実行しなければなりません。また、下記のような競合状態が発生する可能性があります:
コマンドの実行時に削除された実行ファイルがある場合、その扱いを誤ることがあります
netstat(8)
を実行してから後続のチェックを行うまでに、プロセスが終了したような場合、その扱いを誤ることがあります
このプログラムは TCP と UDP を使用するプロセスのみを一覧表示します。その他のプロトコルを利用する通信については無視されます。そのため、フォレンジック用途にはお使いいただけません。検証環境内で、ネットワークにアクセスするプロセスに対してプロファイルを作成する用途にのみお使いください。
aa-notify
は、お使いのデスクトップ環境内に AppArmor の通知を表示することのできる、便利なユーティリティです。 AppArmor のログファイルを直接調査したくなく、代わりにポリシーに違反した通知のみをデスクトップに表示したい場合に有用です。 AppArmor のデスクトップ通知機能を有効化するには、下記のように入力して aa-notify
を実行します:
>
sudo
aa-notify -p -u ユーザ名 --display ディスプレイ番号
ここで、 ユーザ名 には現在ログインしているユーザのユーザ名を、 ディスプレイ番号 には現在使用しているディスプレイのディスプレイ番号 (例: :0
) をそれぞれ指定します。プログラムは裏で動作する仕組みで、拒否イベントが発生するたびに通知が表示されます。
なお、現在使用している X Window のディスプレイ番号は、 $DISPLAY
という環境変数に保存されていますので、 --display $DISPLAY
と入力することで、現在のディスプレイをそのまま使用することができます。
GNOME 内での aa-notify メッセージ
#なお、 -s 日数
というオプションを指定すると、指定した過去日数分の通知概要を表示することができます。 aa-notify
の詳細については、 man 8 aa-notify
で表示されるマニュアルページをお読みください。
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.
内にあります。
下記の一覧には、 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
のように入力して実行すると、この情報を自動的に取得することができます。