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/
にあるコンテキストを持つファイルおよびディレクトリーと、その他の Web サーバーディレクトリー (httpd_sys_content_t
) へのアクセスを許可します。通常、/tmp および / var
/tmp
/ に含まれるファイルのポリシーには、許可ルールがないため、アクセスは許可されません。SELinux を使用すれば、Apache が危険にさらされ、悪意のあるスクリプトがアクセスを得た場合でも、/tmp
ディレクトリーにアクセスすることはできなくなります。
図1.1 SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスするのは許可しますが、同じ Apache プロセスが /data/mysql/ ディレクトリーにアクセスするのは拒否します。これは、httpd_t タイプコンテキストと mysqld_db_t タイプコンテキストに許可ルールがないのが原因です。一方、mysqld_t として実行する MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスでき、SELinux は、mysqld_t タイプを持つプロセスが、httpd_sys_content_t というラベルが付いた /var/www/html/ ディレクトリーにアクセスすることも適切に拒否します。
関連情報
- 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
ユーザーにマッピングすると、sudo や su などのユーザー ID (setuid) アプリケーションを設定しない限り、Linux ユーザーを実行できなくなります。詳細は、「制限のあるユーザーおよび制限のないユーザー」 を参照してください。 - プロセスとデータの分離が向上します。プロセスは独自のドメインで実行され、プロセスが他のプロセスによって使用されているファイルにアクセスできないようにします。また、プロセスが他のプロセスにアクセスできないようにします。たとえば、SELinux を実行している場合に、(許可が設定されていない限り) 攻撃者は Samba サーバーを危険にさらすことはできず、その Samba サーバーを攻撃ベクトルとして使用して、その他のプロセス (MariaDB など) が使用するファイルの読み書きを行うことはできません。
- SELinux は、設定ミスによるダメージを軽減します。Domain Name System (DNS) サーバーはゾーン転送として知られている機能で、互いに頻繁に情報を複製します。攻撃者は、ゾーン転送を使用して、虚偽の情報で DNS サーバーを更新できます。Red Hat Enterprise Linux で BIND (Berkeley Internet Name Domain) を DNS サーバーとして実行すると、ゾーン転送を実行できるサーバーを管理者が制限した場合でも、デフォルトの SELinux ポリシーによりゾーンファイルが阻止されます。 [1] BIND
named
デーモン自体、およびその他のプロセスによって、ゾーン転送を使用して更新中です。 - NetworkWorld.com の記事 A seatbelt for server software: SELinux blocks real-world exploits を参照してください。[2]SELinux に関する背景情報と、SELinux が阻止したさまざまな不正使用に関する情報です。
1.3. SELinux Architecture リンクのコピーリンクがクリップボードにコピーされました!
1.4. SELinux のステータスおよびモード リンクのコピーリンクがクリップボードにコピーされました!
getenforce
~]# getenforce
Enforcing
setenforce 0 getenforce
~]# setenforce 0
~]# getenforce
Permissive
setenforce 1 getenforce
~]# setenforce 1
~]# getenforce
Enforcing
httpd_t
ドメインを Permissive に設定するには、以下のコマンドを実行します。
semanage permissive -a httpd_t
~]# semanage permissive -a httpd_t
1.5. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
第2章 SELinux コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
ls -Z file1
~]$ ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
- SELinux ユーザー
- SELinux ユーザー ID は、特定のロールセットと特定の MLS/MCS 範囲に対して承認されるポリシーに既知の ID です。各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できます。マップされた SELinux ユーザー ID は、開始できるロールとレベルを定義するために、そのセッションのプロセスに対して SELinux コンテキストで使用されます。root で以下のコマンドを入力して、SELinux と Linux ユーザーアカウントのマッピングのリストを表示します (policycoreutils-pythonパッケージがインストールされている必要があります)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力は、システムごとにわずかに異なる場合がありますLogin Name
列には、Linux ユーザーがリスト表示されます。SELinux User
列には、Linux ユーザーがマッピングされている SELinux ユーザーがリスト表示されます。プロセスの場合、SELinux ユーザーはアクセス可能なロールとレベルを制限します。MLS/MCS Range
列は、MLS(Multi-Level Security) および Multi-Category Security(MCS) で使用されるレベルです。Service
列は、Linux ユーザーがシステムにログインする予定の正しい SELinux コンテキストを決定します。デフォルトでは、任意のサービスを表すアスタリスク (*
) 文字が使用されます。
- role
- SELinux の一部は、ロールベースのアクセス制御 (RBAC) セキュリティーモデルです。ロールは RBAC の属性です。SELinux ユーザーはロールに対して許可され、ロールはドメインに対して承認されます。このロールは、ドメインと SELinux ユーザーの仲介として機能します。入力可能なロールによって入力できるドメインが決まります。最終的には、アクセス可能なオブジェクトタイプを制御します。これにより、権限昇格攻撃への脆弱性が軽減されます。
- type
- タイプは、Type Enforcement の属性です。タイプは、プロセスのドメインとファイルのタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかにかかわらず、タイプが相互にアクセスできる方法を定義します。アクセスは、それを許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
- level
- このレベルは MLS と MCS の属性です。MLS の範囲はレベルのペアで、レベルが異なる場合は lowlevel-highlevel と記述され、レベルが同一である場合は lowlevel と記述されます (
s0-s0
はs0
と同じ)。各レベルは機密カテゴリーのペアで、カテゴリーはオプションになります。カテゴリーがある場合、レベルは sensitivity:category-set として記述されます。カテゴリーがない場合は、sensitivity と記述されます。カテゴリーセットが連続したシリーズの場合は、省略できます。たとえば、c0.c3
はc0,c1,c2,c3
と同じです。/etc/selinux/targeted/setrans.conf
ファイルはレベル (s0:c0
) を人間が判読できる形式 (CompanyConfidential
) にマップします。Red Hat Enterprise Linux では、Targeted ポリシーが MCS を強制し、MCS では 1 つの機密レベル (s0
) があります。Red Hat Enterprise Linux の MCS は、1024 の異なるカテゴリー(c0
からc1023
まで)に対応しています。s0-s0:c0.c1023
は機密レベルs0
で、すべてのカテゴリーに対して承認されます。MLS は Bell-La Padula Mandatory Access Model を強制し、LSPP(Labeled Security Protection Profile) 環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールし、MLS がデフォルトの SELinux ポリシーになるように設定します。Red Hat Enterprise Linux に同梱されている MLS ポリシーは、評価された設定に含まれなかった多くのプログラムドメインを省略するため、デスクトップワークステーションの MLS は使用できません(X Window System のサポートはありません)。ただし、アップストリームの SELinux 参照ポリシー から、すべてのプログラムドメインを含む MLS ポリシーを構築することができます。MLS 設定の詳細は、「Multi-Level Security (MLS)」 を参照してください。
2.1. ドメインの移行 リンクのコピーリンクがクリップボードにコピーされました!
entrypoint
タイプを持つアプリケーションを実行することにより、別のドメインに移行します。entrypoint
パーミッションは、SELinux ポリシーで使用され、どのアプリケーションがドメインに入るために使用できるかを制御します。以下の例は、ドメイン移行を示しています。
手順2.1 ドメイン移行の例
- ユーザーがパスワードを変更したい。これを実行するには、
passwd
ユーティリティーを実行します。/usr/bin/passwd
実行可能ファイルには、passwd_exec_t
タイプのラベルが付けられます。ls -Z /usr/bin/passwd
~]$ ls -Z /usr/bin/passwd -rwsr-xr-x root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow passwd
ユーティリティーは、shadow_t
タイプのラベルが付けられた/etc/shadow
にアクセスします。ls -Z /etc/shadow
~]$ ls -Z /etc/shadow -r--------. root root system_u:object_r:shadow_t:s0 /etc/shadow
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux ポリシールールでは、
passwd_t
ドメインで実行しているプロセスが、shadow_t
タイプのラベルが付けられたファイルに読み取りと書き込みが許可されていることを示しています。shadow_t
タイプは、パスワードの変更に必要なファイルにのみ適用されます。これには、/etc/gshadow
、/etc/shadow
、およびバックアップファイルが含まれます。 - SELinux ポリシールールは、
passwd_t
ドメインのentrypoint
パーミッションが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
ドメインで実行するsendmail
プロセスには passwd を実行する適切な理由がないため、passwd_t
ドメインに移行することはできません。 passwd_t
ドメインで実行しているプロセスは、etc_t
またはshadow_t
タイプのラベルが付けられたファイルなど、承認されたタイプに対する読み書きのみが可能です。これにより、passwd
アプリケーションが任意のファイルの読み書きを行うのを防ぎます。
2.2. プロセスの SELinux コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
手順2.2 passwd
ユーティリティーの SELinux コンテキストの表示
passwd
ユーティリティーを実行します。新しいパスワードは入力しないでください。passwd
~]$ passwd Changing password for user user_name. Changing password for user_name. (current) UNIX password:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しいタブまたは別の端末を開き、以下のコマンドを入力します。出力は以下の例のようになります。
ps -eZ | grep passwd
~]$ ps -eZ | grep passwd unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 13212 pts/1 00:00:00 passwd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 最初のタブ/ターミナルで
Ctrl+C
を押してpasswd
ユーティリティーをキャンセルします。
passwd_exec_t
タイプのラベルが付けられた) passwd
ユーティリティーが実行されると、ユーザーのシェルプロセスは passwd_t
ドメインに移行します。タイプはプロセスのドメインとファイルのタイプを定義することに注意してください。
ps
ユーティリティーを再度実行します。以下は出力の省略された例であり、お使いのシステムでは異なる場合があります。
system_r
ロールは、デーモンなどのシステムプロセスに使用されます。Enforcement と入力してから、各ドメインを分けます。
2.3. ユーザーの SELinux コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
id -Z
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u
ユーザーにマッピングされ、unconfined_r
ロールとして実行され、unconfined_t
ドメインで実行されていることを示しています。s0-s0
は MLS 範囲で、この場合は s0
と同じです。ユーザーがアクセスできるカテゴリーはc0.c1023
で定義されます。これは、すべてのカテゴリー (c0
から c1023
) です。
第3章 Targeted ポリシー リンクのコピーリンクがクリップボードにコピーされました!
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 モードで実行されていること、および Targeted ポリシーが使用されていることを確認します。正しい出力は以下のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux モードの変更に関する詳細は、「SELinux のステータスおよびモードの永続的変更」 を参照してください。 - root として、
/var/www/html/
ディレクトリーにファイルを作成します。touch /var/www/html/testfile
~]# touch /var/www/html/testfile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、新規作成されたファイルの SELinux コンテキストを表示します。
ls -Z /var/www/html/testfile
~]$ ls -Z /var/www/html/testfile -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、Linux ユーザーは Red Hat Enterprise Linux で制限なしで実行されます。そのため、testfile
ファイルには SELinuxunconfined_u
ユーザーのラベルが付けられます。RBAC は、ファイルではなくプロセスに使用されます。ロールには意味がありません。object_r
ロールはファイル (永続ストレージおよびネットワークファイルシステム上) に使用される汎用ロールです。/proc
ディレクトリー下では、プロセスに関連するファイルはsystem_r
ロールを使用する場合があります。httpd_sys_content_t
タイプを使用すると、httpd
プロセスがこのファイルにアクセスできるようになります。
httpd
) を防ぐ方法を示しています。これはサンプルであり、本番環境では使用しないでください。httpd パッケージと wget パッケージがインストールされ、SELinux Targeted ポリシーが使用され、SELinux が Enforcing モードで動作していることを前提とします。
手順3.2 競合するプロセスの例
- root で
httpd
デーモンを起動します。systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux ユーザーが書き込み権限を持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - chcon コマンドによってファイルが再ラベル付けされます。ただし、このようなラベルの変更は、ファイルシステムの再ラベル付け時に維持されません。ファイルシステムの再ラベル付け後も存続する永続的な変更については、
semanage
ユーティリティーを使用します。これについては後述します。root で以下のコマンドを実行して、タイプを Samba が使用するタイプに変更します。chcon -t samba_share_t /var/www/html/testfile
~]# chcon -t samba_share_t /var/www/html/testfile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを入力して、変更を表示します。ls -Z /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在の DAC パーミッションでは、
httpd
プロセスがtestfile
にアクセスできるようになります。ユーザーの書き込み権限があるディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは失敗します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
testfile
を削除します。rm -i /var/www/html/testfile
~]# rm -i /var/www/html/testfile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
を実行する必要がない場合は、root で以下のコマンドを実行して停止します。systemctl stop httpd.service
~]# systemctl stop httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
httpd
プロセスが testfile
へアクセスすることが許可されましたが、httpd
プロセスがアクセス権を持たないタイプでファイルがラベル付けされているため、SELinux ではアクセスが拒否されました。
auditd
デーモンが実行している場合は、以下のようなエラーが /var/log/audit/audit.log
に記録されます。
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
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
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
3.2. 制限のないプロセス リンクのコピーリンクがクリップボードにコピーされました!
init
によって実行される制限のないサービスは unconfined_service_t
ドメインで実行され、カーネルによって実行される制限のないサービスは kernel_t
ドメインで実行され、制限のない Linux ユーザーによって実行される制限のないサービスは、unconfined_t
ドメインで実行されます。制限のないプロセスの場合、SELinux ポリシールールが適用されますが、制限のないドメインで実行しているプロセスを許可するポリシールールが存在します。制限のないドメインで実行されているプロセスは、DAC ルールだけを使用するようにフォールバックされます。制限のないプロセスが侵害された場合、SELinux は攻撃者がシステムリソースやデータにアクセスすることを防ぎませんが、もちろん、DAC ルールは引き続き使用されます。SELinux は、DAC ルールに加えたセキュリティー強化です。DAC ルールを置き換えるものではありません。
httpd
) が Samba が使用するデータにアクセスする方法を示しています。Red Hat Enterprise Linux では、httpd
プロセスはデフォルトで制限のある httpd_t
ドメインで実行されます。これはサンプルであり、本番環境では使用しないでください。httpd、wget、dbus、および audit パッケージがインストールされ、SELinux Targeted ポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。
手順3.3 制限のないプロセスの例
- chcon コマンドによってファイルが再ラベル付けされます。ただし、このようなラベルの変更は、ファイルシステムの再ラベル付け時に維持されません。ファイルシステムの再ラベル付け後も存続する永続的な変更については、
semanage
ユーティリティーを使用します。これについては後述します。root ユーザーとして以下のコマンドを実行し、タイプを Samba が使用するタイプに変更します。chcon -t samba_share_t /var/www/html/testfile
~]# chcon -t samba_share_t /var/www/html/testfile
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を表示します。ls -Z /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを実行して、
httpd
プロセスが実行されていないことを確認します。systemctl status httpd.service
~]$ systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が異なる場合は、root で以下のコマンドを実行して、httpd
プロセスを停止します。systemctl stop httpd.service
~]# systemctl stop httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
プロセスが制限なしで実行されるようにするには、root で以下のコマンドを実行して、/usr/sbin/httpd
ファイルのタイプを、制限のあるドメインに移行しないタイプに変更します。chcon -t bin_t /usr/sbin/httpd
~]# chcon -t bin_t /usr/sbin/httpd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /usr/sbin/httpd
にbin_t
タイプのラベルが付けられていることを確認します。ls -Z /usr/sbin/httpd
~]$ ls -Z /usr/sbin/httpd -rwxr-xr-x. root root system_u:object_r:bin_t:s0 /usr/sbin/httpd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
httpd
プロセスを開始して、正常に起動したことを確認します。systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、
unconfined_service_t
ドメインで実行しているhttpd
を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux ユーザーが書き込み権限を持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
プロセスはsamba_share_t
タイプのラベル付けされたファイルにアクセスできませんが、httpd
は制限のないunconfined_service_t
ドメインで実行され、DAC ルールの使用にフォールバックします。したがって、wget コマンドは成功します。httpd
が制限のあるhttpd_t
ドメインで実行されていた場合、wget コマンドは失敗していました。 restorecon
ユーティリティーは、ファイルのデフォルトの SELinux コンテキストを復元します。root で次のコマンドを実行して、/usr/sbin/httpd
のデフォルトの SELinux コンテキストを復元します。restorecon -v /usr/sbin/httpd
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /usr/sbin/httpd
にhttpd_exec_t
タイプのラベルが付けられていることを確認します。ls -Z /usr/sbin/httpd
~]$ ls -Z /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行して
httpd
を再起動します。再起動したら、制限のあるhttpd_t
ドメインでhttpd
が実行されていることを確認します。systemctl restart httpd.service
~]# systemctl restart httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
testfile
を削除します。rm -i /var/www/html/testfile
~]# rm -i /var/www/html/testfile rm: remove regular empty file `/var/www/html/testfile'? y
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
を実行する必要がない場合は、root で以下のコマンドを実行してhttpd
を停止します。systemctl stop httpd.service
~]# systemctl stop httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.3. 制限のあるユーザーおよび制限のないユーザー リンクのコピーリンクがクリップボードにコピーされました!
__default__
ログインにマッピングされ、これは、SELinux unconfined_u
ユーザーにマッピングされます。以下の行は、デフォルトのマッピングを定義します。
__default__ unconfined_u s0-s0:c0.c1023
__default__ unconfined_u s0-s0:c0.c1023
unconfined_u
ユーザーにマッピングする方法を説明します。これは、デフォルトで Red Hat Enterprise Linux でそうであるように、root ユーザーが制限なしで実行されていることを前提としています。
手順3.4 新しい Linux ユーザーの SELinux unconfined_u
ユーザーへのマッピング
- root で以下のコマンドを入力し、
newuser
という名前の Linux ユーザーを作成します。useradd newuser
~]# useradd newuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux
newuser
ユーザーにパスワードを割り当てるには、以下を実行します。root で以下のコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在のセッションからログアウトし、Linux
newuser
ユーザーとしてログインします。ログインすると、PAM モジュール pam_selinux は Linux ユーザーを SELinux ユーザー(この場合はunconfined_u
)に自動的にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを入力して、Linux ユーザーのコンテキストを表示します。id -Z
[newuser@localhost ~]$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記システムでnewuser
ユーザーが不要になった場合は、Linuxnewuser
のセッションからログアウトし、アカウントにログインして root で userdel -r newuser コマンドを実行します。これにより、newuser
が自分のホームディレクトリーとともに削除されます。
unconfined_t
ドメインから自身の制限のあるドメインに移行できるものとして SELinux ポリシーが定義するアプリケーションを実行すると、制限のない Linux ユーザーは制限のあるドメインの制限を引き続き受けます。このセキュリティー上の利点は、Linux ユーザーが制限なしで実行している場合でも、アプリケーションは制限されたままになります。したがって、アプリケーションにおける不具合の悪用はポリシーによって制限できます。
ユーザー | ロール | ドメイン | 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 ドメイン、およびx
ドメインの Linux ユーザーは、SELinux ポリシーで許可されている場合にのみ、setuid (set user ID)アプリケーションを実行できます(guest_t
passwd
など)。これらのユーザーは、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 タイプの処理のみが可能です。詳細は、「タイプ」 を参照してください。logadm_r
は、syslog
およびauditlog
プロセスに関連する SELinux タイプの処理のみが可能です。secadm_r
can only administrate SELinux.auditadm_r
は、audit
サブシステムに関連するプロセスのみを管理できます。
seinfo -r
~]$ seinfo -r
3.3.1. sudo 移行および SELinux ロール リンクのコピーリンクがクリップボードにコピーされました!
staff_u
および sysadm_u
SELinux の制限のあるユーザーのみになります。このようなユーザーが 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
~]# semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - デフォルトの SElinux ポリシーコンテキストファイルを設定します。たとえば、SELinux ユーザー
staff_u
と同じ SELinux ルールを設定するには、staff_u
コンテキストファイルをコピーします。cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u
~]# cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新たに作成した SELinux ユーザーを既存の Linux ユーザーにマッピングします。
semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user
semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/sudoers.d/
ディレクトリーに Linux ユーザーと同じ名前で新しい設定ファイルを作成し、以下の文字列を追加します。echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/bash " > /etc/sudoers.d/linux_user
~]# echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/bash " > /etc/sudoers.d/linux_user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon
ユーティリティーを使用して、linux_user ホームディレクトリーのラベルを変更します。restorecon -FR -v /home/linux_user
~]# restorecon -FR -v /home/linux_user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新たに作成した Linux ユーザーとしてシステムにログインし、ユーザーにデフォルトの SELinux ロールのラベルがあることを確認します。
id -Z
~]$ id -Z SELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - sudo を実行して、ユーザーの SELinux コンテキストを、
/etc/sudoers.d/linux_user
で指定した補助 SELinux ロールに変更します。sudo で使用する-i
オプションは、対話式シェルが実行される原因となっていました。sudo -i id -Z
~]$ sudo -i ~]# id -Z SELinux_user_u:administrator_r:administrator_t:s0:c0.c1023
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
例3.1 sudo 移行の設定
staff_r
と、confined_u
のロールを staff_r
から webadm_r
に変更するように設定された sudo を使用して、新しい SELinux ユーザー confined_u
を作成します。
- root ユーザーとして、
sysadm_r
ロールまたはunconfined_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) ROLE=webadm_r TYPE=webadm_t /bin/bash " > /etc/sudoers.d/linux_user
~]# 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) ROLE=webadm_r TYPE=webadm_t /bin/bash " > /etc/sudoers.d/linux_user
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新たに作成した Linux ユーザーとしてシステムにログインし、ユーザーにデフォルトの SELinux ロールのラベルがあることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第4章 SELinux の使用 リンクのコピーリンクがクリップボードにコピーされました!
4.1. SELinux パッケージ リンクのコピーリンクがクリップボードにコピーされました!
- policycoreutils は、SELinux の運用および管理用に
restorecon
、secon
、setfiles
、semodule
、load_policy
、およびsetsebool
などのユーティリティーを提供します。 - selinux-policy は、 基本的なディレクトリー構造、
selinux-policy.conf
ファイル、RPM マクロを提供します。 - selinux-policy-targeted は、SELinux の Targeted ポリシーを提供します。
- libselinux - SELinux アプリケーションの API を提供します。
- libselinux-utils は
avcstat
、getenforce
、getsebool
、matchpathcon
、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 は、Tresys Technology SETools ディストリビューション、ポリシーを分析およびクエリーするためのユーティリティーとライブラリー、監査ログの監視とレポート、およびファイルコンテキスト管理を提供します。 setools パッケージは、SETools のメタパッケージです。setools-gui パッケージは、
apol
ユーティリティーおよびseaudit
ユーティリティーを提供します。setools-console パッケージは、sechecker
、sediff
、seinfo
、sesearch
およびfindcon
コマンドラインユーティリティーを提供します。setools および setools-gui パッケージは、Red Hat Network Optional チャンネルが有効にされている場合にのみ使用できることに注意してください。詳細は、Scope of Coverage Details を参照してください。 - mcstrans は、
s0-s0:c0.c1023
などのレベルを、SystemLow-SystemHigh
などの読みやすい形式に変換します。 - policycoreutils-python は、SELinux の操作および管理用に semanage、audit2allow、audit2why、chcat などのユーティリティーを提供します。
- 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
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
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
ユーティリティーは、監査
サブシステムの一部として実行します。AVC 拒否メッセージが返されると、sedispatch
はdbus
を使用してメッセージを送信します。これらのメッセージは、すでに実行中の場合はsetroubleshootd
に直接表示されます。これが実行されていない場合、sedispatch
は自動的に起動します。seapplet
ユーティリティーはシステムツールバーで実行され、setroubleshootd
の dbus メッセージをリッスンします。通知バブルを起動し、ユーザーが AVC メッセージを確認できるようにします。
手順4.1 デーモンの自動起動
auditd
デーモンおよびrsyslog
デーモンが、システムの起動時に自動的に起動するように設定するには、root で次のコマンドを実行します。systemctl enable auditd.service
~]# systemctl enable auditd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl enable rsyslog.service
~]# systemctl enable rsyslog.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - デーモンが有効になっていることを確認するには、シェルプロンプトで以下のコマンドを入力します。
systemctl is-enabled auditd
~]$ systemctl is-enabled auditd enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl is-enabled rsyslog
~]$ systemctl is-enabled rsyslog enabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、systemctl status service-name.service コマンドを使用して、コマンド出力でenabled
キーワードを検索します。以下に例を示します。systemctl status auditd.service | grep enabled
~]$ systemctl status auditd.service | grep enabled auditd.service - Security Auditing Service Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
systemd
デーモンによるシステムサービスの管理方法の詳細は、System Administrator's Guide の Managing System Services の章を参照してください。
4.3. 主要設定ファイル リンクのコピーリンクがクリップボードにコピーされました!
/etc/selinux/config
ファイルは、主な SELinux 設定ファイルです。これは、SELinux が有効/無効であるか、SELinux モードと SELinux ポリシーを使用するかどうかを制御します。
SELINUX=
SELINUX
オプションは、SELinux の無効化、有効化、およびモード (Enforcing または Permissive) が実行されるかどうかを設定します。SELINUX=enforcing
を使用すると、SELinux ポリシーが適用され、SELinux ポリシールールが SELinux ポリシーに基づいてアクセスを拒否します。拒否メッセージがログに記録されます。SELINUX=permissive
を使用すると、SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、SELinux を Enforcing モードで実行した場合に拒否されたであろうアクションの拒否がログに記録されます。SELINUX=disabled
を使用すると、SELinux は無効になり、SELinux モジュールは Linux カーネルに登録されず、DAC ルールだけが使用されます。
SELINUXTYPE=
SELINUXTYPE
オプションは、使用する SELinux ポリシーを設定します。Targeted ポリシーはデフォルトのポリシーです。MLS ポリシーを使用する場合は、このオプションを変更します。MLS ポリシーを有効にする方法は、「SELinux での MLS の有効化」 を参照してください。
4.4. SELinux のステータスおよびモードの永続的変更 リンクのコピーリンクがクリップボードにコピーされました!
Enforcing
、Permissive
、または Disabled
を返します。
4.4.1. SELinux の有効化 リンクのコピーリンクがクリップボードにコピーされました!
- SELinux を Permissive モードで有効にします。詳細は、「Permissive モードに設定する場合:」 を参照してください。
- システムを再起動します。
- SELinux 拒否メッセージを確認します。詳細は、「拒否の検索と表示」を参照してください。
- 拒否がない場合は、Enforcing モードに切り替えます。詳細は、「Enforcing モードに設定する場合:」 を参照してください。
unconfined_service_t
ドメインでアプリケーションを実行します。詳細は、「制限のないプロセス」 を参照してください。- アプリケーションに新しいポリシーを記述します。詳細は、ナレッジベースの記事 カスタム SELinux ポリシーの作成 を参照してください。
4.4.1.1. Permissive モードに設定する場合: リンクのコピーリンクがクリップボードにコピーされました!
手順4.2 Permissive モードへの変更
- 以下のように
/etc/selinux/config
ファイルを編集します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動します。
reboot
~]# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.1.2. Enforcing モードに設定する場合: リンクのコピーリンクがクリップボードにコピーされました!
手順4.3 Enforcing モードへの変更
rpm -q package_name
rpm -q package_name
- 以下のように
/etc/selinux/config
ファイルを編集します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動します。
reboot
~]# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次にシステムを起動する際に、SELinux はシステム内のファイルおよびディレクトリーのラベルを再設定し、SELinux が無効になっている間に作成したファイルおよびディレクトリーに SELinux コンテキストを追加します。
ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
~]# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
grep "SELinux is preventing" /var/log/messages
~]# grep "SELinux is preventing" /var/log/messages
4.4.2. SELinux の無効化 リンクのコピーリンクがクリップボードにコピーされました!
手順4.4 SELinux の無効化
/etc/selinux/config
ファイルにSELINUX=disabled
を設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動します。再起動したら、getenforce コマンドが
Disabled
を返すことを確認します。getenforce
~]$ getenforce Disabled
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
- このパラメーターにより、システムで、以下のコマンドと同様の再ラベルが強制的に行われます。システムのラベリングに多数のエラーが含まれる場合は、自動再ラベルが正常に実行されるために Permissive モードで起動する必要がある場合があります。
touch /.autorelabel reboot
~]# touch /.autorelabel ~]# reboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
~]# yum install kernel-doc
~]$ less /usr/share/doc/kernel-doc-3.10.0/Documentation/kernel-parameters.txt
4.6. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
4.6.1. ブール値のリスト表示 リンクのコピーリンクがクリップボードにコピーされました!
SELinux boolean
列には、ブール値名がリスト表示されます。Description
コラムには、ブール値がオンまたはオフであるかと、その実行内容が記載されています。
getsebool -a
~]$ getsebool -a
cvs_read_shadow --> off
daemons_dump_core --> on
getsebool cvs_read_shadow
~]$ getsebool cvs_read_shadow
cvs_read_shadow --> off
getsebool cvs_read_shadow daemons_dump_core
~]$ getsebool cvs_read_shadow daemons_dump_core
cvs_read_shadow --> off
daemons_dump_core --> on
4.6.2. ブール値の設定 リンクのコピーリンクがクリップボードにコピーされました!
setsebool
ユーティリティーを実行し、ブール値を有効または無効にします。
httpd_can_network_connect_db
ブール値の設定を示しています。
手順4.5 ブール値の設定
- デフォルトでは、
httpd_can_network_connect_db
ブール値はオフになっています。Apache HTTP Server スクリプトおよびモジュールがデータベースサーバーに接続できません。getsebool httpd_can_network_connect_db
~]$ getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> off
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP Server スクリプトおよびモジュールがデータベースサーバーに一時的に接続できるようにするには、root で以下のコマンドを入力します。
setsebool httpd_can_network_connect_db on
~]# setsebool httpd_can_network_connect_db on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow getsebool
ユーティリティーを使用して、ブール値が有効であることを確認します。getsebool httpd_can_network_connect_db
~]$ getsebool httpd_can_network_connect_db httpd_can_network_connect_db --> on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、Apache HTTP Server スクリプトおよびモジュールはデータベースサーバーに接続できます。- この変更は、再起動後は維持されません。再起動後も変更を永続化するには、root で setsebool -P boolean-name on コマンドを実行します。[3]
setsebool -P httpd_can_network_connect_db on
~]# setsebool -P httpd_can_network_connect_db on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6.3. シェル自動完了 リンクのコピーリンクがクリップボードにコピーされました!
getsebool
ユーティリティー、setsebool
ユーティリティー、および semanage
ユーティリティーを使用すると、シェルの自動完了を使用できます。getsebool
と setsebool
のオートコンプリートを使用して、コマンドラインパラメーターとブール値の両方を完了します。コマンドラインパラメーターのみをリスト表示するには、コマンド名の後にハイフン文字 ("-") を追加して、Tab キーを押します。
setsebool -[Tab]
~]# setsebool -[Tab]
-P
getsebool samba_[Tab]
~]$ 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]
~]# 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]
~]# semanage [Tab]
boolean export import login node port
dontaudit fcontext interface module permissive user
semanage port -a -t http_port_t -p tcp 81
~]# semanage port -a -t http_port_t -p tcp 81
4.7. SELinux コンテキスト - ファイルのラベル付け リンクのコピーリンクがクリップボードにコピーされました!
ls -Z file1
~]$ 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
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0 /etc
touch /etc/file1
~]# touch /etc/file1
ls -lZ /etc/file1
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0 /etc/file1
matchpathcon
など、ファイルシステムのラベリングを管理するための複数のコマンドを提供します。
4.7.1. 一時的な変更: chcon リンクのコピーリンクがクリップボードにコピーされました!
クイックリファレンス
- chcon -t type file-name コマンドを実行して、ファイルタイプを変更します。type は SELinux タイプです。たとえば、
httpd_sys_content_t
で、file-name はファイルまたはディレクトリー名になります。chcon -t httpd_sys_content_t file-name
~]$ chcon -t httpd_sys_content_t file-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - chcon -R -t type directory-name コマンドを実行して、ディレクトリーのタイプとそのコンテンツを変更します。type は SELinux タイプです。たとえば、
httpd_sys_content_t
で、directory-name はディレクトリー名になります。chcon -R -t httpd_sys_content_t directory-name
~]$ chcon -R -t httpd_sys_content_t directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.6 ファイルまたはディレクトリーのタイプの変更
file1
がディレクトリーである場合など、ディレクトリーに対して同じように動作します。
- ホームディレクトリーに移動します。
- 新しいファイルを作成して、その SELinux コンテキストを表示します。
touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、file1
の SELinux コンテキストには、SELinux のunconfined_u
ユーザー、object_r
ロール、user_home_t
タイプ、およびs0
レベルが含まれます。SELinux コンテキストの各部分の説明は、2章SELinux コンテキスト を参照してください。 - 次のコマンドを実行して、タイプを
samba_share_t
に変更します。-t
オプションはタイプを変更します。次に、変更を表示します。chcon -t samba_share_t file1
~]$ chcon -t samba_share_t file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:samba_share_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを使用して、
file1
ファイルの SELinux コンテキストを復元します。変更を確認するには、-v
オプションを使用します。restorecon -v file1
~]$ restorecon -v file1 restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、前のタイプsamba_share_t
は正しいタイプuser_home_t
タイプに復元されます。Targeted ポリシー (Red Hat Enterprise Linux のデフォルトの SELinux ポリシー) を使用する場合、restorecon コマンドは/etc/selinux/targeted/contexts/files/
ディレクトリーのファイルを読み取り、どの SELinux コンテキストファイルが存在するかを確認します。
手順4.7 ディレクトリーとそのコンテンツタイプの変更
/var/www/html/
の代わりに) 別のドキュメント root を使用する場合に使用します。
- root ユーザーとして、このディレクトリー内に新しい
web/
ディレクトリーを作成し、3 つの空のファイル (file1
、file2
、およびfile3
) を作成します。web/
ディレクトリーおよびそのファイルには、default_t
タイプのラベルが付けられます。mkdir /web
~]# mkdir /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch /web/file{1,2,3}
~]# touch /web/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]# ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行して、
web/
ディレクトリー (とそのコンテンツ) のタイプをhttpd_sys_content_t
に変更します。chcon -R -t httpd_sys_content_t /web/
~]# chcon -R -t httpd_sys_content_t /web/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web/
~]# ls -dZ /web/ drwxr-xr-x root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - デフォルトの SELinux コンテキストを復元するには、root で
restorecon
ユーティリティーを使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.2. 永続的な変更 - semanage fcontext リンクのコピーリンクがクリップボードにコピーされました!
semanage fcontext -C -l
~]# semanage fcontext -C -l
setfiles
ユーティリティーは、ファイルシステムに再ラベル付けされ、restorecon
ユーティリティーがデフォルトの SELinux コンテキストを復元するときに使用されます。つまり、ファイルシステムが再ラベル付けされても、semanage fcontext による変更は永続します。SELinux ポリシーは、ユーザーが任意のファイルの SELinux コンテキストを変更できるかどうかを制御します。
クイックリファレンス
- 次のコマンドを入力します。ファイルまたはディレクトリーのフルパスを使用することを忘れないでください。
semanage fcontext -a options file-name|directory-name
~]# semanage fcontext -a options file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon
ユーティリティーを使用して、コンテキストの変更を適用します。restorecon -v file-name|directory-name
~]# restorecon -v file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
semanage fcontext での正規表現の使用
PCRE2_DOTALL
です。これにより、.
ワイルドカードは、改行を含むあらゆるものにマッチします。パスを表す文字列はバイトとして処理されます。つまり、ASCII 以外の文字は、1 つのワイルドカードで一致しません。
file_contexts.local
に保存されているローカルファイルコンテキストの変更の優先度は、ポリシーモジュールで指定されているものよりも高くなります。つまり、指定したファイルパスが file_contexts.local
で一致するものが見つかるたびに、その他のファイルコンテキスト定義は考慮されません。
semanage-fcontext(8)
を参照してください。
手順4.8 ファイルまたはディレクトリーのタイプの変更
file1
がディレクトリーであった場合など、ディレクトリーに対しても同じように機能します。
- root ユーザーで、
/etc
ディレクトリーに新しいファイルを作成します。デフォルトでは、/etc
に新規に作成されたファイルにはetc_t
タイプのラベルが付けられます。touch /etc/file1
~]# touch /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーの情報をリスト表示するには、次のコマンドを使用します。ls -dZ directory_name
~]$ ls -dZ directory_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行して、
file1
タイプをsamba_share_t
に変更します。-a
オプションは新しいレコードを追加し、-t
オプションはタイプ (samba_share_t
) を定義します。このコマンドを実行すると、タイプを直接変更しません。file1
には、まだetc_t
タイプのラベルが付けられています。semanage fcontext -a -t samba_share_t /etc/file1
~]# semanage fcontext -a -t samba_share_t /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]# ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage fcontext -C -l
~]$ semanage fcontext -C -l /etc/file1 unconfined_u:object_r:samba_share_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
restorecon
ユーティリティーを使用してタイプを変更します。semanage
により、/etc/file1
のfile_contexts.local
にエントリーが追加されたため、restorecon
によりタイプがsamba_share_t
に変わります。restorecon -v /etc/file1
~]# restorecon -v /etc/file1 restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.9 ディレクトリーとそのコンテンツタイプの変更
/var/www/html/
の代わりに別のドキュメント root を使用する場合に使用します。
- root ユーザーとして、このディレクトリー内に新しい
web/
ディレクトリーを作成し、3 つの空のファイル (file1
、file2
、およびfile3
) を作成します。web/
ディレクトリーおよびそのファイルには、default_t
タイプのラベルが付けられます。mkdir /web
~]# mkdir /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch /web/file{1,2,3}
~]# touch /web/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]# ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行して、
web/
ディレクトリーのタイプとその中のファイルをhttpd_sys_content_t
に変更します。-a
オプションは新しいレコードを追加し、-t
オプションはタイプを定義します (httpd_sys_content_t
)。"/web(/.*)?"
正規表現を使用すると、semanage
は、web/
およびその中のファイルに変更を適用します。このコマンドを実行しても、タイプを直接変更しません。web/
ファイルおよびこのファイルには、default_t
タイプのラベルが付けられます。semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -dZ /web
~]$ ls -dZ /web drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /web
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage 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
/web(/.*)? system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
restorecon
ユーティリティーを使用して、web/
のタイプと、その中のすべてのファイルを変更します。-R
は再帰用です。これは、web/
の下にあるすべてのファイルおよびディレクトリーにhttpd_sys_content_t
タイプのラベルが付けられることを意味します。semanage
により、/web(/.*)?
のfile.contexts.local
にエントリーが追加されたため、restorecon
によりタイプがhttpd_sys_content_t
に変わります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、新規作成されたファイルおよびディレクトリーは親ディレクトリーの SELinux タイプを継承する点に注意してください。
手順4.10 追加したコンテキストの削除
/web(/.*)?
のように、コンテキストが正規表現の一部である場合は、正規表現を引用符で囲んでください。
semanage fcontext -d "/web(/.*)?"
~]# semanage fcontext -d "/web(/.*)?"
- コンテキストを削除するには、root で次のコマンドを実行します。
file_contexts.local
の最初の部分は file-name|directory-name です。semanage fcontext -d file-name|directory-name
~]# semanage fcontext -d file-name|directory-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下は、file_contexts.local
のコンテキストの例になります。/test system_u:object_r:httpd_sys_content_t:s0
/test system_u:object_r:httpd_sys_content_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最初のパートはtest
です。restorecon の実行後、またはファイルシステムの再ラベル付け後に、test/
ディレクトリーにhttpd_sys_content_t
のラベルが付けられないようにするには、root で次のコマンドを実行して、file_contexts.local
からコンテキストを削除します。semanage fcontext -d /test
~]# semanage fcontext -d /test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
restorecon
ユーティリティーを使用して、デフォルトの SELinux コンテキストを復元します。
4.7.3. ファイルコンテキストの決定方法 リンクのコピーリンクがクリップボードにコピーされました!
.fc
ファイル) で指定されているファイルコンテキスト定義に基づいて行われます。semanage
は、システムポリシーに基づいて、file_contexts.homedirs
ファイルと file_contexts
ファイルを生成します。
file_contexts.local
ファイルに保存されます。
matchpathcon
または restorecon
などのラベリングユーティリティーが、指定されたパスに適したラベルを決定する場合は、最初にローカル変更 (file_contexts.local
) を検索します。一致するパターンが見つからない場合は、file_contexts.homedirs
ファイルが検索され、最後にfile_contexts
ファイルが検索されます。ただし、指定したファイルパスに一致するものが見つかると、検索が終了します。このユーティリティーは、追加の file-context 定義を検索します。つまり、ホームディレクトリー関連のファイルコンテキストの優先度は、その他のファイルコンテキストの優先度よりも高く、ローカルのカスタマイズによりシステムポリシーが上書きされます。
system policy
で指定されるファイルコンテキストの定義 (file_contexts.homedirs
ファイルおよび file_contexts
ファイルのコンテンツ) は、評価前に stem (ワイルドカードの前のパスの接頭辞) の長さでソートされます。つまり、最も具体的なパスが選択されます。ただし、semanage fcontext を使用して指定したファイルコンテキスト定義は、定義された方法とは逆の順序で評価されます。つまり、直近のエントリーは、stem の長さに関係なく最初に評価されます。
chcon
を使用してファイルコンテキストを変更する方法は、「一時的な変更: chcon」 を参照してください。- semanage fcontext を使用したファイルコンテキストの定義の変更および追加は、「永続的な変更 - semanage fcontext」 を参照してください。
- システムポリシーオペレーションを介してファイルコンテキスト定義を変更して追加する場合は、「SELinux ラベルの維持」 または 「SELinux ポリシーモジュールの優先付けと無効化」 を参照してください。
4.8. file_t タイプおよび default_t タイプ リンクのコピーリンクがクリップボードにコピーされました!
file_t
タイプは EA 値がまだ割り当てられていないファイルのデフォルトタイプになります。このタイプはこの目的にのみ使用され、正しくラベル付けされたファイルシステムには存在しません。SELinux を実行しているシステム上のすべてのファイルには適切な SELinux コンテキストがあり、file_t
タイプは file-context 設定では使用されません。[4].
default_t
タイプは、file-context 設定のパターンと一致しないファイルで使用されます。そのため、このようなファイルはディスクにコンテキストを持たないファイルから区別でき、通常は制限のあるドメインからアクセスできなくなります。たとえば、mydirectory/
などの新しい最上位のディレクトリーを作成した場合には、このディレクトリーには default_t タイプのラベルが付けられます。サービスがこのディレクトリーにアクセスする必要がある場合は、この場所の file-contexts 設定を更新する必要があります。file-context 設定にコンテキストを追加する方法は、「永続的な変更 - semanage fcontext」 を参照してください。
/etc/selinux/targeted/contexts/files/
ディレクトリーのファイルは、ファイルおよびディレクトリーのコンテキストを定義します。このディレクトリーのファイルは、restorecon
ユーティリティーおよび setfiles
ユーティリティーにより読み込まれ、ファイルおよびディレクトリーをデフォルトコンテキストに復元します。
4.9. ファイルシステムのマウント リンクのコピーリンクがクリップボードにコピーされました!
context
オプションで指定したコンテキストはディスクに書き込まれません。元のコンテキストは保持され、ファイルシステムに拡張属性がある場合は、context
なしでマウントすると確認できます。
4.9.1. コンテキストマウント リンクのコピーリンクがクリップボードにコピーされました!
nfs_t
タイプを使用します。追加のマウントオプションがないと、Apache HTTP サーバーなどの他のサービスを使用した NFS ボリュームの共有を防ぐことができます。以下の例は、Apache HTTP Server を使用して共有できるように NFS ボリュームをマウントしています。
mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
-o context
で指定した SELinux コンテキストがあるようです。ただし、これらの変更はディスクには書き込まれないため、このオプションで指定したコンテキストはマウント間で維持されません。したがって、必要なコンテキストを維持するには、すべてのマウント時に指定したコンテキストでこのオプションを使用する必要があります。コンテキストマウントを永続化する方法の詳細は、「コンテキストマウントの永続化」 を参照してください。
-o context
コンテキストで SELinux コンテキストを上書きする場合は、SELinux の system_u
ユーザーおよび object_r
ロールを使用し、タイプに集中します。MLS ポリシーまたは複数カテゴリーのセキュリティーを使用していない場合は、s0
レベルを使用します。
context
オプションでマウントされると、ユーザーおよびプロセスによるコンテキストの変更が禁止されます。たとえば、context
オプションでマウントされたファイルシステムで chcon コマンドを実行すると、Operation not supported
のエラーが発生します。
4.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"
~]# 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
タイプのラベルが付けられたファイルを読み取ることができません。これにより、このタイプのラベルが付けられたファイルシステムがマウントされ、他のサービスによって読み込まれたりエクスポートしたりできなくなる可能性があります。
context
オプションを使用して nfs_t
タイプを上書きします。以下のコンテキストオプションを使用して NFS ボリュームをマウントし、Apache HTTP サーバーを使用して共有できるようにします。
mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
context
オプションを使用してファイルシステムをマウントする代わりに、ブール値を有効にして、nfs_t
タイプのラベルが付けられたファイルシステムへのサービスアクセスを許可できます。nfs_t
タイプへのサービスアクセスを許可するブール値の設定方法については、パートII「制限のあるサービスの管理」 を参照してください。
4.9.4. 複数の NFS マウント リンクのコピーリンクがクリップボードにコピーされました!
web/
と database/
の 2 つのサブディレクトリーを持つ 1 つのエクスポート export/
があります。以下のコマンドは、1 つの NFS エクスポートから 2 つのマウントを試み、各マウントに対してコンテキストを上書きしようとします。
mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
~]# 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"
~]# 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)
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/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"
~]# mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
server:/export/web
が /local/web/
ディレクトリーにローカルにマウントされ、すべてのファイルに httpd_sys_content_t
タイプのラベルが付けられ、Apache HTTP Server へのアクセスが許可されます。server:/export/database
は /local/database/
にローカルにマウントされ、すべてのファイルに mysqld_db_t
タイプのラベルが付けられ、MariaDB アクセスが許可されます。これらのタイプの変更はディスクには書き込まれません。
nosharecache
オプションを使用すると、/export/web/
を複数回マウントするなど、異なるコンテキストで、エクスポートの同じサブディレクトリーを複数回マウントできます。異なるコンテキストのエクスポートから同じサブディレクトリーを複数回マウントしないでください。マウントと重複するマウントが作成され、ファイルには 2 つの異なるコンテキストでアクセスできます。
4.9.5. コンテキストマウントの永続化 リンクのコピーリンクがクリップボードにコピーされました!
/etc/fstab
ファイルまたはオートマウントマップでファイルシステムのエントリーを追加し、マウントオプションとして必要なコンテキストを使用します。以下の例では、NFS コンテキストマウントの /etc/fstab
にエントリーを追加します。
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0
4.10. SELinux ラベルの維持 リンクのコピーリンクがクリップボードにコピーされました!
4.10.1. ファイルおよびディレクトリーのコピー リンクのコピーリンクがクリップボードにコピーされました!
user_home_t
タイプのラベルが付けられます。
touch file1
~]$ touch file1
ls -Z file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
/etc
などの別のディレクトリーにコピーすると、/etc
のデフォルトのラベル付けルールに従って、新しいファイルが作成されます。追加オプションなしでファイルをコピーすると、元のコンテキストが保持されない場合があります。
ls -Z file1
~]$ ls -Z file1
-rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
cp file1 /etc/
~]# cp file1 /etc/
ls -Z /etc/file1
~]$ 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_t
タイプのラベルが付けられます。
--preserve=context
など、元のファイルのコンテキストを保持するためにユーザーがcpオプションを指定しない限り、既存ファイルのコンテキストが保持されます。SELinux ポリシーは、コピー中にコンテキストが保持されないことがあります。
手順4.11 SELinux コンテキストを保持せずにコピーする
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/
ディレクトリーには、以下のコマンドのようにhttpd_sys_content_t
タイプのラベルが付けられます。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow file1
が/var/www/html/
にコピーされると、httpd_sys_content_t
タイプを継承します。cp file1 /var/www/html/
~]# cp file1 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.12 コピー時の SELinux コンテキストの保持
--preserve=context
オプションを使用して、コピー時にコンテキストを保持する方法を説明します。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/
ディレクトリーには、以下のコマンドのようにhttpd_sys_content_t
タイプのラベルが付けられます。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --preserve=context
オプションを使用すると、コピー操作時に SELinux コンテキストが保持されます。以下に示すように、ファイルが/var/www/html/
にコピーされると、user_home_t
タイプのfile1
が保持されます。cp --preserve=context file1 /var/www/html/
~]# cp --preserve=context file1 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.13 コンテキストのコピーと変更
--context
オプションを使用して宛先コピーのコンテキストを変更する方法を説明します。以下の例は、ユーザーのホームディレクトリーで実行されます。
- ユーザーのホームディレクトリーにファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --context
オプションを使用して SELinux コンテキストを定義します。cp --context=system_u:object_r:samba_share_t:s0 file1 file2
~]$ cp --context=system_u:object_r:samba_share_t:s0 file1 file2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow --context
がない場合、file2
にはunconfined_u:object_r:user_home_t
コンテキストでラベルが付けられます。ls -Z file1 file2
~]$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順4.14 既存ファイルを介したファイルのコピー
- root として、
/etc
ディレクトリーに新しいファイルfile1
を作成します。以下に示すように、ファイルにはetc_t
タイプのラベルが付けられています。touch /etc/file1
~]# touch /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 別のファイル
file2
を/tmp
ディレクトリーに作成します。以下に示すように、ファイルにはuser_tmp_t
タイプのラベルが付けられます。touch /tmp/file2
~]$ touch /tmp/file2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~$ ls -Z /tmp/file2 -rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
~$ ls -Z /tmp/file2 -rw-r--r-- root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow file1
をfile2
で上書きします。cp /tmp/file2 /etc/file1
~]# cp /tmp/file2 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - コピーした後、次のコマンドを実行すると、
/etc/file1
を置き換えた/tmp/file2
のuser_tmp_t
タイプではなく、etc_t
タイプのラベルが付けられたfile1
が表示されます。ls -Z /etc/file1
~]$ ls -Z /etc/file1 -rw-r--r-- root root unconfined_u:object_r:etc_t:s0 /etc/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.10.2. ファイルとディレクトリーの移動 リンクのコピーリンクがクリップボードにコピーされました!
/var/www/html/
ディレクトリーにファイルを移動する方法を示しています。ファイルは移動されるため、正しい SELinux コンテキストは継承されません。
手順4.15 ファイルとディレクトリーの移動
- ホームディレクトリーに移動し、そこでファイルを作成します。ファイルには、
user_home_t
タイプのラベルが付けられます。touch file1
~]$ touch file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z file1
~]$ ls -Z file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、
/var/www/html/
ディレクトリーの SELinux コンテキストを表示します。ls -dZ /var/www/html/
~]$ ls -dZ /var/www/html/ drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、/var/www/html/
にはhttpd_sys_content_t
タイプのラベルが付けられます。/var/www/html/
に作成されたファイルおよびディレクトリーは、このタイプを継承します。 - root で
file1
を/var/www/html/
に移動します。このファイルは移動したので、現在のuser_home_t
タイプを保持します。mv file1 /var/www/html/
~]# mv file1 /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1
~]# ls -Z /var/www/html/file1 -rw-rw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
user_home_t
タイプのラベルが付けられたファイルを読み取ることができません。Web ページを含むすべてのファイルに user_home_t
タイプのラベルが付けられている場合、または Apache HTTP Server が読み取れない別のタイプの場合、Mozilla Firefox などの Web ブラウザーを使用してそれらにアクセスしようとすると、パーミッションが拒否されます。
4.10.3. デフォルトの SELinux コンテキストの確認 リンクのコピーリンクがクリップボードにコピーされました!
matchpathcon
ユーティリティーを使用して、ファイルおよびディレクトリーに正しい SELinux コンテキストがあるかどうかを確認します。このユーティリティーは、system policy
にクエリーを行い、ファイルパスに関連付けられたデフォルトのセキュリティーコンテキストを提供します。[6] 以下の例では、matchpathcon を使用して、/var/www/html/
ディレクトリーのファイルに正しくラベル付けされていることを確認します。
手順4.16 matchpathcon
を使用したデフォルトの SELinux Conxtext の確認
- root ユーザーとして、
/var/www/html/
ディレクトリーに 3 つのファイル (file1
、file2
、およびfile3
) を作成します。これらのファイルは、/var/www/html/
からhttpd_sys_content_t
タイプを継承します。touch /var/www/html/file{1,2,3}
~]# touch /var/www/html/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
file1
タイプをsamba_share_t
に変更します。Apache HTTP Server は、samba_share_t
タイプのラベルが付けられたファイルまたはディレクトリーを読み取ることができないことに注意してください。chcon -t samba_share_t /var/www/html/file1
~]# chcon -t samba_share_t /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow matchpathcon
-V
オプションは、現在の SELinux コンテキストを SELinux ポリシー内の正しいデフォルトコンテキストと比較します。以下のコマンドを実行して、/var/www/html/
ディレクトリー内の全ファイルをチェックします。matchpathcon -V /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.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
/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
にアクセスできるようにするには、restorecon
ユーティリティーを使用します。
restorecon -v /var/www/html/file1
~]# 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 -
~]$ tar -xvf archive.tar | restorecon -f -
restorecon
を実行するためには、root ユーザーでなければならない場合があることに注意してください。
tar
アーカイブの作成を示しています。
手順4.17 tar アーカイブの作成
/var/www/html/
ディレクトリーに移動し、その SELinux コンテキストを表示します。cd /var/www/html/
~]$ cd /var/www/html/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow html]$ ls -dZ /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
html]$ ls -dZ /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
/var/www/html/
に 3 つのファイル (file1
、file2
、およびfile3
) を作成します。これらのファイルは、/var/www/html/
からhttpd_sys_content_t
タイプを継承します。html]# touch file{1,2,3}
html]# touch file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、以下のコマンドを実行して、
test.tar
という名前のtar
アーカイブを作成します。SELinux コンテキストを維持するには、--selinux
を使用します。html]# tar --selinux -cf test.tar file{1,2,3}
html]# tar --selinux -cf test.tar file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
test/
という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。mkdir /test
~]# mkdir /test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 777 /test/
~]# chmod 777 /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test.tar
ファイルをtest/
にコピーします。cp /var/www/html/test.tar /test/
~]$ cp /var/www/html/test.tar /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/
ディレクトリーに移動します。このディレクトリーに移動し、以下のコマンドを実行してtar
アーカイブをデプロイメントします。--selinux
オプションを再度指定すると、SELinux コンテキストがdefault_t
に変更されます。cd /test/
~]$ cd /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test]$ tar --selinux -xvf test.tar
test]$ tar --selinux -xvf test.tar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux コンテキストを表示します。
httpd_sys_content_t
タイプはdefault_t
に変更されず、保持されました。これは、--selinux
が使用されていなかったとしたら、変更されていたでしょう。Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/
ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリー内のすべてのファイルも削除します。rm -ri /test/
~]# rm -ri /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
--xattrs
オプションなどのtar
の詳細は、tar(1) man ページを参照してください。
4.10.5. starを使用したファイルのアーカイブ リンクのコピーリンクがクリップボードにコピーされました!
star
ユーティリティーは、デフォルトで拡張属性を保持しません。SELinux コンテキストは拡張属性に保存されるため、ファイルのアーカイブ時にコンテキストが失われる可能性があります。star -xattr -H=exustar コマンドを使用して、コンテキストを保持するアーカイブを作成します。star パッケージはデフォルトでインストールされません。star をインストールするには、root ユーザーとして yum install star を実行します。
star
アーカイブの作成を示しています。
手順4.18 star
アーカイブの作成
- root で、
/var/www/html/
に 3 つのファイル (file1
、file2
、およびfile3
) を作成します。これらのファイルは、/var/www/html/
からhttpd_sys_content_t
タイプを継承します。touch /var/www/html/file{1,2,3}
~]# touch /var/www/html/file{1,2,3}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/
ディレクトリーに変更します。このディレクトリーに、root で以下のコマンドを実行して、test.star
という名前のstar
アーカイブを作成します。cd /var/www/html
~]$ cd /var/www/html
Copy to Clipboard Copied! Toggle word wrap Toggle overflow html]# star -xattr -H=exustar -c -f=test.star file{1,2,3} star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
html]# star -xattr -H=exustar -c -f=test.star file{1,2,3} star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
test/
という名前の新規ディレクトリーを作成し、すべてのユーザーによる完全なアクセスを許可します。mkdir /test
~]# mkdir /test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 777 /test/
~]# chmod 777 /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行して、
test.star
ファイルをtest/
にコピーします。cp /var/www/html/test.star /test/
~]$ cp /var/www/html/test.star /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/
に移動します。このディレクトリーに移動したら、以下のコマンドを実行してstar
アーカイブをデプロイメントします。cd /test/
~]$ cd /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test]$ star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
test]$ star -x -f=test.star star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux コンテキストを表示します。
httpd_sys_content_t
タイプはdefault_t
に変更されず、保持されています。これは、-xattr -H=exustar
オプションが使用されていなかったとしたら、変更されていたでしょう。Copy to Clipboard Copied! Toggle word wrap Toggle overflow test/
ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリー内のすべてのファイルも削除します。rm -ri /test/
~]# rm -ri /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow star
が不要になった場合は、root でパッケージを削除します。yum remove star
~]# yum remove star
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
star
の詳細は、star(1) man ページを参照してください。
4.11. 情報収集ツール リンクのコピーリンクがクリップボードにコピーされました!
avcstat
/sys/fs/selinux/avc/cache_stats
であるため、-f /path/to/file
で別のキャッシュファイルを指定できます。
avcstat
~]# avcstat
lookups hits misses allocs reclaims frees
47517410 47504630 12780 12780 12176 12275
seinfo
seinfo
は、policy.conf
ファイル、バイナリーポリシーファイル、モジュール形式のポリシーパッケージリスト、またはポリシーリストファイルを入力として使用するコマンドラインユーティリティーです。seinfo
ユーティリティーを使用するには、setools-console パッケージがインストールされている必要があります。
seinfo
の出力はバイナリーファイルとソースファイルで異なります。たとえば、ポリシーソースファイルでは、{ }
括弧を使用して複数のルール要素を 1 行にグループ化します。同様の効果は、単一の属性が 1 つまたは複数のタイプにデプロイメントされる属性で行われます。これらはデプロイメントされ、バイナリーポリシーファイルでは関連性がなくなったため、検索結果での戻り値はゼロになります。ただし、括弧を使用した 1 行ルールが複数行になったため、ルールの数が大幅に増えています。
seinfo
ユーティリティーは、ドメイン属性でタイプ数をリスト表示することもできます。これにより、さまざまな制限のあるプロセスの数を見積もります。
seinfo -adomain -x | wc -l
~]# seinfo -adomain -x | wc -l
550
unconfined_domain
属性を使用します。
seinfo -aunconfined_domain_type -x | wc -l
~]# seinfo -aunconfined_domain_type -x | wc -l
52
--permissive
オプションでカウントできます。
seinfo --permissive -x | wc -l
~]# seinfo --permissive -x | wc -l
31
sesearch
sesearch
ユーティリティーを使用して、ポリシー内の特定のルールを検索できます。ポリシーソースファイルまたはバイナリーファイルのいずれかを検索できます。以下に例を示します。
sesearch
ユーティリティーは、allow ルールの数を提供できます。
sesearch --allow | wc -l
~]# sesearch --allow | wc -l
262798
sesearch --dontaudit | wc -l
~]# sesearch --dontaudit | wc -l
156712
4.12. SELinux ポリシーモジュールの優先付けと無効化 リンクのコピーリンクがクリップボードにコピーされました!
/etc/selinux/
の SELinux モジュールストレージでは、SELinux モジュールで優先度を使用できます。root で次のコマンドを実行すると、異なる優先度の 2 つのモジュールディレクトリーが表示されます。
ls /etc/selinux/targeted/active/modules
~]# 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
~]# semodule -X 400 -i sandbox.pp
~]# semodule --list-modules=full | grep sandbox
400 sandbox pp
100 sandbox pp
semodule -X 400 -r sandbox
~]# semodule -X 400 -r sandbox
libsemanage.semanage_direct_remove_key: sandbox module at priority 100 is now active.
システムポリシーモジュールの無効化
system policy
を無効にするには、root で以下のコマンドを実行します。
semodule -d MODULE_NAME
semodule -d MODULE_NAME
system policy
モジュールを削除すると、システムのストレージから削除されるため、再度読み込むことができません。すべてのsystem policy
モジュールを復元するために、selinux-policy-targeted パッケージが不必要に再インストールされないようにするには、代わりにsemodule -d を使用します。
4.13. Multi-Level Security (MLS) リンクのコピーリンクがクリップボードにコピーされました!
図4.1 クリアランスのレベル
図4.2 MLS を使用した許可されたデータフロー
4.13.1. MLS およびシステム権限 リンクのコピーリンクがクリップボードにコピーされました!
4.13.2. SELinux での MLS の有効化 リンクのコピーリンクがクリップボードにコピーされました!
手順4.19 SELinux MLS ポリシーの有効化
- selinux-policy-mls パッケージをインストールします。
yum install selinux-policy-mls
~]# yum install selinux-policy-mls
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MLS ポリシーを有効にする前に、ファイルシステムの各ファイルに、MLS ラベルで再ラベル付けする必要があります。ファイルシステムに再ラベル付けすると、制限されたドメインのアクセスが拒否される可能性があります。これにより、システムが正しく起動しなくなる可能性があります。これを防ぐには、
/etc/selinux/config
ファイルでSELINUX=permissive
を設定します。また、SELINUXTYPE=mls
を設定して、MLS ポリシーを有効にします。設定ファイルは以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux が Permissive モードで実行していることを確認します。
setenforce 0
~]# setenforce 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow getenforce
~]$ getenforce Permissive
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - fixfiles スクリプトを使用して、
-F
オプションを含む/.autorelabel
ファイルを作成し、次回のシステムの再起動時にファイルに再ラベル付けされるようにします。fixfiles -F onboot
~]# fixfiles -F onboot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動します。次回の起動時に、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. ***********
*** Warning -- SELinux mls policy relabel is required. *** Relabeling could take a very long time, depending on file *** system size and speed of hard drives. ***********
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 一番下の行にある*
(アスタリスク) 文字は、ラベル付けされている 1000 ファイルを表します。上記の例では、11 の*
文字が、ラベルが付けられた 11000 ファイルを表しています。すべてのファイルにラベルを付けるのにかかる時間は、システムのファイル数と、ハードディスクドライブの速度により異なります。最新のシステムでは、このプロセスに 10 分程度かかる場合があります。ラベリングプロセスが終了すると、システムが自動的に再起動します。 - Permissive モードでは SELinux ポリシーは強制されませんが、Enforcing モードで実行された場合に拒否されたであろうアクションの拒否は引き続きログに記録されます。Enforcing モードに切り替える前に、root で次のコマンドを実行して、システムの最後の起動時に SELinux がアクションを拒否しなかったことを確認します。最後のシステムの起動時に SELinux がアクションを拒否しなかった場合に、このコマンドを実行しても出力は返されません。システムの起動時に SELinux がアクセスを拒否された場合のトラブルシューティングは、11章トラブルシューティング を参照してください。
grep "SELinux is preventing" /var/log/messages
~]# grep "SELinux is preventing" /var/log/messages
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/log/messages
ファイルに拒否メッセージがないか、すでに拒否を解決している場合は、/etc/selinux/config
ファイルにSELINUX=enforcing
を設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動し、SELinux が Enforcing モードで実行していることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MLS ポリシーが有効になっていることも確認します。sestatus |grep mls
~]# sestatus |grep mls Policy from config file: mls
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.13.3. 特定の MLS 範囲を持つユーザーの作成 リンクのコピーリンクがクリップボードにコピーされました!
手順4.20 特定の MLS 範囲を持つユーザーの作成
- useradd コマンドを使用して新しい Linux ユーザーを追加し、その新しい Linux ユーザーを既存の SELinux ユーザー (この例では
staff_u
) にマッピングします。useradd -Z staff_u john
~]# useradd -Z staff_u john
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しく作成した Linux ユーザーにパスワードを割り当てます。
prompt~]# passwd john
prompt~]# passwd john
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行し、SELinux ユーザーと Linux ユーザー間のマッピングを表示します。出力は、以下のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ユーザー
john
に指定範囲を定義します。semanage login --modify --range s2:c100 john
~]# semanage login --modify --range s2:c100 john
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux ユーザーと Linux ユーザー間のマッピングを再度表示します。ユーザー
john
には、指定した MLS レンジが定義されていることに注意してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 必要に応じて、john のホームディレクトリーのラベルを修正するには、次のコマンドを入力します。
chcon -R -l s2:c100 /home/john
~]# chcon -R -l s2:c100 /home/john
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.13.4. Polyinstantiated ディレクトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
/tmp
ディレクトリーおよび /var/tmp/
ディレクトリーは、通常、すべてのプログラム、サービス、およびユーザーが一時的に保存するために使用されます。ただし、このような設定を行うと、競合状態攻撃や、ファイル名に基づく情報漏えいに対して脆弱になります。SELinux は、polyinstantiated ディレクトリーの形式でソリューションを提供します。これは、事実上、/tmp
と /var/tmp/
の両方がインスタンス化され、各ユーザーに対して非公開になっていることを意味します。ディレクトリーのインスタンス化を有効にすると、各ユーザーの /tmp
ディレクトリーおよび /var/tmp/
ディレクトリーが、/tmp-inst
および /var/tmp/tmp-inst
に自動的にマウントされます。
手順4.21 ポリインスタンス化ディレクトリーの有効化
/etc/security/namespace.conf
ファイルの最後の 3 行のコメントを解除して、/tmp
、/var/tmp/
、およびユーザーのホームディレクトリーのインスタンス化を有効にします。tail -n 3 /etc/security/namespace.conf
~]$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/pam.d/login
ファイルーで、pam_namespace.so
モジュールが session 用に設定されていることを確認します。grep namespace /etc/pam.d/login
~]$ grep namespace /etc/pam.d/login session required pam_namespace.so
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - システムを再起動します。
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")
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")
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()
システムコールを使用すると、あるプロセスで別のプロセスの実行を監視および制御し、そのメモリーとレジスターを変更できます。この呼び出しは、strace
ユーティリティーの使用など、デバッグ中の開発者が主に使用します。ptrace()
が必要ない場合は無効にして、システムセキュリティーを向上させることができます。これは、deny_ptrace
ブール値を有効にすると実行できます。これにより、unconfined_t
のドメインで実行しているプロセスであっても、他のプロセスでptrace()
を使用できなくなります。
deny_ptrace
ブール値は、デフォルトでは無効になっています。これを有効にするには、root で setsebool -P deny_ptrace on を実行します。
setsebool -P deny_ptrace on
~]# setsebool -P deny_ptrace on
getsebool deny_ptrace
~]$ getsebool deny_ptrace
deny_ptrace --> on
setsebool -P deny_ptrace off
~]# 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
~]# 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 スイート リンクのコピーリンクがクリップボードにコピーされました!
sepolicy
ユーティリティーは、インストールした SELinux ポリシーをクエリーする一連の機能を提供します。このような機能は、新しく追加されたものか、以前は sepolgen
または setrans
などの別のユーティリティーで提供されていました。このスイートにより、移行レポート、man ページ、または新しいポリシーモジュールを生成できるようになり、ユーザーのアクセスが容易になり、SELinux ポリシーをより深く理解できるようになります。
sepolicy
を提供します。sepolicy
をインストールする場合は、root で以下のコマンドを実行します。
yum install policycoreutils-devel
~]# yum install policycoreutils-devel
sepolicy
スイートは、コマンドラインパラメーターとして呼び出される以下の機能を提供します。
機能 | 説明 |
---|---|
ブール値 | ブール値の説明を表示するには、SELinux ポリシーをクエリーします。 |
通信 | SELinux ポリシーをクエリーして、ドメインが互いに通信できるかどうかを確認します。 |
generate | SELinux ポリシーモジュールテンプレートの生成 |
gui | SELinux ポリシーのグラフィカルユーザーインターフェイス |
interface | SELinux ポリシーのインターフェイスのリストを表示する |
man ページ | SELinux の man ページの生成 |
network | SELinux ポリシーのネットワーク情報をクエリーする |
遷移 | SELinux ポリシーのクエリーと、プロセスの移行レポートの生成 |
5.1. sepolicy Python のバインディング リンクのコピーリンクがクリップボードにコピーされました!
sesearch
ユーティリティーおよび seinfo
ユーティリティーが同梱されていました。sesearch
ユーティリティーは SELinux ポリシー内のルールを検索するのに使用しますが、seinfo
ユーティリティーは、ポリシー内の他のさまざまなコンポーネントにクエリーできるようにします。
sepolicy
スイートでこのユーティリティーの機能を使用できるように、sesearch
および seinfo
用の Python バインディングが追加されました。以下の例を参照してください。
5.2. SELinux ポリシーモジュールの生成: sepolicy generate リンクのコピーリンクがクリップボードにコピーされました!
sepolgen
またはユーティリティー selinux-polgengui
ユーティリティーが使用されていました。このツールは、sepolicy
スイートに統合されています。Red Hat Enterprise Linux 7 では、sepolicy generate
コマンドを使用して最初の SELinux ポリシーモジュールテンプレートを生成します。
sepolgen
とは異なり、root ユーザーとして sepolicy generate を実行する必要はありません。また、このユーティリティーは、RPM 仕様ファイルを作成します。これを使用して、ポリシーパッケージファイル (NAME.pp
) とインターフェイスファイル (NAME.if
) を正しい場所にインストールする RPM パッケージを構築し、SELinux ポリシーをカーネルにインストールして、ラベリングを修正します。セットアップスクリプトは、引き続き SELinux ポリシーをインストールし、ラベリングを設定します。また、インストールしたポリシーに基づく man ページは、sepolicy manpage コマンドを使用して生成されます。[7] 最後に、sepolicy generate が SELinux ポリシーと man ページを構築してコンパイルし、RPM パッケージを作成します。これにより、別のシステムにインストールできるようになります。
sepolicy generate
を実行すると、以下のファイルが生成されます。
NAME.te
– Type Enforcement ファイル- このファイルは、特定のドメインに対するすべてのタイプとルールを定義します。
NAME.if
- インターフェイスファイル- このファイルは、システムのデフォルトのファイルコンテキストを定義します。これは、
NAME.te
ファイルで作成されるファイルタイプを取り、ファイルのパスをタイプに関連付けます。restorecon
およびrpm
などのユーティリティーは、このパスを使用してラベルを書き込みます。 NAME_selinux.spec
– RPM SPEC ファイル- このファイルは、SELinux ポリシーをインストールし、ラベリングを設定する RPM SPEC ファイルです。このファイルでは、インターフェイスファイルと、ポリシーを説明する man ページもインストールされます。sepolicy manpage -d NAME コマンドを使用すると、man ページを生成できます。
NAME.sh
- ヘルパーシェルスクリプト- このスクリプトは、システムでラベリングをコンパイル、インストール、および修正するのに役立ちます。また、インストールしたポリシーに基づいて man ページを生成し、他のシステムにインストールするのに適した RPM パッケージをコンパイルして構築します。
sepolicy generate
はソースドメインからターゲットドメインに生成されたすべてのパスを出力します。sepolicy generate
の詳細は、sepolicy-generate(8) man ページを参照してください。
5.3. ドメイントランジションの概要: sepolicy transition リンクのコピーリンクがクリップボードにコピーされました!
setrans
ユーティリティーを使用して、2 つのドメインまたはプロセスタイプ間の移行が可能であり、これらのドメインまたはプロセス間の移行に使用されるすべての中間タイプを出力していました。Red Hat Enterprise Linux 7 では、setrans
が sepolicy
スイートに同梱され、代わりに sepolicy transition
コマンドが使用されるようになりました。
sepolicy transition
コマンドは、SELinux ポリシーにクエリーし、プロセスの移行レポートを作成します。sepolicy transition コマンドには、ソースドメイン (-s
オプションで指定) とターゲットドメイン (-t
オプションで指定) の 2 つのコマンドライン引数が必要です。ソースドメインのみを入力した場合は、sepolicy transition
により、ソースドメインが移行可能なドメインがすべてリスト表示されます。以下の出力には、すべてのエントリーが含まれているわけではありません。「@」 の文字は、「execute」 を意味します。
sepolicy transition
はソースドメインからターゲットドメインへのすべての移行パスについて SELinux ポリシーを検査し、これらのパスをリスト表示します。以下の出力は完了していません。
sepolicy transition
の詳細は、sepolicy-transition(8) man ページを参照してください。
5.4. 手動ページの生成: sepolicy manpage リンクのコピーリンクがクリップボードにコピーされました!
sepolicy manpage
コマンドは、ドメインを処理する SELinux ポリシーに基づいて man ページを生成します。その結果、このようなドキュメントは常に最新になります。自動生成される man ページの名前は、それぞれプロセスドメイン名と、_selinux
の接尾辞 (httpd_selinux
など) で設定されます。
Entrypoints
セクションには、ドメイン移行時に実行する必要がある実行ファイルがすべて含まれています。Process Types
セクションでは、ターゲットドメインと同じ接頭辞で始まるプロセスタイプをすべて表示します。Booleans
セクションは、ドメインに関連付けられたブール値のリストを表示します。Port Types
セクションにはドメインと同じ接頭辞に一致するポートタイプが含まれ、これらのポートタイプに割り当てられるデフォルトのポート番号を説明します。Managed Files
のセクションでは、ドメインへの書き込みが許可されるタイプと、これらのタイプに関連付けられたデフォルトのパスを説明します。File Contexts
セクションには、ドメインに関連付けられたすべてのファイルタイプと、これらのファイルタイプとシステム上のデフォルトのパスラベリングの使用方法が説明されています。Sharing Files
セクションでは、public_content_t
などのドメイン共有タイプの使用方法を説明します。
sepolicy manpage
の詳細は、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 のユーザーマッピング リンクのコピーリンクがクリップボードにコピーされました!
__default__
ログインにマッピングされ、続いて、これは SELinux unconfined_u
ユーザーにマッピングされます。useradd コマンドで Linux ユーザーを作成し、オプションを指定しないと、SELinux unconfined_u
ユーザーにマッピングされます。以下は、default-mapping を定義します。
__default__ unconfined_u s0-s0:c0.c1023 *
__default__ unconfined_u s0-s0:c0.c1023 *
6.2. 新規の Linux ユーザーの制限: useradd リンクのコピーリンクがクリップボードにコピーされました!
unconfined_u
ユーザーにマッピングされた Linux ユーザーは、unconfined_t
ドメインで実行します。これは、unconfined_u
にマッピングされた Linux ユーザーとしてログインしながら id -Z を実行すると確認できます。
id -Z
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_t
ドメインで実行している場合は、SELinux ポリシールールが適用されますが、unconfined_t
ドメインで実行している Linux ユーザーのほぼすべてのアクセスを許可するポリシールールが存在します。制限のない Linux ユーザーが、unconfined_t
ドメインから自身の制限のあるドメインに移行できるものとして SELinux ポリシーが定義するアプリケーションを実行すると、制限のない Linux ユーザーは制限のあるドメインの制限を引き続き受けます。セキュリティー上の利点は、Linux ユーザーが制限されていなくても、アプリケーションは制限されたままになるため、アプリケーションの欠陥の悪用はポリシーにより制限される可能性があることです。
-Z
オプションを使用して、マッピング先の SELinux ユーザーを指定します。以下の例では、新しい Linux ユーザー useruuser
を作成し、そのユーザーを SELinux user_u
ユーザーにマップしています。SELinux user_u
ユーザーにマッピングされた Linux ユーザーは、user_t
ドメインで実行します。このドメインでは、SELinux ポリシーで setuid アプリケーションが許可 (passwd
など) されていない限り、Linux ユーザーは setuid アプリケーションを実行できず、su コマンドまたは sudo コマンドを実行できないため、これらのコマンドで root ユーザーになることができません。
手順6.1 新しい Linux ユーザーを user_u
SELinux ユーザーに限定する
- root で、SELinux
user_u
ユーザーにマッピングする新しい Linux ユーザー (useruuser
) を作成します。useradd -Z user_u useruuser
~]# useradd -Z user_u useruuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow useruuser
とuser_u
との間のマッピングを表示するには、root で以下のコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、Linux
useruuser
ユーザーにパスワードを割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現行セッションからログアウトし、Linux
useruuser
ユーザーとしてログインします。ログインすると、pam_selinux
により、Linux ユーザーが SELinux ユーザー (この例ではuser_u
) にマップされ、作成される SELinux コンテキストが設定されます。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを入力して、Linux ユーザーのコンテキストを表示します。id -Z
~]$ id -Z user_u:user_r:user_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux
useruuser
のセッションをログアウトし、アカウントで再度ログインします。Linuxuseruuser
を使用しない場合は、root で次のコマンドを実行し、ホームディレクトリーとともに削除します。userdel -Z -r useruuser
~]# userdel -Z -r useruuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3. 既存の Linux ユーザーの制限: semanage ログイン リンクのコピーリンクがクリップボードにコピーされました!
unconfined_u
ユーザー (デフォルトの動作) にマッピングされており、マップされている SELinux ユーザー を変更する場合は、semanage login コマンドを使用します。以下の例では、newuser
という名前の新しい Linux ユーザーを作成し、その Linux ユーザーを SELinux user_u
ユーザーにマップします。
手順6.2 SELinux ユーザーへの Linux ユーザーのマッピング
- root で、新しい Linux ユーザー (
newuser
) を作成します。このユーザーはデフォルトのマッピングを使用するため、semanage login -lの出力には表示されません。useradd newuser
~]# useradd newuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux
newuser
ユーザーを SELinuxuser_u
ユーザーにマッピングするには、root で以下のコマンドを実行します。semanage login -a -s user_u newuser
~]# semanage login -a -s user_u newuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -a
オプションは新しいレコードを追加し、-s
オプションは、Linux ユーザーをマッピングする SELinux ユーザーを指定します。最後の引数newuser
は、指定した SELinux ユーザーにマッピングする Linux ユーザーです。 - Linux
newuser
ユーザーとuser_u
との間のマッピングを表示するには、semanage
ユーティリティーを再度使用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、Linux
newuser
ユーザーにパスワードを割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在のセッションからログアウトし、Linux
newuser
ユーザーとしてログインします。次のコマンドを実行すると、newuser
の SELinux コンテキストが表示されます。id -Z
~]$ id -Z user_u:user_r:user_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux
newuser
のセッションをログアウトし、アカウントで再度ログインします。Linuxnewuser
を使用しない場合は、root で次のコマンドを実行し、ホームディレクトリーとともに削除します。userdel -r newuser
~]# userdel -r newuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow root で、Linuxnewuser
ユーザーおよびuser_u
間のマッピングを削除します。semanage login -d newuser
~]# semanage login -d newuser
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. デフォルトマッピングの変更 リンクのコピーリンクがクリップボードにコピーされました!
__default__
ログインにマッピングされ、続いて、これは SELinux unconfined_u
ユーザーにマッピングされます。新規の Linux ユーザーと、SELinux ユーザーに特別にマッピングされていない Linux ユーザーをデフォルトで制限する場合は、semanage login コマンドを使用してデフォルトのマッピングを変更します。
unconfined_u
から user_u
に変更されます。
semanage login -m -S targeted -s "user_u" -r s0 __default__
~]# semanage login -m -S targeted -s "user_u" -r s0 __default__
__default__
ログインが user_u
にマッピングされていることを確認します。
__default__
ログインと同様に、user_u
にマッピングされます。
unconfined_u
ユーザーに __default__
ログインをマッピングします。
semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
~]# semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__
6.5. xguest: キオスクモード リンクのコピーリンクがクリップボードにコピーされました!
xguest_u
に割り当てられています。表3.1「SELinux ユーザー機能」 を参照してください。ファイルの作成や設定の変更など、このアカウントでログインした変更は、ログアウトすると失われます。
- root で、xguest パッケージをインストールします。必要に応じて依存関係をインストールします。
yum install xguest
~]# yum install xguest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - キオスクアカウントをさまざまな人が使用できるようにするために、アカウントはパスワードで保護されていません。そのため、アカウントは SELinux が Enforcing モードで実行されている場合にのみ保護できます。このアカウントでログインする前に、
getenforce
ユーティリティーを使用して、SELinux が Enforcing モードで実行していることを確認します。getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 実行していない場合は、「SELinux のステータスおよびモードの永続的変更」 で Enforcing モードへの変更に関する詳細を参照してください。SELinux が Permissive モードまたは Disabled の場合は、このアカウントでログインできません。 - GNOME ディスプレイマネージャー (GDM) を使用しないと、このアカウントにログインできません。xguest パッケージがインストールされると、
Guest
アカウントが GDM ログイン画面に追加されます。
6.6. アプリケーションを実行するユーザーに対するブール値 リンクのコピーリンクがクリップボードにコピーされました!
/tmp
ディレクトリーでアプリケーション(ユーザーの権限を継承)を実行できないようにすると、欠陥のあるアプリケーションや悪意のあるアプリケーションが、ユーザーが所有するファイルを変更できなくなります。
setsebool
ユーティリティーで設定されます。setsebool -P は永続的な変更を行います。システムを再起動しても変更を持続させない場合は、-P
オプションを使用しないでください。
guest_t
guest_t
ドメイン内の Linux ユーザーによる、ホームディレクトリーおよび /tmp
でのアプリケーションの実行を阻止するには、次のコマンドを実行します。
setsebool -P guest_exec_content off
~]# setsebool -P guest_exec_content off
xguest_t
xguest_t
ドメイン内の Linux ユーザーによる、ホームディレクトリーおよび /tmp
でのアプリケーションの実行を阻止するには、次のコマンドを実行します。
setsebool -P xguest_exec_content off
~]# setsebool -P xguest_exec_content off
user_t
user_t
ドメイン内の Linux ユーザーによる、ホームディレクトリーおよび /tmp
でのアプリケーションの実行を阻止するには、次のコマンドを実行します。
setsebool -P user_exec_content off
~]# setsebool -P user_exec_content off
staff_t
staff_t
ドメイン内の Linux ユーザーによる、ホームディレクトリーおよび /tmp
でのアプリケーションの実行を阻止するには、次のコマンドを実行します。
setsebool -P staff_exec_content off
~]# setsebool -P staff_exec_content off
staff_exec_content
のブール値を有効にし、staff_t
ドメインの Linux ユーザーを許可して、ホームディレクトリーおよび /tmp
でアプリケーションを実行するには、以下のコマンドを実行します。
setsebool -P staff_exec_content on
~]# setsebool -P staff_exec_content on
第7章 Sandbox を使用したプログラムの保護 リンクのコピーリンクがクリップボードにコピーされました!
7.1. サンドボックスを使用したアプリケーションの実行 リンクのコピーリンクがクリップボードにコピーされました!
yum install policycoreutils-sandbox
~]# yum install policycoreutils-sandbox
sandbox [options] application_under_test
~]$ sandbox [options] application_under_test
-X
オプションを使用します。以下に例を示します。
sandbox -X evince
~]$ sandbox -X evince
-X
は、sandbox に、アプリケーションに限定されたセカンダリー X Server (この場合は evince) を設定してから、必要なリソースをコピーし、ユーザーの home
ディレクトリーまたは /tmp
ディレクトリーに閉じた仮想環境を作成するように指示します。
sandbox -H sandbox/home -T sandbox/tmp -X firefox
~]$ 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 ‑X ‑t sandbox_web_t firefox
sandbox (8)
man ページを参照してください。
第8章 sVirt リンクのコピーリンクがクリップボードにコピーされました!
非仮想化環境
仮想化環境
8.1. セキュリティーおよび仮想化 リンクのコピーリンクがクリップボードにコピーされました!
8.2. sVirt のラベル付け リンクのコピーリンクがクリップボードにコピーされました!
ps -eZ | grep qemu
~]# 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/libvirtimages/*
~]# ls -lZ /var/lib/libvirtimages/*
system_u:object_r:svirt_image_t:s0:c87,c520 image1
タイプ | SELinux コンテキスト | 説明 |
---|---|---|
仮想マシンプロセス | system_u:system_r:svirt_t:MCS1 | MCS1 は、ランダムに選択された MCS フィールドです。現在は、約 500,000 のラベルがサポートされています。 |
仮想マシンのイメージ | system_u:object_r:svirt_image_t:MCS1 | 同じ MCS フィールドで svirt_t とラベル付けされたプロセスのみが、このイメージファイルおよびデバイスの読み取り/書き込みが可能です。 |
仮想マシンの共有読み取り/書き込みコンテンツ | system_u:object_r:svirt_image_t:s0 | svirt_t のラベルが付いたすべてのプロセスは、svirt_image_t:s0 ファイルおよびデバイスに書き込むことができます。 |
仮想マシンのイメージ | system_u:object_r:virt_content_t:s0 | イメージが存在する場合に使用されるシステムのデフォルトラベル。svirt_t 仮想プロセスは、このラベルの付いたファイル/デバイスの読み取りはできません。 |
第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
system_u:system_r:httpd_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 管理者が手動で
init.rc
スクリプトを起動すると、デーモンが実行します。たとえば、service httpd restart コマンドを Apache サーバーで実行すると、表示される SELinux ラベルは次のようになります。unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
systemd
デーモンでは、遷移が大きく異なります。systemd
は、init_t
タイプを使用して、システムでデーモンを開始および停止するすべての呼び出しを処理するため、デーモンを手動で再起動すると、ラベルのユーザー部分を上書きできます。その結果、上記の両方のシナリオのラベルは、期待どおりに system_u:system_r:httpd_t:s0
で、SELinux ポリシーを改善して、どのドメインがどのユニットを制御できるかを管理できます。
10.1. サービスへの SELinux のアクセス権限 リンクのコピーリンクがクリップボードにコピーされました!
systemd
はすべてのサービスを開始および停止し、ユーザーとプロセスは、systemctl
ユーティリティーを使用して systemd
と通信します。systemd
デーモンは、SELinux ポリシーを調べ、呼び出しているプロセスのラベルと、呼び出し元が管理しようとしているユニットファイルのラベルを確認してから、呼び出し元のアクセスを許可するかどうかを SELinux に確認します。このアプローチにより、システムサービスの開始や停止などの、重要なシステム機能へのアクセス制御が強化されます。
systemctl
を実行して D-Bus メッセージを systemd
に送信できるようにする必要がありました。これにより、NetworkManager が要求するサービスが開始または停止します。実際、NetworkManager は、systemctl
ができることをすべて実行できるようになっていました。また、特定のサービスのみを開始または停止できるように、限定管理者を設定することもできませんでした。
systemd
は SELinux Access Manager としても機能します。systemctl
を実行しているプロセス、またはsystemd
に D-Bus メッセージを送信したプロセスのラベルを取得できます。次に、デーモンは、プロセスが設定するユニットファイルのラベルを探します。最後に、SELinux ポリシーでプロセスラベルとユニットファイルラベルとの間で特定のアクセスが許可されている場合、systemd
はカーネルから情報を取得できます。これは、特定のサービスに対して、systemd
と相互作用する必要がある侵害されたアプリケーションを SELinux が制限できることを意味します。ポリシー作成者は、このような粒度の細かい制御を使用して、管理者を制限することもできます。ポリシーの変更には、以下のパーミッションを持つ service
という名前の新しいクラスが関与します。
systemd
でのアクセス制御操作は、すべての場合で一致するわけではありません。SELinux アクセスログと、systemd
メソッド呼び出しをラインアップするためにマッピングが定義されました。表10.2「SELinux アクセスチェックでの systemd 一般システムコールのマッピング」 は、システム全般のアクセスチェックをカバーするのに対し、表10.1「SELinux アクセスチェックでの systemd ユニットファイルメソッド呼び出しのマッピング」 は、ユニットファイルのアクセスチェックをマップします。いずれかのテーブルに一致するものが見つからない場合は、undefined
システムチェックが呼び出されます。
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 |
再起動 | start |
RestartUnit | start |
起動 | start |
StartUnit | start |
StartUnitReplace | start |
停止 | stop |
StopUnit | stop |
TryRestart | start |
TryRestartUnit | start |
UnmaskUnitFiles | enable |
systemd 汎用システムコール | SELinux アクセスチェック |
---|---|
ClearJobs | reboot |
FlushDevices | halt |
Get | status |
GetAll | status |
GetJob | status |
GetSeat | status |
GetSession | status |
GetSessionByPID | status |
GetUser | status |
Halt | halt |
Introspect | status |
KExec | reboot |
KillSession | halt |
KillUser | halt |
ListJobs | status |
ListSeats | status |
ListSessions | status |
ListUsers | status |
LockSession | halt |
PowerOff | halt |
再起動 | reboot |
SetUserLinger | halt |
TerminateSeat | halt |
TerminateSession | halt |
TerminateUser | halt |
例10.1 システムサービスに関する SELinux ポリシー
sesearch
ユーティリティーを使用すると、システムサービスのポリシールールをリスト表示できます。たとえば、sesearch -A -s NetworkManager_t -c service コマンドを呼び出すと以下が返されます。
10.2. SELinux と journald リンクのコピーリンクがクリップボードにコピーされました!
systemd
では、journald
デーモン (systemd-journal
とも呼ばれます) は、ログデータを収集して保存するシステムサービスである syslog
ユーティリティーの代替手段です。これは、カーネル、libc
syslog()
関数を使用するユーザープロセス、システムサービスの標準出力およびエラー出力、またはネイティブの API を使用して受信したログ情報に基づいて、構造化されたジャーナルおよびインデックス化されたジャーナルを作成し、維持します。暗黙的に、各ログメッセージのメタデータフィールドを安全な方法で収集します。
systemd-journal
サービスは、セキュリティーを向上させるために、SELinux で使用できます。SELinux は、設計された機能を実行することのみを許可することで、プロセスを制御します。ポリシー作成者のセキュリティー目標によっては、これよりも低くなることもあります。たとえば、SELinux は、侵害された ntpd
プロセスが Network Time を処理する以外の操作を行わないようにします。ただし、ntpd
プロセスは、syslog
メッセージを送信するため、SELinux は、侵害されたプロセスが引き続きメッセージを送信できるようにします。侵害されたntpd
は、syslog
メッセージを他のデーモンに合わせてフォーマットし、管理者を誤認させる可能性があります。さらに悪い場合は、syslog
ファイルを読み込んでシステム全体を危険にさらすユーティリティーです。
systemd-journal
デーモンは、すべてのログメッセージを検証し、とりわけ SELinux ラベルを追加します。その後、ログメッセージで不整合を検出し、発生前にこのタイプの攻撃を防ぐことができます。journalctl
ユーティリティーを使用すると、systemd
ジャーナルのログをクエリーできます。コマンドライン引数が指定されていない場合は、このユーティリティーを実行すると、最も古いエントリーから始まり、ジャーナルの全コンテンツがリスト表示されます。システムコンポーネントのログを含む、システムで生成されたすべてのログを表示するには、root で journalctl
を実行します。root 以外のユーザーで実行した場合は、現在ログインしているユーザーに関連するログのみが出力されます。
例10.2 journalctl
でログのリスト表示
journalctl
を使用すると、特定の SELinux ラベルに関連するログをすべてリスト表示できます。たとえば、次のコマンドは、system_u:system_r:policykit_t:s0
ラベルに記録されているログをすべてリスト表示します。
journalctl
の詳細は、journalctl(1) man ページを参照してください。
第11章 トラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
aud2allow
でカスタムポリシーモジュールを作成する方法について説明します。
11.1. アクセスが拒否された場合の動作 リンクのコピーリンクがクリップボードにコピーされました!
/var/log/audit/audit.log
/var/log/messages
/var/log/audit/audit.log
./var/log/messages
にも送信される、読み取りが容易な拒否メッセージsetroubleshootd
デーモンおよび audd
デーモンを実行している場合は、SELinux がアクセスを拒否したときに警告が表示されます。
Forbidden You don't have permission to access file name on this server
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 "SELinux is preventing" /var/log/messages
grep "denied" /var/log/audit/audit.log
~]# grep "denied" /var/log/audit/audit.log
11.2. 問題の上位 3 つの原因 リンクのコピーリンクがクリップボードにコピーされました!
11.2.1. ラベル付けの問題 リンクのコピーリンクがクリップボードにコピーされました!
/var/www/html/
を使用する代わりに、/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(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
/srv/myweb/
ディレクトリー (およびその下のすべてのファイルおよびディレクトリー) のコンテキストを SELinux ファイルコンテキストの設定に追加します。[8].semanage
ユーティリティーはコンテキストを変更しません。root で、restorecon
ユーティリティーを実行して変更を適用します。
restorecon -R -v /srv/myweb
~]# restorecon -R -v /srv/myweb
11.2.1.1. 正しいコンテキストとは ? リンクのコピーリンクがクリップボードにコピーされました!
matchpathcon
ユーティリティーは、ファイルパスのコンテキストを確認し、そのパスのデフォルトラベルと比較します。以下の例は、ラベルが間違っているファイルが含まれるディレクトリーで matchpathcon
を使用した例を示しています。
matchpathcon -V /var/www/html/*
~]$ 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 -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 -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
~]# setsebool -P httpd_can_network_connect_db on
getsebool
ユーティリティーおよび grep
ユーティリティーを使用して、アクセスを許可するブール値が利用できるかどうかを確認します。たとえば、getsebool -a | grep ftp コマンドを使用して FTP 関連のブール値を検索します。
ポート番号
http
関連のポートを一覧表示します。
http_port_t
ポートタイプは、Apache HTTP サーバーがリッスンできるポートを定義します。この場合は、TCP ポート 80、443、488、8008、8009、および 8443 です。httpd
がポート 9876 (Listen 9
76)でリッスンするように管理者が httpd.conf
を設定しても、これを反映するようにポリシーが更新されていない場合、以下のコマンドは失敗します。
systemctl start httpd.service
~]# systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
/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
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
semanage port -a -t http_port_t -p tcp 9876
~]# 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. 問題の修正 リンクのコピーリンクがクリップボードにコピーされました!
aud2allow
を使用したカスタムポリシーモジュールの作成について説明します。
11.3.1. Linux の権限 リンクのコピーリンクがクリップボードにコピーされました!
ls -l /var/www/html/index.html
~]$ 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
~]# chown apache:apache /var/www/html/index.html
httpd
は Linux Apache ユーザーとして実行) であることを前提としています。別のユーザーで httpd
を実行している場合は、apache:apache
をそのユーザーに置き換えます。
11.3.2. サイレント拒否の考えられる原因 リンクのコピーリンクがクリップボードにコピーされました!
semodule -DB
~]# semodule -DB
-D
オプションは、dontaudit ルールを無効にします。-B
オプションはポリシーを再構築します。semodule -DB を実行したら、権限の問題が発生していたアプリケーションを実行してみて、アプリケーションに関連する SELinux の拒否がログに記録されているかどうかを確認します。拒否を許可するかどうかを決定する際には注意してください。拒否の中には、dontaudit ルールで無視および処理されるものもあります。疑わしい場合、またはガイドが必要な場合は、fedora-selinux-list などの SELinux のリストにある他の SELinux ユーザーおよび開発者に連絡してください。
dontaudit
ルールを有効にするには、root で次のコマンドを実行します。
semodule -B
~]# semodule -B
-s domain
オプションと grep コマンドを使用して、検索を絞り込みます。以下に例を示します。
sesearch --dontaudit -s smbd_t | grep squid
~]$ 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
など) などの貴重な情報が記載されています。この情報は、標準のマニュアルページ、または sepolicy manpage
ユーティリティーを使用してすべてのサービスドメインの SELinux ポリシーから自動的に生成できるマニュアルページにある場合があります。このような man ページは、service-name_selinux
形式で命名されます。このような man ページは、selinux-policy-doc パッケージに同梱されています。
- Samba - たとえば、samba_selinux(8) の man ページでは、
samba_enable_home_dirs
ブール値を有効にすると、Samba がユーザーのホームディレクトリーを共有できるようになることを説明しています。 - NFS - nfsd_selinux(8) の man ページでは、nfsd プロセスをできるだけ安全な方法で設定できるように、SELinux の nfsd ポリシーを説明しています。
sepolicy manpage
の詳細は 「手動ページの生成: sepolicy manpage」 を参照してください。
11.3.4. Permissive ドメイン リンクのコピーリンクがクリップボードにコピーされました!
- これを使用すると、1 つのプロセス (ドメイン) を Permissive にして、システム全体をリスクにさらさずに問題のトラブルシューティングを行うことができます。
- これにより、管理者は新しいアプリケーションのポリシーを作成できます。以前は、最小限のポリシーを作成してから、マシン全体を Permissive モードにしてアプリケーションを実行できるようにし、SELinux の拒否ログが記録されるようにすることが推奨されていました。次に、ポリシーを作成するために
aud2allow
を使用することができます。これにより、システム全体が危険にさらされていました。Permissive ドメインでは、システム全体を危険にさらさずに、新しいポリシーのドメインのみが Permissive とマークされます。
11.3.4.1. ドメインを Permissive にする リンクのコピーリンクがクリップボードにコピーされました!
httpd_t
ドメイン (Apache HTTP サーバーを実行しているドメイン) を Permissive (許容) にします。
semanage permissive -a httpd_t
~]# semanage permissive -a httpd_t
semodule -l | grep permissive
~]# semodule -l | grep permissive
permissive_httpd_t (null)
permissivedomains (null)
semanage permissive -d httpd_t
~]# semanage permissive -d httpd_t
11.3.4.2. Permissive ドメインの無効化 リンクのコピーリンクがクリップボードにコピーされました!
permissivedomains.pp
には、システム上にある Permissive ドメイン宣言がすべて含まれています。すべての Permissive ドメインを無効にするには、root で次のコマンドを実行します。
semodule -d permissivedomains
~]# semodule -d permissivedomains
semodule --list-modules=full
~]# semodule --list-modules=full
11.3.4.3. Permissive ドメインの拒否 リンクのコピーリンクがクリップボードにコピーされました!
SYSCALL
メッセージは、Permissive ドメインでは異なります。以下は、Apache HTTP サーバーによる 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)
type=AVC msg=audit(1226882736.442:86): avc: denied { getattr } for pid=2427 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226882736.442:86): arch=40000003 syscall=196 success=no exit=-13 a0=b9a1e198 a1=bfc2921c a2=54dff4 a3=2008171 items=0 ppid=2425 pid=2427 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
httpd_t
ドメインは Permissive ではありません。また、このようなアクションは拒否され、SYSCALL
メッセージには success=no
が含まれます。以下は、同じ状況での AVC による拒否の例になります。ただし、semanage permissive -a httpd_t コマンドを実行して、httpd_t
ドメインを Permissive にします。
type=AVC msg=audit(1226882925.714:136): avc: denied { read } for pid=2512 comm="httpd" name="file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file type=SYSCALL msg=audit(1226882925.714:136): arch=40000003 syscall=5 success=yes exit=11 a0=b962a1e8 a1=8000 a2=0 a3=8000 items=0 ppid=2511 pid=2512 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
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
audit
デーモンログを照会できる ausearch ユーティリティーを提供します。[10] ausearch
ユーティリティーは、/var/log/audit/audit.log
にアクセスするため、root ユーザーとして実行する必要があります。
-c comm-name
オプションを使用します。comm-name は実行ファイルの名前 (Apache HTTP サーバーの場合は httpd
、Samba の場合は smbd
など) です。
ausearch -m avc -c httpd
~]# ausearch -m avc -c httpd
ausearch -m avc -c smbd
~]# 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 つの拒否を含む出力例になります。
sealert
sealert
ユーティリティーを提供します。これは、setroubleshoot-server により変換された拒否メッセージを読み取ります。[12] 拒否は、/var/log/messages
にあるように ID が割り当てられています。以下は、messages
からの拒否例になります。
setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket. For complete SELinux messages. run sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7
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
オプションは、識別子を引き数として取ります。sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7 コマンドを実行すると、SELinux がアクセスを拒否した理由を詳細に分析し、アクセスを許可する解決策を示すことができます。
setroubleshootd
デーモン、dbus
デーモン、および auditd
デーモンが実行されている場合は、SELinux がアクセスを拒否したときに警告が表示されます。
Show
をクリックすると、sealert
画面が表示されます。これにより、トラブルシューティングが可能になります。
11.3.6. Raw 監査メッセージ リンクのコピーリンクがクリップボードにコピーされました!
/var/log/audit/audit.log
にログ記録されます。以下は、Apache HTTP サーバー (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)
type=AVC msg=audit(1226874073.147:96): avc: denied { getattr } for pid=2465 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1226874073.147:96): arch=40000003 syscall=196 success=no exit=-13 a0=b98df198 a1=bfec85dc a2=54dff4 a3=2008171 items=0 ppid=2463 pid=2465 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=6 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
- { getattr }
- 中括弧内の項目は、拒否された権限を示しています。
getattr
エントリーは、ターゲットファイルのステータス情報をソースプロセスが読み取ろうとしていることを示します。これは、ファイルを読み取る前に発生します。アクセスしているファイルのラベルが間違っているため、このアクションは拒否されています。一般的に表示されるパーミッションには、getattr
、read
、write
などが含まれます。 - comm="httpd"
- プロセスを開始した実行ファイル。実行可能ファイルのフルパスは、システムコール (
SYSCALL
) メッセージのexe=
セクションに記載されています。この例ではexe="/usr/sbin/httpd"
になります。 - path="/var/www/html/file1"
- プロセスがアクセスを試みたオブジェクト (ターゲット) へのパス。
- scontext="unconfined_u:system_r:httpd_t:s0"
- 拒否されたアクションを実行しようとしたプロセスの SELinux コンテキスト。この場合、Apache HTTP Server は
httpd_t
タイプで実行している SELinux コンテキストです。 - tcontext="unconfined_u:object_r:samba_share_t:s0"
- プロセスがアクセスを試みたオブジェクトの SELinux コンテキスト (ターゲット)。この例では、これが
file1
の SELinux コンテキストです。samba_share_t
タイプは、httpd_t
ドメインで実行しているプロセスからアクセスできません。特定の状況では、tcontext
は、scontext
と一致します (例: プロセスが、ユーザー ID など、実行中のプロセスの特性を変更するシステムサービスを実行しようとする場合)。また、プロセスが通常の制限よりも多くのリソース (メモリーなど) を使用しようとすると、tcontext
がscontext
に一致する可能性があります。その結果、そのプロセスがこれらの制限を破ることが許可されているかどうかを確認するためのセキュリティーチェックが行われます。
SYSCALL
) メッセージでは、以下の 2 つの項目が重要になります。
success=no
: 拒否(AVC)が強制されたかどうかを示します。success=no
はシステムコールが成功しなかった(SELinux がアクセスを拒否した)ことを示します。success=yes
はシステムコールが成功したことを示します。これは、unconfined_service_t
やkernel_t
など、Permissive ドメインまたは制限のないドメインで見ることができます。exe="/usr/sbin/httpd"
: プロセスを開始した実行ファイルのフルパスです。この例ではexe="/usr/sbin/httpd"
です。
scontext
) をターゲットコンテキスト (tcontext
) と比較します。プロセス (scontext
) がこのようなオブジェクト (tcontext
) にアクセスする必要がありますか ?たとえば、Apache HTTP Server(httpd_t
) は、httpd_sys_content_t
、public_content_t
など、httpd_selinux(8) man ページで指定されたタイプにのみアクセスする必要があります (特に設定されていない限り)。
11.3.7. sealert メッセージ リンクのコピーリンクがクリップボードにコピーされました!
/var/log/messages
にあるように ID が割り当てられています。以下は、Apache HTTP サーバー (httpd_t
ドメインで実行中) が /var/www/html/file1
ファイル (samba_share_t
タイプのラベルが付いたファイル) にアクセスしようとしたときに発生した AVC 拒否 (messages
に記録) の例です。
hostname setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
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
- 概要
- 拒否されたアクションの概要これは、
/var/log/messages
の拒否と同じです。この例では、httpd
プロセスが、samba_share_t
タイプのラベルが付いたファイル (file1
) へのアクセスを拒否されています。 - 詳細な説明
- より詳細な説明この例では、
file1
にはsamba_share_t
タイプのラベルが付けられています。このタイプは、Samba を使用してエクスポートするファイルおよびディレクトリーに使用されます。この説明では、このようなアクセスが必要な場合は、Apache HTTP Server および Samba がアクセス可能なタイプにタイプを変更することが推奨されています。 - アクセスの許可
- アクセスを許可する方法を説明します。ファイルの再ラベル付け、ブール値の有効化、またはローカルポリシーモジュールの作成を行います。この場合、Apache HTTP Server と Samba の両方がアクセスできるタイプでファイルにラベルを付けることが提案されます。
- Fix コマンド
- アクセスを許可し、拒否を解決するための推奨されるコマンド。この例では、
file1
タイプをpublic_content_t
に変更するためのコマンドを提供します。これは Apache HTTP Server および Samba からアクセスできます。 - 追加情報
- バグ報告に役に立つ情報 (ポリシーパッケージの名前やバージョン (
selinux-policy-3.13.1-166.el7.noarch
) ですが、拒否が発生した理由の解決には役立たない場合があります。 - Raw 監査メッセージ
- 拒否に関連付けられた
/var/log/audit/audit.log
からの Raw 監査メッセージ。AVC 拒否に関する詳細は、「Raw 監査メッセージ」 を参照してください。
11.3.8. アクセスの許可: audit2allow リンクのコピーリンクがクリップボードにコピーされました!
aud2allow
ユーティリティーの使用を実証する目的でのみ使用されます。
aud2allow
ユーティリティーは、拒否された操作のログから情報を収集し、SELinux ポリシー許可ルールを生成します。[13] 「sealert メッセージ」に従って拒否メッセージを分析し、ラベル変更やブール値によるアクセスが許可されていない場合は、aud2allow
を使用してローカルポリシーモジュールを作成します。SELinux がアクセスを拒否した場合に、aud2allow
を実行すると、拒否したアクセスを許可する Type Enforcement ルールが生成されます。
audit2allow
を使用して、SELinux 拒否を確認する際に、最初のオプションとしてローカルポリシーモジュールを生成することはできません。トラブルシューティングは、ラベル付けの問題があるかどうかを最初に確認します。2 番目に多いのが、SELinux が、プロセスの設定変更を認識していない場合です。詳細は、Four Key Causes of SELinux Errors のホワイトペーパーを参照してください。
aud2allow
を使用してポリシーモジュールを作成する例を示しています。
- 拒否メッセージと関連するシステムコールが
/var/log/audit/audit.log
ファイルにログ記録されます。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 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)
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 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)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、certwatch はvar_t
タイプのラベルが付けられたディレクトリーへの書き込みアクセスを拒否します。「sealert メッセージ」に従って拒否メッセージを分析します。ラベル変更やブール値によるアクセスが許可されていない場合は、aud2allow
を使用してローカルポリシーモジュールを作成します。 - 以下のコマンドを入力して、アクセスが拒否された理由を人間が判読できるように説明します。
aud2allow
ユーティリティーは/var/log/audit/audit.log
を読み取ります。そのような場合は、root ユーザーとして実行する必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -a
コマンドラインオプションを指定すると、すべての監査ログが読み込まれます。-w
オプションは、人間が判読できる記述を生成します。このように、Type Enforcement ルールがないため、アクセスが拒否されました。 - 次のコマンドを入力して、拒否されたアクセスを許可する Type Enforcement ルールを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要欠落している 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
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - また、
aud2allow
は、Type Enforcement ルールをポリシーパッケージ (.pp
) にコンパイルします。ls
~]# ls mycertwatch.pp mycertwatch.te
Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュールをインストールするには、root で以下のコマンドを実行します。semodule -i mycertwatch.pp
~]# semodule -i mycertwatch.pp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要aud2allow
で作成したモジュールは、必要以上のアクセスを許可する場合があります。aud2allow
で作成したポリシーは、アップストリームの SELinux リストに投稿して確認することが推奨されます。 ポリシーにバグがあると思われる場合は、Red Hat Bugzilla でバグを作成します。
grep
ユーティリティーを使用して、aud2allow
の入力内容を絞り込みます。以下の例は、grep
を使用して、aud2allow
経由で certwatch
に関連する拒否メッセージのみを送信することを示しています。
第12章 追加情報 リンクのコピーリンクがクリップボードにコピーされました!
12.1. コントリビューター リンクのコピーリンクがクリップボードにコピーされました!
- Dominick Grift – テクニカルエディター
- Murray McAllister – Red Hat 製品セキュリティー
- James Morris – テクニカルエディター
- エリック・パリス - テクニカルエディター
- Scott Radvan – Red Hat Customer Content Services
- Daniel Walsh – Red Hat セキュリティーエンジニアリング
12.2. その他リソース リンクのコピーリンクがクリップボードにコピーされました!
Fedora
- トラブルシューティング: http://fedoraproject.org/wiki/SELinux/Troubleshooting.
- Fedora SELinux FAQ: https://fedoraproject.org/wiki/SELinux_FAQ.
アメリカ国家安全保障局 (NSA: National Security Agency)
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.
The SELinux Notebook - The Foundations - 4th Edition
DigitalOcean: An Introduction to SELinux on CentOS 7
IRC
- #selinux
- #fedora-selinux
パート II. 制限のあるサービスの管理 リンクのコピーリンクがクリップボードにコピーされました!
第13章 Apache HTTP サーバー リンクのコピーリンクがクリップボードにコピーされました!
rpm -q httpd
~]$ rpm -q httpd
package httpd is not installed
yum
ユーティリティーを使用してインストールします。
yum install httpd
~]# yum install httpd
13.1. Apache HTTP サーバーおよび SELinux リンクのコピーリンクがクリップボードにコピーされました!
httpd
) はデフォルトで制限ありで実行されます。制限のあるプロセスは、独自のドメインで実行され、他の制限のあるプロセスから分離されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。以下の例は、独自のドメインで実行している httpd
プロセスを示しています。この例では、httpd、setroubleshoot、setroubleshoot-server、および policycoreutils-python パッケージがインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で以下のコマンドを入力し、
httpd
を起動します。systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
プロセスを表示するには、以下のコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
ファイルが TCP ポート 80、443、488、8008、8009、または 8443 以外のポートを httpd
がリッスンするように設定されている場合は、semanage port コマンドを使用して、新しいポート番号を SELinux ポリシー設定に追加する必要があります。以下の例では、httpd
用の SELinux ポリシー設定で定義されていないポートをリッスンするように httpd
を設定すると、httpd
が起動できなくなります。また、この例では、ポリシーで定義されていない標準以外のポートを httpd
が正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、httpd パッケージがインストールされていることを前提としています。この例では、各コマンドを root ユーザーとして実行します。
- 以下のコマンドを実行して、
httpd
が実行されていないことを確認します。systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が異なる場合は、プロセスを停止します。systemctl stop httpd.service
~]# systemctl stop httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage
ユーティリティーを使用して、SELinux でhttpd
がリッスンできるポートを表示します。semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/httpd/conf/httpd.conf
ファイルを編集します。Listen
オプションを設定し、httpd
の SELinux ポリシー設定で設定されていないポートをリスト表示します。この例では、httpd
がポート 12345 をリッスンするように設定されています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して、
httpd
を起動します。systemctl start httpd.service
~]# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux で、
httpd
がポート 12345 をリッスンできるようにするには、以下のコマンドが必要です。semanage port -a -t http_port_t -p tcp 12345
~]# semanage port -a -t http_port_t -p tcp 12345
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
を再び起動し、新しいポートをリッスンしていることを確認します。systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpd
が標準以外のポート (この例では TCP 12345) でリッスンできるように SELinux が設定されました。httpd
はこのポートで正常に起動します。httpd
が TCP ポート 12345 でリッスンして通信していることを証明するには、以下のように、指定したポートへの telnet 接続を開き、HTTP GET コマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
/var/www/html/
ディレクトリーに新しいファイルを作成し、親ディレクトリー (/var/www/html/
) からhttpd_sys_content_t
タイプを継承したファイルを示しています。
- 以下のコマンドを入力して、
/var/www/html/
の SELinux コンテキストを表示します。ls -dZ /var/www/html
~]$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、/var/www/html/
にhttpd_sys_content_t
タイプのラベルが付けられていることを示しています。 - root で
touch
ユーティリティーを使用して新規ファイルを作成します。touch /var/www/html/file1
~]# touch /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを入力して SELinux コンテキストを表示します。
ls -Z /var/www/html/file1
~]$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
httpd_sys_content_t
タイプのラベルが付けられた file1
を表示します。SELinux を使用すると、httpd
はこのタイプでラベル付けされたファイルを読み取ることができますが、Linux の権限で書き込みアクセスが許可されている場合でも書き込みはできません。SELinux ポリシーは、httpd_t
ドメイン (httpd
が実行されている場所) で実行中のプロセスが読み取りと書き込みを実行できるタイプを定義します。これは、プロセスが別のプロセスによって使用されるファイルにアクセスできないようにするのに役立ちます。
httpd
は、httpd_sys_content_t
タイプ (Apache HTTP サーバー向け) のラベルが付いたファイルにアクセスできますが、デフォルトでは、samba_share_t
タイプ (Samba 向け) のラベルが付いたファイルにはアクセスできません。また、ユーザーホームディレクトリーのファイルには、user_home_t
タイプがラベル付けされています。デフォルトでは、httpd
は、ユーザーホームディレクトリーのファイルを読み書きできません。
httpd
で使用されるタイプのリストです。異なるタイプを使用すると、柔軟なアクセスを設定できます。
httpd_sys_content_t
- 静的 Web サイトで使用される
.html
ファイルなど、静的な Web コンテンツにはこのタイプを使用します。このタイプでラベル付けされたファイルには、httpd
およびhttpd
によって実行されるスクリプトからアクセス (読み取りのみ) できます。デフォルトでは、このタイプのラベルが付いたファイルおよびディレクトリーは、httpd
やその他のプロセスに書き込んだり、修正したりすることができません。初期設定では、/var/www/html/
ディレクトリーに作成またはコピーされるファイルには、httpd_sys_content_t
タイプに応じたラベルが付けられています。 httpd_sys_script_exec_t
- このタイプは、
httpd
を実行するスクリプトに使用します。このタイプは、/var/www/cgi-bin/
ディレクトリーの CGI (Common Gateway Interface) スクリプトで一般的に使用されます。初期設定では、SELinux ポリシーにより、httpd
が CGI スクリプトを実行できません。これを可能にするには、httpd_sys_script_exec_t
タイプでスクリプトにラベルを付け、httpd_enable_cgi
ブール値を有効にします。httpd_sys_script_exec_t
のラベルが付いたスクリプトは、httpd
による実行時にhttpd_sys_script_t
ドメインで実行されます。httpd_sys_script_t
ドメインは、postgresql_t
およびmysqld_t
などの他のシステムドメインにアクセスできます。 httpd_sys_rw_content_t
- このタイプのラベルが付いたファイルは、
httpd_sys_script_exec_t
タイプのラベルが付いたスクリプトで作成できますが、その他のタイプのスクリプトでは変更できません。httpd_sys_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 の保護なしで実行されます。その他のオプションをすべて使い切った後、複雑なスクリプトにはこのタイプのみを使用してください。
httpd
またはシステム全体の SELinux 保護を無効にするのではなく、このタイプを使用することが推奨されます。
grep httpd /etc/selinux/targeted/contexts/files/file_contexts
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts
手順13.1 SELinux コンテキストの変更
httpd
が使用する新しいディレクトリーと index.html
ファイルを作成し、そのファイルおよびディレクトリーにラベルを付けて、それらに httpd
がアクセスできるようにします。
mkdir
ユーティリティーを root として使用して、httpd
で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。mkdir -p /my/website
~]# mkdir -p /my/website
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_t
タイプのラベルが付けられます。このタイプは、制限のあるサービスからはアクセスできません。ls -dZ /my
~]$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力し、
my/
ディレクトリーおよびサブディレクトリーのタイプをhttpd
にアクセスできるタイプに変更します。my/website/
で作成されたファイルは、default_t
タイプではなく、httpd_sys_content_t
タイプを継承するようになったため、httpd からアクセスできるようになりました。chcon -R -t httpd_sys_content_t /my/ touch /my/website/index.html ls -Z /my/website/index.html
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
httpd
が使用する新しいディレクトリーと index.html
ファイルを作成し、そのディレクトリーとファイルのラベルを永続的に変更して、httpd
が使用できるようにします。
mkdir
ユーティリティーを root として使用して、httpd
で使用されるファイルを保存するためのトップレベルのディレクトリー構造を作成します。mkdir -p /my/website
~]# mkdir -p /my/website
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow "/my(/.*)?"
式は、ラベルの変更がmy/
ディレクトリーと、その下のすべてのファイルおよびディレクトリーに適用されることを意味します。 - root で
touch
ユーティリティーを使用して、新規ファイルを作成します。touch /my/website/index.html
~]# touch /my/website/index.html
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力し、ラベルの変更を適用します (restorecon は、手順 2 の semanage コマンドで変更された file-context 設定を読み取ります)。
restorecon -R -v /my/
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
httpd_anon_write
ブール値を有効にするには、root で以下のコマンドを入力します。
setsebool -P httpd_anon_write on
~]# setsebool -P httpd_anon_write on
setsebool -P httpd_anon_write off
~]# setsebool -P httpd_anon_write off
-P
オプションを使用しないでください。
httpd
の実行方法に対応するために使用可能な一般的なブール値の説明です。
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
- このブール値は、公開ファイル転送サービスで使用される
public_content_rw_t
タイプでラベル付けされたファイルに、HTTP スクリプトによる書き込みアクセスを許可するかどうかを定義します。 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
はユーザーホームディレクトリーにアクセスできなくなります。このブール値を有効にすると、ユーザーホームディレクトリー (/home/*/
のコンテンツなど) へのhttpd
アクセスを許可します。 httpd_execmem
- このブール値を有効にすると、
httpd
は、実行可能ファイルと書き込み可能なメモリーアドレスを必要とするプログラムを実行できます。バッファーオーバーフローに対する保護が低減するため、セキュリティー上の理由から、このブール値を有効にすることは推奨できません。ただし、特定のモジュールおよびアプリケーション (Java アプリケーションや Mono アプリケーションなど) では、この権限が必要になります。 httpd_ssi_exec
- このブール値は、Web ページのサーバー側のインクルード (SSI) 要素を実行できるかどうかを定義します。
httpd_tty_comm
- このブール値は、
httpd
が制御端末へのアクセスを許可するかどうかを定義します。通常はこのアクセスは必要ありませんが、SSL 証明書ファイルの設定などの場合は、パスワードプロンプトを表示して処理するために端末アクセスが必要になります。 httpd_unified
- このブール値を有効にすると、
httpd_t
はすべてのhttpd
タイプ (sys_content_t の実行、読み取り、または書き込み) に完全にアクセスできるようになります。無効にすると、読み取り専用、書き込み可能、または実行可能な Web コンテンツが切り離されます。このブール値を無効にすると、セキュリティーレベルが向上しますが、スクリプトやその他の Web コンテンツに、それぞれが持つ必要のあるファイルアクセス権に基づいて、個別にラベルを付ける必要があるという管理オーバーヘッドが追加されます。 httpd_use_cifs
- このブール値を有効にすると、Samba を使用してマウントしたファイルシステムなど、
cifs_t
タイプでラベル付けされた CIFS ボリュームのファイルに、httpd
がアクセスできるようになります。 httpd_use_nfs
- このブール値を有効にすると、NFS を使用してマウントしたファイルシステムなど、
nfs_t
タイプでラベル付けされた NFS ボリュームのファイルに、httpd
がアクセスできるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
13.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
13.4.1. 静的サイトの実行 リンクのコピーリンクがクリップボードにコピーされました!
.html
ファイルに httpd_sys_content_t
タイプのラベルを付けます。デフォルトでは、Apache HTTP サーバーは httpd_sys_content_t
タイプのラベルが付けられたファイルに書き込みできません。以下の例では、読み取り専用の Web サイトのファイルを保存する新しいディレクトリーを作成します。
- root で
mkdir
ユーティリティーを使用して、最上位のディレクトリーを作成します。mkdir /mywebsite
~]# mkdir /mywebsite
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root として
/mywebsite/index.html
ファイルを作成します。以下の内容を/mywebsite/index.html
にコピーアンドペーストします。<html> <h2>index.html from /mywebsite/</h2> </html>
<html> <h2>index.html from /mywebsite/</h2> </html>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP サーバーが、
/mywebsite/
、およびその下のファイルとサブディレクトリーに読み取り専用でアクセスできるようにするには、ディレクトリーにhttpd_sys_content_t
タイプのラベルを付けます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon
ユーティリティーを root として使用し、ラベルを変更します。restorecon -R -v /mywebsite
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この例では、root として
/etc/httpd/conf/httpd.conf
ファイルを編集します。既存のDocumentRoot
オプションをコメントアウトします。DocumentRoot "/mywebsite"
オプションを追加します。編集後、これらのオプションは以下のようになります。#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力して、Apache HTTP Server のステータスを確認します。サーバーが停止している場合は、起動します。
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが実行している場合は、root で以下のコマンドを実行してサービスを再起動します (httpd.conf
に加えた変更も適用されます)。systemctl status 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 Wed 2014-02-05 13:16:46 CET; 2s ago
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart httpd.service
~]# systemctl restart httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Web ブラウザーを使用して
http://localhost/index.html
に移動します。以下が表示されます。index.html from /mywebsite/
index.html from /mywebsite/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
~]# setsebool -P httpd_use_nfs on
httpd_use_cifs
ブール値を有効にして、httpd
が CIFS ボリューム (cifs_t
の種類のラベルが付いている) にアクセスし、共有できるようにします。
setsebool -P httpd_use_cifs on
~]# setsebool -P httpd_use_cifs on
-P
オプションを使用しないでください。
13.4.3. サービス間でのファイルの共有 リンクのコピーリンクがクリップボードにコピーされました!
httpd_sys_content_t
のタイプでラベルが付いたファイル (Apache HTTP サーバーが使用するファイル) を読み込むことができません。ファイルに public_content_t
または public_content_rw_t
のタイプのラベルが付けられている場合は、Apache HTTP サーバー、FTP、rsync、および Samba との間でファイルを共有できます。
- root で
mkdir
ユーティリティーを使用して、複数のサービス間でファイルを共有するための新しいトップレベルディレクトリーを作成します。mkdir /shares
~]# mkdir /shares
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_t
タイプのラベルが付けられます。このタイプは、制限のあるサービスからはアクセスできません。ls -dZ /shares
~]$ ls -dZ /shares drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /shares
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
/shares/index.html
ファイルを作成します。以下の内容を/shares/index.html
にコピーアンドペーストします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow public_content_t
タイプでの/shares/
のラベル付けでは、Apache HTTP サーバー、FTP、rsync、および Samba による読み取り専用アクセスが許可されます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。semanage fcontext -a -t public_content_t "/shares(/.*)?"
~]# semanage fcontext -a -t public_content_t "/shares(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon
ユーティリティーを root で使用し、ラベルの変更を適用します。restorecon -R -v /shares/
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
/shares/
を共有するには、以下を行います。
- samba パッケージ、samba-common パッケージ、および samba-client パッケージがインストールされていることを確認します (バージョン番号が異なる場合があります)。
rpm -q 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらのパッケージのいずれかがインストールされていない場合は、root で以下のコマンドを実行してインストールします。yum install package-name
~]# yum install package-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/samba/smb.conf
を root で編集します。このファイルの下部に以下のエントリーを追加し、Samba で/shares/
ディレクトリーを共有します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba ファイルシステムをマウントするには、Samba アカウントが必要です。root で次のコマンドを入力して、Samba アカウントを作成します。username は、既存の Linux ユーザーです。たとえば、smbpasswd -a testuser は、Linux
testuser
ユーザーの Samba アカウントを作成します。smbpasswd -a testuser
~]# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記のコマンドを実行し、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'!
エラーが発生します。 - Samba サービスを再起動します。
systemctl start smb.service
~]# systemctl start smb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 利用可能な共有をリスト表示するには、次のコマンドを入力します。username は、手順 3 で追加した Samba アカウントです。パスワードを求められたら、手順 3 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は異なる場合があります)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir
ユーティリティーを使用して、新しいディレクトリーを作成します。このディレクトリーは、shares
の Samba 共有をマウントするために使用されます。mkdir /test/
~]# mkdir /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを入力して、
shares
の Samba 共有を/test/
にマウントし、username を、手順 3 のユーザー名に置き換えます。mount //localhost/shares /test/ -o user=username
~]# mount //localhost/shares /test/ -o user=username
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 手順 3 で設定した username のパスワードを入力します。 - Samba で共有されているファイルの内容を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
/shares/
を共有するには、次のコマンドを実行します。
- httpd パッケージがインストールされていることを確認します (バージョン番号が異なる場合があります)。
rpm -q httpd
~]$ rpm -q httpd httpd-2.2.11-6.i386
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このパッケージがインストールされていない場合は、root でyum
ユーティリティーを使用してインストールします。yum install httpd
~]# yum install httpd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/
ディレクトリーに変更します。root で以下のコマンドを入力し、/shares/
ディレクトリーへのリンク (名前はshares
) を作成します。html]# ln -s /shares/ shares
html]# ln -s /shares/ shares
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP サーバーを起動します。
systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
~]# rm -i /shares/index.html
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch
ユーティリティーを root で使用し、/shares/
に 3 つのファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力して、Apache HTTP サーバーのステータスを確認します。
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが停止している場合は、起動します。systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Web ブラウザーを使用して
http://localhost/shares
に移動します。ディレクトリーのリストが表示されます。
13.4.4. ポート番号の変更 リンクのコピーリンクがクリップボードにコピーされました!
semanage
ユーティリティーを使用して、root ユーザーに、SELinux が httpd
でリッスンできるポートをリスト表示します。
semanage port -l | grep -w http_port_t
~]# 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 でリッスンできます。/etc/httpd/conf/httpd.conf
が、http_port_t
に登録されていないポートで httpd
がリッスンするように設定されていると、httpd
が起動できません。
httpd
を TCP ポート 80、443、488、8008、8009、または 8443 以外のポートで実行するように設定するには、次のコマンドを実行します。
/etc/httpd/conf/httpd.conf
ファイルを root で編集し、Listen
オプションにhttpd
の SELinux ポリシーで設定されていないポートのリストが表示されるようにします。以下の例では、httpd
が 10.0.0.1 IP アドレスおよび TCP ポート 12345 でリッスンするように設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、次のコマンドを実行して、SELinux ポリシー設定にポートを追加します。
semanage port -a -t http_port_t -p tcp 12345
~]# semanage port -a -t http_port_t -p tcp 12345
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ポートが追加されたことを確認します。
semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
httpd
を実行しなくなった場合は、root で semanage
ユーティリティーを使用し、ポリシー設定からポートを削除します。
semanage port -d -t http_port_t -p tcp 12345
~]# semanage port -d -t http_port_t -p tcp 12345
第14章 Samba リンクのコピーリンクがクリップボードにコピーされました!
rpm -q samba
~]$ rpm -q samba
package samba is not installed
yum
ユーティリティーを root ユーザーでインストールします。
yum install samba
~]# yum install samba
14.1. Samba と SELinux リンクのコピーリンクがクリップボードにコピーされました!
smbd
) はデフォルトで制限付きで実行します。制限のあるサービスは独自のドメインで実行し、その他の制限のあるサービスとは区別されます。以下の例は、独自の領域で実行しているsmbd
プロセスを示しています。この例では、samba がインストールされていることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを入力して、
smbd
を起動します。systemctl start smb.service
~]# systemctl start smb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbd
プロセスを表示するには、以下のコマンドを実行します。ps -eZ | grep smb
~]$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbd
プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:smbd_t:s0
です。コンテキストの 2 番目の部分smbd_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、smbd
プロセスがsmbd_t
ドメインで実行しています。
smbd
がファイルにアクセスし、共有できるように、ファイルに正しくラベルを付ける必要があります。たとえば、smbd
は、samba_share_t
タイプのラベルが付いたファイルの読み取りと書き込みが可能ですが、デフォルトでは、httpd_sys_content_t
タイプのラベルが付いたファイルにはアクセスできません。これは、Apache HTTP サーバーが使用することを目的としています。ブール値を有効にして、ホームディレクトリーや NFS ボリュームを Samba 経由でエクスポートできるようにしたり、Samba がドメインコントローラーとして機能できるようにする必要があります。
14.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
samba_share_t
のタイプでファイルにラベルを付け、Samba がファイルを共有できるようにします。作成したファイルのみにラベルを付け、samba_share_t
タイプでシステムファイルに再ラベル付けしないでください。ブール値を有効にすると、このようなファイルおよびディレクトリーを共有できます。/etc/samba/smb.conf
ファイルおよび Linux のパーミッションが設定されていれば、samba_share_t
タイプでラベル付けされたファイルに書き込むことができます。
samba_etc_t
タイプは、/etc/samba/
ディレクトリーの特定のファイル (smb.conf
など) で使用されます。samba_etc_t
の種類でファイルに手動でラベルを付けないでください。このディレクトリーのファイルにラベルが正しく設定されていない場合は、root ユーザーになり、restorecon -R -v /etc/samba を実行してファイルをデフォルトコンテキストに戻します。/etc/samba/smb.conf
にsamba_etc_t
タイプを指定しないと、Samba の起動に失敗し、SELinux の拒否メッセージが記録される場合があります。以下は、/etc/samba/smb.conf
に httpd_sys_content_t
タイプのラベルが付いた拒否メッセージの例になります。
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
14.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
smbd_anon_write
- このブール値を有効にすると、
smbd
は、特殊なアクセス制限がない一般的なファイル用に予約されている領域など、公開ディレクトリーに書き込むことができます。 samba_create_home_dirs
- ブール値を有効にすると、Samba は新しいホームディレクトリーを個別に作成できます。これは、PAM などのメカニズムにより行われることが多いです。
samba_domain_controller
- これを有効にすると、ブール値により、Samba がドメインコントローラーとして機能し、useradd、groupadd、passwd などの関連コマンドを実行するパーミッションを得ることができます。
samba_enable_home_dirs
- このブール値を有効にすると、Samba はユーザーのホームディレクトリーを共有できます。
samba_export_all_ro
- ファイルまたはディレクトリーをエクスポートし、読み取り専用の権限を付与します。これにより、
samba_share_t
タイプのラベルが付いていないファイルおよびディレクトリーを、Samba で共有できます。samba_export_all_ro
ブール値が有効であっても、samba_export_all_rw
のブール値が無効になっていると、/etc/samba/smb.conf
で書き込みアクセスが設定されていても、Samba 共有への書き込みアクセスは拒否されます。また、書き込みアクセスを許可している Linux パーミッションも拒否されます。 samba_export_all_rw
- ファイルまたはディレクトリーをエクスポートして、読み取りおよび書き込みのパーミッションを許可します。これにより、
samba_share_t
タイプのラベルが付いていないファイルおよびディレクトリーを、Samba からエクスポートできます。書き込みアクセスを許可するには、/etc/samba/smb.conf
および Linux のパーミッションを設定する必要があります。 samba_run_unconfined
- ブール値を有効にすると、
/var/lib/samba/scripts/
ディレクトリーで、Samba が定義されていないスクリプトを実行できるようになります。 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
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_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
~]$ rpm -q samba samba-common samba-client package samba is not installed package samba-common is not installed package samba-client is not installed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらのパッケージがいずれもインストールされていない場合は、root でyum
ユーティリティーを使用してパッケージをインストールします。yum install package-name
~]# yum install package-name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir
ユーティリティーを root で使用し、Samba でファイルを共有するための新しいトップレベルディレクトリーを作成します。mkdir /myshare
~]# mkdir /myshare
Copy to Clipboard Copied! Toggle word wrap Toggle overflow touch
ユーティリティーの root を使用して、空のファイルを作成します。このファイルは、後で Samba 共有が正しくマウントされたことを確認するために使用されます。touch /myshare/file1
~]# touch /myshare/file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/samba/smb.conf
ファイルおよび Linux のパーミッションが設定されていれば、samba_share_t
タイプでラベル付けされたファイルの読み取りと書き込みが可能になります。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
~]# semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon
ユーティリティーを root で使用し、ラベルの変更を適用します。restorecon -R -v /myshare
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
/etc/samba/smb.conf
を編集します。このファイルの下部に以下を追加し、Samba で/myshare/
ディレクトリーを共有します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba ファイルシステムをマウントするには、Samba アカウントが必要です。root で次のコマンドを入力して、Samba アカウントを作成します。username は、既存の Linux ユーザーです。たとえば、smbpasswd -a testuser は、Linux
testuser
ユーザーの Samba アカウントを作成します。smbpasswd -a testuser
~]# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記のコマンドを入力し、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'!
エラーが発生します。 - Samba サービスを再起動します。
systemctl start smb.service
~]# systemctl start smb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 利用可能な共有をリスト表示するには、次のコマンドを入力します。username は、手順 7 で追加した Samba アカウントです。パスワードを求められたら、手順 7 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は異なる場合があります)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdir
ユーティリティーを root で実行して、新しいディレクトリーを作成します。このディレクトリーは、myshare
の Samba 共有をマウントするために使用されます。mkdir /test/
~]# mkdir /test/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを入力して、
myshare
の Samba 共有を/test/
にマウントし、username を、手順 7 のユーザー名に置き換えます。mount //localhost/myshare /test/ -o user=username
~]# mount //localhost/myshare /test/ -o user=username
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 手順 7 で設定した username のパスワードを入力します。 - 手順 3 で作成した
file1
を表示する場合は、以下を実行します。ls /test/
~]$ ls /test/ file1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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>
<html> <h2>File being shared through the Apache HTTP Server and Samba.</h2> </html>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行すると、
file1.html
の SELinux コンテキストが表示されます。ls -Z /var/www/html/file1.html
~]$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルには、httpd_sys_content_t
のラベルが付けられています。デフォルトでは、Apache HTTP サーバーはこのタイプにアクセスできますが、Samba はアクセスできません。 - Apache HTTP サーバーを起動します。
systemctl start httpd.service
~]# systemctl start httpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ユーザーが書き込みアクセス権を持つディレクトリーに移動し、次のコマンドを実行します。デフォルト設定が変更されない限り、このコマンドは成功します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
/etc/samba/smb.conf
を編集します。このファイルの下部に以下を追加し、Samba で/var/www/html/
ディレクトリーを共有します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/
ディレクトリーには、httpd_sys_content_t
タイプのラベルが付けられています。デフォルトでは、Samba は Linux の権限があっても、このタイプのラベルが付いたファイルおよびディレクトリーにはアクセスできません。Samba のアクセスを許可するには、samba_export_all_ro
ブール値を有効にします。setsebool -P samba_export_all_ro on
~]# setsebool -P samba_export_all_ro on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動しても変更を持続させない場合は、-P
オプションを使用しないでください。samba_export_all_ro
ブール値を有効にすると、Samba は任意のタイプにアクセスできるようになることに注意してください。- Samba サービスを再起動します。
systemctl start smb.service
~]# systemctl start smb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第15章 ファイル転送プロトコル リンクのコピーリンクがクリップボードにコピーされました!
vsftpd
) は、高速で安定しており、最も重要なこととして安全であるようにゼロから設計されています。多数の接続を効率的かつ安全に処理できることが、Red Hat Enterprise Linux に同梱されるスタンドアロンの FTP が vsftpd
のみである理由です。
rpm -q vsftpd
~]$ rpm -q vsftpd
package vsftpd is not installed
yum
ユーティリティーを root ユーザーでインストールします。
yum install vsftpd
~]# yum install vsftpd
15.1. タイプ リンクのコピーリンクがクリップボードにコピーされました!
/var/ftp/
ディレクトリーのファイルへの読み取りアクセス権を持ちます。このディレクトリーには、public_content_t
タイプのラベルが付けられており、書き込みアクセスが /etc/vsftpd/vsftpd.conf
で設定されている場合でも、読み取りアクセスのみを許可します。public_content_t
のタイプは、Apache HTTP サーバー、Samba、NFS などの他のサービスからアクセスできます。
public_content_t
public_content_t
タイプで作成したラベルファイルおよびディレクトリーを、vsftpd
で読み取り専用で共有します。Apache HTTP サーバー、Samba、NFS などのその他のサービスは、このタイプのラベルが付いたファイルにアクセスできます。public_content_t
タイプが指定されているファイルは、書き込みが許可されていても書き込みできません。ライトアクセスが必要な場合は、public_content_rw_t
タイプを使用します。public_content_rw_t
public_content_rw_t
タイプで作成したファイルおよびディレクトリーにラベルを付け、vsftpd
で読み取りおよび書き込みの権限で共有します。Apache HTTP サーバー、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 Release Notes ドキュメントを参照してください。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
第16章 ネットワークファイルシステム リンクのコピーリンクがクリップボードにコピーされました!
rpm -q nfs-utils
~]$ rpm -q nfs-utils
package nfs-utils is not installed
yum
ユーティリティーを使って root でインストールします。
yum install nfs-utils
~]# yum install nfs-utils
16.1. NFS と SELinux リンクのコピーリンクがクリップボードにコピーされました!
nfsd
プロセスを除き、デフォルトで制限されています。nfsd プロセスは、制限のない kernel_t
ドメインタイプでラベル付けされています。SELinux ポリシーでは、NFS がデフォルトでファイルを共有できるようになっています。また、クライアントとサーバー間で SELinux ラベルを渡すことに対応しています。これにより、NFS ボリュームにアクセスする制限されたドメインに対するセキュリティー制御が強化されます。たとえば、ホームディレクトリーを NFS ボリュームに設定している場合は、ホームディレクトリーにのみアクセスでき、ボリューム上のその他のディレクトリーにはアクセスできないように、限定ドメインを指定できます。同様に、セキュア仮想化などのアプリケーションは、NFS ボリュームでイメージファイルのラベルを設定できるため、仮想マシンの分離レベルが向上します。
16.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
nfs_t
タイプを使用します。root ユーザーは、mount
オプションを使用して、デフォルトのタイプを上書きできます。NFS では、以下のタイプが使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
var_lib_nfs_t
- このタイプは、
/var/lib/nfs/
ディレクトリーにコピーまたは作成される既存ファイルおよび新規ファイルに使用されます。このタイプは、通常の操作で変更する必要はありません。変更をデフォルト設定に戻すには、root でrestorecon -R -v /var/lib/nfs を実行します。 nfsd_exec_t
/usr/sbin/rpc.nfsd
ファイルには、nfsd_exec_t
のラベルが付けられています。また、他のシステム実行ファイルおよびライブラリーも NFS に関連しています。この種類のファイルにはラベルを付けないでください。nfsd_exec_t
は、nfsd_t
に移行します。
16.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
ftpd_use_nfs
- このブール値を有効にすると、
ftpd
デーモンは NFS ボリュームにアクセスできるようになります。 cobbler_use_nfs
- このブール値を有効にすると、
cobblerd
デーモンは NFS ボリュームにアクセスできるようになります。 git_system_use_nfs
- このブール値を有効にすると、Git システムデーモンは、NFS ボリュームのシステム共有リポジトリーを読み取ることができます。
httpd_use_nfs
- このブール値を有効にすると、
httpd
デーモンは、NFS ボリュームに保存されているファイルにアクセスできるようになります。 samba_share_nfs
- このブール値を有効にすると、
smbd
デーモンが NFS ボリュームを共有できるようになります。このブール値を無効にすると、smbd
は、Samba を使用して NFS 共有に完全にアクセスできなくなります。 sanlock_use_nfs
- これを有効にすると、ブール値により、
sanlock
デーモンが NFS ボリュームを管理できるようになります。 sge_use_nfs
- このブール値を有効にすると、
sge
スケジューラーは NFS ボリュームにアクセスできるようになります。 use_nfs_home_dirs
- このブール値を有効にすると、NFS ホームディレクトリーのサポートが追加されます。
virt_use_nfs
- このブール値を有効にすると、信頼できる仮想ゲストが NFS ボリュームのファイルを管理できるようになります。
xen_use_nfs
- このブール値を有効にすると、
Xen
は NFS ボリュームのファイルを管理できるようになります。 git_cgi_use_nfs
- このブール値を有効にすると、CGI (Git Common Gateway Interface) は NFS ボリュームにアクセスできるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
16.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
16.4.1. SELinux ラベル付き NFS のサポートの有効化 リンクのコピーリンクがクリップボードにコピーされました!
nfs-srv
で実行する必要があります。
- NFS サーバーが実行中の場合は、停止します。
systemctl stop nfs
[nfs-srv]# systemctl stop nfs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが停止していることを確認します。systemctl status nfs
[nfs-srv]# systemctl status nfs nfs-server.service - NFS Server Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/sysconfig/nfs
ファイルを編集して、RPCNFSDARGS
フラグを"-V 4.2"
に設定します。Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
# Optional arguments passed to rpc.nfsd. See rpc.nfsd(8) RPCNFSDARGS="-V 4.2"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - サーバーを再起動して、サーバーが実行していることを確認します。この出力には以下の情報が含まれます。タイムスタンプのみが異なります。
systemctl start nfs
[nfs-srv]# systemctl start nfs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - クライアントで、NFS サーバーをマウントします。
mount -o v4.2 server:mntpoint localmountpoint
[nfs-client]# mount -o v4.2 server:mntpoint localmountpoint
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべての SELinux ラベルが、サーバーからクライアントに正常に渡されるようになりました。
ls -Z file ls -Z file
[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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第17章 BIND (Berkeley Internet Name Domain) リンクのコピーリンクがクリップボードにコピーされました!
named
デーモンを使用して名前解決サービスを実行します。BIND を使用すると、数値アドレスではなく、名前を使用してコンピューターのリソースやサービスを特定できます。
rpm -q bind
~]$ rpm -q bind
package bind is not installed
yum
ユーティリティーを使用し、インストールします。
yum install bind
~]# yum install bind
17.1. BIND および SELinux リンクのコピーリンクがクリップボードにコピーされました!
/var/named/slaves/
ディレクトリー、/var/named/dynamic/
ディレクトリー、および /var/named/data/
ディレクトリーに対するデフォルトのパーミッションにより、ゾーン転送と動的 DNS 更新を使用したゾーンファイルの更新が可能になります。/var/named/
のファイルには、マスターゾーンファイルに使用される named_zone_t
タイプがラベル付けされています。
/var/named/slaves/
に配置するように/etc/named.conf
ファイルを設定します。以下は、/var/named/slaves/
に testdomain.com
のゾーンファイルを保存するスレーブ DNS サーバーの /etc/named.conf
のドメインエントリーの例です。
named_zone_t
のラベルが付いている場合は、ゾーン転送を許可し、動的 DNS によるゾーンファイルの更新を許可するために、named_write_master_zones
ブール値を有効にする必要があります。また、named
ユーザーまたはグループに読み取り、書き込み、実行のアクセスを許可するには、親ディレクトリーのモードを変更する必要があります。
/var/named/
のゾーンファイルにnamed_cache_t
タイプのラベルが付いている場合は、ファイルシステムの再ラベル付け、または実行中の restorecon -R /var/ により、ファイルシステムのタイプが named_zone_t
に変更されます。
17.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
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
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
17.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
17.4.1. 動的 DNS リンクのコピーリンクがクリップボードにコピーされました!
/var/named/dynamic/
ディレクトリーを使用します。このディレクトリーで作成またはコピーしたファイルは、named
による書き込みを許可する Linux 権限を継承します。このようなファイルには named_cache_t
タイプのラベルが付いているため、SELinux では、named
がそれらに書き込むことができます。
/var/named/dynamic/
のゾーンファイルに named_zone_t
タイプのラベルが付いている場合は、マージ前に更新を最初にジャーナルに書き込む必要があるため、動的 DNS 更新が一定期間成功しないことがあります。ジャーナルのマージを試行する際に、ゾーンファイルにnamed_zone_t
タイプのラベルが付けられている場合は、以下のようなエラーがログに記録されます。
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
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)
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
restorecon
ユーティリティーを使用します。
restorecon -R -v /var/named/dynamic
~]# restorecon -R -v /var/named/dynamic
第18章 同時バージョン管理システム リンクのコピーリンクがクリップボードにコピーされました!
rpm -q cvs
~]$ rpm -q cvs
package cvs is not installed
yum
ユーティリティーを使って root でインストールします。
yum install cvs
~]# yum install cvs
18.1. CVS と SELinux リンクのコピーリンクがクリップボードにコピーされました!
cvs
デーモンは、cvs_t
のタイプにラベルを付けて実行します。Red Hat Enterprise Linux におけるデフォルトでは、CVS は特定のディレクトリーの読み取りと書き込みのみを許可されています。ラベル cvs_data_t
は、cvs
が読み取りおよび書き込みを行う領域を定義します。SELinux で CVS を使用する場合は、クライアントが CVS データ用に予約された領域に完全アクセスするために、正しいラベルの割り当てが必須となります。
18.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
cvs_data_t
- このタイプは、CVS リポジトリーのデータに使用されます。CVS は、このタイプのデータがある場合に限り、そのデータへの完全アクセスを取得できます。
cvs_exec_t
- このタイプは、
/usr/bin/cvs
バイナリーに使用されます。
18.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
cvs_read_shadow
- このブール値により、
cvs
デーモンはユーザー認証用の/etc/shadow
ファイルにアクセスできるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
18.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
18.4.1. CDK の設定 リンクのコピーリンクがクリップボードにコピーされました!
192.168.1.1
の cvs-srv
の CVS サーバーと、ホスト名が cvs-client
で IP アドレスが 192.168.1.100
のクライアント の 2 つのホストが使用されます。両方のホストが同じサブネット (192.168.1.0/24) にあります。これは一例で、cvs パッケージと xinetd パッケージがインストールされ、SELinux targeted ポリシーが使用され、SELinux が実施モードで実行されていることを前提としています。
cvs-srv
上で実行されているはずです。
- この例では、cvs パッケージと xinetd パッケージが必要です。パッケージがインストールされていることを確認します。
rpm -q cvs xinetd
[cvs-srv]$ rpm -q cvs xinetd package cvs is not installed package xinetd is not installed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow インストールされていない場合は、root でyum
ユーティリティーを使用してインストールします。yum install cvs xinetd
[cvs-srv]# yum install cvs xinetd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを実行して、
CVS
という名前のグループを作成します。groupadd CVS
[cvs-srv]# groupadd CVS
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、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
cvspserver 2401/tcp # CVS client/server operations cvspserver 2401/udp # CVS client/server operations
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ファイルシステムの root 領域に CVS リポジトリーを作成します。SELinux を使用する場合は、root ファイルシステムにリポジトリーを置いて、他のサブディレクトリーに影響を及ぼさずに再帰的なラベルを付けられるようにすることが最善の方法です。たとえば、root で、リポジトリーを格納する
/cvs/
ディレクトリーを作成します。mkdir /cvs
[root@cvs-srv]# mkdir /cvs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - すべてのユーザーに、
/cvs/
ディレクトリーの完全なパーミッションを付与します。chmod -R 777 /cvs
[root@cvs-srv]# chmod -R 777 /cvs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告これは単なる例で、このような権限は実稼働システムでは使用できません。 /etc/xinetd.d/cvs
ファイルを編集し、CVS セクションがコメント解除されており、/cvs/
ディレクトリーを使用するように設定されていることを確認します。ファイルは以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow xinetd
デーモンを起動します。systemctl start xinetd.service
[cvs-srv]# systemctl start xinetd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow system-config-firewall
ユーティリティーを使用して、ポート 2401 で TCP 経由での着信接続を許可する規則を追加します。- クライアントで、
cvsuser
ユーザーとして以下のコマンドを実行します。cvs -d /cvs init
[cvsuser@cvs-client]$ cvs -d /cvs init
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この時点で、CVS は設定されていますが、SELinux はログインとファイルアクセスを拒否します。これを実証するには、
cvs-client
で$CVSROOT
変数を設定し、リモートでログインを試みます。cvs-client
では、以下の手順を行う必要があります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux がアクセスをブロックしました。SELinux にこのアクセスを許可させるために、次のステップはcvs-srv
で実行されることになっています。 /cvs/
ディレクトリーのコンテキストを root 権限で変更し、/cvs/
ディレクトリーの既存データーおよび新規データーに再帰的にラベル付けするcvs_data_t
タイプを指定します。semanage fcontext -a -t cvs_data_t '/cvs(/.*)?' restorecon -R -v /cvs
[root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?' [root@cvs-srv]# restorecon -R -v /cvs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - クライアント
cvs-client
は、このリポジトリーにログインし、すべての CVS リソースにアクセスできるようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第19章 Squid キャッシングプロキシー リンクのコピーリンクがクリップボードにコピーされました!
rpm -q squid
~]$ rpm -q squid
package squid is not installed
yum
ユーティリティーを使って root でインストールします。
yum install squid
~]# yum install squid
19.1. Squid キャッシングプロキシーおよび SELinux リンクのコピーリンクがクリップボードにコピーされました!
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを実行して、
squid
デーモンを起動します。systemctl start squid.service
~]# systemctl start squid.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
プロセスを表示するには、次のコマンドを実行します。ps -eZ | grep 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:squid_t:s0
です。コンテキストの 2 番目の部分squid_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、squid プロセスがsquid_t
ドメインで実行しています。
squid_t
など) で実行されるプロセスが、ファイル、その他のプロセス、およびシステム一般とどのように対話するかを定義します。squid によるアクセスを可能にするには、ファイルが正しくラベル付けされている必要があります。
/etc/squid/squid.conf
ファイルが、デフォルトの TCP ポート 3128、3401、または 4827 以外のポートを squid
がリッスンするように設定されている場合は、semanage port コマンドを使用して、必要なポート番号を SELinux ポリシー設定に追加する必要があります。以下の例では、SELinux ポリシー設定で最初に定義されていないポートをリッスンするように squid
を設定すると、サーバーが起動しなくなります。また、この例では、ポリシーで定義されていない標準以外のポートをデーモンが正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、squid パッケージがインストールされていることを前提としています。この例では、各コマンドを root ユーザーとして実行します。
squid
デーモンが実行していないことを確認します。systemctl status squid.service
~]# systemctl status squid.service squid.service - Squid caching proxy Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled) Active: inactive (dead)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が異なる場合は、プロセスを停止します。systemctl stop squid.service
~]# systemctl stop squid.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
がリッスンできるポートを表示するには、以下のコマンドを実行します。semanage port -l | grep -w -i squid_port_t
~]# semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
/etc/squid/squid.conf
を編集します。http_port
オプションを設定して、squid
用の SELinux ポリシー設定で設定されていないポートのリストを表示するようにします。この例では、デーモンがポート 10000 をリッスンするように設定されています。Squid normally listens to port 3128
# Squid normally listens to port 3128 http_port 10000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - setsebool コマンドを実行して、
squid_connect_any
のブール値が off に設定されていることを確認します。これにより、squid
が特定のポートでのみ動作するようになります。setsebool -P squid_connect_any 0
~]# setsebool -P squid_connect_any 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
デーモンを起動します。systemctl start squid.service
~]# systemctl start squid.service Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような 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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux で、
httpd
がポート 10000 をリッスンできるようにするには、以下のコマンドが必要です。semanage port -a -t squid_port_t -p tcp 10000
~]# semanage port -a -t squid_port_t -p tcp 10000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
を再起動して、新しいポートでリッスンするようにします。systemctl start squid.service
~]# systemctl start squid.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在、SELinux は、標準以外のポート (この例では TCP 10000) で Squid がリッスンできるように設定されており、このポートで正常に起動します。
19.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
httpd_squid_script_exec_t
- このタイプは、
cachemgr.cgi
などのユーティリティーに使用されます。このユーティリティーは、Squid とその設定に関するさまざまな統計情報を提供します。 squid_cache_t
/etc/squid/squid.conf
のcache_dir
ディレクティブで定義されているように、Squid によりキャッシュされるデータにこのタイプを使用します。初期設定では、/var/cache/squid/
ディレクトリーおよび/var/spool/squid/
ディレクトリーに作成またはコピーされるファイルには、squid_cache_t
タイプに応じたラベルが付けられています。/var/squidGuard/
ディレクトリーに作成またはコピーされたsquid
用の squidGuard URL リダイレクタプラグインには、squid_cache_t
タイプのラベルが付けられています。Squid は、キャッシュされたデータに対して、このタイプのラベルが付いたファイルおよびディレクトリーのみを使用できます。squid_conf_t
- このタイプは、Squid が設定に使用するディレクトリーおよびファイルに使用されます。既存ファイル、または
/etc/squid/
ディレクトリーおよび/usr/share/squid/
ディレクトリーで作成またはコピーされたファイルには、エラーメッセージやアイコンなどを含む、このタイプのラベルが付けられています。 squid_exec_t
- このタイプは、
squid
のバイナリー (/usr/sbin/squid
) に使用されます。 squid_log_t
- このタイプはログに使用されます。既存のファイル、
/var/log/squid/
または/var/log/squidGuard/
に作成またはコピーされたファイルには、この種類のラベルを付ける必要があります。 squid_initrc_exec_t
- このタイプは、
/etc/rc.d/init.d/squid
にあるsquid
を起動するために必要な初期化ファイルに使用されます。 squid_var_run_t
- このタイプは、
/var/run/
ディレクトリーのファイル、とりわけ/var/run/squid.pid
という名前のプロセス ID (PID) で使用されます。この PID は、実行時に Squid により作成されます。
19.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
squid_connect_any
- このブール値を有効にすると、Squid は任意のポートでリモートホストへの接続を開始できます。
squid_use_tproxy
- これを有効にすると、ブール値により、Squid を透過プロキシーとして実行できます。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
19.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
19.4.1. 標準以外のポートへの Squid 接続 リンクのコピーリンクがクリップボードにコピーされました!
- squidがインストールされていることを確認します。
rpm -q squid
~]$ rpm -q squid package squid is not installed
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このパッケージがインストールされていない場合は、root でyum
ユーティリティーを使用してインストールします。yum install squid
~]# yum install squid
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 主な設定ファイル
/etc/squid/squid.conf
を編集し、cache_dir
ディレクティブがコメント解除されており、以下のようになっていることを確認します。cache_dir ufs /var/spool/squid 100 16 256
cache_dir ufs /var/spool/squid 100 16 256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この行は、この例で使用するcache_dir
ディレクティブのデフォルト設定を指定します。これは、Squid ストレージ形式 (ufs
)、キャッシュが存在するシステムのディレクトリー (/var/spool/squid
)、キャッシュに使用するディスク領域の量 (100
)、および作成する第 1 レベルおよび第 2 レベルのキャッシュディレクトリーの数 (それぞれ16
および256
) で設定されます。 - 同じ設定ファイルで、
http_access allow localnet
ディレクティブのコメントが解除されていることを確認します。これにより、Red Hat Enterprise Linux への Squid のデフォルトインストールで自動的に設定されるlocalnet
ACL からのトラフィックが許可されます。これにより、既存の RFC1918 ネットワークのクライアントマシンがプロキシーを介してアクセスできるようになります。これは、この単純な例としては十分です。 - 同じ設定ファイルで、
visible_hostname
ディレクティブがコメント解除され、マシンのホスト名に設定されていることを確認します。この値は、ホストの完全修飾ドメイン名 (FQDN) にする必要があります。visible_hostname squid.example.com
visible_hostname squid.example.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、以下のコマンドを実行して、
squid
デーモンを起動します。squid
を初めて起動する際に、このコマンドは、cache_dir
ディレクティブで指定した方法でキャッシュディレクトリーを初期化し、デーモンを起動します。systemctl start squid.service
~]# systemctl start squid.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid
が正常に起動していることを確認します。この出力には、以下の情報が含まれます。タイムスタンプのみが異なります。systemctl status squid.service
~]# 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow squid_var_run_t
値からわかるように、squid
プロセス ID (PID) が制限付きサービスとして起動していることを確認します。ls -lZ /var/run/squid.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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この時点で、以前に設定した
localnet
ACL に接続したクライアントマシンは、このホストの内部インターフェイスをプロキシーとして正常に使用できます。これは、すべての一般的な Web ブラウザーの設定で、またはシステム全体で設定できます。Squid はターゲットマシン (TCP 3128) のデフォルトポートでリッスンしていますが、ターゲットマシンは共通ポートを介したインターネット上の他のサービスへの発信接続のみを許可します。これは、SELinux 自体が定義するポリシーです。次の手順で示すように、SELinux は標準以外のポートへのアクセスを拒否します。 - クライアントが、TCP ポート 10000 でリッスンしている Web サイトなどの Squid プロキシーを使用して、標準以外のポートを使用して要求を行うと、以下のような拒否がログに記録されます。
SELinux is preventing the squid daemon from connecting to network port 10000
SELinux is preventing the squid daemon from connecting to network port 10000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これを可能にするには、
squid_connect_any
ブール値を変更する必要があります。これは、デフォルトで無効になっているためです。setsebool -P squid_connect_any on
~]# setsebool -P squid_connect_any on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記再起動後も、setsebool の変更を保持したくない場合は、-P
オプションを使用しないでください。 - Squid がクライアントに代わってポートへの接続を開始できるようになったため、クライアントはインターネットの標準以外のポートにアクセスできるようになりました。
第20章 MariaDB (MySQL の代替) リンクのコピーリンクがクリップボードにコピーされました!
mysqld
) と、多くのクライアントプログラムおよびライブラリーで設定されます。[18]
rpm -q mariadb-server
~]$ rpm -q mariadb-server
package mariadb-server is not installed
yum
ユーティリティーを使用してインストールします。
yum install mariadb-server
~]# yum install mariadb-server
20.1. MariaDB と SELinux リンクのコピーリンクがクリップボードにコピーされました!
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを入力して、
mariadb
を起動します。systemctl start mariadb.service
~]# systemctl start mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysqld
プロセスを表示するには、次のコマンドを実行します。ps -eZ | grep 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysqld
プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:mysqld_t:s0
です。コンテキストの 2 番目の部分mysqld_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、mysqld
プロセスがmysqld_t
ドメインで実行しています。
20.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
mysqld
では、以下のタイプが使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
mysqld_db_t
- このタイプは、MariaDB データベースの場所に使用されます。Red Hat Enterprise Linux では、データベースのデフォルトの場所は
/var/lib/mysql/
ディレクトリーですが、これは変更できます。MariaDB データベースの場所を変更する場合は、このタイプのラベルを、新しい場所に作成する必要があります。デフォルトのデータベースの場所を変更する方法と、新しいセクションに適切なラベルを付ける方法は、「MariaDB によるデータベースの場所の変更」 の例を参照してください。 mysqld_etc_t
- このタイプは、MariaDB のメイン設定ファイル
/etc/my.cnf
および/etc/mysql/
ディレクトリー内のその他の設定ファイルに使用されます。 mysqld_exec_t
- このタイプは、
/usr/libexec/mysqld
にあるmysqld
バイナリーに使用されます。これは、Red Hat Enterprise Linux における MariaDB バイナリーのデフォルトの場所です。他のシステムは、このバイナリーを/usr/sbin/mysqld
に置くことができます。このバイナリーには、このタイプのラベルを付ける必要があります。 mysqld_unit_file_t
- このタイプは、Red Hat Enterprise Linux のデフォルトでは、
/usr/lib/systemd/system/
ディレクトリーにある実行ファイル MariaDB 関連のファイルに使用されます。 mysqld_log_t
- MariaDB のログには、適切な操作を行うためにこのタイプのラベルを付ける必要があります。
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
- このブール値を有効にすると、
exim
メーラーはデータベースサーバーへの接続を開始できます。 ftpd_connect_db
- このブール値を有効にすると、
ftp
デーモンがデータベースサーバーへの接続を開始できるようになります。 httpd_can_network_connect_db
- Web サーバーがデータベースサーバーと通信するには、このブール値を有効にする必要があります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_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
~]# ls -lZ /var/lib/mysql drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データベースファイルの場所のデフォルトのコンテキスト要素であるmysqld_db_t
を示しています。このコンテキストを適切に機能させるために、この例で使用される新しいデータベースの場所に、手動で適用する必要があります。- 次のコマンドを入力し、
mysqld
root パスワードを入力して、利用可能なデータベースを表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mariadb.service
サービスを停止します。systemctl stop mariadb.service
~]# systemctl stop mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベースの新しい場所に、新しいディレクトリーを作成します。この例では、
/mysql/
が使用されています。mkdir -p /mysql
~]# mkdir -p /mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 古い場所から新しい場所に、データベースファイルをコピーします。
cp -R /var/lib/mysql/* /mysql/
~]# cp -R /var/lib/mysql/* /mysql/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - mysql ユーザーおよびグループによるアクセスを許可するように、この場所の所有権を変更します。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
chown -R mysql:mysql /mysql
~]# chown -R mysql:mysql /mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以下のコマンドを実行すると、作成したディレクトリーの初期コンテキストが表示されます。
ls -lZ /mysql
~]# ls -lZ /mysql drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しく作成されたこのディレクトリーのコンテキストusr_t
は、現在、MariaDB データベースファイルの場所として SELinux には適していません。コンテキストを変更すると、MariaDB はこのエリアで適切に機能できるようになります。 - テキストエディターで、MariaDB のメイン設定ファイル
/etc/my.cnf
を開き、新しい場所を参照できるようにdatadir
オプションを変更します。この例で入力する必要のある値は/mysql
です。[mysqld] datadir=/mysql
[mysqld] datadir=/mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このファイルを保存して終了します。 mariadb.service
を起動します。サービスの起動に失敗し、拒否メッセージが/var/log/messages
ファイルに記録されます。systemctl start mariadb.service
~]# systemctl start mariadb.service Job for mariadb.service failed. See 'systemctl status mariadb.service' and 'journalctl -xn' for details.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ただし、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
SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この拒否の理由は、MariaDB データファイルに対して/mysql/
が正しくラベル付けされていないことです。SELinux により、MariaDB がusr_t
とラベル付けされたコンテンツにアクセスできなくなりました。この問題を解決するには、以下の手順を実行します。- 以下のコマンドを入力して、
/mysql/
のコンテキストマッピングを追加します。semanage
ユーティリティーは、デフォルトではインストールされないことに注意してください。同梱されていない場合は、policycoreutils-python をインストールしてください。semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは、
/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます。grep -i 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで
restorecon
ユーティリティーを使用して、このコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /mysql
~]# restorecon -R -v /mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /mysql/
の場所には MariaDB の正しいコンテキストでラベル付けされ、mysqld
が起動します。systemctl start mariadb.service
~]# systemctl start mariadb.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /mysql/
に対してコンテキストが変更されたことを確認します。ls -lZ /mysql
~]$ ls -lZ /mysql drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この場所が変更され、ラベルが付けられ、
mysqld
が正常に起動されました。この時点で、実行中のすべてのサービスをテストして、通常の操作を確認してください。
第21章 PostgreSQL リンクのコピーリンクがクリップボードにコピーされました!
rpm -q postgresql-server
~]# rpm -q postgresql-server
yum
ユーティリティーを使用してインストールします。
yum install postgresql-server
~]# yum install postgresql-server
21.1. PostgreSQL および SELinux リンクのコピーリンクがクリップボードにコピーされました!
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを入力して、
postgresql
を起動します。systemctl start postgresql.service
~]# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql
プロセスを表示するには、次のコマンドを実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql
プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:postgresql_t:s0
です。文脈の最後の部分であるpostgresql_t
はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、postgresql
プロセスがpostgresql_t
ドメインで実行しています。
21.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
postgresql
では、以下のタイプが使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。以下のリストでは、使用可能な場所全体を一致させるために、複数の正規表現を使用していることに注意してください。
postgresql_db_t
- このタイプは複数の場所で使用されます。このタイプのラベルが付いた場所は、PostgreSQL のデータファイルに使用されます。
/usr/lib/pgsql/test/regres
/usr/share/jonas/pgsql
/var/lib/pgsql/data
/var/lib/postgres(ql)?
postgresql_etc_t
- このタイプは、
/etc/postgresql/
ディレクトリーの設定ファイルに使用されます。 postgresql_exec_t
- このタイプは複数の場所で使用されます。このタイプのラベルが付いた場所は、PostgreSQL のバイナリーに使用されます。
/usr/bin/initdb(.sepgsql)?
/usr/bin/(se)?postgres
/usr/lib(64)?/postgresql/bin/.*
/usr/lib(64)?/pgsql/test/regress/pg_regress
systemd_unit_file_t
- このタイプは、
/usr/lib/systemd/system/
ディレクトリーに置かれている PostgreSQL 関連の実行ファイルに使用されます。 postgresql_log_t
- このタイプは複数の場所で使用されます。このタイプのラベルが付いた場所は、ログファイルに使用されます。
/var/lib/pgsql/logfile
/var/lib/pgsql/pgstartup.log
/var/lib/sepgsql/pgstartup.log
/var/log/postgresql
/var/log/postgres.log.*
/var/log/rhdb/rhdb
/var/log/sepostgresql.log.*
postgresql_var_run_t
- このタイプは、
/var/run/postgresql/
ディレクトリーのプロセス ID (PID) など、PostgreSQL のランタイムファイルに使用されます。
21.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
selinuxuser_postgresql_connect_enabled
- ブール値を有効にすると、(PostgreSQL により定義される) ユーザードメインがデータベースサーバーへの接続を確立できるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_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
~]# ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、データベースファイルの場所のデフォルトのコンテキスト要素であるpostgresql_db_t
を示しています。このコンテキストを適切に機能させるために、この例で使用される新しいデータベースの場所に、手動で適用する必要があります。- データベースの新しい場所に、新しいディレクトリーを作成します。この例では、
/opt/postgresql/data/
が使用されています。別の場所を使用する場合は、以下の手順のテキストを、使用している場所に置き換えます。mkdir -p /opt/postgresql/data
~]# mkdir -p /opt/postgresql/data
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しい場所のディレクトリーのリスト表示を実行します。新規ディレクトリーの最初のコンテキストは
usr_t
であることに注意してください。このコンテキストは、SELinux が PostgreSQL にその保護メカニズムを提供するためには不十分です。コンテキストを変更すると、新しいエリアで適切に機能できるようになります。ls -lZ /opt/postgresql/
~]# ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 data
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - postgres ユーザーおよびグループによるアクセスを許可するために、新しい場所の所有権を変更します。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
chown -R postgres:postgres /opt/postgresql
~]# chown -R postgres:postgres /opt/postgresql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - テキストエディターで
/etc/systemd/system/postgresql.service
ファイルを開き、PGDATA
変数およびPGLOG
変数を変更して、新しい場所を指定します。vi /etc/systemd/system/postgresql.service
~]# vi /etc/systemd/system/postgresql.service PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.log
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このファイルを保存し、テキストエディターを終了します。/etc/systemd/system/postgresql.service
ファイルが存在しない場合は作成し、次の内容を挿入します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しい場所でデータベースを初期化します。
su - postgres -c "initdb -D /opt/postgresql/data"
~]$ su - postgres -c "initdb -D /opt/postgresql/data"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベースの場所を変更すると、この時点でサービスの起動に失敗します。
systemctl start postgresql.service
~]# systemctl start postgresql.service Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux によりサービスが起動しなくなりました。これは、新しい場所に適切なラベルが付けられていないためです。以下の手順では、新しい場所 (/opt/postgresql/
) にラベルを付け、postgresql サービスを適切に起動する方法を説明します。 semanage
ユーティリティーを使用して、/opt/postgresql/
およびその中のその他のディレクトリーやファイルに対するコンテキストマッピングを追加します。semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
~]# semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは、
/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます。grep -i 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで
restorecon
ユーティリティーを使用して、このコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /opt/postgresql
~]# restorecon -R -v /opt/postgresql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/postgresql/
の場所に、PostgreSQL の正しいコンテキストのラベルが付けられるようになり、postgresql
サービスが正常に起動します。systemctl start postgresql.service
~]# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /opt/postgresql/
のコンテキストが正しいことを確認します。ls -lZ /opt
~]$ ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresql
処理で新しい場所が表示されることを、ps コマンドで確認します。ps aux | grep -i postmaster
~]# 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/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 場所が変更され、ラベルが付けられ、
postgresql
が正常に起動しました。この時点で、実行中のすべてのサービスをテストして、通常の操作を確認してください。
第22章 rsync リンクのコピーリンクがクリップボードにコピーされました!
rsync
ユーティリティーは、高速なファイル転送を実行し、システム間でデータの同期に使用されます。[20]
rpm -q rsync
~]$ rpm -q rsync
package rsync is not installed
yum
ユーティリティーを使用してインストールします。
yum install rsync
~]# yum install rsync
22.1. rsync および SELinux リンクのコピーリンクがクリップボードにコピーされました!
rsync
デーモンを使用してファイルを共有する場合は、ファイルおよびディレクトリーに public_content_t
タイプのラベルを付ける必要があります。ほとんどのサービスと同様に、SELinux が rsync
経由でその防御メカニズムを実行するには、正しいラベリングが必要になります。[21]
22.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
rsync
では、以下のタイプが使用されます。フレキシブルアクセスを設定するには、以下のいずれかを行います。
public_content_t
- これは、
rsync
を使用して共有するファイル (および実際のファイル) の場所に使用される一般的なタイプです。rsync
と共有するファイルを格納する特殊なディレクトリーを作成する場合は、そのディレクトリーとその内容に、このラベルを適用する必要があります。 rsync_exec_t
- このタイプは、
/usr/bin/rsync
システムバイナリーに使用されます。 rsync_log_t
- このタイプは、
rsync
ログファイルに使用されます。デフォルトでは/var/log/rsync.log
にあります。rsync ログファイルの場所を変更するには、実行時に rsync コマンドの--log-file=FILE
を使用します。 rsync_var_run_t
- このタイプは、
/var/run/rsyncd.lock
にあるrsyncd
ロックファイルに使用されます。このロックファイルは、rsync
サーバーが接続制限を管理するために使用されます。 rsync_data_t
- このタイプは、rsync ドメインとして使用し、その他のサービスのアクセス範囲から分離するファイルおよびディレクトリーに使用されます。また、
public_content_t
は、ファイルまたはディレクトリーが複数のサービス (たとえば、rsync ドメインとしての FTP および NFS ディレクトリー) と相互作用する場合に使用できる、一般的な 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
がrsync_t
ドメインに存在する必要があることに注意してください。本章の設定例は、rsync_t
ドメインで実行しているrsync
を示しています。 rsync_export_all_ro
- このブール値を有効にすると、
rsync_t
ドメインのrsync
が、クライアントへの読み取り専用アクセスを持つ NFS および CIFS ボリュームをエクスポートできるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
22.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
22.4.1. デーモンとしての Rsync リンクのコピーリンクがクリップボードにコピーされました!
rsync
デーモンが標準以外のポートで通常どおり実行できるように SELinux ポリシーを変更する方法を示します。
手順22.1 rsync を rsync_t として起動させる
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - which コマンドを実行して、rsync バイナリーがシステムパスにあることを確認します。
which rsync
~]$ which rsync /usr/bin/rsync
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - rsync をデーモンとして実行する場合は、設定ファイルを使用して、
/etc/rsyncd.conf
として保存する必要があります。この例で使用されている以下の設定ファイルは非常に単純であり、使用可能なすべてのオプションを示しているわけではなく、rsync
デーモンを示すだけで十分であることに注意してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - rsync がデーモンモードで動作するための簡単な設定ファイルが存在するようになったため、以下のコマンドを実行して起動できます。
systemctl start rsyncd.service
~]# systemctl start rsyncd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rsyncd
が正常に起動したことを確認します (出力は以下のようになります。タイムスタンプのみが異なります)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux は、rsync_t
ドメインで実行しているときに、rsync
デーモンにプロテクションメカニズムを適用できるようになりました。ps -eZ | grep rsync
~]$ ps -eZ | grep rsync system_u:system_r:rsync_t:s0 3220 ? 00:00:00 rsync
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
rsync_t
ドメインで実行しているrsyncd
を取得する方法を示しています。Rsync は、ソケットが有効なサービスとして実行することもできます。これにより、クライアントがサービスへの接続を試行するまで、rsyncd
が実行されません。rsyncd
がソケットにより起動したサービスとして実行できるようにするには、上記の手順を行います。rsyncd
をソケット起動サービスとして起動するには、root で以下のコマンドを実行します。
systemctl start rsyncd.socket
~]# systemctl start rsyncd.socket
手順22.2 デフォルト以外のポートでの rsync デーモンの実行
/etc/rsyncd.conf
ファイルを変更し、グローバル設定領域 (つまりファイル領域が定義する前) のファイルの一番上にあるport = 10000
行を追加します。新しい設定ファイルは以下のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この新しい設定で
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage
ユーティリティーを使用して、rsync_port_t
の SELinux ポリシーに TCP ポート 10000 を追加します。semanage port -a -t rsync_port_t -p tcp 10000
~]# semanage port -a -t rsync_port_t -p tcp 10000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow rsync_port_t
の SELinux ポリシーに TCP ポート 10000 が追加され、rsyncd
はこのポートで通常どおり起動して動作するようになりました。systemctl start rsyncd.service
~]# systemctl start rsyncd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow netstat -lnp | grep 10000
~]# netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsync
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
rsyncd
の TCP ポート 10000 での動作が許可されるようになりました。
第23章 postfix リンクのコピーリンクがクリップボードにコピーされました!
rpm -q postfix
~]$ rpm -q postfix
package postfix is not installed
yum
ユーティリティー root を使用して、インストールします。
yum install postfix
~]# yum install postfix
23.1. Postfix および SELinux リンクのコピーリンクがクリップボードにコピーされました!
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを入力して、
postfix
を起動します。systemctl start postfix.service
~]# systemctl start postfix.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行して、
postfix
プロセスを表示します。ps -eZ | grep 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、Postfixmaster
プロセスに関連する SELinux コンテキストがsystem_u:system_r:postfix_master_t:s0
になっています。文脈の最後の部分であるpostfix_master_t
は、この処理のタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この例では、master
プロセスがpostfix_master_t
ドメインで実行しています。
23.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
postfix_etc_t
- このタイプは、
/etc/postfix/
ディレクトリーの Postfix の設定ファイルに使用されます。 postfix_data_t
- このタイプは、
/var/lib/postfix/
ディレクトリーの Postfix データファイルに使用されます。 postfix_var_run_t
- このタイプは、
/run/
ディレクトリーに保存されている Postfix ファイルに使用されます。 postfix_initrc_exec_t
- Postfix 実行ファイルには、
postfix_initrc_exec_t
タイプにラベルが付いています。実行すると、postfix_initrc_t
ドメインに移行します。 postfix_spool_t
- このタイプは、
/var/spool/
ディレクトリーに保存されている Postfix ファイルに使用されます。
grep postfix /etc/selinux/targeted/contexts/files/file_contexts
~]$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts
23.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
postfix_local_write_mail_spool
- ブール値を有効にすると、Postfix はシステムのローカルメールスプールに書き込むことができるようになります。Postfix では、ローカルのスプールを使用する場合に、通常の操作でこのブール値を有効にする必要があります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
23.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
23.4.1. SpamAssassin および Postfix リンクのコピーリンクがクリップボードにコピーされました!
rpm -q spamassassin
~]$ rpm -q spamassassin
package spamassassin is not installed
yum
ユーティリティーを使用してインストールします。
yum install spamassassin
~]# yum install spamassassin
手順23.1 デフォルト以外のポートで SpamAssassin を実行する
semanage
ユーティリティーを root で実行し、SELinux によりspamd
デーモンがデフォルトでリッスンできるようになっているポートを表示します。semanage port -l | grep spamd
~]# semanage port -l | grep spamd spamd_port_t tcp 783
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これは、TCP/783 がspamd_port_t
で SpamAssassin の動作ポートとして定義されていることを示しています。/etc/sysconfig/spamassassin
設定ファイルを編集して、サンプルポート TCP/10000 で SpamAssassin を起動するように変更します。Options to spamd
# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この行では、SpamAssassin がポート 10000 で動作することを指定するようになりました。以下の例では、このソケットを開くことができるように SELinux ポリシーを変更する方法を説明します。- SpamAssassin を起動すると、以下のようなエラーメッセージが表示されます。
systemctl start spamassassin.service
~]# systemctl start spamassassin.service Job for spamassassin.service failed. See 'systemctl status spamassassin.service' and 'journalctl -xn' for details.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力は、SELinux がこのポートへのアクセスをブロックしたことを示しています。 - 以下のような拒否メッセージが SELinux により記録されます。
SELinux is preventing the spamd (spamd_t) from binding to port 10000.
SELinux is preventing the spamd (spamd_t) from binding to port 10000.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
semanage
を実行して SELinux ポリシーを変更し、SpamAssassin がサンプルポート (TCP/10000) で動作できるようにします。semanage port -a -t spamd_port_t -p tcp 10000
~]# semanage port -a -t spamd_port_t -p tcp 10000
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SpamAssassin が起動し、TCP ポート 10000 で動作していることを確認します。
systemctl start spamassassin.service netstat -lnp | grep 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この時点で、
spamd
は、SELinux ポリシーでそのポートへのアクセスが許可されているため、TCP ポート 10000 で適切に動作しています。
第24章 DHCP リンクのコピーリンクがクリップボードにコピーされました!
dhcpd
デーモンは、Red Hat Enterprise Linux で使用され、クライアントのレイヤー 3 の TCP/IP 詳細を動的に配信して設定します。
dhcpd
デーモンを提供します。以下のコマンドを実行して、dhcp パッケージがインストールされているかどうかを確認します。
rpm -q dhcp
~]# rpm -q dhcp
package dhcp is not installed
yum
ユーティリティーを使用してインストールします。
yum install dhcp
~]# yum install dhcp
24.1. DHCP および SELinux リンクのコピーリンクがクリップボードにコピーされました!
dhcpd
が有効になると、デフォルトで制限付きで実行されます。制限のあるプロセスは、独自のドメインで実行され、他の制限のあるプロセスから分離されます。制限のあるプロセスが攻撃者によって侵害された場合、SELinux ポリシーの設定に応じて、攻撃者のリソースへのアクセスと、攻撃者が行う可能性のある損害は制限されます。以下の例は、dhcpd
と、そのドメインで実行している関連プロセスを示しています。この例では、dhcp がインストールされ、dhcpd
サービスが開始していることを前提としています。
- getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
getenforce
~]$ getenforce Enforcing
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が Enforcing モードで実行されていると、このコマンドはEnforcing
を返します。 - root で次のコマンドを入力して、
dhcpd
を起動します。systemctl start dhcpd.service
~]# systemctl start dhcpd.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが実行中であることを確認します。出力には以下の情報が含まれている必要があります (タイムスタンプのみは異なります)。systemctl status 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行して、
dhcpd
プロセスを表示します。ps -eZ | grep dhcpd
~]$ ps -eZ | grep dhcpd system_u:system_r:dhcpd_t:s0 5483 ? 00:00:00 dhcpd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow dhcpd プロセスに関連付けられた SELinux コンテキストはsystem_u:system_r:dhcpd_t:s0
です。
24.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
dhcp_etc_t
- このタイプは、主に、設定ファイルを含む
/etc
ディレクトリーのファイルに使用されます。 dhcpd_var_run_t
- このタイプは、
/var/run/
ディレクトリーのdhcpd
の PID ファイルに使用されます。 dhcpd_exec_t
- このタイプは、DHCP 実行ファイルを
dhcpd_t
ドメインに移行するために使用されます。 dhcpd_initrc_exec_t
- このタイプは、DHCP 実行ファイルを
dhcpd_initrc_t
ドメインに移行するために使用されます。
dhcpd
ファイルのリストとそのタイプを表示するには、次のコマンドを実行します。
grep dhcp /etc/selinux/targeted/contexts/files/file_contexts
~]$ grep dhcp /etc/selinux/targeted/contexts/files/file_contexts
第25章 OpenShift by Red Hat リンクのコピーリンクがクリップボードにコピーされました!
rpm -q openshift-clients
~]$ rpm -q openshift-clients
package openshift-clients is not installed
25.1. OpenShift および SELinux リンクのコピーリンクがクリップボードにコピーされました!
25.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
プロセスのタイプ
openshift_t
- OpenShift プロセスは、
openshift_t
SELinux のタイプに関連付けられています。
実行ファイルのタイプ
openshift_cgroup_read_exec_t
- SELinux では、このタイプのファイルを使用して、実行ファイルを
openshift_cgroup_read_t
ドメインに移行できます。 openshift_cron_exec_t
- SELinux では、このタイプのファイルを使用して、実行ファイルを
openshift_cron_t
ドメインに移行できます。 openshift_initrc_exec_t
- SELinux では、このタイプのファイルを使用して、実行ファイルを
openshift_initrc_t
ドメインに移行できます。
書き込み可能なタイプ
openshift_cgroup_read_tmp_t
- このタイプでは、
/tmp
ディレクトリー内の OpenShift 制御グループ (cgroup) による一時ファイルの読み取りとアクセスが可能になります。 openshift_cron_tmp_t
- このタイプでは、OpenShift cron ジョブの一時ファイルを
/tmp
に保存できます。 openshift_initrc_tmp_t
- このタイプでは、OpenShift
initrc
一時ファイルを/tmp
に保存できます。 openshift_log_t
- このタイプのファイルは、OpenShift ログデータとして扱われ、通常は
/var/log/
ディレクトリーに保存されます。 openshift_rw_file_t
- OpenShift には、このタイプのラベルが付いたファイルの読み取りと書き込みのパーミッションがあります。
openshift_tmp_t
- このタイプは、OpenShift 一時ファイルを
/tmp
に保存するために使用されます。 openshift_tmpfs_t
- このタイプを使用すると、OpenShift データを tmpfs ファイルシステムに保存できます。
openshift_var_lib_t
- このタイプを使用すると、
/var/lib/
ディレクトリーに OpenShift ファイルを保存できます。 openshift_var_run_t
- このタイプを使用すると、
/run/
ディレクトリーまたは/var/run/
ディレクトリーに OpenShift ファイルを保存できます。
25.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
openshift_use_nfs
- ブール値を有効にすると、NFS 共有に OpenShift をインストールできるようになります。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
25.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
25.4.1. デフォルトの OpenShift ディレクトリーの変更 リンクのコピーリンクがクリップボードにコピーされました!
/var/lib/openshift/
ディレクトリーに保存します。このディレクトリーには openshift_var_lib_t
SELinux のタイプのラベルが付いています。OpenShift が別のディレクトリーにデータを保存できるようにするには、適切な SELinux コンテキストで、新しいディレクトリーにラベルを付けます。
/srv/openshift/
に保存するために、デフォルトの OpenShift ディレクトリーを変更する方法を示しています。
手順25.1 データを保存するためのデフォルトの OpenShift ディレクトリーの変更
- root で、
/srv
ディレクトリーに新しいopenshift/
ディレクトリーを作成します。新しいディレクトリーには、var_t
のタイプにラベルが付けられます。mkdir /srv/openshift
~]# mkdir /srv/openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Zd /srv/openshift
~]$ ls -Zd /srv/openshift drwxr-xr-x. root root unconfined_u:object_r:var_t:s0 openshift/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で、
semanage
ユーティリティーを使用して、/srv/openshift/
を適切な SELinux コンテキストにマッピングします。semanage fcontext -a -e /var/lib/openshift /srv/openshift
~]# semanage fcontext -a -e /var/lib/openshift /srv/openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次に、root で
restorecon
ユーティリティーを使用して変更を適用します。restorecon -R -v /srv/openshift
~]# restorecon -R -v /srv/openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで、
/srv/openshift/
ディレクトリーに、正しいopenshift_var_lib_t
タイプのラベルが付けられます。ls -Zd /srv/openshift
~]$ ls -Zd /srv/openshift drwxr-xr-x. root root unconfined_u:object_r:openshift_var_lib_t:s0 openshift/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第26章 ID 管理 リンクのコピーリンクがクリップボードにコピーされました!
rpm -q ipa-server
~]$ rpm -q ipa-server
package ipa-server is not installed
yum install ipa-server
~]# yum install ipa-server
26.1. ID 管理と SELinux リンクのコピーリンクがクリップボードにコピーされました!
SSSD
(System Security Services Daemon) は特定の IdM ユーザーに定義したアクセス権限をクエリーします。そして、pam_selinux
モジュールは、IdM のアクセス権 (guest_u:guest_r:guest_t:s0
など) に従って、適切な 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. IdM ユーザーへの SELinux ユーザーのマッピング リンクのコピーリンクがクリップボードにコピーされました!
手順26.1 SELinux マッピングにユーザーを追加する方法
- 新しい SELinux マッピングを作成するには、以下のコマンドを実行します。
SELinux_mapping
は新しい SELinux マッピングの名前で、--selinuxuser
オプションは特定の SELinux ユーザーを指定します。ipa selinuxusermap-add SELinux_mapping --selinuxuser=staff_u:s0-s0:c0.c1023
~]$ ipa selinuxusermap-add SELinux_mapping --selinuxuser=staff_u:s0-s0:c0.c1023
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のコマンドを実行して、
tuser
のユーザー名を持つ IdM ユーザーを SELinux マッピングに追加します。ipa selinuxusermap-add-user --users=tuser SELinux_mapping
~]$ ipa selinuxusermap-add-user --users=tuser SELinux_mapping
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ipaclient.example.com
という名前の新しいホストを SELinux マッピングに追加するには、次のコマンドを実行します。ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mapping
~]$ ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mapping
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tuser
ユーザーは、ipaclient.example.com ホストコンピューターにログインすると、staff_u:s0-s0:c0.c1023
ラベルを取得します。id -Z
[tuser@ipa-client]$ id -Z staff_u:staff_r:staff_t:s0-s0:c0.c1023
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第27章 Red Hat Gluster Storage リンクのコピーリンクがクリップボードにコピーされました!
27.1. Red Hat Gluster Storage および SELinux リンクのコピーリンクがクリップボードにコピーされました!
glusterd
(GlusterFS 管理サービス) プロセスおよび glusterfsd
(NFS サーバー) プロセスに柔軟な必須アクセス制御を提供することで、追加のセキュリティー層として機能します。このようなプロセスでは、glusterd_t
SELinux の種類に制限されずに、高度なプロセスの分離が行われています。
27.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
プロセスのタイプ
glusterd_t
- Gluster プロセスは、
glusterd_t
SELinux のタイプに関連付けられています。
実行ファイルのタイプ
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
- このタイプは、
glusterd
設定データに関連付けられます。通常、/etc
ディレクトリーに保存されます。 glusterd_log_t
- このタイプのファイルは、
glusterd
ログデータとして扱われ、通常は/var/log/
ディレクトリーに保存されます。 glusterd_tmp_t
- このタイプは、
glusterd
一時ファイルを/tmp
ディレクトリーに保存するために使用されます。 glusterd_var_lib_t
- このタイプを使用すると、
glusterd
ファイルを/var/lib/
ディレクトリーに保存できます。 glusterd_var_run_t
- このタイプでは、
/run/
ディレクトリーまたは/var/run/
ディレクトリーにglusterd
ファイルを保存できます。
27.3. ブール値 リンクのコピーリンクがクリップボードにコピーされました!
gluster_export_all_ro
- ブール値を有効にすると、
glusterfsd
はファイルとディレクトリーを読み取り専用として共有できます。このブール値は、デフォルトでは無効になっています。 gluster_export_all_rw
- ブール値を有効にすると、
glusterfsd
は読み取りアクセスと書き込みアクセスでファイルとディレクトリーを共有できるようになります。このブール値はデフォルトで有効になっています。 gluster_anon_write
- ブール値を有効にすると、
glusterfsd
は、public_content_rw_t
SELinux タイプでラベル付けされた公開ファイルを変更できます。
getsebool -a | grep service_name
~]$ getsebool -a | grep service_name
sepolicy booleans -b boolean_name
~]$ sepolicy booleans -b boolean_name
sepolicy
ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要であることに注意してください。
27.4. 設定の例 リンクのコピーリンクがクリップボードにコピーされました!
27.4.1. Gluster ブリックのラベル付け リンクのコピーリンクがクリップボードにコピーされました!
glusterd_brick_t
により、SELinux は特定のファイルアクセス操作を拒否し、さまざまな AVC メッセージを生成します。
/dev/rhgs/gluster
など) を作成し、フォーマットし、Gluster ブリックとして使用することを前提としています。
手順27.1 Gluster ブリックにラベルを付ける方法
- 以前にフォーマットされた論理ボリュームをマウントするディレクトリーを作成します。以下に例を示します。
mkdir /mnt/brick1
~]# mkdir /mnt/brick1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 論理ボリューム (この場合は
/dev/vg-group/gluster
) を、前の手順で作成した/mnt/brick1/
ディレクトリーにマウントします。mount /dev/vg-group/gluster /mnt/brick1/
~]# mount /dev/vg-group/gluster /mnt/brick1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mount コマンドはデバイスを一時的にマウントすることに注意してください。デバイスを永続的にマウントするには、以下のようなエントリーを/etc/fstab
ファイルに追加します。/dev/vg-group/gluster /mnt/brick1 xfs rw,inode64,noatime,nouuid 1 2
/dev/vg-group/gluster /mnt/brick1 xfs rw,inode64,noatime,nouuid 1 2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 詳細は、fstab(5) の man ページを参照してください。 /mnt/brick1/
の SELinux コンテキストを確認します。ls -lZd /mnt/brick1/
~]$ ls -lZd /mnt/brick1/ drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mnt/brick1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーには、unlabeled_t
SELinux タイプのラベルが付けられます。/mnt/brick1/
の SELinux タイプを、glusterd_brick_t
SELinux タイプに変更します。semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"
~]# semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
restorecon
ユーティリティーを使用して変更を適用します。restorecon -Rv /mnt/brick1
~]# restorecon -Rv /mnt/brick1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 最後に、コンテキストが正常に変更されたことを確認します。
ls -lZd /mnt/brick1
~]$ ls -lZd /mnt/brick1 drwxr-xr-x. root root system_u:object_r:glusterd_brick_t:s0 /mnt/brick1/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第28章 参考資料 リンクのコピーリンクがクリップボードにコピーされました!
書籍
- SELinux by Example
- Mayer, MacMillan, and CaplanPrentice Hall, 2007
- SELinux: NSA's Open Source Security Enhanced Linux
- Bill McCartyO'Reilly Media Inc., 2004
チュートリアルおよびヘルプ
- Russell Coker のチュートリアルと講演
- Dan Walsh のジャーナル
- Red Hat ナレッジベース
メーリングリスト
- Fedora SELinux メーリングリスト
コミュニティー
- SELinux Project Wiki
- SELinux コミュニティーページ
- IRC
- irc.freenode.net, #selinux
付録A 更新履歴 リンクのコピーリンクがクリップボードにコピーされました!
改訂履歴 | |||
---|---|---|---|
改訂 0.3-06 | Fri Aug 9 2019 | ||
| |||
改訂 0.3-05 | Sat Oct 20 2018 | ||
| |||
改訂 0.3-03 | Tue Apr 3 2018 | ||
| |||
改訂 0.3-01 | Thu Jul 13 2017 | ||
| |||
改訂 0.2-18 | Wed Nov 2 2016 | ||
| |||
改訂 0.2-11 | Sun Jun 26 2016 | ||
| |||
改訂 0.2-10 | Sun Feb 14 2016 | ||
| |||
改訂 0.2-9 | Thu Dec 10 2015 | ||
| |||
改訂 0.2-8 | Thu Nov 11 2015 | ||
| |||
改訂 0.2-7 | Thu Aug 13 2015 | ||
| |||
改訂 0.2-6 | Wed Feb 18 2015 | ||
| |||
改訂 0.2-5 | Fri Dec 05 2014 | ||
| |||
改訂 0.2-4 | Thu Dec 04 2014 | ||
| |||
改訂 0.1-41 | Tue May 20 2014 | ||
| |||
改訂 0.1-1 | Tue Jan 17 2013 | ||
|