SELinux (日本語) - ArchWiki

# SELinux (日本語)

関連記事

- セキュリティ
- AppArmor

Security-Enhanced Linux (SELinux) は Linux カーネルの Linux Security Module (LSM) を使って、アメリカ国防総省式の強制アクセス制御などの様々なセキュリティポリシーを提供する Linux の機能です。Linux ディストリビューションではなく、むしろ Linux や BSD などの Unix ライクなオペレーティングシステムに使うことができる改造セットと言えます。

Linux ディストリビューションで SELinux を動かすには3つのことが必要です: SELinux が有効になったカーネル、SELinux のユーザースペースツールとライブラリ、そして SELinux のポリシー (大半はリファレンスポリシーがベース) です。また、SELinux 機能を有効にするパッチをあててコンパイルする必要がある Linux プログラムも存在します。

## Arch Linux における現在の状態

Arch Linux におけるそれぞれの要素の現状:

名前 | 状態 | 入手先
--- | --- | ---
SELinux が有効になったカーネル | 実装済み | 公式の Arch カーネルでは 3.14 から削除されています: audit を無効化する Kconfig のオプションがデフォルトで存在しないのが主な理由です。AUR から利用可能です。
SELinux のユーザースペースツールとライブラリ | 作業中: https://aur.archlinux.org/packages/?O=0&K=selinux | https://github.com/archlinuxhardened/selinux に成果があります。
SELinux のポリシー | 作業中です。おそらく selinux-policy-arch という名前が付けられるでしょう。 | 今のところリポジトリは存在しません。

公式の core パッケージと AUR にあるパッケージの変更点:

名前 | 状態とコメント
--- | ---
linux | KConfig オプションを有効にしてリビルドする必要があります。
coreutils | libselinux とリンクしてリビルドする必要があります。
cronie | `--with-selinux` フラグを使ってリビルドする必要があります。
findutils | SELinux のパッチが必要です。上流では既に含まれています。
openssh | `--with-selinux` フラグを使ってリビルドする必要があります。
pam | Linux-PAM のために `--enable-selinux` フラグを使ってリビルドする必要があります。pam_unix2 のパッチが必要で、他のライブラリで実装されている関数を削除します。
pambase | 設定を変更して pam_selinux.so を追加しています。
psmisc | パッチが必要です。上流では既に含まれています。バージョン 22.21 で含まれる予定です。
shadow | `-lselinux` と `--with-selinux` フラグを使ってリビルドする必要があります。
sudo | `--enable-selinux` フラグを使ってリビルドする必要があります。
systemd | `--enable-selinux` フラグを使ってリビルドする必要があります。
util-linux | `--enable-selinux` フラグを使ってリビルドする必要があります。

他の SELinux 関連のパッケージは変更を加えずに安全に使うことができます。

## 強制アクセス制御

Note: このセクションはビギナーのために書かれています。SELinux が何でどういう仕組みで動作するのか知っている場合は、インストールの項にスキップしてください。

SELinux を有効にする前に、SELinux が何をするのか理解したほうが良いでしょう。簡単に言うと、SELinux は Linux で強制アクセス制御 (Mandatory Access Control, MAC) を実施します。SELinux と対比するように、伝統的なユーザー/グループ/rwx のパーミッションは一種の任意アクセス制御 (Discretionary Access Control, DAC)です。MAC は DAC と異なり、セキュリティポリシーとその実行が完全に区別されています。

例として sudo コマンドの使用が挙げられます。DAC が使用されている場合、sudo は root への一時的な権限昇格を許可し、プロセスはシステム全体に制限なくアクセスできるようになります。しかしながら、MAC を使用した場合、プロセスがアクセスできる特定のファイルセットをセキュリティ管理者が指定しておけば、どんな権限昇格を用いたとしても、セキュリティポリシーが変わらないかぎり、プロセスがアクセスできるファイルは制限されます。そのため、SELinux が動作しているマシンで sudo を使ってポリシーが許可しないファイルにアクセスしようとしても、アクセスは不可能です。

