Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
この記事では、Linuxのセキュリティを飛躍的に向上させる強制アクセス制御(MAC)の代表的な実装であるSELinuxとAppArmorについて、その基本的な考え方、状態の確認方法、そして「パーミッションは正しいはずなのに動かない」といった困った状況への対処法を解説します。
従来からLinuxで採用されているファイルパーミッションは、任意アクセス制御(DAC:Discretionary Access Control)に分類されます。これは、ファイルの所有者がアクセス権限を自由に設定できるものです。
一方、強制アクセス制御(MAC:Mandatory Access Control)は、システム全体で一元的にセキュリティポリシーを管理し、ユーザーやプロセスがそのポリシーに違反する操作を強制的に制限します。これにより、たとえアプリケーションに脆弱性があったとしても、被害を最小限に抑えることが可能になります。SELinuxとAppArmorは、このMACを実現するための代表的な仕組みです。
SELinux(Security-Enhanced Linux)は、米国国家安全保障局(NSA)が開発したMACの仕組みで、Red Hat系のディストリビューション(RHEL、CentOS、Fedoraなど)で広く採用されています。
SELinuxのポリシーは「ドメイン」と「タイプ」という概念で構成されています。
SELinuxは、あるドメインのプロセスが、特定のタイプのファイルに対して、どのような操作を許可されているかを厳密にチェックします。これにより、ウェブサーバー(例:httpd_t
ドメイン)がウェブサイトのコンテンツ(例:httpd_sys_content_t
タイプ)にはアクセスできるが、システムの重要な設定ファイル(例:etc_t
タイプ)にはアクセスできない、といった制御を行います。
SELinuxの状態を確認するには、sestatus
コマンドを使います。
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allow
Memory protection checking: actual (strict)
Max kernel policy version: 33
重要なのはCurrent mode
の部分です。
一時的にpermissiveモードにするには、setenforce
コマンドを使います。
# 一時的にpermissiveモードにする
$ sudo setenforce 0
# enforcingモードに戻す
$ sudo setenforce 1
# 状態を確認
$ sestatus
Current mode: permissive
永続的に設定を変更するには、/etc/selinux/config
ファイルを編集します。
# /etc/selinux/config の例
# このファイルを編集後、システムを再起動する必要がある
SELINUX=enforcing
SELINUXTYPE=targeted
SELINUXの部分をpermissive
やdisabled
に変更して再起動することで、永続的な設定が反映されます。
アプリケーションがうまく動かない時、ファイルパーミッションは正しいのにSELinuxが原因でアクセスが拒否されている場合があります。
SELinuxによる拒否ログは/var/log/audit/audit.log
に記録されますが、近年ではjournalctl
で確認することも増えています。特に、AVC
というキーワードは「Access Vector
Cache」の略で、アクセス拒否を示す重要なログです。
# auditdサービスが動いている場合
$ sudo grep "denied" /var/log/audit/audit.log
# ログ例:httpdが秘密鍵にアクセスしようとして拒否されたケース
type=AVC msg=audit(1677696000.000:123): avc: denied { read } for pid=1234 comm="httpd" name="secret.key" scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
# systemdジャーナルから確認する場合(推奨)
$ sudo journalctl | grep "AVC"
setroubleshoot
を活用するRed Hat系の環境では、setroubleshoot-server
パッケージをインストールしておくと、ログの拒否メッセージを分かりやすく解析してくれます。sealert
コマンドで、人間が理解しやすい形式に変換して表示できます。
# setroubleshoot-serverパッケージのインストール後、
# auditdログの内容を解析して表示
$ sudo sealert -a /var/log/audit/audit.log
このコマンドは、以下のような形式で原因と解決策を具体的に提示してくれるため、非常に強力なツールです。
SELinux is preventing httpd from reading the file /home/user/secret.key.
***** Plugin catchall (100. confidence) suggests **************************
If you believe that httpd should be allowed to read secret.key,
then you should use one of the following commands to create a new policy:
# semanage fcontext -a -t httpd_sys_content_t "/home/user/secret.key"
# restorecon -v "/home/user/secret.key"
ファイルやディレクトリのセキュリティコンテキストはls -Z
コマンドで確認できます。
$ ls -Z /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
ウェブサーバーがアクセスすべきファイルがhttpd_sys_content_t
以外のコンテキストになっている場合、chcon
コマンドで一時的に変更できます。
# /var/www/html/test.html のコンテキストをhttpd_sys_content_tに変更
$ sudo chcon -t httpd_sys_content_t /var/www/html/test.html
永続的にコンテキストを設定するには、semanage fcontext
コマンドとrestorecon
コマンドを使います。
# /home/user/mywebをhttpd_sys_content_tとして永続的に設定
$ sudo semanage fcontext -a -t httpd_sys_content_t "/home/user/myweb(/.*)?"
# 設定をファイルシステムに適用
$ sudo restorecon -R -v /home/user/myweb
AppArmorは、SELinuxと同様のMACを実現する仕組みで、Debian系ディストリビューション(Ubuntu、openSUSEなど)で広く採用されています。SELinuxがプロセスとファイルに「ラベル」を付けて制御するのに対し、AppArmorはアプリケーションごとにプロファイルと呼ばれるルールを定義し、そのプロファイルに基づいて動作を制限します。
AppArmorのプロファイルは、SELinuxよりも人間が理解しやすいシンプルな構文で記述されています。
AppArmorの状態はaa-status
コマンドで確認できます。
$ sudo aa-status
apparmor module is loaded.
24 profiles are loaded.
13 profiles are in enforce mode.
11 profiles are in complain mode.
1 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined.
ここで重要なのは、enforce mode
とcomplain mode
です。
プロファイルをenforceモードからcomplainモードに変更するにはaa-complain
、enforceモードに戻すにはaa-enforce
を使います。
# プロファイルをcomplainモードに変更
$ sudo aa-complain /etc/apparmor.d/usr.sbin.httpd
# プロファイルをenforceモードに戻す
$ sudo aa-enforce /etc/apparmor.d/usr.sbin.httpd
プロファイルを完全に無効化するには、aa-disable
を使います。
$ sudo aa-disable /etc/apparmor.d/usr.sbin.httpd
AppArmorが原因でアプリケーションが動かない場合、ログを確認してプロファイルを修正します。
AppArmorによる拒否ログは、システムログ(dmesg
やjournalctl
)に記録されます。apparmor
というキーワードで検索すると見つけやすいでしょう。
# journalctlでログを確認
$ sudo journalctl | grep "apparmor"
# ログ例:apache2がconfig.phpにアクセスしようとして拒否されたケース
audit: type=1400 audit(1677696000.000:123): apparmor="DENIED" operation="open" profile="/usr/sbin/apache2" name="/var/www/html/private/config.php" pid=1234 comm="apache2" requested_mask="r" denied_mask="r" fsuid=33 ouid=33
AppArmorには、アプリケーションを動かしながらアクセスパターンを学習し、プロファイルを自動生成・修正する便利なツールがあります。
aa-genprof
: 新しいプロファイルを生成するツールです。complainモードでアプリケーションを実行し、拒否ログを基にプロファイルを対話形式で作成できます。aa-logprof
: 既存のプロファイルを改善するためのツールです。こちらも対話形式で拒否ログを解析し、プロファイルに新しいルールを追加するのに役立ちます。以下は、aa-logprof
の対話画面の例です。拒否された操作に対して、許可するかどうかを尋ねてきます。
# 既存のプロファイルを修正
$ sudo aa-logprof
Found 1 new 'DENIED' access in the log.
Profile: /usr/sbin/apache2
File: /var/www/html/private/config.php
Access: r
...
Allow /var/www/html/private/config.php r? (A)llow / (D)eny / (I)gnore / (G)o
項目 | SELinux | AppArmor |
---|---|---|
基本思想 | ラベルベース(ドメインとタイプ) | パスベース(プロファイル) |
ポリシー | システム全体に適用される | アプリケーションごとに適用される |
設定方法 | 細かく、複雑になりがち | 比較的シンプルで理解しやすい |
主要OS | Red Hat系(RHEL, CentOS, Fedoraなど) | Debian系(Ubuntu, openSUSEなど) |
トラブル対応 | ログ解析、コンテキスト変更、setroubleshoot |
ログ解析、プロファイル修正ツール(aa-genprof , aa-logprof ) |
SELinuxはより強力で細かい制御が可能ですが、設定が複雑になりがちです。一方、AppArmorはアプリケーション単位での制御が中心で、比較的直感的に扱えます。どちらを使うか迷った場合は、利用しているディストリビューションに標準で提供されている方を使用するのが一般的な考え方です。
この記事では、Linuxのセキュリティを強化する強制アクセス制御(MAC)の代表的な実装であるSELinuxとAppArmorの基礎知識と、トラブルに遭遇した際の具体的な対処法を解説しました。
sestatus
やls -Z
、setenforce
、chcon
コマンドを使いこなすことが重要です。また、setroubleshoot-server
を活用するとトラブルの原因を素早く特定できます。aa-status
やaa-complain
、aa-enforce
などのコマンドでプロファイルを管理します。aa-genprof
やaa-logprof
といったツールでプロファイルを簡単に作成・修正できるのが強みです。これらの仕組みは、Linuxのセキュリティを飛躍的に高める一方で、慣れないうちは予期せぬ動作でシステム管理者を悩ませることがあります。本記事で解説した対処法を参考に、安全なシステム運用を目指してください。
この記事がSELinuxとAppArmorについて理解を深める一助となれば幸いです。ご覧いただきありがとうございました。