SELinuxの概念
Type Enforcement(TE)という概念がある。
プロセスからファイルやディレクトリ、ソケットなどをまとめてリソースと呼び、その種類1つ1つをクラスと呼ぶ。特定のドメイン(タイプ)で実行されているプロセスが特定のタイプにラベリングされたリソースにアクセスできるかどうかを定義し、違反すればエラーやログ出力が行われます。
この制御はファイルのアクセス制御(パーミッション)の後に評価される。つまり両方の制御をクリアしなければアクセスできないのだ。(パーミッションの制御を任意アクセス制御(DAC)、SELinuxの制御を強制アクセス制御(MAC)とも呼ぶ。)
ちなみにrootにもこのルールが適用される。
全てのプロセスとリソースはコンテキストと呼ばれるラベル付けが行われている。これは”ps Z”や”ls -Z”で確認できる。
表示形式は”SELinuxユーザ:ロール:タイプ(ドメイン):MLS“となっている。
ロールの例は以下の通りです。
- object_r:一般的なファイルのロール
- system_r:プロセスのロール
制限のないドメイン一覧(例):
ドメインには制限のないものと制限のあるものが存在する。つまり制限のないドメインではSELinuxは機能しない。
- unconfined_t:ログインユーザが起動するプロセスのドメイン
- initrc_t:init で開始されたシステムプロセスのドメイン
- kernel_t:カーネルプロセスのドメイン
制限のあるドメイン一覧(例):
- http_t:httpd 関連プロセスのドメイン
次にタイプの例を示します。
- file_t:タイプ未割当を意味するタイプ。制限されたドメインからはアクセス不可。
- default_t:デフォルトで割り当てられるタイプ。制限されたドメインからはアクセス不可。
MLSはオプションで、通常は政府機関でのみ使用される。
SELinuxのモード
SELinuxには3つのモードがある。
- disabled…無効化
- permissive…ポリシー違反を許容し、ログに記録する
- enforcing…ポリシー違反を拒否し、ログに記録する
モードの変更には2種類の方法がある。
一つはコマンドで指定する方法で、コンピュータがダウンするまで一時的に変更する方法だ。ただし”permissive”か”enforcing”しか指定できない(はず)。
もう一つは恒久的に変更するが反映するには再起動が必要な方法である。”/etc/selinux/config”ファイルの”SELINUX”パラメータを変更する。こちらは上記3種類とも指定できる。
# モード確認
getenforce
# モード変更("permissive":0、"enforcing":1の文字列または数値のどれか指定)
setenforce 0_or_1
"policycoreutils-python-utils"パッケージより
以降は”policycoreutils-python-utils”パッケージがインストールされていることが前提となります。
dnf install policycoreutils-python-utils
ファイルへのSELinux
今回は一時的に変更する”chcon “は紹介しない。
ファイルへの恒久的な設定を行うには”semanage”コマンドの中でも”fcontext”を指定する。
設定を確認/追加/削除/修正するには以下のコマンドを利用する。FILE_PATHは正規表現が利用できそう。
# 確認
semanage fcontext –l
ls -lZ
# 追加("–-add"は"-a"に省略可)
semanage fcontext –-add –t TYPE FILE_PATH
# 削除("–-delete"は"-d"に省略可)
semanage fcontext –-delete –t TYPE FILE_PATH
# 修正("–-modify"は"-m"に省略可)
semanage fcontext –-modify –t TYPE FILE_PATH
# 上記設定の反映
# "-R":再帰的に処理、"-F":タイプ以外にユーザやロール等も処理を強いる
restorecon -RFv FILE_PATH
# コンテキストの差分を確認
# "Would relabel..."から始まる行が変更あり
fixfiles check
# ファイルシステム全体のコンテキストを再設定
fixfiles restore
# 事前に"/tmp/"を削除して、"restore"を実行
fixfiles relabel
ポートへのSELinux
同じく”semanage”コマンドで”port”を指定することで、ポートの制御が可能になる。
# 確認
semanage port –l
# 追加("–-add"は"-a"に省略可)
semanage port –-add –t TYPE -p tcp PORT_NUMBER
# 削除("–-delete"は"-d"に省略可)
semanage port –-delete –t TYPE -p tcp PORT_NUMBER
ブール値(プロセス?)へのSELinux
同じく”semanage”コマンドで”port”を指定することで、ポートの制御が可能になる。
# 確認
getsebool TYPE
ps -Z
# 設定変更("on"か"off"を指定)
setsebool -P TYPE on_or_off
SELinuxによるシステムトラブルが起こった場合にSELinux自体を”permissive”にすることでトラブル事態を回避できるかもしれないがセキュリティ上の不安がある。
というときに、特定のドメインのみを”permissive”に変更することが可能だ。
# 確認
semanage permissive -l
# 恒久的に特定のドメインを"permissive"へ変更
semanage permissive -a DOMAIN
# 恒久的に特定のドメインを"enforcing"へ変更
semanage permissive -d DOMAIN
ユーザへのSELinuxも???
ここを参考にしてみよう!
全くよく分かってないけど
設定状態は以下のコマンドで全て一覧表示することが可能なようだ。
semanage export
SELinux自体の設定内容を表示。
sestatus
標準出力ではなく、終了コードでSELinuxの有効・無効を表現する。シェルスクリプトで条件分岐するのに有効だろう。有効なら”0″、無効なら”1″を出力する。
selinuxenabled
指定したパスの一般的な(デフォルト)コンテキストを表示する。
matchpathcon FILE_PATH
出力されるログ
“/var/log/audit/audit.log”は専用のログファイルです。”/var/log/messages”は専用ではありませんが「SELinux is preventing」というメッセージとともにエラーが出るそうです。
“type“はこちらを参照。”{}“は拒否されたパーミッション、”comm“は実行したファイル、”path“はアクセスを試みた先、”scontext“拒否されたプロセスのコンテキスト、”tcontext“はアクセスしようとした先のコンテキスト。
# ファイルを直接確認する場合
tail -f /var/log/audit/audit.log
tail -f /var/log/messages
# 当日中のログ
ausearch -m avc -ts today
# 直近10分間のログ
ausearch -m avc -ts recent
# 指定したプロセスのログ
ausearch -m avc -c PROCESS
"setools-console"パッケージより
ここからは”setools-console”がインストールされていることが前提となります。
dnf install setools-console
統計情報を出力したり、多分利用可能なコンテキストタイプを一覧できる、と思う。
# 統計情報出力
seinfo
# Print type attributes.
seinfo -a
# Print Booleans.
seinfo -b
# ちなみにこっちは一覧に加えてオン・オフ状況と説明が出力される
semanage boolean -l
# Print object classes.
seinfo -c
# Print roles.
seinfo -r
# Print types.
seinfo -t
# Print users.
seinfo -u
SELinuxのポリシーを問い合せます。
sesearch
# 対応するSELinuxブール値が存在するか確認(できるらしい)
sesearch --allow --auditallow -C -s DOMAIN -t TYPE -c CLASS -p OPS
SELinux監査ログからのレポート。
seaudit-report
"setroubleshoot-server"パッケージより
これはSELinuxによりエラーが出力された場合に”/var/log/messages”へエラーの対応方法を出力してくれる。
dnf install setroubleshoot-server
参考文献
SELinuxの挙動を知りたい人向け:
Qiita 「SELinuxのせいで動かない」撲滅ガイド
Qiita SELinuxの調査や確認時に使えそうなコマンドメモ
Qiita SELinux 基礎知識と実践
Qiita SELinux
ファイルのアクセス制御:
みむらの手記手帳 SELinux で restorecon してあうあう。
リバースプロキシ:
Qiita SELinux Enforcing 環境下でnginxをリバースプロキシとして使う
任意のポートでアクセスを許可:
mebee ssh エラー「error: Bind to port xxx on 0.0.0.0 failed: Permission denied.」が発生した場合の対処法