他の例としては、ファイルに与えられる伝統的な (-rwxr-xr-x) タイプのパーミッションがあります。DAC の下では、パーミッションはユーザーによって変更できます。しかしながら、MAC の下では、セキュリティ管理者が特定のファイルのパーミッションを凍結することが可能です。ファイルに関連するポリシーが変更されないかぎり、ファイルのパーミッションをユーザーが変更することは不可能になります。

このことが、ウェブサーバーなど、危険にさらされる可能性のあるプロセスで特に有用なのは想像に難くないでしょう。DAC が使われている場合、権限昇格ができるプログラムを奪取されて大損害を被る危険が十分あるのです。

もっと詳しい情報は、Wikipedia の MAC のページを見て下さい。

## SELinux のインストール

### パッケージ

SELinux 関連のパッケージは全て、AUR の selinux グループか Siosm の非公式リポジトリに含まれています。

#### SELinux 対応のシステムユーティリティ

coreutils-selinux
  SELinux のサポートを有効にしてコンパイルされた修正版 coreutils パッケージ。coreutils パッケージを置き換えます。

selinux-flex
  checkpolicy のビルドに必要な Flex。通常の flex パッケージでは checkmodule コマンドが失敗します。flex パッケージを置き換えます。

pam-selinux と pambase-selinux
  pam_selinux.so が入った PAM パッケージとそのベースパッケージ。それぞれ pam と pambase パッケージを置き換えます。

systemd-selinux
  SELinux 対応版の Systemd。systemd パッケージを置き換えます。

util-linux-selinux
  SELinux のサポートを有効にしてコンパイルされた修正版 util-linux パッケージ。util-linux パッケージを置き換えます。

findutils-selinux
  指定したセキュリティコンテキストを使ってファイルの検索をできるようにするため SELinux のサポートを有効にしてコンパイルされたパッチ済みの findutils パッケージ。findutils パッケージを置き換えます。

sudo-selinux
  適切にセキュリティコンテキストを設定する SELinux サポートを有効にしてコンパイルされた修正版 sudo パッケージ。sudo パッケージを置き換えます。

psmisc-selinux
  SELinux サポートを有効にしてコンパイルされた Psmisc パッケージ。例えば、`killall` に `-Z` オプションを追加します。psmisc パッケージを置き換えます。

shadow-selinux
  SELinux サポートを有効にしてコンパイルされた Shadow パッケージ。ログイン後のユーザーに適切なセキュリティコンテキストを設定するように修正された `/etc/pam.d/login` ファイルが含まれています。shadow パッケージを置き換えます。

cronie-selinux
  SELinux を有効にした Vixie cron の Fedora フォーク。cronie パッケージを置き換えます。

logrotate-selinux
  SELinux サポートを有効にしてコンパイルされた Logrotate パッケージ。logrotate パッケージを置き換えます。

openssh-selinux
  ユーザーセッションのセキュリティコンテキストを設定するように SELinux サポートを有効にしてコンパイルされた OpenSSH パッケージ。openssh パッケージを置き換えます。

#### SELinux のユーザースペースユーティリティ

checkpolicy
  SELinux ポリシーを作成するためのツール

libselinux
  セキュリティが求められるアプリケーションのためのライブラリ。semanage と setools に必要な Python バインディングが含まれています。

libsemanage
  ポリシー管理のためのライブラリ。semanage と setools に必要な Python バインディングが含まれています。

libsepol
  バイナリポリシーの操作のためのライブラリ。

policycoreutils
  newrole や setfiles などの SELinux のコアユーティリティ。

sepolgen
  ポリシーソースを解析・修正するための Python ライブラリ。

#### SELinux のポリシーパッケージ

selinux-refpolicy
  コンパイル済みモジュールのバニラなリファレンスポリシー。ヘッダーやドキュメントは付いていますがソースは付いていません。

selinux-refpolicy-src
  リファレンスポリシーのソース

