SELinux
関連記事
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 が有効になったカーネル | linux, linux-zen, linux-hardened で実装済み | 4.18.8 から公式リポジトリで利用できます。 |
SELinux のユーザースペースツールとライブラリ | AUR で実装: https://aur.archlinux.org/packages/?O=0&K=selinux | https://github.com/archlinuxhardened/selinux に成果があります。 |
SELinux のポリシー | 作業中です。Reference Policy を上流として使用。 | 上流: https://github.com/TresysTechnology/refpolicy (2017年8月5日のリリースから systemd と /usr/bin ディレクトリのサポートがポリシーに統合されました) |
公式の core パッケージと AUR にあるパッケージの変更点:
名前 | 状態とコメント |
---|---|
linux | 起動時に次のカーネルパラメータが必要: selinux=1 security=selinux
|
linux-hardened | 起動時に次のカーネルパラメータが必要: selinux=1 security=selinux
|
coreutils | --with-selinux フラグを使って libselinux とリンクしてリビルドする必要があります。
|
cronie | --with-selinux フラグを使ってリビルドする必要があります。
|
dbus | --enable-libaudit と --enable-selinux フラグを使ってリビルドする必要があります。
|
findutils | libselinux をインストールしてリビルドを行なって SELinux オプションを有効にします。 |
iproute2 | --with-selinux フラグを使ってリビルドする必要があります。
|
logrotate | --with-selinux フラグを使ってリビルドする必要があります。
|
openssh | --with-selinux フラグを使ってリビルドする必要があります。
|
pam | Linux-PAM のために --enable-selinux フラグを使ってリビルドする必要があります。pam_unix2 のパッチが必要で、最近のバージョンの libselinux で実装されている関数を削除します。
|
pambase | 設定を変更して /etc/pam.d/system-login に pam_selinux.so を追加します。
|
psmisc | --with-selinux フラグを使ってリビルドする必要があります。
|
shadow | --with-selinux フラグを使ってリビルドする必要があります。
|
sudo | --enable-selinux フラグを使ってリビルドする必要があります。
|
systemd | --enable-audit と --enable-selinux フラグを使ってリビルドする必要があります。
|
util-linux | --with-selinux フラグを使ってリビルドする必要があります。
|
他の 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 グループに含まれています。
SELinux 対応のシステムユーティリティ
- coreutils-selinuxAUR
- SELinux のサポートを有効にしてコンパイルされた修正版 coreutils パッケージ。coreutils パッケージを置き換えます。
- cronie-selinuxAUR
- SELinux が有効になっている Vixie cron の Fedora フォーク。cronie パッケージを置き換えます。
- dbus-selinuxAUR
- SELinux 対応版の D-Bus。dbus パッケージを置き換えます。
- findutils-selinuxAUR
- 指定したセキュリティコンテキストを使ってファイルの検索をできるようにするため SELinux のサポートを有効にしてコンパイルされたパッチ済みの findutils パッケージ。findutils パッケージを置き換えます。
- iproute2-selinuxAUR
- SELinux のサポートを有効にしてコンパイルされた iproute2 パッケージ。
ss
の-Z
オプションを追加するなどの修正があります。iproute2 パッケージを置き換えます。
- logrotate-selinuxAUR
- SELinux のサポートを有効にしてコンパイルされた Logrotate パッケージ。logrotate パッケージを置き換えます。
- openssh-selinuxAUR
- SELinux のサポートを有効にしてコンパイルされ、ユーザーセッションのセキュリティコンテキストを設定する OpenSSH パッケージ。openssh パッケージを置き換えます。
- pam-selinuxAUR と pambase-selinuxAUR
- pam_selinux.so が入った PAM パッケージとそのベースパッケージ。それぞれ pam と pambase パッケージを置き換えます。
- psmisc-selinuxAUR
- SELinux サポートを有効にしてコンパイルされた Psmisc パッケージ。例えば、
killall
に-Z
オプションを追加します。psmisc パッケージを置き換えます。
- shadow-selinuxAUR
- SELinux サポートを有効にしてコンパイルされた Shadow パッケージ。ログイン後のユーザーに適切なセキュリティコンテキストを設定するように修正された
/etc/pam.d/login
ファイルが含まれています。shadow パッケージを置き換えます。
- sudo-selinuxAUR
- 適切にセキュリティコンテキストを設定する SELinux サポートを有効にしてコンパイルされた修正版 sudo パッケージ。sudo パッケージを置き換えます。
- util-linux-selinuxAUR
- SELinux のサポートを有効にしてコンパイルされた修正版 util-linux パッケージ。util-linux パッケージを置き換えます。
- systemd-selinuxAUR
- SELinux 対応版の Systemd。systemd パッケージを置き換えます。
SELinux のユーザースペースユーティリティ
- checkpolicyAUR
- SELinux ポリシーを作成するためのツール。
- mcstransAUR
- libselinux によって MCS ラベルを変換するのに使われるデーモン。
- libselinuxAUR
- セキュリティが求められるアプリケーションのためのライブラリ。semanage と setools に必要な Python バインディングが含まれています。
- libsemanageAUR
- ポリシー管理のためのライブラリ。semanage と setools に必要な Python バインディングが含まれています。
- libsepolAUR
- バイナリポリシーの操作のためのライブラリ。
- policycoreutilsAUR
- newrole や setfiles などの SELinux のコアユーティリティ。
- restorecondAUR
- ファイルのラベルを管理するデーモン。
- secilcAUR
- CIL (共通中間言語) で書かれた SELinux ポリシーのコンパイラ。
- selinux-dbus-configAUR
- SELinux の設定を管理できる DBus サービス。
- selinux-guiAUR
- SELinux の GUI ツール (system-config-selinux)。
- selinux-pythonAUR と selinux-python2AUR
- SELinux の python ツールとライブラリ (semanage, sepolgen, sepolicy など)。
- selinux-sandboxAUR
- SELinux のサンドボックスツール。
- semodule-utilsAUR
- ポリシーをビルドするときに SELinux モジュールを処理するツール。
SELinux のポリシーパッケージ
- selinux-refpolicy-srcAUR
- リファレンスポリシーのソース。
- selinux-refpolicy-gitAUR
- Arch Linux 用の設定でビルドされるリファレンスポリシーの git マスター (https://github.com/TresysTechnology/refpolicy)。
- selinux-refpolicy-archAUR
- コンパイル済みモジュールのリファレンスポリシー。ヘッダーやドキュメントは付いていますがソースは付いていません。Arch Linux の Refpolicy パッチが含まれており、パスのラベリングと systemd サポートに関連する問題を修正します。パッチは Reference Policy メンテナにも送られており、selinux-refpolicy-archAUR に含まれることで Refpolicy リリースのアップデートが行われます。
その他の SELinux のツール
- setoolsAUR
- SELinux を管理するための CLI と GUI ツール。
- selinux-alpm-hookAUR
- パッケージのインストール・アップデート時に SELinux ポリシーにあわせてファイルをラベリングする pacman フック。
インストール
必要な SELinux パッケージをインストールする方法は2つあります。
AUR を使用
- まず、SELinux のユーザースペースツールとライブラリをインストールしてください。順番は次の通りです (依存関係があるため順番を守る必要があります): libsepolAUR, libselinuxAUR, secilcAUR, checkpolicyAUR, setoolsAUR, libsemanageAUR, semodule-utilsAUR, policycoreutilsAUR, selinux-pythonAUR (python-ipyAUR) が必要), mcstransAUR, restorecondAUR。
- 次に pambase-selinuxAUR と pam-selinuxAUR をインストールして、インストール完了後にユーザーのログインができることを確認します。pambase が pambase-selinuxAUR で置き換えられるときに、
/etc/pam.d/
のファイルが削除されて、作成されなおすためです。 - その後、次のパッケージをインストールしてコアパッケージを再コンパイルしてください: coreutils-selinuxAUR, findutils-selinuxAUR, iproute2-selinuxAUR, logrotate-selinuxAUR, openssh-selinuxAUR, psmisc-selinuxAUR, shadow-selinuxAUR, cronie-selinuxAUR。
- そして、
/etc/sudoers
ファイルをバックアップします。sudo-selinuxAUR をインストールしてから/etc/sudoers
を元に戻してください (sudo を置き換えるときにファイルが上書きされます)。 - 次は util-linux と systemd です。修正できない循環依存が存在するため (FS#39767)、ソースパッケージ systemd-selinuxAUR をビルドしてから、libsystemd-selinuxAUR[リンク切れ: パッケージが存在しません] をインストールして、util-linux-selinuxAUR (と libutil-linux-selinuxAUR) をビルド・インストールし、それから systemd-selinuxAUR を再ビルド・インストールします。
- それから、dbus-selinuxAUR をインストールしてください。
- その後、selinux-alpm-hookAUR をインストールして pacman でパッケージをインストールするたびに restorecon が実行されるようにします。
上記の手順が全て終わったら、SELinux カーネル (linux-selinuxAUR など) とポリシー (selinux-refpolicy-archAUR や selinux-refpolicy-gitAUR など) をインストールします。
GitHub リポジトリを使用
全てのパッケージは https://github.com/archlinuxhardened/selinux でメンテナンスされています。このリポジトリには build_and_install_all.sh
という名前のスクリプトが含まれており、全てのパッケージを正しい順番でビルド・インストール (あるいはアップデート) します。以下はユーザーシェルでスクリプトを使って全てのパッケージをインストールする例です (GPG 鍵をダウンロードしてパッケージのソース tarball を検証します):
$ git clone https://github.com/archlinuxhardened/selinux $ cd selinux $ ./recv_gpg_keys.sh $ ./build_and_install_all.sh
もちろん、スクリプトを実行する前に build_and_install_all.sh
の中身を変更することもできます。例えば既に SELinux のサポートが有効になっているカーネルを使っている場合などに変更を加えます。
ブートローダーの設定の変更
新しいカーネルをインストールしたら、ブートローダーの設定を更新してください。
GRUB
/etc/default/grub
の GRUB_CMDLINE_LINUX_DEFAULT
変数に security=selinux selinux=1
を追加して次のコマンドを実行:
# 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 security=selinux selinux=1 INITRD ../initramfs-linux-selinux.img
"linux-selinux" は使用するカーネルにあわせて適当に変更してください。
systemd-boot
新しいローダーエントリを作成します (例: /boot/loader/entries/arch-selinux.conf
):
/boot/loader/entries/arch-selinux.conf
title Arch Linux SELinux linux /vmlinuz-linux-selinux initrd /initramfs-linux-selinux.img options root=/dev/sda2 ro selinux=1 security=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
ポリシーのインストール
ポリシーは SELinux の基幹です。ポリシーによって SELinux の挙動は左右されます。現在 AUR にはリファレンスポリシーだけが存在します。リファレンスポリシーをインストールするには、ソースファイルを使う必要があり、selinux-refpolicy-srcAUR パッケージから取得するか 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
ファイルを作成してください (上記のデフォルト設定を使用する場合。ポリシーの名前を変更したときは、ファイルを修正する必要があります):
/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
上記の設定はリファレンスポリシーで発生する厄介なメッセージを /var/log/audit/audit.log
から削除するために必要です。汚いハックであり、正しくないラベリングの影響を隠すためにリファレンスポリシーにパッチをあてることを明確にするべきです。
Vagrant 仮想マシンでテスト
Vagrant を使うことで SELinux が設定された Arch Linux の仮想マシンをプロビジョニングできます。現在の環境に影響を与えないで Arch Linux の SELinux を簡単にテストすることが可能です。以下のコマンドを使用してテストしてください:
$ git clone https://github.com/archlinuxhardened/selinux $ cd selinux/_vagrant $ vagrant up $ vagrant ssh
インストール後の作業
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]
それぞれを説明すると:
- User: SELinux のユーザー識別子。SELinux ユーザーが使用することができる複数のロールに関連付けることができます。
- Role: SELinux のロール。SELinux ユーザーがアクセスすることができる複数のタイプに関連付けることができます。
- Type: プロセスにタイプが関連付けられると、SELinux ユーザー (サブジェクト) がアクセスできるプロセスが (ドメイン) が決定します。タイプがオブジェクトと関連付けられた場合、SELinux がオブジェクトにアクセスする際のパーミッションが決まります。
- Level: ポリシーが MCS や 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