SELinux ユーザーおよび管理者のガイド
Security-Enhanced Linux (SELinux) の基本的および高度な設定
概要
パート I. SELinux
第1章 はじめに
~]$ls -l file1-rwxrw-r-- 1 user1 group1 0 2009-08-30 11:03 file1
rwx が、Linux user1 ユーザー (この例では所有者) の file1 へのアクセスを制御します。次の 3 つのパーミッション rw- は、Linux group1 グループの file1 へのアクセスを制御します。最後の 3 つのパーミッション r-- は、その他のユーザーの file1 へのアクセスを制御します。その他のユーザーには、すべてのユーザーとプロセスが含まれます。
~]$ls -Z file1-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
unconfined_u)、ロール (object_r)、タイプ (user_home_t)、およびレベル (s0) を示しています。この情報は、アクセス制限の決定に使用されます。DAC では、アクセスは Linux ユーザー ID とグループ ID のみに基づいて制御されます。SELinux ポリシールールは、DAC ルールの 後 でチェックされることを覚えておくことが重要です。DAC ルールが最初にアクセスを拒否すると、SELinux ポリシールールは使用されません。
注記
1.1. SELinux の利点
- プロセスおよびファイルがすべて、タイプでラベル付けられます。タイプはプロセスのドメインを定義し、ファイルのタイプもあります。プロセスはそれぞれのドメインで実行することで互いに分離しており、SELinux ポリシールールはプロセスがファイルと対話する方法と、プロセス同士が対話する方法を定義します。アクセスは、明確にアクセスを許可するSELinux ポリシールールが存在する場合にのみ、許可されます。
- 粒度の細かいアクセス制御。ユーザーの判断に任され、Linux ユーザーおよびグループ ID に基づいて制御されている従来の UNIX パーミッションにとどまらず、SELinux のアクセス決定は、SELinux ユーザーやロール、タイプ、さらにはオプションとしてレベルなどの利用可能なすべての情報に基づいて判断されます。
- SELinux ポリシーは管理者が定義し、システム全体にわたって強制されるもので、ユーザーの判断で設定されるものではありません。
- 権限のあるエスカレーション攻撃に対する脆弱性が低減されます。プロセスはドメイン内で実行されるので、それぞれが分離されます。SELinux ポリシールールは、プロセスがファイルおよび他のプロセスにアクセスする方法を定義します。あるプロセスが危険にさらされても、攻撃者がアクセスできるのはそのプロセスの通常の機能とそのプロセスがアクセス権を持つ設定になっているファイルのみになります。例えば、Apache HTTP サーバーが危険にさらされても、特定の SELinux ポリシールールでユーザーのホームディレクトリーにあるファイルを読み取る許可が追加されているかそのような設定になっていなければ、攻撃者はそのプロセスを使ってホームディレクトリーにあるファイルを読み取ることはできません。
- SELinux を使用すると、データの秘密性と整合性が強化され、プロセスを信頼できない入力から保護します。
- アンチウィルスソフトウェア
- パスワードやファイアウォール、その他のセキュリティーシステムなどの代わりとなるもの
- オールインワンのセキュリティーソリューション
1.2. SELinux の使用例
- デフォルトのアクションは拒否になります。ファイルを開くプロセスなどでアクセスを許可する SELinux ポリシールールがない場合は、アクセスが拒否されます。
- SELinux は Linux ユーザーを制限できます。SELinux ポリシーには、制限のある SELinux ユーザーが多く存在します。Linux ユーザーを制限のある SELinux ユーザーにマッピングして、これらのユーザーに適用されているセキュリティールールとメカニズムを活用することができます。例えば、ある Linux ユーザーを SELinux
user_uユーザーにマッピングすると、この Linux ユーザーはsudoやsuといったセットユーザー ID (setuid) アプリケーションを (実行可能と設定されている場合以外は) 実行できず、ホームディレクトリーにあるファイルやアプリケーションも実行できません。この設定では、ユーザーが悪意のあるファイルを自身のホームディレクトリーから実行することを防ぎます。 - プロセス分離が使用されます。プロセスはそれぞれのドメインで実行されるので、他のプロセスが使用するファイルやそれらのプロセスに別のプロセスがアクセスすることを防ぎます。例えば SELinux 実行中の場合、攻撃者が Samba サーバーに侵入しても、この Samba サーバーを攻撃者のベクターとして利用して、MariaDB が使用するデータベースなどの他のプロセスが使用するファイルの読み取りや書込みはできません。
- SELinux は、設定ミスによる破損の制限に役立ちます。ドメインネームシステム (DNS) サーバーは、ゾーン転送と呼ばれる DNS サーバー間での情報複製を頻繁に行います。攻撃者は、ゾーン転送を使って、DNS サーバーを偽の情報で更新できます。Red Hat Enterprise Linux で BIND (Berkeley Internet Name Domain) を DNS サーバーとして稼働している場合、ゾーン転送を実行できるサーバーの制限を管理者が忘れても、デフォルトの SELinux ポリシーは、ゾーンファイル[3]が BIND
namedデーモン自体や他のプロセスによってゾーン転送で更新されることを防ぎます。 - SELinux についてのバックグラウンド情報と SELinux が防いだ多種のエクスプロイトについての情報は、NetworkWorld.com の記事、「A seatbelt for server software: SELinux blocks real-world exploits」[4]を参照してください。
1.3. SELinux アーキテクチャー
1.4. SELinux の状態とモード
- Enforcing: SELinux ポリシーが強制されます。SELinux は SELinux ポリシールールに基づいてアクセスを拒否します。
- Permissive: SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、enforcing モードでは拒否されたであろうアクションの拒否がログに記録されます。
setenforce ユーティリティーを使います。setenforce を使った変更は、再起動されると維持されません。enforcing モードへの変更は、Linux root ユーザーで setenforce 1 コマンドを実行します。permissive モードへの変更は、setenforce 0 コマンドを実行します。現在の SELinux モードを表示するには、以下のように getenforce ユーティリティーを実行します。
~]# getenforce
Enforcing~]#setenforce 0~]#getenforcePermissive
~]#setenforce 1~]#getenforceEnforcing
1.5. その他のリソース
第2章 SELinux コンテキスト
~]$ls -Z file1-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
- SELinux user
- SELinux user ID は、特定のロールセットおよび特定の MLS/MCS 範囲への権限があるポリシーに既知の ID です。各 Linux ユーザーは、SELinux ポリシーを使って SELinux ユーザーにマッピングされます。これにより、SELinux ユーザーに課された制限が Linux ユーザーに継承されます。マッピングされた SELinux ユーザー ID は、ユーザーが入ることができるロールやレベルを定義するためにそのセッションのプロセスにおいて SELinux コンテキストで使用されます。SELinux ユーザーアカウントと Linux ユーザーアカウント間のマッピング一覧を表示するには、root で以下のコマンドを入力します。(policycoreutils-python パッケージのインストールが必要になります)。
~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *システムによって出力は多少異なります。Login Nameコラムは Linux ユーザーを一覧表示します。SELinux Userコラムでは、どの SELinux ユーザーに Linux ユーザーがマッピングされているかを一覧表示します。プロセスについてアクセス可能なロールとレベルを SELinux ユーザーが制限します。MLS/MCS Rangeコラムは、MLS (複数レベルセキュリティー) と MCS (複数カテゴリセキュリティー) が使用するレベルです。Serviceコラムは、Linux ユーザーがシステムにログインするはずの適切な SELinux コンテキストを決定します。デフォルトではアスタリスク (*) 記号が使用され、すべてサービスを表します。
- role
- SELinux の一部は RBAC (ロールベースアクセス制御) であり、ロールは RBAC の属性です。SELinux ユーザーはロールに対する権限を有しており、ロールはドメインに対する権限を持っています。ロールは、ドメインと SELinux ユーザーの媒介として機能します。入ることができるロールはどのドメインに入ることができるかを決定し、最終的には、これがどのオブジェクトタイプがアクセス可能かを制御します。これが、権限のあるエスカレーション攻撃における脆弱性の低減に役立ちます。
- type
- タイプは、Type Enforcement の属性です。タイプはプロセスのドメインを定義し、ファイルのタイプを定義します。SELinux ポリシールールは、ドメインがタイプにアクセスする場合でも、ドメインが別のドメインにアクセスする場合でも、タイプ同士がアクセスする方法を定義します。アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、アクセスは許可されます。
- level
- レベルは、MLS および MCS の属性です。MLS 範囲は、レベルが異なる場合は lowlevel-highlevel、レベルが同一の場合は lowlevel と書かれる、一対のレベルです (
s0-s0はs0と同じものです)。各レベルは、秘密度-カテゴリのペアで、カテゴリはオプションです。カテゴリがある場合、レベルは sensitivity:category-set と書かれます。カテゴリがない場合は、sensitivity と書かれます。カテゴリセットが連続したものである場合は、短縮が可能です。例えば、c0.c3はc0,c1,c2,c3と同じことになります。/etc/selinux/targeted/setrans.confファイルは、レベル (s0:c0) をヒューマンリーダブルな形式にマッピングしています (すなわち、CompanyConfidential)。Red Hat Enterprise Linux では、ターゲットポリシーは MCS を強制し、MCS にはs0という秘密度しかありません。Red Hat Enterprise Linux の MCS は、c0からc1023までの 1024 の異なるカテゴリをサポートします。s0-s0:c0.c1023の秘密度はs0で、すべてのカテゴリーに権限があります。MLS は、Bell-La Padula 必須アクセスモデルを強制し、LSPP (Labeled Security Protection Profile) 環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールし、MLS をデフォルトの SELinux ポリシーとするように設定します。Red Hat Enterprise Linux で出荷される MLS ポリシーは、評価済み設定の一部ではないプログラムドメインの多くを省略するので、デスクトップワークステーション上の MLS は使用できません (X Window System ではサポートなし)。しかし、アップストリームの SELinux Reference Policy からの MLS ポリシーは構築が可能で、これにはすべてのプログラムドメインが含まれます。MLS 設定の詳細については、「マルチレベルのセキュリティー (MLS)」を参照してください。
2.1. ドメイン移行
entrypoint タイプがあるアプリケーションを実行することで、別のドメインに移行できます。entrypoint パーミッションは SELinux ポリシーで使用され、ドメインに入るためにどのアプリケーションを使用するかを制御します。以下にドメイン移行の例を示します。
手順2.1 ドメイン移行の例
- ユーザーはパスワードの変更を希望しています。これを行うには、
passwdユーティリティーを実行します。/usr/bin/passwd実行可能ファイルには、passwd_exec_tタイプがラベル付けされています。~]$ls -Z /usr/bin/passwd-rwsr-xr-x root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwdpasswdユーティリティーは、shadow_tタイプのラベルが付けられている/etc/shadowファイルにアクセスします。~]$ls -Z /etc/shadow-r--------. root root system_u:object_r:shadow_t:s0 /etc/shadow - SELinux ポリシールールでは、
passwd_tドメインで実行中のプロセスがshadow_tタイプのラベルが付いているファイルの読み取りおよび書き込みを許可されています。このshadow_tタイプはパスワード変更に必要なファイルにのみ適用されます。これには、/etc/gshadowと/etc/shadowファイル、およびこれらのバックアップファイルが含まれます。 - SELinux ポリシールールでは、
passwd_tドメインにはpasswd_exec_tタイプへのentrypointパーミッションがあるとしています。 - ユーザーが
passwdユーティリティーを実行すると、ユーザーのシェルプロセスがpasswd_tドメインに移行します。SELinux ではデフォルトのアクションが拒否となっていますが、passwd_tドメインで実行中のアプリケーションがshadow_tタイプのラベルが付いたファイルにアクセスすることを許可するルールが存在することから、passwdアプリケーションは/etc/shadowファイルへのアクセスが許可され、ユーザーのパスワードを更新することができます。
passwd_t ドメインで実行中のサブジェクトが shadow_t ファイルタイプのラベルが付けられたオブジェクトへアクセスすることを許可するルールは実際にありますが、サブジェクトが新たなドメインに移行する前に、他の SELinux ポリシールールが満たされる必要があります。この例では、Type Enforcement が以下のことを確認します。
passwd_tドメインには、passwd_exec_tタイプのラベルが付いたアプリケーションを実行することでしか、入ることができない。このドメインは、lib_tタイプのような権限のある共有ライブラリーからしか実行できない。また、他のいかなるアプリケーションも実行できない。passwd_tのような、権限のあるドメインしかshadow_tタイプのラベルが付けられたファイルに書き込めない。他のプロセスがスーパーユーザー権限で実行されていても、passwd_tドメインで実行されているわけではないので、これらのプロセスはshadow_tタイプのラベルが付けられたファイルには書き込めない。passwd_tドメインに移行できるのは、権限のあるドメインのみ。例えば、sendmail_tドメインで実行中のsendmailプロセスにはpasswdを実行する正当な理由がないので、passwd_tドメインに移行することは決してありません。passwd_tドメインで実行中のプロセスが読み取りおよび書き込みができる権限タイプは、etc_tまたはshadow_tタイプといったラベルが付けられたファイルのみです。これにより、passwdアプリケーションがだまされて任意のファイルを読み取りまたは書き込みすることを防ぎます。
2.2. プロセスの SELinux コンテキスト
ps -eZ コマンドを実行します。例を示します。
手順2.2 passwd ユーティリティーの SELinux コンテキストを表示する
- → → の順に選択して、端末を開きます。
passwdユーティリティーを実行します。新たなパスワードは入力しないでください。~]$passwdChanging password for user user_name. Changing password for user_name. (current) UNIX password:- 新しいタブか別の端末を開いて、以下のコマンドを実行します。出力は以下のようになります。
~]$ps -eZ | grep passwdunconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 13212 pts/1 00:00:00 passwd - 最初のタブまたは端末で
Ctrl+Cを押して、passwdユーティリティーをキャンセルします。
passwd ユーティリティーの実行時 (passwd_exec_t タイプのラベルが付けられている) にユーザーのシェルプロセスが passwd_t ドメインに移行します。タイプはプロセスのドメインとファイルのタイプを定義することに留意してください。
ps ユーティリティーを実行します。以下の出力例は省略されており、システムによっては異なる場合があることに注意してください。
]$ps -eZsystem_u:system_r:dhcpc_t:s0 1869 ? 00:00:00 dhclient system_u:system_r:sshd_t:s0-s0:c0.c1023 1882 ? 00:00:00 sshd system_u:system_r:gpm_t:s0 1964 ? 00:00:00 gpm system_u:system_r:crond_t:s0-s0:c0.c1023 1973 ? 00:00:00 crond system_u:system_r:kerneloops_t:s0 1983 ? 00:00:05 kerneloops system_u:system_r:crond_t:s0-s0:c0.c1023 1991 ? 00:00:00 atd
system_r ロールがデーモンなどのシステムプロセスに使われています。その後に、Type Enforcement が各ドメインを分離しています。
2.3. ユーザーの SELinux コンテキスト
~]$id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u ユーザーにマッピングされ、unconfined_r ロールとして実行し、unconfined_t ドメインで実行していることを示しています。s0-s0 は MLS 範囲で、このケースでは s0 と同じです。ユーザーにアクセス権があるカテゴリは c0.c1023 で定義され、これは全カテゴリになります (c0 から c1023 まで)。
第3章 ターゲットポリシー
unconfined_t ドメインで実行し、init で開始されたシステムプロセスは unconfined_service_t ドメインで実行されます。このドメインは両方とも、制限のないものです。
3.1. 制限のあるプロセス
sshd や httpd といったネットワーク上でリッスンするサービスは、ほとんどすべて制限があります。また、passwd ユーティリティーなど、root ユーザーとして実行し、ユーザーのためのタスクを実行するプロセスはほとんど制限があります。プロセスに制限があると、プロセス自体のドメイン内で実行されます。例えば、httpd_t ドメイン内で httpd プロセスが実行される、といったようにです。制限のあるプロセスが攻撃者によって危険にさらされても、SELinux ポリシーの設定によって、攻撃者のリソースへのアクセスや攻撃による損害は限定されます。
手順3.1 SELinux ステータスの確認方法
- SELinux が有効で enforcing モードで稼働しており、ターゲットポリシーが使用されていることを確認します。正常な出力は、以下のようになります。
~]$sestatusSELinux status: enabled SELinuxfs mount: /sys/fs/selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targetedSELinux モードの変更についての詳細は、「SELinux の状態とモードの永続的変更」を参照してください。 - root で
/var/www/html/ディレクトリーにファイルを作成します。~]#touch /var/www/html/testfile - 作成されたファイルの SELinux コンテンツを表示するには、以下のコマンドを実行します。
~]$ls -Z /var/www/html/testfile-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfileRed Hat Enterprise Linux ではデフォルトで、Linux ユーザーには制限がありません。そのため、testfileファイルに SELinuxunconfined_uユーザーのラベルが付けられてます。RBAC はファイルでなくプロセスに使用されます。ロールはファイルにとって意味がありません。object_rロールは、ファイルに使われる一般的なロールです (永続的なストレージおよびネットワークファイルシステム)。/procディレクトリー下では、プロセスに関連するファイルはsystem_rロールを使用することができます。httpd_sys_content_tタイプは、httpdプロセスがこのファイルにアクセスすることを許可します。
httpd) が読み取らないように SELinux が防ぐ例を示します。これはあくまで例であり、実稼働環境では用いないでください。ここでは、httpd および wget パッケージがインストールされ、SELinux ターゲットポリシーが使われ、SELinux が enforcing モードで実行されていることを前提としています。
手順3.2 制限のあるプロセスの例
- root で
httpdデーモンを起動します。~]#systemctl start httpd.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]$systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago - Linux ユーザーでの書き込みアクセスがあるディレクトリーに切り替え、以下のコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは成功します。
~]$wget http://localhost/testfile--2009-11-06 17:43:01-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ] 0 --.-K/s in 0s 2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0] chconコマンドでファイルのラベルを付け換えます。ただし、ファイルシステムのラベルが付け換えられると、この変更は失われます。ファイルシステムのラベルが付け換えられた場合でも、こうした変更を永続的に維持するには、semanageユーティリティーを使用します。このコマンドについては後で説明します。root で以下のコマンドを実行し、タイプを Samba で使用されるタイプに変更します。~]#chcon -t samba_share_t /var/www/html/testfile以下のコマンドを実行して、変更を表示します。~]$ls -Z /var/www/html/testfile-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile- 現行の DAC パーミッションは、
httpdプロセスがtestfileにアクセスすることを許可することに留意してください。ユーザーとしての書き込みアクセスがあるディレクトリーに切り替え、以下のコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。~]$wget http://localhost/testfile--2009-11-06 14:11:23-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 403 Forbidden 2009-11-06 14:11:23 ERROR 403: Forbidden. - root で
testfileを削除します。~]#rm -i /var/www/html/testfile httpdの実行が必要がない場合は、root で以下のコマンドを実行して停止します。~]#systemctl stop httpd.service
httpd プロセスによる testfile へのアクセスを許可しますが、このファイルは httpd プロセスにアクセス権のないタイプでラベル付けされているので、SELinux はアクセスを拒否しました。
auditd デーモンが稼働していれば、以下のようなエラーが、/var/log/audit/audit.log にログ記録されます。
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)/var/log/httpd/error_log にログ記録されます。
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
3.2. 制限のないプロセス
init で実行される制限のないサービスは unconfined_service_t ドメインで、カーネルで実行される制限のないサービスは kernel_t ドメインで、制限のない Linux ユーザーによって実行される制限のないサービスは unconfined_t ドメインで実行されることになります。制限のないプロセスでは SELinux ポリシールールが適用されますが、既存のポリシールールは制限のないドメイン内で実行中のプロセスにほとんどすべてのアクセスを許可します。制限のないドメイン内で実行中のプロセスは、ほとんど DAC ルールにフォールバックします。制限のないプロセスが危険にさらされても、SELinux は攻撃者によるシステムリソースやデータへのアクセス獲得を阻止しません。しかし、もちろん DAC ルールは常に使われます。SELinux は DAC ルールの上に加わるもので、DAC ルールに取って代わるものではありません。
httpd) が Samba 向けのデータにアクセスできる様子を示します。Red Hat Enterprise Linux ではデフォルトで、httpd プロセスは制限のある httpd_t ドメイン内で実行されることに留意してください。これはあくまで例であり、本番環境では用いないでください。ここでは httpd、wget、dbus、audit パッケージがインストールされ、SELinux ターゲットポリシーが使われ、SELinux が enforcing モードで実行されていることを前提としています。
手順3.3 制限のないプロセスの例
chconコマンドでファイルのラベルを付け換えます。ただし、ファイルシステムのラベルが付け換えられると、この変更は失われます。ファイルシステムのラベルが付け換えられた場合でも、こうした変更を永続的に維持するには、semanageユーティリティーを使用します。このコマンドについては後で説明します。root ユーザーで以下のコマンドを実行し、タイプを Samba で使用されるタイプに変更します。~]#chcon -t samba_share_t /var/www/html/testfile変更を表示します。~]$ls -Z /var/www/html/testfile-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile- 以下のコマンドを実行し、
httpdプロセスが稼働していないことを確認します。~]$systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)出力が異なる場合は、root ユーザーで以下のコマンドを実行し、httpdプロセスを停止します。~]#systemctl stop httpd.service httpdプロセスを制限なしで実行する場合は、root ユーザーで以下のコマンドを実行し、/usr/sbin/httpdファイルのタイプを制限のあるドメインに移行しないものに変更します。~]#chcon -t bin_t /usr/sbin/httpd/usr/sbin/httpdにbin_tタイプがラベル付けされていることを確認します。~]$ls -Z /usr/sbin/httpd-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/sbin/httpd- root で
httpdプロセスを起動し、これが正常に起動したことを確認します。~]#systemctl start httpd.service~]#systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Thu 2013-08-15 11:17:01 CEST; 5s ago - 以下のコマンドを実行し、
httpdがunconfined_service_tドメインで実行中であることを確認します。~]$ps -eZ | grep httpdsystem_u:system_r:unconfined_service_t:s0 11884 ? 00:00:00 httpd system_u:system_r:unconfined_service_t:s0 11885 ? 00:00:00 httpd system_u:system_r:unconfined_service_t:s0 11886 ? 00:00:00 httpd system_u:system_r:unconfined_service_t:s0 11887 ? 00:00:00 httpd system_u:system_r:unconfined_service_t:s0 11888 ? 00:00:00 httpd system_u:system_r:unconfined_service_t:s0 11889 ? 00:00:00 httpd - Linux ユーザーでの書き込みアクセスがあるディレクトリーに切り替え、以下のコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは成功します。
~]$wget http://localhost/testfile--2009-05-07 01:41:10-- http://localhost/testfile Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 0 [text/plain] Saving to: `testfile' [ <=> ]--.-K/s in 0s 2009-05-07 01:41:10 (0.00 B/s) - `testfile' saved [0/0]httpdプロセスにはsamba_share_tタイプのラベルが付いたファイルへのアクセス権はありませんが、httpdは制限のないunconfined_service_tドメインで実行しており、DAC ルールにフォールバックします。このため、wgetコマンドは成功します。もしhttpdが制限のあるhttpd_tドメインで実行していたら、wgetコマンドは失敗していたでしょう。 restoreconユーティリティーは、ファイルのデフォルト SELinux コンテキストを復元します。root で以下のコマンドを実行すると、/usr/sbin/httpdのデフォルトの SELinux コンテキストが復元されます。~]#restorecon -v /usr/sbin/httpdrestorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0/usr/sbin/httpdにhttpd_exec_tタイプがラベル付けされていることを確認します。~]$ls -Z /usr/sbin/httpd-rwxr-xr-x root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd- root で以下のコマンドを実行して
httpdを再起動します。再起動したら、httpdが制限のあるhttpd_tドメインで実行していることを確認します。~]#systemctl restart httpd.service~]$ps -eZ | grep httpdsystem_u:system_r:httpd_t:s0 8883 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8884 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8885 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8886 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8887 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8888 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 8889 ? 00:00:00 httpd - root で
testfileを削除します。~]#rm -i /var/www/html/testfilerm: remove regular empty file `/var/www/html/testfile'? y httpdの実行が必要がない場合は、root で以下のコマンドを実行してhttpdを停止します。~]#systemctl stop httpd.service
3.3. 制限のあるユーザーおよび制限のないユーザー
semanage login -l を実行すると、この Linux ユーザーマッピングが表示されます。
~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
__default__ ログインにマッピングされ、これはさらに SELinux unconfined_u ユーザーにマッピングされます。以下の行でデフォルトのマッピングを定義します。
__default__ unconfined_u s0-s0:c0.c1023
unconfined_u ユーザーにマッピングする方法を示しています。ここでは Red Hat Enterprise Linux のデフォルトにあるように、root ユーザーが制限なしで実行中であることを前提としています。
手順3.4 新規 Linux ユーザーを SELinux unconfined_u ユーザーにマッピングする
- root で以下のコマンドを実行し、ユーザー名
newuserという新規 Linux ユーザーを作成します。~]#useradd newuser - Linux
newuserユーザーにパスワードを割り当てるには、root で以下のコマンドを実行します。~]#passwd newuserChanging password for user newuser. New UNIX password: Enter a password Retype new UNIX password: Enter the same password again passwd: all authentication tokens updated successfully. - 現行セッションから一旦ログアウトし、Linux
newuserユーザーでログインし直します。ログインすると、pam_selinux PAM モジュールが自動的にこの Linux ユーザーを SELinux ユーザーにマッピングし (このケースではunconfined_u)、SELinux コンテキストを設定します。その後は、このコンテキストで Linux ユーザーのシェルが起動されます。以下のコマンドを実行して、Linux ユーザーのコンテキストを表示します。[newuser@localhost ~]$id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023注記
システム上でnewuserユーザーが不要になれば、Linuxnewuserのセッションからログアウトし、自分のアカウントにログインして、root でuserdel -r newuserコマンドを実行します。これでnewuserがこのユーザーのホームディレクトリーとともに削除されます。
unconfined_t ドメインから自身の制限のあるドメインへの移行が可能と SELinux ポリシーが定義しているアプリケーションを、制限のない Linux ユーザーが実行しても、この制限のない Linux ユーザーはまだその制限のあるドメインの制約に影響を受けます。ここでのセキュリティーの利点は、Linux ユーザーが制限なしで実行していてもアプリケーションには制限が残っているという点です。このため、アプリケーションの欠点が悪用されても、ポリシーで制限できます。
表3.1 SELinux ユーザーの権限
| ユーザー | ロール | ドメイン | X Window System | su または sudo | ホームディレクトリーおよび /tmp (デフォルト) で実行 | ネットワーキング |
|---|---|---|---|---|---|---|
| sysadm_u | sysadm_r | sysadm_t | はい | su および sudo | はい | はい |
| staff_u | staff_r | staff_t | はい | sudo のみ | はい | はい |
| user_u | user_r | user_t | はい | いいえ | はい | はい |
| guest_u | guest_r | guest_t | いいえ | いいえ | いいえ | いいえ |
| xguest_u | xguest_r | xguest_t | はい | いいえ | いいえ | Firefox のみ |
user_t、guest_t、xguest_tドメインの Linux ユーザーは、SELinux ポリシーが許可する場合に、決まったユーザー ID (setuid) アプリケーションしか実行できません (例、passwd)。これらのユーザーはsuやsudosetuid アプリケーションを実行できないので、これらのアプリケーションを使って root になることができません。sysadm_t、staff_t、user_t、xguest_tドメイン内の Linux ユーザーは、X Window System と端末を使用してログインできます。- デフォルトでは、
guest_tとxguest_tドメインの Linux ユーザーは、自分のホームディレクトリーや/tmpではアプリケーションを実行できません。つまり、書き込みアクセス権限を持つディレクトリーでユーザーのパーミッションを継承するアプリケーションを実行することはできません。これにより、欠陥のあるアプリケーションや悪意のあるアプリケーションがそのユーザーのファイルを修正できないようにしています。 - デフォルトでは、
staff_tとuser_tドメインの Linux ユーザーは、自分のホームディレクトリーや/tmpでアプリケーションを実行することが可能です。ユーザーがホームディレクトリーと/tmpでアプリケーションを実行するのを許可/阻止することに関する情報は、「アプリケーションを実行するユーザーのためのブール値」を参照してください。 xguest_tドメインの Linux ユーザーにある唯一のネットワークアクセスは、ウェブページに接続する Firefox です。
webadm_rは、Apache HTTP サーバーに関連する SELinux タイプの処理のみが可能です。詳細は、「タイプ」を参照してください。logadm_rは、syslogおよびauditlogプロセスに関連する SELinux タイプの処理のみが可能です。secadm_rは SELinux の処理のみが可能です。auditadm_rは、auditサブシステムに関連するプロセスの処理のみが可能です。
~]$seinfo -r
seinfo コマンドは、デフォルトではインストールされない setools-console パッケージが提供することに注意してください。
3.3.1. sudo 移行および SELinux ロール
sudo コマンドを使って 制限のある管理者の SELinux ロールを獲得する必要があります。sudo コマンドは、信頼できるユーザーに管理者アクセスを付与するために使用されます。ユーザーが sudo を管理者コマンドの前に置いた場合、このユーザーは ユーザー自身の パスワードを要求されます。ユーザーが認証され、コマンドが許可されると、管理者コマンドは root ユーザーであるかのように実行されます。
staff_u および sysadm_u の制限のある SELinux ユーザーのみがデフォルトで sudo の使用を許可されています。それらのユーザーが sudo を使ってコマンドを実行すると、ユーザーのロールは /etc/sudoers 設定ファイルか、ある場合は /etc/sudoers.d/ ディレクトリー内の各ファイルで指定されているルール基づいて変更することができます。
手順3.5 sudo 移行の設定
sudo を設定して、新規作成の SELinux_user_u の制限のあるユーザーを default_role_t から administrator_r の管理者ロールに移行する方法を説明します。既存の SELinux ユーザーに対して制限のある管理者ロールを設定するには、最初の 2 ステップを省略してください。また、以下のコマンドは root ユーザーで実行する必要があることに注意してください。以下の手順のプレースホルダー (default_role_t または administrator_r 等) についてより深く理解するには、ステップ 6 の例を参照してください。
- 新規 SELinux ユーザーを作成し、そのユーザーに対してデフォルトの SELinux ロールと補助的な制限のある管理者ロールを指定します。
~]#semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u - デフォルトの SElinux ポリシーコンテキストファイルをセットアップします。たとえば、
staff_uSELinux ユーザーと同じ SELinux ルールを用意するには、staff_uコンテキストファイルをコピーします。~]#cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u - 新規作成の Linux ユーザーを既存の Linux ユーザーにマッピングします。
semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user /etc/sudoers.d/ディレクトリー内に Linux ユーザーと同じ名前で新規設定ファイルを作成し、以下の文字列を追加します。~]#echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/sh " > /etc/sudoers.d/linux_userrestoreconユーティリティーを使って linux_user ホームディレクトリーのラベルを付け替えます。~]#restorecon -FR -v /home/linux_user- 新規作成の Linux ユーザーとしてログインすると、このユーザーはデフォルトの SELinux ロールでラベル付けされます。
~]$id -ZSELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023sudoを実行すると、そのユーザーの SELinux コンテキストは/etc/sudoers.d/linux_userで指定されている補助的な SELinux ロールに変更されます。sudoで-iオプションを使用すると、インタラクティブシェルが実行されます。~]$sudo -i~]#id -ZSELinux_user_u:administrator_r:administrator_t:s0-s0:c0.c1023最初のステップで指定された例のSELinux_user_uユーザーの場合、出力は以下のようになります。~]$id -Zconfined_u:staff_r:staff_t:s0:c0.c1023~]$sudo -i~]#id -Zconfined_u:webadm_r:webadm_t:s0:c0.c1023以下の例では、デフォルトで割り当てられるstaff_rロールと、sudoがconfined_uのロールをstaff_rからwebadm_rに変更するよう設定されている SELinux ユーザーconfined_uを新規に作成します。~]#semanage user -a -r s0-s0:c0.c1023 -R "staff_r webadm_r" confined_u~]#cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/confined_u~]#semanage login -a -s confined_u -rs0:c0.c1023 linux_user~]#restorecon -FR -v /home/linux_user~]#echo "linux_user ALL=(ALL) TYPE=webadm_t ROLE=webadm_r /bin/sh " > /etc/sudoers.d/linux_user新規作成の Linux ユーザーとしてログインすると、このユーザーはデフォルトの SELinux ロールでラベル付けされます。~]$id -Zconfined_u:staff_r:staff_t:s0:c0.c1023~]$sudo -i~]#id -Zconfined_u:webadm_r:webadm_t:s0:c0.c1023
第4章 SELinux を使った作業
mount コマンドによるファイルシステムラベルの上書き、NFS ボリュームのマウント、ファイルおよびディレクトリーのコピーおよびアーカイブ時における SELinux コンテキストの保存方法。
4.1. SELinux パッケージ
- policycoreutils は、
restorecon、secon、setfiles、semodule、load_policy、およびsetseboolを提供して SELinux を操作、管理します。 - selinux-policy は、基本的なディレクトリー構造である
selinux-policy.confファイルと RPM マクロを提供します。 - selinux-policy-targeted は、SELinux ターゲットポリシーを提供します。
- libselinux は、SELinux アプリケーション用の API を提供します。
- libselinux-utils は、
avcstat、getenforce、getsebool、matchpathcon、selinuxconlist、selinuxdefcon、selinuxenabled、およびsetenforceのユーティリティーを提供します。 - libselinux-python は、SELinux アプリケーション開発用の Python バインディングを提供します。
yum install <package-name> コマンドを実行するとオプションでインストールできます。
- selinux-policy-devel は、カスタム SELinux ポリシーとポリシーモジュール作成用ユーティリティーを提供します。
- selinux-policy-doc は、SELinux と他のサービスを合わせて設定する方法を記述した man ページを提供します。
- selinux-policy-mls は、MLS (複数レベルのセキュリティー) SELinux ポリシーを提供します。
- setroubleshoot-server は、SELinux がアクセスを拒否した際に作成される拒否メッセージを、
sealertユーティリティーで表示可能な詳細な記述に変換します。このユーティリティーも本パッケージで提供されます。 - setools-console は、ポリシー分析およびクエリ、監査ログモニタリングおよびレポーティング、ファイルコンテキスト管理用の数多くのユーティリティーとライブラリーである Tresys Technology SETools distribution を提供します。setools パッケージは、SETools 用のメタパッケージです。setools-gui パッケージは、
apolとseauditの各ユーティリティーを提供します。setools-console パッケージは、sechecker、sediff、seinfo、sesearch、およびfindconの各コマンドラインユーティリティーを提供します。これらのユーティリティーに関する詳細情報は、Tresys Technology SETools ページを参照してください。setools と setools-gui の各パッケージは、Red Hat Network Optional チャンネルが有効になっている時のみ利用可能であることに注意してください。詳細は、「対象範囲の詳細」を参照してください。 - mcstrans は、
s0-s0:c0.c1023のようなレベルをSystemLow-SystemHighといった読みやすい形式に変換します。 - policycoreutils-python は、SELinux の操作および管理用の
semanage、audit2allow、audit2why、chcatといった各種ユーティリティーを提供します。 - policycoreutils-gui は、SELinux 管理用のグラフィカルユーティリティーである
system-config-selinuxを提供します。
4.2. 使用するログファイル
yum install setroubleshoot-server コマンドを使用) を使用してインストールする必要があります。
auditd が実行中であれば、以下のような SELinux 拒否メッセージはデフォルトで /var/log/audit/audit.log に書き込まれます。
type=AVC msg=audit(1223024155.684:49): avc: denied { getattr } for pid=2000 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=399185 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:samba_share_t:s0 tclass=file/var/log/message ファイルに書き込まれます。
May 7 18:55:56 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l de7e30d6-5488-466d-a606-92c9f40d316d
setroubleshootd はすでに定期的なサービスとしては稼働していませんが、AVC メッセージの分析にはまだ使われています。必要に応じて以下の 2 つのプログラムが setroubleshoot を開始する方法として作動します。
sedispatchユーティリティーは、auditサブシステムの一部として実行されます。AVC 拒否メッセージが返されると、sedispatchはdbusを使ってメッセージを送信します。これらのメッセージは、setroubleshootdが実行中であればそこに直接送られます。実行中でなければ、sedispatchがこれを自動的に開始します。seappletユーティリティーはシステムツールバーで実行され、setroubleshootd内の dbus メッセージを待機します。通知バブルを開始して、ユーザーが AVC メッセージを検討できるようにします。
手順4.1 デーモンの自動開始
auditdおよびrsyslogデーモンが起動時に自動的に開始するように設定するには、root ユーザーで以下のコマンドを実行します。~]#systemctl enable auditd.service~]#systemctl enable rsyslog.service- これらのデーモンが有効であることを確認するには、シェルプロンプトで次のコマンドを入力します。
~]$systemctl is-enabled auditdenabled~]$systemctl is-enabled rsyslogenabled別の方法では、systemctl status service-name.serviceコマンドを使ってenabledというキーワードをコマンド出力で検索します。例を示します。~]$systemctl status auditd.service | grep enabledauditd.service - Security Auditing Service Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
4.3. 主要設定ファイル
/etc/selinux/config は、主要 SELinux 設定ファイルです。これは、SELinux を有効にするか無効にするか、また、使用する SELinux モードと SELinux ポリシーを管理します。
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
SELINUX=SELINUXオプションは、SELinux を有効または無効にするか、および enforcing または permissive のどちらのモードで実行するか、を設定します。SELINUX=enforcingを使用すると SELinux ポリシーは強制され、SELinux ポリシールールに基づいて SELinux がアクセスを拒否します。拒否メッセージはログ記録されます。SELINUX=permissiveを使用すると、SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、enforcing モードでは拒否されたであろうアクションの拒否がログに記録されます。SELINUX=disabledを使用すると、SELinux は無効になり、SELinux モジュールは Linux カーネルに登録されません。DAC ルールのみが使用されます。
SELINUXTYPE=SELINUXTYPEオプションは、使用する SELinux ポリシーを設定します。ターゲットポリシーがデフォルトのポリシーです。MLS ポリシーを使用する場合にのみ、このオプションを変更してください。MLS ポリシーの有効化については、「SELinux における MLS の有効化」を参照してください。
4.4. SELinux の状態とモードの永続的変更
getenforce または sestatus コマンドを使います。getenforce コマンドは、Enforcing、Permissive、Disabled のいずれかを返します。
sestatus コマンドは、SELinux のステータスと使用されている SELinux ポリシーを返します。
~]$sestatusSELinux status: enabled SELinuxfs mount: /sys/fs/selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
注記
4.4.1. SELinux の有効化
4.4.1.1. Enforcing モード
手順4.2 Enforcing モードへの変更
rpm -q package_name/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. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted- システムを再起動します。
~]#
reboot次回起動時に SELinux はシステム内の全ファイルとディレクトリーに再ラベル付けを実行し、SELinux の無効時に作成されたファイルおよびディレクトリーの SELinux コンテキストを追加します。
注記
~]# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today~]# grep "SELinux is preventing" /var/log/messages4.4.1.2. Permissive モード
手順4.3 Permissive モードへの変更
/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. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted- システムを再起動します。
~]#
reboot
4.4.2. SELinux の無効化
重要
手順4.4 SELinux の無効化
/etc/selinux/configファイル内でSELINUX=disabledと設定します。# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted- システムを再起動して、
getenforceコマンドがDisabledを返すことを確認します。~]$getenforceDisabled
4.5. ブール値
4.5.1. ブール値の一覧表示
semanage boolean -l コマンドを実行します。以下の例では、すべてのブール値が表示されているわけではなく、出力は省略されています。
~]#semanage boolean -lSELinux boolean State Default Description smartmon_3ware (off , off) Determine whether smartmon can... mpd_enable_homedirs (off , off) Determine whether mpd can traverse...
注記
SELinux boolean コラムは、ブール値の名前を表示します。Description コラムは、ブール値がオンかオフか、またそれらが何をするかを表示します。
getsebool -a コマンドはブール値を一覧表示し、オンかオフかを表示しますが、個別の説明はありません。以下の例は、すべてのブール値を表示しているわけではありません。
~]$getsebool -acvs_read_shadow --> off daemons_dump_core --> on
getsebool boolean-name コマンドを実行すると、boolean-name ブール値のステータスのみを表示します。
~]$getsebool cvs_read_shadowcvs_read_shadow --> off
~]$getsebool cvs_read_shadow daemons_dump_corecvs_read_shadow --> off daemons_dump_core --> on
4.5.2. ブール値の設定
setsebool ユーティリティーを setsebool boolean_name on/off の形式で実行します。
httpd_can_network_connect_db ブール値の設定を示しています。
手順4.5 ブール値の設定
- デフォルトでは、
httpd_can_network_connect_dbブール値はオフになっていて、Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できないようにしています。~]$getsebool httpd_can_network_connect_dbhttpd_can_network_connect_db --> off - Apache HTTP Server スクリプトとモジュールが一時的にデータベースサーバーに接続できるようにするには、root で以下のコマンドを実行します。
~]#setsebool httpd_can_network_connect_db on - ブール値が有効になったことを確認するには、
getseboolユーティリティーを使用します。~]$getsebool httpd_can_network_connect_dbhttpd_can_network_connect_db --> onこれで Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できます。 - この変更は再起動後には維持されません。再起動後も変更を維持するには、root で
setsebool -P boolean-name onコマンドを実行します[5]。~]#setsebool -P httpd_can_network_connect_db on
4.5.3. Shell のオートコンプリート機能
getsebool、setsebool、semanage の各ユーティリティーでは Shell のオートコンプリート機能を使用することができます。getsebool と setsebool では、コマンドラインパラメーターとブール値にオートコンプリート機能が使用可能です。コマンドラインパラメーターのみを一覧表示するには、コマンド名の後にハイフン記号 ("-") を付けて、Tab キーを押します。
~]# setsebool -[Tab]
-P~]$ getsebool samba_[Tab]
samba_create_home_dirs samba_export_all_ro samba_run_unconfined
samba_domain_controller samba_export_all_rw samba_share_fusefs
samba_enable_home_dirs samba_portmapper samba_share_nfs~]# setsebool -P virt_use_[Tab]
virt_use_comm virt_use_nfs virt_use_sanlock
virt_use_execmem virt_use_rawip virt_use_usb
virt_use_fusefs virt_use_samba virt_use_xserversemanage ユーティリティーは複数のコマンドライン引数と使用され、これらはひとつずつ記入されます。semanage コマンドの最初の引数はオプションで、SELinux ポリシーのどの部分を管理するかを指定します。
~]# semanage [Tab]
boolean export import login node port
dontaudit fcontext interface module permissive user~]# semanage fcontext -[Tab]
-a -D --equal --help -m -o
--add --delete -f -l --modify -S
-C --deleteall --ftype --list -n -t
-d -e -h --locallist --noheading --type~]#semanage fcontext -a -t samba<tab> samba_etc_t samba_secrets_t sambagui_exec_t samba_share_t samba_initrc_exec_t samba_unconfined_script_exec_t samba_log_t samba_unit_file_t samba_net_exec_t
~]# semanage port -a -t http_port_t -p tcp 81
4.6. SELinux コンテキスト: ファイルのラベル付け
ls -Z コマンドでこれを表示できます。
~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
unconfined_u)、ロール (object_r)、タイプ (user_home_t)、およびレベル (s0) を示しています。この情報は、アクセス制限の決定に使用されます。DAC システムでは、アクセスは Linux ユーザー ID とグループ ID に基づいて制御されます。SELinux ポリシールールは、DAC ルールの後でチェックされます。DAC ルールが最初にアクセスを拒否すると、SELinux ポリシールールは使用されません。
注記
etc_t タイプのラベルが付けられた /etc ディレクトリー内に新規ファイルを作成すると、このファイルは同じタイプを継承します。
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc~]# touch /etc/file1
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0 /etc/file1chcon、semanage fcontext、restorecon といった複数のコマンドがあります。
4.6.1. 一時的な変更: chcon
chcon コマンドは、ファイルの SELinux コンテキストを変更します。ただし、chcon コマンドによる変更は、ファイルシステムの再ラベル付けや restorecon コマンドが実行されると維持されません。SELinux ポリシーは、特定のファイルの SELinux コンテキストをユーザーが修正できるかどうかを制御します。chcon を使うと、ユーザーは変更する SELinux コンテキストの一部または全部を提供します。SELinux がアクセスを拒否する一般的な原因は、ファイルタイプが間違っているためです。
クイックリファレンス
- ファイルタイプを変更するには、
chcon -t type file-nameコマンドを実行します。ここでの type はhttpd_sys_content_tなどの SELinux タイプで、file-name はファイル名またはディレクトリー名になります。~]$chcon -t httpd_sys_content_t file-name - ディレクトリーのタイプとそのコンテンツを変更するには、
chcon -R -t type directory-nameコマンドを実行します。ここでの type はhttpd_sys_content_tなどの SELinux タイプで、directory-name はディレクトリー名になります。~]$chcon -R -t httpd_sys_content_t directory-name
手順4.6 ファイルまたはディレクトリーのタイプ変更
file1 をディレクトリーに置き換えます。
- ホームディレクトリーへ移動します。
- 新規ファイルを作成し、その SELinux コンテキストを表示します。
~]$touch file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1この例では、file1の SELinux コンテキストには、SELinuxunconfined_uユーザー、object_rロール、user_home_tタイプ、s0レベルが含まれます。SELinux コンテキストの各パーツの説明は、「2章SELinux コンテキスト」を参照してください。 - 以下のコマンドを実行して、タイプを
samba_share_tに変更します。-tオプションはタイプのみを変更します。そして、変更を確認します。~]$chcon -t samba_share_t file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:samba_share_t:s0 file1 file1ファイルの SELinux コンテキストを復元するには、以下のコマンドを実行します。変更内容を表示するには、-vオプションを使用します。~]$restorecon -v file1restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0この例では、以前のタイプであるsamba_share_tが、正しいuser_home_tに復元されました。ターゲットポリシー (Red Hat Enterprise Linux ではデフォルトの SELinux ポリシー) を使用している場合は、restoreconコマンドが/etc/selinux/targeted/contexts/files/ディレクトリー内のファイルを読み取り、どの SELinux コンテキストファイルにするかをチェックします。
手順4.7 ディレクトリーおよびコンテンツタイプの変更
/var/www/html/ ではなく) 異なるドキュメントルートを使用する場合に適用します。
- root ユーザーとして新規ディレクトリー
web/を作成し、この中に 3 つの空のファイル (file1、file2、file3) を作成します。web/ディレクトリーとその中のファイルは、default_tタイプのラベルが付けられます。~]#mkdir /web~]#touch /web/file{1,2,3}~]#ls -dZ /webdrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web~]#ls -lZ /web-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3 - root で以下のコマンドを実行し、
web/ディレクトリー (およびそのコンテンツ) のタイプをhttpd_sys_content_tに変更します。~]#chcon -R -t httpd_sys_content_t /web/~]#ls -dZ /web/drwxr-xr-x root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/~]#ls -lZ /web/-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3 - デフォルトの SELinux コンテキストを復元するには、root で
restoreconユーティリティーを使用します。~]#restorecon -R -v /web/restorecon reset /web context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0 restorecon reset /web/file2 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0 restorecon reset /web/file3 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0 restorecon reset /web/file1 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
chcon についての詳細は、chcon(1) の man ページを参照してください。
注記
4.6.2. 永続的な変更: semanage fcontext
semanage fcontext コマンドは、ファイルの SELinux コンテキスト変更に使用します。新規作成ファイルおよびディレクトリーのコンテキストを表示するには、root で以下のコマンドを実行します。
~]# semanage fcontext -C -lsetfiles ユーティリティーを使用し、デフォルトの SELinux コンテキストを復元するには restorecon ユーティリティーを使用します。つまり、ファイルシステムのラベル変更が行われても、semanage fcontext による変更は維持されます。SELinux ポリシーは、ユーザーが特定ファイルの SELinux コンテキストを修正できるかどうかを制御します。
クイックリファレンス
- 以下のコマンドを実行します。ファイルまたはディレクトリーの完全パスを使用します。
~]#semanage fcontext -a options file-name|directory-name restoreconユーティリティーを使用してコンテキスト変更を適用します。~]#restorecon -v file-name|directory-name
手順4.8 ファイルまたはディレクトリーのタイプ変更
file1 をディレクトリーに置き換えます。
- root ユーザーとして、
/etcディレクトリー内に新規ファイルを作成します。デフォルトでは、/etcディレクトリー内の新規作成ファイルにはetc_tタイプのラベルが付けられます。~]#touch /etc/file1~]$ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1ディレクトリーの情報を確認するには、以下のコマンドを実行します。~]$ls -dZ directory_name - root で以下のコマンドを実行し、
file1のタイプをsamba_share_tに変更します。-aオプションは新規レコードを追加し、-tオプションはタイプ (samba_share_t) を定義します。このコマンドを実行しても、直ちにタイプが変更されるわけではないことに留意してください。file1にはetc_tタイプのラベルが付けられたままです。~]#semanage fcontext -a -t samba_share_t /etc/file1~]#ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1~]$
semanage fcontext -C -l/etc/file1 unconfined_u:object_r:samba_share_t:s0 - root で
restoreconユーティリティーを使用してタイプを変更します。semanageが/etc/file1のエントリーをfile_contexts.localに追加したので、restoreconによりタイプがsamba_share_tに変更されます。~]#restorecon -v /etc/file1restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
手順4.9 ディレクトリーおよびコンテンツタイプの変更
/var/www/html/ ではなく、異なるドキュメントルートを使用する場合に適用します。
- root ユーザーとして新規ディレクトリー
web/を作成し、この中に 3 つの空のファイル (file1、file2、file3) を作成します。web/ディレクトリーとその中のファイルは、default_tタイプのラベルが付けられます。~]#mkdir /web~]#touch /web/file{1,2,3}~]#ls -dZ /webdrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web~]#ls -lZ /web-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3 - root で以下のコマンドを実行し、
web/ディレクトリーとその中にあるファイルのタイプをhttpd_sys_content_tに変更します。-aオプションは新規レコードを追加し、-tオプションはタイプ (httpd_sys_content_t) を定義します。"/web(/.*)?"の正規表現を使うことで、semanageが変更をweb/とその中のファイルに適用します。このコマンドを実行しても、直接にはタイプを変更しないことに留意してください。web/およびその中のファイルはdefault_tタイプのラベルが付けられたままです。~]#semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"~]$ls -dZ /webdrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web~]$ls -lZ /web-rw-r--r-- root root unconfined_u:object_r:default_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:default_t:s0 file3semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"コマンドが以下のエントリーを/etc/selinux/targeted/contexts/files/file_contexts.localに追加します。/web(/.*)? system_u:object_r:httpd_sys_content_t:s0
- root で
restoreconユーティリティーを使用してweb/とその中のすべてのファイルのタイプを変更します。-Rオプションは再帰的なので、web/ディレクトリー下のすべてのファイルとディレクトリーがhttpd_sys_content_tタイプでラベル付けされます。semanageで/web(/.*)?のエントリーをfile.contexts.localに追加したので、restoreconによりhttpd_sys_content_tにタイプが変更されます。~]#restorecon -R -v /webrestorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /web/file2 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /web/file3 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /web/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0デフォルトでは、新規作成のファイルおよびディレクトリーは、親ディレクトリーの SELinux タイプを引き継ぎます。
手順4.10 追加されたコンテキストの削除
/web(/.*)? のようにコンテキストが正規表現の一部である場合、正規表現の前後に引用符を使います。
~]#semanage fcontext -d "/web(/.*)?"
- コンテキストを削除するには、root ユーザーで以下のコマンドを実行します。ここでの file-name|directory-name は、
file_contexts.localの最初の部分です。~]#semanage fcontext -d file-name|directory-name以下は、file_contexts.local内のコンテキスト例です。/test system_u:object_r:httpd_sys_content_t:s0
最初の部分は/testになっています。restorecon実行後もしくはファイルシステムのラベル交換後に/test/ディレクトリーへのhttpd_sys_content_tのラベル付けを防ぐには、root で以下のコマンドを実行してfile_contexts.localからコンテキストを削除します。~]#semanage fcontext -d /test - root で
restoreconユーティリティーを使用してデフォルトの SELinux コンテキストを復元します。
semanage についての詳細は、semanage(8) の man ページを参照してください。
重要
semanage fcontext -a で SELinux のコンテキストを変更する場合、ファイルシステムの再ラベル付け後もしくは restorecon コマンド実行後におけるファイルの誤ったラベル付けを避けるために、ファイルもしくはディレクトリーへの完全パスを使用してください。
4.7. file_t および default_t タイプ
file_t タイプになります。このタイプはこの目的のみに使用され、適切にラベル付けされたファイルシステム上には存在しません。これは、SELinux を実行しているシステム上の全ファイルには適切な SELinux コンテキストがあるはずで、file_t タイプはファイル−コンテキストの設定には決して使用されないためです[6]。
default_t タイプは、ファイル-コンテキスト設定内の他のパターンのいずれにも合致しないファイルに使用され、これによってこれらのファイルをディスク上のコンテキストのないファイルから区別できるようになり、通常は制限のあるドメインはアクセスできません。たとえば、mydirectory/ のようなトップレベルのディレクトリーを新たに作成すると、default_t タイプのラベルが付けられます。このディレクトリーにサービスがアクセスする必要がある場合、このロケーション用にファイル-コンテキスト設定を更新する必要があります。ファイル-コンテキスト設定にコンテキストを追加することに関しては、「永続的な変更: semanage fcontext」を参照してください。
4.8. ファイルシステムのマウント
mount -o context コマンドを使います。例えば、複数システムで使用するリムーバブルメディアなどの正しい属性を提供するファイルシステムを信頼できない場合に、これは便利です。mount -o context コマンドは、File Allocation Table (FAT) や NFS ボリュームなど、拡張属性をサポートしないファイルシステムのラベル付けのサポートにも使用できます。context オプションで指定されたコンテキストは、ディスクに書き込まれません。最初にファイルシステムが拡張属性を持っている場合、オリジナルのコンテキストは保持され、context なしでマウントされるとこれを見ることができます
4.8.1. コンテキストのマウント
mount -o context=SELinux_user:role:type:level コマンドを実行します。コンテキストの変更は、ディスクに書き込まれません。デフォルトでは、クライアント側の NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトのコンテキストでラベル付けされます。共通ポリシーでは、このデフォルトのコンテキストは nfs_t タイプを使います。追加のマウントオプションがないと、これによって Apache HTTP Server などの他のサービスを使用する NFS ボリュームを共有することが妨げられる可能があります。以下の例では NFS ボリュームをマウントすることで、Apache HTTP Server を使用して共有できるようになっています。
~]#mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
-o context で指定された SELinux コンテキストがあるように見えます。しかし、これらの変更はディスクに書き込まれていないため、このオプションで指定されたコンテキストは新たなマウントがあると維持されません。このため、このオプションのコンテキストを保持するには、マウント時に指定されたものと同一のコンテキストと使用する必要があります。コンテキストを新たなマウントの後にも維持する方法については、「コンテキストのマウントを永続的にする」を参照してください。
-o context で SELinux コンテキストを上書きする際は、SELinux system_u ユーザーと object_r ロールを使って、このタイプに集中させます。MLS ポリシーや複数カテゴリのセキュリティーを使用していない場合は、s0 レベルを使います。
注記
context オプションでマウントする場合は、ユーザーやプロセスによるコンテキスト変更は禁止されます。例えば、context オプションでマウントされたファイルシステム上で chcon コマンドを実行すると、Operation not supported エラーが出ます。
4.8.2. デフォルトコンテキストの変更
file_t タイプを使います。別のデフォルトコンテキストが望ましい場合は、defcontext オプションでファイルシステムをマウントします。
/dev/sda2 上で新規作成されたファイルを新規作成の test/ ディレクトリーにマウントします。ここでは、test/ ディレクトリーを定義するルールが /etc/selinux/targeted/contexts/files/ にないことを前提としています。
~]#mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
- マウント時に、ファイルシステムの root ディレクトリー (
test/) は、defcontextが指定するコンテキストでラベル付けされたかのように扱われます (このラベルはディスク上で保存されない)。これは、test/下で作成されたファイルのラベリングに影響します。新規作成ファイルはsamba_share_tタイプを継承し、これらのラベルはディスク上で保存されます。 defcontextオプションでファイルシステムがマウントされている間にtest/下で作成されたファイルは、そのラベルを保持します。
4.8.3. NFS ボリュームのマウント
nfs_t タイプを使用します。ポリシー設定によっては、Apache HTTP Server や MariaDB などのサービスは nfs_t タイプのラベルが付けられたファイルを読み取れない場合もあります。これにより、このタイプのラベルが付いたファイルシステムがマウントされて、他のサービスがこれを読み取ったりエクスポートしたりすることを防ぐことができます。
context オプションを使って nfs_t タイプを上書きします。以下のコンテキストオプションを使って NFS ボリュームをマウントすることで、Apache HTTP Server を使用して共有することが可能になります。
~]#mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
context オプションを使ったファイルシステムのマウントの代替方法として、ブール値を有効にして nfs_t タイプのラベルが付いたファイルシステムへのサービスのアクセスを許可することもできます。nfs_t タイプへのサービスのアクセスを許可するブール値の設定については、パートII「制限のあるサービスの管理」を参照してください。
4.8.4. 複数の NFS マウント
export/ があり、これには web/ と database/ の 2 つのサブディレクトリーがあります。以下のコマンドで単一 NFS エクスポートから 2 つのマウントを試みて、それぞれのコンテキストを上書きしようとします。
~]#mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
~]#mount server:/export/database /local/database -o context="system_u:object_r:mysqld_db_t:s0"
/var/log/messages にログ記録されます。
kernel: SELinux: mount invalid. Same superblock, different security settings for (dev 0:15, type nfs)
-o nosharecache,context オプションを使用します。以下の例では、コンテキストが異なる複数のマウントを単一 NFS エクスポートから行います (各マウントへの単一サービスアクセスを許可)。
~]#mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"
~]#mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
server:/export/web がローカルで /local/web/ にマウントされ、すべてのファイルが httpd_sys_content_t タイプでラベル付けされており、Apache HTTP Server へのアクセスを許可しています。server:/export/database はローカルで /local/database にマウントされ、すべてのファイルが mysqld_db_t タイプでラベル付けされており、MariaDB へのアクセスを許可しています。これらのタイプ変更はディスクに書き込まれません。
重要
nosharecache オプションを使うと、/export/web/ を複数回マウントするなど、あるエクスポートの同一のサブディレクトリーを異なるコンテキストで複数回マウントすることができます。ファイルが 2 つの異なるコンテキストでアクセス可能な場合は、エクスポートの同一のサブディレクトリーを異なるコンテキストで複数回マウントしないでください。重複するマウントを作成することになってしまいます。
4.8.5. コンテキストのマウントを永続的にする
/etc/fstab ファイル内のファイルシステムのエントリーまたは自動マウント機能のマップを追加し、希望するコンテキストをマウントオプションとして使用します。以下の例では、NFS コンテキストマウントでエントリーを /etc/fstab に追加します。
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
4.9. SELinux ラベルの維持
4.9.1. ファイルおよびディレクトリーのコピー
user_home_t タイプのラベルが付けられます。
~]$touch file1
~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
/etc という別のディレクトリーにコピーされたとすると、この新しいファイルは /etc のデフォルトのラベル付けルールにしたがって作成されます。追加オプションなしでファイルをコピーすると、オリジナルのコンテキストは保持されない可能性があります。
~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
~]#cp file1 /etc/
~]$ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
/etc/file1 が存在しない状況で、file1 が /etc/ にコピーされると、/etc/file1 は新規ファイルとして作成されます。上の例にあるように、/etc/file1 はデフォルトのラベル付けルールにしたがって、etc_t タイプでラベル付けされます。
--preserve=context などの cp オプションを指定してオリジナルファイルのコンテキストを維持しない限り、既存ファイルのコンテキストが維持されます。SELinux ポリシーは、コピー時にコンテキストの維持を妨げる場合があります。
手順4.11 SELinux コンテキストを維持せずにコピーする
cp コマンドでオプションなしでファイルをコピーすると、ターゲットの親ディレクトリーからタイプを継承することを示しています。
- ユーザーのホームディレクトリーでファイルを作成します。ファイルは
user_home_tタイプでラベル付けされます。~]$touch file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 - 以下のコマンドで示すように、
/var/www/html/ディレクトリーはhttpd_sys_content_tタイプでラベル付けされています。~]$ls -dZ /var/www/html/drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ file1が/var/www/html/にコピーされると、httpd_sys_content_tタイプを継承します。~]#cp file1 /var/www/html/~]$ls -Z /var/www/html/file1-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
手順4.12 SELinux コンテキストを維持してコピーする
--preserve=context オプションを使用してコピー時にコンテキストを維持する方法を示しています。
- ユーザーのホームディレクトリーでファイルを作成します。ファイルは
user_home_tタイプでラベル付けされます。~]$touch file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 - 以下のコマンドで示すように、
/var/www/html/ディレクトリーはhttpd_sys_content_tタイプでラベル付けされています。~]$ls -dZ /var/www/html/drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ --preserve=contextオプションを使うと、コピー時に SELinux コンテキストが維持されます。以下で示すように、file1のuser_home_tタイプは、このファイルを/var/www/html/にコピーしても維持されます。~]#cp --preserve=context file1 /var/www/html/~]$ls -Z /var/www/html/file1-rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
手順4.13 コンテキストのコピーおよび変更
--context オプションを使ってコピー先のコンテキストを変更する方法を示しています。以下の例は、ユーザーのホームディレクトリーで行われています。
- ユーザーのホームディレクトリーでファイルを作成します。ファイルは
user_home_tタイプでラベル付けされます。~]$touch file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 --contextオプションを使って SELinux コンテキストを定義します。~]$cp --context=system_u:object_r:samba_share_t:s0 file1 file2--contextを使用しないと、file2はunconfined_u:object_r:user_home_tコンテキストでラベル付けされます。~]$ls -Z file1 file2-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 -rw-rw-r-- user1 group1 system_u:object_r:samba_share_t:s0 file2
手順4.14 既存ファイル上へのファイルのコピー
- root で新規ファイル
file1を/etcディレクトリーに作成します。以下のように、このファイルはetc_tタイプでラベル付けされます。~]#touch /etc/file1~]$ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1 - 別のファイル
file2を/tmpディレクトリーに作成します。以下のように、このファイルはuser_tmp_tタイプでラベル付けされます。~]$touch /tmp/file2~$ls -Z /tmp/file2-rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2 file1をfile2で上書きします。~]#cp /tmp/file2 /etc/file1- コピー後に以下のコマンドを実行すると、
file1はetc_tタイプでラベル付けされており、/etc/file1を上書きした/tmp/file2のuser_tmp_tタイプではないことが分かります。~]$ls -Z /etc/file1-rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
重要
4.9.2. ファイルおよびディレクトリーの移動
/var/www/html/ ディレクトリーに移動します。ファイルは移動されたため、正しい SELinux コンテキストを継承しません。
手順4.15 ファイルおよびディレクトリーの移動
- ユーザーのホームディレクトリーに移動して、ファイルを作成します。ファイルは
user_home_tタイプでラベル付けされます。~]$touch file1~]$ls -Z file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1 - 以下のコマンドを実行して、
/var/www/html/ディレクトリーの SELinux コンテキストを表示します。~]$ls -dZ /var/www/html/drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/デフォルトでは、/var/www/html/にはhttpd_sys_content_tタイプがラベル付けされています。/var/www/html/下で作成されたファイルおよびディレクトリーはこのタイプを継承するため、このタイプでラベル付けされます。 - root で
file1を/var/www/html/に移動します。このファイルは移動したので、現行のuser_home_tタイプを維持します。~]#mv file1 /var/www/html/~]#ls -Z /var/www/html/file1-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
user_home_t タイプでラベル付けされたファイルを読み取れません。Web ページを構成するすべてのファイルが user_home_t タイプ、もしくは Apache HTTP Server が読み取り不可能な別のタイプでラベル付けされている場合、それらに Mozilla Firefox のような Web ブラウザーを使用してアクセスしようとすると、パーミッションは拒否されます。
重要
mv コマンドで移動すると、誤った SELinux コンテキストとなり、Apache HTTP Server や Samba などのプロセスがそれらのファイルやディレクトリーにアクセスできなくなる可能性があります。
4.9.3. デフォルト SELinux コンテキストのチェック
matchpathcon ユーティリティーを使ってチェックします。このユーティリティーは、システムポリシーにクエリを行い、ファイルパスに関連するデフォルトのセキュリティーコンテキストを提供します[8]。以下の例では、matchpathcon を使って /var/www/html/ ディレクトリーのファイルが正しくラベル付けされているかを検証しています。
手順4.16 matchpathcon を使ってデフォルトの SELinux コンテキストをチェックする
- root ユーザーとして
/var/www/html/ディレクトリーに 3 つのファイルを作成します (file1、file2、file3)。これらのファイルは/var/www/html/からhttpd_sys_content_tタイプを継承します。~]#touch /var/www/html/file{1,2,3}~]#ls -Z /var/www/html/-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3 - root で
file1のタイプをsamba_share_tに変更します。Apache HTTP Server は、samba_share_tタイプでラベル付けされたファイルやディレクトリーを読み取れないことに注意してください。~]#chcon -t samba_share_t /var/www/html/file1 matchpathcon-Vオプションは、現行の SELinux コンテキストを SELinux ポリシーの正しいデフォルトのコンテキストと比較します。以下のコマンドを実行すると、/var/www/html/ディレクトリー内の全ファイルをチェックします。~]$matchpathcon -V /var/www/html/*/var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0 /var/www/html/file2 verified. /var/www/html/file3 verified.
matchpathcon コマンドの出力は、file1 は samba_share_t タイプでラベル付けされていますが、httpd_sys_content_t タイプでラベル付けされるべきであることを示しています。
/var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
file1 にアクセスできるようにするには、root で restorecon ユーティリティーを使用します。
~]#restorecon -v /var/www/html/file1restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
4.9.4. tar を使ったファイルのアーカイブ作成
tar ユーティリティーはデフォルトでは拡張属性を維持しません。SELinux コンテキストは拡張属性に保存されるので、ファイルをアーカイブするとコンテキストは失われます。コンテキストを維持するアーカイブを作成し、アーカイブからファイルを復元するには、tar --selinux を使います。tar アーカイブに拡張属性のないファイルが含まれる、もしくはシステムデフォルトに拡張属性を適合させたい場合は、restorecon ユーティリティーを使用します。
~]$tar -xvf archive.tar | restorecon -f -
restorecon を実行する必要があることもあります。
tar アーカイブの作成方法を説明します。
手順4.17 tar アーカイブを作成する
/var/www/html/ディレクトリーに移動し、その SELinux コンテキストを確認します。~]$cd /var/www/html/html]$ls -dZ /var/www/html/drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .- root ユーザーとして
/var/www/html/ディレクトリーに 3 つのファイルを作成します (file1、file2、file3)。これらのファイルは/var/www/html/からhttpd_sys_content_tタイプを継承します。html]#touch file{1,2,3}html]$ls -Z /var/www/html/-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3 - root で以下のコマンドを実行し、
test.tarという名前のtarアーカイブを作成します。SELinux コンテキストを保持するには、--selinuxを使用します。html]#tar --selinux -cf test.tar file{1,2,3} - root で
test/という名前の新規ディレクトリーを作成し、全ユーザーに完全アクセスを許可します。~]#mkdir /test~]#chmod 777 /test/ test.tarファイルをtest/にコピーします。~]$cp /var/www/html/test.tar /test/test/ディレクトリーに移動し、以下のコマンドを実行してtarアーカイブを抽出します。--selinuxオプションを指定してください。これを行わないと、SELinux コンテキストがdefault_tに変更されます。~]$cd /test/test]$tar --selinux -xvf test.tar- SELinux コンテキストを確認します。
httpd_sys_content_tタイプが維持されたことが分かります。--selinuxを使用していなければ、default_tに変更されていました。test]$ls -lZ /test/-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3 -rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.tar test/ディレクトリーが不要になったら、root で以下のコマンドを実行し、ディレクトリーとその中の全ファイルを削除します。~]#rm -ri /test/
--xattrs オプションなどの tar に関する詳細情報は、tar(1) man ページを参照してください。
4.9.5. star を使ったファイルのアーカイブ作成
star ユーティリティーは、デフォルトでは拡張属性を維持しません。SELinux コンテキストは拡張属性に保存されるので、ファイルをアーカイビングするとコンテキストは失われます。コンテキストを維持するアーカイブを作成するには、star -xattr -H=exustar コマンドを使用します。star パッケージはデフォルトではインストールされません。star をインストールするには、yum install star コマンドを root ユーザーで実行します。
star アーカイブの作成方法を説明します。
手順4.18 star アーカイブを作成する
- root で
/var/www/html/ディレクトリーに 3 つのファイルを作成します (file1、file2、file3)。これらのファイルは/var/www/html/からhttpd_sys_content_tタイプを継承します。~]#touch /var/www/html/file{1,2,3}~]#ls -Z /var/www/html/-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 file3 /var/www/html/ディレクトリーに移動し、root で以下のコマンドを実行してtest.starという名前のstarアーカイブを作成します。~]$cd /var/www/htmlhtml]#star -xattr -H=exustar -c -f=test.star file{1,2,3}star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).- root で
test/という名前の新規ディレクトリーを作成し、全ユーザーに完全アクセスを許可します。~]#mkdir /test~]#chmod 777 /test/ - 以下のコマンドを実行して、
test.starファイルをtest/にコピーします。~]$cp /var/www/html/test.star /test/ test/ディレクトリーに移動し、以下のコマンドを実行してstarアーカイブを抽出します。~]$cd /test/test]$star -x -f=test.starstar: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).- SELinux コンテキストを確認します。
httpd_sys_content_tタイプが維持されたことが分かります。-xattr -H=exustarオプションを使用していなければ、default_tに変更されていました。~]$ls -lZ /test/-rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1 -rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2 -rw-r--r-- user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3 -rw-r--r-- user1 group1 unconfined_u:object_r:default_t:s0 test.star test/ディレクトリーが不要になったら、root で以下のコマンドを実行し、ディレクトリーとその中の全ファイルを削除します。~]#rm -ri /test/starが不要になったら、root でパッケージを削除します。~]#yum remove star
star についての詳細は、star(1) の man ページを参照してください。
4.10. 情報収集ツール
avcstat
/sys/fs/selinux/avc/cache_stats で、-f /path/to/file オプションを使うと別のキャッシュファイルを指定できます。
~]#avcstatlookups hits misses allocs reclaims frees 47517410 47504630 12780 12780 12176 12275
seinfo
seinfo は、policy.conf ファイルやバイナリーポリシーファイル、ポリシーパッケージのモジュラー一覧、ポリシー一覧ファイルを入力として使用するコマンドラインユーティリティーです。seinfo ユーティリティーを使用するには、setools-console がインストールされている必要があります。
seinfo の出力は、バイナリーとソースファイル間では異なります。例えば、ポリシーソースファイルは { } の括弧で複数のルール要素を単一行にまとめます。属性に関しても同様の働きをし、単一属性が一つまたは複数のタイプに拡大します。これらは拡張されたものでバイナリーポリシーファイルとは関連がなくなるため、検索結果ではゼロの値が返されます。しかし、最初は括弧を使っていた単一行のルールが複数の個別行となると、ルールの数は大幅に増大します。
~]#seinfoStatistics for policy file: /sys/fs/selinux/policy Policy Version & Type: v.28 (binary, mls) Classes: 77 Permissions: 229 Sensitivities: 1 Categories: 1024 Types: 3001 Attributes: 244 Users: 9 Roles: 13 Booleans: 158 Cond. Expr.: 193 Allow: 262796 Neverallow: 0 Auditallow: 44 Dontaudit: 156710 Type_trans: 10760 Type_change: 38 Type_member: 44 Role allow: 20 Role_trans: 237 Range_trans: 2546 Constraints: 62 Validatetrans: 0 Initial SIDs: 27 Fs_use: 22 Genfscon: 82 Portcon: 373 Netifcon: 0 Nodecon: 0 Permissives: 22 Polcap: 2
seinfo ユーティリティーは、ドメイン属性を持つタイプの数を一覧表示することも可能で、制限のある異なるプロセスの数を予測します。
~]#seinfo -adomain -x | wc -l550
unconfined_domain 属性を使います。
~]#seinfo -aunconfined_domain_type -x | wc -l52
--permissive オプションで数えられます。
~]#seinfo --permissive -x | wc -l31
| wc -l を除きます。
sesearch
sesearch ユーティリティーを使うと、ポリシー内の特定のルールを検索できます。ポリシーソースファイルまたはバイナリーファイルの検索ができます。例を示します。
~]$sesearch --role_allow -t httpd_sys_content_tFound 20 role allow rules: allow system_r sysadm_r; allow sysadm_r system_r; allow sysadm_r staff_r; allow sysadm_r user_r; allow system_r git_shell_r; allow system_r guest_r; allow logadm_r system_r; allow system_r logadm_r; allow system_r nx_server_r; allow system_r staff_r; allow staff_r logadm_r; allow staff_r sysadm_r; allow staff_r unconfined_r; allow staff_r webadm_r; allow unconfined_r system_r; allow system_r unconfined_r; allow system_r user_r; allow webadm_r system_r; allow system_r webadm_r; allow system_r xguest_r;
sesearch ユーティリティーは、allow ルールの数を提示します。
~]#sesearch --allow | wc -l262798
~]#sesearch --dontaudit | wc -l156712
4.11. SELinux ポリシーモジュールの優先順位付けおよび無効化
/etc/selinux/ 内の SELinux モジュールストレージでは、SELinux モジュールでの優先順位付けが使用できます。以下のコマンドを root で入力すると、異なる優先順位の 2 つのモジュールディレクトリーが表示されます。
~]#ls /etc/selinux/targeted/active/modules100 400 disabled
semodule ユーティリティーが使用するデフォルトの優先順位は 400 ですが、selinux-policy パッケージで使用される優先順位は 100 になります。このため、ほとんどの SELinux モジュールは優先順位 100 でインストールされます。
例4.1 SELinux ポリシーモジュール優先順位の使用
semodule -i コマンドでインストールし、モジュールの優先順位を 400 に設定します。以下の例では、sandbox.pp を使用します。
~]#semodule -X 400 -i sandbox.pp~]#semodule --list-modules=full | grep sandboxsandbox pp sandbox pp
semodule -r コマンドを入力します。
~]#semodule -X 400 -r sandboxlibsemanage.semanage_direct_remove_key: sandbox module at priority 100 is now active.
システムポリシーモジュールの無効化
semodule -d MODULE_NAME警告
semodule -r コマンドを使用してシステムポリシーモジュールを削除すると、システムのストレージから削除され再度読み込むことはできません。すべてのシステムポリシーモジュールを復元するための、無用な selinux-policy-targeted パッケージ再インストール作業の実施を避けるためには、代わりに semodule -d コマンドを使用します。
4.12. マルチレベルのセキュリティー (MLS)

