SELinux設定
概要
SELinuxとは
SELinuxとはセキュリティ関連のLinuxカーネル制御機能です。
SELinuxの機能は、LSM(Linux Security Module)を通じた各システムコールに対するフックとなっており、通常のLinuxのパーミッション処理に追加してSELinuxのアクセス制御機能が機能します。
SELinuxでは、セキュリティコンテキストと呼ばれるラベルを、プロセスとリソースに対してそれぞれ付与し、その組み合わせでアクセスの可否を判断します。その結果が許可されていればアクセス可能に、そうでなければ拒否されることになります。
SELinuxの基本概念
Mandatory Access Control(MAC)
強制アクセス制御のこと。
「セキュリティ・ポリシー・ファイル」設定ファイルに基づいて管理者が定めたアクセス制御の設定をシステム全体に適用することができる。
Type Enforcement(TE)
プロセス単位のアクセス制御機能のこと。
プロセスが利用可能なリソースを必要最小限に制限する(権限外のリソースにはアクセスせない)ことでアクセス制御を行う。
「ドメイン」及び「タイプ」という属性情報によりアクセスの可否が決定される。
・ドメイン - プロセスに与えられる権限の名前
・タイプ - システムリソースに与えられる属性情報
ドメイン遷移
親プロセスが子プロセスを起動した際、ドメインの割り当てを制御し,子プロセスを適切な権限で実行する。
domain_auto_trans(親プロセス, 実行ファイルのタイプ, プロセスのドメイン)
・User識別子 - ユーザの識別子
・Role識別子 - root(特権)権限の最小化で効果を発揮する識別子
・Type識別子 - タイプ識別子はプロセスにおいては「ドメイン」と呼ばれ、プロセス が持つ権限範囲にあたる。
Role Based Access Control(RBAC)
SELinuxを用いたシステムでは,root権限取得者を含むすべてのユーザーに「ロール」と呼ばれる役割を設定することで使用可能なドメインが決定され、システム管理に必要な権限を分割して付与できるという仕組み。
SELINUX関連コマンド
getenforceコマンド
SELINUXの状態表示を行う。
Enforcing : ポリシーに沿ってアクセス制御が有効な状態。
Permissive : アクセス拒否をしません。
Disable : SELinuxは無効状態です。
setenforceコマンド
有効/無効切り替え
/usr/sbin/setenforce 0
/usr/sbin/setenforce 1
semoduleコマンド
ポリシーモジュール(ローカル)をインストール/アンインストールします。
-l : ポリシーモジュールの一覧を表示する
-r : 削除
-i : インストール
ポリシー確認
id -Z
ps -efZ | grep process
ls -Z
fixfilesコマンド
SELINUX設定ファイルの更新
fixfiles relabel
getsebool
SELinux論理値を表示
setsebool
SELinux論理値を変更します。
SELinux論理値とは、SELinux でよく利用される設定をON/OFFで利用可能にしたものです。
semanage
SELinuxの設定を行います。以下の設定が可能です。
・ファイルの デフォルトSELinuxセキュリティコンテキスト
・SELinuxユーザ とロールの対応
・ユーザと SELinuxユーザの対応
・ネットワークポートの SELinuxセキュリティコンテキスト
chcon
ファイルやディレクトリのタイプ(SELinux セキュリティコンテキスト)を一時的に変更する。
# chcon -t samba_share_t /var/smb -R
-u でユーザ、-r でロールを変更できる。
restorecon
タイプ(SELinux セキュリティコンテキスト)を修復する。
# /sbin/restorecon -RF <filepath>
audit2allow、checkmodule、semodule_package
ポリシーモジュール(ローカル)を作成します。
設定
設定ファイル
/etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
SELINUXTYPE=refpolicy
#SELINUXTYPE=strict
#SELINUXTYPE=targeted
ファイルタイプの設定
#vi /etc/selinux/targeted/contexts/files/
#/sbin/fixfiles relabel
initスクリプトのドメイン遷移
通常、ユーザがシェルにログインした状態では「unconfined_t(制限無し)」ドメインに所属しており、コマンド実行時にアクセス制限されたりしない。
つまり、「unconfied_t」のプロセスからサーバプロセスを起動しても、ドメインの遷移はおこらず、サーバプロセスは「unconfiend_t」のまま、制限なしのアクセスができる状態のまま実行される。
しかし、/etc/init.d に定義されているdaemon起動用のスクリプトを実行する場合、以下のドメイン遷移が発生し、起動されたプロセスはアクセス制限されることとなる。
unconfined_t -> initrc_exec_t -> initrc_t
SELinuxには「init_daemon_domain」というインターフェースが用意されていて、initから起動された時の「initrc_t」ドメインから、「ABC_exec_t」というラベルのついたアプリケーションを起動したときに専用の「ABC_t」ドメインに遷移するような定義ができるようになっている。
init_daemon_domain(ABC_t, ABC_exec_t)
これにより、initから起動されたプロセスのドメインは以下のように遷移する。
initrc_t -> ABC_exec_t -> ABC_t
上記を組合わせると、以下のドメイン遷移が行われる。
unconfined_t
-> initrc_exec_t(/etc/init.d/httpdのラベル)
-> initrc_t(起動スクリプトプロセス)
-> ABC_exec_t(バイナリのラベル)
-> ABC_t(サーバのプロセス)
Redhat6.1では、「initrc_t」ドメインに対していくつか制限ルールが追加されています。(RedHat5系以前では発生していない)
SELINUXが有効である場合、特定のコマンド(hostname,ifconfigなど)が標準出力されない現象が起こる。
例えば、/bin配下で「bin_t」ドメインに属せず、独自ドメインに属するコマンドが挙げられる。
system_u:object_r:hostname_exec_t:s0 hostname
system_u:object_r:dmesg_exec_t:s0 dmesg
system_u:object_r:ping_exec_t:s0 ping
initrc_tからの遷移ポリシーを作成する
1. 設定ファイルを用意する。
xxxx.fc - ファイルコンテキスト
xxxx.if - インターフェースファイル
xxxx.te - TypeEnforcementファイル
2. 設定ファイルをmakeしてポリシーファイルを作成する
# make -f /usr/share/selinux/devel/Makefile
xxxx.pp - ポリシーファイル
3. ポリシーファイルを適用(インストール)する。
semodule -i xxxx.pp
4. 対象プロセスのファイルタイプを変更する
chconコマンドで変更した場合、file_contextsファイルの内容は変更できないため、
OS再起動などリフレッシュ動作を行うと初期状態に戻ってしまう。
# chcon -t <xxxx>_t <module-path> -R
# fixfiles relabel
もしくは
# restorecon -R <modulepath>
file_contextファイルを確実に変更するためには以下のコマンドを実行する。
# semanage fcontext -a -t <xxxx>_t "/usr/local/xxxx(/.*)?"