Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
Linuxシステムのセキュリティをさらに強固にするために、SELinuxとAppArmorは不可欠な存在です。第40回ではこれらの概要を解説しましたが、今回は一歩踏み込んで、実際の運用で直面するであろうポリシーの作成方法や、トラブル発生時の効果的な対処法に焦点を当てて解説します。
この記事では、SELinuxとAppArmorをより深く理解し、あなたのシステムをより安全に運用するための具体的なノウハウを習得できます。なお、本記事の例はSELinuxが標準であるRHEL/CentOS系、AppArmorが標準であるUbuntu系を想定しています。
SELinuxは、すべてのプロセスやファイルに「コンテキスト」と呼ばれるラベルを付与し、そのコンテキストに基づいてアクセスを厳密に制御する仕組みです。この強固な制御は、時には予期せぬアクセス拒否を引き起こすことがあります。
SELinuxのルールは通常、ポリシーモジュールという単位で管理されます。既存のポリシーを修正したり、独自のルールを追加したりする際には、semanage
コマンドやaudit2allow
コマンドが役立ちます。
semanage
コマンドは、SELinuxのポリシー管理を行うための主要なコマンドです。たとえば、特定のディレクトリのコンテキストを変更したい場合は、以下のように使います。
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/mydata(/.*)?"
sudo restorecon -Rv /var/www/mydata
semanage fcontext -a
: ファイルコンテキストルールを追加します。-t
: ターゲットとなるタイプ(コンテキスト)を指定します。ここでは、Webサーバーがアクセスするファイルを示すhttpd_sys_content_t
を指定しています。restorecon -Rv
: 変更したコンテキストルールを再帰的に適用します。audit2allow
の活用SELinuxが原因でアプリケーションが動作しない場合、最も一般的な原因はアクセス拒否です。audit.log
には、拒否されたアクセスに関する詳細な情報が記録されています。
audit2allow
は、このaudit.log
を解析し、拒否されたアクセスを許可するためのポリシーモジュールを自動生成する便利なツールです。
例えば、audit.log
に以下の拒否ログが出力されたとします。
type=AVC msg=audit(1651234567.890:123): avc: denied { read } for pid=1234 comm="httpd" name="secret.txt" dev="dm-0" ino=5678 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
このログを基にポリシーを生成するには、以下の手順を実行します。
audit.log
から関連ログを抽出します。
grep "denied" /var/log/audit/audit.log | audit2allow -M myapp
grep "denied"
: audit.log
からアクセス拒否(denied
)のログを絞り込みます。audit2allow -M myapp
: 抽出したログから、myapp.te
(タイプエンフォースメント)とmyapp.mod
(ポリシーモジュール)というファイルを作成します。これらのファイルに加えて、コンパイル済みのmyapp.pp
(ポリシーパッケージ)も生成されます。生成されたmyapp.te
ファイルの内容を確認します。
cat myapp.te
audit2allow
が生成するルールは必要以上に広い権限を許可してしまうリスクもあるため、生成されたファイルを必ずレビューしてから適用するようにしましょう。ポリシーモジュールをコンパイルし、システムに適用します。
sudo semodule -i myapp.pp
semodule -i
: ポリシーパッケージ(.pp
ファイル)をインストールします。audit2allow
を使用することで、手動で複雑なルールを記述する手間を省き、迅速に問題を解決できます。
また、一時的にSELinuxを無効化して挙動を確認する場合は、setenforce 0
でPermissiveモードに切り替え可能です。このモードではアクセスを拒否せず、ログに記録するだけになります。ただし、これはあくまで一時的な検証のために利用し、恒久的に無効化するのは推奨されません。
AppArmorは、特定のアプリケーションに対して、アクセスを許可するプロファイルを定義する仕組みです。プロファイルは、ファイルパスやネットワークアクセスなど、アプリケーションの挙動を詳細に記述します。
AppArmorのプロファイルは、/etc/apparmor.d/
ディレクトリに配置されるテキストファイルです。プロファイルは、強制モード(enforce)と学習モード(complain)のいずれかで動作します。
プロファイルをcomplain
モードに切り替えるには、aa-complain
コマンドを使用します。
sudo aa-complain /usr/bin/nginx
このコマンドは、実行ファイルのパスだけでなく、プロファイルファイル名(例:/etc/apparmor.d/usr.sbin.apache2
)を指定することも可能です。
逆に、enforce
モードに切り替えるにはaa-enforce
コマンドを使用します。
sudo aa-enforce /usr/bin/nginx
dmesg
とaa-logprof
の活用AppArmorが原因で問題が発生した場合、ログはdmesg
コマンドで確認できます。
sudo dmesg | grep "apparmor"
環境によっては、dmesg
以外にも/var/log/syslog
や/var/log/kern.log
にAppArmorのログが出力されることがありますので、併せて確認すると良いでしょう。
ログにアクセス拒否の情報(DENIED
)が出力されている場合は、aa-logprof
コマンドが役立ちます。aa-logprof
は、ログを分析し、インタラクティブにプロファイルの修正案を提示してくれるツールです。
sudo aa-logprof
aa-logprof
を実行すると、新しいアクセス試行に関するログが表示され、「許可」「拒否」「継承」などの選択肢を尋ねられます。これにより、手動でプロファイルを編集するよりも簡単に、適切なルールを追加できます。aa-logprof
も自動でルールを生成するため、不必要な権限まで許可してしまわないよう、提案内容を慎重に確認することが重要です。
SELinuxとAppArmorは、それぞれ異なるアプローチでシステムを保護する強力なツールです。
比較項目 | SELinux | AppArmor |
---|---|---|
制御対象 | プロセスとファイルのコンテキスト | アプリケーション単位 |
ポリシー形式 | タイプエンフォースメント(.te )ファイル |
プロファイル(テキストファイル) |
トラブルシューティングツール | audit2allow , semanage |
aa-complain , aa-logprof |
ポリシー適用 | semodule コマンド |
aa-enforce /aa-complain コマンド |
この記事が、あなたのSELinuxとAppArmorに関する理解を深める一助となれば幸いです。ご覧いただきありがとうございました。
次回は、セキュリティの基礎を押さえた上で「Web・DBサービスのチューニング・高速化Tips」を取り上げ、より快適なシステム運用を目指します。