図4.1 クリアランスレベル

図4.2 MLS を使用したデータフローの許可
4.12.1. MLS とシステム権限
4.12.2. SELinux における MLS の有効化
注記
手順4.19 SELinux MLS ポリシーを有効にする
- selinux-policy-mls パッケージをインストールします。
~]#yum install selinux-policy-mls - MLS ポリシーを有効にする前に、ファイルシステム上のすべてのファイルが MLS ラベルで再ラベル付けされる必要があります。ファイルシステムが再ラベル付けされると、制限のあるドメインはアクセスが拒否され、システムが正常に起動できない可能性があります。これを回避するには、
/etc/selinux/configファイルでSELINUX=permissiveと設定します。また、SELINUXTYPE=mlsと設定して MLS ポリシーを有効にします。設定ファイルは以下のようになります。# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=mls
- SELinux が permissive モードで実行されていることを確認します。
~]#setenforce 0~]$getenforcePermissive fixfilesコマンドを使用して/.autorelabelファイルを作成します。-Fオプションを使用して、次回リブート時にファイルに再ラベル付けされるようにします。~]#fixfiles -F onboot- システムをリブートします。次回の起動時にすべてのファイルシステムが MLS ポリシーにしたがって再ラベル付けされます。ラベルプロセスでは、全ファイルが適切な SELinux コンテキストでラベル付けされます。
*** Warning -- SELinux mls policy relabel is required. *** Relabeling could take a very long time, depending on file *** system size and speed of hard drives. ***********
一番下の行の*(アスタリスク) 記号はそれぞれ、ラベル付けされた 1000 ファイルを表します。上記の例では、11 個の*記号はラベル付けされた 11000 ファイルを表しています。全ファイルにラベル付けする時間はシステム上のファイル数とハードディスクドライブの速度によって異なります。最近のシステムでは、このプロセスは 10 分程度で終わります。ラベリングプロセスが完了すると、システムは自動で再起動します。 - permissive モードでは SELinux ポリシーは強制されませんが、enforcing モードであれば拒否されたはずのアクションについては拒否がログに記録されます。enforcing モードに変更する前に、root で以下のコマンドを実行して、SELinux が最後の起動時にアクセスを拒否しなかったことを確認します。最後の起動時にアクセス拒否がなかった場合は、このコマンドはなにも返しません。起動時に SELinux がアクセスを拒否した場合は、トラブルシューティング情報を「10章トラブルシューティング」で参照してください。
~]#grep "SELinux is preventing" /var/log/messages /var/log/messagesファイルに拒否メッセージがない場合、または既存の拒否をすべて解決した場合は、/etc/selinux/configファイルでSELINUX=enforcingと設定します。# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=mls
- システムを再起動し、SELinux が enforcing モードで稼働していることを確認します。
~]$getenforceEnforcingMLS ポリシーが有効であることも確認します。~]#sestatus |grep mlsPolicy from config file: mls
4.12.3. 特別の MLS 範囲を持つユーザーの作成
手順4.20 特別の MLS 範囲を持つユーザーの作成
useraddコマンドで新規 Linux ユーザーを追加し、このユーザーを既存の SELinux ユーザーにマッピングします (このケースではstaff_u)。~]#useradd -Z staff_u john- 新規作成の Linux ユーザーにパスワードを割り当てます。
prompt~]#
passwd john - root で以下のコマンドを実行し、SELinux ユーザーと Linux ユーザー間のマッピングを表示します。出力は以下のようになります。
~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * john staff_u s0-s15:c0.c1023 * root root s0-s15:c0.c1023 * staff staff_u s0-s15:c0.c1023 * sysadm staff_u s0-s15:c0.c1023 * system_u system_u s0-s15:c0.c1023 * - ユーザー
johnの特定範囲を定義します。~]#semanage login --modify --range s2:c100 john - SELinux ユーザーと Linux ユーザー間のマッピングを再度表示します。ユーザー
johnに特定の MLS 範囲が定義されていることに注意してください。~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * john staff_u s2:c100 * root root s0-s15:c0.c1023 * staff staff_u s0-s15:c0.c1023 * sysadm staff_u s0-s15:c0.c1023 * system_u system_u s0-s15:c0.c1023 * - john のホームディレクトリーのラベル修正が必要な場合には、以下のコマンドを実行します。
~]#chcon -R -l s2:c100 /home/john
4.12.4. Polyinstantiated ディレクトリーの設定
/tmp および /var/tmp/ ディレクトリーは通常、すべてのプログラム、サービス、ユーザーが一時的なストレージとして使用します。しかしこの設定では、これらのディレクトリーは競合状態の攻撃やファイル名に基づく情報漏えいに対して脆弱となってしまいます。SELinux は、polyinstantiated ディレクトリーという形で解決法を提供します。これはつまり、/tmp と /var/tmp/ の両方がインスタンス化され、各ユーザーにはプライベートのように見えるということです。ディレクトリーのインスタンス化が有効になると、各ユーザーの /tmp と /var/tmp/ ディレクトリーは自動的に /tmp-inst および /var/tmp/tmp-inst 下にマウントされます。
手順4.21 Polyinstantiation ディレクトリーを有効にする
/etc/security/namespace.confファイルの最後の 3 行をコメント解除し、/tmp、/var/tmp/、ユーザーのホームディレクトリーのインスタンス化を有効にします。~]$tail -n 3 /etc/security/namespace.conf/tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ level/etc/pam.d/loginファイルでpam_namespace.soがセッション用に設定されていることを確認します。~]$grep namespace /etc/pam.d/loginsession required pam_namespace.so- システムを再起動します。
4.13. File Name Transition (ファイル名の移行)
A_t のラベルの付いたプロセスが B_t のラベルが付いたディレクトリー内で特定のオブジェクトクラスを作成し、この特定のオブジェクトクラスを objectname と命名すると、これに C_t のラベルが付けられます。このメカニズムは、システム上のプロセスに関してより細かい制御をもたらします。
- デフォルトでは、オブジェクトは親ディレクトリーからラベルを継承します。たとえば、
etc_tのラベルが付いているディレクトリー内でユーザーがファイルを作成すると、そのファイルにもetc_tのラベルが付けられます。しかし、この方法はディレクトリー内で異なるラベルが付いた複数のファイルを格納したい場合は役に立たないことになります。 - ポリシー作成者は以下の状態を記述するルールをポリシーで作成することができます。タイプ
A_tのプロセスがB_tのラベルが付いたディレクトリー内で特定のオブジェクトクラスを作成すると、このオブジェクトは新たなC_tのラベルが付けられます。単一プログラムが同一のディレクトリー内に複数のオブジェクトを作成し、このオブジェクトがそれぞれ別個のラベルを必要とする場合、この方法は問題になります。さらに、作成されたオブジェクトの名前が指定されないので、これらのルールは部分的な制御しかできません。 - アプリケーションのなかには、特定のパスのラベルが何であるかをアプリケーションがシステムに尋ねることができる SELinux 認識を備えているものもあります。このようなアプリケーションは、必要なラベルが付いたオブジェクトを作成するようにカーネルに要求します。SELinux 認識を備えたアプリケーションには、rpm パッケージマネジャー、restorecon ユーティリティー、udev デバイスマネジャーなどがあります。ただし、すべてのアプリケーションに SELinux 認識のあるファイルやディレクトリーを作成するように指示することは可能です。オブジェクトの作成後に正しいラベルに交換する必要が頻繁にあります。これを行わないと、制限のあるドメインがオブジェクトを使用しようとすると、AVC メッセージが返されます。
strcmp() 関数が実行する完全一致を使用することに注意してください。正規表現またはワイルドカード文字の使用は勘案されません。
注記
例4.2 File Name Transition を使ったポリシールール作成の例
filetrans_pattern(unconfined_t, admin_home_t, ssh_home_t, dir, ".ssh")
unconfined_t タイプのプロセスが admin_home_t ラベルの付いたディレクトリー内に ~/.ssh/ ディレクトリーを作成すると、この ~/.ssh/ ディレクトリーは ssh_home_t ラベルが付けられることを記述しています。
filetrans_pattern(staff_t, user_home_dir_t, httpd_user_content_t, dir, "public_html") filetrans_pattern(thumb_t, user_home_dir_t, thumb_home_t, file, "missfont.log") filetrans_pattern(kernel_t, device_t, xserver_misc_device_t, chr_file, "nvidia0") filetrans_pattern(puppet_t, etc_t, krb5_conf_t, file, "krb5.conf")
注記
4.14. ptrace() の無効化
ptrace() システムコールを使うと、あるプロセスが別のプロセスの実行を監視および制御できるようになり、メモリーとレジスタの変更を可能にします。このコールは主に開発者がデバッグする際に使用します。たとえば、strace の使用時などです。ptrace() が必要ない時は、これを無効にしてシステムセキュリティーを高めることができます。これを行うには deny_ptrace ブール値を有効にして全プロセスが他のプロセスで ptrace() を使用することを拒否します。これは unconfined_t ドメインで実行中のものにも適用されます。
deny_ptrace ブール値はデフォルトでは無効になっています。これを有効にするには、root ユーザーで setsebool -P deny_ptrace on コマンドを実行します。
~]#setsebool -P deny_ptrace on
~]$getsebool deny_ptracedeny_ptrace --> on
setsebool -P deny_ptrace off コマンドを実行します。
~]#setsebool -P deny_ptrace off
注記
setsebool -P コマンドは、変更を永続的なものにします。再起動後に変更を維持したくない場合は、-P オプションを使用しないでください。
ptrace() システムコールを使用できます。ptrace() の使用が可能なドメインを一覧表示するには、以下のコマンドを実行します。setools-console パッケージが sesearch ユーティリティーを提供しますが、このパッケージはデフォルトではインストールされないことに注意してください。
~]#sesearch -A -p ptrace,sys_ptrace -C | grep -v deny_ptrace | cut -d ' ' -f 5
4.15. サムネイル保護
- /usr/bin/evince-thumbnailer
- /usr/bin/ffmpegthumbnailer
- /usr/bin/gnome-exe-thumbnailer.sh
- /usr/bin/gnome-nds-thumbnailer
- /usr/bin/gnome-xcf-thumbnailer
- /usr/bin/gsf-office-thumbnailer
- /usr/bin/raw-thumbnailer
- /usr/bin/shotwell-video-thumbnailer
- /usr/bin/totem-video-thumbnailer
- /usr/bin/whaaw-thumbnailer
- /usr/lib/tumbler-1/tumblerd
- /usr/lib64/tumbler-1/tumblerd
setsebool httpd_can_network_connect_db off コマンドを実行します。リブート後も変更を維持するには、setsebool -P httpd_can_network_connect_db off コマンドを実行します。
/etc/selinux/targeted/contexts/files/ ディレクトリー内のファイルがファイルおよびディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon および setfiles ユーティリティーが読み取り、ファイルおよびディレクトリーをデフォルトのコンテキストに復元します。
第5章 sepolicy スイート
sepolicy ユーティリティーは、インストール済みの SELinux ポリシーをクエリする機能のスイートを提供します。これらの機能は新規のものか、これまでは sepolgen や setrans などの別個のユーティリティーが提供していたものです。このスイートを使うと、移行レポートや man ページ、さらには新ポリシーのモジュールを作成できるようになり、ユーザーは SELinux ポリシーへのアクセスが容易になり、理解が深まります。
sepolicy を提供します。root ユーザーで以下のコマンドを実行して、sepolicy をインストールします。
~]#yum install policycoreutils-devel
sepolicy スイートは以下の機能を提供し、これらはコマンドラインパラメーターとして起動されます。
表5.1 sepolicy の機能
| 機能 | 説明 |
|---|---|
| booleans | SELinux ポリシーに問い合わせてブール値の詳細を表示する |
| communicate | ドメインが相互通信を行えるかどうかを SELinux ポリシーに問い合わせる |
| generate | SELinux ポリシーモジュールのテンプレートを生成する |
| gui | SELinux ポリシーのグラフィカルユーザーインターフェース |
| interface | SELinux ポリシーインターフェースを一覧表示する |
| manpage | SELinux man ページを生成する |
| network | SELinux ポリシーネットワーク情報を問い合わせる |
| transition | SELinux ポリシーに問い合わせ、プロセス移行レポートを生成する |
5.1. sepolicy Python バインディング
sesearch および seinfo ユーティリティーが含まれていました。sesearch ユーティリティーは SELinux ポリシー内でのルール検索に使用し、seinfo ユーティリティーはポリシー内の他のコンポーネントへのクエリを可能にしていました。
sesearch および seinfo に Python バインディングが追加され、これらユーティリティーの機能を sepolicy スイートで使用することができます。例を示します。
> python >>> import sepolicy >>> sepolicy.info(sepolicy.ATTRIBUTE) Returns a dictionary of all information about SELinux Attributes >>>sepolicy.search([sepolicy.ALLOW]) Returns a dictionary of all allow rules in the policy.
5.2. SELinux ポリシーモジュールの生成: sepolicy generate
sepolgen または selinux-polgengui ユーティリティーが使われていました。これらのツールは、sepolicy スイートに統合されました。Red Hat Enterprise Linux 7 では、sepolicy generate コマンドを使って最初の SELinux ポリシーモジュールテンプレートを生成します。
sepolgen とは異なり、sepolicy generate は root ユーザーで実行する必要はありません。このユーティリティーは RPM 仕様ファイルも作成します。これは、ポリシーパッケージファイル (NAME.pp) およびインターフェースファイル (NAME.if) を正しい場所にインストールし、SELinux ポリシーのカーネルへのインストールを提供し、ラベルの修正を行う RPM パッケージの構築に使用することができます。設定スクリプトが SELinux ポリシーのインストールを継続し、ラベリングを設定します。さらに、sepolicy manpage コマンドを使うと、インストールされたポリシーに基づいた man ページが生成されます[9]。最後に、sepolicy generate は SELinux ポリシーと man ページを RPM パッケージに構築、コンパイルして、他のシステムにインストールする用意をします。
sepolicy generate が実行されると、以下のファイルが作成されます。
NAME.te: タイプ強制ファイル- このファイルは、特定のドメインにおけるタイプおよびルールすべてを定義します。
NAME.if: インターフェースファイル- このファイルは、システム用にデフォルトのファイルコンテキストを定義します。
NAME.teファイル内で作成されたファイルタイプを取り、ファイルパスをタイプに関連付けます。restoreconやrpmといったユーティリティーは、これらのパスを使ってラベルを書き込みます。 NAME_selinux.spec: RPM 仕様ファイル- このファイルは、SELinux ポリシーをインストールし、ラベル付けを設定する RPM 仕様ファイルです。また、インターフェースファイルとポリシーを記述する man ページもインストールします。
sepolicy manpage -d NAMEコマンドを使うと man ページを生成することができます。 NAME.sh: ヘルパーシェルスクリプト- このスクリプトは、システム上のラベル付けをコンパイル、インストール、修正する手助けとなります。また、インストールされたポリシーに基づいた man ページを生成し、他のシステムにインストールできる RPM パッケージをコンパイル、構築します。
sepolicy generate はソースドメインからターゲットドメインへの生成されたすべてのパスをプリントアウトします。sepolicy generate についての詳細は、sepolicy-generate(8) の man ページを参照してください。
5.3. ドメイン移行について: sepolicy transition
setrans ユーティリティーを使ってこれらのドメインもしくはプロセス間の移行に使用する中間タイプをすべてプリントアウトしていました。Red Hat Enterprise Linux 7 では、setrans が sepolicy スイートの一部として提供され、sepolicy transition コマンドが使用されます。
sepolicy transition コマンドは SELinux ポリシーにクエリを行い、プロセス移行レポートを作成します。sepolicy transition コマンドは、ソースドメイン (-s オプションで指定) とターゲットドメイン (-t オプションで指定) という 2 つのコマンドライン引数を必要とします。ソースドメインのみが入力された場合は、sepolicy transition はソースドメインが移行可能なドメインすべてを一覧表示します。以下の出力には、すべてのエントリーが含まれているわけではありません。「@」記号は「実行」を意味します。
~]$sepolicy transition -s httpd_thttpd_t @ httpd_suexec_exec_t --> httpd_suexec_t httpd_t @ mailman_cgi_exec_t --> mailman_cgi_t httpd_t @ abrt_retrace_worker_exec_t --> abrt_retrace_worker_t httpd_t @ dirsrvadmin_unconfined_script_exec_t --> dirsrvadmin_unconfined_script_t httpd_t @ httpd_unconfined_script_exec_t --> httpd_unconfined_script_t
sepolicy transition はソースドメインからターゲットドメインへのすべての移行パスに関して SELinux ポリシーを調査し、これらのパスを一覧表示します。以下の出力は、完全なものではありません。
~]$sepolicy transition -s httpd_t -t system_mail_thttpd_t @ exim_exec_t --> system_mail_t httpd_t @ courier_exec_t --> system_mail_t httpd_t @ sendmail_exec_t --> system_mail_t httpd_t ... httpd_suexec_t @ sendmail_exec_t --> system_mail_t httpd_t ... httpd_suexec_t @ exim_exec_t --> system_mail_t httpd_t ... httpd_suexec_t @ courier_exec_t --> system_mail_t httpd_t ... httpd_suexec_t ... httpd_mojomojo_script_t @ sendmail_exec_t --> system_mail_t
sepolicy transition についての詳細は、sepolicy-transition(8) の man ページを参照してください。
5.4. Man ページの生成: sepolicy manpage
sepolicy manpage コマンドは、SELinux ポリシーに基づいてプロセスドメインを文書化した man ページを生成します。このため、このドキュメンテーションは常に最新のものになります。自動生成された man ページの名前は httpd_selinux のように、プロセスドメイン名と _selinux 接尾辞からなります。
Entrypointsセクションには、ドメイン移行時に実行する必要のある実行可能ファイルすべてが含まれています。Process Typesセクションには、ターゲットドメインと同じ接頭辞で始まるプロセスタイプすべてが含まれています。Booleansセクションには、ドメインに関連するブール値が一覧表示されています。Port Typesセクションには、ドメインと同じ接頭辞に一致するポートタイプが含まれ、これらのポートタイプに割り当てられるデフォルトのポート番号が記述されています。Managed Filesセクションでは、ドメインが書き込み可能なタイプとこれらのタイプに関連付けられたデフォルトのパスが説明されています。File Contextsセクションにはドメインに関連付けられたファイルタイプすべてが含まれ、システム上でデフォルトのパスラベリングと一緒に使用するファイルタイプの使用方法が説明されています。Sharing Filesセクションでは、public_content_tのようなドメイン共有タイプを使用する方法が説明されています。
sepolicy manpage についての詳細は、sepolicy-manpage(8) の man ページを参照してください。
第6章 ユーザーの制限
su や sudo などのコマンドを実行できない、などがあります。これによって、システムをユーザーから保護することができます。制限のあるユーザーについての詳細は、「制限のあるユーザーおよび制限のないユーザー」を参照してください。
6.1. Linux および SELinux ユーザーのマッピング
~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
__default__ ログインにマッピングされ、これはさらに SELinux unconfined_u ユーザーにマッピングされます。useradd コマンドで Linux ユーザーが作成され、オプションが特定されないと、このユーザーは SELinux unconfined_u にマッピングされます。以下でデフォルトのマッピングを定義します。
__default__ unconfined_u s0-s0:c0.c1023 *
6.2. 新規 Linux ユーザーの制限: useradd
unconfined_u ユーザーにマッピングされた Linux ユーザーは、unconfined_t ドメインで稼働します。unconfined_u にマッピングされた Linux ユーザーでログインし、id -Z コマンドを実行すると、以下の出力が表示されます。
~]$id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_t ドメインで稼働すると SELinux ポリシールールが適用されますが、unconfined_t ドメインで稼働する Linux ユーザーにほとんどすべてのアクセスを許可するポリシールールが存在します。SELinux ポリシーで unconfined_t ドメインから自身の制限のあるドメインへの移行が可能だと定義されているアプリケーションを、制限のない Linux ユーザーが実行しても、この制限のない Linux ユーザーは制限のあるドメインの規定に拘束されます。ここでのセキュリティーの利点は、Linux ユーザーは制限なしで実行していてもアプリケーションには制限があることから、アプリケーションの欠点を悪用しようとしてもポリシーで制限できる、という点です。
注記
useradd コマンドで Linux ユーザーを作成する場合は、-Z オプションを使ってどの SELinux ユーザーにマッピングするかを指定します。以下の例では、新規の Linux ユーザー useruuser を作成し、そのユーザーを SELinux user_u ユーザーにマッピングしています。SELinux user_u ユーザーにマッピングされた Linux ユーザーは、user_t ドメインで稼働します。このドメインでは、(passwd など) SELinux ポリシーが許可しない限り、Linux ユーザーは setuid アプリケーションを実行できず、su や sudo コマンドも実行できないので、これらのコマンドで root ユーザーになることを防いでいます。
手順6.1 新規 Linux ユーザーを user_u SELinux ユーザーに限定する
- root で SELinux
user_uユーザーにマッピングされた新規 Linux ユーザー (useruuser) を作成します。~]#useradd -Z user_u useruuser useruuserとuser_uの間のマッピングを表示するには、root で以下のコマンドを実行します。~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 * useruuser user_u s0 *- root でパスワードを Linux
useruuserユーザーに割り当てます。~]#passwd useruuserChanging password for user useruuser. New password: Enter a password Retype new password: Enter the same password again passwd: all authentication tokens updated successfully. - 現行セッションから一旦ログアウトし、Linux
useruuserユーザーでログインし直します。ログインすると、pam_selinuxモジュールがこの Linux ユーザーを SELinux ユーザーにマッピングし (このケースではuser_u)、SELinux コンテキストを設定します。その後は、このコンテキストで Linux ユーザーのシェルが起動されます。以下のコマンドを実行して、Linux ユーザーのコンテキストを表示します。~]$id -Zuser_u:user_r:user_t:s0 - Linux
useruuserのセッションからログアウトし、自分のアカウントでログインし直します。Linuxuseruuserユーザーが不要な場合は、root で以下のコマンドを実行し、そのホームディレクトリーとともに削除します。~]#userdel -Z -r useruuser
6.3. 既存 Linux ユーザーの制限: semanage login
unconfined_u ユーザーにマッピングされ (デフォルトの動作)、マッピング先の SELinux ユーザーを変更したい場合は、semanage login コマンドを使います。以下の例では、newuser という名前の新規 Linux ユーザーが作成され、SELinux user_u ユーザーにマッピングされます。
手順6.2 Linux ユーザーを SELinux ユーザーにマッピングする
- root ユーザーで、ユーザー名
newuserという新規 Linux ユーザーを作成します。このユーザーはデフォルトマッピングを使用しているため、semanage login -l出力には表示されません。~]#useradd newuser~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 * - Linux
newuserユーザーを SELinuxuser_uユーザーにマッピングするには、root で以下のコマンドを実行します。~]#semanage login -a -s user_u newuser-aオプションは新規レコードを追加し、-sオプションは Linux ユーザーがマッピングされる SELinux ユーザーを指定します。最後の引数であるnewuserは、指定した SELinux ユーザーにマッピングする Linux ユーザーです。 - Linux
newuserとuser_uの間のマッピングを表示するには、再度semanageユーティリティーを使用します。~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * newuser user_u s0 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 * - root で Linux
newuserユーザーにパスワードを割り当てます。~]#passwd newuserChanging password for user newuser. New password: Enter a password Retype new password: Enter the same password again passwd: all authentication tokens updated successfully. - 現行セッションから一旦ログアウトし、Linux
newuserユーザーでログインし直します。以下のコマンドを実行し、newuserの SELinux コンテキストを表示します。~]$id -Zuser_u:user_r:user_t:s0 - Linux
newuserのセッションからログアウトし、自分のアカウントでログインし直します。Linuxnewuserユーザーが不要な場合は、root で以下のコマンドを実行し、そのホームディレクトリーとともに削除します。~]#userdel -r newuserroot で Linuxnewuserユーザーとuser_u間のマッピングを削除します。~]#semanage login -d newuser~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
6.4. デフォルトマッピングの変更
__default__ ログインにマッピングされます (このログインは、SELinux unconfined_u ユーザーにマッピングされます)。新規 Linux ユーザーの場合で特に SELinux ユーザーにマッピングされておらず、デフォルトで制限をかけたい場合、デフォルトマッピングを semanage login コマンドで変更します。
unconfined_u から user_u に変更します。
~]#semanage login -m -S targeted -s "user_u" -r s0 __default__
__default__ ログインが user_u にマッピングされていることを確認します。
~]#semanage login -lLogin Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
semanage login -l 出力からの特定のエントリーに適合しない場合、__default__ ログインの場合のように user_u にマッピングされます。
__default__ ログインを SELinux unconfined_u ユーザーにマッピングします。
~]#semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
6.5. xguest: キオスクモード
- root ユーザーで xguest パッケージをインストールします。必要に応じて依存関係をインストールします。
~]#yum install xguest - 誰もがキオスクアカウントを使えるようにするため、アカウントはパスワード保護されていません。このため、SELinux が enforcing モードで実行されている場合のみ、アカウントが保護されます。このアカウントにログインする前に、
getenforceユーティリティーを使って SELinux が enforcing モードで実行されていることを確認します。~]$getenforceEnforcingSELinux が enforcing モードで実行されていない場合は、「SELinux の状態とモードの永続的変更」を参照して enforcing モードに変更します。SELinux が permissive モードだったり無効だったりすると、このアカウントにログインすることができません。 - このアカウントには、GNOME Display Manager (GDM) を使用しないとログインできません。xguest パッケージがインストールされると、
ゲストアカウントが GDM ログイン画面に追加されます。
6.6. アプリケーションを実行するユーザーのためのブール値
/tmp ディレクトリーで (ユーザーのパーミッションを継承する) アプリケーションを実行できないようにすることで、欠陥のあるアプリケーションや悪意のあるアプリケーションがそのユーザーのファイルを修正できないようになります。
setsebool ユーティリティーで設定します。これは、root ユーザーで実行する必要があります。setsebool -P コマンドは、変更を永続的なものにします。再起動後に変更を維持したくない場合は、-P オプションを使用しないでください。
xguest_t
xguest_t ドメインの Linux ユーザーがホームディレクトリーと /tmp でアプリケーションを 実行できない ようにするには、以下のコマンドを実行します。
~]#setsebool -P xguest_exec_content off
user_t
user_t ドメインの Linux ユーザーがホームディレクトリーと /tmp でアプリケーションを 実行できない ようにするには、以下のコマンドを実行します。
~]#setsebool -P user_exec_content off
staff_t
staff_t ドメインの Linux ユーザーがホームディレクトリーと /tmp でアプリケーションを 実行できない ようにするには、以下のコマンドを実行します。
~]#setsebool -P staff_exec_content off
staff_exec_content ブール値を有効にして staff_t ドメインの Linux ユーザーがホームディレクトリーと /tmp でアプリケーションを 実行できる ようにするには、以下のコマンドを実行します。
~]#setsebool -P staff_exec_content on
第7章 sVirt
非仮想化環境