selinux-refpolicy-arch
  コンパイル済みモジュールのリファレンスポリシー。ヘッダーやドキュメントは付いていますがソースは付いていません。Arch Linux の Refpolicy パッチが含まれていますが、2011年2月現在、`/etc/rc.d/*` のラベリングに関する問題を修正しているだけです。

Note: selinux-refpolicy-arch パッケージが最後に更新されたのは2011年であり、今でも使えるかは不確かです。

#### その他の SELinux のツール

setools
  SELinux を管理するための CLI と GUI ツール。

### インストール

SELinux の使用をサポートしているファイルシステムは ext2, ext3, ext4, JFS, XFS, BtrFS だけです。3.13 のカーネルアップデートから、SELinux を動作させるのに必要なオプションはデフォルトのカーネル設定で有効になっており、デフォルトで何の問題もないはずです。カスタムカーネルを使用する場合は、コンフィグで Xattr (Extended Attributes), `CONFIG_AUDIT`, `CONFIG_SECURITY_SELINUX` を有効にするようにしてください (ソース: Debian Wiki)。

Note: NVIDIA グラフィックドライバーなどの、プロプライエタリなドライバーを使っている場合、カスタムカーネルを使うためにリビルドする必要があります。

必要な SELinux パッケージをインストールする方法は2つあります。

#### 非公式リポジトリを使用

`pacman.conf` に siosm-selinux リポジトリを追加して Siosm のキーを追加してください。

それから `su -` コマンドを使うか root でログインして以下のパッケージをインストールします:

- pambase-selinux
- pam-selinux
- coreutils-selinux
- libsemanage
- shadow-selinux
- libcgroup
- policycoreutils
- cronie-selinux
- findutils-selinux
- selinux-flex
- selinux-logrotate
- openssh-selinux
- psmisc-selinux
- python2-ipy
- setools
- systemd-selinux

Warning: 以上のパッケージをインストールするのに sudo コマンドは使わないで下さい。sudo の認証に使われる pam が置き換わるためです。

#### AUR を使用

このセクションは主に jamesthebard のドキュメントによります。

最初にインストールが必要なのは pambase-selinux と pam-selinux です。ただし、`yaourt -S selinux-pam selinux-pambase` を使ったり、ビルドした後にパッケージをインストールするのに `sudo` を使わないで下さい。pam が認証を処理しているためです。そのため、`makepkg` を使って通常ユーザーでパッケージをビルドしてから、root で `pacman -U <packagename>` を実行してインストールしてください。

次に、AUR から coreutils-selinux, libsemanage, shadow-selinux, libcgroup, policycoreutils, cronie-selinux, findutils-selinux, selinux-flex, logrotate-selinux, openssh-selinux, psmisc-selinux をビルドしてインストール、community リポジトリから python2-ipy をインストールする必要があります。

Tip: openssh-selinux パッケージは gui 環境でビルドする必要があります。そうしないとコンパイル中に pairs.sh のテストが失敗します。

そして setools パッケージです。このパッケージをビルドするには、jdk7-openjdk パッケージをインストールして、`JAVA_HOME` 変数を正しく設定しておく必要があります。設定されてない場合はパッケージをインストールした後に、次を実行:

    $ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk

その後、`/etc/sudoers` ファイルをバックアップします。sudo-selinux, checkpolicy, util-linux-selinux, systemd-selinux をインストールしてください。

### ブートローダーの設定の変更

新しいカーネルをインストールしたら、ブートローダーの設定を更新してください。

#### GRUB

次のコマンドを実行:

    # grub-mkconfig -o /boot/grub/grub.cfg

#### Syslinux

`syslinux.cfg` ファイルを編集して一番最後に以下を追加:

    /boot/syslinux/syslinux.cfg

    LABEL arch-selinux
             LINUX ../vmlinuz-linux-selinux
             APPEND root=/dev/sda2 ro
             INITRD ../initramfs-linux-selinux.img

"linux-selinux" は使用するカーネルにあわせて適当に変更してください。

### PAM の確認

