Menu Close
Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
SELinux ユーザーおよび管理者のガイド
SELinux (Security-Enhanced Linux) の基本設定および高度な設定
概要
パート I. SELinux
第1章 はじめに
_t で終わります
。たとえば、Web サーバーのタイプ名は httpd_t
です。/var/www/html/
にあるファイルおよびディレクトリーのタイプコンテキストは、通常 httpd_sys_content_t
です。/tmp
および /var/tmp/
にあるファイルおよびディレクトリーに対するタイプコンテクストは、通常 tmp_t
です。Web サーバーポートのタイプコンテキストは http_port_t
です。
httpd_t
として実行する Web サーバープロセス)が、通常 /var/www/html/
にあるコンテキストを持つファイルおよびディレクトリー(httpd_sys_content_t
)へのアクセスを許可するポリシールールがあります。通常、/tmp
および /var/tmp/
に含まれるファイルのポリシーには、許可ルールがないため、アクセスは許可されません。SELinux を使用すれば、Apache が危険にさらされ、悪意のあるスクリプトがアクセスを得た場合でも、/tmp
ディレクトリーにアクセスすることはできなくなります。
図1.1 SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスするのを許可し、httpd_t と mysqld_db_t タイプコンテキストに許可ルールがないため、同じプロセスが /data/mysql/ ディレクトリーにアクセスするのを拒否します。一方、mysqld_t として実行している MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスできます。また、SELinux は、mysqld_t タイプのプロセスが正しく拒否され、httpd_sys_content_t とラベルが付いた /var/www/html/ ディレクトリーにアクセスするのは拒否されます。