仮想化環境

7.1. セキュリティーと仮想化

7.2. sVirt のラベル付け
~]#ps -eZ | grep qemusystem_u:system_r:svirt_t:s0:c87,c520 27950 ? 00:00:17 qemu-kvm system_u:system_r:svirt_t:s0:c639,c757 27989 ? 00:00:06 qemu-system-x86
~]#ls -lZ /var/lib/libvirt/images/*system_u:object_r:svirt_image_t:s0:c87,c520 image1
表7.1 sVirt ラベル
| タイプ | SELinux コンテキスト | 説明 |
|---|---|---|
| 仮想マシンプロセス | system_u:system_r:svirt_t:MCS1 | MCS1 は無作為に選択されたフィールドです。現時点では、約 50 万のラベルがサポートされています。 |
| 仮想マシンのイメージ | system_u:object_r:svirt_image_t:MCS1 | これらのイメージファイルやデバイスの読み取り/書き込みができるのは、同じ MCS フィールドの svirt_t ラベルが付いたプロセスだけです。 |
| 仮想マシンの共有読み取り/書き込みコンテンツ | system_u:object_r:svirt_image_t:s0 | svirt_t のラベルが付いたプロセスはすべて、svirt_image_t:s0 のファイルおよびデバイスに書き込み可能です。 |
| 仮想マシンのイメージ | system_u:object_r:virt_content_t:s0 | イメージが存在する場合に使用されるシステムのデフォルトラベル。svirt_t 仮想プロセスは、このラベルの付いたファイル/デバイスの読み取りはできません。 |
第8章 Secure Linux コンテナー
virsh コマンドラインユーティリティーも使用できます。
第9章 SELinux systemd によるアクセス制御
systemd デーモンで制御します。Red Hat Enterprise Linux の以前のリリースでは、デーモンは以下の 2 通りの方法で起動されていました。
- ブート時に System V
initデーモンがinit.rcスクリプトを開始し、このスクリプトが希望するデーモンを開始しました。たとえば、ブート時に起動される Apache サーバーには、以下の SELinux ラベルがありました。system_u:system_r:httpd_t:s0
- 管理者が手動で
init.rcスクリプトを開始し、デーモンが実行されていました。たとえば、service httpd restartコマンドが Apache サーバー上で開始されると、その結果、SELinux ラベルは以下のようになりました。unconfined_u:system_r:httpd_t:s0
systemd デーモンを使うと、移行は非常に異なります。systemd がシステム上で開始および停止するコールを init_t を使ってすべて処理するため、デーモンが手動で再起動された際にラベルのユーザーの部分を上書きできます。その結果、上記の両方のシナリオでラベルが期待どおりに system_u:system_r:httpd_t:s0 となり、どのドメインがどのユニットを制御するかについての SELinux ポリシーが改善されます。
9.1. サービスに関する SELinux アクセスパーミッション
systemd がすべてのサービスを開始、停止し、ユーザーとプロセスは systemctl ユーティリティーを使って systemd と通信します。systemd デーモンには SELinux ポリシーを参考にし、呼び出しているプロセスのラベルと発信元が操作しようとしているユニットファイルのラベルをチェックした後で、SELinux に対して発信元のアクセスを許可するかどうかを尋ねる機能があります。このアプローチは、システムサービスを開始、停止するといったものを含む重大なシステム機能へのアクセス制御を強化します。
systemctl を実行して D-Bus メッセージを systemd に送信できるようして、NetworkManager が要求したサービスをこのデーモンが開始したり停止していました。実際、NetworkManager は systemctl が実行可能なすべてのことをできるように許可されていました。また、特定のサービスを開始したり停止したりすることが可能な制限ある管理者を設定することは不可能でした。
systemd は SELinux Access Manager としても機能するようになりました。これは、D-Bus メッセージを systemd に送信するプロセスや systemctl を実行しているプロセスのラベルを取得することができます。このデーモンはその次にプロセスが設定を希望するユニットファイルのラベルを探します。最後に、SELinux ポリシーがプロセスラベルとユニットファイルのラベルの間で特定のアクセスを許可する場合、systemd はカーネルから情報を取得することができます。つまり、特定のサービスについて systemd と対話する必要のあるアプリケーションで危険にされされているものは、SELinux で制限ができるようになっています。ポリシー作成者は、これらの細かい制御を使って管理者を制限することができます。ポリシー変更には service と呼ばれる新たなクラスが関わり、以下のパーミッションを伴います。
class service
{
start
stop
status
reload
kill
load
enable
disable
}
systemd でのアクセス制御の操作は、すべてのケースで一致するわけではありません。マッピングは、systemd メソッド呼び出しと SELinux アクセスチェックが並ぶように定義されています。表9.1「systemd ユニットファイルメソッド呼び出しと SELinux アクセスチェックのマッピング」では、ユニットファイルにおけるアクセスチェックのマッピングを表示しています。表9.2「 systemd の全般的なシステム呼び出しと SELinux アクセスチェックのマッピング」では、システム全般におけるアクセスチェックを表示しています。これらの表で一致するものがない場合は、undefined システムチェックが呼び出されます。
表9.1 systemd ユニットファイルメソッド呼び出しと SELinux アクセスチェックのマッピング
systemd ユニットファイルメソッド | SELinux アクセスチェック |
|---|---|
| DisableUnitFiles | disable |
| EnableUnitFiles | enable |
| GetUnit | status |
| GetUnitByPID | status |
| GetUnitFileState | status |
| Kill | stop |
| KillUnit | stop |
| LinkUnitFiles | enable |
| ListUnits | status |
| LoadUnit | status |
| MaskUnitFiles | disable |
| PresetUnitFiles | enable |
| ReenableUnitFiles | enable |
| Reexecute | start |
| Reload | reload |
| ReloadOrRestart | start |
| ReloadOrRestartUnit | start |
| ReloadOrTryRestart | start |
| ReloadOrTryRestartUnit | start |
| ReloadUnit | reload |
| ResetFailed | stop |
| ResetFailedUnit | stop |
| Restart | start |
| RestartUnit | start |
| Start | start |
| StartUnit | start |
| StartUnitReplace | start |
| Stop | stop |
| StopUnit | stop |
| TryRestart | start |
| TryRestartUnit | start |
| UnmaskUnitFiles | enable |
表9.2 systemd の全般的なシステム呼び出しと SELinux アクセスチェックのマッピング
systemd の全般的なシステム呼び出し | SELinux アクセスチェック |
|---|---|
| ClearJobs | reboot |
| FlushDevices | halt |
| Get | status |
| GetAll | status |
| GetJob | status |
| GetSeat | status |
| GetSession | status |
| GetSessionByPID | status |
| GetUser | status |
| Halt | halt |
| Introspect | status |
| KExec | reboot |
| KillSession | halt |
| KillUser | halt |
| ListJobs | status |
| ListSeats | status |
| ListSessions | status |
| ListUsers | status |
| LockSession | halt |
| PowerOff | halt |
| Reboot | reboot |
| SetUserLinger | halt |
| TerminateSeat | halt |
| TerminateSession | halt |
| TerminateUser | halt |
例9.1 システムサービス用の SELinux ポリシー
sesearch ユーティリティーを使うと、システムサービス用のポリシールールを一覧表示できます。たとえば、sesearch -A -s NetworkManager_t -c service コマンドを実行すると、以下が返されます。
allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ;
allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;9.2. SELinux と journald
systemd では、journald デーモン (systemd-journal とも呼ぶ) が syslog ユーティリティーの代わりとなり、これはロギングデータを収集、保存するシステムサービスになります。カーネルや libc syslog() 機能を使ってユーザープロセスから受け取ったロギング情報、システムサービスの標準およびエラー出力から受け取ったロギング情報、またはネイティブの API から受け取ったロギング情報を基に構造化およびインデックス化されたジャーナルを作成、維持します。また、暗黙的に安全な方法で各ロングメッセージの多くのメタデータフィールドを収集します。
systemd-journal サービスは SELinux と使うことでセキュリティーを高めることができます。SELinux は、プロセスが設計されたことのみを実行するようにすることでこれらを制御します。ポリシー作成者の制御目標によっては、実行できるものがこれよりも少なくなることもあります。たとえば SELinux は、危険にさらされた ntpd プロセスが Network Time 以外の処理をできないようにします。しかし、ntpd プロセスは syslog メッセージを送信するので、SELinux は危険にさらされたこのプロセスがこれらのメッセージを送信し続けることを許可します。危険にさらされた ntpd は syslog メッセージをフォーマットして他のデーモンに一致させ、管理者の判断を誤らせる可能性があります。さらには、syslog ファイルを読み込むユーティリティーの判断を誤らせ、システム全体を危険にさらす可能性もあります。
systemd-journal デーモンは、すべてのログメッセージを検証するとともに、それらに SELinux ラベルを追加します。こうすることでログメッセージにおける矛盾の検出が容易になり、このタイプの攻撃が発生する前に防ぐことができます。journalctl ユーティリティーを使うと、systemd ジャーナルのログにクエリを実行することができます。コマンドライン引数を指定せずにこのコマンドを実行すると、ジャーナルのすべてのコンテンツが古いエントリーから順に一覧表示されます。システムコンポーネントのログを含むシステム上で生成されたすべてのログを見るには、root で journalctl を実行します。root 以外のユーザーでこのコマンドを実行すると、出力は現在ログイン中のユーザーに関連するログのみに限定されます。
例9.2 journalctl を使ったログの一覧表示
journalctl を使って特定の SELinux ラベルに関連するすべてのログを一覧表示することができます。たとえば、以下のコマンドは、system_u:system_r:policykit_t:s0 ラベルで記録されたすべてのログを一覧表示します。
~]# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
Oct 21 10:22:42 localhost.localdomain polkitd[647]: Started polkitd version 0.112
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /etc/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /usr/share/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Finished loading, compiling and executing 5 rules
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Acquired the name org.freedesktop.PolicyKit1 on the system bus Oct 21 10:23:10 localhost polkitd[647]: Registered Authentication Agent for unix-session:c1 (system bus name :1.49, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Oct 21 10:23:35 localhost polkitd[647]: Unregistered Authentication Agent for unix-session:c1 (system bus name :1.80 [/usr/bin/gnome-shell --mode=classic], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.utf8)
journalctl についての詳細は、journalctl(1) の man ページを参照してください。
第10章 トラブルシューティング
audit2allow を使ったカスタムポリシーモジュールの作成について説明します。
10.1. アクセス拒否の場合
| デーモン | ログ記録の場所 |
|---|---|
| auditd オン | /var/log/audit/audit.log |
| auditd オフ; rsyslogd オン | /var/log/messages |
| setroubleshootd、rsyslogd、auditd すべてオン | /var/log/audit/audit.log 読みやすい拒否メッセージが /var/log/messages にも送信されます。 |
setroubleshootd と auditd デーモンが稼働している場合、SELinux がアクセスを拒否すると警告が表示されます。

Forbidden You don't have permission to access file name on this server
"SELinux is preventing" エラーの場合は /var/log/messages を、"denied" エラーの場合は /var/log/audit/audit.log をそれぞれチェックします。これは root ユーザーで以下のコマンドで実行できます。
~]#grep "SELinux is preventing" /var/log/messages
~]#grep "denied" /var/log/audit/audit.log
10.2. 問題の原因トップ 3
10.2.1. ラベル付けの問題
/var/www/html/ を使うのではなく、管理者は /srv/myweb/ を使いたかったとします。Red Hat Enterprise Linux では、/srv ディレクトリーは var_t タイプでラベル付けされます。作成されたファイルとディレクトリーおよび /srv はこのタイプを継承します。また、(myserver/ のような) 新規作成のトップレベルのディレクトリーは default_t タイプでラベル付けされます。SELinux は、Apache HTTP Server (httpd) がこれら両方のタイプにアクセスすることを禁止します。アクセスを許可するには、httpd が /srv/myweb/ にあるファイルにアクセス可能であることを SELinux が認識している必要があります。
~]#semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
semanage コマンドは、/srv/myweb/ ディレクトリー (およびその下にある全ファイルとディレクトリー) のコンテキストを SELinux ファイル設定に追加します[10]。semanage ユーティリティーはコンテキストを変更しません。変更を適用するには、root で restorecon ユーティリティーを実行します。
~]#restorecon -R -v /srv/myweb
10.2.1.1. 正しいコンテキストとは?
matchpathcon ユーティリティーは、ファイルパスのコンテキストをチェックし、そのパスのデフォルトラベルと比較します。以下の例では、間違ったラベル付けがされているファイルを含んだディレクトリー上での matchpathcon の使用を説明しています。
~]$matchpathcon -V /var/www/html/*/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
index.html および page1.html ファイルは user_home_t タイプでラベル付けされています。このタイプは、ユーザーのホームディレクトリーで使われるものです。mv コマンドを使ってファイルをホームディレクトリーから移動すると、ファイルに user_home_t タイプのラベル付けがされます。このタイプはホームディレクトリーの外にあってはならないので、restorecon ユーティリティーを使って、ファイルを正しいタイプに戻します。
~]#restorecon -v /var/www/html/index.htmlrestorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
-R を使います。
~]#restorecon -R -v /var/www/html/restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
matchpathcon の詳細例に関しては、「デフォルト SELinux コンテキストのチェック」を参照してください。
10.2.2. 制限のあるサービスの実行方法
semanage コマンドを使ってポリシー設定を更新する必要があります。
httpd_can_network_connect_db のブール値を有効にします。
~]#setsebool -P httpd_can_network_connect_db on
getsebool および grep ユーティリティーを使って、アクセスを許可するブール値が利用可能かどうかを調べます。例えば、getsebool -a | grep ftp コマンドと使って FTP 関連のブール値を検索します。
~]$getsebool -a | grep ftpftpd_anon_write --> off ftpd_full_access --> off ftpd_use_cifs --> off ftpd_use_nfs --> off ftpd_connect_db --> off httpd_enable_ftp_server --> off tftp_anon_write --> off
getsebool -a コマンドを実行します。ブール値の一覧表示、各ブール値の説明、それらがオンかオフかについては、root で semanage boolean -l を実行します。ブール値の一覧表示と設定については、「ブール値」を参照してください。
ポート番号
semanage port -l | grep http コマンドを実行し、http 関連ポートを一覧表示します。
~]#semanage port -l | grep httphttp_cache_port_t tcp 3128, 8080, 8118 http_cache_port_t udp 3130 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989
http_port_t ポートタイプは、Apache HTTP Server がリッスン可能なポートを定義します。このケースでは、TCP ポート 80、443、488、8008、8009、8443 になります。管理者が httpd.conf を設定し httpd がポート 9876 (Listen 9876) をリッスンするようにしても、ポリシーがこれを反映するように更新されていないと、以下のコマンドは失敗します。
~]#systemctl start httpd.serviceJob for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
~]#systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS) Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
/var/log/audit/audit.log にログ記録されます。
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_sockethttp_port_t ポートタイプに一覧表示されていないポートを httpd がリッスンできるようにするには、semanage port コマンドを実行して、ポートをポリシー設定に追加します[11]。
~]#semanage port -a -t http_port_t -p tcp 9876
-a オプションは新規レコードを追加します。-t オプションはタイプを定義します。-p オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。
10.2.3. ルールの発展と壊れたアプリケーション
audit2allow ユーティリティーを使ってアクセスを許可するカスタムポリシーモジュールを作成します。audit2allow の使用については、「アクセス許可: audit2allow」を参照してください。
10.3. 問題の修正
audit2allow によるカスタムポリシーモジュールの作成。
10.3.1. Linux パーミッション
~]$ls -l /var/www/html/index.html-rw-r----- 1 root root 0 2009-05-07 11:06 index.html
index.html は root ユーザーとグループが所有しています。root ユーザーには読み取りおよび書き込みパーミッション (-rw) があり、root グループのメンバーには読み取りパーミッション (-r-) があります。それ以外の人にはアクセスがありません (---)。デフォルトでは、これらのパーミッションは httpd によるこのファイルの読み取りを許可しません。この問題を解決するには、chown コマンドで所有者とグループを変更します。このコマンドは、root で実行する必要があります。
~]#chown apache:apache /var/www/html/index.html
httpd を Linux Apache ユーザーとして実行するというデフォルト設定を前提としています。httpd を別のユーザーで実行する場合は、apache:apache をそのユーザーで置き換えます。
10.3.2. サイレント拒否の原因
dontaudit ルールを使うことで、パーミッションを許可することなくサイレントな AVC 拒否を行うことができます。このルールは、標準ポリシーに共通のものです。dontaudit のマイナス面は、SELinux はアクセスを拒否するものの拒否メッセージがログ記録されないため、トラブルシューティングがより難しくなるという点です。
dontaudit ルールを無効にしてすべての拒否をログ記録できるようにするには、以下のコマンドを root で実行します。
~]# semodule -DB-D オプションは dontaudit ルールを無効にし、-B オプションはポリシーを再構築します。semodule -DB を実行した後、パーミッション問題があったアプリケーションを試します。そのアプリケーションに関連した SELinux 拒否がログ記録されているかどうかをチェックします。どの拒否を許可するかという決定は、注意して行ってください。なかには、無視して dontaudit ルールで扱われるべきものもあります。わからない場合やアドバイスが必要な場合は、fedora-selinux-list のような SELinux リストに掲載されている他の SELinux ユーザーや開発者に連絡してください。
dontaudit ルールを有効にするには、root で以下のコマンドを実行します。
~]# semodule -Bdontaudit ルールの完全なリストを表示させるには、sesearch --dontaudit コマンドを実行します。検索結果を絞り込むには、-s domain オプションと grep コマンドを使います。以下に例を挙げます。
~]$sesearch --dontaudit -s smbd_t | grep squiddontaudit smbd_t squid_port_t : tcp_socket name_bind ; dontaudit smbd_t squid_port_t : udp_socket name_bind ;
10.3.3. サービスの man ページ
httpd など) といった価値のある情報が含まれています。この情報は、通常の man ページや、sepolicy manpage ユーティリティーを使って各サービスドメインに SELinux ポリシーから自動で生成可能な man ページにあります。このような man ページは、service-name_selinux という形式の名前が付けられます。また、これらの man ページは selinux-policy-doc パッケージからも提供されます。
- Samba: samba_selinux(8) man ページは、たとえば、
samba_enable_home_dirsブール値を有効にすると Samba がユーザーのホームディレクトリーを共有できるようになることを説明しています。 - NFS: nfsd_selinux(8) man ページは、SELinux nfsd ポリシーを使うとユーザーが自身の nfsd プロセスを可能な限り安全な方法で設定できることを説明しています。
sepolicy manpage についての詳細は、「Man ページの生成: sepolicy manpage」を参照してください。
10.3.4. Permissive ドメイン
- システム全体を permissive にして危険にさらすことなく、単一のプロセス (ドメイン) を permissive にして問題解決ができます。
- 管理者が新たなアプリケーション用のポリシーを作成できます。以前は最低限のポリシーを作成し、マシン全体を permissive モードにすることでアプリケーションが実行できるようにすることが推奨されていましたが、SELinux 拒否はログ記録されていました。そして
audit2allowを使ってポリシーを記述することができました。これは、システム全体を危険にさらしていました。permissive ドメインでは、新規ポリシー内のドメインのみが permissive でマークされるので、システム全体を危険にさらすことはありません。
10.3.4.1. ドメインを permissive にする
semanage permissive -a domain コマンドを実行します。ここでの domain は、permissive にするドメインのことです。例えば、root で以下のコマンドを実行し、httpd_t ドメイン (Apache HTTP Server が稼働するドメイン) を permissive にします。
~]#semanage permissive -a httpd_t
semodule -l | grep permissive コマンドを実行します。以下のようになります。
~]#semodule -l | grep permissivepermissive_httpd_t 1.0 permissivedomains 1.0.0
semanage permissive -d domain コマンドを root で実行します。以下のようになります。
~]#semanage permissive -d httpd_t
10.3.4.2. Permissive ドメインを無効にする
permissivedomains.pp モジュールには、システム上で提示されるすべての permissive ドメイン宣言が含まれています。これらの permissive ドメインすべてを無効にするには、root で以下のコマンドを実行します。
~]#semodule -d permissivedomains
注記
semodule -d コマンドでポリシーモジュールを無効にすると、semodule -l コマンドでそのモジュールが表示されなくなります。無効になっているものも含めてすべてのポリシーモジュールを表示するには、root で以下のコマンドを実行します。
~]#semodule --list-modules=full
10.3.4.3. Permissive ドメイン での拒否
SYSCALL メッセージは、permissive ドメインでは違ったものになります。以下は、Apache HTTP Server からの AVC 拒否 (および関連するシステムコール) の例です。
type=AVC msg=audit(1226882736.442:86): avc: denied { getattr } for pid=2427 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226882736.442:86): arch=40000003 syscall=196 success=no exit=-13 a0=b9a1e198 a1=bfc2921c a2=54dff4 a3=2008171 items=0 ppid=2425 pid=2427 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)httpd_t ドメインは permissive ではないので、アクションは拒否され SYSCALL メッセージに success=no が含まれます。以下の例は、同じ状況での AVC 拒否ですが、semanage permissive -a httpd_t コマンドを実行して httpd_t ドメインを permissive にしてある点が異なります。
type=AVC msg=audit(1226882925.714:136): avc: denied { read } for pid=2512 comm="httpd" name="file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226882925.714:136): arch=40000003 syscall=5 success=yes exit=11 a0=b962a1e8 a1=8000 a2=0 a3=8000 items=0 ppid=2511 pid=2512 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)SYSCALL メッセージの success=yes にあるように、アクセスは拒否されませんでした。
10.3.5. 拒否の検索および表示
auditd、rsyslogd、setroubleshootd のデーモンが実行中であることを前提としています。これらのデーモンのスタート方法に関しては、「使用するログファイル」を参照してください。SELinux AVC メッセージの検索および表示には、ausearch、aureport、sealert などの数多くのユーティリティーが利用できます。
ausearch
ausearch ユーティリティーを提供します。このユーティリティーは、異なる検索条件に基づいて audit デーモンログイベントにクエリを行うことができます[12]。ausearch ユーティリティーは /var/log/audit/audit.log にアクセスするので、root ユーザーで実行する必要があります。
| 検索対象 | コマンド |
|---|---|
| すべての拒否 | ausearch -m avc,user_avc,selinux_err,user_selinux_err |
| 当日の拒否 | ausearch -m avc -ts today |
| 過去 10 分間の拒否 | ausearch -m avc -ts recent |
-c comm-name オプションを使います。ここでの comm-name は実行可能ファイルの名前です。例えば、Apache HTTP Server の場合は httpd、Samba の場合は smbd になります。
~]#ausearch -m avc -c httpd
~]#ausearch -m avc -c smbd
ausearch コマンドでは、読みやすくするためには --interpret (-i) オプションを、スクリプト処理には --raw (-r) オプションを使用することが推奨されます。ausearch オプションの詳細については、ausearch(8) man ページを参照してください。
aureport
aureport ユーティリティーを提供し、これは監査システムログのサマリーレポートを作成します[13]。aureport ユーティリティーは /var/log/audit/audit.log にアクセスするので、root ユーザーで実行する必要があります。SELinux 拒否メッセージの一覧を表示し、その発生頻度を確認するには、aureport -a コマンドを実行します。以下の例では出力に 2 つの拒否があります。
~]#aureport -aAVC Report ======================================================== # date time comm subj syscall class permission obj event ======================================================== 1. 05/01/2009 21:41:39 httpd unconfined_u:system_r:httpd_t:s0 195 file getattr system_u:object_r:samba_share_t:s0 denied 2 2. 05/03/2009 22:00:25 vsftpd unconfined_u:system_r:ftpd_t:s0 5 file read unconfined_u:object_r:cifs_t:s0 denied 4
sealert
sealert ユーティリティーを提供します。これは、setroubleshoot-server が変換した拒否メッセージを読み取ります[14]。/var/log/messages にあるように、拒否には ID が割り当てられます。以下の例は、messages からの拒否です。
setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket. For complete SELinux messages. run sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7
8c123656-5dda-4e5d-8791-9e3bd03786b7 です。-l オプションは、ID を引数 として取ります。sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7 コマンドを実行すると、SELinux がアクセスを拒否した詳細な分析とアクセスを許可するソリューションが提示されます。
setroubleshootd、dbus、および auditd デーモンが稼働している場合、SELinux がアクセスを拒否すると警告が表示されます。

表示 をクリックすると sealert GUI が起動し、問題の解決を図ることができます。

sealert -b コマンドを実行すると、sealert GUI を開始することができます。拒否メッセージすべての詳細な分析を表示するには、sealert -l \* コマンドを実行します。
10.3.6. Raw Audit Messages
/var/log/audit/audit.log に記録されます。以下の例は、Apache HTTP Server (httpd_t ドメインで稼働中) が /var/www/html/file1 ファイル (samba_share_t タイプでラベル付け) にアクセスしようとした際に発生したAVC 拒否メッセージ (および関連のシステムコール) です。
type=AVC msg=audit(1226874073.147:96): avc: denied { getattr } for pid=2465 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226874073.147:96): arch=40000003 syscall=196 success=no exit=-13 a0=b98df198 a1=bfec85dc a2=54dff4 a3=2008171 items=0 ppid=2463 pid=2465 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=6 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)- { getattr }
- 中括弧内のこのアイテムは、拒否されたパーミッションを示します。
getattrエントリーは、ソースプロセスがターゲットファイルのステータス情報の読み取りを試みたことを示します。これは、ファイルの読み取り前に発生します。このアクションが拒否されたのは、アクセスされたファイルに間違ったラベルが付けられていためです。一般的に見られるパーミッションは、getattr、read、writeなどです。 - comm="httpd"
- プロセスを開始した実行可能ファイルです。このファイルの完全パスは、システムコール (
SYSCALL) メッセージのexe=セクションにあります。このケースでは、exe="/usr/sbin/httpd"になります。 - path="/var/www/html/file1"
- プロセスがアクセスを試みたオブジェクト (ターゲット) へのパスです。
- scontext="unconfined_u:system_r:httpd_t:s0"
- 拒否されたアクションを試みたプロセスの SELinux コンテキストです。このケースでは、Apache HTTP Server の SELinux コンテキストで、これは
httpd_tドメインで実行中です。 - tcontext="unconfined_u:object_r:samba_share_t:s0"
- プロセスがアクセスを試みたオブジェクト (ターゲット) の SELinux コンテキストです。このケースでは、
file1のコンテキストです。httpd_tドメインで実行中のプロセスはsamba_share_tタイプにはアクセスできないことに注意してください。状況によっては、tcontextがscontextと一致する場合もあります。例えば、プロセスがユーザー ID など、その実行中のプロセスの特徴を変更することになるシステムサービスの実行を試みる場合などです。また、プロセスが通常の制限で許されている以上のリソース (メモリーなど) を使おうとして、そのプロセスが制限超過を許されているかどうかのセキュリティーチェックにつながる場合、tcontextがscontextと一致する可能性があります。
SYSCALL) メッセージでは、2 つの点に注目します。
success=noは、拒否 (AVC) が強制されたかどうかを示します。success=noは、システムコールが成功しなかったことを示します (SELinux がアクセスを拒否)。success=yesは、システムコールが成功したことを示します。これは、unconfined_service_tやkernel_tなどの permissive ドメインや制限のないドメインで見られます。exe="/usr/sbin/httpd"は、プロセスを開始した実行可能ファイルへの完全パスです。このケースでは、exe="/usr/sbin/httpd"です。
scontext) とターゲットコンテキスト (tcontext) を比べます。プロセス (scontext) がそのようなオブジェクト (tcontext) にアクセスしてもよいかどうかを確認します。例えば、Apache HTTP Server (httpd_t) は特定の設定がない限り、httpd_sys_content_t や public_content_t など、httpd_selinux(8) man ページで指定されたタイプ以外にはアクセスすべきではありません。
10.3.7. sealert メッセージ
/var/log/messages で見ることができます。以下の例は、Apache HTTP Server (httpd_t ドメインで稼働中) が /var/www/html/file1 ファイル (samba_share_t タイプでラベル付け) にアクセスしようとした際に発生したAVC 拒否 (messages にログ記録) です。
hostname setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l 84e0b04d-d0ad-4347-8317-22e74f6cd020
sealert -l 84e0b04d-d0ad-4347-8317-22e74f6cd020 コマンドを実行して完全なメッセージを表示します。このコマンドはローカルマシン上でのみ機能し、sealert GUI と同じ情報を提示します。
~]$sealert -l 84e0b04d-d0ad-4347-8317-22e74f6cd020Summary: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). Detailed Description: SELinux denied access to /var/www/html/file1 requested by httpd. /var/www/html/file1 has a context used for sharing by different program. If you would like to share /var/www/html/file1 from httpd also, you need to change its file context to public_content_t. If you did not intend to this access, this could signal a intrusion attempt. Allowing Access: You can alter the file context by executing chcon -t public_content_t '/var/www/html/file1' Fix Command: chcon -t public_content_t '/var/www/html/file1' Additional Information: Source Context unconfined_u:system_r:httpd_t:s0 Target Context unconfined_u:object_r:samba_share_t:s0 Target Objects /var/www/html/file1 [ file ] Source httpd Source Path /usr/sbin/httpd Port <Unknown> Host hostname Source RPM Packages httpd-2.2.10-2 Target RPM Packages Policy RPM selinux-policy-3.5.13-11.fc12 Selinux Enabled True Policy Type targeted MLS Enabled True Enforcing Mode Enforcing Plugin Name public_content Host Name hostname Platform Linux hostname 2.6.27.4-68.fc12.i686 #1 SMP Thu Oct 30 00:49:42 EDT 2008 i686 i686 Alert Count 4 First Seen Wed Nov 5 18:53:05 2008 Last Seen Wed Nov 5 01:22:58 2008 Local ID 84e0b04d-d0ad-4347-8317-22e74f6cd020 Line Numbers Raw Audit Messages node=hostname type=AVC msg=audit(1225812178.788:101): avc: denied { getattr } for pid=2441 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284916 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file node=hostname type=SYSCALL msg=audit(1225812178.788:101): arch=40000003 syscall=196 success=no exit=-13 a0=b8e97188 a1=bf87aaac a2=54dff4 a3=2008171 items=0 ppid=2439 pid=2441 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=3 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
- Summary
- 拒否されたアクションの簡潔なサマリーです。これは、
/var/log/messagesの拒否と同じです。この例では、httpdプロセスがsamba_share_tタイプのラベルが付けられたファイル (file1) へのアクセスを拒否されました。 - Detailed Description
- より詳細な説明です。この例では、
file1にsamba_share_tタイプのラベルが付けられています。このタイプは、Samba を使用してエクスポートするファイルおよびディレクトリーに使われます。説明では、Apache HTTP Server および Samba によるアクセスが望まれる場合、タイプを Apache HTTP Server および Samba がアクセス可能なものに変更することを提案しています。 - Allowing Access
- アクセスを可能にする方法を提案しています。ファイルの再ラベル付けやブール値を有効にする、ローカルポリシーモジュールの作成、などの方法があります。このケースでは、Apache HTTP Server および Samba の両方がアクセス可能なタイプでファイルにラベル付けすることを提案しています。
- Fix Command
- アクセスを可能にし、拒否を解決するコマンドを提案しています。この例では、
file1タイプを Apache HTTP Server と Samba の両方がアクセス可能なpublic_content_tに変更するコマンドを提示しています。 - Additional Information
- ポリシーパッケージ名やバージョン (
selinux-policy-3.5.13-11.fc12) などのバグレポートに便利な情報です。ただ、拒否が発生した原因の解決には役立たない可能性があります。 - Raw Audit Messages
/var/log/audit/audit.logからの拒否に関連した raw 監査メッセージです。AVC 拒否の各アイテムに関しては、「Raw Audit Messages」を参照してください。
10.3.8. アクセス許可: audit2allow
警告
audit2allow ユーティリティーの使用を説明する目的でのみ、使われています。
audit2allow ユーティリティーは拒否された操作のログから情報を収集し、SELinux policy allow ルールを生成します[15]。「sealert メッセージ」にあるように拒否メッセージを分析し、ラベル変更がないもしくはブール値で許可されたアクセスがない場合は、audit2allow を使用してローカルポリシーモジュールを作成します。SELinux にアクセスを拒否された場合は、audit2allow を実行すると以前は拒否されたアクセスを許可する Type Enforcement ルールが生成されます。
audit2allow を使ってポリシーモジュールを作成します。
- 拒否メッセージおよび関連するシステムコールは、
/var/log/audit/audit.logファイルにログ記録されます。type=AVC msg=audit(1226270358.848:238): avc: denied
{ write }for pid=13349comm="certwatch"name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0tcontext=system_u:object_r:var_t:s0tclass=dir type=SYSCALL msg=audit(1226270358.848:238): arch=40000003 syscall=39 success=no exit=-13 a0=39a2bf a1=3ff a2=3a0354 a3=94703c8 items=0 ppid=13344 pid=13349 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="certwatch" exe="/usr/bin/certwatch" subj=system_u:system_r:certwatch_t:s0 key=(null)この例では、certwatch はvar_tタイプのラベルが付けられたディレクトリーへの書き込みアクセスが拒否されました。「sealert メッセージ」にあるように拒否メッセージを分析します。ラベル変更がないもしくはブール値で許可されたアクセスがない場合は、audit2allowを使ってローカルポリシーモジュールを作成します。 - 以下のコマンドを実行して、アクセスが拒否された理由についてヒューマンリーダブルな記述を作成します。
audit2allowユーティリティーは/var/log/audit/audit.logを読み取るので、root ユーザーで実行する必要があります。~]#audit2allow -w -atype=AVC msg=audit(1226270358.848:238): avc: denied { write } for pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir Was caused by: Missing type enforcement (TE) allow rule. You can use audit2allow to generate a loadable module to allow this access.-aコマンドラインオプションにより、すべてを監査ログが読み取られます。-wオプションでは、ヒューマンリーダブルな記述が作成されます。上記では Type Enforcement ルールがないのでアクセスが拒否されました。 - 以下のコマンドを実行して、拒否されたアクセスを許可する Type Enforcement ルールを表示します。
~]#audit2allow -a#============= certwatch_t ============== allow certwatch_t var_t:dir write;重要
Type Enforcement ルールの欠如は通常、SELinux ポリシーのバグによって引き起こされ、Red Hat Bugzilla で報告されるべきです。Red Hat Enterprise Linux の場合、Red Hat Enterprise Linux製品に対してバグを作成し、selinux-policyコンポーネントを選択します。バグ報告では、audit2allow -w -aおよびaudit2allow -aコマンドの出力も報告してください。 audit2allow -aが表示したルールを使うには、root で以下のコマンドを実行してカスタムモジュールを作成します。-Mオプションは、現在作業中のディレクトリーに-Mで指定された名前のついた Type Enforcement ファイル (.te) を作成します。~]#audit2allow -a -M mycertwatch******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i mycertwatch.pp- また、
audit2allowは Type Enforcement ルールをポリシーパッケージ (.pp) にコンパイルします。~]#lsmycertwatch.pp mycertwatch.teモジュールをインストールするには、以下のコマンドを root で実行します。~]#semodule -i mycertwatch.pp重要
audit2allowで作成したモジュールは、必要以上にアクセスを許可する場合があります。audit2allowで作成されたモジュールは、アップストリームの SELinux リストに公表してレビューされることが推奨されます。ポリシーにバグがあると思われる場合は、Red Hat Bugzilla でバグを作成してください。
grep ユーティリティーを使って audit2allow の入力を絞り込みます。以下の例では、grep を使って certwatch に関連した拒否メッセージのみを audit2allow に送信する方法を示しています。
~]#grep certwatch /var/log/audit/audit.log | audit2allow -R -M mycertwatch2******************** IMPORTANT *********************** To make this policy package active, execute: semodule -i mycertwatch2.pp
/etc/selinux/targeted/contexts/files/ 内のファイルは、ファイルおよびディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon および setfiles ユーティリティーが読み取り、ファイルとディレクトリーをデフォルトのコンテキストに復元します。
semanage port -a コマンドは、エントリーを /etc/selinux/targeted/modules/active/ports.local ファイルに追加します。デフォルトでは、このファイルは root のみが読み取れることに留意してください。
第11章 追加情報
11.1. 貢献者
- Dominick Grift: テクニカルエディター
- Murray McAllister: Red Hat プロダクトセキュリティー
- James Morris: テクニカルエディター
- Eric Paris: テクニカルエディター
- Scott Radvan: Red Hat カスタマーコンテンツサービス
- Daniel Walsh: Red Hat セキュリティーエンジニアリング
11.2. その他のリソース
米国国家安全保障局 (NSA)
- SELinux メイン Web サイト: http://www.nsa.gov/research/selinux/index.shtml
- SELinux ドキュメンテーション: http://www.nsa.gov/research/selinux/docs.shtml
- SELinux バックグラウンド: http://www.nsa.gov/research/selinux/background.shtml
Tresys Technology
SELinux ニュース
- ニュース: http://selinuxnews.org/
- Planet SELinux (ブログ): http://selinuxnews.org/planet/
SELinux プロジェクト Wiki
- ドキュメンテーション、メールリスト、Web サイト、ツールへのリンクを含むユーザーリソース: http://selinuxproject.org/page/User_Resources
Fedora
- Fedora の SELinux FAQ: https://fedoraproject.org/wiki/SELinux_FAQ
非公式の SELinux FAQ
The SELinux Notebook - The Foundations - 第 3 版
IRC
- #selinux
- #fedora-selinux
- #security
パート II. 制限のあるサービスの管理
第12章 はじめに
第13章 Apache HTTP Server
~]$ rpm -q httpd
package httpd is not installed
yum ユーティリティーを使用してインストールします。
~]# yum install httpd13.1. Apache HTTP Server と SELinux
httpd) はデフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそのプロセス自体のドメインで実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側がリソースにアクセスして加えることができる被害は限定されます。以下の例では、httpd プロセス自体のドメイン内で実行しているプロセスを示します。ここでは、httpd、setroubleshoot、setroubleshoot-server、policycoreutils-python の各パッケージがインストールされていることを前提としています。
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行していれば、Enforcingが返されます。- root で以下のコマンドを実行して、
httpdを起動します。~]#
systemctl start httpd.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago httpdプロセスを表示するには、以下のコマンドを実行します。~]$
ps -eZ | grep httpdsystem_u:system_r:httpd_t:s0 19780 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19781 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19782 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19783 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19784 ? 00:00:00 httpd system_u:system_r:httpd_t:s0 19785 ? 00:00:00 httpdhttpdプロセスに関連する SELinux コンテキストはsystem_u:system_r:httpd_t:s0です。コンテキストの末尾から 2 番目の部分であるhttpd_tがタイプになります。タイプはプロセスのドメインやファイルのタイプを定義します。この例の場合、httpdプロセスはhttpd_tドメインで実行されています。
httpd_t などの制限のあるドメイン内で実行しているプロセスがファイルや他のプロセス、システムなどとどのように交信するのかを定義します。httpd がファイルにアクセスができるよう、ファイルには適切なラベルを付ける必要があります。たとえば、httpd_sys_content_t タイプのラベルが付いたファイルの場合、httpd はこのファイルの読み取りはできますが書き込みはできません。この場合、Linux (DAC) のパーミッションで書き込みのアクセスが許可されていても書き込みはできません。特定の動作を許可する場合、たとえば、スクリプトによるネットワークへのアクセスを許可する、httpd による NFS や CIFS ファイルシステムへのアクセスを許可する、httpd による CGI (Common Gateway Interface) スクリプトの実行を許可するなどの場合には、ブール値を有効にする必要があります。
httpd が TCP ポート 80、443、488、8008、8009、8443 以外のポートでリッスンするように /etc/httpd/conf/httpd.conf ファイルを設定する場合は、semanage port コマンドを使って SELinux ポリシー設定に新しいポート番号を追加する必要があります。以下では、まだ SELinux ポリシー設定で httpd 用には定義されていないポートでリッスンするよう httpd を設定した結果、httpd の起動に失敗する例を示します。また、httpd がポリシーにまだ定義されていない非標準のポートで正しくリッスンするよう SELinux システムを設定する方法についても示します。この例では、httpd パッケージがインストールされていることを前提としています。各コマンドは root ユーザーで実行してください。
- 以下のコマンドを実行して、
httpdが稼働していないことを確認します。~]#
systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)出力が上記と異なる場合は、このプロセスを停止します。~]#
systemctl stop httpd.service semanageユーティリティーを使って、SELinux でhttpdにリッスンを許可しているポートを表示します。~]#
semanage port -l | grep -w http_port_thttp_port_t tcp 80, 443, 488, 8008, 8009, 8443- root で
/etc/httpd/conf/httpd.confを編集します。Listenオプションを設定し、SELinux ポリシー設定でhttpd用に設定されていないポートを記入します。この例では、httpdがポート 12345 をリッスンするように設定します。# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80 Listen 127.0.0.1:12345
- 以下のコマンドを実行して、
httpdを起動します。~]#
systemctl start httpd.serviceJob for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.次のような SELinux 拒否メッセージがログ記録されます。setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
- この例で
httpdがポート 12345 をリッスンできるように SELinux で許可するには、以下のコマンドが必要になります。~]#
semanage port -a -t http_port_t -p tcp 12345 - 再度
httpdを起動して、新しいポートをリッスンするようにします。~]#
systemctl start httpd.service - これで
httpdが非標準ポート (この例では TCP 12345) をリッスンできるようにする SELinux 設定が完了したので、httpdがこのポートで正常に起動するようになります。 httpdが TCP ポート 12345 でリッスンし通信しているかを確認するには、以下のようにそのポートに telnet 接続を開き HTTP GET コマンドを発行します。~]#
telnet localhost 12345Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Wed, 02 Dec 2009 14:36:34 GMT Server: Apache/2.2.13 (Red Hat) Accept-Ranges: bytes Content-Length: 3985 Content-Type: text/html; charset=UTF-8 [...continues...]
13.2. タイプ
/var/www/html/ ディレクトリーに新規ファイルを作成し、このファイルが親ディレクトリー (/var/www/html/) から httpd_sys_content_t タイプを継承していることを例示します。
- 以下のコマンドを実行して、
/var/www/html/の SELinux コンテキストを表示します。~]$
ls -dZ /var/www/htmldrwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/var/www/html/がhttpd_sys_content_tタイプでラベル付けされていることが分かります。 - root で
touchユーティリティーを使用して新規ファイルを作成します。~]#
touch /var/www/html/file1 - 以下のコマンドを実行して SELinux コンテキストを表示します。
~]$
ls -Z /var/www/html/file1-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
ls -Z コマンドを使用すると file1 には httpd_sys_content_t タイプのラベルが付けられていることが分かります。SELinux では、httpd がこのタイプのラベルが付いたファイルを読み込めるよう許可していますが、書き込みは許可していません。Linux のパーミッションが書き込みアクセスを許可していても、書き込みは許可されません。SELinux ポリシーでは、httpd_t ドメイン (httpd が実行されるドメイン) で実行しているプロセスが読み取りと書き込みができるタイプを定義しています。これにより、プロセスが別のプロセス用のファイルにアクセスすることを防いでいます。
httpd は httpd_sys_content_t タイプ (Apache HTTP Server 用) のラベルが付いたファイルを読み込むことはできますが、デフォルトでは samba_share_t タイプ (Samba 用) のラベルが付いたファイルにはアクセスできません。また、ユーザーのホームディレクトリーにあるファイルには user_home_t タイプのラベルが付けられます。これにより、デフォルトで httpd がユーザーのホームディレクトリーにあるファイルの読み取りや書き込みをすることを防いでいます。
httpd で使用されるタイプを例示します。タイプを使い分けることで柔軟なアクセス設定ができるようになります。
httpd_sys_content_t- このタイプは、静的な Web サイトで使用される
.htmlファイルなどの Web コンテンツに使用します。このタイプのラベルが付けられたファイルは、httpdおよびhttpdで実行されるスクリプトによるアクセスが可能となります (読み取り専用)。デフォルトでは、このタイプのラベルが付けられたファイルおよびディレクトリーには、httpdや他のプロセスは書き込みや編集ができません。デフォルトでは、/var/www/html/ディレクトリー内に作成またはコピーされたファイルにはhttpd_sys_content_tタイプのラベルが付けられることに注意してください。 httpd_sys_script_exec_t- このタイプは、
httpdで実行するスクリプトに使用します。一般的には/var/www/cgi-bin/内の CGI (Common Gateway Interface) スクリプトに使用されます。デフォルトでは、SELinux ポリシーにより、httpdは CGI スクリプトの実行が禁止されています。これを許可するには、スクリプトにhttpd_sys_script_exec_tタイプのラベルを付け、httpd_enable_cgiのブール値を有効にします。httpd_sys_script_exec_tのラベルが付けられたスクリプトは、httpdで実行されるとhttpd_sys_script_tドメインで実行されます。httpd_sys_script_tドメインには、postgresql_tやmysqld_tなどの他のシステムドメインへのアクセスがあります。 httpd_sys_rw_content_t- このタイプのラベルが付けられたファイルには、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトは書き込み可能となりますが、これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトで読み込みや書き込みをするファイルには、httpd_sys_rw_content_tタイプのラベルを使用する必要があります。 httpd_sys_ra_content_t- このタイプのラベルが付けられたファイルは、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトによる追加が可能になりますが、これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトで読み込みや追加をするファイルには、httpd_sys_ra_content_tタイプのラベルを使用する必要があります。 httpd_unconfined_script_exec_t- このタイプのラベルが付いたスクリプトは SELinux の保護なしで実行されます。他のオプションをすべて試してもうまくいかない複雑なスクリプトにのみ、このタイプを使用してください。
httpdの SELinux 保護を無効にする、またはシステム全体の SELinux 保護を無効にするよりは、このタイプの使用が望まれます。
注記
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts
手順13.1 SELinux のコンテキストを変更する
chcon コマンドを使用して変更できます。chcon による変更は、ファイルシステムの再ラベルや restorecon コマンドを実行すると失われます。特定ファイルの SELinux コンテキストをユーザーが変更できるかどうかは、SELinux ポリシーで制御します。以下の例では、httpd 用に index.html ファイルと新規ディレクトリーを作成し、httpd がこれらにアクセスできるようにするラベルを付けます。
- root で
mkdirユーティリティーを使用し、httpdが使用するファイルを保存する最上位のディレクトリーを作成します。~]#
mkdir -p /my/website - ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリーには、
default_tタイプのラベルが付いている場合があります。制限のあるサービスは、このタイプのファイルやディレクトリーにはアクセスできません。~]$
ls -dZ /mydrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my - root で以下のコマンドを実行し、
my/ディレクトリーおよびサブディレクトリーのタイプをhttpdがアクセス可能なタイプに変更します。これで/my/website/の下に作成されるファイルは、default_tタイプではなくhttpd_sys_content_tタイプを継承するようになり、httpd がアクセスできるようになります。~]#
chcon -R -t httpd_sys_content_t /my/~]#touch /my/website/index.html~]#ls -Z /my/website/index.html-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
chcon についての詳細は、「一時的な変更: chcon」を参照してください。
restorecon コマンドの実行後もこのラベル変更を維持するには、semanage fcontext コマンド (semanage は policycoreutils-python パッケージで提供) を使用します。このコマンドにより、変更がファイルコンテキスト設定に追加されます。この後に restorecon を実行すると、ファイルコンテキスト設定が読み込まれ、ラベル変更が適用されます。以下の例では、httpd が使用する新規ディレクトリーと index.html ファイルを作成し、httpd がアクセスできるようにラベルを永続的に変更します。
- root で
mkdirユーティリティーを使用し、httpdが使用するファイルを保存する最上位のディレクトリーを作成します。~]#
mkdir -p /my/website - root で以下のコマンドを実行して、ラベル変更をファイルコンテキスト設定に追加します。
~]#
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?""/my(/.*)?"は、ラベル変更がmy/ディレクトリーとその下のファイルおよびディレクトリーすべてに適用されることを意味します。 - root で
touchを使用して新規ファイルを作成します。~]#
touch /my/website/index.html - root で以下のコマンドを実行し、ラベルの変更を適用します (ステップ 2 の
semanageコマンドで変更されたファイルコンテキスト設定がrestoreconにより読み込まれます)。~]#
restorecon -R -v /my/restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
13.3. ブール値
setsebool コマンドを使用します。たとえば、httpd_anon_write ブール値をオンにするには、以下のコマンドを root ユーザーで実行します。
~]# setsebool -P httpd_anon_write onon を off にします。
~]# setsebool -P httpd_anon_write off注記
setsebool による変更を維持したくない場合は、-P オプションを使用しないでください。
httpd の動作を指定する一般的なブール値について説明します。
httpd_anon_write- このブール値を無効にすると、
httpdはpublic_content_rw_tタイプのラベルが付いたファイルへのアクセスが読み取り専用に限定されます。有効にすると、パブリックファイル転送サービス用のファイルを含むパブリックディレクトリーなど、public_content_rw_tタイプのラベルが付いたファイルへの書き込みが可能になります。 httpd_mod_auth_ntlm_winbind- このブール値を有効にすると、
httpdでmod_auth_ntlm_winbindモジュールを使用した NTLM および Winbind 認証メカニズムへのアクセスが許可されます。 httpd_mod_auth_pam- このブール値を有効にすると、
httpdでmod_auth_pamモジュールを使用した PAM 認証メカニズムへのアクセスが許可されます。 httpd_sys_script_anon_write- このブール値は、パブリックファイル転送サービスで使用されるような、
public_content_rw_tタイプのラベルが付いたファイルへの書き込みアクセスを HTTP スクリプトに許可するかどうかを定義します。 httpd_builtin_scriptinghttpdスクリプト機能へのアクセスを定義するブール値です。PHP コンテンツの場合、このブール値を有効にすることが必要とされることが多くあります。httpd_can_network_connect- このブール値を無効にすると、HTTP スクリプトやモジュールがネットワークやリモートポートに接続開始することができなくなります。接続の開始を許可する場合はブール値を有効にします。
httpd_can_network_connect_db- このブール値を無効にすると、HTTP スクリプトやモジュールによるデータベースサーバーへの接続開始が阻止されます。接続の開始を許可する場合はブール値を有効にします。
httpd_can_network_relayhttpdをフォワードプロキシまたはリバースプロキシとして使用する場合、このブール値を有効にします。httpd_can_sendmail- このブール値を無効にすると、HTTP モジュールがメール送信をできなくなります。これにより、
httpdに脆弱性が見つかった場合にスパム攻撃を阻止することができます。HTTP モジュールにメール送信を許可する場合は、このブール値を有効にします。 httpd_dbus_avahi- このブール値を無効にすると、
httpdによるD-Busを使ったavahiサービスへのアクセスが拒否されます。このアクセスを許可する場合は、このブール値を有効にします。 httpd_enable_cgi- このブール値を無効にすると、
httpdが CGI スクリプトの実行をできなくなります。httpdに CGI スクリプトの実行を許可する場合は、このブール値を有効にします (CGI スクリプトにはhttpd_sys_script_exec_tタイプのラベルを付けておく必要があります)。 httpd_enable_ftp_server- このブール値を有効にすると、
httpdが FTP ポートでリッスンできるようになり、FTPサーバーとしての動作が可能になります。 httpd_enable_homedirs- このブール値を無効にすると、
httpdがユーザーのホームディレクトリーにアクセスできなくなります。ユーザーのホームディレクトリー (/home/*/内のコンテンツなど) へのアクセスを許可する場合は、このブール値を有効にします。 httpd_execmem- このブール値を有効にすると、
httpdが実行可能かつ書き込み可能なメモリーアドレスを必要とするプログラムを実行できるようになります。バッファのオーバーフローに対する保護が低下するため、安全面からはこのブール値の有効化は推奨されません。ただし、特定のモジュールやアプリケーションではこの権限を必要とするものもあります (Java や Mono アプリケーションなど)。 httpd_ssi_exec- このブール値は、Web ページ内の SSI (server side include) 要素を実行可能にするかどうかを定義します。
httpd_tty_comm- このブール値は、
httpdが制御ターミナルへアクセスできるかどうかを定義します。通常、このアクセスは必要とされませんが、SSL 証明書ファイルを設定する場合などに、パスワードのプロンプトを表示させ処理するため、ターミナルへのアクセスが必要になります。 httpd_unified- このブール値を有効にすると、
httpd_tによるhttpdの全タイプへの完全アクセスが許可されます (つまり、sys_content_t の実行、読み込み、書き込み)。これを無効にすると、読み取り専用 web コンテンツ、書き込み可能 web コンテンツ、実行可能 web コンテンツが分離されます。このブール値を無効にすると安全性は高くなりますが、各ファイルに付与するアクセス権に応じてスクリプトや他の web コンテンツを個別にラベル付けするという管理オーバーヘッドが生じます。 httpd_use_cifs- このブール値を有効にすると、Samba を使ってマウントされるファイルシステムなど、
cifs_tタイプのラベルが付いている CIFS ボリューム上にあるファイルにhttpdがアクセスできるようになります。 httpd_use_nfs- このブール値を有効にすると、NFS を使ってマウントされるファイルシステムなど、
nfs_tタイプのラベルが付いている NFS ボリューム上にあるファイルにhttpdがアクセスできるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
13.4. 設定例
13.4.1. 静的なサイトを稼働させる
.html ファイルに httpd_sys_content_t タイプのラベルを付けます。デフォルトでは、Apache HTTP Server は httpd_sys_content_t タイプのラベルが付いたファイルに書き込みはできません。以下の 例では、読み取り専用 web サイト向けのファイルを保存する新規ディレクトリーを作成します。
- root で
mkdirユーティリティーを使用して最上位のディレクトリーを作成します。~]#
mkdir /mywebsite - root で
/mywebsite/index.htmlファイルを作成します。以下のコンテンツを/mywebsite/index.htmlにコピーして貼り付けます。<html> <h2>index.html from /mywebsite/</h2> </html>
/mywebsite/およびその配下のファイルやサブディレクトリーへの読み取り専用アクセスを Apache HTTP Server に許可するために、このディレクトリー にhttpd_sys_content_tタイプのラベルを付けます。root で以下のコマンドを実行してラベルの変更をファイルコンテキスト設定に追加します。~]#
semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"- root で
restoreconを使用してラベル変更を適用します。~]#
restorecon -R -v /mywebsiterestorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 - この例の場合、root で
/etc/httpd/conf/httpd.confファイルを編集します。既存のDocumentRootオプションをコメントアウトし、DocumentRoot "/mywebsite"オプションを追加します。編集後は以下のようになります。#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
- root で以下のコマンドを実行して Apache HTTP Server の状態を確認します。サーバーが停止している場合は起動します。
~]#
systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)~]#
systemctl start httpd.serviceサーバーが稼働している場合は、root で以下のコマンドを実行してサービスを再起動します (httpd.confへの変更にもこれを適用)。~]#
systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Wed 2014-02-05 13:16:46 CET; 2s ago~]#
systemctl restart httpd.service - web ブラウザで
http://localhost/index.htmlに移動します。以下のように表示されます。index.html from /mywebsite/
13.4.2. NFS および CIFS ボリュームの共有
nfs_t タイプを使用します。またデフォルトでは、クライアント側にマウントされた Samba 共有は、ポリシーが定義したデフォルトのコンテキストでラベル付けされます。共通ポリシーでは、このデフォルトのコンテキストは cifs_t タイプを使用します。
nfs_t または cifs_t タイプのラベルが付けられたファイルを読み取れない場合もあります。これにより、これらのタイプのラベルが付けられたファイルシステムがマウントされ、他のサービスが読み取ったり、エクスポートすることを防ぐことができます。ブール値をオンやオフに切り替えて、nfs_t や cifs_t タイプにアクセス可能なサービスを制御することができます。
nfs_t タイプのラベルが付けられている) NFS ボリュームへのアクセスと共有を httpd に許可する場合は、httpd_use_nfs ブール値を有効にします。
~]# setsebool -P httpd_use_nfs oncifs_t タイプのラベルが付けられている) CIFS ボリュームへのアクセスと共有を httpd に許可する場合は、httpd_use_cifs ブール値を有効にします。
~]# setsebool -P httpd_use_cifs on注記
setsebool による変更を維持したくない場合は、-P オプションを使用しないでください。
13.4.3. サービス間でのファイル共有
httpd_sys_content_t タイプのラベルが付いたファイルを読み込みことはできません。このタイプは Apache HTTP Server での使用を目的としています。目的のファイルに public_content_t または public_content_rw_t タイプのラベルを付けると、Apache HTTP Server、FTP、rsync、Samba 間でファイルを共有することができるようになります。
- root で
mkdirを使用して、複数サービス間でファイルを共有するための最上位の新規ディレクトリーを作成します。~]#
mkdir /shares - ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリーには、
default_tタイプのラベルが付いている場合があります。制限のあるサービスは、このタイプのファイルやディレクトリーにはアクセスできません。~]$
ls -dZ /sharesdrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /shares - root で
/shares/index.htmlファイルを作成します。以下のコンテンツをコピーして/shares/index.htmlに貼り付けます。<html> <body> <p>Hello</p> </body> </html>
/shares/にpublic_content_tタイプのラベルを付けることで、Apache HTTP Server、FTP、rsync、Samba による読み取り専用アクセスを許可します。root で以下のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。~]#
semanage fcontext -a -t public_content_t "/shares(/.*)?"- root で
restoreconユーティリティーを使用してラベル変更を適用します。~]#
restorecon -R -v /shares/restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0 restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
/shares/ を共有する場合は、以下の手順にしたがいます。
- samba、samba-common、samba-client の各パッケージがインストールされていることを確認します (バージョン番号は使用しているバージョンによって異なります)。
~]$
rpm -q samba samba-common samba-clientsamba-3.4.0-0.41.el6.3.i686 samba-common-3.4.0-0.41.el6.3.i686 samba-client-3.4.0-0.41.el6.3.i686上記のパッケージがインストールされていない場合は、root で以下のコマンドを実行して、これらをインストールします。~]#
yum install package-name - root で
/etc/samba/smb.confファイルを編集します。Samba で/shares/ディレクトリーを共有するために、以下のエントリーをこのファイルの末尾に追加します。[shares] comment = Documents for Apache HTTP Server, FTP, rsync, and Samba path = /shares public = yes writable = no
- Samba ファイルシステムのマウントには Samba アカウントが必要になります。root で以下のコマンドを実行し、Samba アカウントを作成します。username は既存の Linux ユーザーにします。たとえば、
smbpasswd -a testuserを実行すると、Linux のtestuserユーザー用の Samba アカウントが作成されます。~]#
smbpasswd -a testuserNew SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.上記のコマンドを実行する際に、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'!エラーが発生します。 - Samba サービスを開始します。
~]#
systemctl start smb.service - 以下のコマンドを実行し、利用可能な共有を表示します。username はステップ 3 で追加した Samba アカウントにします。パスワードの入力を求められたら、ステップ 3 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は使用しているバージョンによって異なります)。
~]$
smbclient -U username -L localhostEnter username's password: Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6] Sharename Type Comment --------- ---- ------- shares Disk Documents for Apache HTTP Server, FTP, rsync, and Samba IPC$ IPC IPC Service (Samba Server Version 3.4.0-0.41.el6) username Disk Home Directories Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6] Server Comment --------- ------- Workgroup Master --------- ------- mkdirユーティリティーを使って新規ディレクトリーを作成します。このディレクトリーは Samba 共有のsharesをマウントする際に使用します。~]#
mkdir /test/- root で以下のコマンドを実行して、Samba 共有の
sharesを/test/にマウントします。username はステップ 3 のユーザー名にしてください。~]#
mount //localhost/shares /test/ -o user=usernameステップ 3 で設定した username のパスワードを入力します。 - Samba で共有されているファイルのコンテンツを表示します。
~]$
cat /test/index.html<html> <body> <p>Hello</p> </body> </html>
/shares/ を共有する場合は、以下の手順にしたがいます。
- httpd パッケージがインストールされていることを確認します (バージョン番号は使用しているバージョンによって異なります)。
~]$
rpm -q httpdhttpd-2.2.11-6.i386このパッケージがインストールされていない場合は、root でyumユーティリティーを使用してインストールします。~]#
yum install httpd /var/www/html/ディレクトリーに移動します。root で以下のコマンドを実行して/shares/ディレクトリーへのリンク (sharesという名前にします) を作成します。html]#
ln -s /shares/ shares- Apache HTTP Server を起動します。
~]#
systemctl start httpd.service - web ブラウザを使って
http://localhost/sharesに移動します。/shares/index.htmlが表示されます。
index.html ファイルが存在していれば、Apache HTTP Server はこれを読み込みます。/shares/ に file1、file2、file3 しかなく index.html がない場合、http://localhost/shares にアクセスするとディレクトリー一覧が表示されます。
index.htmlファイルを削除します。~]#
rm -i /shares/index.html- root で
touchユーティリティーを使用して/shares/に新規ファイルを 3 つ作成します。~]#
touch /shares/file{1,2,3}~]#ls -Z /shares/-rw-r--r-- root root system_u:object_r:public_content_t:s0 file1 -rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file2 -rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file3 - root で以下のコマンドを実行して Apache HTTP Server の状態を確認します。
~]#
systemctl status httpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)サーバーが停止している場合は、これを起動します。~]#
systemctl start httpd.service - web ブラウザで
http://localhost/sharesに移動します。ディレクトリー一覧が表示されます。
13.4.4. ポート番号を変更する
semanage ユーティリティーを使用して、SELinux が httpd にリッスンを許可しているポートを表示します。
~]# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443httpd にリッスンを許可している TCP ポートは 80、443、488、8008、8009、8443 になります。httpd で http_port_t 用に記載されていないポートをリッスンするよう /etc/httpd/conf/httpd.conf を設定すると、httpd の起動に失敗します。
httpd が TCP ポート 80、443、488、8008、8009、8443 以外のポートで実行するようにするには、以下の手順で設定します。
- root で
/etc/httpd/conf/httpd.confファイルを編集し、SELinux ポリシーではhttpd用に設定されていないポートをListenオプションに記載します。以下の例では、httpdが IP アドレス 10.0.0.1、TCP ポート 12345 でリッスンするよう設定します。# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80 Listen 10.0.0.1:12345
- root で以下のコマンドを実行し、SELinux ポリシーの設定にこのポートを追加します。
~]#
semanage port -a -t http_port_t -p tcp 12345 - ポートが追加されたことを確認します。
~]#
semanage port -l | grep -w http_port_thttp_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
httpd を実行しないようになったら、root ユーザーで semanage ユーティリティーを実行してポリシー設定からそのポートを削除します。
~]# semanage port -d -t http_port_t -p tcp 12345第14章 Samba
~]$ rpm -q samba
package samba is not installedyum ユーティリティーを使用してインストールします。
~]# yum install samba14.1. Samba と SELinux
smbd) はデフォルトで制限のあるサービスとして実行されます。制限のあるサービスはそのサービス自体のドメイン内で実行され、他の制限のあるサービスとは分離されます。以下の例では、サービス自体のドメイン内で実行している smbd プロセスを示しています。この例では、samba パッケージがインストールされていることを前提としています。
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。- root で 以下のコマンドを実行して
smbdを起動します。~]#
systemctl start smb.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status smb.servicesmb.service - Samba SMB Daemon Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled) Active: active (running) since Mon 2013-08-05 12:17:26 CEST; 2h 22min ago smbdプロセスを表示するには、以下のコマンドを実行します。~]$
ps -eZ | grep smbsystem_u:system_r:smbd_t:s0 9653 ? 00:00:00 smbd system_u:system_r:smbd_t:s0 9654? 00:00:00 smbdsmbdプロセスに関連する SELinux コンテキストはsystem_u:system_r:smbd_t:s0です。このコンテキストの最後から 2 番目の部分、smbd_tがタイプになります。タイプは、プロセスのドメインやファイルのタイプを定義します。この例の場合、smbdプロセスはsmbd_tドメイン内で実行しています。
smbd がファイルにアクセスおよび共有をできるようにするには、ファイルに適切なラベルを付ける必要があります。たとえば、smbd は samba_share_t タイプのラベルが付いたファイルの読み込みと書き込みができますが、デフォルトでは httpd_sys_content_t タイプのラベルが付いたファイルにはアクセスできません。このタイプは Apache HTTP Server での使用を目的としているためです。Samba でホームディレクトリーや NFS ボリュームのエクスポートを可能にしたり、Samba がドメインコントローラとしての動作できるようにするなど、特定の動作を許可するには、ブール値を有効にする必要があります。
14.2. タイプ
samba_share_t タイプのラベルを付けて Samba によるファイル共有ができるようにします。このタイプのラベル付けはユーザー作成のファイルに限定してください。システムファイルには samba_share_t タイプのラベルは付けないよう注意してください。ブール値を有効にすると、これらのラベル付けしたファイルやディレクトリーを共有できるようになります。SELinux では、/etc/samba/smb.conf ファイルと Linux パーミッションが適切に設定されていれば、Samba は samba_share_t タイプのラベルが付いたファイルに書き込みができるようになります。
samba_etc_t タイプは、/etc/samba/ 内にある smb.conf などの特定ファイルに使用されます。samba_etc_t タイプのラベル付けは手作業では行わないでください。このディレクトリー内のファイルに適切なラベルが付けられていない場合、root で restorecon -R -v /etc/samba コマンドを実行して、そのファイルをデフォルトのコンテキストに復元します。/etc/samba/smb.conf に samba_etc_t タイプのラベルが付いていない場合、Samba サービスの起動が失敗し、SELinux 拒否メッセージがログ記録される可能性があります。以下で、/etc/samba/smb.conf に httpd_sys_content_t タイプのラベルが付いている場合の拒否メッセージの例を示します。
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
14.3. ブール値
smbd_anon_write- このブール値を有効にすると、特別なアクセス制限がなく共通ファイル用に予約されている領域などのパブリックディレクトリーに
smbdが書き込めるようになります。 samba_create_home_dirs- このブール値を有効にすると、Samba が単独で新規のホームディレクトリーを作成できるようになります。これは、PAM などのメカニズムで実行されることが多くあります。
samba_domain_controller- このブール値を有効にすると、Samba がドメインコントローラーとして機能するとともに、
useradd、groupadd、passwdなどの関連コマンドの実行パーミッションを付与することになります。 samba_enable_home_dirs- このブール値を有効にすると、Samba がユーザーのホームディレクトリーを共有できるようになります。
samba_export_all_ro- あらゆるファイルやディレクトリーをエクスポートし、読み取り専用のパーミッションを付与します。これにより、
samba_share_tタイプのラベルが付いていないファイルやディレクトリーを Samba で共有できるようになります。samba_export_all_roブール値が有効になっていてsamba_export_all_rwブール値が無効の場合、/etc/samba/smb.confで書き込みアクセスが設定され Linux パーミッションでも書き込みアクセスが許可されていても、Samba 共有への書き込みアクセスは拒否されます。 samba_export_all_rw- あらゆるファイルやディレクトリーをエクスポートし、読み取りと書き込みのパーミッションを付与します。これにより、
samba_share_tタイプのラベルが付いていないファイルやディレクトリーを Samba でエクスポートできるようになります。/etc/samba/smb.confのパーミッションおよび Linux パーミッションで書き込みアクセスを許可する設定にする必要があります。 samba_run_unconfined- このブール値を有効にすると、Samba が
/var/lib/samba/scripts/ディレクトリー内で制限のないスクリプトを実行できるようになります。 samba_share_fusefs- Samba が fusefs ファイルシステムを共有する場合は、このブール値を有効にする必要があります。
samba_share_nfs- このブール値を無効にすると、
smbdが Samba 経由で NFS 共有に完全アクセスできなくなります。このブール値を有効にすると、Samba が NFS ボリュームを共有できるようになります。 use_samba_home_dirs- Samba のホームディレクトリー用にリモートサーバーを使用する場合、このブール値を有効にします。
virt_use_samba- 仮想マシンによる CIFS ファイルへのアクセスを許可します。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
14.4. 設定例
14.4.1. 作成したディレクトリーを共有する
- samba、samba-common、samba-client の各パッケージがインストールされていることを確認します。
~]$
rpm -q samba samba-common samba-clientpackage samba is not installed package samba-common is not installed package samba-client is not installed上記のパッケージがインストールされていない場合は、root でyumユーティリティーを使用して、これらをインストールします。~]#
yum install package-name - root で
mkdirを使用して、Samba 経由でファイルを共有するための最上位の新規ディレクトリーを作成します。~]#
mkdir /myshare - root で
touchユーティリティーを使用して空のファイルを作成します。このファイルは後で Samba 共有が正しくマウントされたかを確認する際に使用します。~]#
touch /myshare/file1 - SELinux では、
/etc/samba/smb.confファイルおよび Linux パーミッションが適切に設定されていれば、Samba はsamba_share_tタイプのラベルが付いたファイルの読み取りおよび書き込みが可能になります。root で以下のコマンドを実行し、ファイルコンテキスト設定にラベルの変更を追加します。~]#
semanage fcontext -a -t samba_share_t "/myshare(/.*)?" - root で
restoreconユーティリティーを使用してラベル変更を適用します。~]#
restorecon -R -v /mysharerestorecon reset /myshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0 restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0 - root で
/etc/samba/smb.confファイルを編集します。Samba で/myshare/ディレクトリーを共有するために、以下をこのファイルの末尾に追加します。[myshare] comment = My share path = /myshare public = yes writable = no
- Samba ファイルシステムのマウントには Samba アカウントが必要になります。root で以下のコマンドを実行し、Samba アカウントを作成します。username は既存の Linux ユーザーにします。たとえば、
smbpasswd -a testuserを実行すると、Linux のtestuserユーザー用の Samba アカウントが作成されます。~]#
smbpasswd -a testuserNew SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.上記のコマンドを実行する際に、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'!エラーが発生します。 - Samba サービスを開始します。
~]#
systemctl start smb.service - 以下のコマンドを実行し、利用可能な共有を表示します。username はステップ 7 で追加した Samba アカウントにします。パスワード入力を求められたら、ステップ 7 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は使用しているバージョンによって異なります)。
~]$
smbclient -U username -L localhostEnter username's password: Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6] Sharename Type Comment --------- ---- ------- myshare Disk My share IPC$ IPC IPC Service (Samba Server Version 3.4.0-0.41.el6) username Disk Home Directories Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6] Server Comment --------- ------- Workgroup Master --------- ------- - root で
mkdirユーティリティーを使って新規ディレクトリーを作成します。このディレクトリーは Samba 共有のmyshareをマウントする際に使用します。~]#
mkdir /test/ - root で以下のコマンドを実行して、Samba 共有の
myshareを/test/にマウントします。username はステップ 7 のユーザー名にしてください。~]#
mount //localhost/myshare /test/ -o user=usernameステップ 7 で設定した username のパスワードを入力します。 - 以下のコマンドを実行して ステップ 3 で作成した
file1を表示します。~]$
ls /test/file1
14.4.2. web サイトを共有する
/var/www/html/ ディレクトリーで web サイトを共有したい場合などは、ファイルに samba_share_t タイプのラベルが付けられないことがあります。このような場合には、samba_export_all_ro ブール値を使用して読み取り専用パーミッションを付与して (現在のラベルに関係なく) すべてのファイルやディレクトリーを共有するか、samba_export_all_rw を使用して読み取りおよび書き込みパーミッションを付与して (現在のラベルに関係なく) すべてのファイルやディレクトリーを共有します。
/var/www/html/ 内に web サイトのファイルを作成してから、そのファイルに読み取りおよび書き込みパーミッションを与えて Samba で共有します。ここでは、httpd、samba、samba-common、samba-client、wget のパッケージがインストールされていることを前提としています。
- root ユーザーで
/var/www/html/file1.htmlファイルを作成します。以下のコンテンツをコピーしてこのファイルに貼り付けます。<html> <h2>File being shared through the Apache HTTP Server and Samba.</h2> </html>
- 以下のコマンドを実行して、
file1.htmlの SELinux コンテキストを表示します。~]$
ls -Z /var/www/html/file1.html-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1.htmlこのファイルにはhttpd_sys_content_tタイプのラベルが付けられています。デフォルトでは、Apache HTTP Server はこのタイプにアクセスできますが、Samba はアクセスできません。 - Apache HTTP Server を起動します。
~]#
systemctl start httpd.service - ユーザーでの書き込みアクセスがあるディレクトリーに切り替え、以下のコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは成功します。
~]$
wget http://localhost/file1.htmlResolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 84 [text/html] Saving to: `file1.html.1' 100%[=======================>] 84 --.-K/s in 0s `file1.html.1' saved [84/84] - root で
/etc/samba/smb.confファイルを編集します。Samba で/var/www/html/ディレクトリーを共有するために、以下をこのファイルの末尾に追加します。[website] comment = Sharing a website path = /var/www/html/ public = no writable = no
/var/www/html/ディレクトリーにはhttpd_sys_content_tタイプのラベルが付けられています。Samba はデフォルトでは、このタイプのラベルが付いたファイルやディレクトリーには、Linux パーミッションで許可されていてもアクセスできません。Samba のアクセスを許可するには、samba_export_all_roブール値を有効にします。~]#
setsebool -P samba_export_all_ro on再起動後に変更を維持したくない場合は、-Pを使用しないでください。samba_export_all_roブール値を有効にすると、Samba からいずれのタイプにもアクセスもできるようになることに注意してください。- Samba サービスを開始します。
~]#
systemctl start smb.service
第15章 ファイル転送プロトコル
vsftpd) は、高速で安定性があり、また重要な点として安全性を確保するため、土台から設計されています。多数の接続を効率的かつ安全に処理できる能力があることから、vsftpd は Red Hat Enterprise Linux に同梱されている唯一のスタンドアロン FTP となります。
~]$ rpm -q vsftpd
package vsftpd is not installedyum ユーティリティーを使用してインストールします。
~]# yum install vsftpd15.1. タイプ
/var/ftp/ ディレクトリー内のファイルへの読み取りアクセスが与えられます。このディレクトリーには public_content_t タイプのラベルが付いているため、/etc/vsftpd/vsftpd.conf で書き込みアクセスが設定されていても、許可されるのは読み取り専用アクセスのみになります。public_content_t タイプには、Apache HTTP Server、Samba、NFS など他のサービスがアクセス可能です。
public_content_t- ユーザーが作成したファイルやディレクトリーを vsftpd 経由の読み取り専用で共有する場合に、
public_content_tタイプのラベルを付けます。このタイプのラベルが付いているファイルには、Apache HTTP Server、Samba、NFS など、他のサービスからもアクセスすることができます。public_content_tタイプのラベルが付いたファイルへの書き込みは、Linux パーミッションで書き込みが許可されていてもできません。書き込みアクセスが必要な場合は、public_content_rw_tタイプを使用してください。 public_content_rw_t- ユーザーが作成したファイルやディレクトリーを
vsftpd経由の読み取りおよび書き込みのパーミッションで共有する場合に、public_content_rw_tタイプのラベルを付けます。このタイプのラベルが付いているファイルには、Apache HTTP Server、Samba、NFS など、他のサービスからもアクセスすることができます。このタイプのラベルが付いたファイルに書き込みを行う場合は、まず最初に各サービスのブール値を有効にしておく必要がある点に注意してください。
15.2. ブール値
ftpd_anon_write- このブール値を無効にすると、
vsftpdはpublic_content_rw_tタイプのラベルが付いたファイルおよびディレクトリーへの書き込みが禁止されます。有効にすると、ユーザーが FTP 経由でファイルのアップロードをできるようになります。ファイルのアップロード先となるディレクトリーにはpublic_content_rw_tタイプのラベルを付け、Linux パーミッションも適切に設定しておく必要があります。 ftpd_full_access- このブール値を有効にすると、アクセス制御に Linux (DAC) のパーミッションのみが使用されるので、認証ユーザーはファイルに
public_content_tやpublic_content_rw_tのタイプのラベルが付いていなくてもファイルの読み取りおよび書き込みが可能になります。 ftpd_use_cifs- このブール値を有効にすると、
vsftpdがcifs_tタイプのラベルが付いたファイルやディレクトリーにアクセスできるようになります。したがって、このブール値を有効にすると、Samba を使ってマウントしたファイルシステムをvsftpdで共有することができるようになります。 ftpd_use_nfs- このブール値を有効にすると、
vsftpdがnfs_tタイプのラベルが付いたファイルやディレクトリーにアクセスできるようになります。したがって、このブール値を有効にすると、NFS でマウントしたファイルシステムをvsftpdで共有することができるようになります。 ftpd_connect_db- FTP デーモンによるデータベースへの接続開始を許可します。
httpd_enable_ftp_serverhttpdデーモンによる FTP ポートでのリッスンおよび FTP サーバーとしての動作を許可します。tftp_anon_write- このブール値を有効にすると、特別なアクセス制限がなく共通ファイル用に予約されている領域などのパブリックディレクトリーへの TFTP によるアクセスが許可されます。
重要
ftp_home_dir ブール値は提供されません。詳細については、『Red Hat Enterprise Linux 7.3 リリースノート』の「セキュリティー」を参照してください。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
第16章 ネットワークファイルシステム
~]$ rpm -q nfs-utils
package nfs-utils is not installedyum ユーティリティーを使用してインストールします。
~]# yum install nfs-utils16.1. NFS と SELinux
nfsd プロセスで、これには制限のない kernel_t ドメインタイプのラベルが付いています。SELinux ポリシーはデフォルトで、NFS によるファイル共有を許可します。また、クライアントとサーバー間での SELinux ラベルの受け渡しもサポートしており、これにより NFS ボリュームにアクセスする制限のあるドメインのセキュリティー制御が向上します。たとえば、NFS ボリューム上にホームディレクトリーを設定する際に、そのボリューム上の他のディレクトリーにはアクセスできず、このホームディレクトリーにのみアクセス可能な制限のあるドメインを指定することができます。同様に、Secure Virtualization といったアプリケーションが NFS ボリューム上で画像ファイルのラベルを設定できることで、仮想マシンの分離レベルが高まります。
16.2. タイプ
nfs_t タイプが使用されます。root ユーザーは、mount -context オプションを使用してこのデフォルトタイプを上書きすることができます。NFS で使用されるタイプは以下のとおりです。異なるタイプを使用することで、柔軟なアクセス設定ができます。
var_lib_nfs_t- このタイプは、
/var/lib/nfs/ディレクトリー内の既存ファイルおよびこのディレクトリーにコピーまたは新規作成されるファイルに使用されます。通常の操作では、このタイプを変更する必要はありません。加えられた変更をデフォルトの設定に復元する場合は、root ユーザーでrestorecon -R -v /var/lib/nfsコマンドを実行します。 nfsd_exec_t/usr/sbin/rpc.nfsdファイルには、nfsd_exec_tのラベルが付けられます。また、NFS 関連の実行可能なシステムファイルやライブラリにも、このタイプのラベルが付けられます。ユーザーはこのタイプをファイルにラベル付けしないでください。nfsd_exec_tはnfsd_tに切り替わります。
16.3. ブール値
ftpd_use_nfs- このブール値を有効にすると、
ftpdデーモンが NFS ボリュームにアクセスできるようになります。 cobbler_use_nfs- このブール値を有効にすると、
cobblerdデーモンが NFS ボリュームにアクセスできるようになります。 git_system_use_nfs- このブール値を有効にすると、Git システムデーモンが NFS ボリューム上のシステム共有リポジトリーを読み取ることができるようになります。
httpd_use_nfs- このブール値を有効にすると、
httpdが NFS ボリューム上に格納されたファイルにアクセスできるようになります。 samba_share_nfs- このブール値を有効にすると、
smbdデーモンが NFS ボリュームを共有できるようになります。無効にすると、smbdは Samba を使った NFS 共有へのフルアクセスが禁止されます。 sanlock_use_nfs- このブール値を有効にすると、
sanlockデーモンが NFS ボリュームを管理できるようになります。 sge_use_nfs- このブール値を有効にすると、
sgeスケジューラーが NFS ボリュームにアクセスできるようになります。 use_nfs_home_dirs- このブール値を有効にすると、NFS ホームディレクトリーのサポートが追加されます。
virt_use_nfs- このブール値を有効にすると、制限のある仮想ゲストが NFS ボリューム上のファイルを管理できるようになります。
xen_use_nfs- このブール値を有効にすると、
Xenが NFS ボリューム上のファイルを管理できるようになります。 git_cgi_use_nfs- このブール値を有効にすると、Git Common Gateway Interface (CGI) が NFS ボリュームにアクセスできるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
16.4. 設定例
16.4.1. SELinux ラベルが付いた NFS サポートを有効にする
注記
nfs-srv で行います。
- NFS サーバーが稼働している場合は、これを停止します。
[nfs-srv]#
systemctl stop nfsサーバーが停止したことを確認します。[nfs-srv]#
systemctl status nfsnfs-server.service - NFS Server Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled) Active: inactive (dead) /etc/sysconfig/nfsファイルを編集して、RPCNFSDARGSフラグを"-V 4.2"に設定します。# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8) RPCNFSDARGS="-V 4.2"
- サーバーを再起動して、稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。
[nfs-srv]#
systemctl start nfs[nfs-srv]#
systemctl status nfsnfs-server.service - NFS Server Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled) Active: active (exited) since Wed 2013-08-28 14:07:11 CEST; 4s ago - クライアント側で NFS サーバーをマウントします。
[nfs-client]#
mount -o v4.2 server:mntpoint localmountpoint - すべての SELinux ラベルがサーバーからクライアントに渡されました。
[nfs-srv]$
ls -Z file-rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file [nfs-client]$ls -Z file-rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file
注記
第17章 BIND (Berkeley Internet Name Domain)
named デーモンを使って名前解決サービスを実行します。BIND を使うと、ユーザーは数値アドレスではなく名前でコンピューターリソースやサービスを検索することができます。
~]$ rpm -q bind
package bind is not installedyum ユーティリティーを使用してインストールします。
~]# yum install bind17.1. BIND と SELinux
/var/named/slaves/、/var/named/dynamic/、/var/named/data/ ディレクトリーのデフォルトパーミッションでは、ゾーン転送およびダイナミック DNS 更新を使ってゾーンファイルの更新が許可されます。/var/named/ 内のファイルには named_zone_t タイプのラベルが付けられ、マスターゾーンファイルに使用されます。
/etc/named.conf ファイルでスレーブゾーンを /var/named/slaves/ に配置するよう設定します。以下に、スレーブ DNS サーバーの /etc/named.conf 内にあるドメインエントリーの例を示します。このスレーブ DNS サーバーは、/var/named/slaves/ 内に testdomain.com 用のゾーンファイルを格納します。
zone "testdomain.com" {
type slave;
masters { IP-address; };
file "/var/named/slaves/db.testdomain.com";
};named_zone_t のラベルが付けられている場合は、named_write_master_zones ブール値を有効にして、ゾーンファイル更新のためのゾーン転送とダイナミック DNS を許可する必要があります。また、親ディレクトリーのモードを変更して、named ユーザーまたはグループに読み取り、書き込み、実行のアクセスを許可する必要があります。
/var/named/ 内のゾーンファイルに named_cache_t タイプのラベルが付いている場合は、ファイルシステムの再ラベル付けや restorecon -R /var/ を実行するとそのタイプが named_zone_t に変更されます。
17.2. タイプ
named_zone_t- マスターゾーンファイルに使用されます。他のサービスは、このタイプのファイルを変更することはできません。
named_write_master_zonesのブール値が有効な場合にnamedデーモンのみがこのタイプのファイルを変更できます。 named_cache_t- このタイプのラベルが付いたファイルには、特にブール値の設定がなくてもデフォルトで
namedによる書き込みが可能です。/var/named/slaves/、/var/named/dynamic/、/var/named/data/のディレクトリー内にコピーまたは作成されるファイルには、named_cache_tタイプのラベルが自動的に付けられます。 named_var_run_t/var/run/bind/、/var/run/named/、/var/run/unbound/のディレクトリー内にコピーまたは作成されるファイルには、named_var_run_tタイプのラベルが自動的に付けられます。named_conf_t- BIND 関連の設定ファイル (通常
/etcディレクトリーに格納) には、named_conf_tタイプのラベルが自動的に付けられます。 named_exec_t- BIND 関連の実行可能ファイル (通常
/usr/sbin/ディレクトリーに格納) には、named_exec_tタイプのラベルが自動的に付けられます。 named_log_t- BIND 関連のログファイル (通常
/var/log/ディレクトリーに格納) には、named_log_tタイプのラベルが自動的に付けられます。 named_unit_file_t/usr/lib/systemd/system/ディレクトリー内にある実行可能な BIND 関連のファイルには、named_unit_file_tタイプのラベルが自動的に付けられます。
17.3. ブール値
named_write_master_zones- このブール値を無効にすると、
namedはnamed_zone_tタイプのラベルが付いたゾーンファイルやディレクトリーに書き込みができなくなります。このデーモンは通常、ゾーンファイルへの書き込みを必要としません。ただし、セカンダリーサーバーがゾーンファイルへの書き込みを必要とする場合などには、このブール値を有効にして書き込みを許可します。 named_tcp_bind_http_port- このブール値を有効にすると、BIND が Apache ポートをバインドできるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
17.4. 設定例
17.4.1. ダイナミック DNS
/var/named/dynamic/ ディレクトリーを使用します。このディレクトリーに作成またはコピーされるファイルは、named による書き込みを許可する Linux パーミッションを継承します。また、こうしたファイルには named_cache_t タイプのラベルが付けられるため、SELinux は named がこれらのファイルに書き込むことを許可します。
/var/named/dynamic/ 内のゾーンファイルに named_zone_t タイプのラベルが付けられている場合、動的 DNS 更新がマージされる前にまずジャーナルに書き込まれる必要があるため、一定期間この動的 DNS の更新に失敗することがあります。ジャーナルのマージ試行時にゾーンファイル にnamed_zone_t タイプのラベルが付けられていると、以下のようなエラーがログ記録されます。
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
restorecon ユーティリティーを使用します。
~]# restorecon -R -v /var/named/dynamic第18章 CVS (Concurrent Versioning System)
~]$ rpm -q cvs
package cvs is not installedyum ユーティリティーを使用してインストールします。
~]# yum install cvs18.1. CVS と SELinux
cvs デーモンは cvs_t タイプのラベルが付けられて実行されます。Red Hat Enterprise Linux ではデフォルトで、CVS が読み取りと書き込み可能なのは特定のディレクトリーに限られます。cvs_data_t のラベルが、cvs の読み取りと書き込みのアクセス領域を定義します。SELinux で CVS を使用する場合、クライアントが CVS データ用に予約されている領域に完全にアクセスできるようにするには、適切なラベルの割り当てが必須になります。
18.2. タイプ
cvs_data_t- このタイプは CVS リポジトリ内のデータに対して使用されます。CVS が完全にアクセスできるのはこのタイプのデータのみです。
cvs_exec_t- このタイプは
/usr/bin/cvsバイナリに対して使用されます。
18.3. ブール値
cvs_read_shadow- このブール値は、
cvsデーモンがユーザー認証用/etc/shadowファイルにアクセスできるようにします。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
18.4. 設定例
18.4.1. CVS のセットアップ
cvs-srv で IP アドレスが 192.168.1.1 の CVS サーバーと、ホスト名が cvs-client で IP アドレスが 192.168.1.100 のクライアントです。いずれのホストも同一サブネット上にあります (192.168.1.0/24)。これは一例に過ぎず、cvs と xinetd パッケージがインストールされていること、SELinux ターゲットポリシーを使用していること、SELinux は enforcing モードで実行していることを前提としています。
注記
cvs-srv で行います。
- この例では、cvs と xinetd のパッケージが必要になります。これらのパッケージがインストールされていることを確認します。
[cvs-srv]$
rpm -q cvs xinetdpackage cvs is not installed package xinetd is not installedこれらのパッケージがインストールされていない場合は、root でyumユーティリティーを使用してインストールします。[cvs-srv]#
yum install cvs xinetd - root で以下のコマンドを実行して、
CVSという名前のグループを作成します。[cvs-srv]#
groupadd CVSこれは、system-config-usersユーティリティーで行うこともできます。 cvsuserというユーザー名のユーザーを作成し、このユーザーを CVS グループのメンバーにします。system-config-usersを使用します。/etc/servicesファイルを編集して、以下のように CVS サーバーのエントリをコメント解除します。cvspserver 2401/tcp # CVS client/server operations cvspserver 2401/udp # CVS client/server operations
- CVS リポジトリーをファイルシステムの root 領域に作成します。SELinux を使用する場合、リポジトリーは root ファイルシステムに配置するのが最適です。こうすることで、他のサブディレクトリーに影響を与えることなく、再帰的なラベルを与えることができます。たとえば、root でリポジトリーを格納する
/cvs/ディレクトリーを作成します。[root@cvs-srv]#
mkdir /cvs - 誰でもアクセスできるように
/cvs/ディレクトリーにすべてのパーミッションを与えます。[root@cvs-srv]#
chmod -R 777 /cvs警告
これは説明を目的とした例に過ぎません。実稼働システムでは、ここで示すパーミッションを使用しないでください。 /etc/xinetd.d/cvsファイルを編集し、CVS セクションをコメント解除して/cvs/ディレクトリーを使用するよう設定します。以下のようになります。service cvspserver { disable = no port = 2401 socket_type = stream protocol = tcp wait = no user = root passenv = PATH server = /usr/bin/cvs env = HOME=/cvs server_args = -f --allow-root=/cvs pserver # bind = 127.0.0.1xinetdデーモンを起動します。[cvs-srv]#
systemctl start xinetd.servicesystem-config-firewallユーティリティーを使って、ポート 2401 上で TCP を使用した着信接続を許可するルールを追加します。- クライアント側では、
cvsuserユーザーとして以下のコマンドを実行します。[cvsuser@cvs-client]$
cvs -d /cvs init - これで CVS は設定されましたが、SELinux ではログインおよびファイルのアクセスが拒否されます。これを確認するため、
cvs-clientで$CVSROOT変数を設定し、リモートによるログインを試行します。以下のステップはcvs-clientで行ってください。[cvsuser@cvs-client]$
export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs[cvsuser@cvs-client]$ [cvsuser@cvs-client]$cvs loginLogging in to :pserver:cvsuser@192.168.1.1:2401/cvs CVS password: ******** cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot open /cvs/CVSROOT/config: Permission deniedSELinux がアクセスをブロックしました。SELinux でこのアクセスを許可するためには、以下のステップをcvs-srvで行ってください。 - root で
/cvs/ディレクトリーのコンテキストを変更し、cvs_data_tタイプを付与して、/cvs/内の既存のデータおよび新規のデータすべてに再帰的にラベル付けが行われるようにします。[root@cvs-srv]#
semanage fcontext -a -t cvs_data_t '/cvs(/.*)?'[root@cvs-srv]#restorecon -R -v /cvs - これで、クライアント
cvs-clientはログインして、このリポジトリ内のすべての CVS リソースにアクセスできるようになりました。[cvsuser@cvs-client]$
export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs[cvsuser@cvs-client]$ [cvsuser@cvs-client]$cvs loginLogging in to :pserver:cvsuser@192.168.1.1:2401/cvs CVS password: ******** [cvsuser@cvs-client]$
第19章 Squid キャッシングプロキシ
~]$ rpm -q squid
package squid is not installedyum ユーティリティーを使用してインストールします。
~]# yum install squid19.1. Squid キャッシングプロキシと SELinux
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、このコマンドはEnforcingを返します。- root ユーザーで以下のコマンドを実行し、
squidデーモンを起動します。~]#
systemctl start squid.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status squid.servicesquid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago - 以下のコマンドを実行して、
squidプロセスを表示します。~]$
ps -eZ | grep squidsystem_u:system_r:squid_t:s0 27018 ? 00:00:00 squid system_u:system_r:squid_t:s0 27020 ? 00:00:00 log_file_daemonsquidプロセスに関連する SELinux コンテキストはsystem_u:system_r:squid_t:s0です。コンテキストの最後から 2 番目の部分、squid_tがタイプになります。タイプは、プロセスのドメインやファイルのタイプを定義します。この例の場合、squid プロセスはsquid_tドメイン内で実行しています。
squid_t などのように、制限のあるドメイン内で実行しているプロセスがファイルや他のプロセス、システム全般などとどのように対話するのかを定義します。squid がファイルにアクセス可能とするには、ファイルに適切なラベルを付ける必要があります。
/etc/squid/squid.conf ファイルを設定して、squid がデフォルトの TCP ポート 3128、3401、4827 以外のポートでリッスンするようにするには、semanage port コマンドを使って SELinux ポリシー設定にそのポート番号を追加する必要があります。以下では、SELinux ポリシー設定では最初に squid 用に定義されていなかったポートでリッスンするように設定したため、このサーバーの起動に失敗する例を示します。また、SELinux システムを設定し、ポリシーではまだ定義されていなかった非標準のポートでこのデーモンがリッスンできるようにする方法についても示します。ここでは、squid パッケージがインストールされていることを前提としています。各コマンドは root ユーザーで実行してください。
squidが実行中ではないことを確認します。~]#
systemctl status squid.servicesquid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: inactive (dead)出力が上記と異なる場合は、このプロセスを停止します。~]#
systemctl stop squid.service- 以下のコマンドを実行して、SELinux で
squidにリッスンを許可しているポートを表示します。~]#
semanage port -l | grep -w -i squid_port_tsquid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827 - root で
/etc/squid/squid.confを編集します。SELinux ポリシー設定ではsquid用に設定していないポートをリッスンするようhttp_portオプションを設定します。この例では、このデーモンがポート 10000 でリッスンするよう設定します。# Squid normally listens to port 3128 http_port 10000
setseboolコマンドを実行し、squid_connect_anyブール値をオフに設定します。これで、squidの動作は特定ポート上に限られることになります。~]#
setsebool -P squid_connect_any 0squidデーモンを起動します。~]#
systemctl start squid.serviceJob for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.以下のような SELinux 拒否メッセージがログ記録されます。localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
- SELinux で
squidがこの例で使用しているポート 10000 をリッスンできるようにするには、以下のコマンドが必要になります。~]#
semanage port -a -t squid_port_t -p tcp 10000 squidを再起動して、新規ポートをリッスンするようにします。~]#
systemctl start squid.service- これで、Squid が非標準ポート (この例では TCP 10000) でリッスンできるように SELinux を設定したので、このデーモンはこのポートで正常に起動するようになります。
19.2. タイプ
httpd_squid_script_exec_t- このタイプは、
cachemgr.cgiなどのユーティリティーに使用されます。Squid とその設定に関するさまざまな統計数字を提供します。 squid_cache_t- このタイプは、
/etc/squid/squid.conf内のcache_dirディレクティブで定義しているように、squid がキャッシュするデータに使用します。デフォルトでは、/var/cache/squid/および/var/spool/squid/ディレクトリーにコピーまたは作成されるファイルにはsquid_cache_tタイプのラベルが付けられます。また、/var/squidGuard/ディレクトリーにコピーまたは作成されるsquid用の squidGuard URL リダイレクトプラグインのファイルにもsquid_cache_tタイプのラベルが付けられます。Squid がキャッシュデータ用として使用できるのは、このラベルが付いたファイルやディレクトリーのみです。 squid_conf_t- このタイプは、Squid の設定に使用されるディレクトリーおよびファイルに対して使用されます。エラーメッセージやアイコンなどを含め、
/etc/squid/および/usr/share/squid/内に既存するファイルや、ここに作成またはコピーされるファイルにはこのタイプのラベルが付けられます。 squid_exec_t- このタイプは
squidバイナリの/usr/sbin/squidに使用されます。 squid_log_t- このタイプはログに使用されます。
/var/log/squid/または/var/log/squidGuard/内に既存するファイル、ここに作成またはコピーされるファイルにはこのタイプのラベルを付けなければなりません。 squid_initrc_exec_t- このタイプは、
squidの起動に必要となる初期設定ファイルに使用します。初期設定ファイルは/etc/rc.d/init.d/squidにあります。 squid_var_run_t- このタイプは
/var/run/ディレクトリー内のファイルに使用されます。特に、Squid の実行時に作成される/var/run/squid.pidという名前のプロセス ID (PID) にはこのタイプが付けられます。
19.3. ブール値
squid_connect_any- このブール値を有効にすると、Squid はどのポートでもリモートホストへの接続を開始できます。
squid_use_tproxy- このブール値を有効にすると、Squid は透過プロキシとして実行できます。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
19.4. 設定例
19.4.1. Squid の非標準ポートへの接続
- squid がインストールされていることを確認します。
~]$
rpm -q squidpackage squid is not installedこのパッケージがインストールされていない場合は、root でyumユーティリティーを使用してインストールします。~]#
yum install squid - メインの設定ファイル
/etc/squid/squid.confを編集し、cache_dirディレクティブが以下のようにコメント解除されていることを確認します。cache_dir ufs /var/spool/squid 100 16 256
この行では、この例で使用するcache_dirディレクティブのデフォルト設定を定義しています。Squid ストレージフォーマット (ufs)、キャッシュを配置するシステム上のディレクトリー (/var/spool/squid)、キャッシュに使用するメガバイト単位のディスク領域 (100)、作成される第一レベルのキャッシュディレクトリー数と第二レベルのキャッシュディレクトリー数 (それぞれ16と256) の設定情報で構成されています。 - 同じ設定ファイル内で、
http_access allow localnetディレクティブもコメント解除されていることを確認してください。これにより、Red Hat Enterprise Linux では Squid のデフォルトインストールで自動的に設定されるlocalnetACL からのトラフィックが許可されます。こうすることで、既存の RFC1918 ネットワーク上のクライアントマシンがプロキシ経由でアクセスできるようになります (この設定例では十分なものです)。 - 同じ設定ファイル内で
visible_hostnameディレクティブがコメント解除され、マシンのホスト名が設定されていることを確認してください。値はホストの完全修飾ドメイン名 (FQDN) にします。visible_hostname squid.example.com
- root で以下のコマンドを実行し、
squidデーモンを起動します。これがsquidの初回の起動なので、上記のcache_dirディレクティブで指定したキャッシュディレクトリーがこのコマンドで初期化され、デーモンが起動します。~]#
systemctl start squid.servicesquidが正常に起動したことを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status squid.servicesquid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: active (running) since Thu 2014-02-06 15:00:24 CET; 6s ago squidプロセス ID (PID) が制限のあるサービスとして起動されていることを確認します。この例ではsquid_var_run_tの値で確認します。~]#
ls -lZ /var/run/squid.pid-rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid- この時点で、前に設定していた
localnetACL に接続しているクライアントマシンは、そのプロキシとしてこのホストの内部インターフェースを使用できるようになります。これはシステム全体または一般的な Web ブラウザすべてのセッティングで設定することができます。これで Squid では目的のマシンのデフォルトポートでリッスンするようになりますが (TCP 3128)、目的のマシンで許可されるのは、一般的なポートからインターネット上の他のサービスへの発信接続のみになります。これが SELinux 自体で定義されているポリシーになります。SELinux では、次のステップで示すように非標準のポートへのアクセスは拒否されます。 - TCP ポート 10000 での web サイトのリスニングなど、クライアントが Squid プロキシを介して非標準のポートを使った要求を行うと、以下のような拒否がログ記録されます。
SELinux is preventing the squid daemon from connecting to network port 10000
- このアクセスを許可するには、デフォルトでは無効になっている
squid_connect_anyブール値を変更する必要があります。~]#
setsebool -P squid_connect_any on注記
再起動後にsetseboolによる変更を維持したくない場合は、-Pオプションを使用しないでください。 - Squid がクライアントの代わりにどのポートでも接続を開始できるようになったので、クライアントはインターネット上の非標準のポートにアクセスできるようになります。
第20章 MariaDB (MySQL の後継)
mysqld) と多くのクライアントプログラムおよびライブラリーで構成されています[21]。
~]$ rpm -q mariadb-server
package mariadb-server is not installedyum ユーティリティーを使用してインストールします。
~]# yum install mariadb-server20.1. MariaDB と SELinux
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。- root ユーザーで以下のコマンドを実行し、
mariadbを起動します。~]#
systemctl start mariadb.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status mariadb.servicemariadb.service - MariaDB database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled) Active: active (running) since Mon 2013-08-05 11:20:11 CEST; 3h 28min ago - 以下のコマンドを実行して、
mysqldプロセスを表示します。~]$
ps -eZ | grep mysqldsystem_u:system_r:mysqld_safe_t:s0 12831 ? 00:00:00 mysqld_safe system_u:system_r:mysqld_t:s0 13014 ? 00:00:00 mysqldmysqldプロセスに関連する SELinux コンテキストはsystem_u:system_r:mysqld_t:s0です。このコンテキストの最後から 2 番目の部分、mysqld_tがタイプになります。タイプは、プロセスのドメインやファイルのタイプを定義します。この例の場合、mysqldプロセスはmysqld_tドメイン内で実行しています。
20.2. タイプ
mysqld で使用されるタイプを以下に示します。タイプに応じて柔軟なアクセス設定ができます。
mysqld_db_t- このタイプは MariaDB データベースの場所に使用します。Red Hat Enterprise Linux では、データベースのデフォルトの場所は
/var/lib/mysql/ディレクトリーですが、これは変更可能です。MariaDB データベースの場所を変更する場合は、新しい場所にこのタイプのラベルを付ける必要があります。データベースのデフォルトの場所を変更し、新しいセクションに適切なラベルを付ける方法については、「MariaDB のデータベース格納場所を変更する」の例を参照してください。 mysqld_etc_t- このタイプは、MariaDB のメイン設定ファイル
/etc/my.cnfと、/etc/mysql/ディレクトリー内にある他の設定ファイルすべてに使用されます。 mysqld_exec_t- このタイプは
/usr/libexec/mysqldにあるmysqldバイナリに使用されます。Red Hat Enterprise Linux ではこれが MariaDB バイナリのデフォルトの場所になります。他のシステムでは、このバイナリは/usr/sbin/mysqldに配置されることがあります。この場合でも、このタイプのラベルを付けてください。 mysqld_unit_file_t- このタイプは、Red Hat Enterprise Linux ではデフォルトで
/usr/lib/systemd/system/ディレクトリーに配置されている MariaDB 関連の実行可能ファイルに使用されます。 mysqld_log_t- MariaDB のログが正常に動作するには、このタイプのラベルが付いていてる必要があります。
/var/log/内にあるログファイルで、mysql.*のワイルドカードに一致するログファイルはすべて、このタイプのラベルが付いている必要があります。 mysqld_var_run_t- このタイプは
/var/run/mariadb/内のファイルで、特にmysqldデーモンの実行時に作成される/var/run/mariadb/mariadb.pidという名前のプロセス ID (PID) に使用されます。また、/var/lib/mysql/mysql.sockなどの関連ソケットファイルにも使用されます。これらのファイルが制限のあるサービスとして正常に動作するには、適切なラベル付けが必要になります。
20.3. ブール値
selinuxuser_mysql_connect_enabled- このブール値を有効にすると、ユーザーがローカルの MariaDB に接続できるようになります。
exim_can_connect_db- このブール値を有効にすると、
eximメーラーがデータベースサーバーへの接続開始をできるようになります。 ftpd_connect_db- このブール値を有効にすると、
ftpデーモンがデータベースサーバーへの接続開始をできるようになります。 httpd_can_network_connect_db- このブール値を有効にすると、データベースサーバーとの通信に web サーバーが必要になります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
20.4. 設定例
20.4.1. MariaDB のデータベース格納場所を変更する
/var/lib/mysql/ になります。SELinux はこの場所にこのデータベースがデフォルトで配置されることを予期しているので、この領域にはすでに mysqld_db_t タイプを使った適切なラベル付けが行われています。
auditd サービスが実行されていること、有効なデータベースがデフォルトの場所である /var/lib/mysql/ にあることを前提としています。
mysqlのデフォルトのデータベース格納場所の SELinux コンテキストを表示します。~]#
ls -lZ /var/lib/mysqldrwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlデータベースファイルの格納場所にデフォルトで付けられるコンテキスト要素のmysqld_db_tが表示されています。この例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。- 以下のコマンドを実行し、
mysqldの root パスワードを入力して、利用可能なデータベースを表示します。~]#
mysqlshow -u root -pEnter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+ mysqldデーモンを停止します。~]#
systemctl stop mariadb.service- データベース格納場所となるディレクトリーを新規作成します。この例では
/mysql/を使用しています。~]#
mkdir -p /mysql - 古い場所にあるデータベースファイルを新しい場所にコピーします。
~]#
cp -R /var/lib/mysql/* /mysql/ - この場所の所有権を変更して、mysql ユーザーおよび mysql グループによるアクセスを許可します。これは従来の Unix パーミッションを設定するもので、SELinux はこれを順守します。
~]#
chown -R mysql:mysql /mysql - 以下のコマンドを実行して、新規ディレクトリーの初期のコンテキストを確認します。
~]#
ls -lZ /mysqldrwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql新規作成されたこのディレクトリーのコンテキストusr_tは現在、MariaDB データベースファイルの格納場所として SELinux に適したものではありません。コンテキストを変更すると、MariaDB がこの場所で正しく動作できるようになります。 - MariaDB のメインとなる設定ファイル
/etc/my.cnfをテキストエディターで開き、新しい格納場所を参照するようdatadirオプションを編集します。この例の場合、/mysqlの値を入力します。[mysqld] datadir=/mysql
このファイルを保存してから終了します。 mysqldを起動します。サービスは起動に失敗し、拒否メッセージが/var/log/messagesファイルにログ記録されるはずです。~]#
systemctl start mariadb.serviceJob for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.ただし、auditデーモンがsetroubleshootサービスとともに実行されている場合は、拒否メッセージは/var/log/audit/audit.logにログ記録されます。SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
この拒否の理由は、/mysql/に MariaDB のデータファイル用として適切なラベルが付けられていないためです。SELinux は、MariaDB がusr_tタイプのラベルが付いたコンテンツにアクセスすることを禁止しています。この問題を解決するには、以下の手順にしたがいます。- 以下のコマンドを実行し、
/mysql/のコンテキストマッピングを追加します。semanageユーティリティーはデフォルトではインストールされていないことに注意してください。インストールされていない場合は、policycoreutils-python パッケージをインストールします。~]#
semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?" - このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。~]#
grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local/mysql(/.*)? system_u:object_r:mysqld_db_t:s0 restoreconユーティリティーを使ってこのコンテキストマッピングを稼働中のシステムに適用します。~]#
restorecon -R -v /mysql- これで
/mysql/の場所に MariaDB 用の適切なコンテキストがラベル付けされたので、mysqldを起動できます。~]#
systemctl start mariadb.service /mysql/のコンテキストが変更されたことを確認します。~]$
ls -lZ /mysqldrwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql- データ格納場所が変更され、ラベルが適切に付けられたため、
mysqldデーモンが正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。
第21章 PostgreSQL
~]# rpm -q postgresql-serveryum ユーティリティーを使用してインストールします。
~]# yum install postgresql-server21.1. PostgreSQL と SELinux
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。- root ユーザーで以下のコマンドを実行し、
postgresqlを起動します。~]#
systemctl start postgresql.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl start postgresql.servicepostgresql.service - PostgreSQL database server Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled) Active: active (running) since Mon 2013-08-05 14:57:49 CEST; 12s - 以下のコマンドを実行して、
postgresqlプロセスを表示します。~]$
ps -eZ | grep postgressystem_u:system_r:postgresql_t:s0 395 ? 00:00:00 postmaster system_u:system_r:postgresql_t:s0 397 ? 00:00:00 postmaster system_u:system_r:postgresql_t:s0 399 ? 00:00:00 postmaster system_u:system_r:postgresql_t:s0 400 ? 00:00:00 postmaster system_u:system_r:postgresql_t:s0 401 ? 00:00:00 postmaster system_u:system_r:postgresql_t:s0 402 ? 00:00:00 postmasterpostgresqlプロセスに関連する SELinux コンテキストはsystem_u:system_r:postgresql_t:s0です。このコンテキストの最後から 2 番目の部分、postgresql_tがタイプになります。タイプは、プロセスのドメインやファイルのタイプを定義します。この例の場合、postgresqlプロセスはpostgresql_tドメイン内で実行しています。
21.2. タイプ
postgresql で使用されるタイプを以下に示します。タイプに応じて柔軟なアクセス設定ができます。以下のリストでは、潜在的な場所に合致させるために正規表現をいくつか使用していることに注意してください。
postgresql_db_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所は PostgreSQL のデータファイルに使用されます。
/usr/lib/pgsql/test/regres/usr/share/jonas/pgsql/var/lib/pgsql/data/var/lib/postgres(ql)?
postgresql_etc_t- このタイプは、
/etc/postgresql/ディレクトリー内の設定ファイルに使用されます。 postgresql_exec_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所は PostgreSQL のバイナリに使用されます。
/usr/bin/initdb(.sepgsql)?/usr/bin/(se)?postgres/usr/lib(64)?/postgresql/bin/.*/usr/lib(64)?/pgsql/test/regress/pg_regress
systemd_unit_file_t- このタイプは、
/usr/lib/systemd/system/ディレクトリー内の実行可能な PostgreSQL 関連ファイルに使用されます。 postgresql_log_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所はログファイルに使用されます。
/var/lib/pgsql/logfile/var/lib/pgsql/pgstartup.log/var/lib/sepgsql/pgstartup.log/var/log/postgresql/var/log/postgres.log.*/var/log/rhdb/rhdb/var/log/sepostgresql.log.*
postgresql_var_run_t- このタイプは、
/var/run/postgresql/ディレクトリー内のプロセス ID (PID) など、PostgreSQL のランタイムファイルに使用されます。
21.3. ブール値
selinuxuser_postgresql_connect_enabled- このブール値を有効にすると、どのユーザードメイン (PostgreSQL の定義) もデータサーバーへ接続できるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
21.4. 設定例
21.4.1. PostgreSQL のデータベース格納場所を変更する
/var/lib/pgsql/data/ になります。SELinux はこの場所にこのデータベースがデフォルトで配置されることを予期しているので、この領域にはすでに postgresql_db_t タイプを使った適切なラベル付けが行われています。
postgresqlのデフォルトのデータベース格納場所の SELinux コンテキストを表示します。~]#
ls -lZ /var/lib/pgsqldrwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 dataデータベースファイルの格納場所にデフォルトで付けられるコンテキスト要素であるpostgresql_db_tが表示されています。この例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。- データベース格納場所となるディレクトリーを新規作成します。この例では
/opt/postgresql/data/を使用します。別の場所を使用する場合は、以下のコマンドでその場所に置き換えます。~]#
mkdir -p /opt/postgresql/data - 新規作成したディレクトリーを表示します。このディレクトリーの初期コンテキストは
usr_tになっている点に注意してください。このコンテキストは、SELinux が PostgreSQL に保護メカニズムを提供するには不十分です。コンテキストを変更すると、新規作成のディレクトリーが新しい領域で適切に動作することができるようになります。~]#
ls -lZ /opt/postgresql/drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 data - postgres ユーザーおよび postgres グループによるアクセスを許可するため所有権を変更します。これは従来の Unix パーミッションを設定するのもので、SELinux はこれを順守します。
~]#
chown -R postgres:postgres /opt/postgresql - テキストエディターで PostgreSQL の初期設定ファイル
/etc/rc.d/init.d/postgresqlを開き、新しい場所をポイントするようPGDATAとPGLOG変数を変更します。~]#
vi /etc/rc.d/init.d/postgresqlPGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.logファイルを保存して、テキストエディターを終了します。 - 新しい場所にあるデータベースを初期化します。
~]$
su - postgres -c "initdb -D /opt/postgresql/data" - データベースの場所を変更したことで、この時点ではサービスの起動に失敗します。
~]#
systemctl start postgresql.serviceJob for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.サービスが起動しない原因は SELinux にあります。新しい場所に適切なラベル付けが行われていないためです。以下の手順で、新しい場所 (/opt/postgresql/) にラベルを付け、postgresql サービスを正常に起動させます。 semanageユーティリティーを使用して、/opt/postgresql/およびその配下にあるすべてのディレクトリーとファイルに対するコンテキストマッピングを追加します。~]#
semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"- このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。~]#
grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local/opt/postgresql(/.*)? system_u:object_r:postgresql_db_t:s0 restoreconユーティリティーを使ってこのコンテキストマッピングを稼働中のシステムに適用します。~]#
restorecon -R -v /opt/postgresql- これで
/opt/postgresql/の場所に PostgreSQL 用の正しいコンテキストがラベル付けされたので、postgresqlサービスが正常に起動するようになります。~]#
systemctl start postgresql.service /opt/postgresql/のコンテキストが正しくなっていることを確認します。~]$
ls -lZ /optdrwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresqlpsコマンドを使って、postgresqlプロセスで新しい場所が表示されるか確認します。~]#
ps aux | grep -i postmasterpostgres 21564 0.3 0.3 42308 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data/- データ格納場所が変更され、ラベル付けが適切に行われたため、
postgresqlが正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。
第22章 rsync
rsync ユーティリティーはファイル転送を迅速に実行し、システム間のデータ同期に使用されます[23]。
~]$ rpm -q rsync
package rsync is not installedyum ユーティリティーを使用してインストールします。
~]# yum install rsync22.1. rsync と SELinux
rsync デーモンを使ってファイルを共有する場合、ファイルやディレクトリーに public_content_t タイプのラベルを付ける必要があります。他の多くのサービスと同様に、SELinux が rsync に対して保護メカニズムを実行するには、適切なラベリングが必要になります[24]。
22.2. タイプ
rsync で使用されるタイプを以下に示します。タイプに応じて柔軟なアクセス設定ができます。
public_content_t- この汎用のタイプは、
rsyncを使用して共有するファイルの場所 (および実際のファイル) に使用します。rsyncを使って共有するファイルの格納用に特別なディレクトリーを作成する場合は、そのディレクトリーおよびそのコンテンツにはこのラベルを適用する必要があります。 rsync_exec_t- このタイプは、
/usr/bin/rsyncシステムバイナリに使用されます。 rsync_log_t- このタイプは、デフォルトで
/var/log/rsync.logにあるrsyncログファイルに使用されます。rsync がログを記録するファイルの場所を変更する場合は、ランタイム時にrsyncコマンドに--log-file=FILEオプションを使用します。 rsync_var_run_t- このタイプは、
/var/run/rsyncd.lockにあるrsyncdロックファイルに使用されます。このロックファイルはrsyncサーバーで接続関連の制限を管理する際に使用されます。 rsync_data_t- このタイプは、ファイルやディレクトリーを rsync ドメインとして使用し、他のサービスのアクセス範囲とは分離させたい場合に使用します。また、
public_content_tが汎用の SELinux コンテキストになり、ファイルやディレクトリーが複数のサービスと対話する際にこれを使用できます (例:rsync ドメインとしての FTP ディレクトリーおよび NFS ディレクトリー)。 rsync_etc_t- このタイプは、
/etcディレクトリー内にある rsync 関連のファイルに使用されます。
22.3. ブール値
rsync_anon_write- このブール値を有効にすると、
rsync_tドメイン内のrsyncがpublic_content_rw_tタイプのファイル、リンク、ディレクトリーなどを管理できるようになります。多くの場合、これらはパブリックファイル転送サービスに使用されるパブリックファイルになります。ファイルおよびディレクトリーには、このタイプのラベルを付ける必要があります。 rsync_client- このブール値を有効にすると、
rsync_port_tで定義されるポートにrsyncが接続を開始できるようになり、またrsync_data_tタイプのファイル、リンク、ディレクトリーの管理もできるようになります。SELinux がrsyncを管理できるようにするには、このデーモンはrsync_tドメイン内にある必要がある点に注意してください。本章では、rsync_tドメインで実行しているrsyncの設定例を示します。 rsync_export_all_ro- このブール値を有効にすると、
rsync_tドメイン内のrsyncが NFS および CIFS ボリュームをエクスポートできるようになります。クライアントに付与するアクセス権は読み取り専用になります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
22.4. 設定例
22.4.1. デーモンとして rsync を使用する
rsync デーモンによる正常な実行を許可するため SELinux を編集する方法について説明していきます。
手順22.1 rsync を rsync_t として起動する
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。whichコマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。~]$
which rsync/usr/bin/rsync- rsync をデーモンとして実行する場合、
/etc/rsyncd.confという名前を付けた設定ファイルを使用する必要があります。ここで使用している設定ファイルは非常に簡潔なファイルになっているため、利用できるオプションがすべて表示されているわけではありません。rsyncデーモンの事例として必要なものを表示しています。log file = /var/log/rsync.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock [files] path = /srv/rsync comment = file area read only = false timeout = 300 - これで、rsync がデーモンモードで動作する簡単な設定ファイルができたので、以下のコマンドでこれを起動することができます。
~]#
systemctl start rsyncd.servicersyncdが正常に起動したことを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status rsyncd.servicersyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled) Active: active (running) since Thu 2014-02-27 09:46:24 CET; 2s ago Main PID: 3220 (rsync) CGroup: /system.slice/rsyncd.service └─3220 /usr/bin/rsync --daemon --no-detachrsync がrsync_tドメイン内で実行するようになったため、SELinux はその保護メカニズムをrsyncデーモンに適用できます。~]$
ps -eZ | grep rsyncsystem_u:system_r:rsync_t:s0 3220 ? 00:00:00 rsync
rsyncd を rsync_t ドメイン内で実行する方法について説明しました。rsync は、ソケットでアクティベートされたサービスとして実行することも可能です。この場合、rsyncd は、クライアントがサービスに接続を試みるまで実行されません。ソケットでアクティベートされたサービスとして rsyncd を実行可能とするには、上記のステップに従います。ソケットでアクティベートされたサービスとして rsyncd を開始するには、root で以下のコマンドを実行します。
~]# systemctl start rsyncd.socket手順22.2 デフォルト以外のポートで rsync デーモンを実行する
/etc/rsyncd.confファイルを変更して、port = 10000の行をファイルの冒頭にあるグローバル設定エリア内に追加します (つまり、file エリアが定義される前)。新しい設定ファイルは以下のようになります。log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock port = 10000 [files] path = /srv/rsync comment = file area read only = false timeout = 300- この新規設定で
rsyncデーモンを起動すると、SELinux は以下のような拒否メッセージをログ記録します。Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages, run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8
semanageユーティリティーを使用して TCP ポート 10000 をrsync_port_tの SELinux ポリシーに追加します。~]#
semanage port -a -t rsync_port_t -p tcp 10000- TCP ポート 10000 が
rsync_port_tの SELinux ポリシーに追加されたので、rsyncdがこのポートで正常に起動し、動作するようになります。~]#
systemctl start rsyncd.service~]#
netstat -lnp | grep 10000tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsync
rsyncd による TCP ポート 10000 での動作が許可されるようになりました。
第23章 Postfix
~]$ rpm -q postfix
package postfix is not installedyum ユーティリティーを使用してインストールします。
~]# yum install postfix23.1. Postfix と SELinux
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。- root ユーザーで以下のコマンドを実行し、
postfixを起動します。~]#
systemctl start postfix.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status postfix.servicepostfix.service - Postfix Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled) Active: active (running) since Mon 2013-08-05 11:38:48 CEST; 3h 25min ago - 以下のコマンドを実行して、
postfixプロセスを表示します。~]$
ps -eZ | grep postfixsystem_u:system_r:postfix_master_t:s0 1651 ? 00:00:00 master system_u:system_r:postfix_pickup_t:s0 1662 ? 00:00:00 pickup system_u:system_r:postfix_qmgr_t:s0 1663 ? 00:00:00 qmgr上記の出力では、Postfixmasterプロセスに関連する SELinux コンテキストはsystem_u:system_r:postfix_master_t:s0です。コンテキストの最後から 2 番目の部分、postfix_master_tがこのプロセスのタイプになります。タイプは、プロセスのドメインやファイルのタイプを定義します。この例の場合、masterプロセスはpostfix_master_tドメイン内で実行しています。
23.2. タイプ
postfix_etc_t- このタイプは、
/etc/postfix/ディレクトリー内の設定ファイルの Postfix に使用されます。 postfix_data_t- このタイプは、
/var/lib/postfix/ディレクトリー内にある Postfix データファイルに使用されます。 postfix_var_run_t- このタイプは、
/run/ディレクトリー内の Postfix ファイルに使用されます。 postfix_initrc_exec_t- Postfix 実行可能ファイルには、
postfix_initrc_exec_tタイプのラベルが付けられます。これらのファイルは実行されると、postfix_initrc_tドメインに移行します。 postfix_spool_t- このタイプは、
/var/spool/ディレクトリー内の Postfix ファイルに使用されます。
注記
~]$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts23.3. ブール値
postfix_local_write_mail_spool- このブール値を有効にすると、Postfix がシステム上のローカルメールスプールに書き込みできるようになります。ローカルスプールを使用する際、Postfix を正常に動作させるためにはこのブール値を有効にする必要があります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
23.4. 設定例
23.4.1. SpamAssassin と Postfix
~]$ rpm -q spamassassin
package spamassassin is not installedyum ユーティリティーを使用してインストールします。
~]# yum install spamassassin手順23.1 デフォルト以外のポートで SpamAssassin を実行する
- root で
semanageユーティリティーを使用し、SELinux がデフォルトでspamdデーモンにリッスンすることを許可するポートを表示します。~]#
semanage port -l | grep spamdspamd_port_t tcp 783上記の出力では、SpamAssassin が動作するポートとして TCP/783 がspamd_port_tで定義されていることを示しています。 /etc/sysconfig/spamassassin設定ファイルを編集し、SpamAssassin が TCP/10000 で起動するよう変更します。# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"
上記の行では、SpamAssassin がポート 10000 で動作するよう指定しています。ここからは、このソケットを開くよう SELinux ポリシーを変更する方法を見ていきます。- SpamAssassin を起動すると、次のようなエラーメッセージが表示されます。
~]#
systemctl start spamassassin.serviceJob for spamassassin.service failed. See 'systemctl status spamassassin.service' and 'journalctl -xn' for details.上記の出力は、このポートへのアクセスが SELinux によってブロックされたことを表しています。 - 以下のような SELinux 拒否メッセージがログ記録されます。
SELinux is preventing the spamd (spamd_t) from binding to port 10000.
- root で
semanageを実行し、SpamAssassin がサンプルポート (TCP/10000) で動作できるように SELinux ポリシーを変更します。~]#
semanage port -a -t spamd_port_t -p tcp 10000 - SpamAssassin が起動し、TCP ポート 10000 で動作していることを確認します。
~]#
systemctl start spamassassin.service~]#netstat -lnp | grep 10000tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 2224/spamd.pid - SELinux ポリシーで
spamdによる TCP ポート 10000 へのアクセスが許可されたため、SpamAssassin がこのポートで正常に動作するようになりました。
第24章 DHCP
dhcpd デーモンは、クライアントに第 3 層 TCP/IP を動的に提供し、詳細を設定するために Red Hat Enterprise Linux で使用されます。
dhcpd デーモンを提供します。以下のコマンドを実行して、dhcp パッケージがインストールされているか確認します。
~]# rpm -q dhcp
package dhcp is not installedyum ユーティリティーを使用してインストールします。
~]# yum install dhcp24.1. DHCP と SELinux
dhcpd を有効にすると、デフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそれ自体のドメイン内で実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側がリソースにアクセスして加えることができる被害は限定されます。以下に、dhcpd 自体のドメイン内で実行している dhcpd と関連プロセスの例を示します。ここでは dhcp パッケージがインストールされていること、また dhcpd サービスが起動していることを前提としています。
getenforceコマンドを実行して、SELinux が enforcing モードで実行していることを確認します。~]$
getenforceEnforcingSELinux が enforcing モードで実行している場合は、Enforcingが返されます。- root ユーザーで以下のコマンドを実行し、
dhcpdを起動します。~]#
systemctl start dhcpd.serviceサービスが稼働していることを確認します。出力は以下のようになり、タイムスタンプのみが異なります。~]#
systemctl status dhcpd.servicedhcpd.service - DHCPv4 Server Daemon Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled) Active: active (running) since Mon 2013-08-05 11:49:07 CEST; 3h 20min ago - 以下のコマンドを実行して、
dhcpdプロセスを表示します。~]$
ps -eZ | grep dhcpdsystem_u:system_r:dhcpd_t:s0 5483 ? 00:00:00 dhcpddhcpd プロセスに関連する SELinux コンテキストはsystem_u:system_r:dhcpd_t:s0です。
24.2. タイプ
dhcp_etc_t- このタイプは主に、
/etcディレクトリーにあるファイルに使用されます。これには設定ファイルが含まれます。 dhcpd_var_run_t- このタイプは、
/var/run/ディレクトリー内のdhcpdの PID ファイルに使用されます dhcpd_exec_t- このタイプは、DHCP 実行可能ファイルの
dhcpd_tドメインへの移行に使用されます。 dhcpd_initrc_exec_t- このタイプは、DHCP 実行可能ファイルの
dhcpd_initrc_tドメインへの移行に使用されます。
注記
dhcpd 用のファイルおよびタイプの全一覧を表示するには、以下のコマンドを実行します。
~]$ grep dhcp /etc/selinux/targeted/contexts/files/file_contexts第25章 OpenShift by Red Hat
~]$rpm -q rhcpackage rhc is not installed
25.1. OpenShift と SELinux
25.2. タイプ
プロセスタイプ
openshift_t- OpenShift のプロセスは、
openshift_tの SELinux タイプに関連付けられます。
実行可能ファイルにおけるタイプ
openshift_cgroup_read_exec_t- このタイプが付けられたファイルの場合、SELinux は実行可能ファイルが
openshift_cgroup_read_tドメインに移行することを許可します。 openshift_cron_exec_t- このタイプが付けられたファイルの場合、SELinux は実行可能ファイルが
openshift_cron_tドメインに移行することを許可します。 openshift_initrc_exec_t- このタイプが付けられたファイルの場合、SELinux は実行可能ファイルが
openshift_initrc_tドメインに移行することを許可します。
書き込み可能なタイプ
openshift_cgroup_read_tmp_t- このタイプでは、OpenShift コントロールグループ (cgroup) は
/tmpディレクトリー内の一時ファイルの読み取りおよびアクセスが可能です。 openshift_cron_tmp_t- このタイプでは、OpenShift cron ジョブの一時ファイルを
/tmpに保存することができます。 openshift_initrc_tmp_t- このタイプでは、OpenShift
initrcの一時ファイルを/tmpに保存することができます。 openshift_log_t- このタイプが付けられたファイルは通常、OpenShift ログデータとして扱われ、
/var/log/ディレクトリーに保存されます。 openshift_rw_file_t- OpenShift はこのタイプのラベルが付いたファイルに読み取りおよび書き込みパーミッションがあります。
openshift_tmp_t- このタイプは、OpenShift 一時ファイルの
/tmpでの保存に使われます。 openshift_tmpfs_t- このタイプでは、OpenShift データを tmpfs ファイルシステムに保存できます。
openshift_var_lib_t- このタイプでは、OpenShift ファイルを
/var/lib/ディレクトリーに保存できます。 openshift_var_run_t- このタイプでは、OpenShift ファイルを
/run/または/var/run/ディレクトリーに保存できます。
25.3. ブール値
openshift_use_nfs- このブール値を有効にすると、OpenShift を NFS 共有にインストールできるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
25.4. 設定例
25.4.1. デフォルト OpenShift ディレクトリーの変更
/var/lib/openshift/ ディレクトリーに保存します。このディレクトリーには、openshift_var_lib_t の SELinux タイプのラベルが付けられています。OpenShift が別のディレクトリーにデータを保存できるようにするには、新たなディレクトリーに適切な SELinux コンテキストのラベルを付けます。
/srv/openshift/ に変更する方法を示します。
手順25.1 データ保存用のデフォルト OpenShift ディレクトリーの変更
- root で
/srvディレクトリー内に新規のopenshift/ディレクトリーを作成します。このディレクトリーにはvar_tタイプのラベルが付けられます。~]#mkdir /srv/openshift~]$ls -Zd /srv/openshiftdrwxr-xr-x. root root unconfined_u:object_r:var_t:s0 openshift/ - root で
semanageユーティリティーを使って、/srv/openshift/に適切な SELinux コンテキストをマッピングします。~]#semanage fcontext -a -e /var/lib/openshift /srv/openshift - root で
restoreconユーティリティーを使用してラベル変更を適用します。~]#restorecon -R -v /srv/openshift - これで
/srv/openshift/ディレクトリーに適切なopenshift_var_lib_tタイプのラベルが付けられました。~]$ls -Zd /srv/openshiftdrwxr-xr-x. root root unconfined_u:object_r:openshift_var_lib_t:s0 openshift/
第26章 ID 管理
~]$ rpm -q ipa-server
package ipa-server is not installed
このパッケージがインストールされていない場合は、root ユーザーで以下のコマンドを実行してインストールします。
~]# yum install ipa-server
26.1. ID 管理と SELinux
SSSD) は特定の IdM ユーザー向けに定義されたアクセス権をクエリします。すると pam_selinux モジュールがカーネルに要求を送信し、guest_u:guest_r:guest_t:s0 のような IdM アクセス権にしたがった適切な SELinux コンテキストでユーザープロセスを開始します。
26.1.1. アクティブディレクトリードメインへの信頼
WinSync ユーティリティーを使って IdM ドメインで保存されているデータへのアクセスを許可していました。これを行うために、WinSync は AD サーバーからローカルサーバーにユーザーおよびグループのデータを複製し、このデータを同期させておく必要がありました。
SSSD デーモンと AD の連携が強化され、ユーザーが IdM と AD ドメイン間の信頼できる関係を作成できるようになりました。ユーザーおよびグループデータは、AD サーバーから直接読み込まれます。さらに、AD および IdM ドメイン間でシングルサインオン (SSO) 認証を可能にする Kerberos レルム間の信頼が提供されています。SSO が設定されていれば、AD ドメインからのユーザーはパスワードなしで、IdM ドメインに保存されている Kerberos 保護のデータにアクセスできます。
26.2. 設定例
26.2.1. SELinux ユーザーを IdM ユーザーにマッピングする
手順26.1 ユーザーを SELinuxマッピングに追加する
- 新規 SELinux マッピングを作成するには、以下のコマンドを実行します。ここでの
SELinux_mappingは新規の SELinux マッピング名になり、--selinuxuserオプションでは特定の SELinux ユーザーを指定します。~]$
ipa selinuxusermap-add SELinux_mapping --selinuxuser=staff_u:s0-s0:c0.c1023 - 以下のコマンドを実行して、ユーザー名
tuserの IdM ユーザーを SELinux マッピングに追加します。~]$
ipa selinuxusermap-add-user --users=tuser SELinux_mapping ipaclient.example.comという名前の新規ホストを SELinux マッピングに追加するには、以下のコマンドを実行します。~]$
ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mappingtuserユーザーがホスト ipaclient.example.com にログインすると、staff_u:s0-s0:c0.c1023というラベルが付けられます。[tuser@ipa-client]$
id -Zstaff_u:staff_r:staff_t:s0-s0:c0.c1023
第27章 Red Hat Gluster Storage
27.1. Red Hat Gluster Storage と SELinux
glusterd (GlusterFS Management Service) および glusterfsd (NFS server) のプロセスに対して柔軟な強制アクセス制御 (MAC) が提供されることで、新たなセキュリティー層が加えられます。これらのプロセスには、glusterd_t SELinux タイプとはバインドされていない高度なプロセス分離があります。
27.2. タイプ
プロセスタイプ
glusterd_t- Gluster プロセスは
glusterd_tSELinux タイプに関連付けられます。
実行可能ファイルのタイプ
glusterd_initrc_exec_t- Gluster init スクリプトファイル向けの SELinux 固有のスクリプトタイプコンテキスト。
glusterd_exec_t- Gluster 実行可能ファイル向けの SELinux 固有の実行可能タイプコンテキスト。
ポートのタイプ
gluster_port_t- このタイプは
glusterd向け に定義されています。デフォルトでは、glusterdは 204007-24027、および 38465-38469 の TCP ポートを使用します。
ファイルコンテキスト
glusterd_brick_t- このタイプは、
glusterdブリックデータとしてスレッド化されるファイルに使用します。 glusterd_conf_t- このタイプは、通常
/etc/ディレクトリー内に保存されるglusterd設定データと関連付けられます。 glusterd_log_t- このタイプが付けられたファイルは
glusterdログデータとして扱われ、通常/var/log/ディレクトリーに保存されます。 glusterd_tmp_t- このタイプは、
glusterd一時ファイルの/tmpでの保存に使われます。 glusterd_var_lib_t- このタイプは、
glusterdファイルの/var/lib/ディレクトリーでの保存を可能にします。 glusterd_var_run_t- このタイプは、
glusterdファイルの/run/または/var/run/ディレクトリーでの保存を可能にします。
27.3. ブール値
gluster_export_all_ro- このブール値を有効にすると、
glusterfsdがファイルおよびディレクトリーを読み取り専用で共有することが可能になります。 gluster_export_all_rw- このブール値を有効にすると、
glusterfsdがファイルおよびディレクトリーを読み取りおよび書き込みアクセスで共有することが可能になります。このブール値はデフォルトで有効になります。 gluster_anon_write- このブール値を有効にすると、
glusterfsdがpublic_content_rw_tSELinux タイプのラベルが付いた公開ファイルを編集できるようになります。
注記
~]$ getsebool -a | grep service_name
特定のブール値の記述を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが追加で必要になることに留意してください。
27.4. 設定例
27.4.1. Gluster ブリックのラベル付け
glusterd_brick_t でラベル付けされていない場合は、SELinux は特定のファイルアクセス操作を拒否し、各種の AVC メッセージを生成します。
/dev/rhgs/gluster という論理ボリュームを作成、フォーマット済みであることを前提としています。
手順27.1 Gluster ブリックのラベル付け
- フォーマット済みの論理ボリュームをマウントするディレクトリーを作成します。例を示します。
~]#
mkdir /mnt/brick1 - 論理ボリューム (この例では
/dev/vg-group/gluster) を 上記で作成した/mnt/brick1/ディレクトリーにマウントします。~]#
mount /dev/vg-group/gluster /mnt/brick1/mountコマンドはデバイスを一時的にしかマウントしないことに注意してください。デバイスを永続的にマウントするには、下記のようなエントリーを/etc/fstabファイルに追加します。/dev/vg-group/gluster /mnt/brick1 xfs rw,inode64,noatime,nouuid 1 2
詳細情報は、fstab(5) man ページを参照してください。 /mnt/brick1/の SELinux コンテキストを確認します。~]$
ls -lZd /mnt/brick1/drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mnt/brick1/ディレクトリーにはunlabeled_tSELinux タイプがラベル付けされています。/mnt/brick1/の SELinux タイプをglusterd_brick_tSELinux タイプに変更します。~]#
semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"restoreconユーティリティーを使用して変更を適用します。~]#
restorecon -Rv /mnt/brick1- 最後に、コンテキストが正常に変更されたことを確認します。
~]$
ls -lZd /mnt/brick1drwxr-xr-x. root root system_u:object_r:glusterd_brick_t:s0 /mnt/brick1/
第28章 参考文献
書籍
- SELinux by Example
- Mayer、MacMillan、Caplan 著2007年、Prentice Hall 出版
- SELinux: NSA's Open Source Security Enhanced Linux
- Bill McCarty 著2004年、O'Reilly Media Inc. 出版
チュートリアルとヘルプ
- Russell Coker 氏によるチュートリアルとトーク
- Dan Walsh 氏のジャーナル
- Red Hat ナレッジベース
全般情報
- NSA SELinux メイン web サイト
- NSA SELinux FAQ
メーリングリスト
- NSA SELinux メーリングリスト
- Fedora SELinux メーリングリスト
コミュニティ
- SELinux プロジェクト Wiki
- SELinux コミュニティページ
- IRC
- irc.freenode.net, #selinux
付録A 改訂履歴
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 0.3-02.2 | Thu Mar 1 2018 | ||
| |||
| 改訂 0.3-02.1 | Sun Sep 24 2017 | ||
| |||
| 改訂 0.3-02 | Thu Jul 13 2017 | ||
| |||
| 改訂 0.2-18 | Wed Nov 2 2016 | ||
| |||
| 改訂 0.2-11 | Sun Jun 26 2016 | ||
| |||
| 改訂 0.2-10 | Sun Feb 14 2016 | ||
| |||
| 改訂 0.2-9 | Thu Dec 10 2015 | ||
| |||
| 改訂 0.2-8 | Thu Nov 11 2015 | ||
| |||
| 改訂 0.2-7 | Thu Aug 13 2015 | ||
| |||
| 改訂 0.2-6 | Wed Feb 18 2015 | ||
| |||
| 改訂 0.2-5 | Fri Dec 05 2014 | ||
| |||
| 改訂 0.2-4 | Thu Dec 04 2014 | ||
| |||
| 改訂 0.1-41 | Tue May 20 2014 | ||
| |||
| 改訂 0.1-1 | Tue Jan 17 2013 | ||
| |||
