SELinuxについてまとめてみる1(超初級編)
はじめに
業務でサーバを設計・構築する際、SELinuxを有効にしていると想定していない動作をすることが多かったので、設定は必ず無効にしていました。
ただ、RHEL9.0以降では、SELINUX=disabled
にすることもできなくなって[1]、公式ホームページには以下のような記述もあることから、今後はきちんとSELinuxについて理解しておかないといけないなと思い、とりあえずコマンドとか覚える意味で記事を書いてみようと思いました。
Red Hat は、SELinux を永続的に無効にする代わりに、Permissive モードを使用することを強く推奨します。Permissive モードの詳細は Permissive モードへの変更 を参照してください。
なお、1回では全て書ききれないので、細切れで記事にできればと思っています。
SELinux とは
以下は、Red Hat の記載引用。
Security Enhanced Linux (SELinux) は Mandatory Access Control (MAC) を実装します。それぞれのプロセスおよびシステムリソースには、SELinux コンテキスト と呼ばれる特別なセキュリティーラベルがあります。SELinux コンテキストは SELinux ラベル として参照されることがありますが、システムレベルの詳細を抽象化し、エンティティーのセキュリティープロパティーに焦点を当てた識別子です。これにより、SELinux ポリシーでオブジェクトを参照する方法に一貫性を持たせ、他の識別方法に含まれる曖昧さがなくなりました。たとえば、バインドマウントを使用するシステムで、ファイルに、有効なパス名を複数設定できます。
Linuxでよく出てくるファイル権限として、drwxr-xr-x. 2 root root
みたいなのがあります。
これはファイル(あるいはディレクトリ)に対して、オーナーやグループ、その他ユーザーごとにr(read),w(write),x(execute)権限を制御するもので、DAC(Discretionary Access Control) といいます。
DACでは、大まかなアクセス制限しかできません。
SELinuxでは、DACではなくてMACを利用し、【コンテキスト】 と呼ばれるラベルをファイルやプロセスに付与することでアクセス権をより細かく制御することができます。
SELinuxの細かいことは、コマンドを色々触り終わったら別記事でまとめられればなと思います。
※自分自身もまだわかっていないので。
SELinuxの設定ファイル
SELinuxの設定ファイルは、以下のパスにあります。
$ sudo ls -l /etc/selinux/config
-rw-r--r--. 1 root root 1188 11月 30 23:19 /etc/selinux/config
ファイルには、2つの設定しかありません。
$ sudo grep -v "^#" /etc/selinux/config # ファイルの中でコメント部分を削除
SELINUX=permissive
SELINUXTYPE=targeted
-
SELINUX:SELinuxの実行モード
- enforcing:SELinuxを有効にし、かつルールに沿ったアクセス制限を行う(ログも出力する)
- permissive:SELinuxを有効にするが、アクセス制限は行わない(ログは出力する)
- disabled:SELinuxを無効にする
ここでいう「ログ」は、audit.log
に出力されます。
-
SELINUXTYPE:SELinuxで使用するポリシー
- mls:一番複雑なポリシーを適用できる。よほど厳しいセキュリティポリシーがない限り、設定することはない。
- targeted:デフォルトのポリシー。SELinuxにある様々なアクセス制御のうち、TE(Type Enforcement) を主に利用する。
- minimum:最低限のみ適用するポリシー。
通常利用であれば、targeted
を指定すれば問題ありません。
今まで、disabled
にしていた方は、まずはpermissive
から始めればよさそうです。
余談ですが、SELINUX
の設定を変更しようとして、誤ってSELINUXTYPE
の設定を変更してしまって、OSが起動してこなくなるのは構築時のあるあるです。
よく使うコマンド(SELinux自体の設定・確認系)
コマンド | 説明 |
---|---|
getenforce | SELinuxが実行しているモードを確認 |
setenforce | SELinuxの実行モードを変更 |
sestatus | SELinuxの状態を表示 |
selinuxenabled | 設定の有効・無効をBoolean値で返す(終了コードとして) |
seinfo | Type、Attribute、Class、ポート番号などのObjectの情報を表示する |
getenforce
コマンドを実行することで、今のSELinuxの実行モードが分かります。
$ getenforce
Permissive # Permissiveに設定している場合
setenforce
SELinuxの実行モードを変更できます。ただし、disabled
にはできません。
引数としては、enforcing
かpermissive
ですが、Boolean値も利用できます。
enforcing -> 1
permissive -> 0
$ sudo setenforce enforcing
$ getenforce
Enforcing
# Booleanを利用した場合
$ sudo setenforce 0
$ getenforce
Permissive
sestatus
SELinuxの有効・無効や、適用されているポリシー、SELinuxのディレクトリ等々の情報が表示されます。
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
selinuxenabled
SELinuxの実行モードをBoolean値で返します。ただし標準出力はされず、終了コードとして0
か1
を返します。
0:有効の場合(Permissive or Enforcing)
1:無効の場合(Disabled)
# SELinuxを無効していていた場合
$ getenforce
Disabled
$ selinuxenabled
$ echo $?
1
# SELinuxを有効にしていた場合
$ getenforce
Permissive
$ selinuxenabled
$ echo $?
0
seinfo
seinfo
コマンドは、デフォルトではインストールされていないので、別途インストールする必要があります。
$ sudo yum install setools-console
オプションなしでコマンドを実行すると、統計情報が表示されます。
$ seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version: 33 (MLS enabled)
Target Policy: selinux
Handle unknown classes: allow
Classes: 133 Permissions: 454
Sensitivities: 1 Categories: 1024
Types: 5055 Attributes: 254
Users: 8 Roles: 14
Booleans: 349 Cond. Expr.: 382
Allow: 64650 Neverallow: 0
Auditallow: 166 Dontaudit: 8474
Type_trans: 256187 Type_change: 87
Type_member: 35 Range_trans: 5960
Role allow: 38 Role_trans: 420
Constraints: 72 Validatetrans: 0
MLS Constrain: 72 MLS Val. Tran: 0
Permissives: 0 Polcap: 5
Defaults: 7 Typebounds: 0
Allowxperm: 0 Neverallowxperm: 0
Auditallowxperm: 0 Dontauditxperm: 0
Ibendportcon: 0 Ibpkeycon: 0
Initial SIDs: 27 Fs_use: 33
Genfscon: 106 Portcon: 653
Netifcon: 0 Nodecon: 0
例えば、-t
オプションを使用すると、「Types」の情報を確認できます。
これが何を意味しているのかは、おいおい説明で。
$ seinfo -t | head
Types: 5055
NetworkManager_etc_rw_t
NetworkManager_etc_t
NetworkManager_exec_t
NetworkManager_initrc_exec_t
NetworkManager_log_t
NetworkManager_priv_helper_exec_t
NetworkManager_priv_helper_t
NetworkManager_ssh_t
おわりに
とりあえず今回は、SELinuxを利用するにあたっての初歩中の初歩からまとめました。
次回から徐々にSELinuxの細かいところに触れていければなと思います(自身も勉強しながら)。
-
起動時のカーネルオプションをいじることで無効化にはできます。 ↩︎
Discussion