🙌

SELinuxについてまとめてみる1(超初級編)

2023/01/04に公開

はじめに

業務でサーバを設計・構築する際、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 1130 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にはできません。
引数としては、enforcingpermissiveですが、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値で返します。ただし標準出力はされず、終了コードとして01を返します。
 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の細かいところに触れていければなと思います(自身も勉強しながら)。

脚注
  1. 起動時のカーネルオプションをいじることで無効化にはできます。 ↩︎

Discussion