「設定 - SELinux」の版間の差分
131行目: | 131行目: | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ: | [[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:PinePhone]] |
2023年4月13日 (木) 20:34時点における版
概要
SELinuxは、Linuxのセキュリティ拡張機能である。 (Linux 2.6以降でサポート)
Linuxに強制アクセス制御の仕組みを提供する。
外部に侵入されないための仕組みではなく、侵入された後にアクセスできる範囲を最小限に抑えるための仕組みである。
SELinuxの機能
TE(Type Enforcement)
プロセスがアクセスできるリソースを制限する機能である。
プロセスにドメインを、リソースにタイプを割り当て、その組み合わせごとにアクセス権を設定する。
このアクセス権の設定の集合を、アクセスベクタという。
子プロセス生成時には、基本的には親プロセスのドメインが引き継がれる。
子プロセスのドメインを変更することを、ドメイン遷移と呼ぶ。
RBAC(Role Based Access Controle)
ユーザがアクセスできるリソースを制限する機能である。
ユーザごとにアクセス可能なロールが決まっており、ロールごとにアクセス可能なドメインが決まっている。
TEにより、ドメインごとにアクセス可能なタイプが決まっているため、最終的には、ユーザがアクセス可能なオブジェクトを制御することができる。
RHELでは、全てのLinuxユーザがunconfined_uに対応しており、unconfined_uにはアクセス制限が掛けられない。
したがって、RHELではRBACは意味をなさない。
SELinuxの機能
セキュリティコンテキスト
SELinuxでは、ドメインやタイプ等のことを、セキュリティコンテキストという形で表現する。
セキュリティコンテキストの例を、以下に示す。
- system_u
- ユーザ識別子
- object_r
- ロール識別子
- lib_t
- タイプ(ドメイン)識別子
- s0
- MLS (Multi Level Security) : 情報の機密性
SELinuxユーザ
Linuxユーザとは異なり、Linuxユーザごとに対応するSELinuxユーザが設定されている。
SELinuxユーザの例を、以下に示す。
- unconfined_u
- アクセス制限のないユーザ (RHELでは全てのLinuxユーザがunconfined_uになる)
ロール
ロールの例を、以下に示す。
- object_r
- 一般的なファイルのロールのこと。
- ロールは、ファイルにとって意味は無い。
- system_r
- プロセスのロールのこと。
- /procディレクトリ下のプロセス関連のファイル等にも使用される。
ドメイン
ドメインは、"制限のないドメイン"と"制限のあるドメイン"に大別できる。
プロセスに割り当てられるドメインの例を、以下に示す。
- 制限のないドメイン
- SELinuxによるアクセス制限を受けない。
- つまり、システムが乗っ取られた場合、SELinuxによる防御は意味をなさない。
- 通常のパーミッションによるアクセス制御は行われる。
- unconfined_t
- ログインユーザが起動するプロセスのドメイン。
- initrc_t
- initで開始されたシステムプロセスのドメイン。
- kernel_t
- カーネルプロセスのドメイン。
- 制限のあるドメイン
- 一般的なソフトウェアに割り当てられる。
- これらのドメインは、SELinuxによるアクセス制御がなされる。
- http_t
- httpd関連プロセスのドメインのことである。
タイプ
ファイルに割り当てられるタイプの例を、以下に示す。
- file_t
- タイプが割り当てられていないことを示すタイプのこと。
- 制限されたドメインからはアクセス不可である。
- default_t
- 割り当てるべきタイプが設定されていない場合に、デフォルトで割り当てられるタイプのこと。
- 制限されたドメインからはアクセス不可である。
ポリシーの設定
SELinuxを有効にしている場合、サービスが起動しない問題は、SELinuxポリシーによる制限が原因となる場合がある。
SELinuxはセキュリティ上の観点から、プログラムが実行できるアクションを制限することがある。
ポリシーファイルを作成するため、必要なライブラリをインストールする。
sudo dnf install checkpolicy policycoreutils-python
SELinuxのログを確認する。
SELinuxがサービスをブロックしている場合、SELinuxのログにその旨のエラーメッセージが表示される。
まず、SELinuxログを確認する。
sudo tail -f /var/log/audit/audit.log
ポリシーモジュール(TEファイル : Type Enforcementファイル)とPPファイルを作成する。
TEファイルとは、特定のドメインに対する全てのタイプとルールを定義するものである。
sudo grep <サービス名> /var/log/audit/audit.log | audit2allow -M <任意のポリシーファイル名>
必要であれば、TEファイルをコンパイルして、ポリシーモジュールファイル(.mod拡張子)を生成する。
checkmodule -M -m -o <任意のポリシーモジュール名>.mod <任意のポリシーモジュール名>.te
または、TEファイルからポリシーパッケージファイル(.pp拡張子)を生成することもできる。
make -f /usr/share/selinux/devel/Makefile
もし、上記でTEファイルからポリシーモジュールファイル(.mod拡張子)を生成した場合、ポリシーパッケージ(.pp拡張子)を生成する。
semodule_package -o <任意のポリシーパッケージ名>.pp -m <任意のポリシーモジュール名>.mod
作成したポリシーモジュールをSELinuxにロードして、ポリシーを有効にする。
sudo semodule -i <任意のポリシーパッケージ名>.pp
ポリシーモジュールの有効化 / 無効化 / 削除
追加したポリシーは、有効化 / 無効化 / 削除することができる。
# ポリシーの有効化 sudo semodule -e <任意のポリシー名> # ポリシーの無効化 sudo semodule -d <任意のポリシー名> # ポリシーの削除 sudo semodule -r <任意のポリシー名>