ログイン後に適切なセキュリティコンテキストを得るために PAM を正しく設定する必要があります。以下の行が `/etc/pam.d/system-login` に存在するか確認してください:

    # pam_selinux.so close should be the first session rule
    session         required        pam_selinux.so close

    # pam_selinux.so open should only be followed by sessions to be executed in the user context
    session         required        pam_selinux.so open

### ポリシーのインストール

Warning: Tresys によるリファレンスポリシーはあまり Arch Linux に適しているとは言えません。ほとんどのファイルが正しくラベル付けされてないからです。しかしながら、執筆時点では、Archer には他に選択肢がありません。この問題の解決について何か発展があったら、ぜひ AUR で共有してください。主な問題は以下の通りです:

- `/lib` と `/usr/lib` は別のディレクトリとして扱われています (`/bin`, `/sbin`, `/usr/bin`, `/usr/sbin` も同様)。そのせいでシステム全体にラベルを適用する時に不安定になります。
- systemd はまだサポートされていません (refpolicy のメインデベロッパーである C. PeBenito は2014年10月に GitHub で systemd に対応する作業を行っていることを発表しています: http://oss.tresys.com/pipermail/refpolicy/2014-October/007430.html )。

ポリシーは SELinux の基幹です。ポリシーによって SELinux の挙動は左右されます。現在 AUR にはリファレンスポリシーだけが存在します。リファレンスポリシーをインストールするには、ソースファイルを使う必要があり、selinux-refpolicy-src パッケージから取得するか https://github.com/TresysTechnology/refpolicy/wiki/DownloadRelease#current-release から最新のリリースをダウンロードすることができます。AUR のパッケージを使う場合、`/etc/selinux/refpolicy/src/policy` まで移動して以下のコマンドを実行してリファレンスポリシーをインストールしてください:

    # make bare
    # make conf
    # make install

SELinux ポリシーの書き方を知っているならば上記のコマンドを実行する前に存分にポリシーを調整することができます。コマンドはしばらく時間がかかりジョブを実行してシステムの1つのコアに負担をかけます、心配は要りません。のんびりと構えてコマンドを実行させておいて下さい。

リファレンスポリシーをロードするには次を実行:

    # make load

そして、以下の内容で `/etc/selinux/config` ファイルを作成してください (Only works if you used the defaults as mentioned above. If you decided to change the name of the policy, you need to tweak the file):

    /etc/selinux/config

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #                   Set this value once you know for sure that SELinux is configured the way you like it and that your system is ready for deployment
    #       permissive - SELinux prints warnings instead of enforcing.
    #                    Use this to customise your SELinux policies and booleans prior to deployment. Recommended during policy development.
    #       disabled - No SELinux policy is loaded.
    #                  This is not a recommended setting, for it may cause problems with file labelling
    SELINUX=permissive
    # SELINUXTYPE= takes the name of SELinux policy to
    # be used. Current options are:
    #       refpolicy (vanilla reference policy)
    #       <custompolicy> - Substitute <custompolicy> with the name of any custom policy you choose to load
    SELINUXTYPE=refpolicy

ここで、再起動が必要です。再起動したら、次を実行してファイルシステムにラベルを付けて下さい:

    # restorecon -r /

その後、以下の内容で `requiredmod.te` ファイルを作成します:

    requiredmod.te

    module requiredmod 1.0;

    require {
            type devpts_t;
            type kernel_t;
            type device_t;
            type var_run_t;
            type udev_t;
            type hugetlbfs_t;
            type udev_tbl_t;
            type tmpfs_t;
            class sock_file write;
            class unix_stream_socket { read write ioctl };
            class capability2 block_suspend;
            class dir { write add_name };
            class filesystem associate;
    }

    #============= devpts_t ==============
    allow devpts_t device_t:filesystem associate;

    #============= hugetlbfs_t ==============
    allow hugetlbfs_t device_t:filesystem associate;

    #============= kernel_t ==============
    allow kernel_t self:capability2 block_suspend;

    #============= tmpfs_t ==============
    allow tmpfs_t device_t:filesystem associate;

    #============= udev_t ==============
    allow udev_t kernel_t:unix_stream_socket { read write ioctl };
    allow udev_t udev_tbl_t:dir { write add_name };
    allow udev_t var_run_t:sock_file write;

そして以下のコマンドを実行してください:

    # checkmodule -m -o requiredmod.mod requiredmod.te
    # semodule_package -o requiredmod.pp -m requiredmod.mod
    # semodule -i requiredmod.pp

This is required to remove a few messages from `/var/log/audit/audit.log` which are a nuisance to deal with in the reference policy. This is an ugly hack and it should be made very clear that the policy so installed simply patches the reference policy in order to hide the effects of incorrect labelling.

## インストール後の作業

SELinux が動作しているかは `sestatus` で確認できます。以下のように表示されるはずです:

    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             refpolicy
    Current mode:                   permissive
    Mode from config file:          permissive
    Policy MLS status:              disabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      28

コンテキストを適切に維持するには、restorecond を使います:

    # systemctl enable restorecond

再起動しないで enforcing モードに切り替えたい場合、次のコマンドを使います:

    # echo 1 > /sys/fs/selinux/enforce

### スワップファイル

スワップパーティションの代わりにスワップファイルを使う場合、適切なセキュリティコンテキストを設定するために次のコマンドを実行してください:

    # semanage fcontext -a -t swapfile_t "/path/to/swapfile"
    # restorecon /path/to/swapfile

## SELinux の使い方

SELinux は伝統的な Unix のアクセス制御とは異なる方法でセキュリティを定義します。SELinux を理解するにはサンプルを見るのが一番です。例えば、apache のホームページの SELinux セキュリティコンテキストは以下のようになります:

    $ls -lZ /var/www/html/index.html
    -rw-r--r--  username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html

最初の3つと最後のカラムは (Arch) Linux ユーザーなら誰でも見覚えがあるはずです。新しいのは4番目のカラムであり以下のフォーマットになっています:

    user:role:type[:level]

それぞれを説明すると:

1. User: The SELinux user identity. This can be associated to one or more roles that the SELinux user is allowed to use.
2. Role: The SELinux role. This can be associated to one or more types the SELinux user is allowed to access.
3. Type: When a type is associated with a process, it defines what processes (or domains) the SELinux user (the subject) can access. When a type is associated with an object, it defines what access permissions the SELinux user has to that object.
4. Level: This optional field can also be know as a range and is only present if the policy supports MCS or MLS.

これが重要になるのは、自分でポリシーを作成して、SELinux の基本的な構成要素にしたいという場合です。ほとんどの場合リファレンスポリシーで十分間に合うので、理解する必要はありません。ただし、あなたがパワーユーザーであり何か特別な必要性があるのであれば、自ら SELinux のポリシーを作成する方法を学ぶ絶好の機会でしょう。

SELinux の仕組みを理解したい人には こちら のシリーズを読むのをおすすめします。

## トラブルシューティング

SELinux のエラーは systemd の journal で確認できます。例えば `system_u:system_r:policykit_t:s0` ラベルに関する SELinux のメッセージを表示するには、次を実行:

    # journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0

### 便利なツール

SELinux を補助するツール/コマンドがいくつか存在します。

restorecon
  ポリシールールに基づいてファイル/ディレクトリのコンテキストを付け直す (`-R` を付けると再帰的に実行)。
chcon
  指定したファイルのコンテキストを変更。

### 問題の報告

問題の報告は GitHub でしてください: https://github.com/archlinuxhardened/selinux/issues

## 参照

- Security Enhanced Linux
- Gentoo SELinux ハンドブック
- Fedora プロジェクトの SELinux Wiki
- NSA の SELinux 公式ホームページ
- Reference Policy ホームページ
- SELinux Userspace ホームページ
- SETools ホームページ

Categories:

- Security (日本語)
- Kernel (日本語)