SELinux と AppArmor 完全ガイド
目次
- はじめに
- 強制アクセス制御(MAC)の基礎
- SELinux 詳細解説
- AppArmor 詳細解説
- SELinux vs AppArmor 比較
- 実践シナリオ
- トラブルシューティング総合ガイド
- ベストプラクティス
- 参考文献
1. はじめに
SELinux(Security-Enhanced Linux)と AppArmor は、Linux カーネルに組み込まれた強制アクセス制御(MAC: Mandatory Access Control)セキュリティモジュールである。従来の任意アクセス制御(DAC: Discretionary Access Control)では、ファイルの所有者がアクセス権を管理するが、MAC ではシステム管理者がセキュリティポリシーを一元的に管理し、プロセスの権限をより厳密に制御する。
対象読者
- Linux システム管理者
- セキュリティエンジニア
- SRE / DevOps エンジニア
2. 強制アクセス制御(MAC)の基礎
2.1 DAC と MAC の違い
| 特性 | DAC(任意アクセス制御) | MAC(強制アクセス制御) |
|---|
| 制御主体 | リソースの所有者 | システムポリシー |
| 権限変更 | 所有者が自由に変更可能 | 管理者のみ変更可能 |
| root の権限 | 無制限 | ポリシーにより制限可能 |
| 粒度 | ユーザー/グループ/その他 | プロセス/ファイル/ポート等 |
| 実装例 | chmod, chown | SELinux, AppArmor |
2.2 Linux Security Modules (LSM)
LSM は Linux カーネルのフレームワークで、SELinux や AppArmor などのセキュリティモジュールをカーネルにフックする仕組みを提供する。
$ cat /sys/kernel/security/lsm
lockdown,capability,landlock,yama,apparmor
$ grep -i "config_security" /boot/config-$(uname -r) | head -20
CONFIG_SECURITY=y
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_APPARMOR=y
3. SELinux 詳細解説
3.1 SELinux の概念
SELinux は NSA(米国国家安全保障局)が開発した MAC 実装であり、主に RHEL/CentOS/Fedora 系ディストリビューションで使用される。
SELinux の基本原則
- デフォルト拒否: 明示的に許可されていないアクセスは全て拒否
- 最小権限: プロセスに必要最小限の権限のみを付与
- タイプエンフォースメント: プロセスのタイプ(ドメイン)がアクセスできるリソースのタイプを制御
3.2 コンテキストとラベル
SELinux は全てのプロセス、ファイル、ポートにセキュリティコンテキスト(ラベル)を付与する。
コンテキストの形式
user:role:type:level
| 要素 | 説明 | 例 |
|---|
| user | SELinux ユーザー | system_u, unconfined_u |
| role | SELinux ロール | system_r, object_r |
| type | SELinux タイプ(最も重要) | httpd_t, httpd_sys_content_t |
| level | MLS/MCS レベル | s0, s0:c0.c1023 |
コンテキストの確認
$ ls -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
$ ps auxZ | grep httpd
system_u:system_r:httpd_t:s0 root 1234 0.0 0.5 ... /usr/sbin/httpd
$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ sudo semanage port -l | grep http
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
$ cat /proc/self/attr/current
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
コンテキストの変更
$ sudo chcon -t httpd_sys_content_t /var/www/html/newfile.html
$ sudo chcon -R -t httpd_sys_content_t /var/www/html/
$ sudo restorecon -v /var/www/html/newfile.html
$ sudo restorecon -Rv /var/www/html/
$ matchpathcon /var/www/html
/var/www/html system_u:object_r:httpd_sys_content_t:s0
3.3 SELinux のモード
| モード | 説明 | 用途 |
|---|
| Enforcing | ポリシーを強制実行し、違反を拒否・ログ | 本番環境 |
| Permissive | ポリシー違反をログのみ記録(拒否しない) | デバッグ・ポリシー開発 |
| Disabled | SELinux を完全に無効化 | 非推奨 |
$ getenforce
Enforcing
$ 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: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
$ sudo setenforce 0
$ sudo setenforce 1
$ sudo vi /etc/selinux/config
$ sudo touch /.autorelabel
$ sudo reboot
特定のドメインのみ Permissive にする
$ sudo semanage permissive -a httpd_t
$ sudo semanage permissive -l
$ sudo semanage permissive -d httpd_t
3.4 SELinux のタイプとドメイン
タイプエンフォースメント(TE)は SELinux の中核メカニズムである。
主要なタイプの例
| タイプ | 説明 |
|---|
| httpd_t | Apache/nginx プロセスのドメイン |
| httpd_sys_content_t | Web コンテンツ(読み取り専用) |
| httpd_sys_rw_content_t | Web コンテンツ(読み書き可能) |
| httpd_sys_script_exec_t | CGI スクリプト |
| mysqld_t | MySQL/MariaDB プロセスのドメイン |
| mysqld_db_t | MySQL データベースファイル |
| sshd_t | SSH デーモンのドメイン |
| user_home_t | ユーザーのホームディレクトリ |
| tmp_t | /tmp ディレクトリ |
| var_log_t | ログファイル |
タイプ遷移
$ sudo sesearch -T -s init_t -t httpd_exec_t
type_transition init_t httpd_exec_t : process httpd_t;
$ sudo sesearch -A -s httpd_t -t httpd_sys_content_t
allow httpd_t httpd_sys_content_t : file { getattr ioctl lock open read };
allow httpd_t httpd_sys_content_t : dir { getattr ioctl lock open read search };
3.5 ロールとユーザー
SELinux ユーザー
$ sudo semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
$ sudo semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
$ sudo semanage login -a -s user_u webuser
SELinux ロール
| ロール | 説明 | 許可されるドメイン |
|---|
| unconfined_r | 制限なし | unconfined_t 等 |
| system_r | システムプロセス | httpd_t, sshd_t 等 |
| sysadm_r | システム管理者 | sysadm_t |
| staff_r | スタッフ | staff_t |
| user_r | 一般ユーザー | user_t |
| guest_r | ゲスト | guest_t |
3.6 ブーリアン値の管理
SELinux ブーリアンは、ポリシーの特定の機能をオン/オフするスイッチである。
$ sudo getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
...
httpd_can_network_connect --> off
httpd_can_network_connect_db --> off
httpd_can_sendmail --> off
httpd_enable_cgi --> on
httpd_enable_homedirs --> off
...
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> off
$ sudo setsebool httpd_can_network_connect on
$ sudo setsebool -P httpd_can_network_connect on
$ getsebool -a | grep httpd
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_network_connect --> on
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
$ sudo semanage boolean -l | grep httpd_can_network
httpd_can_network_connect (on , on) Allow httpd to can network connect
httpd_can_network_connect_db (off , off) Allow httpd to can network connect db
よく使用されるブーリアン
| ブーリアン | デフォルト | 説明 |
|---|
| httpd_can_network_connect | off | httpd がネットワーク接続を許可 |
| httpd_can_network_connect_db | off | httpd がデータベースへの接続を許可 |
| httpd_can_sendmail | off | httpd がメール送信を許可 |
| httpd_enable_homedirs | off | httpd がユーザーのホームディレクトリにアクセス |
| httpd_use_nfs | off | httpd が NFS マウントにアクセス |
| ftpd_anon_write | off | FTP の匿名書き込みを許可 |
| samba_enable_home_dirs | off | Samba がホームディレクトリを共有 |
| virt_use_nfs | off | 仮想化がNFSを使用 |
3.7 semanage コマンド
semanage は SELinux ポリシーの管理コマンドである。
ファイルコンテキストの管理
$ sudo semanage fcontext -l | grep "/var/www"
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/var/www/cgi-bin(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0
$ sudo semanage fcontext -a -t httpd_sys_content_t "/opt/myapp/www(/.*)?"
$ sudo restorecon -Rv /opt/myapp/www/
$ sudo semanage fcontext -m -t httpd_sys_rw_content_t "/opt/myapp/www/uploads(/.*)?"
$ sudo restorecon -Rv /opt/myapp/www/uploads/
$ sudo semanage fcontext -d "/opt/myapp/www(/.*)?"
ポートの管理
$ sudo semanage port -l | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
$ sudo semanage port -a -t http_port_t -p tcp 8090
$ sudo semanage port -m -t http_port_t -p tcp 8090
$ sudo semanage port -d -t http_port_t -p tcp 8090
ネットワークインターフェースの管理
$ sudo semanage interface -l
$ sudo semanage interface -a -t netif_t eth0
3.8 ポリシーモジュール管理
$ sudo semodule -l
abrt 1.4.1
accountsd 1.1.0
acct 1.6.0
...
$ sudo semodule -d httpd
$ sudo semodule -e httpd
$ sudo semodule -r mymodule
$ sudo semodule -i mymodule.pp
$ sudo semodule -B
カスタムポリシーモジュールの作成
$ sudo ausearch -m AVC -ts recent | audit2allow -M mymodule
$ cat mymodule.te
module mymodule 1.0;
require {
type httpd_t;
type var_t;
class file { read open getattr };
}
allow httpd_t var_t:file { read open getattr };
$ sudo semodule -i mymodule.pp
3.9 SELinux 拒否のトラブルシューティング
AVC(Access Vector Cache)ログの確認
$ sudo ausearch -m AVC -ts today
----
time->Thu Apr 10 10:00:00 2026
type=AVC msg=audit(1712739600.123:456): avc: denied { read } for pid=1234 comm="httpd" name="config.php" dev="sda1" ino=789012 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
$ sudo ausearch -m AVC -ts today | audit2why
type=AVC msg=audit(1712739600.123:456): avc: denied { read } for pid=1234 comm="httpd" name="config.php" dev="sda1" ino=789012 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
$ sudo sealert -a /var/log/audit/audit.log
$ sudo ausearch -m AVC --start recent
$ sudo ausearch -m AVC -c httpd
一般的な対処フロー
$ sudo ausearch -m AVC -ts today
$ sudo ausearch -m AVC -ts today | audit2why
$ sudo restorecon -Rv /path/to/files
$ sudo setsebool -P httpd_can_network_connect on
$ sudo semanage port -a -t http_port_t -p tcp 8090
$ sudo ausearch -m AVC -ts today | audit2allow -M mypolicy
$ sudo semodule -i mypolicy.pp
$ sudo ausearch -m AVC -ts recent
4. AppArmor 詳細解説
4.1 AppArmor の概念
AppArmor はパス名ベースの MAC 実装であり、主に Debian/Ubuntu/SUSE 系ディストリビューションで使用される。SELinux がラベルベースであるのに対し、AppArmor はファイルパスに基づいてアクセス制御を行う。
$ sudo apparmor_status
apparmor module is loaded.
56 profiles are loaded.
56 profiles are in enforce mode.
/snap/snapd/14978/usr/lib/snapd/snap-confine
/usr/bin/evince
/usr/bin/man
/usr/sbin/cups-browsed
/usr/sbin/cupsd
/usr/sbin/mysqld
/usr/sbin/ntpd
...
0 profiles are in complain mode.
0 processes have profiles defined.
0 processes are in enforce mode.
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
$ sudo aa-status
4.2 プロファイルとモード
プロファイルのモード
| モード | 説明 | 用途 |
|---|
| Enforce | プロファイルのルールを強制し、違反を拒否・ログ | 本番環境 |
| Complain | 違反をログのみ記録(拒否しない) | プロファイル開発・テスト |
| Unconfined | プロファイルが読み込まれていない | 制限なし |
プロファイルの配置
/etc/apparmor.d/
├── abstractions/
│ ├── base
│ ├── nameservice
│ └── ...
├── cache/
├── force-complain/
├── disable/
├── local/
├── tunables/
│ ├── global
│ └── home
├── usr.sbin.mysqld
├── usr.sbin.ntpd
├── usr.sbin.sshd
└── usr.lib.apache2.mpm-prefork.apache2
プロファイルの基本構造
/usr/sbin/nginx {
network inet stream,
network inet6 stream,
capability net_bind_service,
capability setuid,
capability setgid,
capability dac_override,
/usr/sbin/nginx mr,
/etc/nginx/** r,
/etc/nginx/nginx.conf r,
/var/log/nginx/** rw,
/var/log/nginx/ r,
/var/www/** r,
/var/www/html/** r,
/run/nginx.pid rw,
/run/nginx/ rw,
/tmp/** rw,
/var/lib/nginx/** rw,
/etc/ssl/certs/** r,
/etc/ssl/private/** r,
/etc/letsencrypt/** r,
}
アクセス権限の記号
| 記号 | 説明 |
|---|
| r | 読み取り |
| w | 書き込み |
| a | 追記 |
| k | ファイルロック |
| l | リンク |
| m | メモリマップ(実行可能) |
| x | 実行(汎用) |
| ix | 実行(現在のプロファイルを継承) |
| cx | 実行(子プロファイルに遷移) |
| px | 実行(指定プロファイルに遷移) |
| ux | 実行(制限なし) |
| Ux | 実行(制限なし、環境をクリーン化) |
| Px | 実行(指定プロファイルに遷移、環境をクリーン化) |
4.3 プロファイル管理コマンド
$ sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
Setting /etc/apparmor.d/usr.sbin.nginx to enforce mode.
$ sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
Setting /etc/apparmor.d/usr.sbin.nginx to complain mode.
$ sudo aa-enforce /usr/sbin/nginx
$ sudo aa-complain /usr/sbin/nginx
$ sudo aa-disable /etc/apparmor.d/usr.sbin.nginx
$ sudo ln -s /etc/apparmor.d/usr.sbin.nginx /etc/apparmor.d/disable/
$ sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
$ sudo systemctl reload apparmor
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.nginx
4.4 カスタムプロファイルの作成
aa-genprof(自動プロファイル生成)
$ sudo aa-genprof /usr/local/bin/myapp
Writing updated profile for /usr/local/bin/myapp.
Setting /usr/local/bin/myapp to complain mode.
Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles
Profiling: /usr/local/bin/myapp
Please start the application to be profiled in
another window and exercise its functionality now.
Once completed, select the "Scan" option below
for AppArmor to detect the events.
[(S)can system log for AppArmor events] / (F)inish
$ /usr/local/bin/myapp
aa-logprof(ログからプロファイルを更新)
$ sudo aa-logprof
Reading log entries from /var/log/syslog.
Updating AppArmor profiles in /etc/apparmor.d.
Profile: /usr/sbin/nginx
Path: /var/cache/nginx/proxy_temp/
New Mode: rw
[1 -
2 - /var/cache/nginx/proxy_temp/ rw,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
手動でのプロファイル作成
/usr/local/bin/myapp {
/usr/local/bin/myapp mr,
/etc/myapp/ r,
/etc/myapp/** r,
/var/lib/myapp/ rw,
/var/lib/myapp/** rw,
/var/log/myapp/ rw,
/var/log/myapp/** rw,
/run/myapp.pid rw,
/tmp/myapp-* rw,
network inet stream,
network inet dgram,
capability net_bind_service,
signal send set=(term, kill) peer=/usr/local/bin/myapp,
/usr/bin/python3 cx -> myapp_python,
profile myapp_python {
/usr/bin/python3 mr,
/usr/local/lib/python3/myapp/** r,
}
}
$ sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.myapp
4.5 AppArmor のトラブルシューティング
ログの確認
$ sudo dmesg | grep -i apparmor
[12345.678901] audit: type=1400 audit(1712739600.123:456): apparmor="DENIED" operation="open" profile="/usr/sbin/nginx" name="/var/www/custom/index.html" pid=1234 comm="nginx" requested_mask="r" denied_mask="r" fsuid=33 ouid=0
$ sudo journalctl -k | grep -i apparmor
$ sudo ausearch -m APPARMOR
問題の切り分け
$ sudo aa-complain /usr/sbin/nginx
$ sudo dmesg | grep -i "apparmor.*ALLOWED"
$ sudo aa-logprof
$ sudo aa-enforce /usr/sbin/nginx
5. SELinux vs AppArmor 比較
5.1 機能比較
| 特性 | SELinux | AppArmor |
|---|
| アクセス制御モデル | ラベルベース(タイプエンフォースメント) | パスベース |
| 主な対象ディストリビューション | RHEL/CentOS/Fedora | Debian/Ubuntu/SUSE |
| 粒度 | 非常に細かい | 中程度 |
| 学習曲線 | 急 | 緩やか |
| MLS/MCS サポート | 完全サポート | 限定的 |
| ネットワーク制御 | ポートラベリング | ネットワークルール |
| ファイル移動時の動作 | ラベルがファイルに付随 | パスが変わると制御が変わる |
| ポリシーの複雑さ | 高い | 低い |
| パフォーマンスへの影響 | わずかに大きい | わずかに小さい |
| デフォルトポリシー | targeted(主要サービスのみ制限) | 一部のプロファイルのみ |
5.2 選択基準
| 基準 | SELinux を選ぶ場合 | AppArmor を選ぶ場合 |
|---|
| ディストリビューション | RHEL/CentOS/Fedora | Ubuntu/Debian/SUSE |
| セキュリティ要件 | 非常に高い(政府・軍事等) | 中~高程度 |
| 管理の容易さ | 専門知識があるチーム | より少ないスキルセット |
| カスタムポリシー | 複雑なポリシーが必要 | シンプルなポリシーで十分 |
| コンプライアンス | DISA STIG 等の要件 | CIS Benchmark 等 |
5.3 操作コマンド比較
| 操作 | SELinux | AppArmor |
|---|
| 状態確認 | sestatus, getenforce | aa-status, apparmor_status |
| 強制モードに設定 | setenforce 1 | aa-enforce <profile> |
| 許容モードに設定 | setenforce 0 | aa-complain <profile> |
| 無効化 | /etc/selinux/config | aa-disable <profile> |
| ファイルコンテキスト確認 | ls -Z | N/A(パスベース) |
| ファイルコンテキスト変更 | chcon, semanage fcontext | N/A |
| コンテキスト復元 | restorecon | N/A |
| ポリシー自動生成 | audit2allow | aa-genprof, aa-logprof |
| ブーリアン管理 | getsebool, setsebool | N/A |
| ログ確認 | ausearch -m AVC | dmesg | grep apparmor |
| ログ分析 | audit2why, sealert | aa-logprof |
6. 実践シナリオ
6.1 Web サーバーの SELinux 設定
$ sudo semanage port -a -t http_port_t -p tcp 8080
$ sudo semanage fcontext -a -t httpd_sys_content_t "/opt/website(/.*)?"
$ sudo restorecon -Rv /opt/website/
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/opt/website/uploads(/.*)?"
$ sudo restorecon -Rv /opt/website/uploads/
$ sudo setsebool -P httpd_can_network_connect on
$ sudo setsebool -P httpd_can_network_connect_db on
$ sudo setsebool -P httpd_use_nfs on
6.2 Web サーバーの AppArmor 設定
/usr/sbin/nginx {
capability net_bind_service,
capability setuid,
capability setgid,
capability dac_override,
network inet stream,
network inet6 stream,
/usr/sbin/nginx mr,
/etc/nginx/** r,
/var/log/nginx/** rw,
/var/www/** r,
/opt/website/** r,
/opt/website/uploads/** rw,
/run/nginx.pid rw,
/var/lib/nginx/** rw,
/proc/*/io r,
}
6.3 カスタムアプリケーションのプロファイル作成
$ sudo semanage permissive -a myapp_t
$ sudo ausearch -m AVC -c myapp | audit2allow -M myapp_policy
$ cat myapp_policy.te
$ sudo semodule -i myapp_policy.pp
$ sudo semanage permissive -d myapp_t
$ sudo aa-genprof /usr/local/bin/myapp
$ sudo vi /etc/apparmor.d/usr.local.bin.myapp
$ sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.myapp
7. トラブルシューティング総合ガイド
7.1 SELinux トラブルシューティングフローチャート
アプリケーションが動作しない
│
├─ getenforce で確認
│ └─ Enforcing の場合 → ausearch -m AVC で拒否を確認
│ │
│ ├─ ファイルコンテキストの問題
│ │ └─ restorecon -Rv / semanage fcontext
│ │
│ ├─ ブーリアンの問題
│ │ └─ setsebool -P
│ │
│ ├─ ポートの問題
│ │ └─ semanage port -a
│ │
│ └─ その他
│ └─ audit2allow でカスタムポリシー作成
│
└─ Permissive / Disabled の場合
└─ SELinux 以外の問題
7.2 共通の問題パターン
| 症状 | SELinux での対処 | AppArmor での対処 |
|---|
| ファイルが読めない | restorecon または semanage fcontext | プロファイルにパスを追加 |
| ポートにバインドできない | semanage port -a | プロファイルに network ルールを追加 |
| 他のサービスに接続できない | setsebool -P | プロファイルに network ルールを追加 |
| ファイルに書き込めない | httpd_sys_rw_content_t に変更 | プロファイルに w 権限を追加 |
| CGI が実行できない | httpd_sys_script_exec_t に変更 | プロファイルに ix 権限を追加 |
8. ベストプラクティス
8.1 一般的な原則
- MAC を無効にしない: SELinux や AppArmor を無効にせず、問題を適切にトラブルシューティングする
- 段階的な導入: まず Permissive/Complain モードで動作を確認してから Enforcing/Enforce に移行
- 最小権限: 必要最小限のアクセス権のみを付与
- ログの監視: 拒否ログを定期的に確認し、セキュリティイベントを把握
- ポリシーの文書化: カスタムポリシーの変更理由を文書化
8.2 SELinux のベストプラクティス
$ sudo setenforce 1
$ grep SELINUX=enforcing /etc/selinux/config
$ sudo yum install setroubleshoot-server
$ sudo ausearch -m AVC -ts today --raw | aureport -a
$ sudo semanage permissive -l
$ sudo restorecon -Rvn /
8.3 AppArmor のベストプラクティス
$ sudo aa-enforce /etc/apparmor.d/*
9. 参考文献
- SELinux Project Wiki: https://selinuxproject.org/
- Red Hat SELinux Guide: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/
- SELinux Notebook: https://github.com/SELinuxProject/selinux-notebook
- AppArmor Wiki: https://gitlab.com/apparmor/apparmor/-/wikis/home
- Ubuntu AppArmor Guide: https://ubuntu.com/server/docs/apparmor
- SUSE AppArmor Guide: https://documentation.suse.com/sles/15-SP4/html/SLES-all/part-apparmor.html
- CIS Benchmarks: https://www.cisecurity.org/cis-benchmarks
- DISA STIG: https://public.cyber.mil/stigs/
- Arch Linux Wiki - SELinux: https://wiki.archlinux.org/title/SELinux
- Gentoo Wiki - SELinux: https://wiki.gentoo.org/wiki/SELinux
本ドキュメントは 2026年4月時点の情報に基づいて作成されています。