semanageコマンドでSELinuxのポリシーを管理する方法|fcontext・port・booleanの実践設定も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > semanageコマンドでSELinuxのポリシーを管理する方法|fcontext・port・booleanの実践設定も
「SELinuxが邪魔でサービスが起動できない」「AVC deniedのエラーが消えない」
サーバー管理の現場で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は再起動で消えるため本番環境での使用は禁止


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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

8080番は含まれていないため、Apacheが8080でバインドしようとするとSELinuxに拒否されます。

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 # 既存のデフォルトポートは削除不可(エラーになる)

Samba(445番)やPostfix(25番)などのサービスも同様の手順でポートを追加できます。
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
SELinuxを無効化せず、semanageで正しくポリシーを管理できれば、セキュリティを保ちながらサービスを安定稼働させられます。
まずは semanage fcontextrestorecon のセットをマスターするところから始めてください。
ポート確認コマンド(ss/lsof)と組み合わせることで、サービスが起動しない原因をSELinuxとポートの両面から診断できるようになります。

SELinuxを正しく設定できるLinuxエンジニアになりたいなら

semanageでSELinuxポリシーを管理できると、セキュリティを維持したまま安定したサーバー運用ができます。
ネットの古い情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。