【SELinux】SELinuxが分からないので概要をまとめてみた

  • このエントリーをはてなブックマークに追加

概要

Linuxサーバを運用しようと思ったら避けては通れないSELinux。世間では反射的にoffにする人が大多数のようで私もよくわからずoffにしていました。しかし、SELinuxをoffにしたとしてもある程度SELinuxのメリット、デメリットを理解した上でoffにしたいものです。この記事では良くわからなかったSELINUXの機能をまとめてみました。ちなみにこのサーバではもちろんSELinuxは有効になっています。

SELinuxとは

プロセスを必要最小限の権限で動作させることで、万が一サーバーが乗っ取られた場合でもサーバーの被害を最小限に抑える仕組みのことです

大事なこと

  • SELinuxは侵入された後の攻撃を最小限に抑える仕組みです。それ以外への攻撃や侵入に至る攻撃には対処できません。例えばDOSやプロセスの権限内での悪用などなどです(Webアプリの脆弱性を利用した攻撃なども)。また、例えば管理者のパスワードが漏洩して管理者へのなりすましをされるとSELinuxでは何もできません。
  • SELinuxはカーネルモジュールです。カーネルやCPUなどに脆弱性があると攻撃を防ぎきれない場合があるようです。その場合は早急にパッチをあてる必要があります。

SELinuxのメリット

  • 利用しているソフトウエアに脆弱性がある場合、迅速に修正パッチを適用しなくてはいけませんが様々な都合上出来ない場合があるようです。こういう場合でもSELinuxの機能を使うと被害を最小限に留めることができるので、リスクを小さくすることができます。例えばhttpサーバに脆弱性があった場合攻撃を受けたとしても攻撃者が得る権限はhttpサーバの権限です。この権限では、サーバの設定ファイルの読み込み権限しかないのでシステムは破壊できません。さらに、ほかのマシンに攻撃を仕掛ける踏み台にしようとしも80番ポートの接続待ち受けしかできないため、他のマシンへの接続は拒否されます。このように、不正侵入を受けたとしても攻撃者やウイルスが持つ権限が少ないため攻撃は失敗します。

  • 未知の攻撃(ゼロディなどのパッチが公開されていないもの)に対しては防御する術は無いがSELinuxを使うことでゼロディに対しても万が一の場合の被害を最小限にすることができる

  • サーバで攻撃者にroot権限を奪取されるとなんでも悪用されてしまいます。SELinuxでは不要な権限昇格を禁止しているのでroot権限を奪取されることがありません

SELINUXの特徴

  • リソースへの強制アクセス制御(TE機能)
  • プロセスへの最小権限設定・権限昇格禁止(ドメイン遷移機能)
  • ロールに基づいたアクセス制御(RBAC機能)

よくわからない特徴が並んでいますが、一つずつ紐解いていきます。ここでのリソースとはファイル、ディレクトリ、ソケットなどなどです。

TE機能

全てのプロセスにはドメインというラベルが付与されています。そして各リソースにはタイプというラベルが付与されています。TE機能ではドメインがタイプに対してどのような操作が許可されているかのルールが定義されていて、そのルールに基づいたアクセス制御を実施します

プロセスのドメイン

psコマンドにZをつけると見れます

ps auxfZ
・
system_u:system_r:httpd_t:s0    apache    3027  0.0  0.2 437992  9804 ?        S    08:02   0:00  \_ /usr/sbin/httpd

  • 見方
    • [SELinux User]:[Role]:[ドメイン]:[Level] ファイル名 //selinuコンテキストと呼びます

この場合プロセスのドメインはhttpd_tです。

リソースのタイプ

$ ls -lZ
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 test
  • 見方
    • [SELinux User]:[Role]:[タイプ]:[Level] ファイル名 //selinuコンテキストと呼びます

この場合タイプはadmin_home_tです。リソースにもユーザとロールが割り当てられているみたいですが、これは仮で特に意味はないようです。リソースで確認するのはタイプだけで良いみたいです。

セキュリティポリシー

セキュリティーポリシーファイルにhttpd_tがadmin_home_tへ許可する操作が定義されていて、それ以外の操作を実行しようとするとアクセス拒否されます。よくSELinuxをオンにしてアクセスができないという問題はTEが機能しているからです。このセキュリティーポリシーの確認、編集は確かコマンドから実施するはずです。デフォルトの定義はselinux-policyパッケージによって定義されているルールになるようです。

ドメイン遷移

  • 最小限の権限
    • あるプロセスが子プロセスを起動したときのドメインの割り当てを制御し,各プロセスが必要最小限の権限で動くようにする仕組み。新規プロセスが不必要に大きな権限を持たないようにする。
  • 権限の昇格禁止
    • 各プロセスにはドメイン(プロセスの権限)が割り当てられていて、明示的に指定しない限りドメインでは権限の昇格ができないように制限されている

RABC

  • ユーザ毎に役割(Role)を設定して、ユーザー毎に権限を分割する機能
    • 操作ミス(プロセス制御)による被害や悪意のあるユーザの被害を最小限に抑える
  • ロールによって利用可能なドメインを制限する

デフォルト

ユーザにはロールが割り当てられていてドメインへのアクセス制御を実施します。しかし、このロールからドメインへのアクセス制御は恐らくデフォルトでは無制限みたいです。
ユーザーの SELINUX コンテキスト

root@localhost:~
$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Red Hat Enterprise Linux では、Linuxユーザーはデフォルトで無制限の実行が可能です。この SELinuxコンテキストでは、Linux ユーザーが SELinux unconfined_uユーザーにマッピングされ、unconfined_r ロールとして実行し、unconfined_tドメインで実行していることを示しています。s0-s0 は MLS 範囲で、このケースではs0 と同じです。ユーザーにアクセス権があるカテゴリは c0.c1023で定義され、これは全カテゴリになります (c0 から c1023 まで)。

確認

root@localhost:~
$ semanage login -l

ログイン名                     SELinux ユーザー              MLS/MCS 範囲               

__default__               unconfined_u              s0-s0:c0.c1023           
root                      unconfined_u              s0-s0:c0.c1023           
system_u                  system_u                  s0-s0:c0.c1023           

一般ユーザ(default )、root共にSELinux ユーザー はunconfined_uになります。

root@localhost:~
$ semanage user -l

                ラベル付け      MLS/       MLS/                          
SELinux ユーザー    プレフィックス    MCS レベル    MCS 範囲                         SELinux ロール

git_shell_u     user       s0         s0                             git_shell_r
guest_u         user       s0         s0                             guest_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
user_u          user       s0         s0                             user_r
xguest_u        user       s0         s0                             xguest_r

一般ユーザもrootも同じロール(system_r unconfined_r)が割り当てられるようです。やはりSELINUXではデフォルトで無制限になっているのかもしれないです。

まとめ

SELinuxとは

  • 侵入された後の攻撃を最小限に抑える仕組み
  • アクセス制御機能

SELinuxの機能

  • TE機能
  • ドメイン遷移
  • RABC

サーバ管理者がSELinuxの運用で気をつけるのはTE機能のアクセス制御

SELinuxのメリット

  • 被害が最小化
  • 万が一のゼロディ攻撃でも被害は最小化
  • root権限は奪取できない仕組み

SELinuxのデメリット

  • SELinuxを使用してLinuxサーバを運用するとわかりますが、SELinuxが要因となったエラーなどが時々おきます。主にTE機能のアクセス制御関連です。ここでハマったりすることととても疲れる。
%d人のブロガーが「いいね」をつけました。