[D]
関連情報
- apropos selinux コマンドで表示される man ページの
selinux(8)
- selinux-policy-doc パッケージをインストールしている場合は、man -k _selinux コマンドで表示された man ページ。詳細は、「サービスの man ページ」 を参照してください。
1.1. SELinux を実行する利点
- プロセスとファイルにはすべてラベルが付いています。SELinux ポリシーにより、プロセスがファイルと相互作用する方法と、プロセスが互いに相互作用する方法が定義されます。アクセスは、それを特別に許可する SELinux ポリシールールが存在する場合に限り許可されます。
- アクセス制御がより詳細に設定できるようになりました。SELinux のアクセスは、ユーザーの裁量と、Linux のユーザー ID およびグループ ID に基づいて制御される従来の UNIX アクセス権だけでなく、SELinux のユーザー、ロール、タイプなど (必要に応じてセキュリティーレベルも) の、入手可能なすべての情報に基づいて決定されます。
- SELinux ポリシーは管理者が定義し、システム全体に適用されます。
- 権限昇格攻撃に対する軽減策が向上しました。プロセスはドメインで実行するため、互いに分離しています。SELinux ポリシールールは、プロセスがどのようにファイルやその他のプロセスにアクセスするかを定義します。プロセスへのアクセスが不正に行われても、攻撃者は、そのプロセスの通常の機能と、そのプロセスがアクセスするように設定されているファイルにしかアクセスできません。たとえば、Apache HTTP Server へのアクセスが不正に行われても、そのアクセスを許可する特別な SELinux ポリシールールが追加されたり、設定された場合を除き、ユーザーのホームディレクトリーにあるファイルを読み込むプロセスを攻撃者が利用することはできません。
- SELinux は、データの機密性と完全性、並びに信頼されていない入力からの保護プロセスを強化するのに使用できます。
- ウイルス対策ソフトウェア
- パスワード、ファイアウォールなどのセキュリティーシステムの代替
- 一体型のセキュリティーソリューション
1.2. 例
- デフォルトのアクションは「拒否」です。アクセスを許可する SELinux のポリシールール (ファイルを開くプロセスなど) が存在しない場合は、アクセスが拒否されます。
- SELinux は、Linux ユーザーに制限をかけられます。SELinux ポリシーには、制限がかけられた SELinux ユーザーが多数含まれます。Linux ユーザーを、制限がかけられた SELinux ユーザーにマッピングして、SELinux ユーザーに適用されているセキュリティールールおよびメカニズムを利用できます。たとえば、Linux ユーザーを SELinux の
user_u
ユーザーにマッピングすると、Linux ユーザーは(設定されていない場合) sudo や su などのユーザー ID(setuid)アプリケーションを実行できません。詳細は、「制限のあるユーザーおよび制限のないユーザー」 を参照してください。 - プロセスとデータの分離が向上します。プロセスは、独自のドメインで実行され、他のプロセスで使用されるファイルにアクセスしないようにするだけでなく、プロセスが他のプロセスにアクセスできなくなります。たとえば、SELinux を実行している場合に、(許可が設定されていない限り) 攻撃者は Samba サーバーを危険にさらすことはできず、その Samba サーバーを攻撃ベクトルとして使用して、その他のプロセス (MariaDB など) が使用するファイルの読み書きを行うことはできません。
- SELinux は、設定ミスによるダメージを軽減します。Domain Name System (DNS) サーバーはゾーン転送として知られている機能で、互いに頻繁に情報を複製します。攻撃者は、ゾーン転送を使用して、虚偽の情報で DNS サーバーを更新できます。Red Hat Enterprise Linux で Berkeley Internet Name Domain(BIND)を DNS サーバーとして実行すると、ゾーン転送を実行できるサーバーを管理者が制限しても、デフォルトの SELinux ポリシーによりゾーンファイルが阻止されます。 [1] BIND
named
デーモン自体、およびその他のプロセスにより、ゾーン転送を使用して更新済みです。 - NetworkWorld.com のアーティクル「 A seatbelt for server software」を参照してください。SELinux は、実際の不正使用をブロックします。[2]SELinux に関する背景情報、および SELinux が阻止したさまざまなエクスプロイトに関する情報は、を参照してください。
1.3. SELinux Architecture
1.4. SELinux のステータスおよびモード
~]# getenforce
Enforcing
~]# setenforce 0 ~]# getenforce Permissive
~]# setenforce 1 ~]# getenforce Enforcing
httpd_t
ドメインを Permissive に設定するには、以下のコマンドを実行します。
~]# semanage permissive -a httpd_t
1.5. 関連情報
第2章 SELinux Contexts
~]$
ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
- SELinux user
- SELinux ユーザー ID は、特定のロールセットに承認されたポリシーと、特定の MLS/MCS 範囲に対して認識される ID です。各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーに置かれた制限を継承できます。マップされた SELinux ユーザー ID は、そのセッションのプロセスに対して SELinux コンテキストで使用されます。これは、どのロールとレベルを定義するためです。root で以下のコマンドを実行して、SELinux と Linux ユーザーアカウント間のマッピングの一覧を表示します( policycoreutils-python パッケージがインストールされている必要があります)。
~]#
semanage login -l Login 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 ユーザーが一覧表示されます。 SELinux User
列には、Linux ユーザーがマッピングされる SELinux ユーザーが一覧表示されます。プロセスの場合、SELinux ユーザーはどのロールおよびレベルにアクセスできるかを制限します。MLS/MCS Range
列は、Multi-Level Security(MLS)および Multi-Category Security(MCS)で使用されるレベルです。Service
列は、Linux ユーザーがシステムにログインする必要のある正しい SELinux コンテキストを決定します。デフォルトでは、アスタリスク(*
)記号が使用されます。これは、すべてのサービスを表します。
- role
- SELinux の一部は、RBAC(Role-Based Access Control)セキュリティーモデルです。ロールは RBAC の属性です。SELinux ユーザーはロールに対して承認され、ロールはドメインに対して承認されます。このロールは、ドメインと SELinux ユーザー間の中間役割を果たします。入力できるロールにより、どのドメインを入力できるかを決定します。最終的には、どのオブジェクトタイプにアクセスできるかを制御します。これにより、権限昇格攻撃の脆弱性を軽減することができます。
- type
- タイプは Type Enforcement の属性です。タイプは、プロセスのドメインとファイルのタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
- level
- レベルは MLS および MCS の属性です。MLS 範囲は、レベルが異なる場合に 低レベルの高レベルとして記述されたレベル のペア、またはレベルが 同じ場合は低いレベル です(s
0-s0
はs0)と同じです。
各レベルは機密性とカテゴリーのペアで、カテゴリーは任意です。カテゴリーがある場合は、レベルは 機密性:category-set として記述されます。カテゴリーがない場合は、機密性 として記述されます。カテゴリーセットが連続したシリーズである場合は、省略できます。たとえば、c0.c3
はc0,c1,c2,c3
と同じです。/etc/selinux/targeted/setrans.conf
ファイルは、レベル(s0:c0)を、人間が判読できる形式(CompanyConfidential)
にマップします。
Red Hat Enterprise Linux では、ターゲットポリシーは MCS を強制します。MCS では、機密性が 1 つだけs0 になります
。Red Hat Enterprise Linux の MCS は、1024 つの異なるカテゴリーc0
からc1023
をサポートします。s0-s0:c0.c1023
は機密性s0
で、すべてのカテゴリーに対して承認されます。MLS は Bell-La Padula Mandatory Access Model を強制し、Labeled Security Protection Profile(LSPP)環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールして、MLS をデフォルトの SELinux ポリシーとして設定します。Red Hat Enterprise Linux に同梱される MLS ポリシーは、評価された設定の一部ではない多くのプログラムドメインを省略するため、デスクトップワークステーション上の MLS は使用できなくなります(X Window System はサポートされません)。ただし、アップストリームの SELinux Reference Policy からの MLS ポリシーは、すべてのプログラムドメインを含む構築できます。MLS 設定の詳細は、「Multi-Level Security (MLS)」 を参照してください。
2.1. ドメインの遷移
のエントリーポイント
タイプを持つアプリケーションを実行して、別のドメインに移行します。エントリーポイント
パーミッションは、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
タイプにエントリーポイント
パーミッションが設定されていることを示しています。 - ユーザーが
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 ドメインで実行している
プロセスには、passwd を実行する正当な理由がないため、sendmail
passwd_t ドメインに移行することはできません
。 passwd_t
ドメインで実行しているプロセスは、etc_t またはshadow
タイプのラベルが付いたファイルなど、承認されたタイプに対する読み取りおよび書き込みのみが可能です。これにより、_t
passwd
アプリケーションが任意のファイルの読み取りや書き込みを阻止します。
2.2. プロセス用の SELinux コンテキスト
手順2.2 passwd
ユーティリティーの SELinux コンテキストの表示
- Applications → System Tools → ターミナルなどのターミナルを開きます。
passwd
ユーティリティーを実行します。新しいパスワードは入力しないでください。~]$
passwd Changing password for user user_name. Changing password for user_name. (current) UNIX password:- 新しいタブまたは他のターミナルを開き、以下のコマンドを入力します。出力は以下のようになります。
~]$
ps -eZ | grep passwd unconfined_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 -eZ
system_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
ロールは、デーモンなどのシステムプロセスに使用されます。Enforcement と入力してから、各ドメインを区切ります。
2.3. ユーザーの SELinux コンテキスト
~]$
id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u
ユーザーにマッピングされ、unconfined_r
ロールとして実行され、unconfined_t
ドメインで実行されていることを示しています。s0-s0
は MLS 範囲で、この場合は s0
と同じです。ユーザーがアクセス可能なカテゴリーは c0.c1023 で定義され、すべてのカテゴリー(c
0 から c
1023 まで)になります
。
第3章 ターゲットポリシー
unconfined_t
ドメインで実行され、init によって起動されたシステムプロセスは unconfined_service_t
ドメインで実行されます。
3.1. 制限のあるプロセス
sshd
や httpd
などのネットワークをリッスンするほとんどのサービスは、Red Hat Enterprise Linux で制限されます。また、root ユーザーとして実行され、passwd
ユーティリティーなどのユーザーのタスクを実行するほとんどのプロセスは制限されます。プロセスが制限されると、httpd _t
ドメインで実行している httpd
プロセスなど、独自のドメインで実行されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。
手順3.1 SELinux ステータスの確認方法
- SELinux が有効で、Enforcing モードで実行されていること、およびターゲットポリシーが使用されていることを確認します。正しい出力は以下のようになります。
~]$
sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 30SELinux モードの変更に関する詳細は、「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/testfileデフォルトでは、Linux ユーザーは Red Hat Enterprise Linux で制限なしで実行されます。つまり、testfile ファイルに
SELinuxunconfined_u
user のラベルが付けられます。RBAC はファイルではなく、プロセスに使用されます。ロールにはファイルに対する意味がありません。object_r
ロールは(永続ストレージおよびネットワークファイルシステム上)ファイルに使用される汎用ロールです。/proc ディレクトリー配下
で、プロセスに関連するファイルはsystem_r
ロールを使用する場合があります。httpd_sys_content_t
タイプを使用すると、httpd プロセスが
このファイルにアクセスできるようになります。
が使用
することを目的としたファイルなど、適切にラベル付けされていないファイルを読み込む方法を表しています。これは、実稼働環境で使用すべきではありません。httpd パッケージおよび wget パッケージがインストールされ、SELinux ターゲットポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。
手順3.2 機密プロセスの例
- root で
httpd
デーモンを起動します。~]#
systemctl start httpd.serviceサービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]$
systemctl status httpd.service httpd.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 - root で以下のコマンドを実行して、
httpd
を実行する必要がありません。~]#
systemctl stop httpd.service
httpd
プロセスが手順 2 の 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. 制限のないプロセス
_service_t ドメインで実行される init
によって実行される制限のないサービス、kernel_t
ドメインで実行されているカーネルによって実行される制限されていないサービス 、
制限のない Linux ユーザーが実行し、unconfined _t ドメインで実行しているなどの制限のない
サービスなどです。制限のないプロセスの場合、SELinux ポリシールールが適用されますが、制限のないドメインで実行されているプロセスを許可するポリシールールが存在します。制限のないドメインで実行されているプロセスは、DAC ルールのみを使用するようにフォールバックします。制限のないプロセスが危険にさらされても、SELinux は、攻撃者がシステムリソースやデータにアクセスできなくなりますが、当然、DAC ルールは引き続き使用されます。SELinux は、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.service httpd.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.service httpd.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 - 以下のコマンドを入力して、
unconfined_service_t
ドメインで実行しているhttpd
を表示します。~]$
ps -eZ | grep httpd system_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
_t ドメインで httpd
が実行されましたが、wget コマンドは失敗していました。 restorecon
ユーティリティーは、ファイルのデフォルト SELinux コンテキストを復元します。root で以下のコマンドを実行して、/usr/sbin/httpd
のデフォルトの SELinux コンテキストを復元します。~]#
restorecon -v /usr/sbin/httpd restorecon 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 httpd system_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/testfile rm: remove regular empty file `/var/www/html/testfile'? y httpd
の実行が必要ない場合は、root で次のコマンドを実行して、httpd を停止します。
~]#
systemctl stop httpd.service
3.3. 制限のあるユーザーおよび制限のないユーザー
~]#
semanage login -l
Login 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__
login にマッピングされ、SELinux unconfined_u
ユーザーにマッピングされます。以下の行は、デフォルトのマッピングを定義します。
__default__ unconfined_u s0-s0:c0.c1023
unconfined_u
ユーザーにマップする方法を説明します。Red Hat Enterprise Linux では、デフォルトで root ユーザーが制限なしで実行されていることを前提としています。
手順3.4 新しい Linux ユーザーの SELinux unconfined_u
ユーザーへのマッピング
- root で以下のコマンドを実行して、new
user という名前の新規
Linux ユーザーを作成します。~]#
useradd newuser - Linux
newuser
ユーザーにパスワードを割り当てます。root で以下のコマンドを実行します。~]#
passwd newuser Changing 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 モジュール pam_selinux は Linux ユーザーを SELinux ユーザー (この場合はunconfined_u
) に自動的にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを入力して、Linux ユーザーのコンテキストを表示します。[newuser@localhost ~]$
id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023注記システムにnewuser ユーザーが必要なくなった場合
は、Linuxnewuser
's session からログアウトし、アカウントでログインし、root で userdel -r newuser コマンドを実行します。新しいユーザーとその
ホームディレクトリーを削除します。
~]$
seinfo -u
Users: 8
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
unconfined_t
ドメインから自身の制限のあるドメインに移行できるものとして SELinux ポリシーが定義するアプリケーションを実行すると、制限のない Linux ユーザーは制限のあるドメインの制限を受けます。このセキュリティー上の利点は、Linux ユーザーが制限なしで実行している場合でも、アプリケーションは制限されたままになります。したがって、アプリケーションにおける不具合の悪用はポリシーによって制限できます。
表3.1 SELinux ユーザー機能
User | ロール | ドメイン | 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 ポリシーが許可した場合 (passwd
など)、設定したユーザー ID (setuid) アプリケーションのみを実行できます。これらのユーザーは、su および sudo setuid アプリケーションを実行できないため、これらのアプリケーションを使用して root にすることはできません。sysadm_t
ドメイン、staff_t
ドメイン、user_t
ドメイン、およびxguest_t
ドメインの Linux ユーザーは、X Window System およびターミナルを使用してログインできます。- デフォルトでは、
staff_t
ドメイン、user_t
ドメイン、guest_t
ドメイン、およびxguest_t
ドメインの Linux ユーザーは、ホームディレクトリーと/tmp
でアプリケーションを実行できます。ユーザーのパーミッションを継承するアプリケーションの実行を防ぐには、guest_exec_content
およびxguest_exec_content
ブール値をoff
に設定します。これにより、不具合のあるアプリケーションや悪意のあるアプリケーションがユーザーのファイルを変更できなくなります。ユーザーがホームディレクトリーおよび/tmp
でアプリケーションの実行を許可および禁止する方法については、「ユーザー実行アプリケーションのブール値」 を参照してください。 xguest_t
ドメインの Linux ユーザーにアクセスできる唯一のネットワークアクセスは、Web ページに接続する Firefox です。
system_u
は、システムプロセスおよびオブジェクトに対する特別なユーザー ID であることに注意してください。Linux ユーザーに関連付けることはできません。また、unconfined_u
および root
は制限のないユーザーです。このような理由から、上記の SELinux ユーザー機能の表は含まれません。
webadm_r
は、Apache HTTP Server に関連する SELinux タイプの処理のみが可能です。詳細は、「types」 を参照してください。logadm_r
は、syslog
およびauditlog
プロセスに関連する SELinux タイプの処理のみが可能です。secadm_r
は SELinux の処理のみが可能です。auditadm_r
は、監査
サブシステムに関連するプロセスのみを管理できます。
~]$
seinfo -r
3.3.1. sudo の移行および SELinux ロール
staff _u
および sysadm_u
のみが、デフォルトで sudo を使用できます。このようなユーザーが sudo でコマンドを実行する場合は、/etc/sudoers 設定ファイルで指定されたルール、または /etc/sudoers
.d/
ディレクトリーの各ファイルで、そのファイルが存在する場合は、そのロールを変更できます。
手順3.5 sudo 遷移の設定
- 新しい SELinux ユーザーを作成して、デフォルトの SELinux ロールと、このユーザーの補助制限のある管理者ロールを指定します。
~]#
semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u - デフォルトの SElinux ポリシーコンテキストファイルを設定します。たとえば、SELinux ユーザー
staff_u
と同じ SELinux ルールを設定するには、staff_u
コンテキストファイルをコピーします。~]#
cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u - 新たに作成した SELinux ユーザーを既存の 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 -Z SELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023sudo の実行後に、/etc/sudoers.d/linux_user
で指定した、補助 SELinux ロールにユーザーの SELinux コンテキストが変更されます。sudo で使用する-i
オプションは、インタラクティブシェルが実行されていました。~]$
sudo -i~]#
id -Z SELinux_user_u:administrator_r:administrator_t:s0-s0:c0.c1023最初のステップで指定された例からのSELinux_user_u
ユーザーの場合、出力は以下のようになります。~]$
id -Z confined_u:staff_r:staff_t:s0:c0.c1023~]$
sudo -i~]#
id -Z confined_u:webadm_r:webadm_t:s0:c0.c1023この例では、デフォルトの割り当てられたロールstaff_r で、新しい SELinux ユーザー
confined_u
を作成し、sudo が、staff_u のロールを
に変更するよう設定します。staff_
r からwebadm_r
~]#
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 -Z confined_u:staff_r:staff_t:s0:c0.c1023~]$
sudo -i~]#
id -Z confined_u:webadm_r:webadm_t:s0:c0.c1023
第4章 SELinux の使用
4.1. SELinux Packages
- policycoreutils は、SELinux の操作および管理に
restorecon
、secon
、setfiles
、se
module
、load_policy、
setsemodule などのユーティリティーを提供します。 - selinux-policy は、基本的なディレクトリー構造、
selinux-policy.conf
ファイル、RPM マクロを を提供します。 - selinux-policy-targeted は、SELinux ターゲットポリシーを提供します。
- libselinux: SELinux アプリケーションの API を提供します。
- libselinux-utils は、a
vcstat
、getenforce
、getsebool
、match
pathcon、selinuxconlist
、selinuxdefcon
、selinuxenabled
ユーティリティー、およびsetenforce
ユーティリティーを提供します。 - libselinux-python は、SELinux アプリケーションを開発するための Python バインディングを提供します。
- selinux-policy-devel は、カスタムの SELinux ポリシーおよびポリシーモジュールを作成するためのユーティリティーを提供します。
- selinux-policy-doc は、さまざまなサービスで SELinux の完全な設定方法を説明する man ページを提供します。
- selinux-policy-mls は、MLS(Multi-Level Security)SELinux ポリシーを提供します。
- setroubleshoot-server は、SELinux がアクセスが拒否されたときに生成された拒否メッセージを変換し、その中にも sealert ユーティリティーで表示できる詳細の説明になります。
- setools-console は、Tre sys Technology SETools ディストリビューション、ポリシーの分析およびクエリーを行うためのユーティリティーおよびライブラリー、監査ログの監視およびレポート、およびファイルコンテキスト管理を提供します。 setools パッケージは、SETools のメタパッケージです。setools-gui パッケージは、
apol
ユーティリティーおよびseaudit
ユーティリティーを提供します。setools-console パッケージは、sechecker
ユーティリティー、sediff
、seinfo
、sesearch、
およびfindcon
コマンドラインユーティリティーを提供します。これらのユーティリティーの詳細は、Tresys Technology SETools ページを参照してください。setools および setools-gui パッケージは、Red Hat Network Optional チャンネルが有効にされている場合にのみ使用できることに注意してください。詳細は「 対象範囲の詳細 」を参照してください。 - mcstrans translates(s
0-s0:c0.c1023
など)を、SystemLow-SystemHigh
などの読みやすいフォームに変換します。 - policycoreutils-python は、SELinux を操作および管理するために semanage、audit2allow、audit2why、ch cat などのユーティリティーを提供します。
- policycoreutils-gui は、SELinux を管理するためのグラフィカルユーティリティーである system-config-selinux を提供します。
4.2. 使用されているログファイル
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 auditd enabled~]$
systemctl is-enabled rsyslog enabledまたは、systemctl status service-name.service コマンドを使用して、コマンド出力で有効な
キーワードを検索します。以下に例を示します。~]$
systemctl status auditd.service | grep enabled auditd.service - Security Auditing Service Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
systemd
デーモンによるシステムサービスの管理方法は、『システム管理者のガイド』の「 システムサービスの管理」の章 を参照してください。
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=permissive
を使用する場合、SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、SELinux を Enforcing モードで実行した場合拒否が拒否されたアクションについてログに記録されません。SELINUX=disabled
を使用すると、SELinux モジュールは Linux カーネルに登録されず、DAC ルールのみが使用されます。
SELINUXTYPE=
SELINUXTYPE
オプションは、使用する SELinux ポリシーを設定します。ターゲットとなるポリシーはデフォルトのポリシーです。MLS ポリシーを使用する場合のみ、このオプションを変更します。MLS ポリシーを有効にする方法は、「SELinux での MLS の有効化」 を参照してください。
4.4. SELinux の状態およびモードの永続的な変更
Enforcing
、Permissive
、または Disabled
を返します。
~]$
sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 30
4.4.1. SELinux の有効化
- SELinux を Permissive モードで有効にします。詳細は、「Permissive モード」 を参照してください。
- システムを再起動します。
- SELinux 拒否メッセージを確認します。詳細は、「サービス拒否検索および表示」 を参照してください。
- 拒否がない場合は、Enforcing モードに切り替えます。詳細は、「Enforcing モード」 を参照してください。
unconfined_service_t
ドメインでアプリケーションを実行します。詳細は、「制限のないプロセス」 を参照してください。- アプリケーションに新しいポリシーを記述します。詳細は、ナレッジベースの記事「Writing Custom SELinux Policy」を参照してください。
4.4.1.1. Permissive モード
手順4.2 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.1.2. Enforcing モード
手順4.3 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/messages
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
を返すことを確認します。~]$
getenforce Disabled
4.5. 起動時の SELinux モードの変更
- enforcing=0
- このパラメータを設定すると、システムを起動する際に、Permissive モードで起動します。これは、問題のトラブルシューティングを行うときに便利です。ファイルシステムの破損がひどい場合は、Permissive モードを使用することが、問題を検出するための唯一の選択肢となるかもしれません。また、Permissive モードでは、ラベルの作成が適切に行われます。このモードで作成した AVC メッセージは、Enforcing モードと同じになるとは限りません。Permissive モードでは、一連の同じ拒否の最初の拒否のみが報告されます。一方、Enforcing モードでは、ディレクトリーの読み込みに関する拒否が発生し、アプリケーションが停止する場合がします。Permissive モードでは、表示される AVC メッセージは同じですが、アプリケーションは、ディレクトリー内のファイルを読み続け、拒否が発生するたびに AVC を取得します。
- selinux=0
- このパラメーターにより、カーネルは、SELinux インフラストラクチャーのどの部分も読み込まないようになります。init スクリプトは、システムが
selinux=0
パラメーターで起動してるのを認識し、/.autorelabel
ファイルのタイムスタンプを変更します。これにより、次回 SELinux を有効にしてシステムを起動する際にシステムのラベルが自動的に再設定されます。重要Red Hat では、selinux=0
パラメーターを使用することは推奨されません。システムをデバッグする場合は、Permissive モードを使用することが推奨されます。 - autorelabel=1
- このパラメーターにより、システムで、以下のコマンドと同様の再ラベルが強制的に行われます。
~]# touch /.autorelabel ~]# reboot
システムのラベリングに大量のエラーが含まれる場合は、自動再ラベルが正常に実行されるために Permissive モードで起動する必要がある場合があります。
checkreqprot
などの追加の SELinux 関連のカーネル起動パラメーターは、/usr/share/doc/kernel-doc-<KERNEL_VER>/Documentation/kernel-parameters.txt
ファイルを参照してください。本書は、kernel-doc パッケージでインストール します。<KERNEL_VER> 文字列をインストール済みカーネルのバージョン番号に置き換えます。以下に例を示します。
~]# yum install kernel-doc ~]$ less /usr/share/doc/kernel-doc-3.10.0/Documentation/kernel-parameters.txt
4.6. ブール値
4.6.1. ブール値の一覧表示
~]#
semanage boolean -l
SELinux boolean State Default Description
smartmon_3ware (off , off) Determine whether smartmon can...
mpd_enable_homedirs (off , off) Determine whether mpd can traverse...
SELinux ブール値
のコラムにはブール値名が一覧表示されます。説明
のコラムには、ブール値がオンまたはオフであるかと、そのブール値が何であるかを示します。
~]$
getsebool -a
cvs_read_shadow --> off
daemons_dump_core --> on
~]$
getsebool cvs_read_shadow
cvs_read_shadow --> off
~]$
getsebool cvs_read_shadow daemons_dump_core
cvs_read_shadow --> off
daemons_dump_core --> on
4.6.2. ブール値の設定
setsebool
boolean_name on/off 形式で setsebool ユーティリティーを実行し、ブール値を有効または無効にします。
httpd_can_network_connect_db
のブール値の設定を示しています。
手順4.5 ブール値の設定
- デフォルトでは、
httpd_can_network_connect_db
ブール値は off で、Apache HTTP Server スクリプトおよびモジュールがデータベースサーバーに接続されないようにします。~]$
getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> off - 一時的に Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できるようにするには、root で以下のコマンドを入力します。
~]#
setsebool httpd_can_network_connect_db on - The
getsebool
ユーティリティーを使用して、ブール値が有効であることを確認します。~]$
getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> onこれにより、Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できます。 - この変更は、再起動後も維持されません。再起動後も変更を永続的にするには、root で setsebool -P boolean-name コマンドを実行します。[3]
~]#
setsebool -P httpd_can_network_connect_db on
4.6.3. シェルの自動完了
getsebool
ユーティリティー、setsebool
ユーティリティー、および semanage
ユーティリティーで使用することができます。auto-completion with 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_xserver
semanage
ユーティリティーは、1 つずつ完了した複数のコマンドライン引数で使用されます。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.7. SELinux コンテキスト: ファイルのラベル付け
~]$
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 に基づいて制御されます。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/file1
match
path con などのファイルシステムのラベリングを管理するための複数のコマンドを提供します。
4.7.1. 一時的な変更: chcon
クイックリファレンス
- 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 Contexts を参照してください。 - 以下のコマンドを入力して、タイプを
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 file1 restorecon 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 /web drwxr-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
4.7.2. 永続的な変更: semanage fcontext
~]# semanage fcontext -C -l
setfiles
ユーティリティーは、ファイルシステムのラベルが解除され、restorecon
ユーティリティーがデフォルトの SELinux コンテキストを復元する場合に使用されます。つまり、ファイルシステムに再ラベル付けされた場合でも、semanage fcontext による変更が永続化されます。SELinux ポリシーは、ユーザーが指定のファイルの SELinux コンテキストを変更できるかどうかを制御します。
クイックリファレンス
- 以下のコマンドを入力し、ファイルまたはディレクトリーへの完全パスを使用するようにしてください。
~]#
semanage fcontext -a options file-name|directory-name restorecon
ユーティリティーを使用して、コンテキスト変更を適用します。~]#
restorecon -v file-name|directory-name
semanage fcontext での正規表現の使用
PCRE2_DOTALL
で、これにより、 ワイルドカードは
新しい行を含め、何も一致させます。パスを表す文字列はバイトとして処理されます。つまり、ASCII 以外の文字は単一のワイルドカードによって一致しません。
file_contexts.local
に保存されているローカルのファイルコンテキストの変更は、ポリシーモジュールで指定された優先順位よりも高くなります。つまり、指定のファイルパスの一致が file _contexts.local
にあり、他の file-context 定義が考慮されないことを意味します。
ページの semanage-fcontext(8)
を参照してください。
手順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/file1 restorecon 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 /web drwxr-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/およびファイル内の web/
およびファイルには、default_t
タイプのラベルが付けられます。~]#
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"~]$
ls -dZ /web drwxr-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 /web restorecon 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|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
最初の部分がテスト中
です。restorecon の実行後にtest/
ディレクトリーに、またはファイルシステムのラベル後にhttpd_sys_content_t
でラベル付けされないようにするには、root で以下のコマンドを入力して、file_contexts.local
からコンテキストを削除します。~]#
semanage fcontext -d /test - root で
restorecon
ユーティリティーを使用してデフォルトの SELinux コンテキストを復元します。
4.7.3. ファイルコンテキストの決定方法
.fc
ファイル)で指定される file-context 定義に基づいています。システムポリシーに基づいて、semanage
は file_contexts.homedirs
ファイルおよび file_contexts
ファイルを生成します。
file_contexts.local
ファイルに保存されます。
matchpathcon
や restorecon
などのラベリングユーティリティーが特定のパスに適切なラベルを決定すると、最初にローカルの変更(file_contexts.local
)を検索します。ユーティリティーに一致するパターンが見つからない場合は、file_contexts.homedirs
ファイルを検索し、最後に file_contexts
ファイルを検索します。ただし、指定したファイルパスと一致する見つかると、検索は終了するたびに、ユーティリティーは追加の file-context 定義を検索します。つまり、ホームディレクトリー関連のファイルコンテキストは、残りよりも優先度が高く、ローカルのカスタマイズがシステムポリシーを上書きします。
システムポリシー
で指定された file-context の定義( file_contexts.homedirs
ファイルおよび file_contexts
ファイル)は、評価の前に stem の長さ(ワイルドカードの前にパスの特定)別にソートされます。これは、最も具体的なパスを選択することを意味します。ただし、semanage fcontext を使用して指定された file-context 定義は逆の順序で評価されます。最新のエントリーは、stem の長さに関係なく最初に評価されます。
chcon
を使用してファイルのコンテキストを変更する方法は、「一時的な変更: chcon」 を参照してください。- semanage fcontext を使用して file-context 定義を変更および追加する場合は、「永続的な変更: semanage fcontext」 を参照してください。
- system-policy 操作による file-context 定義の変更および追加については、「SELinux ラベルの維持」 または 「SELinux ポリシーモジュールの優先順位付けと無効化」 を参照してください。
4.8. file_t および default_t タイプ
file_t
タイプは、EA 値 がまだ割り当てられていないファイルのデフォルトタイプです。このタイプは、この目的のためにのみ使用され、適切にラベル付けされたファイルシステムには存在しません。SELinux を実行しているシステムのすべてのファイルには適切な SELinux コンテキストが必要で、file_t タイプは file
-context 設定で使用されないためです。[4].
default_t
タイプは、file-context 設定のパターンに一致しないファイルで使用されます。そのため、このようなファイルはディスクにコンテキストがないファイルから区別でき、通常は制限のあるドメインにはアクセスできなくなります。たとえば、my directory/
などの新規最上位のディレクトリーを作成する場合、このディレクトリーには default_t タイプのラベルが付けられる場合があります。サービスがこのディレクトリーにアクセスする必要がある場合は、この場所の file-contexts 設定を更新する必要があります。file-context 設定へのコンテキストの追加に関する詳細は、「永続的な変更: semanage fcontext」 を参照してください。
/etc/selinux/targeted/contexts/files/
ディレクトリーのファイルは、ファイルとディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon
ユーティリティーおよび setfiles
ユーティリティーで読み取り、ファイルとディレクトリーをデフォルトのコンテキストに復元します。
4.9. ファイルシステムのマウント
コンテキストは
ディスクには書き込まれません。元のコンテキストは保持され、ファイルシステムが最初の場所で拡張属性がある場合に、コンテキスト
なしでマウントするときに表示されます。
4.9.1. コンテキストマウント
nfs_t
タイプを使用します。追加のマウントオプションがないと、Apache HTTP Server などの他のサービスを使用して NFS ボリュームの共有を防ぐことができます。以下の例では、Apache HTTP Server を使用して共有できるように NFS ボリュームをマウントします。
~]#
mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
-o コンテキスト
で指定されているように見えます。ただし、これらの変更はディスクに書き込まれないため、このオプションで指定したコンテキストはマウント間で永続化されません。そのため、必要なコンテキストを維持するために、このオプションはすべてのマウント時に指定された同じコンテキストと共に使用する必要があります。コンテキストマウントの永続化の詳細は、「コンテキストマウントの永続化」 を参照してください。
o コンテキストで SELinux コンテキストを上書きする場合は、
SELinux system_u
user および object_r
ロールを使用し、タイプに集中します。MLS ポリシーまたはマルチカテゴリーセキュリティーを使用していない場合は、s 0
レベルを使用します。
コンテキスト
オプションを使用してマウントされている場合、ユーザーおよびプロセスによるコンテキストの変更は禁止されます。たとえば、コンテキスト
オプションでマウントされたファイルシステムで chcon コマンドを実行すると、Operation not supported
エラーが発生します。
4.9.2. デフォルトコンテキストの変更
file_t
タイプを使用します。別のデフォルトコンテキストを使用する方が望ましい場合は、defcontext
オプションを指定してファイルシステムをマウントします。
/dev/sda2
の新規作成したファイルシステムを、新たに作成した test/
ディレクトリーにマウントします。/etc/selinux/targeted/contexts/files/ には、test/
ディレクトリーのコンテキストを定義するルールがないことを前提としています。
~]#
mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
defcontext
オプションは、system_u:object_r:samba_share_t:s0
が「the default security context for unlabeled files」であることを定義します。[5].- マウントすると、ファイルシステムの root ディレクトリー(
test/
)は、defcontext
で指定されたコンテキストでラベル付けされるかのように処理されます(このラベルはディスクに保存されません)。これは、test/
で作成されたファイルのラベリングに影響します。新しいファイルはsamba_share_t
タイプを継承するので、これらのラベルはディスクに保存されます。 - ファイルシステムが
defcontext
オプションでマウントされている間にtest/
で作成されたファイルは、それらのラベルを保持します。
4.9.3. NFS ボリュームのマウント
nfs_t
タイプを使用します。ポリシー設定によっては、Apache HTTP Server や MariaDB などのサービスは、nfs_t
タイプのラベルが付いたファイルを読み取れない場合があります。これにより、このタイプのラベルが付いたファイルシステムがマウントされ、他のサービスによる読み取りやエクスポートが妨げられる可能性があります。
nfs_t
タイプを上書きする場合は、context
オプションを使用します。以下のコンテキストオプションを使用して NFS ボリュームをマウントし、Apache HTTP Server を使用して共有できるようにします。
~]#
mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
コンテキスト
オプションでファイルシステムをマウントする代わりに、ブール値を有効にして、nfs_t
タイプのラベルが付いたファイルシステムへのサービスアクセスを許可することもできます。nfs_t
タイプにサービスアクセスを許可するブール値を設定する手順は、パートII「機密サービスの管理」 を参照してください。
4.9.4. 複数の NFS マウント
database / の 2 つのサブディレクトリーを持つ export
/
が 1 つあります
。以下のコマンドは、1 つの NFS エクスポートから 2 つのマウントを試行し、各 NFS エクスポートのコンテキストを上書きしてください。
~]#
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
オプションを使用します。以下の例では、マウントごとに異なるコンテキストを使用して、1 つの NFS エクスポートから複数のマウントをマウントします(それぞれ 1 つのサービスアクセスを許可する)。
~]#
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/
を複数回マウントすることができます。異なるコンテキストでファイルにアクセスできる重複マウントを作成するため、エクスポートを複数回異なるコンテキストでマウントしないでください。
4.9.5. コンテキストマウントの永続化
/etc/fstab
ファイルまたは自動マウント機能マップにファイルシステムのエントリーを追加し、必要なコンテキストをマウントオプションとして使用します。以下の例では、NFS コンテキストマウントの /etc/fstab
にエントリーを追加します。
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
4.10. SELinux ラベルの維持
4.10.1. ファイルおよびディレクトリーのコピー
_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
file1
が /etc
にコピーされ、/etc/file1
が存在しない場合は、/etc/file1
が新規ファイルとして作成されます。上記の例で示されているように、/etc/file1
には default-labeling ルールに従って、etc/file1 に etc_t
タイプのラベルが付けられます。
、--preserve=context
などの元のファイルのコンテキストを保持するための cp オプションが指定されていない限り、既存のファイルのコンテキストが保持されます。SELinux ポリシーは、コピー中にコンテキストが保持されないことがあります。
手順4.11 事前の SELinux コンテキストを使用しないコピー
- ユーザーのホームディレクトリーにファイルを作成します。このファイルには
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 で、
/etc
ディレクトリーに新しいファイルfile1
を作成します。以下に示すように、ファイルにetc_t
タイプのラベルが付けられます。~]#
touch /etc/file1~]$
ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1 /tmp
ディレクトリーに別のファイル file2
を作成します。以下に示すように、ファイルにuser_tmp_t
タイプのラベルが付けられます。~]$
touch /tmp/file2~$
ls -Z /tmp/file2 -rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2file1
をfile2
で上書きします。~]#
cp /tmp/file2 /etc/file1- コピー後に、次のコマンドは /
etc/file
。1 に置き換わる
1 を表示します/tmp/file2
からのuser_tmp_t タイプではなく
タイプのラベルが付いた file、etc
_t~]$
ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
4.10.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 ブラウザーを使用してアクセスしようとすると、パーミッションは拒否されます。
4.10.3. デフォルトの SELinux コンテキストの確認
matchpathcon
ユーティリティーを使用して、ファイルとディレクトリーに正しい SELinux コンテキストがあるかどうかを確認します。このユーティリティーは、システムポリシー
をクエリーし、ファイルパスに関連付けられたデフォルトのセキュリティーコンテキストを提供します。[6] 以下の例は、matchpathcon を使用して、/var/www/html/
ディレクトリーのファイルが正しくラベル付けされていることを確認します。
手順4.16 matchpathcon
でデフォルトの SELinux Conxtext の確認
- root ユーザーとして、
/var/www/html/ ディレクトリーに 3 つのファイル(
を作成します。これらのファイルは、file1
、file2
、および file/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.
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/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
4.10.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 つのファイル(file
3)を作成します。これらのファイルは、1
、file2
、および file/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
タイプは、default_t
に変更されずに保持されました。これは、--selinux
が使用されていました。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 - root として
test/
ディレクトリーが必要なくなった場合は、以下のコマンドを実行してそのディレクトリーとそのファイルをすべて削除します。~]#
rm -ri /test/
--xattrs
オプションなど 、
tar に関する詳細は、tar(1) man ページを参照してください。
4.10.5. star のあるファイルのアーカイブ
star
ユーティリティーは、デフォルトで拡張属性を保持しません。SELinux コンテキストは拡張属性に格納されるため、ファイルのアーカイブ時にコンテキストが失われる可能性があります。star -xattr -H=exustar コマンドを使用して、コンテキストを保持するアーカイブを作成します。star パッケージはデフォルトでインストールされません。星 をインストールするには、root ユーザーとして yum install star コマンドを実行します。
星
アーカイブの作成を示しています。
手順4.18 星
のアーカイブの作成
- root として、
/var/www/html/
に 3 つのファイル(
3)を作成します。これらのファイルは、file1
、file2
、および file/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
という名前の星
のアーカイブを作成します。~]$
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/
に変更します。このディレクトリーに移動したら、以下のコマンドを実行して星
アーカイブを展開します。~]$
cd /test/test]$
star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).- SELinux コンテキストを表示します。
httpd_sys_content_t
タイプは、default_t
に変更されずに保持されました。これは、-xattr -H=exustar
オプションが使用されていました。~]$
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 - root として
test/
ディレクトリーが必要なくなった場合は、以下のコマンドを実行してそのディレクトリーとそのファイルをすべて削除します。~]#
rm -ri /test/ star
がなくなった場合は、root でパッケージを削除します。~]#
yum remove star
star
の詳細は、star(1) man ページを参照してください。
4.11. 情報収集ツール
avcstat
/sys/fs/selinux/avc/cache_stats
で、- f /path/to/file
オプションで別のキャッシュファイルを指定できます。
~]#
avcstat
lookups hits misses allocs reclaims frees
47517410 47504630 12780 12780 12176 12275
seinfo
info
は、policy.conf
ファイル、バイナリーポリシーファイル、ポリシーパッケージのモジュラーリスト、またはポリシーリストファイルを入力として使用するコマンドラインユーティリティーです。seinfo
ユーティリティーを使用するには、setools-console パッケージがインストールされている必要があります。
seinfo
の出力は、バイナリーファイルとソースファイルによって異なります。たとえば、ポリシーソースファイルは { }
括弧を使用して、複数のルール要素を 1 行にグループ化します。同様の効果は、1 つの属性が 1 つまたは多数の型に拡張される属性で行われます。これらは拡張され、バイナリーポリシーファイルに関係しないため、検索結果に戻り値はゼロになります。ただし、ルールの数は、以前は括弧を使用した行ごとに 1 行ずつ、個々の行数であるため、大幅に増大します。
~]#
seinfo
Statistics 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
ユーティリティーは、domain 属性でタイプ数も一覧表示でき、制限のあるプロセスの数を見積もることができます。
~]#
seinfo -adomain -x | wc -l
550
_domain
属性を使用します。
~]#
seinfo -aunconfined_domain_type -x | wc -l
52
、--permissive
オプションでカウントできます。
~]#
seinfo --permissive -x | wc -l
31
sesearch
sesearch
ユーティリティーを使用して、ポリシー内の特定のルールを検索できます。ポリシーソースファイルまたはバイナリーファイルのいずれかを検索することができます。以下は例になります。
~]$
sesearch --role_allow -t httpd_sys_content_t
Found 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
ユーティリティーは、許可 ルールの数を提供できます。
~]#
sesearch --allow | wc -l
262798
~]#
sesearch --dontaudit | wc -l
156712
4.12. SELinux ポリシーモジュールの優先順位付けと無効化
/etc/selinux/
の SELinux モジュールストレージを使用すると、SELinux モジュールに優先順位を使用できます。root で以下のコマンドを実行して、別の優先順位を持つ 2 つのモジュールディレクトリーを表示します。
~]#
ls /etc/selinux/targeted/active/modules
100 400 disabled
例4.1 SELinux ポリシーモジュールの優先度の使用
sandbox.pp
を使用します。
~]#
semodule -X 400 -i sandbox.pp~]#
semodule --list-modules=full | grep sandbox 400 sandbox pp 100 sandbox pp
~]#
semodule -X 400 -r sandbox
libsemanage.semanage_direct_remove_key: sandbox module at priority 100 is now active.
システムポリシーモジュールの無効化
システムポリシーモジュール
を無効にするには、root で以下のコマンドを入力します。
semodule -d MODULE_NAME
コマンドを使用してシステムポリシーモジュール
を削除すると、システムのストレージで削除されます。すべてのシステムポリシーモジュール
を復元する際に selinux-policy-targeted パッケージの不要な再インストールを回避するには、代わりに semodule -d コマンドを使用します。
4.13. Multi-Level Security (MLS)
図4.1 クリアランスのレベル

[D]
図4.2 MLS を使用した許可されるデータフロー

[D]
4.13.1. MLS およびシステム権限
4.13.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~]$
getenforce Permissive - fixfiles スクリプトを使用して、-
F
オプションを含む/.autorelabel
ファイルを作成し、次回の再起動時にファイルが再ラベル付けされるようにします。~]#
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 ファイルを表します。上記の例では、eleven*
文字はラベルが付けられた 11000 ファイルを表します。すべてのファイルにラベルを付けるのにかかる時間は、システム上のファイル数やハードディスクドライブの速度によって異なります。最新のシステムでは、このプロセスに 10 分程度かかる場合があります。ラベル付けプロセスが完了すると、システムが自動的に再起動します。 - Permissive モードでは、SELinux ポリシーは実行されませんが、Enforcing モードで実行している場合に拒否されたアクションの拒否がログに記録されます。Enforcing モードに切り換える前に、root で以下のコマンドを実行して、SELinux が最後の起動時にアクションを拒否していないことを確認します。SELinux が最後の起動時にアクションを拒否しなかった場合、このコマンドは出力を返しません。システムの起動時に SELinux がアクセスを拒否した場合は、トラブルシューティングに関する情報は、「 11章トラブルシューティング 」を参照してください。
~]#
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 モードで実行されていることを確認します。
~]$
getenforce EnforcingMLS ポリシーが有効化されます。~]#
sestatus |grep mls Policy from config file: mls
4.13.3. 特定の MLS 範囲でのユーザーの作成
手順4.20 特定の MLS 範囲でのユーザーの作成
- useradd コマンドを使用して新しい Linux ユーザーを追加し、新しい Linux ユーザーを既存の SELinux ユーザー(この場合は
staff_u
)にマッピングします。~]#
useradd -Z staff_u john - 新たに作成した Linux ユーザーをパスワードに割り当てます。
prompt~]# passwd john
- root で以下のコマンドを実行して、SELinux と Linux ユーザー間のマッピングを表示します。出力は以下のようになります。
~]#
semanage login -l Login 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 -l Login 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.13.4. 連続したディレクトリーの設定
/tmp
ディレクトリーおよび /var/tmp/
ディレクトリーは、通常、すべてのプログラム、サービス、およびユーザーが一時ストレージに使用されます。ただし、このような設定により、これらのディレクトリーは競合状態攻撃に対して脆弱になり、ファイル名に基づく情報漏えいが生じます。SELinux は、polyinstantiated ディレクトリーの形式でソリューションを提供します。つまり、/tmp
と /var/tmp/
の両方がインスタンス化され、各ユーザーにプライベートが表示されることを意味します。ディレクトリーのインスタンス化が有効な場合は、各ユーザーの /tmp および /
var/tmp/
ディレクトリーは /tmp-inst および /
var/tmp/inst
に自動的にマウントされます。
手順4.21 ポーザーディレクトリーの有効化
/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/login session required pam_namespace.so- システムを再起動します。
4.14. ファイル名の移行
A_t
というラベルが付いたプロセスによって B_t
というラベルが付いたオブジェクトクラスが作成され、指定されたオブジェクトクラスの名前が objectname
の場合、ラベル C_t が取得されます
。このメカニズムにより、システムのプロセスをより詳細に制御できます。
- デフォルトでは、オブジェクトは親ディレクトリーからラベルを継承します。たとえば、ユーザーが etc
_t というラベルが付いたディレクトリーにファイルを作成した場合には
、ファイルにetc_t
というラベルが付けられます。ただし、この方法は、ラベルが異なるディレクトリー内に複数のファイルを持つことが望ましい場合に便利です。 - ポリシー作成者は、以下を示すポリシーにルールを作成できます。
A_t タイプのプロセスが
オブジェクトは新しいB_t
というラベルが付いたディレクトリーに指定されたオブジェクトクラスを作成する場合、C_t
ラベルを取得します。このプラクティスは、1 つのプログラムが同じディレクトリーに複数のオブジェクトを作成する場合に問題があり、各オブジェクトには別個のラベルが必要です。さらに、作成されたオブジェクトの名前が指定されていないため、これらのルールは部分的な制御のみを提供します。 - 特定のアプリケーションでは、このようなアプリケーションが、特定のパスのラベルがあるのかをシステムに要求できるようにする SELinux 認識があります。次に、これらのアプリケーションはカーネルを要求し、必要なラベルの付いたオブジェクトを作成します。SELinux 認識のあるアプリケーションの例は、rpm パッケージマネージャー、restorecon ユーティリティー、または udev デバイスマネージャーです。ただし、SELinux 認識でファイルまたはディレクトリーを作成するすべてのアプリケーションに指示することはできません。作成後に、正しいラベルでオブジェクトの再ラベル付けが必要になることがよくあります。それ以外の場合は、制限のあるドメインがオブジェクトの使用を試みると、AVC メッセージが返されます。
strcmp()
関数で行われる完全一致を使用することに注意してください。正規表現またはワイルドカード文字の使用は考慮されません。
例4.2 ファイル名の移行に関するポリシールールの例
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.15. ptrace()の無効化
ptrace()
システムコールを使用すると、1 つのプロセスが別のプロセスの実行を確認し、そのメモリーとレジスタを変更できるようになります。この呼び出しは、主に、strace
ユーティリティーを使用する場合など、デバッグ時に開発者が使用します。ptrace()
が必要ない場合は、システムセキュリティーを改善するために無効にできます。これは、deny_ptrace
ブール値を有効にして実行できます。これは、unconfined_t
ドメインで実行されているプロセスであっても、他のプロセスで ptrace()
を使用できなくなります。
deny_ptrace
ブール値はデフォルトで無効になっています。これを有効にするには、root ユーザーで setsebool -P deny_ptrace on コマンドを実行します。
~]#
setsebool -P deny_ptrace on
~]$
getsebool deny_ptrace
deny_ptrace --> on
~]#
setsebool -P deny_ptrace off
維持しない場合は、-P
オプションを使用しないでください。
ptrace()システムコールを引き続き使用し
ていました。ptrace()
を使用できるすべてのドメインを一覧表示するには、以下のコマンドを入力します。setools-console パッケージは sesearch
ユーティリティーを提供し、パッケージはデフォルトでインストールされていないことに注意してください。
~]#
sesearch -A -p ptrace,sys_ptrace -C | grep -v deny_ptrace | cut -d ' ' -f 5
4.16. サムネイル保護
- /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
第5章 sepolicy
Suite
sepolicy
ユーティリティーは、インストールされた SELinux ポリシーをクエリーする機能スイートを提供します。これらの機能は、新しいものか、または sepolgen
や setrans などの別のユーティリティーによって提供されていました。
スイートでは、移行レポート、man ページ、または新しいポリシーモジュールを生成できるため、ユーザーは SELinux ポリシーへのアクセスや理解がより容易になります。
sepolicy
を提供します。root ユーザーで以下のコマンドを実行し、sepolicy
をインストールします。
~]#
yum install policycoreutils-devel
sepolicy
スイートは、コマンドラインパラメーターとして呼び出される以下の機能を提供します。
表5.1 sepolicy
機能
機能 | 説明 |
---|---|
ブール値 | SELinux ポリシーに対してクエリーを実行してブール値の説明を確認する |
通信 | SELinux ポリシーをクエリーし、ドメインが相互に通信できるかどうかを確認します。 |
生成 | SELinux ポリシーモジュールテンプレートの生成 |
GUI | SELinux ポリシー用のグラフィカルユーザーインターフェース |
interface | SELinux ポリシーインターフェースの一覧表示 |
man ページの | SELinux の man ページの生成 |
network | SELinux ポリシーネットワーク情報のクエリー |
遷移 | SELinux ポリシーのクエリーおよびプロセス移行レポートの生成 |
5.1. sepolicy
Python バインディング
search ユーティリティーおよび se
info
ユーティリティーが含まれました。sesearch
ユーティリティーは、SELinux ポリシーでルールを検索するために使用され、se info
ユーティリティーではポリシー内の他のさまざまなコンポーネントをクエリーできます。
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
gen
ユーティリティーまたは selinux-polgengui
ユーティリティーが、SELinux ポリシーの生成に使用されていました。これらのツールは、sepolicy
スイートにマージされました。Red Hat Enterprise Linux 7 では、sepolicy generate
コマンドを使用して、初期 SELinux ポリシーモジュールテンプレートを生成します。
sepolgen
とは異なり、sepolicy generate を root ユーザーで実行する必要はありません。このユーティリティーは、RPM の spec ファイルも作成されます。このファイルを使用して、ポリシーパッケージファイル(NAME. pp
)およびインターフェースファイル(NAME. if
)を正しい場所にインストールし、SELinux ポリシーのカーネルへのインストールとラベルの修正に使用できます。設定スクリプトは、引き続き SELinux ポリシーをインストールし、ラベル付けを設定します。さらに、インストールされているポリシーに基づいた man ページは、man ページの sepolicy の man コマンドを使用して生成されます。[7] 最後に、sepolicy は SELinux ポリシーと man ページを RPM パッケージに生成してコンパイルし、他のシステムにインストールできるようにします。
sepolicy generate
を実行すると、以下のファイルが生成されます。
NAME.te
- type enforcing file- このファイルは、特定のドメインに対するすべてのタイプおよびルールを定義します。
NAME.if
- interface file- このファイルは、システムのデフォルトファイルコンテキストを定義します。
NAME.te
ファイルで作成したファイルタイプを取り、ファイルパスをタイプに関連付けます。restorecon
やrpm などのユーティリティーでは
、これらのパスを使用してラベルを書き込みます。 NAME_selinux.spec
- RPM 仕様ファイル- このファイルは、SELinux ポリシーをインストールし、ラベル付けを設定する RPM 仕様ファイルです。このファイルは、インターフェースファイルと、ポリシーを説明する man ページもインストールします。sepolicy の man -d NAME コマンドを使用して、man ページを生成できます。
NAME.sh
- ヘルパーシェルスクリプト- このスクリプトは、システム上のラベリングのコンパイル、インストール、修正に役立ちます。また、インストールされているポリシーをもとに man ページを生成し、コンパイルし、他のシステムにインストールされているの RPM パッケージを構築します。
sepolicy はソースドメインからターゲットドメインへの生成されたパスをすべて出力します
。sepolicy generate
に関する詳細は、sepolicy-generate(8) man ページを参照してください。
5.3. ドメイン移行について: sepolicy の移行
se
trans ユーティリティーは、2 つのドメインまたはプロセス間の移行が可能かどうかを確認し、これらのドメインまたはプロセス間の移行に使用されるすべての中間タイプを出力するために使用されていました。Red Hat Enterprise Linux 7 では 、
setrans が sepolicy
スイートの一部として提供され、代わりに sepolicy transition
コマンドが使用されるようになりました。
sepolicy 移行
コマンドは、SELinux ポリシーをクエリーし、プロセス移行レポートを作成します。sepolicy transition コマンドでは、ソースドメイン(- s
オプション)とターゲットドメイン(- t
オプションで指定)の 2 つのコマンドライン引数が必要です。ソースドメインのみを入力した場合は、sepolicy migrate はソースドメインの移行可能なすべてのドメインを一覧表示します
。以下の出力にはすべてのエントリーが含まれません。「@」 文字は、以下を実行する 「ことを意味します」。
~]$
sepolicy transition -s httpd_t
httpd_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 移行
は、ソースドメインからターゲットドメインへのすべての移行パスの SELinux ポリシーを調べ、これらのパスを一覧表示します。以下の出力は完了しません。
~]$
sepolicy transition -s httpd_t -t system_mail_t
httpd_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 の移行
に関する詳細は、sepolicy-transition(8) man ページを参照してください。
5.4. 手動ページの生成: sepolicy の man
sepolicy の man
コマンドは、プロセスドメインを文書化する SELinux ポリシーに基づいて man ページを生成します。そのため、このようなドキュメントは常に最新の状態になります。自動生成された man ページの各名前は、プロセスドメイン名と、httpd_selinux
などのサフィックスで構成されます 。
Entrypoints
セクションには、ドメインの移行時に実行する必要がある実行可能ファイルがすべて含まれています。Process Types
セクションは、ターゲットドメインと同じ接頭辞で始まるすべてのプロセスタイプを一覧表示します。ブール値 セクションは
、ドメインに関連するブール値を一覧表示します。Port Types
セクションには、ドメインと同じ接頭辞に一致するポートタイプが含まれ、これらのポートタイプに割り当てられたデフォルトのポート番号を説明します。管理対象ファイル
セクションでは、ドメインの書き込みが可能なタイプと、これらのタイプに関連付けられたデフォルトのパスを説明します。File Contexts
セクションには、ドメインに関連付けられたすべてのファイルタイプが含まれ、システム上のデフォルトのパスラベルとともにこれらのファイルタイプを使用する方法が説明されています。- 共有ファイル
セクションでは
、public_content_t
などのドメイン共有タイプを使用する方法を説明します。
sepolicy man
ページの詳細は、sepolicy-manpage(8) man ページを参照してください。
第6章 ユーザーの制限
unconfined_u
ユーザーにマッピングされます。unconfined_u
が実行するすべてのプロセスは unconfined_t
ドメインにあります。これは、標準の Linux DAC ポリシーの制限内のシステム全体でアクセスできることを意味します。ただし、Red Hat Enterprise Linux では、多くの制限のある SELinux ユーザーを利用できます。つまり、ユーザーは制限された機能のセットに制限できることを意味します。各 Linux ユーザーは SELinux ポリシーを使用して SELinux ユーザーにマッピングされ、Linux ユーザーは(ユーザーにより異なる)SELinux ユーザーに設定された制限を継承でき、以下を行うことができません。
- X Window System の実行
- ネットワークの使用
- setuid アプリケーションの実行(SELinux ポリシーが許可しない限り)
- または、su および sudo コマンドを実行します。
user_u
ユーザーが実行するプロセスは user_t
ドメインにあります。このようなプロセスはネットワークに接続できますが、su コマンドまたは sudo コマンドを実行できません。これは、システムをユーザーから保護するのに役立ちます。制限のあるユーザーとその機能の詳細は、「制限のあるユーザーおよび制限のないユーザー」、表3.1「SELinux ユーザー機能」 を参照してください。
6.1. Linux および SELinux ユーザーマッピング
~]#
semanage login -l
Login 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__
login にマッピングされます(SELinux unconfined_u
ユーザーにマッピングされます)。Linux ユーザーが useradd コマンドで作成されると、オプションが指定されていない場合には、SELinux unconfined_u
ユーザーにマッピングされます。以下は、default-mapping を定義します。
__default__ unconfined_u s0-s0:c0.c1023 *
6.2. 新規 Linux ユーザーの設定: useradd
unconfined_u
ユーザーにマッピングされた Linux ユーザーは、unconfined_t
ドメインで実行します。これは、unconfined_u
にマップされた Linux ユーザーとしてログイン中に id -Z コマンドを実行します。
~]$
id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_t
ドメインで実行されると、SELinux ポリシールールが適用されますが、unconfined_t
ドメインで実行している Linux ユーザーを許可するポリシールールが存在します。制限のない Linux ユーザーは、SELinux ポリシーが unconfined_t
ドメインから自身の制限のあるドメインに移行できるアプリケーションを実行すると、制限のない Linux ユーザーはその制限のあるドメインの制限を受けます。このセキュリティー上の利点は、Linux ユーザーが制限されていませんが、アプリケーションの制限のないままであるため、アプリケーションの不具合の悪用はポリシーによって制限される可能性があります。
Z
オプションを使用して、マッピングされる SELinux ユーザーを指定します。以下の例では、新しい Linux ユーザー useruuser
を作成し、そのユーザーを SELinux の user_u
ユーザーにマッピングします。SELinux の user_u
ユーザーにマッピングされた Linux ユーザーは、user_t
ドメインで実行します。このドメインでは、SELinux ポリシーで( passwd
など)SELinux ポリシーが許可しない限り、Linux ユーザーは setuid アプリケーションを実行できません。これは、su コマンドまたは sudo コマンドを実行できず、このコマンドで root ユーザーになるのを防ぎます。
手順6.1 SELinux
ユーザーへの新しい Linux ユーザーの制限
- root で、SELinux
user_
を作成します。u
ユーザーにマップされる新しい Linux ユーザー(ユーザー)~]#
useradd -Z user_u useruuser useruuser と user
_u
間のマッピングを表示するには、root で次のコマンドを実行します。~]#
semanage login -l Login 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
ユーザー にパスワードを割り当てます
。~]#
passwd useruuser Changing 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 -Z user_u:user_r:user_t:s0 - Linux
useruuser
のセッションからログアウトし、アカウントにログインし直します。Linux のuseruuser
ユーザーを使用しない場合は、root で以下のコマンドを入力して、そのホームディレクトリーでこれを削除します。~]#
userdel -Z -r useruuser
6.3. 既存の Linux ユーザーの制限: semanage ログイン
unconfined_u
ユーザー(デフォルトの動作)にマッピングされ、マッピングされる SELinux ユーザーを変更する場合は、semanage login コマンドを使用します。以下の例では、new user という名前の新規
Linux ユーザーを作成し、その Linux ユーザーを SELinux の user_u
ユーザーにマッピングします。
手順6.2 SELinux ユーザーへの Linux ユーザーのマッピング
- root で、新しい Linux ユーザー(new
user
)を作成します。このユーザーはデフォルトのマッピングを使用するため、semanage login -l の出力には表示されません。~]#
useradd newuser~]#
semanage login -l Login 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
ユーザーを SELinux のuser_u
ユーザーにマッピングするには、root で次のコマンドを実行します。~]#
semanage login -a -s user_u newuser-a
オプションは新しいレコードを追加し、-s
オプションは Linux ユーザーをマップする SELinux ユーザーを指定します。最後の引数newuser
は、指定した SELinux ユーザーにマッピングした Linux ユーザーです。 - Linux
newuser
ユーザーおよびuser_u
間のマッピングを表示するには、semanage
ユーティリティーを再度使用します。~]#
semanage login -l Login 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 newuser Changing 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 -Z user_u:user_r:user_t:s0 - Linux
newuser
のセッションからログアウトし、アカウントにログインし直します。Linuxnewuser
ユーザーが必要ない場合は、root で以下のコマンドを入力して、そのホームディレクトリーとともに削除します。~]#
userdel -r newuserroot で Linuxnewuser
ユーザーおよびuser_u
間のマッピングを削除します。~]#
semanage login -d newuser~]#
semanage login -l Login 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__
login にマッピングされます(SELinux unconfined_u
ユーザーにマッピングされます)。新しい Linux ユーザーや、デフォルトで SELinux ユーザーにマッピングされていない Linux ユーザーを使用している場合は、semanage login コマンドでデフォルトのマッピングを変更します。
unconfined_u から user_
u
に変更します。
~]#
semanage login -m -S targeted -s "user_u" -r s0 __default__
__default__
login が user_u
にマッピングされていることを確認します。
~]#
semanage login -l
Login 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 *
default __ ログインに従って user_
u
にマッピングされます。
__default__ ログインを
SELinux unconfined_u
ユーザーにマッピングします。
~]#
semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
6.5. xguest:kiosk モード
xguest_u
に割り当てられています。表3.1「SELinux ユーザー機能」 を参照してください。ファイルの作成や設定の変更など、このアカウントでログイン中に行われた変更は、ログアウト時に失われます。
- root で xguest パッケージをインストールします。必要に応じて依存関係をインストールします。
~]#
yum install xguest - さまざまなユーザーが kiosk アカウントを使用できるようにするために、そのアカウントはパスワード保護ではなく、SELinux が Enforcing モードで実行している場合にのみアカウントを保護できます。このアカウントでログインする前に、
getenforce
ユーティリティーを使用して SELinux が Enforcing モードで実行されていることを確認します。~]$
getenforce Enforcingこの場合、Enforcing モードへの変更に関する情報は、「 「SELinux の状態およびモードの永続的な変更」 」を参照してください。SELinux が Permissive モードになっているか、無効になっている場合は、このアカウントでログインできません。 - GNOME Display Manager(GDM)を使用して、このアカウントにのみログインできます。xguest パッケージがインストールされると、
Guest
アカウントが GDM ログイン画面に追加されます。
6.6. ユーザー実行アプリケーションのブール値
/tmp
ディレクトリーに(ユーザーのパーミッションを継承する)アプリケーションの実行を許可せず、欠陥のあるアプリケーションや悪意のあるアプリケーションが、ユーザーが所有するファイルを変更できないようにします。
setsebool
ユーティリティーで設定できます。これは root で実行する必要があります。setsebool -P コマンドは永続的な変更を行います。再起動後も変更が 維持する必要がない場合は、-P
オプションを使用しないでください。
guest_t
guest_t
ドメインの Linux ユーザーがホームディレクトリーおよび /tmp
でアプリケーションを実行 しないようにするには、以下を実行します。
~]#
setsebool -P guest_exec_content off
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章 Sandbox を使用したプログラムのセキュリティー保護
7.1. Sandbox を使用したアプリケーションの実行
~]# yum install policycoreutils-sandbox
~]$ sandbox [options]
application_under_test
X
オプションを使用します。以下は例になります。
~]$ sandbox -X
evince
-X
は、必要なリソースをコピーし、ユーザーのホームディレクトリー
または /tmp
ディレクトリーにクローズされた仮想環境を作成する前に、アプリケーション(この場合は evince)に制限のあるセカンダリー X サーバーをセットアップするように サンドボックス に指示します。
~]$ sandbox-H
sandbox/home-T
sandbox/tmp-X
firefox
/ home で sandbox/home
が使用され、
/tmp には sandbox/
tmp
が使用されます。異なるアプリケーションが、異なる制限された環境で配置されます。アプリケーションはフルスクリーンモードで実行され、他の機能にアクセスできなくなります。前述のように、sandbox_x_file_t
とラベルが付けられたファイルを除き、ファイルを開くことができません。
sandbox_web_t
ラベルを使用します。たとえば、Firefox を起動するには、以下を実行します。
~]$ sandbox‑X
‑t
sandbox_web_t firefox
sandbox(8)
man ページと、利用可能なオプションの詳細な一覧を参照してください。
第8章 sVirt
非仮想化環境

仮想化環境

8.1. セキュリティーおよび仮想化

8.2. sVirt のラベル付け
~]#
ps -eZ | grep qemu
system_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
表8.1 sVirt ラベル
タイプ | SELinux Context | 説明 |
---|---|---|
仮想マシンプロセス | system_u:system_r:svirt_t:MCS1 | MCS1 は無作為に選択された MCS フィールドです。現在は、約 500,000 のラベルがサポートされています。 |
仮想マシンのイメージ | system_u:object_r:svirt_image_t:MCS1 | 同じ MCS フィールドで設定されたvirt _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 仮想プロセスは、このラベルの付いたファイル/デバイスの読み取りはできません。 |
第9章 セキュアな Linux コンテナー
virsh
コマンドラインユーティリティーを使用することもできます。
第10章 SELinux systemd
アクセス制御
systemd
デーモンによって制御されます。Red Hat Enterprise Linux の以前のリリースでは、デーモンは 2 つの方法で起動できました。
- System V
init デーモンは起動時に init
.rc
スクリプトを起動し、このスクリプトが必要なデーモンを起動した。たとえば、システムの起動時に起動された Apache サーバーは、以下の SELinux ラベルを取得しています。system_u:system_r:httpd_t:s0
- 管理者が
init.rc
スクリプトを手動で起動しているため、デーモンが実行されます。たとえば、Apache サーバーで service httpd restart コマンドが呼び出されると、生成される SELinux ラベルは以下のようになります。unconfined_u:system_r:httpd_t:s0
systemd
デーモンでは、移行は非常に異なります。systemd
は、init _t
タイプを使用して、システム上のデーモンを開始および停止するすべての呼び出しを処理するため、デーモンを手動で再起動する際にラベルのユーザー部分を上書きできます。その結果、上記の両方のシナリオのラベルが想定通りに system_u:system_r:httpd_t:s0
になり、SELinux ポリシーが改善され、どのドメインがどのユニットを制御するかを制御することができます。
10.1. サービスの SELinux アクセスパーミッション
systemd
が全サービスを開始および停止し、ユーザーおよびプロセスが systemctl
ユーティリティーを使用して systemd
と通信できるようになりました。systemd
デーモンには、SELinux ポリシーを確認し、呼び出しているプロセスのラベルと、呼び出し元が管理するユニットファイルのラベルを確認してから、呼び出し元のアクセスを許可するかどうかを SELinux に尋ねることができます。このアプローチにより、システムサービスの開始や停止などの、重要なシステム機能へのアクセス制御が強化されます。
systemctl
を実行して systemd
に D-Bus メッセージを送信し、NetworkManager が要求するサービスを開始または停止することを許可する必要がありました。実際、NetworkManager は systemctl のすべての実行
が可能でした。制限のある管理者を設定して、特定のサービスだけを起動したり、停止したりすることはできません。
systemd
は SELinux Access Manager としても機能します。systemctl
を実行しているプロセスのラベル、または systemd
に D-Bus メッセージを送信したプロセスのラベルを取得できます。次に、デーモンは、プロセスが設定するユニットファイルのラベルを探します。最後に、SELinux ポリシーでプロセスラベルとユニットファイルラベルとの間で特定のアクセスが許可されている場合、systemd
はカーネルから情報を取得できます。これは、特定のサービスに対して、systemd
と相互作用を必要とする、危険にさらされたアプリケーションをSELinux が制限できることを意味します。ポリシー作成者は、このような粒度の細かい制御を使用して、管理者を制限することもできます。ポリシーの変更には、以下のパーミッションのある service
と呼ばれる新しいクラスが含まれます。
class service { start stop status reload kill load enable disable }
systemd
のアクセス制御操作は、すべてのケースで一致しません。SELinux アクセスチェックで systemd
メソッド呼び出しを行わるようにマッピングを定義しました。表10.1「SELinux アクセスチェックにおける systemd ユニットファイルメソッド呼び出しのマッピング」 はユニットファイルへのアクセスチェックをマッピングし、表10.2「SELinux アクセスチェックにおける systemd の一般的なシステムコールのマッピング」 は一般的なシステムのアクセスチェックに対応します。いずれかのテーブルに一致が見つからない場合は、未定義の
システムチェックが呼び出されます。
表10.1 SELinux アクセスチェックにおける systemd ユニットファイルメソッド呼び出しのマッピング
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 |
StopUnit | stop |
TryRestart | start |
TryRestartUnit | start |
UnmaskUnitFiles | enable |
表10.2 SELinux アクセスチェックにおける systemd の一般的なシステムコールのマッピング
systemd の一般システムコール | SELinux アクセスチェック |
---|---|
ClearJobs | reboot |
FlushDevices | halt |
GET | status |
GetAll | status |
GetJob | status |
GetSeat | status |
GetSession | status |
GetSessionByPID | status |
GetUser | status |
halt | halt |
イントロスペクション | status |
kexec | reboot |
KillSession | halt |
KillUser | halt |
ListJobs | status |
ListSeats | status |
ListSessions | status |
ListUsers | status |
LockSession | halt |
PowerOff | halt |
再起動 | reboot |
SetUserLinger | halt |
TerminateSeat | halt |
TerminateSession | halt |
TerminateUser | halt |
例10.1 システムサービス用の SELinux ポリシー
sesearch
ユーティリティーを使用して、システムサービスのポリシールールを一覧表示できます。たとえば、se search -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 } ;
10.2. SELinux および journald
systemd
では、journald
デーモン( systemd-journal
としても知られている)は、ロギングデータを収集して保存するシステムサービスである syslog
ユーティリティーの代替です。これは、カーネルから受信したロギング情報、システムサービスの標準およびエラー出力、またはネイティブ API を使用して、カーネルから受信したロギング情報に基づいて構造化 および
インデックス化されたジャーナルを作成し、維持します。セキュアな方法で、各ログメッセージに対して多数のメタデータフィールドを暗黙的に収集します。
systemd-journal
サービスを SELinux とともに使用して、セキュリティーを強化できます。SELinux は、設計されている内容を実行させることのみを許可することでプロセスを制御します。ポリシーライターのセキュリティー目標によっては、より少ない場合もあります。たとえば、SELinux は、危険にさらされた ntpd
プロセスが、ネットワーク時間以外の処理を防ぎます。ただし、ntpd
プロセスは syslog
メッセージを送信するため、SELinux が危険にさらされたプロセスがこれらのメッセージを送信し続けます。危険にさらされた ntpd
は、他のデーモンと誤って一致させるために syslog
メッセージをフォーマットするか、または管理者を誤って使用したり、syslog ファイルを読み取る
ユーティリティーをシステム全体にまとめるユーティリティーです。
systemd-journal
デーモンはすべてのログメッセージを検証し、その他の理由で SELinux ラベルをそのメッセージに追加します。これにより、ログメッセージで不整合を簡単に検出し、発生する前にこのタイプの攻撃を防ぐことができます。journalctl
ユーティリティーを使用して、systemd
ジャーナルのログをクエリーできます。コマンドライン引数を指定しないと、このコマンドを実行すると、最も古いエントリーから開始する、ジャーナルの完全な内容が一覧表示されます。システムコンポーネントのログなど、システムで生成されたすべてのログを表示するには、root で journalctl
を実行します。root 以外のユーザーとして実行すると、出力は現在ログインしているユーザーに関連するログにのみ制限されます。
例10.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 ページを参照してください。
第11章 トラブルシューティング
audit2allow
でのカスタムポリシーモジュールの作成を説明します。
11.1. アクセスが拒否されたときにどのような Happens になるか
/var/log/audit/audit.log
/var/log/messages
/var/log/audit/audit.log
.読みやすい拒否メッセージも /var/log/messages
に送信されるsetroubleshootd
デーモンおよび auditd
デーモンが実行していると、SELinux によるアクセスを拒否すると警告が表示されます。

Forbidden You don't have permission to access file name on this server
/var/log/messages および /var/
log/audit/audit.log
で 「SELinux is preventing」と 「denied」
エラーをそれぞれチェックしてください。これには、root ユーザーで以下のコマンドを実行します。
~]#
grep "SELinux is preventing" /var/log/messages
~]#
grep "denied" /var/log/audit/audit.log
11.2. 最も大きな 3 つの原因
11.2.1. ラベル付けの問題
/var/www/html/
を Web サイトに使用する代わりに、管理者は /srv/myweb/
を使用します。Red Hat Enterprise Linux では、/srv
ディレクトリーには var_t
タイプのラベルが付けられます。/srv
で作成されるファイルおよびディレクトリーは、このタイプを継承します。また、最上位のディレクトリー( /myserver
など)で新たに作成されたオブジェクトには default_t
タイプのラベルが付けられる場合があります。SELinux は、Apache HTTP Server (httpd
) がこの両方のタイプにアクセスできないようにします。アクセスを許可するには、SELinux は、/srv/myweb/
のファイルが httpd
からアクセスできることを認識する必要があります。
~]#
semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
/srv/myweb/
ディレクトリー(およびその下のすべてのファイルおよびディレクトリー)のコンテキストを SELinux ファイルコンテキスト設定に追加します。[8].semanage
ユーティリティーはコンテキストを変更しません。root で restorecon
ユーティリティーを実行して変更を適用します。
~]#
restorecon -R -v /srv/myweb
11.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.html
restorecon 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 コンテキストの確認」 を参照してください。
11.2.2. 機密サービスの実行方法
httpd_can_network_connect_db
のブール値を有効にします。
~]#
setsebool -P httpd_can_network_connect_db on
getsebool
ユーティリティーおよび grep
ユーティリティーを使用して、アクセスを許可するブール値が利用できるかどうかを確認します。たとえば、getsebool -a | grep ftp コマンドを使用して FTP 関連のブール値を検索します。
~]$
getsebool -a | grep ftp
ftpd_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
ポート番号
http
関連のポートを一覧表示します。
~]#
semanage port -l | grep http
http_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
がポート 9876 でリッスンする (Listen 9876
) ように、管理者が httpd.conf
を設定していれば、これを反映するようにポリシーが更新されていないと、以下のコマンドに失敗します。
~]#
systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
~]#
systemctl status httpd.service
httpd.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_socket
httpd
が http_port_t
ポートタイプに記載されていないポートをリッスンできるようにするには、semanage port コマンドを入力して、そのポートをポリシー設定に追加します。[9]:
~]#
semanage port -a -t http_port_t -p tcp 9876
-a
オプションは新規レコードを追加します。-t
オプションはタイプを定義し、-p
オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。
11.2.3. 進化したルールおよびアプリケーション
audit2allow
ユーティリティーを使用して、アクセスを許可するカスタムポリシーモジュールを作成します。audit2allow
の使用に関する詳細は、「アクセスの許可: audit2allow」 を参照してください。
/etc/selinux/targeted/contexts/files/
のファイルは、ファイルとディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon
ユーティリティーおよび setfiles
ユーティリティーで読み取り、ファイルとディレクトリーをデフォルトのコンテキストに復元します。
/etc/selinux/targeted/modules/active/ports.local
ファイルに追加します。デフォルトでは、このファイルは root にのみ表示できることに注意してください。
11.3. 問題の解決
audit2allow
を使用したカスタムポリシーモジュールの作成。
11.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
をそのユーザーに置き換えます。
11.3.2. 重大なサービス拒否攻撃の可能性
~]# semodule -DB
-D
オプションは、dotaudit ルールを無効にします。- B
オプションは再ビルドポリシーです。semodule -DB を実行した後、パーミッションの問題が発生したアプリケーションを見てみ、SELinux 拒否(アプリケーションに関連する)がログに記録されているかどうかを確認します。dotaudit ルールで無視し、処理される拒否を決定する際には注意が必要です。不明な場合やガイダンスを検索する場合は、fedora-selinux-list などの SELinux 一覧で他の SELinux ユーザーおよび開発者に問い合わせます。
dontaudit
ルールを再構築するには、root で次のコマンドを実行します。
~]# semodule -B
-s domain
オプションと grep コマンドを使用した検索を絞り込みます。以下は例になります。
~]$
sesearch --dontaudit -s smbd_t | grep squid
dontaudit smbd_t squid_port_t : tcp_socket name_bind ;
dontaudit smbd_t squid_port_t : udp_socket name_bind ;
11.3.3. サービスの man ページ
httpd
など)など、貴重な情報が含まれています。この情報は、標準の man ページや man ページにあり、sepolicy の man ユーティリティーを使用して
、全サービスドメインの SELinux ポリシーから自動的に生成できます。このような man ページは service-name_selinux
形式で名前が付けられます。このような man ページは、selinux-policy-doc パッケージにも同梱されています。
- samba: samba_selinux(8) の man ページでは、
samba_enable_home_dirs
Boolean を有効にすると、Samba がユーザーのホームディレクトリーを共有できることが説明されています。 - nfs: nfsd_selinux(8) の man ページでは、ユーザーが nfsd プロセスを可能な限り安全な方法で設定できるようにする SELinux nfsd ポリシーを説明します。
sepolicy の man の詳細は 「手動ページの生成: sepolicy の man」 を参照してください
。
11.3.4. Permissive ドメイン
- 1 つのプロセス(ドメイン)を Permissive を実行して、Permissive を行い、システム全体を危険にさらすことなく問題のトラブルシューティングを行うことができます。
- 管理者は、新しいアプリケーションのポリシーを作成できます。以前は、最小ポリシーを作成し、マシン全体が Permissive モードに配置され、アプリケーションが実行できるようになりましたが、SELinux 拒否がログに記録されるようになっています。その後、
audit2allow
を使用して、ポリシーの作成に役立ちます。これにより、システム全体が危険にさらされます。Permissive ドメインでは、システム全体を危険にさらすことなく、新しいポリシーのドメインのみを Permissive とマークできます。
11.3.4.1. ドメイン Permissive の作成
httpd_t
ドメイン(Apache HTTP Server が実行されるドメイン)permissive を設定します。
~]#
semanage permissive -a httpd_t
~]#
semodule -l | grep permissive
permissive_httpd_t (null)
permissivedomains (null)
~]#
semanage permissive -d httpd_t
11.3.4.2. Permissive ドメインの無効化
permissivedomains.pp
モジュールには、システムに表示される Permissive ドメイン宣言がすべて含まれます。Permissive ドメインをすべて無効にするには、root で以下のコマンドを入力します。
~]#
semodule -d permissivedomains
~]#
semodule --list-modules=full
11.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
ドメインは許容されないため、アクションが拒否され、SYSCALL
メッセージには success=no
が含まれます。以下は、httpd_t ドメイン
を許容できるように semanage permissive -a httpd_t コマンドを実行して、同じ状況に対する AVC 拒否の例です。
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
で示されているようにアクセスは拒否されませんでした。
11.3.5. サービス拒否検索および表示
auditd
、rsyslogd
、および setroubleshootd
デーモンが実行していることを前提としています。これらのデーモンの起動に関する詳細は、「使用されているログファイル」 を参照してください。ausearch
、aureport、sealert
など、SELinux AVC メッセージの検索および表示には、多くのユーティリティー
が利用できます。
ausearch
監査
デーモンログをクエリーできる ausearch ユーティリティーを提供します。[10] ausearch
ユーティリティーは /var/log/audit/audit.log
にアクセスするため、root ユーザーとして実行する必要があります。
c comm-name
オプションを使用します。ここで、comm -name は実行可能ファイルの名前です(Apache HTTP Server の httpd
、Samba の smbd
など)。
~]#
ausearch -m avc -c httpd
~]#
ausearch -m avc -c smbd
--interpret
(-i
)オプション、またはスクリプト処理に --raw
(-r
)オプションを使用することが推奨されます。その他の ausearch オプションについては、ausearch(8) man ページを参照してください。
aureport
aureport
ユーティリティーを提供し、監査ログの概要レポートを生成します。[11] aureport
ユーティリティーは /var/log/audit/audit.log
にアクセスするため、root ユーザーとして実行する必要があります。SELinux 拒否メッセージのリストと、それぞれが発生した頻度を表示するには、aureport -a コマンドを実行します。以下は、2 つの拒否を含む出力例です。
~]#
aureport -a
AVC 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
ユーティリティーを提供します。[12] 拒否には、/var/log/messages
に示される ID が割り当てられます。以下は、メッセージ
の拒否例です。
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 によるアクセスを拒否すると警告が表示されます。

Show
boot the sealert
GUI をクリックすると、問題のトラブルシューティングを行うことができます。

11.3.6. 生の監査メッセージ
/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 }
- 中括弧内の項目は、拒否されたパーミッションを示します。The
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 コンテキストこの場合、
httpd_t
ドメインで実行されている Apache HTTP Server の SELinux コンテキストです。 - tcontext="unconfined_u:object_r:samba_share_t:s0"
- プロセスがアクセスを試みたオブジェクト(ターゲット)の SELinux コンテキストこの例では、これが
file1
の SELinux コンテキストです。samba_share_t
タイプは、httpd_t
ドメインで実行しているプロセスにアクセスできないことに注意してください。特定の状況では、tcontext
が一致することがあります。たとえば、
プロセスがユーザー ID などの実行中のプロセスの特性を変更するシステムサービスの実行を試みる場合などです。また、tcontext
は、プロセスが通常の制限を許可するよりも多くのリソース(メモリーなど)を使用しようとするとscontext
と一致する可能性があり、そのプロセスがこれらの制限を壊してしまうかどうかについてセキュリティーチェックが可能になります。
SYSCALL
)メッセージから、以下の 2 つの項目があります。
success=no
: 拒否(AVC)が強制されたかどうかを示します。success=no
は、システムコールが成功したことを示しています(SELinux がアクセスを拒否した)。success=yes
は、システムコールが成功したことを示します。これは、permissive ドメインまたは制限のないドメイン(unconfined_service_t や
など)で確認できます。kernel_t
exe="/usr/sbin/httpd"
: プロセスを起動した実行可能ファイルへの完全パスはexe="/usr/sbin/httpd"
になります。
context
)をターゲットコンテキスト(tcontext
)と比較します。プロセス(scontext
)は、このようなオブジェクト(tcontext
)にアクセスするか?たとえば、Apache HTTP Server(httpd_t
)は、httpd_sys_content_t
、public_content_t
など、httpd_selinux(8) man ページで指定されたタイプにのみアクセスする必要があります(特に設定されていない限り)。
11.3.7. sealert メッセージ
/var/log/messages
に示される ID が割り当てられます。以下は、Apache HTTP Server( httpd_t ドメインで実行)が /var/www/html/file1
ファイル(samba_ share_t
タイプでラベル付け)にアクセスしようとすると発生する AVC 拒否(ログに記録された メッセージ
)の例です。
hostname setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
~]$
sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
SELinux is preventing httpd from getattr access on the file /var/www/html/file1.
***** Plugin restorecon (92.2 confidence) suggests ************************
If you want to fix the label.
/var/www/html/file1 default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/file1
***** Plugin public_content (7.83 confidence) suggests ********************
If you want to treat file1 as public content
Then you need to change the label on file1 to public_content_t or public_content_rw_t.
Do
# semanage fcontext -a -t public_content_t '/var/www/html/file1'
# restorecon -v '/var/www/html/file1'
***** Plugin catchall (1.41 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the file1 file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp
Additional Information:
Source Context system_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 httpd
Port <Unknown>
Host hostname.redhat.com
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.13.1-166.el7.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name hostname.redhat.com
Platform Linux hostname.redhat.com
3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57
EDT 2017 x86_64 x86_64
Alert Count 2
First Seen 2017-07-20 02:52:11 EDT
Last Seen 2017-07-20 02:52:11 EDT
Local ID 32eee32b-21ca-4846-a22f-0ba050206786
Raw Audit Messages
type=AVC msg=audit(1500533531.140:295): avc: denied { getattr } for pid=24934 comm="httpd" path="/var/www/html/file1" dev="vda1" ino=31457414 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
Hash: httpd,httpd_t,samba_share_t,file,getattr
- サマリー
- 拒否されたアクションの概要。これは、
/var/log/messages
の拒否と同じです。この例では、httpd
プロセスにより、samba_share_t タイプの
へのアクセスが拒否されました。ラベルが付けられたファイル(file
1) - 詳細な説明
- さらに詳細な説明があります。この例では、
file1
にsamba_share_t
タイプのラベルが付けられています。このタイプは、Samba を使用してエクスポートするファイルおよびディレクトリーに使用されます。この説明では、これらのアクセスが必要な場合に、Apache HTTP Server および Samba がアクセス可能なタイプにタイプを提案します。 - アクセスの許可
- アクセスを許可するための提案。これは、ファイルの再ラベル付け、ブール値の有効化、またはローカルポリシーモジュールの作成が必要になる場合があります。この場合、提案は Apache HTTP Server と Samba の両方がアクセスできるタイプでファイルにラベルを付けることです。
- 修正コマンド
- アクセスを許可し、拒否を解決するための推奨されるコマンドです。この例では、
file1
タイプをpublic_content_t
に変更するコマンドを提供します。これは、Apache HTTP Server および Samba からアクセスできます。 - 追加情報
- ポリシーパッケージ名やバージョン(
selinux-policy-3.13.1-166.el7.noarch
)などのバグレポートで便利な情報ですが、拒否の原因の解決に役立たない可能性があります。 - 生の監査メッセージ
- 拒否に関連付けられた
/var/log/audit/audit.log
からの生の監査メッセージ。AVC 拒否の各項目の詳細は、「生の監査メッセージ」 を参照してください。
11.3.8. アクセスの許可: audit2allow
audit2allow
ユーティリティーの使用を示すためにのみ使用されます。
audit2allow
ユーティリティーは、拒否された操作のログから情報を収集してから、SELinux ポリシー allow ルールを生成します。[13] 「sealert メッセージ」 に従って拒否メッセージを分析し、ラベルの変更やブール値が許可されない場合は、audit2allow
を使用してローカルポリシーモジュールを作成します。SELinux でアクセスが拒否されると、audit2allow
を実行すると、以前拒否したアクセスを許可する Type Enforcement ルールが生成されます。
audit2allow
を使用して、SELinux 拒否を確認する際に、最初のオプションとしてローカルポリシーモジュールを生成することはできません。トラブルシューティングは、ラベル付けの問題があるかどうかを最初に確認します。2 番目に多いのが、SELinux が、プロセスの設定変更を認識していない場合です。詳細は「SELinux Errors white paper」の「 Four Key Causes of SELinux Errors white paper」を参照してください。
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:s0
tclass=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)この例では、cert watch は、var_t
タイプのラベルが付けられたディレクトリーへの書き込みアクセスを拒否しました。「sealert メッセージ」 に従って拒否メッセージを分析します。ラベルの変更やブール値がアクセスが許可されていない場合は、audit2allow
を使用してローカルポリシーモジュールを作成します。 - 以下のコマンドを実行して、アクセスが拒否された理由について、人間が判読できる説明を生成します。
audit2allow
ユーティリティーは/var/log/audit/audit.log
を読み取るため、root ユーザーで実行する必要があります。~]#
audit2allow -w -a type=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
)にコンパイルします。~]#
ls mycertwatch.pp mycertwatch.teモジュールをインストールするには、root で以下のコマンドを入力します。~]#
semodule -i mycertwatch.pp重要audit2allow
で作成されたモジュールは、必要なよりも多くのアクセスを許可することができます。audit2allow
で作成したポリシーを、アップストリームの SELinux 一覧に投稿してレビューすることが推奨されます。 ポリシーにバグがあると思われる場合は、Red Hat Bugzilla でバグを作成します。
grep
ユーティリティーを使用して audit2allow
の入力を絞り込みます。以下の例では、grep
を使用して audit2allow
で certwatch
に関連する拒否メッセージのみを送信する方法を示しています。
~]#
grep certwatch /var/log/audit/audit.log | audit2allow -R -M mycertwatch2
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i mycertwatch2.pp
第12章 追加情報
12.1. コントリビューター
- Dominick Grift - Technical Editor
- Murray McAllister - Red Hat Product Security
- James Morris - Technical Editor
- Eric Paris: Technical Editor
- Scott Radvan - Red Hat Customer Content Services
- Daniel Walsh - Red Hat Security Engineering
12.2. その他リソース
Fedora
- Fedora SELinux FAQ: https://fedoraproject.org/wiki/SELinux_FAQ
NSA(National Security Agency)
- SELinux のメイン Web サイト: https://www.nsa.gov/what-we-do/research/selinux/
- SELinux メーリングリスト: https://www.nsa.gov/what-we-do/research/selinux/mailing-list.shtml
Tresys Technology
SELinux GitHub リポジトリー
- SELinux プロジェクト: https://github.com/SELinuxProject
- Tresys Technology: https://github.com/TresysTechnology/
SELinux Project Wiki
- ドキュメントへのリンク、メーリングリスト、Web サイト、ツールなどのユーザーリソース http://selinuxproject.org/page/User_Resources
SELinux Notebook - Foundations - 4th Edition
Digitalocean:「Introduction to SELinux on CentOS 7」
IRC
- #selinux
- #fedora-selinux
パート II. 機密サービスの管理
第13章 Apache HTTP サーバー
~]$ rpm -q httpd
package httpd is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install httpd
13.1. Apache HTTP サーバーおよび SELinux
httpd
)はデフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している httpd
プロセスを示しています。この例では、httpd、setroubleshoot、setroubleshoot-server および policycoreutils-python パッケージがインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root で以下のコマンドを入力して、
httpd
を起動します。~]# systemctl start httpd.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status httpd.service httpd.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 httpd system_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 httpd
httpd
プロセスに関連する SELinux コンテキストは、system_u:system_r:httpd_t:s0
です。2 番目のコンテキストの最後の部分であるhttpd_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、httpd プロセスはhttpd
_t
ドメインで実行されます。
httpd_t
など)で実行されているプロセスが、ファイル、その他のプロセス、および一般的なシステムと対話する方法を定義します。httpd
アクセスを許可するには、ファイルに適切にラベル付けする必要があります。たとえば、httpd は httpd
_sys_content_t
タイプのラベルが付いたファイルを読み取りできますが、Linux(DAC)パーミッションで書き込み権限が許可されていても、書き込みはできません。スクリプトネットワークアクセス、NFS および CIFS ボリュームに httpd
アクセスを許可し、httpd が Common Gateway Interface(CGI) スクリプトを実行できる
など、特定の動作を可能にするブール値を有効にする必要があります。
/etc/httpd/conf/httpd.conf
ファイルが設定されると、httpd
は TCP ポート 80、443、488、8008、8009、または 8443 以外のポートでリッスンするように、semanage port コマンドを使用して、SELinux ポリシー設定に新しいポート番号を追加する必要があります。以下の例は、httpd の SELinux ポリシー設定でまだ定義されていないポートをリッスンするように httpd
を設定する方法を示しています。その結果、httpd が起動に失敗し
ます。また、この例では、httpd
がポリシーに定義されていない標準以外のポートで正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、httpd パッケージがインストールされていることを前提としています。以下の例で各コマンドを root ユーザーとして実行します。
- 以下のコマンドを入力して、
httpd が実行していない
ことを確認します。~]# systemctl status httpd.service httpd.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_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
- root で
/etc/httpd/conf/httpd.conf
ファイルを編集します。Listen
オプションを設定します。これにより、httpd
の SELinux ポリシー設定で設定されていないポートが一覧表示されます。この例では、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.service Job 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 をリッスンできるようにするには、以下のコマンドが必要です。~]# 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 12345 Trying 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. types
/var/www/html/
ディレクトリーに新しいファイルを作成し、親ディレクトリーから httpd_sys_content_t
タイプを継承するファイル(/var/www/html/
)を継承します。
- 以下のコマンドを実行して、
/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
タイプのラベルが付けられます。 - 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
httpd_sys_content_t
タイプのラベルが付いた file1
を表示します。SELinux では、Linux パーミッションで書き込みアクセスを許可する場合でも、httpd
がこのタイプのラベルが付いたファイルを読み取りできますが、書き込みはできません。SELinux ポリシーは、httpd _t
ドメイン( httpd
の実行)で実行中のプロセスが読み書きできるタイプを定義します。これにより、別のプロセスで使用するプロセスが想定されているファイルにアクセスできないようになります。
httpd は httpd
_sys_content_t
タイプのラベルが付いたファイルにアクセスできますが(Apache HTTP Server の場合)、デフォルトでは samba_share_t
タイプのラベルが付いたファイルにアクセスすることはできません。また、ユーザーのホームディレクトリーのファイルには、user_home_t
タイプのラベルが付けられます。デフォルトでは、httpd
がユーザーのホームディレクトリーのファイルの読み取りや書き込みを防ぎます。
を示しています
。異なるタイプを使用すると、柔軟なアクセスを設定できます。
httpd_sys_content_t
- 静的 Web サイト
が使用する
静的な Web コンテンツには、このタイプを使用します。このタイプのラベルが付けられたファイルは、httpd およびhttpd
が実行するスクリプトにアクセス(読み取り専用)されます。
デフォルトでは、このタイプのラベルが付けられたファイルおよびディレクトリーは、httpd
またはその他のプロセスに書き込むことはできず、変更することができません。デフォルトでは、/var/www/html/
ディレクトリーに作成またはコピーされたファイルにはhttpd_sys_content_t
タイプのラベルが付けられていることに注意してください。 httpd_sys_script_exec_t
- このタイプは、httpd が
実行するスクリプト
に使用します。このタイプは、/var/www/cgi-bin/
ディレクトリーの Common Gateway Interface(CGI)スクリプトに一般的に使用されます。デフォルトでは、SELinux ポリシーにより、httpd
が CGI スクリプトを実行しないようにします。これを許可するには、スクリプトをhttpd_sys_script_exec_t
タイプでラベルを付け、httpd_enable_cgi
ブール値を有効にします。httpd で実行すると、httpd_sys_script_exec_t ドメインで実行される
ドメインで実行されます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_rw_content_t
タイプを使用して、httpd_sys_script_exec_t
タイプでラベルが付けられたスクリプトによって読み書きされるファイルに記述する必要があります。 httpd_sys_ra_content_t
- このタイプのラベルが付けられたファイルは、
httpd_sys_script_exec_t
タイプのラベルが付いたスクリプトで追加できますが、他のタイプのラベルが付いたスクリプトで変更することはできません。httpd_sys_ra_content_t
タイプを使用して、httpd_sys_script_exec_t
タイプでラベルが付いたスクリプトで読み込まれ、追加されたファイルにラベルを付ける必要があります。 httpd_unconfined_script_exec_t
- SELinux の保護なしに、このタイプの run でラベルが付けられたスクリプトです。その他のオプションをすべて使い切った後、このタイプは複雑なスクリプトにのみ使用してください。
httpd
の SELinux 保護を無効にする場合、またはシステム全体で SELinux の保護を無効にする代わりに、このタイプの方法を使用することが推奨されます。
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts
手順13.1 SELinux コンテキストの変更
index.html
ファイルを作成し 、
そのファイルおよびディレクトリーに httpd
アクセスを許可するようにラベル付けします。
mkdir
ユーティリティーを root として使用して、httpd
が使用する最上位のディレクトリー構造を作成します。~]# mkdir -p /my/website
- file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_t
タイプのラベルが付けられる場合があります。このタイプは、制限のあるサービスからはアクセスできません。~]$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
- root で以下のコマンドを入力し、my
/
ディレクトリーおよびサブディレクトリーのタイプを、httpd にアクセス可能なタイプに変更します。
/my/website/
で作成されたファイルは、default
タイプを継承するため、httpd にアクセスできるようになりました。_t タイプではなく httpd_sys_content
_t~]# 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
httpd
で使用する新しいディレクトリーと index.html
ファイルを作成し、そのディレクトリーおよびファイルのラベルを永続的に変更して、httpd
アクセスを許可する方法を示しています。
mkdir
ユーティリティーを root として使用して、httpd
が使用する最上位のディレクトリー構造を作成します。~]# mkdir -p /my/website
- root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
"/my(/.*)?"
式は、ラベルの変更がmy/
ディレクトリーおよびそれ下のすべてのファイルおよびディレクトリーに適用されることを意味します。 - root として
touch
ユーティリティーを使用して、新規ファイルを作成します。~]# touch /my/website/index.html
- root で以下のコマンドを入力してラベルの変更を適用します(手順2 で semanage コマンドにより変更された file-context 設定)。
~]# 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. ブール値
httpd_anon_write
ブール値を有効にするには、root ユーザーとして以下のコマンドを入力します。
~]# setsebool -P httpd_anon_write on
~]# setsebool -P httpd_anon_write off
P
オプションを使用しないでください。
httpd
の実行方法に cater で使用できる一般的なブール値の説明です。
httpd_anon_write
- このブール値により、
httpd
はpublic_content_rw_t
タイプのラベルが付いたファイルの読み取りのみが許可されます。このブール値を有効にすると、httpd
はパブリックファイル転送サービスのファイルを含むパブリックディレクトリーなどの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
- このブール値は、HTTP スクリプトが、パブリックファイル転送サービスで使用される
public_content_rw_t
タイプのラベルが付いたファイルへの書き込みアクセスを許可するかどうかを定義します。 httpd_builtin_scripting
- このブール値は、
httpd
スクリプトへのアクセスを定義します。このブール値を有効にすると、PHP コンテンツに必要となることがよくあります。 httpd_can_network_connect
- 無効にすると、このブール値により、HTTP スクリプトとモジュールがネットワークポートまたはリモートポートへの接続を開始できなくなります。このブール値を有効にして、このアクセスを許可するようにします。
httpd_can_network_connect_db
- 無効にすると、このブール値により、HTTP スクリプトとモジュールがデータベースサーバーへの接続を開始できなくなります。このブール値を有効にして、このアクセスを許可するようにします。
httpd_can_network_relay
httpd
を正引きまたはリバースプロキシーとして使用する場合は、このブール値を有効にします。httpd_can_sendmail
- 無効にすると、このブール値により、HTTP モジュールがメールが送信されなくなります。これにより、スパム攻撃が
httpd
に存在することを防ぐことができます。このブール値を有効にして、HTTP モジュールがメールを送信できるようにします。 httpd_dbus_avahi
- 無効にすると、このブール値は
D-Bus
を介したavahi
サービスへのhttpd
アクセスを拒否します。このブール値を有効にして、このアクセスを許可するようにします。 httpd_enable_cgi
- 無効にすると、このブール値により、
httpd
が CGI スクリプトを実行できなくなります。このブール値を有効にして、httpd がCGI スクリプトを実行
できるようにします(CGI スクリプトにはhttpd_sys_script_exec_t
タイプでラベル付けする必要があります)。 httpd_enable_ftp_server
- このブール値を有効にすると、
httpd
は FTP ポートでリッスンし、FTP サーバーとして機能します。 httpd_enable_homedirs
- 無効にすると、このブール値により、
httpd
がユーザーのホームディレクトリーにアクセスできなくなります。このブール値を有効にして、httpd がユーザーのホームディレクトリーにアクセスできるように
します(例:/home/*/
のコンテンツ)。 httpd_execmem
- このブール値を有効にすると、
httpd
が、実行可能および書き込み可能なメモリーアドレスを必要とするプログラムを実行できます。このブール値を有効にすると、バッファーオーバーフローに対する保護が削減されますが、特定のモジュールやアプリケーション(Java や Mono アプリケーションなど)にはこの権限が必要なため、このブール値を有効にすることは推奨されていません。 httpd_ssi_exec
- このブール値は、Web ページのサーバー側の include(SSI)要素を実行できるかどうかを定義します。
httpd_tty_comm
- このブール値は、
httpd
が制御する端末へのアクセスを許可するかどうかを定義します。通常、このアクセスは必要ありませんが、SSL 証明書ファイルの設定など、パスワードプロンプトを表示および処理するには端末アクセスが必要になります。 httpd_unified
- このブール値を有効にすると、
httpd_t
がすべてのhttpd
タイプ(実行、読み取り、または書き込み)へのアクセスを許可します。無効にすると、読み取り専用、書き込み可能な、または実行ファイルである 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 サイト用のファイルを格納する新しいディレクトリーを作成します。
mkdir
ユーティリティーを root として使用して、トップレベルのディレクトリーを作成します。~]# mkdir /mywebsite
- root で
/mywebsite/index.html
ファイルを作成します。/mywebsite/index.html
に以下のコンテンツをコピーアンドペーストします。<html> <h2>index.html from /mywebsite/</h2> </html>
- Apache HTTP Server が
/mywebsite/
へのアクセスのみを許可し、その下のファイルおよびサブディレクトリーを許可するには、httpd_sys_content_t
タイプのディレクトリーにラベルを付けます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
- root として
restorecon
ユーティリティーを使用して、ラベルを変更します。~]# restorecon -R -v /mywebsite restorecon 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
- この例では、
/etc/httpd/conf/httpd.conf
ファイルを root として編集します。既存のDocumentRoot
オプションをコメントアウトします。aDocumentRoot "/mywebsite"
オプションを追加します。編集後、これらのオプションは以下のようになります。#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
- root で以下のコマンドを実行して、Apache HTTP Server のステータスを確認します。サーバーが停止している場合は、起動します。
~]# systemctl status httpd.service httpd.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.service httpd.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
タイプにアクセスできるサービスを制御できます。
httpd_use_nfs
ブール値を有効にして、httpd
が NFS ボリュームにアクセスして共有できるようにします( nfs_t
タイプでラベル付け)。
~]# setsebool -P httpd_use_nfs on
httpd_use_cifs
ブール値を有効にして、httpd が CIFS ボリューム にアクセスして
共有できるようにします(labeled に cifs_t
タイプでラベル付け)。
~]# setsebool -P httpd_use_cifs on
P
オプションを使用しないでください。
13.4.3. サービス間でのファイルの共有
httpd_sys_content_t
タイプのラベルが付いたファイルを読み込むことができません。必要なファイルに public_content_ t または public_content_rw_t
タイプでラベルが付けられている場合、ファイルは Apache HTTP Server、FTP、rsync
、および Samba 間で共有できます。
mkdir
ユーティリティーを root として使用して、複数のサービス間でファイルを共有する新しい最上位ディレクトリーを作成します。~]# mkdir /shares
- file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_t
タイプのラベルが付けられる場合があります。このタイプは、制限のあるサービスからはアクセスできません。~]$ ls -dZ /shares drwxr-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>
public_content_t
タイプで/shares/
にラベルを付けると、Apache HTTP Server、FTP、rsync、および Samba による読み取り専用アクセスが許可されます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。~]# 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-client samba-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 testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
上記のコマンドを実行して、システムに存在しないアカウントのユーザー名を指定すると、Cannotlocate Unix account for 'username'! error になります
。 - Samba サービスを起動します。
~]# systemctl start smb.service
- 以下のコマンドを入力して、利用可能な共有の一覧を表示します。username は、手順 3 で追加した Samba アカウントです。パスワードの入力を求められたら、ステップ 3 で Samba アカウントに割り当てられたパスワードを入力します(バージョン番号が異なる場合があります)。
~]$ smbclient -U username -L localhost Enter 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共有のマウント
に使用されます。~]# mkdir /test/
- root で以下のコマンドを実行して、
Samba
共有の共有を/test/
にマウントします。username は、手順 3 のユーザー名に置き換えます。~]# mount //localhost/shares /test/ -o user=username
ステップ 3 で設定した ユーザー名のパスワード を入力します。 - Samba で共有されるファイルの内容を表示します。
~]$ cat /test/index.html <html> <body> <p>Hello</p> </body> </html>
/shares/
を共有するには、以下を行います。
- httpd パッケージがインストールされていることを確認します(バージョン番号が異なる場合があります)。
~]$ rpm -q httpd httpd-2.2.11-6.i386
このパッケージがインストールされていない場合は、root でyum
ユーティリティーを使用してインストールします。~]# yum install httpd
/var/www/html/
ディレクトリーに移動します。root で以下のコマンドを実行して、/shares/
ディレクトリーへのリンク(名前付き共有
)を作成します。html]# ln -s /shares/ shares
- Apache HTTP Server を起動します。
~]# systemctl start httpd.service
- Web ブラウザーを使用して
http://localhost/shares
に移動します。/shares/index.html
ファイルが表示されます。
index.html
ファイルが存在する場合は読み取ります。/shares/
に index.html がなく
、代わりに file1
、file2
、および file3
がある場合は 、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.service httpd.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
ユーティリティーを使用して、httpd がリッスンするポート
の一覧を表示します。
~]# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
httpd
が TCP ポート 80、443、488、8008、8009、または 8443 をリッスンできるようにします。httpd
が http_port_t
に記載されていないポートをリッスンするように /etc/httpd/conf/httpd.conf
を設定すると、httpdは起動に失敗し
ます。
httpd
を設定するには、以下を実行します。
Listen
オプションがhttpd
用の SELinux ポリシーで設定されていないポートを一覧表示するように、root として/etc/httpd/conf/httpd.conf
ファイルを編集します。以下の例では、httpd
が 10.0.0.1 IP アドレスと 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_t http_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 installed
yum
ユーティリティーを使用してインストールします。
~]# yum install samba
14.1. Samba および SELinux
smbd
)はデフォルトで制限のある実行されます。制限のあるサービスは独自のドメインで実行され、他の制限のあるサービスから分離されます。以下の例は、独自のドメインで実行している smbd
プロセスを示しています。この例では、samba パッケージがインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root で次のコマンドを実行し、
smbd
を起動します。~]# systemctl start smb.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status smb.service smb.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 smb system_u:system_r:smbd_t:s0 9653 ? 00:00:00 smbd system_u:system_r:smbd_t:s0 9654? 00:00:00 smbd
smbd プロセスに関連付けられた SELinux コンテキストは、system
です。次のコンテキストの最後の部分は_u:system_r:smbd
_t:s0smbd_t
です。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、smbd プロセスは smbd
_t
ドメインで実行されます。
smbd
がアクセスして共有できるように、ファイルに適切にラベル付けする必要があります。たとえば、smbd
は samba_share_t
タイプのラベルが付いたファイルに読み取りおよび書き込みできますが、デフォルトでは、Apache HTTP Server が使用することを目的としている httpd_sys_content_t
タイプのラベルが付いたファイルにアクセスできません。Samba を介してホームディレクトリーや NFS ボリュームをエクスポートしたり、Samba がドメインコントローラーとして動作することができるようにするなど、特定の動作を許可するブール値を有効にする必要があります。
14.2. types
samba_share_t
タイプのファイルにラベルを付けます。作成したファイルのみに、samba _share_t
タイプでシステムファイルの再ラベル付けは行いません。このようなファイルおよびディレクトリーを共有するブール値を有効にできます。SELinux により、/etc/samba/smb.conf
ファイルおよび Linux のパーミッションが適宜設定しない限り、Samba は samba_share_t
タイプのラベルが付いたファイルに書き込みできます。
samba_etc_t
タイプは、smb.conf
などの /etc/samba/
ディレクトリーの特定のファイルで使用されます。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
ブール値が有効になりますが、/etc/samba/smb.conf で書き込みアクセスが設定されている場合でも、samba
_export_all_rw
ブール値は、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-client package samba is not installed package samba-common is not installed package samba-client is not installed
これらのパッケージのいずれかがインストールされていない場合は、root でyum
ユーティリティーを使用してインストールします。~]# yum install package-name
mkdir
ユーティリティーを root として使用して、Samba を介してファイルを共有する新しい最上位ディレクトリーを作成します。~]# mkdir /myshare
touch
ユーティリティーの root を使用して空のファイルを作成します。このファイルは後で、Samba 共有が正しくマウントされたことを確認するために使用されます。~]# touch /myshare/file1
- SELinux により、
/etc/samba/smb.conf
ファイルと Linux のパーミッションが随時設定されない限り、Samba がsamba_share_t
タイプのラベルが付いたファイルに読み取りおよび書き込みを行うことができます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。~]# semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
- root として
restorecon
ユーティリティーを使用して、ラベルの変更を適用します。~]# restorecon -R -v /myshare restorecon 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 testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
上記のコマンドを入力して、システムに存在しないアカウントのユーザー名を指定すると、Cannotlocate Unix account for 'username'! error になります
。 - Samba サービスを起動します。
~]# systemctl start smb.service
- 以下のコマンドを入力して、利用可能な共有の一覧を表示します。username は、手順 7 に追加された Samba アカウントに置き換えます。パスワードの入力を求められたら、ステップ 7 で Samba アカウントに割り当てられたパスワードを入力します(バージョン番号が異なる場合があります)。
~]$ smbclient -U username -L localhost Enter 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 --------- -------
mkdir
ユーティリティーを root として使用して、新しいディレクトリーを作成します。このディレクトリーは、myshare
Samba 共有をマウントするために使用されます。~]# mkdir /test/
- root で以下のコマンドを実行して、my
share
Samba 共有を/test/
にマウントします。username は、手順 7 のユーザー名に置き換えます。~]# mount //localhost/myshare /test/ -o user=username
ステップ 7 で設定した ユーザー名のパスワード を入力します。 - 以下のコマンドを入力して、手順 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.html Resolving 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 installed
yum
ユーティリティーを使用してインストールします。
~]# yum install vsftpd
15.1. types
/var/ftp/
ディレクトリー内のファイルへの読み取りアクセスがあります。書き込みアクセスが /etc/vsftpd/vsftpd.conf
に設定されている場合でも、このディレクトリーには public_content_t
タイプのラベルが付けられ、読み取りアクセスのみが許可されます。public_content_t
タイプは、Apache HTTP Server、Samba、NFS などの他のサービスからアクセスできます。
public_content_t
vsftpd
経由で読み取り専用に共有するために、public_content_t
タイプで作成したファイルおよびディレクトリーにラベルを付けます。Apache HTTP Server、Samba、NFS などの他のサービスは、このタイプのラベルが付いたファイルにもアクセスできます。Linux パーミッションで書き込みアクセスを許可していても、public_content_t
タイプのラベルが付いたファイルは書き込みできません。書き込みアクセスが必要な場合は、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
タイプのラベルが付いたファイルおよびディレクトリーにアクセスできるようになります。そのため、このブール値を有効にすると、vsftpd
を介して Samba を使用してマウントされたファイルシステムを共有できます。 ftpd_use_nfs
- このブール値を有効にすると、
vsftpd
がnfs_t
タイプのラベルが付いたファイルやディレクトリーにアクセスすることができるため、このブール値により、vsftpd
を介して NFS を使用してマウントされたファイルシステムを共有できます。 ftpd_connect_db
- FTP デーモンがデータベースへの接続を開始できるようにします。
httpd_enable_ftp_server
httpd
デーモンが 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 installed
yum
ユーティリティーを使用してインストールします。
~]# yum install nfs-utils
16.1. NFS および SELinux
プロセス
を除き制限されます。これは、制限のない kernel_t
ドメインタイプのラベルが付けられます。SELinux ポリシーにより、デフォルトでは NFS がファイルを共有できるようになります。また、クライアントとサーバー間で SELinux ラベルを渡すと、NFS ボリュームにアクセスする制限のあるドメインをより適切に制御できます。たとえば、ホームディレクトリーが NFS ボリュームに設定されている場合、ボリューム上の他のディレクトリーではなく、ホームディレクトリーのみにアクセスできる制限のあるドメインを指定できます。同様に、Secure Virtualization などのアプリケーションは、NFS ボリュームにイメージファイルのラベルを設定することができるため、仮想マシンの分離レベルが向上します。
16.2. types
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
ファイルには、NFS に関連する他のシステム実行ファイルとライブラリーであるため、nfsd_exec_t
というラベルが付けられます。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
- このブール値を有効にすると、s
ge スケジューラーは
NFS ボリュームにアクセスできるようになります。 use_nfs_home_dirs
- このブール値を有効にすると、NFS ホームディレクトリーのサポートが追加されました。
virt_use_nfs
- このブール値を有効にすると、仮想ゲストが NFS ボリュームのファイルを管理できるようにします。
xen_use_nfs
- このブール値を有効にすると、NFS ボリューム上のファイル(
Xen
)を管理できます。 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 nfs nfs-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 nfs nfs-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)
。
BIND を使用すると、ユーザーは数値アドレスではなく、コンピューターリソースとサービスを名前で特定できます。
~]$ rpm -q bind
package bind is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install bind
17.1. BIND および SELinux
/var/named/slaves/、/ var/
named/dynamic/
、および /var/named/data/
ディレクトリーのデフォルトのパーミッションにより、ゾーン転送および動的 DNS 更新を使用してゾーンファイルを更新できます。/var/named/
のファイルには、マスターゾーンファイルに使用される named_zone_t
タイプのラベルが付けられます。
/etc/named.conf ファイルを /
var/named/slaves/
にスレーブゾーンを配置するように設定します。以下は、/ var /named/slaves/
に
testdomain.com
のゾーンファイルを保存するスレーブ DNS サーバーのドメインエントリーの例です。
zone "testdomain.com" { type slave; masters { IP-address; }; file "/var/named/slaves/db.testdomain.com"; };
named_zone_t というラベルが付けられている場合
、ゾーン転送と動的 DNS がゾーンファイルを更新できるように、named _write_master_zones
ブール値を有効にする必要があります。また、親ディレクトリーのモードを変更して、名前付き
ユーザーまたはグループの読み取りおよび書き込みアクセスを許可する必要があります。
/var/named/
のゾーンファイルに named_cache_t
タイプのラベルが付けられると、ファイルシステムのラベルや restorecon -R /var/ の実行で、そのタイプを named_zone_t
に変更します。
17.2. types
named_zone_t
- マスターゾーンファイルに使用されます。他のサービスは、このタイプのファイルを変更することはできません。
named
デーモンは、named_write_master_zones
ブール値が有効な場合にのみ、このタイプのファイルを変更できます。 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. Dynamic DNS
/var/named/dynamic/
ディレクトリーを使用します。このディレクトリーに作成またはコピーされたファイルは、named
による書き込みを許可する Linux パーミッションを継承します。このようなファイルに named_cache_t
タイプのラベルが付けられるため、SELinux は named
による書き込みを許可します。
/var/named/dynamic/
のゾーンファイルに named_zone_t
タイプのラベルが付けられると、更新をマージする前に最初にジャーナルに書き込む必要があるため、動的 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章 同時バージョン管理システム
~]$ rpm -q cvs
package cvs is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install cvs
18.1. cvs および SELinux
cvs
デーモンは cvs_t
タイプのラベルが付けられます。Red Hat Enterprise Linux では、CVS は特定のディレクトリーの読み取りと書き込みのみが許可されます。ラベル cvs_data_t
は、cvs
が読み取りおよび書き込みアクセスを持つエリアを定義します。SELinux で CVS を使用する場合は、クライアントが CVS データ用に予約されている領域にフルアクセスできるようにするには、正しいラベルを割り当てる必要があります。
18.2. types
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 サーバーと、cv s-client
のホスト名と 192.168.1.100
の IP アドレスを持つクライアント。両方のホストが同じサブネット上にあります(192.168.1.0/24)。これは唯一の例であり、cvs および xinetd パッケージがインストールされ、SELinux のターゲットポリシーが使用され、SELinux が強制モードで実行されていることを前提としています。
cvs-srv
で実行する必要があります。
- この例では、cv パッケージおよび xinetd パッケージが必要です。パッケージがインストールされていることを確認します。
[cvs-srv]$ rpm -q cvs xinetd package 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 リポジトリーを作成します。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.1
xinetd
デーモンを起動します。[cvs-srv]# systemctl start xinetd.service
system-config-firewall
ユーティリティーを使用して、ポート 2401 で TCP 経由の受信接続を許可するルールを追加します。- クライアント側で、cv
suser
ユーザーとして以下のコマンドを入力します。[cvsuser@cvs-client]$ cvs -d /cvs init
- この時点で、CVS は設定されていますが、SELinux はログインおよびファイルのアクセスを拒否します。これを行うには、cv
s-client
に$CVSROOT
変数を設定し、リモートでログインしてみてください。次の手順は、cvs-client
で実行する必要があります。[cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs [cvsuser@cvs-client]$ [cvsuser@cvs-client]$ cvs login Logging 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 denied
SELinux のアクセスがブロックされています。このアクセスを許可する SELinux を取得するには、cvs-srv で以下の手順を実行
する必要があります。 /cvs/
ディレクトリー内の既存データおよび新しいデータを再帰的にラベル付けするために、/cvs/
ディレクトリーのコンテキストを root として変更し、それにcvs_data_t
タイプを指定します。[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 login Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs CVS password: ******** [cvsuser@cvs-client]$
第19章 Squid キャッシュプロキシー
~]$ rpm -q squid
package squid is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install squid
19.1. Squid キャッシュプロキシーおよび SELinux
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root ユーザーで以下のコマンドを実行して、squid デーモンを起動
します
。~]# systemctl start squid.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status squid.service squid.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 squid system_u:system_r:squid_t:s0 27018 ? 00:00:00 squid system_u:system_r:squid_t:s0 27020 ? 00:00:00 log_file_daemon
squid
プロセスに関連付けられている SELinux コンテキストは、system_u:system_r:squid_t:s0
です。2 番目のコンテキストの最後の部分(squid_t
)は、タイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、Squid プロセスはsquid_t
ドメインで実行されます。
_t
などの制限のあるドメインで実行しているプロセスが、ファイル、その他のプロセス、一般的なシステムを操作する方法を定義します。squid のアクセスを許可するには、ファイルに適切にラベル付けする必要があります。
/etc/squid/squid.conf
ファイルを設定すると、squid はデフォルトの TCP ポート 3128、3401、または 4827 以外の ポートでリッスン
する場合は、semanage port コマンドを使用して、必要なポート番号を SELinux ポリシー設定に追加します。以下の例は、squid
を設定して、SELinux ポリシー設定で最初に定義されていないポートをリッスンするように設定します。その結果、サーバーは起動に失敗します。また、この例では、デーモンがポリシーに定義されていない標準以外のポートで正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、squid パッケージがインストールされていることを前提としています。以下の例で各コマンドを root ユーザーとして実行します。
squid
デーモンが実行していないことを確認します。~]# systemctl status squid.service squid.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_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827
- root で
/etc/squid/squid.conf
を編集します。squid
の SELinux ポリシー設定で設定されていないポートを一覧表示するように、http_port
オプションを設定します。この例では、デーモンはポート 10000 でリッスンするように設定されています。# Squid normally listens to port 3128 http_port 10000
- setsebool コマンドを実行して、squid
_connect_any
のブール値が off に設定されていることを確認します。これにより、
squid は特定のポートでのみ操作できます。~]# setsebool -P squid_connect_any 0
squid
デーモンを起動します。~]# systemctl start squid.service Job 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. types
httpd_squid_script_exec_t
- このタイプは、Squid とその設定に関するさまざまな統計を提供する
cachemgr.cgi
などのユーティリティーに使用されます。 squid_cache_t
- このタイプは、
/etc/squid/squid.conf
のcache_dir
ディレクティブで定義されている Squid がキャッシュするデータに使用します。デフォルトでは、/var/cache/squid/
ディレクトリーおよび /var/spool/squid
/ ディレクトリーに作成またはコピーされたファイルは、squid_cache_t
タイプでラベルが付けられます。/var/squid Guard / ディレクトリーに作成またはコピーされた
squid 用の squid
Guard 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
- このタイプは、
/etc/rc.d/init.d/squid
にある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 squid package 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)
に使用するメガバイトのディスク容量(100)、最後に、最初のレベルのキャッシュディレクトリーと 2 次レベルディレクトリー(それぞれ16
および256
)のデフォルト設定を指定します。 - 同じ設定ファイルで、http
_access allow localnet
ディレクティブのコメントを解除します。これにより、Red Hat Enterprise Linux で Squid のデフォルトインストールに自動的に設定されたlocalnet
ACL からのトラフィックが可能になります。この簡単な例では、既存の RFC1918 ネットワーク上のクライアントマシンにプロキシー経由でアクセスすることができます。これは、この簡単な例では十分です。 - 同じ設定ファイルで、
visible_hostname
ディレクティブのコメントを解除し、マシンのホスト名に設定されていることを確認します。この値は、ホストの完全修飾ドメイン名(FQDN)である必要があります。visible_hostname squid.example.com
- root で以下のコマンドを実行して
squid
デーモンを起動します。squid
が最初に開始した時点で、このコマンドはcache_dir
ディレクティブで指定されたキャッシュディレクトリーを初期化し、デーモンを起動します。~]# systemctl start squid.service
squid
が正常に起動することを確認します。出力には以下の情報が含まれ、タイムスタンプのみが異なります。~]# systemctl status squid.service squid.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
_var_run_t
の値で示されているように、squid プロセス ID(PID)が制限のあるサービスとして開始されていることを確認します。~]# ls -lZ /var/run/squid.pid -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
- この時点で、先に設定された
localnet
ACL に接続されたクライアントマシンは、このホストの内部インターフェースをプロキシーとして使用することができます。これは、すべての共通の 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
)および多くのクライアントプログラムおよびライブラリーで構成されるマルチユーザー、マルチスレッドの SQL データベースサーバーです。[18]
~]$ rpm -q mariadb-server
package mariadb-server is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install mariadb-server
20.1. MariaDB および SELinux
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root ユーザーで以下のコマンドを実行して
mariadb
を起動します。~]# systemctl start mariadb.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status mariadb.service mariadb.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 mysqld system_u:system_r:mysqld_safe_t:s0 12831 ? 00:00:00 mysqld_safe system_u:system_r:mysqld_t:s0 13014 ? 00:00:00 mysqld
mysqld
プロセスに関連付けられた SELinux コンテキストは、system_u:system_r:mysqld_t:s0
です。2 番目のコンテキストの最後の部分であるmysqld_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、mysqld プロセスが mysqld
_t
ドメインで実行されます。
20.2. types
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 のログには、適切な操作のためにこのタイプのラベルが付けられる必要があります。
mysql.*
ワイルドカードに一致する/var/log/
ディレクトリーのすべてのログファイルには、このタイプのラベルが付けられる必要があります。 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
- このブール値を有効にすると、p
im
mailer がデータベースサーバーへの接続を開始できるようにします。 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/mysql drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
これは、データベースファイルの場所のデフォルトコンテキスト要素であるmysqld_db_t
を表示します。このコンテキストは、正しく機能するためにこの例で使用される新しいデータベースの場所に手動で適用する必要があります。- 次のコマンドを実行して、
mysqld root
パスワードを入力して、利用可能なデータベースを表示します。~]# mysqlshow -u root -p Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+
mysqld
デーモンを停止します。~]# systemctl stop mariadb.service
- データベースの新しい場所に新しいディレクトリーを作成します。以下の例では、
/mysql/
が使用されます。~]# mkdir -p /mysql
- データベースファイルを以前の場所から新しい場所にコピーします。
~]# cp -R /var/lib/mysql/* /mysql/
- この場所の所有権を変更して、mysql ユーザーおよびグループがアクセスできるようにします。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
~]# chown -R mysql:mysql /mysql
- 以下のコマンドを実行して、新しいディレクトリーの初期コンテキストを表示します。
~]# ls -lZ /mysql drwxr-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.service Job 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 /mysql drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
- 場所が変更され、ラベル付けされ、
mysqld
が正常に開始されました。この時点では、通常の操作を確認するには、実行中のサービスをすべてテストする必要があります。
第21章 PostgreSQL
~]# rpm -q postgresql-server
yum
ユーティリティーを使用してインストールします。
~]# yum install postgresql-server
21.1. PostgreSQL および SELinux
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root ユーザーで以下のコマンドを実行して
postgresql
を起動します。~]# systemctl start postgresql.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl start postgresql.service postgresql.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 postgres system_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 postmaster
postgresql
プロセスに関連付けられた SELinux コンテキストは、system_u:system_r:postgresql_t:s0
です。2 番目のコンテキストの最後の部分であるpostgresql_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、postgresql プロセスがpostgresql
_t
ドメインで実行されます。
21.2. types
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/pgsql drwx------. 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 ユーザーおよびグループがアクセスできるようにします。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
~]# chown -R postgres:postgres /opt/postgresql
- テキストエディターで
/etc/systemd/system/postgresql.service
ファイルを開き、PGDATA
変数およびPGLOG
変数を変更して新しい場所を参照します。~]# vi /etc/systemd/system/postgresql.service PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.log
このファイルを保存してテキストエディターを終了します。/etc/systemd/system/postgresql.service
ファイルが存在しない場合は作成し、以下の内容を挿入します。.include /lib/systemd/system/postgresql.service [Service] # Location of database directory Environment=PGDATA=/opt/postgresql/data Environment=PGLOG=/opt/postgresql/data/pgstartup.log
- 新しい場所でデータベースを初期化します。
~]$ su - postgres -c "initdb -D /opt/postgresql/data"
- データベースの場所を変更すると、この時点でサービスの起動に失敗します。
~]# systemctl start postgresql.service Job 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 /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
- ps コマンドで、postgresql
プロセスに
新しい場所が表示されることを確認します。~]# ps aux | grep -i postmaster postgres 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
ユーティリティーは高速なファイル転送を実行し、システム間のデータ同期に使用されます。[20]
~]$ rpm -q rsync
package rsync is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install rsync
22.1. rsync and SELinux
rsync
デーモンを使用してファイルを共有する場合は、ファイルとディレクトリーに public_content_t
タイプにラベルを付ける必要があります。ほとんどのサービスと同様に、SELinux が rsync
で保護メカニズムを実行するために正しいラベリングが必要です。[21]
22.2. types
rsync
で使用されます。柔軟なアクセスを設定する全タイプ:
public_content_t
- これは
rsync
を使用して共有されるファイルの場所(および実際のファイル)に使用される汎用タイプです。rsync
と共有するために特別なディレクトリーが作成される場合、ディレクトリーとその内容がそれらに適用する必要があります。 rsync_exec_t
- このタイプは、
/usr/bin/rsync
システムバイナリーに使用されます。 rsync_log_t
- このタイプは、デフォルトで
/var/log/rsync.log
にあるrsync
ログファイルに使用されます。ファイル rsync ログの場所を変更するには、--log-file=FILE
オプションをランタイム時に rsync コマンドに使用します。 rsync_var_run_t
- このタイプは、
/var/run/rsync
に使用されます。このロックファイルは、接続制限を管理するためにd.lock にある rsync
d ロックファイルrsync
サーバーによって使用されます。 rsync_data_t
- このタイプは、rsync ドメインとして使用するファイルおよびディレクトリーに使用され、他のサービスのアクセス範囲から分離します。また、
public_content_t
は、ファイルまたはディレクトリーが複数のサービス(例: FTP や NFS ディレクトリーを rsync ドメイン)と対話するときに使用できる一般的な SELinux コンテキストタイプです。 rsync_etc_t
- このタイプは、
/etc
ディレクトリー内の rsync 関連のファイルに使用されます。
22.3. ブール値
rsync_anon_write
- このブール値を有効にすると、rsync
_t ドメインの
が、タイプがrsync
public_content_rw_t
のファイル、リンク、ディレクトリーを管理できるようになります。多くの場合、このファイルは、パブリックファイル転送サービスに使用されるパブリックファイルです。ファイルとディレクトリーにこのタイプにラベルを付ける必要があります。 rsync_client
- このブール値を有効にすると、rsync が
rsync
_port_t
として定義されたポートへの接続を開始でき、デーモンがrsync_data_t
タイプのファイル、リンク、およびディレクトリーを管理できるようにします。SELinux が制御を有効にするには、rsync_t ドメインに 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
デーモンを標準以外のポートで正常に実行できるようにする方法を説明します。
手順22.1 rsync を使用して rsync_t として起動
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - このコマンドを実行して 、 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.service
rsyncd
が正常に起動したことを確認します(出力は以下のようなものであると想定されていますが、タイムスタンプのみが異なる場合があります)。~]# systemctl status rsyncd.service rsyncd.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-detach
SELinux は、rsync
_t
ドメインで実行されているようになったため、rsync デーモンで保護メカニズムを強制できるようになりました。~]$ ps -eZ | grep rsync system_u:system_r:rsync_t:s0 3220 ? 00:00:00 rsync
_t ドメイン
で実行されている rsync
を取得する方法を示しています。rsync はソケットが有効になったサービスとして実行することもできます。この場合、rsyncd
はクライアントがサービスへの接続を試みるまで実行されません。rsyncd
がソケットが有効になったサービスとして実行できるようにするには、上記の手順に従ってください。socket-activated サービスとして rsync
を起動するには、root で次のコマンドを実行します。
~]# systemctl start rsyncd.socket
手順22.2 デフォルト以外のポートでの rsync デーモンの実行
/etc/rsyncd.conf
ファイルを変更し、グローバル設定エリア内のファイルの上部にport = 10000
の行を追加します(つまり、ファイル領域が定義される前)。新しい設定ファイルは以下のようになります。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
ユーティリティーを使用して、rsync_port_t
の SELinux ポリシーに TCP ポート 10000 を追加します。~]# semanage port -a -t rsync_port_t -p tcp 10000
- TCP ポート 10000 が
rsync_port_t
の SELinux ポリシーに追加され、rsyncd
はこのポートで正常に起動し、動作します。~]# systemctl start rsyncd.service
~]# netstat -lnp | grep 10000 tcp 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 installed
yum
ユーティリティーの root を使用してインストールします。
~]# yum install postfix
23.1. postfix および SELinux
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root ユーザーで以下のコマンドを実行して、
postfix
を起動します。~]# systemctl start postfix.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status postfix.service postfix.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 postfix system_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
上記の出力では、Postfixマスター
プロセスに関連する SELinux コンテキストはsystem_u:system_r:postfix_master_t:s0
です。2 番目以降の目の部分(postfix_master_t
)は、このプロセスのタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、マスター
プロセスはpostfix_master_t
ドメインで実行されます。
23.2. types
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_contexts
23.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 installed
yum
ユーティリティーを使用してインストールします。
~]# yum install spamassassin
手順23.1 デフォルト以外のポートでの SpamAssassin の実行
- root として
semanage
ユーティリティーを使用して、デフォルトでspamd
デーモンをリッスンするポートを表示します。~]# semanage port -l | grep spamd spamd_port_t tcp 783
この出力は、TCP/783 が SpamAssassin のポートとして spamd_port_t
に定義されていることを示しています。 /etc/sysconfig/spamassassin
設定ファイルを編集し、ポート TCP/10000 の例で SpamAssassin を起動できるようにします。# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"
この行は、SpamAssassin がポート 10000 で動作するように指定されています。この例の残りの部分では、このソケットを開けるように SELinux ポリシーを修正する方法を示しています。- SpamAssassin を起動し、以下のようなエラーメッセージが表示されます。
~]# systemctl start spamassassin.service Job 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
を実行して SELinux ポリシーを変更し、SpamAssassin がポートの例(TCP/10000)で動作できるようにします。~]# semanage port -a -t spamd_port_t -p tcp 10000
- SpamAssassin が起動し、TCP ポート 10000 で稼働していることを確認します。
~]# systemctl start spamassassin.service ~]# netstat -lnp | grep 10000 tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 2224/spamd.pid
- この時点で、
スパムは
、SELinux ポリシーによりそのポートへのアクセスが許可されているため、TCP ポート 10000 で適切に操作されています。
第24章 DHCP
dhcpd
デーモンは、Red Hat Enterprise Linux で使用され、クライアント用のレイヤー 3 の TCP/IP の詳細を動的に配信および設定します。
dhcpd
デーモンを提供します。以下のコマンドを入力して、dhcp パッケージがインストールされているかどうかを確認します。
~]# rpm -q dhcp
package dhcp is not installed
yum
ユーティリティーを使用してインストールします。
~]# yum install dhcp
24.1. DHCP および SELinux
dhcpd
を有効にすると、デフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している dhcpd
および関連プロセスを示しています。この例では、dhcp パッケージがインストールされ、dhcpd
サービスが起動していることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
~]$ getenforce Enforcing
このコマンドは、SELinux がEnforcing
モードで実行している場合に Enforcing を返します。 - root ユーザーで次のコマンドを実行し、
dhcpd
を起動します。~]# systemctl start dhcpd.service
サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。~]# systemctl status dhcpd.service dhcpd.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 dhcpd system_u:system_r:dhcpd_t:s0 5483 ? 00:00:00 dhcpd
dhcpd プロセスに関連付けられている SELinux コンテキストは、system_u:system_r:dhcpd_t:s0
です。
24.2. types
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 openshift-clients
package openshift-clients is not installed
25.1. OpenShift および SELinux
25.2. types
プロセスタイプ
openshift_t
- OpenShift プロセスは、SELinux タイプ
openshift_t
に関連付けられます。
実行ファイルの種類
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
- このタイプにより、
/tmp に OpenShift cron ジョブの一時ファイルを保存できます
。 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
- このタイプを使用すると、tmpfs ファイルシステムに OpenShift データを保存できます。
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/
ディレクトリーに保存します。このディレクトリーには、SELinux タイプ openshift_var_lib_t
のラベルが付けられます。OpenShift が別のディレクトリーにデータを保存できるようにするには、適切な SELinux コンテキストで新しいディレクトリーにラベルを付けます。
/srv/openshift/
にデータを保存するためにデフォルトの OpenShift ディレクトリーを変更する方法を説明します。
手順25.1 データの保管用デフォルトの OpenShift ディレクトリーの変更
- root として、
/
ディレクトリーを作成します。新しいディレクトリーにsrv
ディレクトリー内に新規の openshift/var_t
タイプのラベルが付けられます。~]#
mkdir /srv/openshift~]$
ls -Zd /srv/openshift drwxr-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/openshift drwxr-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. Identity Management および SELinux
SSSD
(System Security Services Daemon)は、特定の IdM ユーザーに定義されたアクセス権限をクエリーします。次に、pam_selinux
モジュールは、要求をカーネルに送信し、guest_ u:guest_r:guest_t:s0
など、IdM アクセス権限に従って、適切な SELinux コンテキストでユーザープロセスを起動します。
26.1.1. Active Directory ドメインへの信頼
WinSync
ユーティリティーを使用して、Active Directory(AD)ドメインのユーザーが 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
- 以下のコマンドを入力して、t
user
ユーザー名を持つ IdM ユーザーを SELinux マッピングに追加します。~]$ ipa selinuxusermap-add-user --users=tuser SELinux_mapping
ipaclient.example.com
という名前の新規ホストを SELinux マッピングに追加するには、次のコマンドを実行します。~]$ ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mapping
tuser
ユーザーは、ipaclient.example.com ホストにログインすると、staff_u:s0-s0:c0.c1023
ラベルを取得します。[tuser@ipa-client]$ id -Z staff_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 サーバー)プロセスに柔軟な必須アクセス制御を Red Hat Gluster Storage の一部として提供し、追加のセキュリティー層として機能します。これらのプロセスには、glusterd_t
SELinux タイプとバインドされていない高度なプロセスの分離があります。
27.2. types
プロセスタイプ
glusterd_t
- Gluster プロセスは、SELinux タイプ
glusterd_t
に関連付けられます。
実行ファイルの種類
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
- このタイプは、
/tmp
ディレクトリーにglusterd
一時ファイルを保存するために使用されます。 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 が SELinux タイプ
public_content_rw_t
のラベルが付いたパブリックファイルを変更できます
。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy
ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。
27.4. 設定の例
27.4.1. Gluster ブリックのラベル付け
glusterd_brick_t で特定の
ファイルアクセス操作を拒否し、さまざまな AVC メッセージを生成します。
/dev/rhgs/gluster
などの論理ボリュームを作成してフォーマットし、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/
ディレクトリーには、SELinux タイプunlabeled_t
のラベルが付けられます。/mnt/brick1/
の SELinux タイプをglusterd_brick_t
SELinux タイプに変更します。~]# semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"
restorecon
ユーティリティーを使用して変更を適用します。~]# restorecon -Rv /mnt/brick1
- 最後に、コンテキストが正常に変更されたことを確認します。
~]$ ls -lZd /mnt/brick1 drwxr-xr-x. root root system_u:object_r:glusterd_brick_t:s0 /mnt/brick1/
第28章 参考資料
books
- SELinux の例
- Mayer、MacMillan、および CaplanPrentice Hall, 2007
- selinux:NSA のオープンソースセキュリティーの強化 Linux
- Bill McCartyO'Reilly Media Inc., 2004
チュートリアルおよびヘルプ
- Russell Coker のチュートリアルおよび対話
- Dan Walsh のジャーナル
- Red Hat ナレッジベース
一般情報
- NSA SELinux 主な Web サイト
- NSA SELinux FAQ
メーリングリスト
- NSA SELinux メーリングリスト
- Fedora SELinux メーリングリスト
コミュニティー
- SELinux Project Wiki
- SELinux コミュニティーページ
- IRC
- irc.freenode.net, #selinux
付録A 改訂履歴
改訂履歴 | |||
---|---|---|---|
改訂 0.3-06 | Fri Aug 9 2019 | Mirek Jahoda | |
| |||
改訂 0.3-05 | Sat Oct 20 2018 | Mirek Jahoda | |
| |||
改訂 0.3-03 | Tue Apr 3 2018 | Mirek Jahoda | |
| |||
改訂 0.3-01 | Thu Jul 13 2017 | Mirek Jahoda | |
| |||
改訂 0.2-18 | Wed Nov 2 2016 | Mirek Jahoda | |
| |||
改訂 0.2-11 | Sun Jun 26 2016 | Mirek Jahoda | |
| |||
改訂 0.2-10 | Sun Feb 14 2016 | Robert Krátký | |
| |||
改訂 0.2-9 | Thu Dec 10 2015 | Barbora Ančincová | |
| |||
改訂 0.2-8 | Thu Nov 11 2015 | Barbora Ančincová | |
| |||
改訂 0.2-7 | Thu Aug 13 2015 | Barbora Ančincová | |
| |||
改訂 0.2-6 | Wed Feb 18 2015 | Barbora Ančincová | |
| |||
改訂 0.2-5 | Fri Dec 05 2014 | Barbora Ančincová | |
| |||
改訂 0.2-4 | Thu Dec 04 2014 | Barbora Ančincová | |
| |||
改訂 0.1-41 | Tue May 20 2014 | Tomáš Čapek | |
| |||
改訂 0.1-1 | Tue Jan 17 2013 | Tomáš Čapek | |
|