サーバー管理の現場でSELinuxを有効にしていると、こういった問題に頭を抱えることがあります。
ただ、SELinuxを無効化(disabled)してしまうのは最終手段です。
正しいポリシー設定さえ覚えれば、SELinuxを有効にしたままサービスをスムーズに動かせます。
そのために必要なのが
semanage コマンドです。この記事では、semanageコマンドの基本的な使い方から、ファイルコンテキスト・ポート・Booleanの実践的な設定手順を解説します。
RHEL 9.4 / AlmaLinux 9 / Rocky Linux 9で動作確認済みです。
この記事のポイント
・semanageはSELinuxポリシーを永続的に変更できる唯一のコマンド
・fcontext/port/booleanの3サブコマンドが現場で特に重要
・AVC deniedはaudit2allowで解析してから対処するのが鉄則
・chconは再起動で消えるため本番環境での使用は禁止
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
semanageコマンドとは何か?
SELinuxは「ファイル・プロセス・ポート」すべてにセキュリティラベル(コンテキスト)を付けて、アクセス制御を行います。このラベルのルールを「ポリシー」と呼びます。
semanage(SELinux Policy Management)は、このポリシーを永続的に管理するためのコマンドです。よく似たコマンドに
chcon がありますが、両者は根本的に異なります。| コマンド | 変更の永続性 | 用途 |
|---|---|---|
chcon |
一時的(restoreconで上書きされる) | テスト・動作確認のみ |
semanage |
永続的(再起動後も維持) | 本番環境での設定変更 |
chcon だけ使ってコンテキストを変更した場合、restorecon -R / を実行した瞬間に変更が消えます。必ずsemanageで永続化してから、restoreconで適用するという手順を守ってください。
インストールと事前確認
1. パッケージのインストール
RHEL系ではデフォルトで入っていない場合があります。# semanageがインストールされているか確認 which semanage # インストールされていない場合 dnf install policycoreutils-python-utils
2. SELinuxの状態確認
# SELinuxの動作状態を確認 getenforce # Enforcing: 有効(アクセス拒否が実行される) # Permissive: 有効(ログのみ、拒否は実行されない) # Disabled: 無効 # 詳細な状態確認 sestatus
[root@web01.example.*** ~]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux mount point: /sys/fs/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
Loaded policy name: targeted が表示されていれば、一般的なRHEL環境のSELinux設定です。fcontext:ファイルコンテキストを管理する
SELinuxのファイルアクセス制御は「ファイルコンテキスト(セキュリティラベル)」で行います。たとえばApacheがWebコンテンツを読めるのは、ファイルに
httpd_sys_content_t というコンテキストが付いているからです。1. 現在のコンテキストを確認する
# ファイルのコンテキストを確認(-Zオプション) ls -Z /var/www/html/ # 出力例 # -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html # ディレクトリのコンテキスト確認 ls -Zd /var/www/html/ # drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
2. カスタムディレクトリにコンテキストを設定する
/data/web/ 以下にWebコンテンツを置きたい場合の手順です。# Step1: semanageでポリシーを永続登録する # -a: 追加 -t: コンテキストタイプ -e: 既存パスのポリシーを流用(オプション) semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?" # Step2: restoreconでファイルに実際に適用する restorecon -Rv /data/web/ # 確認 ls -Z /data/web/
semanage fcontext の登録が「ルールの定義」で、restorecon が「ルールの適用」です。この2ステップを必ずセットで実行してください。
3. 登録済みのルールを確認・削除する
# ローカルで追加したルールの一覧表示 semanage fcontext -l -C # 出力例 # SELinux fcontext type Context # /data/web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 # ルールの削除 semanage fcontext -d "/data/web(/.*)?"
port:SELinuxのポート許可を管理する
Apacheのリスニングポートを8080に変更したら起動できなくなった、という問題はよくあります。これはSELinuxが8080番を
http_port_t として許可していないためです。1. 許可されているポートを確認する
# HTTPサービスが使えるポート一覧を確認 semanage port -l | grep http_port_t # 出力例 # http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
2. ポートを追加する
# 8080番ポートをHTTPとして許可する semanage port -a -t http_port_t -p tcp 8080 # 追加後の確認 semanage port -l | grep http_port_t # http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8080, 8443, 9000
3. ポートを削除する
# 追加したポートを削除する semanage port -d -t http_port_t -p tcp 8080 # 既存のデフォルトポートは削除不可(エラーになる)
Linux ポート確認の全コマンドと組み合わせて、どのポートが必要かを先に把握しておくと効率的です。
boolean:サービスの挙動を切り替える
SELinux Booleanはポリシーの「フラグ」です。Booleanを切り替えることで、ポリシーを書き換えずにサービスの特定の動作を許可・禁止できます。
1. Booleanの一覧と状態確認
# 全Booleanの一覧 semanage boolean -l # HTTPDに関連するBooleanのみ絞り込み semanage boolean -l | grep httpd # getseboolコマンドでも確認できる getsebool -a | grep httpd
[root@web01.example.*** ~]# semanage boolean -l | grep httpd httpd_anon_write (off , off) Allow httpd to anon write httpd_builtin_scripting (on , on) Allow httpd to builtin scripting httpd_can_connect_ldap (off , off) Allow httpd to can connect ldap httpd_can_network_connect (off , off) Allow httpd to can network connect httpd_can_network_connect_db (off , off) Allow httpd to can network connect db httpd_can_sendmail (off , off) Allow httpd to can sendmail httpd_enable_homedirs (off , off) Allow httpd to enable homedirs httpd_use_nfs (off , off) Allow httpd to use nfs
2. Booleanを変更する
たとえばApacheからDBへの接続を許可する場合はhttpd_can_network_connect_db を有効にします。# -P(--persistent)で永続的に変更(再起動後も維持) setsebool -P httpd_can_network_connect_db on # semanageでも変更可能(setsebool -Pと同等) semanage boolean -m --on httpd_can_network_connect_db # 確認 getsebool httpd_can_network_connect_db # httpd_can_network_connect_db --> on
-Pオプションなしの setsebool は再起動で元に戻ります。本番環境では必ず -P を付けてください。AVC deniedエラーへの対処法
1. エラーログを確認する
SELinuxがアクセスを拒否すると/var/log/audit/audit.log にAVCエラーが記録されます。# 最近のAVC deniedを確認 ausearch -m AVC -ts recent # sealertで人間が読みやすい形に整形(setroubleshoot-serverが必要) sealert -a /var/log/audit/audit.log
2. audit2allowで対処法を確認する
# AVCエラーから必要なポリシーモジュールを生成 ausearch -m AVC -ts recent | audit2allow -M myapp # 生成されたモジュールを適用 semodule -i myapp.pp # 適用されているモジュールの確認 semodule -l | grep myapp
audit2allow は便利ですが、「全部許可」のモジュールを生成してしまうリスクがあります。本番環境では生成された
.te ファイルの内容を必ず確認し、必要最小限のルールかをチェックしてから適用してください。Apache タイムアウト設定の詳細のようなサービス設定変更を行った際にも、SELinuxのAVCエラーが発生することがあります。
トラブルシュート:よくあるエラーと対処
「ValueError: Type httpd_content_t is not valid」が出る場合
コンテキストタイプのスペルミスが原因です。# 正しいコンテキストタイプを検索する semanage fcontext -l | grep "httpd.*content" # よく使うコンテキスト一覧 # httpd_sys_content_t 読み取り専用のWebコンテンツ # httpd_sys_rw_content_t 読み書きが必要なコンテンツ(CGI書き込み先等) # httpd_log_t Apacheのログファイル # httpd_config_t Apacheの設定ファイル
「already defined」エラーが出る場合
# 既存のルールを確認 semanage fcontext -l -C | grep "/data/web" # 変更する場合は -a(追加)ではなく -m(修正)を使う semanage fcontext -m -t httpd_sys_rw_content_t "/data/web(/.*)?"
semanageで設定したのにアクセスできない場合
restoreconの適用を忘れているケースが最も多いです。# semanageで登録後、必ずrestoreconで適用する semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?" restorecon -Rv /data/web/ # -v: 変更されたファイルを表示 -R: ディレクトリを再帰的に処理
本記事のまとめ
semanageの主要サブコマンドと用途を整理します。| やりたいこと | コマンド |
|---|---|
| ファイルコンテキストを永続設定 | semanage fcontext -a -t タイプ "パス(/.*)?" |
| コンテキストをファイルに適用 | restorecon -Rv /対象パス/ |
| ポートを永続許可 | semanage port -a -t タイプ -p tcp ポート番号 |
| 許可ポートを確認 | semanage port -l | grep タイプ |
| Booleanを永続的に有効化 | setsebool -P Boolean名 on |
| Booleanの状態確認 | getsebool -a | grep サービス名 |
| AVC deniedのログ確認 | ausearch -m AVC -ts recent |
| 必要なポリシーを自動生成 | ausearch -m AVC -ts recent | audit2allow -M モジュール名 |
| ローカル追加ルールの確認 | semanage fcontext -l -C |
まずは
semanage fcontext と restorecon のセットをマスターするところから始めてください。ポート確認コマンド(ss/lsof)と組み合わせることで、サービスが起動しない原因をSELinuxとポートの両面から診断できるようになります。
SELinuxを正しく設定できるLinuxエンジニアになりたいなら
semanageでSELinuxポリシーを管理できると、セキュリティを維持したまま安定したサーバー運用ができます。
ネットの古い情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:systemctlコマンドでLinuxのサービスを管理する方法|start・stop・enable・statusの使い分けも
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます