Menu Close

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

SELinux ユーザーおよび管理者のガイド

Red Hat Enterprise Linux 7

SELinux (Security-Enhanced Linux) の基本設定および高度な設定

概要

本書は、以下の 2 つの部分で構成されます。SELinuxおよび Confined Services の管理前者は、SELinux が機能する基本および原則を説明します。後者は、さまざまなサービスを設定および構成する実用的なタスクに焦点を当てています。

パート I. SELinux

本書では、Security Enhanced Linux(SELinux)機能の基本と原則を説明します。

第1章 はじめに

Security Enhanced Linux (SELinux) は、新たにシステムセキュリティーの層を提供します。SELinux は、基本的に次の質問に答えます。"may <subject> do <action> to <object>","may a web server access files in users' home directory?".
ユーザー、グループ、およびその他の権限(Discretionary Access Control)に基づく標準アクセスポリシーは、システム管理者が、包括的で詳細なセキュリティーポリシー(たとえば、特定のアプリケーションをログファイルの表示だけに制限したりするなど)を作成しません。他のアプリケーションがログファイルに新しいデータを追加できるようにします。
SELinux は、Mandatory Access Control (MAC) を実装しています。すべてのプロセスおよびシステムリソースには、SELinux コンテキスト と呼ばれる特別なセキュリティーラベルがあります。SELinux コンテキストは、SELinux ラベル と呼ばれることもあります。これは、システムレベルの詳細を抽象化し、エンティティーのセキュリティープロパティーにフォーカスする識別子です。これにより、SELinux ポリシーでオブジェクトを参照する方法に一貫性が保たれませんが、他の識別方法にある曖昧さがなくなりました。たとえば、ファイルにはバインドマウントを使用するシステムで複数の有効なパス名を指定できます。
SELinux ポリシーは、プロセスが、互いに、またはさまざまなシステムリソースと相互作用する方法を定義する一連のルールにこのコンテキストを使用します。デフォルトでは、最初にルールが明示的にアクセスを許可し、その後ポリシーが任意の対話を許可します。
注記
SELinux ポリシールールが DAC ルールの後に確認されていることを覚えておくことが重要です。DAC ルールがアクセスを拒否すると、SELinux ポリシールールは使用されません。これは、従来の DAC ルールがそのアクセスを拒否すると、SELinux 拒否がログに記録されないということを示しています。
SELinux コンテキストには、複数のフィールド (ユーザー、ロール、タイプ、セキュリティーレベル) があります。プロセスとシステムリソースとの間で許可される相互作用を定義する最も一般的なポリシールールは、完全な SELinux コンテキストではなく、SELinux タイプを使用するため、SELinux ポリシーでは、SELinux のタイプ情報がおそらく最も重要です。SELinux のタイプは通常 with _t で終わります。たとえば、Web サーバーのタイプ名は httpd_t です。/var/www/html/ にあるファイルおよびディレクトリーのタイプコンテキストは、通常 httpd_sys_content_t です。/tmp および /var/tmp/ にあるファイルおよびディレクトリーに対するタイプコンテクストは、通常 tmp_t です。Web サーバーポートのタイプコンテキストは http_port_t です。
たとえば、Apache( httpd_tとして実行する Web サーバープロセス)が、通常 /var/www/html/ にあるコンテキストを持つファイルおよびディレクトリー(httpd_sys_content_t)へのアクセスを許可するポリシールールがあります。通常、/tmp および /var/tmp/ に含まれるファイルのポリシーには、許可ルールがないため、アクセスは許可されません。SELinux を使用すれば、Apache が危険にさらされ、悪意のあるスクリプトがアクセスを得た場合でも、/tmp ディレクトリーにアクセスすることはできなくなります。

図1.1 SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスするのを許可し、httpd_t と mysqld_db_t タイプコンテキストに許可ルールがないため、同じプロセスが /data/mysql/ ディレクトリーにアクセスするのを拒否します。一方、mysqld_t として実行している MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスできます。また、SELinux は、mysqld_t タイプのプロセスが正しく拒否され、httpd_sys_content_t とラベルが付いた /var/www/html/ ディレクトリーにアクセスするのは拒否されます。

SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスするのを許可し、httpd_t と mysqld_db_t タイプコンテキストに許可ルールがないため、同じプロセスが /data/mysql/ ディレクトリーにアクセスするのを拒否します。一方、mysqld_t として実行している MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスできます。また、SELinux は、mysqld_t タイプのプロセスが正しく拒否され、httpd_sys_content_t とラベルが付いた /var/www/html/ ディレクトリーにアクセスするのは拒否されます。

関連情報

詳細は、以下のドキュメントを参照してください。

1.1. SELinux を実行する利点

SELinux は、次のような利点を提供します。
  • プロセスとファイルにはすべてラベルが付いています。SELinux ポリシーにより、プロセスがファイルと相互作用する方法と、プロセスが互いに相互作用する方法が定義されます。アクセスは、それを特別に許可する SELinux ポリシールールが存在する場合に限り許可されます。
  • アクセス制御がより詳細に設定できるようになりました。SELinux のアクセスは、ユーザーの裁量と、Linux のユーザー ID およびグループ ID に基づいて制御される従来の UNIX アクセス権だけでなく、SELinux のユーザー、ロール、タイプなど (必要に応じてセキュリティーレベルも) の、入手可能なすべての情報に基づいて決定されます。
  • SELinux ポリシーは管理者が定義し、システム全体に適用されます。
  • 権限昇格攻撃に対する軽減策が向上しました。プロセスはドメインで実行するため、互いに分離しています。SELinux ポリシールールは、プロセスがどのようにファイルやその他のプロセスにアクセスするかを定義します。プロセスへのアクセスが不正に行われても、攻撃者は、そのプロセスの通常の機能と、そのプロセスがアクセスするように設定されているファイルにしかアクセスできません。たとえば、Apache HTTP Server へのアクセスが不正に行われても、そのアクセスを許可する特別な SELinux ポリシールールが追加されたり、設定された場合を除き、ユーザーのホームディレクトリーにあるファイルを読み込むプロセスを攻撃者が利用することはできません。
  • SELinux は、データの機密性と完全性、並びに信頼されていない入力からの保護プロセスを強化するのに使用できます。
ただし、SELinux は以下の機能とは異なります。
  • ウイルス対策ソフトウェア
  • パスワード、ファイアウォールなどのセキュリティーシステムの代替
  • 一体型のセキュリティーソリューション
SELinux は、既存のセキュリティーソリューションを強化するために作られており、代わりに使用されるものではありません。SELinux を実行している場合でも、ソフトウェアを最新の状態に維持する、推測が困難なパスワード、ファイアウォールを使用するなど、適切なセキュリティー対策を続けることが重要です。

1.2. 例

以下の例は、SELinux がどのようにセキュリティーを向上するかを説明します。
  • デフォルトのアクションは「拒否」です。アクセスを許可する SELinux のポリシールール (ファイルを開くプロセスなど) が存在しない場合は、アクセスが拒否されます。
  • SELinux は、Linux ユーザーに制限をかけられます。SELinux ポリシーには、制限がかけられた SELinux ユーザーが多数含まれます。Linux ユーザーを、制限がかけられた SELinux ユーザーにマッピングして、SELinux ユーザーに適用されているセキュリティールールおよびメカニズムを利用できます。たとえば、Linux ユーザーを SELinux の user_u ユーザーにマッピングすると、Linux ユーザーは(設定されていない場合) sudosu などのユーザー ID(setuid)アプリケーションを実行できません。詳細は、「制限のあるユーザーおよび制限のないユーザー」 を参照してください。
  • プロセスとデータの分離が向上します。プロセスは、独自のドメインで実行され、他のプロセスで使用されるファイルにアクセスしないようにするだけでなく、プロセスが他のプロセスにアクセスできなくなります。たとえば、SELinux を実行している場合に、(許可が設定されていない限り) 攻撃者は Samba サーバーを危険にさらすことはできず、その Samba サーバーを攻撃ベクトルとして使用して、その他のプロセス (MariaDB など) が使用するファイルの読み書きを行うことはできません。
  • SELinux は、設定ミスによるダメージを軽減します。Domain Name System (DNS) サーバーはゾーン転送として知られている機能で、互いに頻繁に情報を複製します。攻撃者は、ゾーン転送を使用して、虚偽の情報で DNS サーバーを更新できます。Red Hat Enterprise Linux で Berkeley Internet Name Domain(BIND)を DNS サーバーとして実行すると、ゾーン転送を実行できるサーバーを管理者が制限しても、デフォルトの SELinux ポリシーによりゾーンファイルが阻止されます。 [1] BIND named デーモン自体、およびその他のプロセスにより、ゾーン転送を使用して更新済みです。
  • NetworkWorld.com のアーティクル「 A seatbelt for server software」を参照してください。SELinux は、実際の不正使用をブロックします。[2]SELinux に関する背景情報、および SELinux が阻止したさまざまなエクスプロイトに関する情報は、を参照してください。


[1] DNS サーバーで使用される IP アドレスマッピングへのホスト名などの情報が含まれるテキストファイル。
[2] Marti, Don"A seatbelt for server software:SELinux は、実際の不正使用をブロックします。2008 年 2 月 24 日が公開されました。2009 年 8 月 27 日: http://www.networkworld.com/article/2283723/lan-wan/a-seatbelt-for-server-software--selinux-blocks-real-world-exploits.html

1.3. SELinux Architecture

SELinux は、Linux カーネルに組み込まれる Linux セキュリティーモジュール (LSM) です。カーネルの SELinux サブシステムは、管理者が制御し、システムの起動時に読み込まれるセキュリティーポリシーにより動作します。システムにおけるセキュリティー関連の、カーネルレベルのアクセス操作はすべて SELinux により傍受され、読み込んだセキュリティーポリシーのコンテキストに従って検討されます。読み込んだポリシーが操作を許可すると、その操作は継続します。許可しないと、その操作はブロックされ、プロセスがエラーを受け取ります。
アクセスの許可、拒否などの SELinux の結果はキャッシュされます。このキャッシュは、アクセスベクトルキャッシュ (AVC) として知られています。このように結果がキャッシュされると、確認が必要な量が減るため、SELinux ポリシーのパフォーマンスが向上します。DAC ルールがアクセスを拒否した場合は、SELinux ポリシールールが適用されないことに注意してください。

1.4. SELinux のステータスおよびモード

SELinux は、disable、Permissive、または enforcing のいずれかで実行できます。
Disabled モードを使用することは推奨されません。システムは、SELinux ポリシーの強制を回避するだけでなく、ファイルなどの任意の永続オブジェクトにラベルを付けなくなり、将来的に SELinux を有効にすることが難しくなります。
Permissive モードでは、システムは、SELinux が読み込んだセキュリティーポリシーを実行しているかのように動作します。これには、オブジェクトのラベル付けや、アクセスを拒否したエントリーをログに出力するなどの動作が含まれますが、いずれの操作も拒否される訳ではありません。Permissive モードは、実稼働システムでは推奨されていませんが、SELinux ポリシーの開発には役に立ちます。
Enforcing モードは、デフォルトのモードで、推奨される動作モードです。SELinux は、Enforcing モードでは正常に動作し、読み込んだセキュリティーポリシーをシステム全体に強制します。
Enforcing モードと Permissive モードとの間を切り替えるには setenforce ユーティリティーを使用してください。setenforce で行った変更は、システムを再起動すると元に戻ります。Enforcing モードに変更するには、Linux の root ユーザーで、setenforce 1 コマンドを実行します。Permissive モードに変更するには、setenforce 0 コマンドを実行します。getenforce ユーティリティーを使用して、現在の SELinux モードを表示します。
~]# getenforce
Enforcing
~]# setenforce 0
~]# getenforce
Permissive
~]# setenforce 1
~]# getenforce
Enforcing
Red Hat Enterprise Linux では、システムが Enforcing モードで実行中に個々のドメインを Permissive モードに設定できます。たとえば、httpd_t ドメインを Permissive に設定するには、以下のコマンドを実行します。
~]# semanage permissive -a httpd_t
詳細は、「Permissive ドメイン」 を参照してください。
注記
永続的な状態およびモードの変更は、「SELinux の状態およびモードの永続的な変更」 で説明されています。

1.5. 関連情報

Red Hat Identity Management(IdM)は、SELinux ユーザーマップを定義する集中ソリューションを提供します。詳細は、『 Linux ドメイン ID、認証、およびポリシーガイド』の「SELinux ユーザーマップの定義」を参照してください

第2章 SELinux Contexts

プロセスとファイルには、SELinux ユーザー、ロール、タイプ、オプションでレベルなどの追加情報を含む SELinux コンテキストのラベルが付けられます。SELinux を実行する場合は、この情報すべてを使用してアクセス制御の決定を行います。Red Hat Enterprise Linux では、SELinux はロールベースアクセス制御(RBAC)、タイプ登録(TE)、およびオプションで Multi-Level Security(MLS)の組み合わせを提供します。
以下は、SELinux コンテキストを示す例です。SELinux コンテキストは、SELinux を実行する Linux オペレーティングシステムのプロセス、Linux ユーザー、およびファイルで使用されます。以下のコマンドを使用して、ファイルおよびディレクトリーの SELinux コンテキストを表示します。
~]$ ls -Z file1
-rwxrw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0      file1
SELinux コンテキストは、SELinux user:role:type:level 構文に従います。各フィールドは、以下のとおりです。
SELinux user
SELinux ユーザー ID は、特定のロールセットに承認されたポリシーと、特定の MLS/MCS 範囲に対して認識される ID です。各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーに置かれた制限を継承できます。マップされた SELinux ユーザー ID は、そのセッションのプロセスに対して SELinux コンテキストで使用されます。これは、どのロールとレベルを定義するためです。root で以下のコマンドを実行して、SELinux と Linux ユーザーアカウント間のマッピングの一覧を表示します( policycoreutils-python パッケージがインストールされている必要があります)。
~]# semanage login -l
Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
出力は、システムとは若干異なる可能性があります。
  • ログイン名 列には、Linux ユーザーが一覧表示されます。
  • SELinux User 列には、Linux ユーザーがマッピングされる SELinux ユーザーが一覧表示されます。プロセスの場合、SELinux ユーザーはどのロールおよびレベルにアクセスできるかを制限します。
  • MLS/MCS Range 列は、Multi-Level Security(MLS)および Multi-Category Security(MCS)で使用されるレベルです。
  • Service 列は、Linux ユーザーがシステムにログインする必要のある正しい SELinux コンテキストを決定します。デフォルトでは、アスタリスク(*)記号が使用されます。これは、すべてのサービスを表します。
role
SELinux の一部は、RBAC(Role-Based Access Control)セキュリティーモデルです。ロールは RBAC の属性です。SELinux ユーザーはロールに対して承認され、ロールはドメインに対して承認されます。このロールは、ドメインと SELinux ユーザー間の中間役割を果たします。入力できるロールにより、どのドメインを入力できるかを決定します。最終的には、どのオブジェクトタイプにアクセスできるかを制御します。これにより、権限昇格攻撃の脆弱性を軽減することができます。
type
タイプは Type Enforcement の属性です。タイプは、プロセスのドメインとファイルのタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
level
レベルは MLS および MCS の属性です。MLS 範囲は、レベルが異なる場合に 低レベルの高レベルとして記述されたレベル のペア、またはレベルが 同じ場合は低いレベル です(s0-s0s0)と同じです。各レベルは機密性とカテゴリーのペアで、カテゴリーは任意です。カテゴリーがある場合は、レベルは 機密性:category-set として記述されます。カテゴリーがない場合は、機密性 として記述されます。
カテゴリーセットが連続したシリーズである場合は、省略できます。たとえば、c0.c3c0,c1,c2,c3 と同じです。/etc/selinux/targeted/setrans.conf ファイルは、レベル(s0:c0)を、人間が判読できる形式(CompanyConfidential)にマップします Red Hat Enterprise Linux では、ターゲットポリシーは MCS を強制します。MCS では、機密性が 1 つだけ s0 になります。Red Hat Enterprise Linux の MCS は、1024 つの異なるカテゴリー c0 から c1023 をサポートします。s0-s0:c0.c1023 は機密性 s0 で、すべてのカテゴリーに対して承認されます。
MLS は Bell-La Padula Mandatory Access Model を強制し、Labeled Security Protection Profile(LSPP)環境で使用されます。MLS の制限を使用するには、selinux-policy-mls パッケージをインストールして、MLS をデフォルトの SELinux ポリシーとして設定します。Red Hat Enterprise Linux に同梱される MLS ポリシーは、評価された設定の一部ではない多くのプログラムドメインを省略するため、デスクトップワークステーション上の MLS は使用できなくなります(X Window System はサポートされません)。ただし、アップストリームの SELinux Reference Policy からの MLS ポリシーは、すべてのプログラムドメインを含む構築できます。MLS 設定の詳細は、「Multi-Level Security (MLS)」 を参照してください。

2.1. ドメインの遷移

あるドメイン内のプロセスは、新しいドメイン のエントリーポイント タイプを持つアプリケーションを実行して、別のドメインに移行します。エントリーポイント パーミッションは、SELinux ポリシーで使用され、ドメインに入るために使用できるアプリケーションを制御します。ドメインの移行の例を以下に示します。

手順2.1 ドメイン移行の例

  1. パスワードを変更したいユーザーです。これには、passwd ユーティリティーを実行します。/usr/bin/passwd 実行可能ファイルには、passwd _exec_t タイプのラベルが付けられます。
    ~]$ ls -Z /usr/bin/passwd
    -rwsr-xr-x  root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
    
    passwd ユーティリティーは、shadow _t タイプのラベルが付けられた /etc/shadow にアクセスします。
    ~]$ ls -Z /etc/shadow
    -r--------. root root system_u:object_r:shadow_t:s0    /etc/shadow
    
  2. SELinux ポリシールールは、passwd_t ドメインで実行されているプロセスにより、shadow_t タイプのラベルが付いたファイルに読み取りおよび書き込みが許可されていることを示します。shadow_t タイプは、パスワードの変更に必要なファイルにのみ適用されます。これには、/etc/gshadow/etc/shadow、およびバックアップファイルが含まれます。
  3. SELinux ポリシールールは、passwd_t ドメインに、passwd_ exec_t タイプに エントリーポイント パーミッションが設定されていることを示しています。
  4. ユーザーが passwd ユーティリティーを実行すると、ユーザーのシェルプロセスは passwd_t ドメインに移行します。SELinux では、デフォルトのアクションは拒否を行い、passwd_t ドメインで実行しているアプリケーションを使用して、shadow _t タイプでラベルが付いたファイルにアクセスし、passwd アプリケーションが /etc/shadow にアクセスし、ユーザーのパスワードを更新できるルールが存在します。
この例は網羅的なものではなく、ドメイン移行を説明した基本的な例として使用されます。passwd_t ドメインで実行しているサブジェクトが shadow_t ファイルタイプでラベルが付けられたオブジェクトにアクセスできるようにする実際のルールがありますが、サブジェクトを新しいドメインに移行する前に、他の SELinux ポリシールールを満たしている必要があります。この例では、type Enforcement によって以下が確保されます。
  • passwd_t ドメインは、passwd_exec_t タイプのラベルが付いたアプリケーションを実行してのみ入力できます。lib _t タイプなどの承認された共有ライブラリーからのみ実行でき、他のアプリケーションを実行できません。
  • passwd_t などの承認されたドメインのみが、shadow_t タイプのラベルが付いたファイルに書き込みできます。他のプロセスがスーパーユーザー権限で実行されている場合でも、これらのプロセスは passwd _t ドメインで実行されていないため、shadow_t タイプのラベルが付いたファイルに書き込みできません。
  • 承認ドメインのみが passwd_t ドメインに移行できます。たとえば、sendmail _t ドメインで実行している sendmail プロセスには、passwd を実行する正当な理由がないため、passwd_t ドメインに移行することはできません
  • passwd_t ドメインで実行しているプロセスは、etc_t または shadow _t タイプのラベルが付いたファイルなど、承認されたタイプに対する読み取りおよび書き込みのみが可能です。これにより、passwd アプリケーションが任意のファイルの読み取りや書き込みを阻止します。

2.2. プロセス用の SELinux コンテキスト

ps -eZ コマンドを使用して、プロセスの SELinux コンテキストを表示します。以下は例になります。

手順2.2 passwd ユーティリティーの SELinux コンテキストの表示

  1. ApplicationsSystem Toolsターミナルなどのターミナルを開きます
  2. passwd ユーティリティーを実行します。新しいパスワードは入力しないでください。
    ~]$ passwd
    Changing password for user user_name.
    Changing password for user_name.
    (current) UNIX password:
    
  3. 新しいタブまたは他のターミナルを開き、以下のコマンドを入力します。出力は以下のようになります。
    ~]$ ps -eZ | grep passwd
    unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 13212 pts/1 00:00:00 passwd
    
  4. 最初のタブ/終了で Ctrl+C キーを押して passwd ユーティリティーを取り消します。
この例では、passwd ユーティリティー(passwd _exec_t タイプでラベル付け)を実行すると、ユーザーのシェルプロセスは passwd_t ドメインに移行します。このタイプは、プロセスのドメインとファイルの型を定義することに注意してください。
実行中のすべてのプロセスの SELinux コンテキストを表示するには、ps ユーティリティー を再度実行し ます。以下は出力の例を切り捨て、システムによって異なる可能性があることに注意してください。
]$ ps -eZ 
system_u:system_r:dhcpc_t:s0             1869 ?  00:00:00 dhclient
system_u:system_r:sshd_t:s0-s0:c0.c1023  1882 ?  00:00:00 sshd
system_u:system_r:gpm_t:s0               1964 ?  00:00:00 gpm
system_u:system_r:crond_t:s0-s0:c0.c1023 1973 ?  00:00:00 crond
system_u:system_r:kerneloops_t:s0        1983 ?  00:00:05 kerneloops
system_u:system_r:crond_t:s0-s0:c0.c1023 1991 ?  00:00:00 atd
system_r ロールは、デーモンなどのシステムプロセスに使用されます。Enforcement と入力してから、各ドメインを区切ります。

2.3. ユーザーの SELinux コンテキスト

以下のコマンドを使用して、Linux ユーザーに関連する SELinux コンテキストを表示します。
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Red Hat Enterprise Linux では、Linux ユーザーはデフォルトで制限なしで実行されます。この SELinux コンテキストは、Linux ユーザーが SELinux unconfined_u ユーザーにマッピングされ、unconfined_r ロールとして実行され、unconfined_t ドメインで実行されていることを示しています。s0-s0 は MLS 範囲で、この場合は s0 と同じです。ユーザーがアクセス可能なカテゴリーは c0.c1023 で定義され、すべてのカテゴリー(c 0 から c 1023 まで)になります

第3章 ターゲットポリシー

ターゲットポリシーは、Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーです。ターゲットポリシーを使用する場合、制限のあるドメインで実行されるターゲットに設定されたプロセス、および制限のないドメインで実行されるプロセス。たとえば、デフォルトでは、ログインしているユーザーは unconfined_t ドメインで実行され、init によって起動されたシステムプロセスは unconfined_service_t ドメインで実行されます。
実行可能および書き込み可能なメモリーチェックは、制限のあるドメインと制限のないドメインの両方に適用できます。ただし、デフォルトでは、制限のないドメインで実行されているサブジェクトは書き込み可能なメモリーを割り当て、これを実行できます。これらのメモリーチェックは、ブール値を設定して有効にすることができます。これにより、ランタイム時に SELinux ポリシーを変更できます。ブール値の設定については、後で説明します。

3.1. 制限のあるプロセス

sshdhttpd などのネットワークをリッスンするほとんどのサービスは、Red Hat Enterprise Linux で制限されます。また、root ユーザーとして実行され、passwd ユーティリティーなどのユーザーのタスクを実行するほとんどのプロセスは制限されます。プロセスが制限されると、httpd _t ドメインで実行している httpd プロセスなど、独自のドメインで実行されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。
以下の手順に従って、SELinux が有効で、システムが以下の例を実行する準備が整っていることを確認します。

手順3.1 SELinux ステータスの確認方法

  1. SELinux が有効で、Enforcing モードで実行されていること、およびターゲットポリシーが使用されていることを確認します。正しい出力は以下のようになります。
    ~]$ sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Max kernel policy version:      30
    SELinux モードの変更に関する詳細は、「SELinux の状態およびモードの永続的な変更」 を参照してください。
  2. root で、/var/www/html/ ディレクトリーにファイルを作成します。
    ~]# touch /var/www/html/testfile
  3. 以下のコマンドを入力して、新たに作成したファイルの SELinux コンテキストを表示します。
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
    
    デフォルトでは、Linux ユーザーは Red Hat Enterprise Linux で制限なしで実行されます。つまり、test file ファイルに SELinux unconfined_u user のラベルが付けられます。RBAC はファイルではなく、プロセスに使用されます。ロールにはファイルに対する意味がありません。object_r ロールは(永続ストレージおよびネットワークファイルシステム上)ファイルに使用される汎用ロールです。/proc ディレクトリー配下 で、プロセスに関連するファイルは system_r ロールを使用する場合があります。httpd_sys_content_t タイプを使用すると、httpd プロセスが このファイルにアクセスできるようになります。
以下の例は、SELinux が、Sambaが使用することを目的としたファイルなど、適切にラベル付けされていないファイルを読み込む方法を表しています。これは、実稼働環境で使用すべきではありません。httpd パッケージおよび wget パッケージがインストールされ、SELinux ターゲットポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。

手順3.2 機密プロセスの例

  1. root で httpd デーモンを起動します。
    ~]# systemctl start httpd.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
  2. Linux ユーザーに書き込みアクセスのあるディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
    ~]$ wget http://localhost/testfile
    --2009-11-06 17:43:01--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `testfile'
    
    [ <=>                              ] 0     --.-K/s   in 0s
    
    2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0]
    
  3. chcon コマンドはファイルの再ラベルです。ただし、このようなラベルの変更は、ファイルシステムの再ラベル付け時に保持されません。ファイルシステムの再ラベルを維持する永続的な変更には、semanage ユーティリティーを使用します。これについては、後で説明します。root で以下のコマンドを実行して、Samba が使用するタイプにタイプを変更します。
    ~]# chcon -t samba_share_t /var/www/html/testfile
    以下のコマンドを入力して変更を表示します。
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
    
  4. 現在の DAC パーミッションでは、httpd プロセスが testfile へのアクセスを許可していることに注意してください。ユーザーが書き込みアクセスを持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定に変更がない場合は、このコマンドは失敗します。
    ~]$ wget http://localhost/testfile
    --2009-11-06 14:11:23--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 403 Forbidden
    2009-11-06 14:11:23 ERROR 403: Forbidden.
    
  5. root で testfile を削除します。
    ~]# rm -i /var/www/html/testfile
  6. root で以下のコマンドを実行して、httpd を実行する必要がありません。
    ~]# systemctl stop httpd.service
この例では、SELinux が追加する追加のセキュリティーを示しています。DAC ルールでは、httpd プロセスが手順 2 の testfile へのアクセスを許可しましたが、httpd プロセスがアクセスできるタイプでファイルにラベルが付けられているため、SELinux が拒否されたアクセスを許可しました。
auditd デーモンを実行している場合は、以下のようなエラーが /var/log/audit/audit.log に記録されます。
type=AVC msg=audit(1220706212.937:70): avc:  denied  { getattr } for  pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0  tclass=file

type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
また、以下のようなエラーが /var/log/httpd/error_log に記録されます。
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied

3.2. 制限のないプロセス

制限のないプロセスは、制限のないドメインで実行されます。たとえば、unconfined _service_t ドメインで実行される init によって実行される制限のないサービス、kernel_t ドメインで実行されているカーネルによって実行される制限されていないサービス 制限のない Linux ユーザーが実行し、unconfined _t ドメインで実行しているなどの制限のない サービスなどです。制限のないプロセスの場合、SELinux ポリシールールが適用されますが、制限のないドメインで実行されているプロセスを許可するポリシールールが存在します。制限のないドメインで実行されているプロセスは、DAC ルールのみを使用するようにフォールバックします。制限のないプロセスが危険にさらされても、SELinux は、攻撃者がシステムリソースやデータにアクセスできなくなりますが、当然、DAC ルールは引き続き使用されます。SELinux は、DAC ルールに関するセキュリティー強化で、これらを置き換えません。
SELinux が有効で、システムが以下の例を実行する準備が整っていることを確認するには、手順3.1「SELinux ステータスの確認方法」 で説明されている 「制限のあるプロセス」 を実行します。
以下の例は、制限なしで稼働している場合に Samba が使用する Apache HTTP Server(httpd)が Samba が使用するデータにアクセスする方法を示しています。Red Hat Enterprise Linux では、httpd プロセスは、デフォルトで制限のある httpd_t ドメインで実行されることに注意してください。これは、実稼働環境で使用すべきではありません。httpdwget、dbus、および audit パッケージがインストールされ、SELinux ターゲットポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。

手順3.3 強制されていないプロセスの例

  1. chcon コマンドはファイルの再ラベルです。ただし、このようなラベルの変更は、ファイルシステムの再ラベル付け時に保持されません。ファイルシステムの再ラベルを維持する永続的な変更には、semanage ユーティリティーを使用します。これについては、後で説明します。root ユーザーとして以下のコマンドを入力し、タイプを Samba で使用されるタイプに変更します。
    ~]# chcon -t samba_share_t /var/www/html/testfile
    変更を表示します。
    ~]$ ls -Z /var/www/html/testfile
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
  2. 以下のコマンドを入力して、httpd プロセスが実行され ていないことを確認します。
    ~]$ systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    出力が異なる場合は、root で以下のコマンドを入力して httpd プロセスを停止します。
    ~]# systemctl stop httpd.service
  3. httpd プロセスを制限なしで実行するには、root で以下のコマンドを実行して、/usr/sbin/httpd ファイルのタイプを制限のあるドメインに移行しないタイプに変更します。
    ~]# chcon -t bin_t /usr/sbin/httpd
  4. /usr/sbin/httpdbin_t タイプのラベルが付けられていることを確認します。
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x. root root system_u:object_r:bin_t:s0       /usr/sbin/httpd
    
  5. root で httpd プロセスを起動して、正常に起動したことを確認します。
    ~]# systemctl start httpd.service
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: active (running) since Thu 2013-08-15 11:17:01 CEST; 5s ago
    
  6. 以下のコマンドを入力して、unconfined_service_t ドメインで実行している httpd を表示します。
    ~]$ ps -eZ | grep httpd
    system_u:system_r:unconfined_service_t:s0 11884 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11885 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11886 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11887 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11888 ? 00:00:00 httpd
    system_u:system_r:unconfined_service_t:s0 11889 ? 00:00:00 httpd
    
  7. Linux ユーザーに書き込みアクセスのあるディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
    ~]$ wget http://localhost/testfile
    --2009-05-07 01:41:10--  http://localhost/testfile
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `testfile'
    
    [ <=>                            ]--.-K/s   in 0s
    
    2009-05-07 01:41:10 (0.00 B/s) - `testfile' saved [0/0]
    httpd プロセスには samba_share_t タイプのラベルが付いたファイルにアクセスできませんが、httpd 制限のない unconfined_service_t ドメインで実行され、DAC ルールの使用にフォールバックします。そのため、wget コマンドは成功します。制限のある httpd _t ドメインで httpd が実行されましたが、wget コマンドは失敗していました。
  8. restorecon ユーティリティーは、ファイルのデフォルト SELinux コンテキストを復元します。root で以下のコマンドを実行して、/usr/sbin/httpd のデフォルトの SELinux コンテキストを復元します。
    ~]# restorecon -v /usr/sbin/httpd
    restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0
    
    /usr/sbin/httpd に、httpd_exec_t タイプのラベルが付けられていることを確認します。
    ~]$ ls -Z /usr/sbin/httpd
    -rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
  9. root で次のコマンドを実行して httpd を再起動します。再起動したら、httpd が制限のある httpd _t ドメインで実行されていることを確認します。
    ~]# systemctl restart httpd.service
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    8883 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8884 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8885 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8886 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8887 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8888 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    8889 ?        00:00:00 httpd
    
  10. root で testfile を削除します。
    ~]# rm -i /var/www/html/testfile
    rm: remove regular empty file `/var/www/html/testfile'? y
    
  11. httpd の実行が必要ない場合は、root で次のコマンドを実行して、httpd を停止します
    ~]# systemctl stop httpd.service
このセクションの例では、侵害された制限のあるプロセス(SELinux で保護)からデータを保護する方法と、(SELinux で保護されない)危険にさらされたプロセスから、攻撃者にアクセスしやすくなるか(SELinux による保護)を説明します。

3.3. 制限のあるユーザーおよび制限のないユーザー

各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できます。この Linux ユーザーマッピングは、root で semanage login -l コマンドを実行して表示されます。
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Red Hat Enterprise Linux では、Linux ユーザーは、デフォルトで SELinux __default__ login にマッピングされ、SELinux unconfined_u ユーザーにマッピングされます。以下の行は、デフォルトのマッピングを定義します。
__default__               unconfined_u              s0-s0:c0.c1023
以下の手順では、新しい Linux ユーザーをシステムに追加する方法と、そのユーザーを SELinux unconfined_u ユーザーにマップする方法を説明します。Red Hat Enterprise Linux では、デフォルトで root ユーザーが制限なしで実行されていることを前提としています。

手順3.4 新しい Linux ユーザーの SELinux unconfined_u ユーザーへのマッピング

  1. root で以下のコマンドを実行して、new user という名前の新規 Linux ユーザーを作成します。
    ~]# useradd newuser
  2. Linux newuser ユーザーにパスワードを割り当てます。root で以下のコマンドを実行します。
    ~]# passwd newuser
    Changing password for user newuser.
    New UNIX password: Enter a password
    Retype new UNIX password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
  3. 現在のセッションからログアウトし、Linux newuser ユーザーとしてログインします。ログインすると、PAM モジュール pam_selinux は Linux ユーザーを SELinux ユーザー (この場合は unconfined_u) に自動的にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを入力して、Linux ユーザーのコンテキストを表示します。
    [newuser@localhost ~]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    
    注記
    システムに newuser ユーザーが必要なくなった場合 は、Linux newuser 's session からログアウトし、アカウントでログインし、root で userdel -r newuser コマンドを実行します。新しいユーザーとその ホームディレクトリーを削除します。
制限のある Linux ユーザー、および制限のない Linux ユーザーは、実行可能なメモリーチェックおよび書き込み可能なメモリーチェックに依存し、また MCS または MLS によっても制限されます。
利用可能な SELinux ユーザーを一覧表示するには、以下のコマンドを実行します。
~]$seinfo -u
Users: 8
   sysadm_u
   system_u
   xguest_u
   root
   guest_u
   staff_u
   user_u
   unconfined_u
seinfo コマンドは、setools-console パッケージにより提供されることに注意してください。デフォルトではインストールされません。
unconfined_t ドメインから自身の制限のあるドメインに移行できるものとして SELinux ポリシーが定義するアプリケーションを実行すると、制限のない Linux ユーザーは制限のあるドメインの制限を受けます。このセキュリティー上の利点は、Linux ユーザーが制限なしで実行している場合でも、アプリケーションは制限されたままになります。したがって、アプリケーションにおける不具合の悪用はポリシーによって制限できます。
同様に、これらのチェックを制限のあるユーザーに適用できます。制限のある各 Linux ユーザーは、制限のあるユーザードメインによって制限されます。SELinux ポリシーは、制限のあるユーザードメインから自身のターゲット制限のあるドメインへの移行を定義することもできます。このような場合、制限のある Linux ユーザーは、そのターゲットの制限のあるドメインの制限を受けます。主な点として、特別な権限は、ロールに応じて制限のあるユーザーに関連付けられる点が挙げられます。以下の表では、Red Hat Enterprise Linux における Linux ユーザーの基本的な制限のあるドメインの例を確認できます。

表3.1 SELinux ユーザー機能

User ロール ドメイン X Window System su または sudo ホームディレクトリーおよび /tmp (デフォルト) での実行 ネットワーク
sysadm_u sysadm_r sysadm_t はい su および sudo はい はい
staff_u staff_r staff_t はい sudo のみ はい はい
user_u user_r user_t はい いいえ はい はい
guest_u guest_r guest_t いいえ いいえ はい いいえ
xguest_u xguest_r xguest_t はい いいえ はい Firefox のみ
  • user_t ドメイン、guest_t ドメイン、および xguest_t ドメイン内の Linux ユーザーは、SELinux ポリシーが許可した場合 (passwd など)、設定したユーザー ID (setuid) アプリケーションのみを実行できます。これらのユーザーは、su および sudo setuid アプリケーションを実行できないため、これらのアプリケーションを使用して root にすることはできません。
  • sysadm_t ドメイン、staff_t ドメイン、user_t ドメイン、および xguest_t ドメインの Linux ユーザーは、X Window System およびターミナルを使用してログインできます。
  • デフォルトでは、staff_t ドメイン、user_t ドメイン、guest_t ドメイン、および xguest_t ドメインの Linux ユーザーは、ホームディレクトリーと /tmp でアプリケーションを実行できます。ユーザーのパーミッションを継承するアプリケーションの実行を防ぐには、guest_exec_content および xguest_exec_contentブール値を off に設定します。これにより、不具合のあるアプリケーションや悪意のあるアプリケーションがユーザーのファイルを変更できなくなります。
    ユーザーがホームディレクトリーおよび /tmp でアプリケーションの実行を許可および禁止する方法については、「ユーザー実行アプリケーションのブール値」 を参照してください。
  • xguest_t ドメインの Linux ユーザーにアクセスできる唯一のネットワークアクセスは、Web ページに接続する Firefox です。
system_u は、システムプロセスおよびオブジェクトに対する特別なユーザー ID であることに注意してください。Linux ユーザーに関連付けることはできません。また、unconfined_u および root は制限のないユーザーです。このような理由から、上記の SELinux ユーザー機能の表は含まれません。
上記の SELinux ユーザーとともに、これらのユーザーにマップできる特別なロールがあります。これらのロールは、SELinux でユーザーに許可するものを決定します。
  • webadm_r は、Apache HTTP Server に関連する SELinux タイプの処理のみが可能です。詳細は、「types」 を参照してください。
  • dm_r は、MariaDB データベースおよび PostgreSQL データベース管理システムに関連する SELinux タイプの処理のみが可能です。詳細は、「types」 および 「types」 を参照してください。
  • logadm_r は、syslog および auditlog プロセスに関連する SELinux タイプの処理のみが可能です。
  • secadm_r は SELinux の処理のみが可能です。
  • auditadm_r は、監査 サブシステムに関連するプロセスのみを管理できます。
利用可能なロールの一覧を表示するには、以下のコマンドを実行します。
~]$ seinfo -r
前述のように、se info コマンドは setools-console パッケージにより提供され、デフォルトではインストールされません。

3.3.1. sudo の移行および SELinux ロール

場合によっては、制限のあるユーザーは、root 権限を必要とする管理タスクを実行する必要があります。これを実行するには、このような制限のあるユーザーは、sudo コマンドを使用して、制限のある管理者 SELinux ロールを取得する必要があります。sudo コマンドは、信頼できるユーザーに管理アクセスを付与するために使用されます。ユーザーが管理コマンドの前に sudo を付けると独自の パスワードが要求されます。ユーザーが認証され、コマンドが許可されると、管理コマンドは root 権限で実行されているかのように実行されます。
表3.1「SELinux ユーザー機能」 で示されているように、SELinux の制限のあるユーザーである staff _u および sysadm_u のみが、デフォルトで sudo を使用できます。このようなユーザーが sudo でコマンドを実行する場合は、/etc/sudoers 設定ファイルで指定されたルール、または /etc/sudoers .d/ ディレクトリーの各ファイルで、そのファイルが存在する場合は、そのロールを変更できます。

手順3.5 sudo 遷移の設定

この手順では、新規作成した SELinux_user_u の制限のあるユーザーを default_ role_t から administrator_ r 管理者ロールに移行するように sudo を設定する方法を説明します。既存の SELinux ユーザーに制限のある管理者ロールを設定するには、最初の 2 つの手順を省略します。また、以下のコマンドを root ユーザーで実行する必要があることに注意してください。default_role_t や administrator_ r など、以下の手順のプレースホルダーをさらに理解するには、ステップ 6 の例を参照してください。
  1. 新しい SELinux ユーザーを作成して、デフォルトの SELinux ロールと、このユーザーの補助制限のある管理者ロールを指定します。
    ~]# semanage user -a -r s0-s0:c0.c1023 -R "default_role_r administrator_r" SELinux_user_u
  2. デフォルトの SElinux ポリシーコンテキストファイルを設定します。たとえば、SELinux ユーザー staff_u と同じ SELinux ルールを設定するには、staff_u コンテキストファイルをコピーします。
    ~]# cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/SELinux_user_u
  3. 新たに作成した SELinux ユーザーを既存の Linux ユーザーにマッピングします。
    semanage login -a -s SELinux_user_u -rs0:c0.c1023 linux_user
  4. /etc/sudoers.d/ ディレクトリーに Linux ユーザーと同じ名前の新規設定ファイルを作成し、以下の文字列を追加します。
    ~]# echo "linux_user ALL=(ALL) TYPE=administrator_t ROLE=administrator_r /bin/sh " > /etc/sudoers.d/linux_user
  5. restorecon ユーティリティーを使用して、linux_user ホームディレクトリーの再ラベル付けを行います。
    ~]# restorecon -FR -v /home/linux_user
  6. 新たに作成した Linux ユーザーとしてシステムにログインすると、ユーザーにデフォルトの SELinux ロールにラベルが付けられます。
    ~]$ id -Z
    SELinux_user_u:default_role_r:SELinux_user_t:s0:c0.c1023
    sudo の実行後に、/etc/sudoers.d/linux_user で指定した、補助 SELinux ロールにユーザーの SELinux コンテキストが変更されます。sudo で使用する -i オプションは、インタラクティブシェルが実行されていました。
    ~]$ sudo -i
    ~]# id -Z
    SELinux_user_u:administrator_r:administrator_t:s0-s0:c0.c1023
    最初のステップで指定された例からの SELinux_user_u ユーザーの場合、出力は以下のようになります。
    ~]$ id -Z
    confined_u:staff_r:staff_t:s0:c0.c1023
    ~]$ sudo -i
    ~]# id -Z
    confined_u:webadm_r:webadm_t:s0:c0.c1023
    この例では、デフォルトの割り当てられたロール staff_r で、新しい SELinux ユーザー confined_u を作成し、sudo が、staff_ u のロールを staff_ r から webadm_r に変更するよう設定します。
    ~]# semanage user -a -r s0-s0:c0.c1023 -R "staff_r webadm_r" confined_u
    ~]# cp /etc/selinux/targeted/contexts/users/staff_u /etc/selinux/targeted/contexts/users/confined_u
    ~]# semanage login -a -s confined_u -rs0:c0.c1023 linux_user
    ~]# restorecon -FR -v /home/linux_user
    ~]# echo "linux_user ALL=(ALL) TYPE=webadm_t ROLE=webadm_r /bin/sh " > /etc/sudoers.d/linux_user
    新たに作成した Linux ユーザーとしてシステムにログインすると、ユーザーにデフォルトの SELinux ロールにラベルが付けられます。
    ~]$ id -Z
    confined_u:staff_r:staff_t:s0:c0.c1023
    ~]$ sudo -i
    ~]# id -Z
    confined_u:webadm_r:webadm_t:s0:c0.c1023

第4章 SELinux の使用

次のセクションでは、Red Hat Enterprise Linux の主要 SELinux パッケージの概要と、使用するログファイルのインストールおよび更新、メインの SELinux 設定ファイル、SELinux モード、SELinux モードの設定、ブール値の設定、ファイルラベルの永続的な変更、mount コマンドでのファイルシステムラベルの指定、NFS ボリュームのマウント、ファイルおよびアーカイブ時の SELinux コンテキストの保存方法の概要を説明します。

4.1. SELinux Packages

Red Hat Enterprise Linux のフルインストールでは、インストール時に手動で除外しない限り、SELinux パッケージがデフォルトでインストールされます。テキストモードで最小限のインストールを実行する場合は、policycoreutils-python および policycoreutils-gui パッケージはデフォルトでインストールされません。また、デフォルトでは SELinux が Enforcing モードで実行され、SELinux ターゲットポリシーが使用されます。デフォルトでは、以下の SELinux パッケージがシステムにインストールされている。
  • policycoreutils は、SELinux の操作および管理に restorecon、seconsetfilessemodule、load_policy setsemodule などのユーティリティーを提供します。
  • selinux-policy は、基本的なディレクトリー構造、selinux-policy.conf ファイル、RPM マクロを を提供します。
  • selinux-policy-targeted は、SELinux ターゲットポリシーを提供します。
  • libselinux: SELinux アプリケーションの API を提供します。
  • libselinux-utils は、a vcstatgetenforcegetseboolmatch pathcon、selinuxconlistselinuxdefconselinuxenabled ユーティリティー、および setenforce ユーティリティーを提供します。
  • libselinux-python は、SELinux アプリケーションを開発するための Python バインディングを提供します。
以下のパッケージはデフォルトでインストールされませんが、オプションで yum install <package-name> コマンドを実行してインストールできます。
  • selinux-policy-devel は、カスタムの SELinux ポリシーおよびポリシーモジュールを作成するためのユーティリティーを提供します。
  • selinux-policy-doc は、さまざまなサービスで SELinux の完全な設定方法を説明する man ページを提供します。
  • selinux-policy-mls は、MLS(Multi-Level Security)SELinux ポリシーを提供します。
  • setroubleshoot-server は、SELinux がアクセスが拒否されたときに生成された拒否メッセージを変換し、その中にも sealert ユーティリティーで表示できる詳細の説明になります。
  • setools-console は、Tre sys Technology SETools ディストリビューション、ポリシーの分析およびクエリーを行うためのユーティリティーおよびライブラリー、監査ログの監視およびレポート、およびファイルコンテキスト管理を提供します。 setools パッケージは、SETools のメタパッケージです。setools-gui パッケージは、apol ユーティリティーおよび seaudit ユーティリティーを提供します。setools-console パッケージは、sechecker ユーティリティー、sediffseinfo、sesearch、 および findcon コマンドラインユーティリティーを提供します。これらのユーティリティーの詳細は、Tresys Technology SETools ページを参照してください。setools および setools-gui パッケージは、Red Hat Network Optional チャンネルが有効にされている場合にのみ使用できることに注意してください。詳細は「 対象範囲の詳細 」を参照してください。
  • mcstrans translates(s 0-s0:c0.c1023 など)を、System Low-SystemHigh などの読みやすいフォームに変換します。
  • policycoreutils-python は、SELinux を操作および管理するために semanageaudit2allow、audit2why、ch cat などのユーティリティーを提供します。
  • policycoreutils-gui は、SELinux を管理するためのグラフィカルユーティリティーである system-config-selinux を提供します。

4.2. 使用されているログファイル

Red Hat Enterprise Linux では、dbus パッケージおよび audit パッケージが、デフォルトのパッケージ選択から削除されていない限り、デフォルトでインストールされています。yum install setroubleshoot-server は、Yum を使用してインストールする必要があります( yum install setroubleshoot-server コマンドを使用します)。
auditd デーモンが実行している 場合は、以下のような SELinux 拒否メッセージが、デフォルトで /var/log/audit/audit.log に書き込まれます。
type=AVC msg=audit(1223024155.684:49): avc:  denied  { getattr } for  pid=2000 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=399185 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:samba_share_t:s0 tclass=file
さらに、以下のようなメッセージが /var/log/message ファイルに書き込まれます。
May 7 18:55:56 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l de7e30d6-5488-466d-a606-92c9f40d316d
Red Hat Enterprise Linux 7 では、setroubleshootd は、常にサービスとして実行されなくなりました。ただし、引き続き AVC メッセージの分析に使用されます。2 つの新しいプログラムが、必要に応じて setroubleshoot を開始する方法として機能します。
  • sedispatch ユーティリティーは、audit サブシステムの一部として実行されます。AVC 拒否メッセージが返されると、se dispatchdbus を使用してメッセージを送信します。これらのメッセージは、すでに実行中の場合は、setroubleshootd と似ています。稼働していない場合、se dispatch はそれ を自動的に開始します。
  • seapplet ユーティリティーは、setroubleshootd の dbus メッセージを待機しているシステムツールバーで実行します。通知バブルが起動し、ユーザーは AVC メッセージをレビューできるようになりました。

手順4.1 デーモンの自動起動

  1. auditd デーモンおよび rsyslog デーモンがシステムの起動時に自動的に起動するように設定するには、root ユーザーで以下のコマンドを入力します。
    ~]# systemctl enable auditd.service
    ~]# systemctl enable rsyslog.service
  2. デーモンが有効になっていることを確認するには、シェルプロンプトで以下のコマンドを入力します。
    ~]$ systemctl is-enabled auditd
    enabled
    
    ~]$ systemctl is-enabled rsyslog
    enabled
    
    または、systemctl status service-name.service コマンドを使用して、コマンド出力 で有効な キーワードを検索します。以下に例を示します。
    ~]$ systemctl status auditd.service | grep enabled
    auditd.service - Security Auditing Service
       Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
    
systemd デーモンによるシステムサービスの管理方法は、『システム管理者のガイド』の「 システムサービスの管理」の章 を参照してください。

4.3. 主な設定ファイル

/etc/selinux/config ファイルは、メインの SELinux 設定ファイルです。これは、SELinux を有効または無効にするか、およびどの SELinux モードと SELinux ポリシーが使用されるかを制御します。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELINUX=
SELINUX オプションは、SELinux が無効または有効であるか、およびどのモード(Enforcing または permissive)であるかを設定します。これは実行中です。
  • SELINUX=enforcing を使用する場合は、SELinux ポリシーが適用され、SELinux ポリシールールに基づいてアクセスを拒否します。拒否メッセージがログに記録されます。
  • SELINUX=permissive を使用する場合、SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、SELinux を Enforcing モードで実行した場合拒否が拒否されたアクションについてログに記録されません。
  • SELINUX=disabled を使用すると、SELinux モジュールは Linux カーネルに登録されず、DAC ルールのみが使用されます。
SELINUXTYPE=
SELINUXTYPE オプションは、使用する SELinux ポリシーを設定します。ターゲットとなるポリシーはデフォルトのポリシーです。MLS ポリシーを使用する場合のみ、このオプションを変更します。MLS ポリシーを有効にする方法は、「SELinux での MLS の有効化」 を参照してください。

4.4. SELinux の状態およびモードの永続的な変更

「SELinux のステータスおよびモード」 で説明されているように、SELinux は有効または無効にできます。有効にした場合の SELinux のモードには、Enforcing および Permissive の 2 つがあります。
getenforce コマンド、または sestatus コマンドを使用して、SELinux が実行しているモードを確認できます。getenforce コマンドは、EnforcingPermissive、または Disabled を返します。
sestatus コマンドは SELinux のステータスと、使用されている SELinux ポリシーを返します。
~]$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30
注記
Permissive モードで SELinux を実行すると、ユーザーにファイルを誤ってラベル付けできます。SELinux が無効になっている間に作成されたファイルには、ラベル付けされません。この動作により、ファイルが誤ってラベル付けされるか、または全くラベル付けされていないため、Enforcing モードに変更すると問題が発生します。ラベルが誤って設定されていたり、ファイルにラベルが付いていないために問題が発生するのを防ぐために、Disabled 状態から Permissive モードまたは Enforcing モードに変更すると、ファイルシステムのラベルが自動的に再設定されます。

4.4.1. SELinux の有効化

SELinux が有効になっている場合は、Enforcing モードまたは Permissive モードのいずれかで実行できます。以下のセクションでは、これらのモードに永続的に変更する方法を説明します。
SELinux が無効になっていたシステムで SELinux を有効にする際に、システムが起動できない、プロセスが失敗するなどの問題を回避するために、Red Hat は、この手順に従うことを推奨します。
  1. SELinux を Permissive モードで有効にします。詳細は、「Permissive モード」 を参照してください。
  2. システムを再起動します。
  3. SELinux 拒否メッセージを確認します。詳細は、「サービス拒否検索および表示」 を参照してください。
  4. 拒否がない場合は、Enforcing モードに切り替えます。詳細は、「Enforcing モード」 を参照してください。
Enforcing モードで SELinux を使用してカスタムアプリケーションを実行するには、次のいずれかのシナリオを選択してください。

4.4.1.1. Permissive モード

SELinux を Permissive モードで実行していると、SELinux ポリシーは強制されません。システムは動作し続け、SELinux がオペレーションを拒否せず AVC メッセージをログに記録できるため、このログを使用して、トラブルシューティングやデバッグ、ならびに SELinux ポリシーの改善に使用できます。この場合、各 AVC は一度だけログに記録されます。
モードを Permissive へ永続的に変更するには、以下の手順に従ってください。

手順4.2 Permissive モードへの変更

  1. 以下のように /etc/selinux/config ファイルを編集します。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
  2. システムを再起動します。
    ~]# reboot

4.4.1.2. Enforcing モード

SELinux を Enforcing モードで実行している場合は、SELinux ポリシーが強制され、SELinux ポリシールールに基づいてアクセスが拒否されます。Red Hat Enterprise Linux では、システムに SELinux を最初にインストールした時に、Enforcing モードがデフォルトで有効になります。
SELinux が無効の場合は、以下の手順に従って、再度 Enforcing モードに変更してください。

手順4.3 Enforcing モードへの変更

この手順では、selinux-policy-targetedselinux-policylibselinux、libselinux -pythonlibselinux-utilspolicycoreutils、および policycoreutils-python パッケージがインストールされていることを前提としています。パッケージがインストールされていることを確認するには、以下のコマンドを使用します。
rpm -q package_name
  1. 以下のように /etc/selinux/config ファイルを編集します。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
  2. システムを再起動します。
    ~]# reboot
    次にシステムを起動する際に、SELinux はシステム内のファイルおよびディレクトリーのラベルを再設定し、SELinux が無効になっている間に作成したファイルおよびディレクトリーに SELinux コンテキストを追加します。
注記
Enforcing モードに変更したあと、SELinux ポリシールールが間違っていたか、設定されていなかったため、SELinux が一部のアクションを拒否する場合があります。SELinux に拒否されるアクションを表示するには、root で以下のコマンドを実行します。
~]# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
setroubleshoot-server パッケージがインストールされている場合は、root で次のコマンドを実行します。
~]# grep "SELinux is preventing" /var/log/messages
SELinux が一部のアクションを拒否する場合は、11章トラブルシューティング でトラブルシューティングに関する情報を参照してください。
モードの一時的な変更は、「SELinux のステータスおよびモード」 で説明されています。

4.4.2. SELinux の無効化

SELinux が無効になっていると、SELinux ポリシーは読み込まれません。ポリシーは強制されず、AVC メッセージはログに記録されません。したがって、「SELinux を実行する利点」 に記載されている SELinux を実行する利点はすべて失われます。
重要
Red Hat は、SELinux を永続的に無効にする代わりに、Permissive モードを使用することを強く推奨します。Permissive モードの詳細は、「Permissive モード」 を参照してください。
SELinux を永続的に無効にするには、以下の手順を行います。

手順4.4 SELinux の無効化

  1. /etc/selinux/config ファイルに SELINUX=disabled を設定します。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=disabled
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=targeted
  2. システムを再起動します。再起動したら、getenforce コマンドが Disabled を返すことを確認します。
    ~]$ getenforce
    Disabled

4.5. 起動時の SELinux モードの変更

システムの起動時に、SELinux の実行方法を変更するカーネルパラメーターを設定できます。
enforcing=0
このパラメータを設定すると、システムを起動する際に、Permissive モードで起動します。これは、問題のトラブルシューティングを行うときに便利です。ファイルシステムの破損がひどい場合は、Permissive モードを使用することが、問題を検出するための唯一の選択肢となるかもしれません。また、Permissive モードでは、ラベルの作成が適切に行われます。このモードで作成した AVC メッセージは、Enforcing モードと同じになるとは限りません。
Permissive モードでは、一連の同じ拒否の最初の拒否のみが報告されます。一方、Enforcing モードでは、ディレクトリーの読み込みに関する拒否が発生し、アプリケーションが停止する場合がします。Permissive モードでは、表示される AVC メッセージは同じですが、アプリケーションは、ディレクトリー内のファイルを読み続け、拒否が発生するたびに AVC を取得します。
selinux=0
このパラメーターにより、カーネルは、SELinux インフラストラクチャーのどの部分も読み込まないようになります。init スクリプトは、システムが selinux=0 パラメーターで起動してるのを認識し、/.autorelabel ファイルのタイムスタンプを変更します。これにより、次回 SELinux を有効にしてシステムを起動する際にシステムのラベルが自動的に再設定されます。
重要
Red Hat では、selinux=0 パラメーターを使用することは推奨されません。システムをデバッグする場合は、Permissive モードを使用することが推奨されます。
autorelabel=1
このパラメーターにより、システムで、以下のコマンドと同様の再ラベルが強制的に行われます。
~]# touch /.autorelabel
~]# reboot
システムのラベリングに大量のエラーが含まれる場合は、自動再ラベルが正常に実行されるために Permissive モードで起動する必要がある場合があります。
checkreqprot などの追加の SELinux 関連のカーネル起動パラメーターは、/usr/share/doc/kernel-doc-<KERNEL_VER>/Documentation/kernel-parameters.txt ファイルを参照してください。本書は、kernel-doc パッケージでインストール します。<KERNEL_VER> 文字列をインストール済みカーネルのバージョン番号に置き換えます。以下に例を示します。
~]# yum install kernel-doc
~]$ less /usr/share/doc/kernel-doc-3.10.0/Documentation/kernel-parameters.txt

4.6. ブール値

ブール値は、SELinux ポリシーの記述に関する知識なしに、ランタイム時に SELinux ポリシーの一部を変更できます。これにより、SELinux ポリシーのリロードや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。

4.6.1. ブール値の一覧表示

ブール値の一覧、各詳細の説明、およびオンまたはオフであるかについては、Linux の root ユーザーとして semanage boolean -l コマンドを実行します。以下の例はすべてのブール値を一覧表示しておらず、出力は簡潔なもののために短縮されています。
~]# semanage boolean -l
SELinux boolean                State  Default Description


smartmon_3ware                 (off  ,  off)  Determine whether smartmon can...
mpd_enable_homedirs            (off  ,  off)  Determine whether mpd can traverse...
注記
詳細な説明を行うには、selinux-policy-devel パッケージをインストールします。
SELinux ブール値 のコラムにはブール値名が一覧表示されます。説明 のコラムには、ブール値がオンまたはオフであるかと、そのブール値が何であるかを示します。
The getsebool -a コマンドは、ブール値(オンまたはオフであるかに関わらず)を一覧表示しますが、それぞれの説明は提供しません。以下の例は、すべてのブール値を一覧表示していません。
~]$ getsebool -a
cvs_read_shadow --> off
daemons_dump_core --> on
the getsebool boolean-name コマンドを実行して、boolean-name ブール値のステータスのみを一覧表示します。
~]$ getsebool cvs_read_shadow
cvs_read_shadow --> off
スペース区切りリストを使用して、複数のブール値を一覧表示します。
~]$ getsebool cvs_read_shadow daemons_dump_core
cvs_read_shadow --> off
daemons_dump_core --> on

4.6.2. ブール値の設定

setsebool boolean_name on/off 形式で setsebool ユーティリティーを実行し、ブール値を有効または無効にします。
以下の例は、httpd_can_network_connect_db のブール値の設定を示しています。

手順4.5 ブール値の設定

  1. デフォルトでは、httpd_can_network_connect_db ブール値は off で、Apache HTTP Server スクリプトおよびモジュールがデータベースサーバーに接続されないようにします。
    ~]$ getsebool httpd_can_network_connect_db
    httpd_can_network_connect_db --> off
    
  2. 一時的に Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できるようにするには、root で以下のコマンドを入力します。
    ~]# setsebool httpd_can_network_connect_db on
  3. The getsebool ユーティリティーを使用して、ブール値が有効であることを確認します。
    ~]$ getsebool httpd_can_network_connect_db
    httpd_can_network_connect_db --> on
    
    これにより、Apache HTTP Server スクリプトとモジュールがデータベースサーバーに接続できます。
  4. この変更は、再起動後も維持されません。再起動後も変更を永続的にするには、root で setsebool -P boolean-name コマンドを実行します。[3]
    ~]# setsebool -P httpd_can_network_connect_db on

4.6.3. シェルの自動完了

シェルの自動補完は、getsebool ユーティリティー、setsebool ユーティリティー、および semanage ユーティリティーで使用することができます。auto-completion with getsebool および setsebool を使用して、コマンドラインパラメーターとブール値の両方を完了します。コマンドラインパラメーターのみを一覧表示するには、パッケージ名の後にハイフン文字("-")を追加して Tab キーを押します。
~]# setsebool -[Tab]
-P
ブール値を完了するには、ブール値名の書き込みを開始して 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]
virt_use_comm     virt_use_nfs      virt_use_sanlock
virt_use_execmem  virt_use_rawip    virt_use_usb
virt_use_fusefs   virt_use_samba    virt_use_xserver
semanage ユーティリティーは、1 つずつ完了した複数のコマンドライン引数で使用されます。semanage コマンドの最初の引数は、SELinux ポリシーが管理している部分を指定するオプションです。
~]# semanage [Tab]
boolean     export      import      login       node        port
dontaudit   fcontext    interface   module      permissive  user
次に、1 つまたは複数のコマンドラインパラメーターは以下のようになります。
~]# semanage fcontext -[Tab]
-a           -D           --equal      --help       -m           -o
--add        --delete     -f           -l           --modify     -S
-C           --deleteall  --ftype      --list       -n           -t
-d           -e           -h           --locallist  --noheading  --type
最後に、ブール値、SELinux ユーザー、ドメインなど、特定の SELinux エントリーの名前を入力します。エントリーの入力を開始し、Tab を押します
~]# semanage fcontext -a -t samba<tab>
samba_etc_t                     samba_secrets_t
sambagui_exec_t                 samba_share_t
samba_initrc_exec_t             samba_unconfined_script_exec_t
samba_log_t                     samba_unit_file_t
samba_net_exec_t
コマンドラインパラメーターは、コマンドでチェーンできます。
~]# semanage port -a -t http_port_t -p tcp 81


[3] Linux の root ユーザーとしてデフォルトの動作を一時的に元に戻するには、setsebool httpd_can_network_connect_db off コマンドを実行します。再起動後も維持されている変更については、setsebool -P httpd_can_network_connect_db off コマンドを実行します。

4.7. SELinux コンテキスト: ファイルのラベル付け

SELinux を実行しているシステムでは、すべてのプロセスとファイルに、セキュリティー関連の情報を表す方法でラベルが付けられます。この情報は、SELinux コンテキスト と呼ばれます。ファイルについては、ls -Z コマンドを使用して表示されます。
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
この例では、SELinux はユーザー(unconfined_u)、ロール(object_r)、タイプ(user_home_t)、およびレベル(s0)を提供します。この情報は、アクセス制御の決定に使用されます。DAC システムでは、アクセスは Linux ユーザーおよびグループ ID に基づいて制御されます。SELinux ポリシールールは、DAC ルールの後にチェックされます。DAC ルールがアクセスを拒否した場合は、SELinux ポリシールールは使用されません。
注記
デフォルトでは、新たに作成したファイルおよびディレクトリーは、親ディレクトリーの SELinux タイプを継承します。たとえば、etc_t タイプのラベルが付けられた /etc ディレクトリーに新規ファイルを作成する場合、新しいファイルは同じタイプを継承します。
~]$ ls -dZ - /etc
drwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc
~]# touch /etc/file1
~]# ls -lZ /etc/file1
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   /etc/file1
SELinux は、chcon、semanage fcontextrestoreconmatch path con などのファイルシステムのラベリングを管理するための複数のコマンドを提供します。

4.7.1. 一時的な変更: chcon

chcon コマンドは、ファイルの SELinux コンテキストを変更します。ただし、ch con コマンドで行った変更は、ファイルシステムの再ラベルや restorecon コマンドの実行には永続性がありません。SELinux ポリシーは、ユーザーが指定のファイルの SELinux コンテキストを変更できるかどうかを制御します。chcon を使用する場合、ユーザーは SELinux コンテキストすべてまたは一部を提供します。誤ったファイルタイプは、SELinux がアクセスを拒否する一般的な原因です。

クイックリファレンス

  • chcon -t type file-name コマンドを実行してファイルの種類を変更します。type は、httpd_sys_content_t などの SELinux タイプで、file-name はファイルまたはディレクトリー名です。
    ~]$ chcon -t httpd_sys_content_t file-name
  • chcon -R -t type directory-name コマンドを実行して、ディレクトリーのタイプとそのコンテンツを変更します。type は、httpd_sys_content_t などの SELinux タイプで、directory-name はディレクトリー名です。
    ~]$ chcon -R -t httpd_sys_content_t directory-name

手順4.6 ファイルまたはディレクトリーのタイプの変更

以下の手順は、タイプを変更し、SELinux コンテキストのその他の属性の変更を示しています。本セクションの例は、たとえば file1 がディレクトリーの場合など、ディレクトリーで同じものです。
  1. ホームディレクトリーに移動します。
  2. 新しいファイルを作成し、その SELinux コンテキストを表示します。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
    この例では、file1 の SELinux コンテキストには、SELinux unconfined_u ユーザー、object_r ロール、user_home_t タイプ、s 0 レベルが含まれます。SELinux コンテキストの各部分の説明は、2章SELinux Contexts を参照してください。
  3. 以下のコマンドを入力して、タイプを samba_share_t に変更します。-t オプションは、タイプのみを変更します。次に、変更を表示します。
    ~]$ chcon -t samba_share_t file1
    ~]$ ls -Z file1 
    -rw-rw-r--  user1 group1 unconfined_u:object_r:samba_share_t:s0 file1
    
  4. 以下のコマンドを使用して、file1 ファイルの SELinux コンテキストを復元します。-v オプションを使用して、変更内容を表示します。
    ~]$ restorecon -v file1
    restorecon reset file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:user_home_t:s0
    
    この例では、前のタイプ samba_share_t が、正しい user_home_t タイプに復元されます。ターゲットポリシー(Red Hat Enterprise Linux のデフォルトの SELinux ポリシー)を使用する場合、restorecon コマンドは /etc/selinux/targeted/contexts/files/ ディレクトリーのファイルを読み取り、どの SELinux コンテキストファイルが存在するかを確認します。

手順4.7 ディレクトリーとそのコンテンツタイプの変更

以下の例は、新しいディレクトリーを作成し、そのディレクトリーのファイルタイプを Apache HTTP Server が使用するタイプに変更する方法を示しています。この例の設定は、Apache HTTP Server が異なるドキュメントルート( /var/www/html/ではなく)を使用する場合に使用します。
  1. root ユーザーとして、このディレクトリーに新しい web/ ディレクトリーを作成し、3 つの空のファイル(file1file2、および file3)を作成します。web/ ディレクトリーおよびそのファイルには、default_t タイプのラベルが付けられます。
    ~]# mkdir /web
    ~]# touch /web/file{1,2,3}
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  2. root で以下のコマンドを入力し、web / ディレクトリー(およびそのコンテンツ)のタイプを httpd_sys_content_t に変更します。
    ~]# chcon -R -t httpd_sys_content_t /web/
    ~]# ls -dZ /web/
    drwxr-xr-x  root root unconfined_u:object_r:httpd_sys_content_t:s0 /web/
    
    ~]# ls -lZ /web/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
  3. デフォルトの SELinux コンテキストを復元するには、root で restorecon ユーティリティーを使用します。
    ~]# restorecon -R -v /web/
    restorecon reset /web context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:httpd_sys_content_t:s0->system_u:object_r:default_t:s0
    
chcon の詳細は、chcon(1) man ページを参照してください。
注記
Enforcement タイプ は、SELinux ターゲットポリシーで使用される主要なパーミッション制御です。ほとんどの部分では、SELinux ユーザーおよびロールを無視できます。

4.7.2. 永続的な変更: semanage fcontext

semanage fcontext コマンドは、ファイルの SELinux コンテキストを変更するために使用されます。新規作成されたファイルおよびディレクトリーへのコンテキストを表示するには、root で次のコマンドを実行します。
~]# semanage fcontext -C -l
semanage fcontext による変更は、以下のユーティリティーによって使用されます。setfiles ユーティリティーは、ファイルシステムのラベルが解除され、restorecon ユーティリティーがデフォルトの SELinux コンテキストを復元する場合に使用されます。つまり、ファイルシステムに再ラベル付けされた場合でも、semanage fcontext による変更が永続化されます。SELinux ポリシーは、ユーザーが指定のファイルの SELinux コンテキストを変更できるかどうかを制御します。

クイックリファレンス

ファイルシステムの再ラベルを維持する SELinux コンテキストを変更するには、以下を実行します。
  1. 以下のコマンドを入力し、ファイルまたはディレクトリーへの完全パスを使用するようにしてください。
    ~]# semanage fcontext -a options file-name|directory-name
  2. restorecon ユーティリティーを使用して、コンテキスト変更を適用します。
    ~]# restorecon -v file-name|directory-name

semanage fcontext での正規表現の使用

semanage fcontext コマンドが適切に機能するには、完全修飾パスまたは Perl 互換正規表現(PCRE) のいずれかを使用できます。使用中の唯一の PCRE フラグは PCRE2_DOTALL で、これにより、 ワイルドカードは 新しい行を含め、何も一致させます。パスを表す文字列はバイトとして処理されます。つまり、ASCII 以外の文字は単一のワイルドカードによって一致しません。
semanage fcontext を使用して指定された file-context 定義は逆の順序で評価されることに注意してください。最新のエントリーは、stem の長さに関係なく最初に評価されます。file_contexts.local に保存されているローカルのファイルコンテキストの変更は、ポリシーモジュールで指定された優先順位よりも高くなります。つまり、指定のファイルパスの一致が file _contexts.local にあり、他の file-context 定義が考慮されないことを意味します。
重要
semanage fcontext コマンドを使用して指定された file-context 定義は、他のすべての file-context 定義を効果的にオーバーライドします。したがって、ファイルシステムの他の部分に意図的に影響しないように、すべての正規表現ができるだけ具体的にしてください。
file-context 定義およびフラグに使用されている正規表現の種類の詳細は、man ページの semanage-fcontext(8) を参照してください。

手順4.8 ファイルまたはディレクトリーのタイプの変更

以下の例は、ファイルタイプを変更し、SELinux コンテキストのその他の属性を変更しません。この例は、file1 がディレクトリーの場合など、ディレクトリーに同じように機能します。
  1. root ユーザーとして、/etc ディレクトリーに新しいファイルを作成します。デフォルトでは、/etc で新たに作成されたファイルに etc_t タイプのラベルが付けられます。
    ~]# touch /etc/file1
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    ディレクトリーに関する情報を一覧表示するには、以下のコマンドを使用します。
    ~]$ ls -dZ directory_name
  2. root で以下のコマンドを実行して file1 タイプを samba_share_t に変更します。-a オプションは新しいレコードを追加し、- t オプションはタイプ(samba_share_t)を定義します。このコマンドを実行しても、タイプを直接変更しません。file1 には、引き続き etc_t タイプのラベルが付けられます。
    ~]# semanage fcontext -a -t samba_share_t /etc/file1
    ~]# ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0       /etc/file1
    
    ~]$ semanage fcontext -C -l
    /etc/file1    unconfined_u:object_r:samba_share_t:s0
    
  3. root で restorecon ユーティリティーを使用してタイプを変更します。semanage はエントリーを /etc/file1 の file_contexts.local に追加するためrestorecon はタイプを samba_share_t に変更します
    ~]# restorecon -v /etc/file1
    restorecon reset /etc/file1 context unconfined_u:object_r:etc_t:s0->system_u:object_r:samba_share_t:s0
    

手順4.9 ディレクトリーとそのコンテンツタイプの変更

以下の例は、新しいディレクトリーを作成し、そのディレクトリーのファイルタイプを Apache HTTP Server が使用するタイプに変更する方法を示しています。この例の設定は、Apache HTTP Server が /var/www/html/ ではなく、別のドキュメントルートを使用するように設定する場合に使用されます。
  1. root ユーザーとして、このディレクトリーに新しい web/ ディレクトリーを作成し、3 つの空のファイル(file1file2、および file3)を作成します。web/ ディレクトリーおよびそのファイルには、default_t タイプのラベルが付けられます。
    ~]# mkdir /web
    ~]# touch /web/file{1,2,3}
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  2. root で以下のコマンドを入力し、web / ディレクトリーとそのファイルのタイプを httpd_sys_content_t に変更します。-a オプションは新しいレコードを追加し、- t オプションはタイプ(httpd_sys_content_t)を定義します。「/ web(/.*)?」 正規表現により、semanage は変更を web/ に適用し、その下のファイルも含まれます。このコマンドを実行すると、直接タイプは変更されません。web/および ファイル内の web/ およびファイルには、default_t タイプのラベルが付けられます。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    ~]$ ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ~]$ ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
    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
    
  3. root で restorecon ユーティリティーを使用して web/ のタイプと、そのファイル内のすべてのファイルを変更します。-R は再帰的なものです。つまり、web / 下のすべてのファイルおよびディレクトリーには httpd_sys_content_t タイプのラベルが付けられます。semanage はエントリーを /web(/.*)?file.contexts.local に追加したため、restorecon はタイプを httpd_sys_content_t に変更します
    ~]# restorecon -R -v /web
    restorecon reset /web context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file2 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file3 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /web/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
    デフォルトでは、新たに作成したファイルおよびディレクトリーは、親ディレクトリーの SELinux タイプを継承することに注意してください。

手順4.10 追加したコンテキストの削除

以下の例は、SELinux コンテキストの追加および削除を示しています。コンテキストが正規表現の一部である場合(例: /web(/.*)?)、正規表現の周りの引用符を使用してください。
~]# semanage fcontext -d "/web(/.*)?"
  1. コンテキストを削除するには、root で以下のコマンドを入力します。ここで、file-name | directory-name|directory-namefile_contexts.local の最初の部分になります。
    ~]# semanage fcontext -d file-name|directory-name
    以下は、file_contexts.local のコンテキストの例になります。
    /test    system_u:object_r:httpd_sys_content_t:s0
    
    最初の部分が テスト中 です。restorecon の実行後に test/ ディレクトリーに、またはファイルシステムのラベル後に httpd_sys_content_t でラベル付けされないようにするには、root で以下のコマンドを入力して、file_contexts.local からコンテキストを削除します。
    ~]# semanage fcontext -d /test
  2. root で restorecon ユーティリティーを使用してデフォルトの SELinux コンテキストを復元します。
semanage の詳細は、semanage(8) および semanage-fcontext(8) の man ページを参照してください。
重要
semanage fcontext -a で SELinux コンテキストを変更する場合は、ファイルまたはディレクトリーへの完全パスを使用して、ファイルシステムのラベルの後、または restorecon コマンドの実行後にファイルのラベルが間違っているのを回避します。

4.7.3. ファイルコンテキストの決定方法

ファイルコンテキストの決定は、システムセキュリティーポリシー( .fc ファイル)で指定される file-context 定義に基づいています。システムポリシーに基づいて、semanagefile_contexts.homedirs ファイルおよび file_contexts ファイルを生成します。
システム管理者は、semanage fcontext コマンドを使用して、file-context 定義をカスタマイズできます。このようなカスタマイズは、file_contexts.local ファイルに保存されます。
matchpathconrestorecon などのラベリングユーティリティーが特定のパスに適切なラベルを決定すると、最初にローカルの変更(file_contexts.local)を検索します。ユーティリティーに一致するパターンが見つからない場合は、file_contexts.homedirs ファイルを検索し、最後に file_contexts ファイルを検索します。ただし、指定したファイルパスと一致する見つかると、検索は終了するたびに、ユーティリティーは追加の file-context 定義を検索します。つまり、ホームディレクトリー関連のファイルコンテキストは、残りよりも優先度が高く、ローカルのカスタマイズがシステムポリシーを上書きします。
システムポリシー で指定された file-context の定義( file_contexts.homedirs ファイルおよび file_contexts ファイル)は、評価の前に stem の長さ(ワイルドカードの前にパスの特定)別にソートされます。これは、最も具体的なパスを選択することを意味します。ただし、semanage fcontext を使用して指定された file-context 定義は逆の順序で評価されます。最新のエントリーは、stem の長さに関係なく最初に評価されます。
詳細は、以下を参照してください。

4.8. file_t および default_t タイプ

拡張属性(EA)をサポートするファイルシステムを使用する場合、file_t タイプは、EA がまだ割り当てられていないファイルのデフォルトタイプです。このタイプは、この目的のためにのみ使用され、適切にラベル付けされたファイルシステムには存在しません。SELinux を実行しているシステムのすべてのファイルには適切な SELinux コンテキストが必要で、file_t タイプは file -context 設定で使用されないためです。[4].
default_t タイプは、file-context 設定のパターンに一致しないファイルで使用されます。そのため、このようなファイルはディスクにコンテキストがないファイルから区別でき、通常は制限のあるドメインにはアクセスできなくなります。たとえば、my directory/ などの新規最上位のディレクトリーを作成する場合、このディレクトリーには default_t タイプのラベルが付けられる場合があります。サービスがこのディレクトリーにアクセスする必要がある場合は、この場所の file-contexts 設定を更新する必要があります。file-context 設定へのコンテキストの追加に関する詳細は、「永続的な変更: semanage fcontext」 を参照してください。


[4] /etc/selinux/targeted/contexts/files/ ディレクトリーのファイルは、ファイルとディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon ユーティリティーおよび setfiles ユーティリティーで読み取り、ファイルとディレクトリーをデフォルトのコンテキストに復元します。

4.9. ファイルシステムのマウント

デフォルトでは、拡張属性をサポートするファイルシステムがマウントされると、各ファイルのセキュリティーコンテキストがファイルの security.selinux 拡張属性から取得されます。拡張属性をサポートしないファイルシステムのファイルには、ファイルシステムタイプに基づいて、ポリシー設定からのデフォルトのセキュリティーコンテキストが 1 つ割り当てられます。
mount -o context コマンドを使用して既存の拡張属性を上書きするか、拡張属性をサポートしないファイルシステムに別のデフォルトコンテキストを指定します。これは、ファイルシステム内で、複数のシステムで使用されるリムーバブルメディアなど、正しい属性を提供するために信頼されない場合に便利です。mount -o context コマンドは、File Allocation Table(FAT)や NFS ボリュームなどの拡張属性をサポートしないファイルシステムのラベル付けにも使用することができます。context オプションで指定した コンテキストは ディスクには書き込まれません。元のコンテキストは保持され、ファイルシステムが最初の場所で拡張属性がある場合に、コンテキスト なしでマウントするときに表示されます。
ファイルシステムのラベリングの詳細については、James Morris の「Filesystem Labeling in SELinux」の記事を参照してください http://www.linuxjournal.com/article/7426

4.9.1. コンテキストマウント

指定したコンテキストでファイルシステムをマウントするか、既存のコンテキストが存在する場合は上書きするか、拡張属性をサポートしないファイルシステムのデフォルトコンテキストを root ユーザーとして指定する場合は、mount -o context=SELinux_user:role:type:level コマンドを使用します。コンテキストの変更はディスクに書き込まれません。デフォルトでは、クライアント側への NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトコンテキストでラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは nfs_t タイプを使用します。追加のマウントオプションがないと、Apache HTTP Server などの他のサービスを使用して NFS ボリュームの共有を防ぐことができます。以下の例では、Apache HTTP Server を使用して共有できるように NFS ボリュームをマウントします。
~]# mount server:/export /local/mount/point -o \ context="system_u:object_r:httpd_sys_content_t:s0"
このファイルシステムの新規作成ファイルおよびディレクトリーは、SELinux コンテキストが -o コンテキスト で指定されているように見えます。ただし、これらの変更はディスクに書き込まれないため、このオプションで指定したコンテキストはマウント間で永続化されません。そのため、必要なコンテキストを維持するために、このオプションはすべてのマウント時に指定された同じコンテキストと共に使用する必要があります。コンテキストマウントの永続化の詳細は、「コンテキストマウントの永続化」 を参照してください。
Enforcement タイプ は、SELinux ターゲットポリシーで使用される主要なパーミッション制御です。ほとんどの場合、SELinux ユーザーとロールは無視できるため、- o コンテキストで SELinux コンテキストを上書きする場合は、 SELinux system_u user および object_r ロールを使用し、タイプに集中します。MLS ポリシーまたはマルチカテゴリーセキュリティーを使用していない場合は、s 0 レベルを使用します。
注記
ファイルシステムが コンテキスト オプションを使用してマウントされている場合、ユーザーおよびプロセスによるコンテキストの変更は禁止されます。たとえば、コンテキスト オプションでマウントされたファイルシステムで chcon コマンドを実行すると、Operation not supported エラーが発生します。

4.9.2. デフォルトコンテキストの変更

「file_t および default_t タイプ」 で説明したように、拡張属性をサポートするファイルシステムの場合、ディスクに SELinux コンテキストのないファイルにアクセスすると、SELinux ポリシーで定義されているデフォルトのコンテキストがあるかのように処理されます。一般的なポリシーでは、このデフォルトのコンテキストは file_t タイプを使用します。別のデフォルトコンテキストを使用する方が望ましい場合は、defcontext オプションを指定してファイルシステムをマウントします。
以下の例では、/dev/sda2 の新規作成したファイルシステムを、新たに作成した test/ ディレクトリーにマウントします。/etc/selinux/targeted/contexts/files/ には、test/ ディレクトリーのコンテキストを定義するルールがないことを前提としています。
~]# mount /dev/sda2 /test/ -o defcontext="system_u:object_r:samba_share_t:s0"
この例では、以下のように設定されています。
  • defcontext オプションは、system_u:object_r:samba_share_t:s0 が「the default security context for unlabeled files」であることを定義します。[5].
  • マウントすると、ファイルシステムの root ディレクトリー(test/)は、defcontext で指定されたコンテキストでラベル付けされるかのように処理されます(このラベルはディスクに保存されません)。これは、test/ で作成されたファイルのラベリングに影響します。新しいファイルは samba_share_t タイプを継承するので、これらのラベルはディスクに保存されます。
  • ファイルシステムが defcontext オプションでマウントされている間に test/ で作成されたファイルは、それらのラベルを保持します。

4.9.3. NFS ボリュームのマウント

デフォルトでは、クライアント側への NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトコンテキストでラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは nfs_t タイプを使用します。ポリシー設定によっては、Apache HTTP Server や MariaDB などのサービスは、nfs_t タイプのラベルが付いたファイルを読み取れない場合があります。これにより、このタイプのラベルが付いたファイルシステムがマウントされ、他のサービスによる読み取りやエクスポートが妨げられる可能性があります。
NFS ボリュームをマウントして別のサービスでそのファイルシステムを読み取りまたはエクスポートする場合は、マウント時に nfs_t タイプを上書きする場合は、context オプションを使用します。以下のコンテキストオプションを使用して NFS ボリュームをマウントし、Apache HTTP Server を使用して共有できるようにします。
~]# mount server:/export /local/mount/point -o context="system_u:object_r:httpd_sys_content_t:s0"
これらの変更はディスクに書き込まれないため、このオプションで指定したコンテキストはマウント間で永続化されません。そのため、必要なコンテキストを維持するために、このオプションはすべてのマウント時に指定された同じコンテキストと共に使用する必要があります。コンテキストマウントの永続化の詳細は、「コンテキストマウントの永続化」 を参照してください。
コンテキスト オプションでファイルシステムをマウントする代わりに、ブール値を有効にして、nfs_t タイプのラベルが付いたファイルシステムへのサービスアクセスを許可することもできます。nfs_t タイプにサービスアクセスを許可するブール値を設定する手順は、パートII「機密サービスの管理」 を参照してください。

4.9.4. 複数の NFS マウント

同じ NFS エクスポートから複数のマウントをマウントする場合は、各マウントの SELinux コンテキストを別のコンテキストで上書きしようとすると、その後の mount コマンドが失敗します。以下の例では、NFS サーバーには、web/ と database / の 2 つのサブディレクトリーを持つ export / が 1 つあります。以下のコマンドは、1 つの NFS エクスポートから 2 つのマウントを試行し、各 NFS エクスポートのコンテキストを上書きしてください。
~]# mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export/database /local/database -o context="system_u:object_r:mysqld_db_t:s0"
2 番目の mount コマンドが失敗し、以下が /var/log/messages に記録されます。
kernel: SELinux: mount invalid.  Same superblock, different security settings for (dev 0:15, type nfs)
1 つの NFS エクスポートから複数のマウントをマウントするには、各マウントが異なるコンテキストを持つ状態で -o nosharecache,context オプションを使用します。以下の例では、マウントごとに異なるコンテキストを使用して、1 つの NFS エクスポートから複数のマウントをマウントします(それぞれ 1 つのサービスアクセスを許可する)。
~]# mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
この例では、server:/export/web は、/local/web/ ディレクトリーにローカルにマウントされ、httpd_sys_content_t タイプのラベルが付けられ、Apache HTTP Server アクセスを許可します。server:/export/database はローカルに /local/database/ にマウントされ、mysqld_db_t タイプでラベルが付けられ、MariaDB アクセスが許可されます。これらのタイプの変更は、ディスクには書き込まれません。
重要
nosharecache オプションでは、異なるコンテキストで、エクスポートの同じサブディレクトリーを、異なるコンテキストで複数回マウントできます。たとえば、/export/web/ を複数回マウントすることができます。異なるコンテキストでファイルにアクセスできる重複マウントを作成するため、エクスポートを複数回異なるコンテキストでマウントしないでください。

4.9.5. コンテキストマウントの永続化

再マウントと再起動時にコンテキストのマウントを永続化するには、/etc/fstab ファイルまたは自動マウント機能マップにファイルシステムのエントリーを追加し、必要なコンテキストをマウントオプションとして使用します。以下の例では、NFS コンテキストマウントの /etc/fstab にエントリーを追加します。
server:/export /local/mount/ nfs context="system_u:object_r:httpd_sys_content_t:s0" 0 0


[5] Morris、James。"filesystem Labeling in SELinux".2004 年 10 月 1 日2008 年 10 月 14 日: http://www.linuxjournal.com/article/7426

4.10. SELinux ラベルの維持

このセクションでは、ファイルとディレクトリーのコピー、移動、およびアーカイブ時に SELinux コンテキストに何が起こるかを説明します。また、コピーおよびアーカイブが発生したときにコンテキストを保存する方法についても説明します。

4.10.1. ファイルおよびディレクトリーのコピー

ファイルまたはディレクトリーのコピー時に、新規ファイルまたはディレクトリーが存在しない場合に作成されます。この新規ファイルまたはディレクトリーのコンテキストは、元のコンテキストを保持するオプションを使用しない限り、元のファイルまたはディレクトリーのコンテキストではなく、デフォルトのラベル付けルールに基づいています。たとえば、ユーザーのホームディレクトリーで作成されたファイルには、user _home_t タイプのラベルが付けられます。
~]$ touch file1
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
このようなファイルが /etc などの別のディレクトリーにコピーされる場合、/ etc のデフォルトのラベル付けルールに従って新規ファイルが作成されます。追加オプションなしでファイルのコピーは、元のコンテキストを保存しない場合があります。
~]$ ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
~]# cp file1 /etc/
~]$ ls -Z /etc/file1
-rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
file1/etc にコピーされ、/etc/file1 が存在しない場合は、/etc/file1 が新規ファイルとして作成されます。上記の例で示されているように、/etc/file1 には default-labeling ルールに従って、etc/file1 に etc_t タイプのラベルが付けられます。
既存のファイルにファイルがコピーされると 、--preserve=context などの元のファイルのコンテキストを保持するための cp オプションが指定されていない限り、既存のファイルのコンテキストが保持されます。SELinux ポリシーは、コピー中にコンテキストが保持されないことがあります。

手順4.11 事前の SELinux コンテキストを使用しないコピー

この手順は、cp コマンドで ファイルをコピーする際に、オプションが指定されていない場合、タイプはターゲット、親ディレクトリーから継承されることを示しています。
  1. ユーザーのホームディレクトリーにファイルを作成します。このファイルには user_home_t タイプのラベルが付けられます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
  2. /var/www/html/ ディレクトリーには、以下のコマンドのように httpd_sys_content_t タイプのラベルが付けられます。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
  3. file1/var/www/html/ にコピーされると、httpd_sys_content_t タイプが継承されます。
    ~]# cp file1 /var/www/html/
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
    

手順4.12 コピー時の SELinux コンテキストの保存

この手順では 、--preserve=context オプションを使用して、コピー時にコンテキストを保存する方法を説明します。
  1. ユーザーのホームディレクトリーにファイルを作成します。このファイルには user_home_t タイプのラベルが付けられます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
  2. /var/www/html/ ディレクトリーには、以下のコマンドのように httpd_sys_content_t タイプのラベルが付けられます。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
  3. --preserve=context オプションを使用すると、コピー操作中に SELinux コンテキストが保持されます。下記のとおり、file1user_home_t タイプは、ファイルが /var/www/html/ にコピーされた際に保持されています。
    ~]# cp --preserve=context file1 /var/www/html/
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
    

手順4.13 コンテキストのコピーおよび変更

この手順では 、--context オプションを使用して宛先コピーのコンテキストを変更する方法を説明します。以下の例は、ユーザーのホームディレクトリーで実行されます。
  1. ユーザーのホームディレクトリーにファイルを作成します。このファイルには user_home_t タイプのラベルが付けられます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
  2. --context オプションを使用して SELinux コンテキストを定義します。
    ~]$ cp --context=system_u:object_r:samba_share_t:s0 file1 file2
  3. --context を使用しないと、file2 には unconfined_u:object_r:user_home_t コンテキストでラベルが付けられます。
    ~]$ ls -Z file1 file2
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    -rw-rw-r--  user1 group1 system_u:object_r:samba_share_t:s0 file2
    

手順4.14 既存のファイルを用いたファイルのコピー

この手順では、ファイルを既存のファイルにコピーする際に、コンテキストを保存するオプションを使用しない限り、既存のファイルのコンテキストが保持されることを示しています。
  1. root で、/etc ディレクトリーに新しいファイル file1 を作成します。以下に示すように、ファイルに etc_t タイプのラベルが付けられます。
    ~]# touch /etc/file1
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
    
  2. /tmp ディレクトリーに 別のファイル file2 を作成します。以下に示すように、ファイルに user_tmp_t タイプのラベルが付けられます。
    ~]$ touch /tmp/file2
    ~$ ls -Z /tmp/file2
    -rw-r--r--  root root unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
    
  3. file1file2 で上書きします。
    ~]# cp /tmp/file2 /etc/file1
  4. コピー後に、次のコマンドは / etc/file 1 に置き換わる /tmp/file2 からの user_tmp_t タイプではなく 、etc _t タイプのラベルが付いた file 1 を表示します
    ~]$ ls -Z /etc/file1
    -rw-r--r--  root root unconfined_u:object_r:etc_t:s0   /etc/file1
    
重要
ファイルおよびディレクトリーを移動するのではなく、ファイルとディレクトリーをコピーします。これにより、正しい SELinux コンテキストのラベルが付けられます。SELinux コンテキストが正しくないと、プロセスがこのようなファイルおよびディレクトリーにアクセスできなくなる可能性があります。

4.10.2. ファイルおよびディレクトリーの移動

ファイルおよびディレクトリーは、移動時に現在の SELinux コンテキストを保持します。多くの場合、これは移動先に対して正しくありません。以下の例は、ユーザーのホームディレクトリーから、Apache HTTP Server が使用する /var/www/html/ ディレクトリーにファイルを移動する方法を示しています。ファイルは移動されるため、正しい SELinux コンテキストは継承されません。

手順4.15 ファイルおよびディレクトリーの移動

  1. ホームディレクトリーに移動して、そこにファイルを作成します。このファイルには user_home_t タイプのラベルが付けられます。
    ~]$ touch file1
    ~]$ ls -Z file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1
    
  2. 以下のコマンドを入力して、/var/www/html/ ディレクトリーの SELinux コンテキストを表示します。
    ~]$ ls -dZ /var/www/html/
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
    
    デフォルトでは、/var/www/html/ には httpd_sys_content_t タイプのラベルが付けられます。/var/www/html/ で作成されたファイルおよびディレクトリーは、このタイプを継承します。そのため、このタイプでラベルが付けられます。
  3. root で file1/var/www/html/ に移動します。このファイルを移動するため、現在の user_home_t タイプが維持されます。
    ~]# mv file1 /var/www/html/
    ~]# ls -Z /var/www/html/file1
    -rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 /var/www/html/file1
    
デフォルトでは、Apache HTTP Server は user_home_t タイプのラベルが付いたファイルを読み取ることができません。Web ページで構成されるすべてのファイルに user_home_t タイプでラベルが付けられた場合、または Apache HTTP Server が読み取れない別のタイプの場合は、Mozilla Firefox などの Web ブラウザーを使用してアクセスしようとすると、パーミッションは拒否されます。
重要
mv コマンドでファイルおよびディレクトリーを移動すると、SELinux コンテキストが間違っているため、Apache HTTP Server や Samba などのプロセスがこのようなファイルやディレクトリーにアクセスできなくなる可能性があります。

4.10.3. デフォルトの SELinux コンテキストの確認

matchpathcon ユーティリティーを使用して、ファイルとディレクトリーに正しい SELinux コンテキストがあるかどうかを確認します。このユーティリティーは、システムポリシー をクエリーし、ファイルパスに関連付けられたデフォルトのセキュリティーコンテキストを提供します。[6] 以下の例は、matchpathcon を使用して、/var/www/html/ ディレクトリーのファイルが正しくラベル付けされていることを確認します。

手順4.16 matchpathconでデフォルトの SELinux Conxtext の確認

  1. root ユーザーとして、/var/www/html/ ディレクトリーに 3 つのファイル( file1、file2、および file 3) を作成します。これらのファイルは、/var/www/html/ から httpd_sys_content_t タイプを継承します。
    ~]# touch /var/www/html/file{1,2,3}
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
  2. root で file1 タイプを samba_share_t に変更します。Apache HTTP Server は、samba _share_t タイプのラベルが付いたファイルまたはディレクトリーを読み取れることができないことに注意してください。
    ~]# chcon -t samba_share_t /var/www/html/file1
  3. matchpathcon -V オプションは、現在の SELinux コンテキストを SELinux ポリシーのデフォルトコンテキストと比較します。以下のコマンドを入力して、/var/www/html/ ディレクトリー内のファイルをすべて確認します。
    ~]$ matchpathcon -V /var/www/html/*
    /var/www/html/file1 has context unconfined_u:object_r:samba_share_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
    /var/www/html/file2 verified.
    /var/www/html/file3 verified.
    
matchpathcon コマンドの出力では、file1samba_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
ラベルの問題を解決し、Apache HTTP Server の file1 へのアクセスを許可するには、root で restorecon ユーティリティーを使用します。
~]# restorecon -v /var/www/html/file1
restorecon reset /var/www/html/file1 context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0

4.10.4. tar でのファイルのアーカイブ

tar ユーティリティーは、デフォルトで拡張属性を保持しません。SELinux コンテキストは拡張属性に格納されるため、ファイルのアーカイブ時にコンテキストが失われる可能性があります。tar --selinux コマンドを使用して、コンテキストを保持し、アーカイブからファイルを復元するアーカイブを作成します。tar アーカイブに拡張属性のないファイルが含まれる場合や、拡張属性がシステムのデフォルトと一致するようにする場合は、restorecon ユーティリティーを使用します。
~]$ tar -xvf archive.tar | restorecon -f -
ディレクトリーによっては、root ユーザーで restorecon の実行が必要になる場合があります。
以下の例は、SELinux コンテキストを保持する tar アーカイブの作成を示しています。

手順4.17 tar アーカイブの作成

  1. /var/www/html/ ディレクトリーに移動し、その SELinux コンテキストを表示します。
    ~]$ cd /var/www/html/
    html]$ ls -dZ /var/www/html/
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
  2. root として、/var/www/html/ に 3 つのファイル(file1、file2、および file3)を作成します。これらのファイルは、/var/www/html/ から httpd_sys_content_t タイプを継承します。
    html]# touch file{1,2,3}
    html]$ ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
  3. root で以下のコマンドを実行して、test. tar という名前の tar アーカイブを作成します。--selinux を使用して SELinux コンテキストを保持します。
    html]# tar --selinux -cf test.tar file{1,2,3}
  4. root で test/ という名前の新規 ディレクトリーを作成し、すべてのユーザーがそのディレクトリーにフルアクセスできるようにします。
    ~]# mkdir /test
    ~]# chmod 777 /test/
  5. test.tar ファイルを test/ にコピーします。
    ~]$ cp /var/www/html/test.tar /test/
  6. test/ ディレクトリーに移動します。このディレクトリーに移動したら、以下のコマンドを入力して tar アーカイブを展開します。--selinux オプションを再度指定します。指定しないと、SELinux コンテキストが default_t に変更されます。
    ~]$ cd /test/
    test]$ tar --selinux -xvf test.tar
  7. SELinux コンテキストを表示します。httpd_sys_content_t タイプは、default_t に変更されずに保持されました。これは 、--selinux が使用されていました。
    test]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.tar
    
  8. root として test/ ディレクトリーが必要なくなった場合は、以下のコマンドを実行してそのディレクトリーとそのファイルをすべて削除します。
    ~]# rm -ri /test/
すべての拡張属性を保持する --xattrs オプションなど tar に関する詳細は、tar(1) man ページを参照してください。

4.10.5. star のあるファイルのアーカイブ

star ユーティリティーは、デフォルトで拡張属性を保持しません。SELinux コンテキストは拡張属性に格納されるため、ファイルのアーカイブ時にコンテキストが失われる可能性があります。star -xattr -H=exustar コマンドを使用して、コンテキストを保持するアーカイブを作成します。star パッケージはデフォルトでインストールされません。 をインストールするには、root ユーザーとして yum install star コマンドを実行します。
以下の例は、SELinux コンテキストを保持する アーカイブの作成を示しています。

手順4.18 のアーカイブの作成

  1. root として、/var/www/html/ に 3 つのファイル(file1、file2、および file3)を作成します。これらのファイルは、/var/www/html/ から httpd_sys_content_t タイプを継承します。
    ~]# touch /var/www/html/file{1,2,3}
    ~]# ls -Z /var/www/html/
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 file3
    
  2. /var/www/html/ ディレクトリーに移動します。このディレクトリーに移動したら、root で以下のコマンドを実行して test.star という名前の のアーカイブを作成します。
    ~]$ cd /var/www/html
    html]# star -xattr -H=exustar -c -f=test.star file{1,2,3}
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
    
  3. root で test/ という名前の新規 ディレクトリーを作成し、すべてのユーザーがそのディレクトリーにフルアクセスできるようにします。
    ~]# mkdir /test
    ~]# chmod 777 /test/
  4. 以下のコマンドを入力して、test.star ファイルを test / にコピーします。
    ~]$ cp /var/www/html/test.star /test/
  5. test/ に変更します。このディレクトリーに移動したら、以下のコマンドを実行して アーカイブを展開します。
    ~]$ cd /test/
    test]$ star -x -f=test.star 
    star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
    
  6. SELinux コンテキストを表示します。httpd_sys_content_t タイプは、default_t に変更されずに保持されました。これは、- xattr -H=exustar オプションが使用されていました。
    ~]$ ls -lZ /test/
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file1
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file2
    -rw-r--r--  user1 group1 unconfined_u:object_r:httpd_sys_content_t:s0 file3
    -rw-r--r--  user1 group1 unconfined_u:object_r:default_t:s0 test.star
    
  7. root として test/ ディレクトリーが必要なくなった場合は、以下のコマンドを実行してそのディレクトリーとそのファイルをすべて削除します。
    ~]# rm -ri /test/
  8. star がなくなった場合は、root でパッケージを削除します。
    ~]# yum remove star
star の詳細は、star(1) man ページを参照してください。


[6] matchpathcon の詳細は、matchpathcon(8) man ページを参照してください。

4.11. 情報収集ツール

下記のユーティリティーは、アクセスベクターキャッシュの統計やクラス、タイプ、ブール値数など、適切にフォーマットされた情報を提供するコマンドラインツールです。

avcstat

このコマンドは、起動以降、access vector キャッシュ統計の短い出力を提供します。時間間隔を秒単位で指定すると、リアルタイムで統計を確認できます。これにより、初期出力以降に更新された統計が提供されます。使用される統計ファイルは /sys/fs/selinux/avc/cache_stats で、- f /path/to/file オプションで別のキャッシュファイルを指定できます。
~]# avcstat 
   lookups       hits     misses     allocs   reclaims      frees
  47517410   47504630      12780      12780      12176      12275

seinfo

このユーティリティーは、クラスの数、タイプ、ブール値、許可ルールなどのポリシー内の内訳を記述する際に便利です。se info は、policy.conf ファイル、バイナリーポリシーファイル、ポリシーパッケージのモジュラーリスト、またはポリシーリストファイルを入力として使用するコマンドラインユーティリティーです。seinfo ユーティリティーを使用するには、setools-console パッケージがインストールされている必要があります。
seinfo の出力は、バイナリーファイルとソースファイルによって異なります。たとえば、ポリシーソースファイルは { } 括弧を使用して、複数のルール要素を 1 行にグループ化します。同様の効果は、1 つの属性が 1 つまたは多数の型に拡張される属性で行われます。これらは拡張され、バイナリーポリシーファイルに関係しないため、検索結果に戻り値はゼロになります。ただし、ルールの数は、以前は括弧を使用した行ごとに 1 行ずつ、個々の行数であるため、大幅に増大します。
バイナリーポリシーには、一部の項目が存在しない。たとえば、notallow ルールは、ポリシーコンパイル時だけでなく、ランタイム時ではなく、初期セキュリティー識別子(SID)はバイナリーポリシーの一部ではありません。これは、システムの起動時にポリシーを読み込む前に必要であるため、バイナリーポリシーの一部ではありません。
~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)

   Classes:            77    Permissions:       229
   Sensitivities:       1    Categories:       1024
   Types:            3001    Attributes:        244
   Users:               9    Roles:              13
   Booleans:          158    Cond. Expr.:       193
   Allow:          262796    Neverallow:          0
   Auditallow:         44    Dontaudit:      156710
   Type_trans:      10760    Type_change:        38
   Type_member:        44    Role allow:         20
   Role_trans:        237    Range_trans:      2546
   Constraints:        62    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             22
   Genfscon:           82    Portcon:           373
   Netifcon:            0    Nodecon:             0
   Permissives:        22    Polcap:              2
seinfo ユーティリティーは、domain 属性でタイプ数も一覧表示でき、制限のあるプロセスの数を見積もることができます。
~]# seinfo -adomain -x | wc -l
550
すべてのドメインタイプが制限のある訳ではありません。制限のないドメインの数を確認するには、unconfined _domain 属性を使用します。
~]# seinfo -aunconfined_domain_type -x | wc -l
52
Permissive ドメインは 、--permissive オプションでカウントできます。
~]# seinfo --permissive -x | wc -l
31
上記のコマンドで追加の | wc -l コマンドを削除して、完全な一覧を確認します。

sesearch

sesearch ユーティリティーを使用して、ポリシー内の特定のルールを検索できます。ポリシーソースファイルまたはバイナリーファイルのいずれかを検索することができます。以下は例になります。
~]$ sesearch --role_allow -t httpd_sys_content_t
Found 20 role allow rules:
   allow system_r sysadm_r;
   allow sysadm_r system_r;
   allow sysadm_r staff_r;
   allow sysadm_r user_r;
   allow system_r git_shell_r;
   allow system_r guest_r;
   allow logadm_r system_r;
   allow system_r logadm_r;
   allow system_r nx_server_r;
   allow system_r staff_r;
   allow staff_r logadm_r;
   allow staff_r sysadm_r;
   allow staff_r unconfined_r;
   allow staff_r webadm_r;
   allow unconfined_r system_r;
   allow system_r unconfined_r;
   allow system_r user_r;
   allow webadm_r system_r;
   allow system_r webadm_r;
   allow system_r xguest_r;
sesearch ユーティリティーは、許可 ルールの数を提供できます。
~]# sesearch --allow | wc -l
262798
また、of dontaudit ルールの数は以下のようになります。
~]# sesearch --dontaudit | wc -l
156712

4.12. SELinux ポリシーモジュールの優先順位付けと無効化

/etc/selinux/ の SELinux モジュールストレージを使用すると、SELinux モジュールに優先順位を使用できます。root で以下のコマンドを実行して、別の優先順位を持つ 2 つのモジュールディレクトリーを表示します。
~]# ls /etc/selinux/targeted/active/modules
100  400  disabled
semodule ユーティリティーで使用されるデフォルトの優先度は 400 ですが、selinux-policy パッケージで使用される優先度は 100 であるため、優先度 100 でインストールされた SELinux モジュールの大半を確認できます。
優先順位を使用すると、同じ名前のモジュールで既存のモジュールを上書きできます。名前と異なる優先度が同じモジュールが多い場合は、ポリシーを構築するときに最も優先度が高いモジュールのみが使用されます。

例4.1 SELinux ポリシーモジュールの優先度の使用

変更されたファイルコンテキストで新しいモジュールを準備します。semodule -i コマンドでモジュールをインストールし、モジュールの優先度を 400 に設定します。以下の例で sandbox.pp を使用します。
~]# semodule -X 400 -i sandbox.pp
~]# semodule --list-modules=full | grep sandbox
400 sandbox           pp
100 sandbox           pp
デフォルトモジュールに戻るには、root で semodule -r コマンドを実行します。
~]# semodule -X 400 -r sandbox
libsemanage.semanage_direct_remove_key: sandbox module at priority 100 is now active.

システムポリシーモジュールの無効化

システムポリシーモジュール を無効にするには、root で以下のコマンドを入力します。
semodule -d MODULE_NAME
警告
semodule -r コマンドを使用してシステムポリシーモジュール を削除すると、システムのストレージで削除されます。すべてのシステムポリシーモジュール を復元する際に selinux-policy-targeted パッケージの不要な再インストールを回避するには、代わりに semodule -d コマンドを使用します。

4.13. Multi-Level Security (MLS)

マルチレベルのセキュリティー技術は、Bell-La Padula Mandatory Access Model を適用するセキュリティースキームを指します。MLS では、ユーザーおよびプロセスは subjects と呼ばれ、システムのファイル、デバイス、およびその他のパッシブコンポーネントは オブジェクト と呼ばれます。サブジェクトとオブジェクトの両方にセキュリティーレベルのラベルが付けられ、サブジェクトの明確さやオブジェクトの分類が必要になります。各セキュリティーレベルは、機密性カテゴリー で構成されています。たとえば、内部リリーススケジュールは、機密機密性を持つ内部ドキュメントカテゴリー下に記載されています。
図4.1「クリアランスのレベル」 は、米国のコミュニティーが元々設計されているクリアランスレベルを示しています。上記の内部スケジュールの例では、機密クリアランスを取得したユーザーのみが、機密カテゴリーのドキュメントを表示することができます。ただし、機密クリアランスのみが割り当てられているユーザーは、より高いレベルまたはクリアランスを必要とするドキュメントを表示することはできません。これらの読み取りアクセスは、より低いレベルのクリアランスを持つドキュメントにのみ読み取りアクセスでき、より高いレベルのクリアランスを持つドキュメントへの書き込みアクセスが可能です。

図4.1 クリアランスのレベル

クリアランスのレベル
図4.2「MLS を使用した許可されるデータフロー」 「Secret」のセキュリティレベルで実行されているサブジェクトと、異なるセキュリティーレベルを持つ各種オブジェクト間の許可されるデータフローをすべて表示します。単純な用語では、Bell-LaPadula モデルは、no read up と no write down の 2 つのプロパティーを強制します。

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

MLS を使用した許可されるデータフロー

4.13.1. MLS およびシステム権限

MLS アクセスルールは、常に従来のアクセスパーミッション(ファイルパーミッション)に統合されます。たとえば、セキュリティーレベルが「Secret」のユーザーが、DAC (Discretionary Access Control) を使用して他のユーザーによるファイルへのアクセスをブロックした場合、セキュリティーレベルのユーザーによるアクセスもブロックされます。SELinux MLS ポリシールールが DAC ルール の後に チェックされていることを覚えておくことが重要です。セキュリティーのクリアランスが高くても、ファイルシステムを任意でブラウズするパーミッションが自動的に付与されません。
トップレベルの許可があるユーザーは、マルチレベルのシステムで自動的に管理者権限を取得しません。コンピューターのすべての情報にアクセスできる場合もありますが、管理者権限を設定するのとは異なります。

4.13.2. SELinux での MLS の有効化

注記
X Window System を実行しているシステムで MLS ポリシーを使用することは推奨されません。
以下の手順に従って、システムで SELinux MLS ポリシーを有効にします。

手順4.19 SELinux MLS ポリシーの有効化

  1. selinux-policy-mls パッケージをインストールします。
    ~]# yum install selinux-policy-mls
  2. MLS ポリシーを有効にする前に、ファイルシステムの各ファイルに MLS ラベルでラベルを付ける必要があります。ファイルシステムの再ラベルが追加されると、制限のあるドメインへのアクセスが拒否される可能性があります。これにより、システムが正常に起動できなくなる可能性があります。これが発生しないようにするには、/etc/selinux/config ファイルで SELINUX=permissive を設定します。また、SELINUXTYPE=mls を設定して MLS ポリシーを有効にします。設定ファイルは以下のようになります。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
    
  3. SELinux が Permissive モードで実行されていることを確認します。
    ~]# setenforce 0
    ~]$ getenforce
    Permissive
    
  4. fixfiles スクリプトを使用して、- F オプションを含む /.autorelabel ファイルを作成し、次回の再起動時にファイルが再ラベル付けされるようにします。
    ~]# fixfiles -F onboot
  5. システムを再起動します。次回の起動時に、MLS ポリシーに従ってすべてのファイルシステムの再ラベル付けが行われます。ラベルプロセスでは、適切な SELinux コンテキストですべてのファイルにラベルを付けます。
    *** Warning -- SELinux mls policy relabel is required.
    *** Relabeling could take a very long time, depending on file
    *** system size and speed of hard drives.
    ***********
    
    一番下の行の * (アスタリスク)文字は、ラベル付けされている 1000 ファイルを表します。上記の例では、eleven * 文字はラベルが付けられた 11000 ファイルを表します。すべてのファイルにラベルを付けるのにかかる時間は、システム上のファイル数やハードディスクドライブの速度によって異なります。最新のシステムでは、このプロセスに 10 分程度かかる場合があります。ラベル付けプロセスが完了すると、システムが自動的に再起動します。
  6. Permissive モードでは、SELinux ポリシーは実行されませんが、Enforcing モードで実行している場合に拒否されたアクションの拒否がログに記録されます。Enforcing モードに切り換える前に、root で以下のコマンドを実行して、SELinux が最後の起動時にアクションを拒否していないことを確認します。SELinux が最後の起動時にアクションを拒否しなかった場合、このコマンドは出力を返しません。システムの起動時に SELinux がアクセスを拒否した場合は、トラブルシューティングに関する情報は、「 11章トラブルシューティング 」を参照してください。
    ~]# grep "SELinux is preventing" /var/log/messages
  7. /var/log/messages ファイルに拒否メッセージがない場合や、既存のすべての拒否を解決した場合は、/ etc/selinux/config ファイルで SELINUX=enforcing を設定します。
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these two values:
    #       targeted - Targeted processes are protected,
    #       mls - Multi Level Security protection.
    SELINUXTYPE=mls
    
  8. システムを再起動して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    MLS ポリシーが有効化されます。
    ~]# sestatus |grep mls
    Policy from config file:        mls
    

4.13.3. 特定の MLS 範囲でのユーザーの作成

以下の手順に従って、特定の MLS 範囲を持つ新しい Linux ユーザーを作成します。

手順4.20 特定の MLS 範囲でのユーザーの作成

  1. useradd コマンドを使用して新しい Linux ユーザーを追加し、新しい Linux ユーザーを既存の SELinux ユーザー(この場合は staff_u)にマッピングします。
    ~]# useradd -Z staff_u john
  2. 新たに作成した Linux ユーザーをパスワードに割り当てます。
    prompt~]# passwd john
  3. root で以下のコマンドを実行して、SELinux と Linux ユーザー間のマッピングを表示します。出力は以下のようになります。
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s0-s15:c0.c1023      *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
  4. ユーザー john の特定の範囲を定義します。
    ~]# semanage login --modify --range s2:c100 john
  5. SELinux と Linux ユーザー間のマッピングを再度表示します。ユーザー john には、特定の MLS 範囲が定義されていることに注意してください。
    ~]# semanage login -l
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          user_u               s0-s0                *
    john                 staff_u              s2:c100              *
    root                 root                 s0-s15:c0.c1023      *
    staff                staff_u              s0-s15:c0.c1023      *
    sysadm               staff_u              s0-s15:c0.c1023      *
    system_u             system_u             s0-s15:c0.c1023      *
  6. 必要に応じて、john のホームディレクトリーでラベルを修正するには、以下のコマンドを入力します。
    ~]# chcon -R -l s2:c100 /home/john

4.13.4. 連続したディレクトリーの設定

/tmp ディレクトリーおよび /var/tmp/ ディレクトリーは、通常、すべてのプログラム、サービス、およびユーザーが一時ストレージに使用されます。ただし、このような設定により、これらのディレクトリーは競合状態攻撃に対して脆弱になり、ファイル名に基づく情報漏えいが生じます。SELinux は、polyinstantiated ディレクトリーの形式でソリューションを提供します。つまり、/tmp/var/tmp/ の両方がインスタンス化され、各ユーザーにプライベートが表示されることを意味します。ディレクトリーのインスタンス化が有効な場合は、各ユーザーの /tmp および / var/tmp/ ディレクトリーは /tmp-inst および / var/tmp/inst に自動的にマウントされます。
以下の手順に従って、ディレクトリーのポリゼーションを有効にします。

手順4.21 ポーザーディレクトリーの有効化

  1. /etc/security/namespace.conf ファイルの最後の 3 行のコメントを解除して、/ tmp/var/tmp/、およびユーザーのホームディレクトリーのインスタンス化を可能にします。
    ~]$ tail -n 3 /etc/security/namespace.conf
    /tmp     /tmp-inst/            level      root,adm
    /var/tmp /var/tmp/tmp-inst/    level      root,adm
    $HOME    $HOME/$USER.inst/     level
    
  2. /etc/pam.d/login ファイルで、pam_namespace.so モジュールがセッションに設定されていることを確認します。
    ~]$ grep namespace /etc/pam.d/login
    session    required     pam_namespace.so
    
  3. システムを再起動します。

4.14. ファイル名の移行

ファイル名の 遷移 機能により、ポリシーライターはポリシー移行ルールを書き込む際にファイル名を指定できます。以下のような状態となっているルールを作成することができます。A_t というラベルが付いたプロセスによって B_t というラベルが付いたオブジェクトクラスが作成され、指定されたオブジェクトクラスの名前が objectname の場合、ラベル C_t が取得されます。このメカニズムにより、システムのプロセスをより詳細に制御できます。
ファイル名の移行がない場合、オブジェクトにラベルを付ける方法は 3 つあります。
  • デフォルトでは、オブジェクトは親ディレクトリーからラベルを継承します。たとえば、ユーザーが etc _t というラベルが付いたディレクトリーにファイルを作成した場合には、ファイルに etc_t というラベルが付けられます。ただし、この方法は、ラベルが異なるディレクトリー内に複数のファイルを持つことが望ましい場合に便利です。
  • ポリシー作成者は、以下を示すポリシーにルールを作成できます。A_t タイプのプロセスが B_t というラベルが付いたディレクトリーに指定されたオブジェクトクラスを作成する場合、 オブジェクトは新しい C_t ラベルを取得します。このプラクティスは、1 つのプログラムが同じディレクトリーに複数のオブジェクトを作成する場合に問題があり、各オブジェクトには別個のラベルが必要です。さらに、作成されたオブジェクトの名前が指定されていないため、これらのルールは部分的な制御のみを提供します。
  • 特定のアプリケーションでは、このようなアプリケーションが、特定のパスのラベルがあるのかをシステムに要求できるようにする SELinux 認識があります。次に、これらのアプリケーションはカーネルを要求し、必要なラベルの付いたオブジェクトを作成します。SELinux 認識のあるアプリケーションの例は、rpm パッケージマネージャー、restorecon ユーティリティー、または udev デバイスマネージャーです。ただし、SELinux 認識でファイルまたはディレクトリーを作成するすべてのアプリケーションに指示することはできません。作成後に、正しいラベルでオブジェクトの再ラベル付けが必要になることがよくあります。それ以外の場合は、制限のあるドメインがオブジェクトの使用を試みると、AVC メッセージが返されます。
ファイル名の移行機能は、誤ったラベルに関連する問題を減らし、システムをよりセキュアに強化します。ポリシー作成者は、特定のアプリケーションが、指定されたディレクトリーにある名前が指定された名前のファイルしか作成できないと適切に記述できます。ルールはファイルパスではなく、ファイル名を考慮に入れます。これはファイルパスのベース名です。ファイル名の遷移は、strcmp() 関数で行われる完全一致を使用することに注意してください。正規表現またはワイルドカード文字の使用は考慮されません。
注記
ファイルパスは、カーネルとファイル名の移行によって異なるため、ラベルの判別にパスを使用しません。その結果、この機能は初期ファイル作成にのみ影響し、すでに作成されるオブジェクトの正しくないラベルを修正しません。

例4.2 ファイル名の移行に関するポリシールールの例

以下の例では、ファイル名の移行が含まれるポリシールールを示しています。
filetrans_pattern(unconfined_t, admin_home_t, ssh_home_t, dir, ".ssh")
このルールは、unconfined_t タイプのプロセスが admin_home_t というディレクトリーに ~/.ssh/ ディレクトリーを作成すると、~/.ssh / ディレクトリーはラベル ssh_home_t を取得します
ファイル名の移行で作成されたポリシールールの例を以下に示します。
filetrans_pattern(staff_t, user_home_dir_t, httpd_user_content_t, dir, "public_html")
filetrans_pattern(thumb_t, user_home_dir_t, thumb_home_t, file, "missfont.log")
filetrans_pattern(kernel_t, device_t, xserver_misc_device_t, chr_file, "nvidia0")
filetrans_pattern(puppet_t, etc_t, krb5_conf_t, file, "krb5.conf")
注記
ファイル名の移行機能は主にポリシー作成者に影響しますが、ユーザーは、含まれるディレクトリーのデフォルトラベルでほぼ常に作成されるファイルオブジェクトではなく、一部のファイルオブジェクトはポリシーで指定されるものとは異なるラベルを持つことに注意してください。

4.15. ptrace()の無効化

ptrace() システムコールを使用すると、1 つのプロセスが別のプロセスの実行を確認し、そのメモリーとレジスタを変更できるようになります。この呼び出しは、主に、strace ユーティリティーを使用する場合など、デバッグ時に開発者が使用します。ptrace() が必要ない場合は、システムセキュリティーを改善するために無効にできます。これは、deny_ptrace ブール値を有効にして実行できます。これは、unconfined_t ドメインで実行されているプロセスであっても、他のプロセスで ptrace() を使用できなくなります。
deny_ptrace ブール値はデフォルトで無効になっています。これを有効にするには、root ユーザーで setsebool -P deny_ptrace on コマンドを実行します。
~]# setsebool -P deny_ptrace on
このブール値が有効になっているかどうかを確認するには、以下のコマンドを使用します。
~]$ getsebool deny_ptrace
deny_ptrace --> on
このブール値を無効にするには、root で setsebool -P deny_ptrace off コマンドを実行します。
~]# setsebool -P deny_ptrace off
注記
setsebool -P コマンドは永続的な変更を行います。再起動後も変更が 維持しない場合は、-P オプションを使用しないでください。
このブール値は、Red Hat Enterprise Linux に含まれるパッケージにのみ影響します。そのため、サードパーティーパッケージは ptrace()システムコールを引き続き使用し ていました。ptrace() を使用できるすべてのドメインを一覧表示するには、以下のコマンドを入力します。setools-console パッケージは sesearch ユーティリティーを提供し、パッケージはデフォルトでインストールされていないことに注意してください。
~]# sesearch -A -p ptrace,sys_ptrace -C | grep -v deny_ptrace | cut -d ' ' -f 5

4.16. サムネイル保護

サムネイルアイコンにより、攻撃者は USB デバイスや CD などのリムーバブルメディアを使用してロックされたマシンに侵入される可能性があります。システムがリムーバブルメディアを検出すると、Nautilus ファイルマネージャーはサムネイルドライバーコードを実行し、マシンがロックされていても適切なファイルブラウザーにサムネイルアイコンを表示します。サムネイル実行ファイルが脆弱であった場合、攻撃者はサムネイルドライバーコードを使用してパスワードを入力することなくロック画面を迂回する可能性があります。
したがって、このような攻撃を防ぐために、新しい SELinux ポリシーが使用されます。このポリシーにより、画面がロックされたときにすべてのサムネイルドライバーがロックされるようになります。サムネイル保護は、制限のあるユーザーと制限のないユーザーの両方で有効になります。このポリシーは以下のアプリケーションに影響します。
  • /usr/bin/evince-thumbnailer
  • /usr/bin/ffmpegthumbnailer
  • /usr/bin/gnome-exe-thumbnailer.sh
  • /usr/bin/gnome-nds-thumbnailer
  • /usr/bin/gnome-xcf-thumbnailer
  • /usr/bin/gsf-office-thumbnailer
  • /usr/bin/raw-thumbnailer
  • /usr/bin/shotwell-video-thumbnailer
  • /usr/bin/totem-video-thumbnailer
  • /usr/bin/whaaw-thumbnailer
  • /usr/lib/tumbler-1/tumblerd
  • /usr/lib64/tumbler-1/tumblerd

第5章 sepolicy Suite

sepolicy ユーティリティーは、インストールされた SELinux ポリシーをクエリーする機能スイートを提供します。これらの機能は、新しいものか、または sepolgensetrans などの別のユーティリティーによって提供されていました。スイートでは、移行レポート、man ページ、または新しいポリシーモジュールを生成できるため、ユーザーは SELinux ポリシーへのアクセスや理解がより容易になります。
policycoreutils-devel パッケージは sepolicy を提供します。root ユーザーで以下のコマンドを実行し、sepolicy をインストールします。
~]# yum install policycoreutils-devel
sepolicy スイートは、コマンドラインパラメーターとして呼び出される以下の機能を提供します。

表5.1 sepolicy 機能

機能説明
ブール値SELinux ポリシーに対してクエリーを実行してブール値の説明を確認する
通信SELinux ポリシーをクエリーし、ドメインが相互に通信できるかどうかを確認します。
生成SELinux ポリシーモジュールテンプレートの生成
GUISELinux ポリシー用のグラフィカルユーザーインターフェース
interfaceSELinux ポリシーインターフェースの一覧表示
man ページのSELinux の man ページの生成
networkSELinux ポリシーネットワーク情報のクエリー
遷移SELinux ポリシーのクエリーおよびプロセス移行レポートの生成

5.1. sepolicy Python バインディング

以前のバージョンの Red Hat Enterprise Linux では、se search ユーティリティーおよび se info ユーティリティーが含まれました。sesearch ユーティリティーは、SELinux ポリシーでルールを検索するために使用され、se info ユーティリティーではポリシー内の他のさまざまなコンポーネントをクエリーできます。
Red Hat Enterprise Linux 7 では、sesearch および seinfo の Python バインディングが追加され、sepolicy スイートを介してこれらのユーティリティーの機能を使用できるようになりました。以下の例を参照してください。
> python
>>> import sepolicy
>>> sepolicy.info(sepolicy.ATTRIBUTE)
Returns a dictionary of all information about SELinux Attributes
>>>sepolicy.search([sepolicy.ALLOW])
Returns a dictionary of all allow rules in the policy.

5.2. SELinux ポリシーモジュールの生成: sepolicy generate

以前のバージョンの Red Hat Enterprise Linux では、sepol gen ユーティリティーまたは selinux-polgengui ユーティリティーが、SELinux ポリシーの生成に使用されていました。これらのツールは、sepolicy スイートにマージされました。Red Hat Enterprise Linux 7 では、sepolicy generate コマンドを使用して、初期 SELinux ポリシーモジュールテンプレートを生成します。
sepolgen とは異なり、sepolicy generate を root ユーザーで実行する必要はありません。このユーティリティーは、RPM の spec ファイルも作成されます。このファイルを使用して、ポリシーパッケージファイル(NAME. pp)およびインターフェースファイル(NAME. if)を正しい場所にインストールし、SELinux ポリシーのカーネルへのインストールとラベルの修正に使用できます。設定スクリプトは、引き続き SELinux ポリシーをインストールし、ラベル付けを設定します。さらに、インストールされているポリシーに基づいた man ページは、man ページの sepolicy の man コマンドを使用して生成されます。[7] 最後に、sepolicy は SELinux ポリシーと man ページを RPM パッケージに生成してコンパイルし、他のシステムにインストールできるようにします。
sepolicy generate を実行すると、以下のファイルが生成されます。
NAME.te - type enforcing file
このファイルは、特定のドメインに対するすべてのタイプおよびルールを定義します。
NAME.if - interface file
このファイルは、システムのデフォルトファイルコンテキストを定義します。NAME.te ファイルで作成したファイルタイプを取り、ファイルパスをタイプに関連付けます。restoreconrpm などのユーティリティーでは、これらのパスを使用してラベルを書き込みます。
NAME_selinux.spec - RPM 仕様ファイル
このファイルは、SELinux ポリシーをインストールし、ラベル付けを設定する RPM 仕様ファイルです。このファイルは、インターフェースファイルと、ポリシーを説明する man ページもインストールします。sepolicy の man -d NAME コマンドを使用して、man ページを生成できます。
NAME.sh - ヘルパーシェルスクリプト
このスクリプトは、システム上のラベリングのコンパイル、インストール、修正に役立ちます。また、インストールされているポリシーをもとに man ページを生成し、コンパイルし、他のシステムにインストールされているの RPM パッケージを構築します。
SELinux ポリシーモジュールを生成できる場合、sepolicy はソースドメインからターゲットドメインへの生成されたパスをすべて出力しますsepolicy generate に関する詳細は、sepolicy-generate(8) man ページを参照してください。


[7] sepolicy の man の詳細は 「手動ページの生成: sepolicy の man を参照してください

5.3. ドメイン移行について: sepolicy の移行

以前のバージョンでは、se trans ユーティリティーは、2 つのドメインまたはプロセス間の移行が可能かどうかを確認し、これらのドメインまたはプロセス間の移行に使用されるすべての中間タイプを出力するために使用されていました。Red Hat Enterprise Linux 7 では setrans が sepolicy スイートの一部として提供され、代わりに sepolicy transition コマンドが使用されるようになりました。
sepolicy 移行 コマンドは、SELinux ポリシーをクエリーし、プロセス移行レポートを作成します。sepolicy transition コマンドでは、ソースドメイン(- s オプション)とターゲットドメイン(- t オプションで指定)の 2 つのコマンドライン引数が必要です。ソースドメインのみを入力した場合は、sepolicy migrate はソースドメインの移行可能なすべてのドメインを一覧表示します。以下の出力にはすべてのエントリーが含まれません。@ 文字は、以下を実行する ことを意味します
~]$ sepolicy transition -s httpd_t
httpd_t @ httpd_suexec_exec_t --> httpd_suexec_t
httpd_t @ mailman_cgi_exec_t --> mailman_cgi_t
httpd_t @ abrt_retrace_worker_exec_t --> abrt_retrace_worker_t
httpd_t @ dirsrvadmin_unconfined_script_exec_t --> dirsrvadmin_unconfined_script_t
httpd_t @ httpd_unconfined_script_exec_t --> httpd_unconfined_script_t
ターゲットドメインが指定されている場合、sepolicy 移行 は、ソースドメインからターゲットドメインへのすべての移行パスの SELinux ポリシーを調べ、これらのパスを一覧表示します。以下の出力は完了しません。
~]$ sepolicy transition -s httpd_t -t system_mail_t
httpd_t @ exim_exec_t --> system_mail_t
httpd_t @ courier_exec_t --> system_mail_t
httpd_t @ sendmail_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ sendmail_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ exim_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t @ courier_exec_t --> system_mail_t
httpd_t ... httpd_suexec_t ... httpd_mojomojo_script_t @ sendmail_exec_t --> system_mail_t
sepolicy の移行 に関する詳細は、sepolicy-transition(8) man ページを参照してください。

5.4. 手動ページの生成: sepolicy の man

sepolicy の man コマンドは、プロセスドメインを文書化する SELinux ポリシーに基づいて man ページを生成します。そのため、このようなドキュメントは常に最新の状態になります。自動生成された man ページの各名前は、プロセスドメイン名と、httpd_selinux などのサフィックスで構成されます
man ページには、制限のあるドメインの SELinux ポリシーの各種部分に関する情報を提供する複数のセクションが含まれています。
  • Entrypoints セクションには、ドメインの移行時に実行する必要がある実行可能ファイルがすべて含まれています。
  • Process Types セクションは、ターゲットドメインと同じ接頭辞で始まるすべてのプロセスタイプを一覧表示します。
  • ブール値 セクションは、ドメインに関連するブール値を一覧表示します。
  • Port Types セクションには、ドメインと同じ接頭辞に一致するポートタイプが含まれ、これらのポートタイプに割り当てられたデフォルトのポート番号を説明します。
  • 管理対象ファイル セクションでは、ドメインの書き込みが可能なタイプと、これらのタイプに関連付けられたデフォルトのパスを説明します。
  • File Contexts セクションには、ドメインに関連付けられたすべてのファイルタイプが含まれ、システム上のデフォルトのパスラベルとともにこれらのファイルタイプを使用する方法が説明されています。
  • 共有ファイル セクションではpublic_content_t などのドメイン共有タイプを使用する方法を説明します。
sepolicy man ページの詳細は、sepolicy-manpage(8) man ページを参照してください。

第6章 ユーザーの制限

Red Hat Enterprise Linux では、デフォルトで SELinux 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 コマンドを実行します。
たとえば、SELinux user_u ユーザーが実行するプロセスは user_t ドメインにあります。このようなプロセスはネットワークに接続できますが、su コマンドまたは sudo コマンドを実行できません。これは、システムをユーザーから保護するのに役立ちます。制限のあるユーザーとその機能の詳細は、「制限のあるユーザーおよび制限のないユーザー」表3.1「SELinux ユーザー機能」 を参照してください。

6.1. Linux および SELinux ユーザーマッピング

root で以下のコマンドを実行して、Linux ユーザーおよび SELinux ユーザー間のマッピングを表示します。
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
Red Hat Enterprise Linux では、Linux ユーザーは、デフォルトで SELinux __default__ login にマッピングされます(SELinux unconfined_u ユーザーにマッピングされます)。Linux ユーザーが useradd コマンドで作成されると、オプションが指定されていない場合には、SELinux unconfined_u ユーザーにマッピングされます。以下は、default-mapping を定義します。
__default__          unconfined_u         s0-s0:c0.c1023       *

6.2. 新規 Linux ユーザーの設定: useradd

SELinux unconfined_u ユーザーにマッピングされた Linux ユーザーは、unconfined_t ドメインで実行します。これは、unconfined_u にマップされた Linux ユーザーとしてログイン中に id -Z コマンドを実行します。
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Linux ユーザーが unconfined_t ドメインで実行されると、SELinux ポリシールールが適用されますが、unconfined_t ドメインで実行している Linux ユーザーを許可するポリシールールが存在します。制限のない Linux ユーザーは、SELinux ポリシーが unconfined_t ドメインから自身の制限のあるドメインに移行できるアプリケーションを実行すると、制限のない Linux ユーザーはその制限のあるドメインの制限を受けます。このセキュリティー上の利点は、Linux ユーザーが制限されていませんが、アプリケーションの制限のないままであるため、アプリケーションの不具合の悪用はポリシーによって制限される可能性があります。
注記
これにより、システムがユーザーから保護されません。代わりに、アプリケーションとシステムがアプリケーションの不具合によって生じる可能性のある破損から保護されます。
useradd コマンドで Linux ユーザーを作成する場合は、- Z オプションを使用して、マッピングされる SELinux ユーザーを指定します。以下の例では、新しい Linux ユーザー useruuser を作成し、そのユーザーを SELinux の user_u ユーザーにマッピングします。SELinux の user_u ユーザーにマッピングされた Linux ユーザーは、user_t ドメインで実行します。このドメインでは、SELinux ポリシーで( passwdなど)SELinux ポリシーが許可しない限り、Linux ユーザーは setuid アプリケーションを実行できません。これは、su コマンドまたは sudo コマンドを実行できず、このコマンドで root ユーザーになるのを防ぎます。

手順6.1 SELinux ユーザーへの新しい Linux ユーザーの制限

  1. root で、SELinux user_uユーザーにマップされる新しい Linux ユーザー(ユーザー) を作成します。
    ~]# useradd -Z user_u useruuser
  2. useruuser と user _u 間のマッピングを表示するには、root で次のコマンドを実行します。
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    useruuser            user_u               s0                   *
    
  3. root で、Linux ユーザー にパスワードを割り当てます
    ~]# passwd useruuser
    Changing password for user useruuser.
    New password: Enter a password
    Retype new password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
  4. 現在のセッションからログアウトし、Linux useruuser ユーザーとしてログインします。ログインすると、pam_selinux モジュールは Linux ユーザーを SELinux ユーザー(この場合は user_u)にマッピングし、生成される SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを入力して、Linux ユーザーのコンテキストを表示します。
    ~]$ id -Z
    user_u:user_r:user_t:s0
    
  5. Linux useruuser のセッションからログアウトし、アカウントにログインし直します。Linux の useruuser ユーザーを使用しない場合は、root で以下のコマンドを入力して、そのホームディレクトリーでこれを削除します。
    ~]# userdel -Z -r useruuser

6.3. 既存の Linux ユーザーの制限: semanage ログイン

Linux ユーザーが SELinux unconfined_u ユーザー(デフォルトの動作)にマッピングされ、マッピングされる SELinux ユーザーを変更する場合は、semanage login コマンドを使用します。以下の例では、new user という名前の新規 Linux ユーザーを作成し、その Linux ユーザーを SELinux の user_u ユーザーにマッピングします。

手順6.2 SELinux ユーザーへの Linux ユーザーのマッピング

  1. root で、新しい Linux ユーザー(newuser)を作成します。このユーザーはデフォルトのマッピングを使用するため、semanage login -l の出力には表示されません。
    ~]# useradd newuser
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    
  2. Linux newuser ユーザーを SELinux の user_u ユーザーにマッピングするには、root で次のコマンドを実行します。
    ~]# semanage login -a -s user_u newuser
    -a オプションは新しいレコードを追加し、- s オプションは Linux ユーザーをマップする SELinux ユーザーを指定します。最後の引数 newuser は、指定した SELinux ユーザーにマッピングした Linux ユーザーです。
  3. Linux newuser ユーザーおよび user_u 間のマッピングを表示するには、semanage ユーティリティーを再度使用します。
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    newuser              user_u               s0                   *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    
  4. root で Linux newuser ユーザーにパスワードを割り当てます。
    ~]# passwd newuser
    Changing password for user newuser.
    New password: Enter a password
    Retype new password: Enter the same password again
    passwd: all authentication tokens updated successfully.
    
  5. 現在のセッションからログアウトし、Linux newuser ユーザーとしてログインします。以下のコマンドを実行して、new user の SELinux コンテキストを表示します。
    ~]$ id -Z
    user_u:user_r:user_t:s0
  6. Linux newuser のセッションからログアウトし、アカウントにログインし直します。Linux newuser ユーザーが必要ない場合は、root で以下のコマンドを入力して、そのホームディレクトリーとともに削除します。
    ~]# userdel -r newuser
    root で Linux newuser ユーザーおよび user_u 間のマッピングを削除します。
    ~]# semanage login -d newuser
    ~]# semanage login -l
    
    Login Name           SELinux User         MLS/MCS Range        Service
    
    __default__          unconfined_u         s0-s0:c0.c1023       *
    root                 unconfined_u         s0-s0:c0.c1023       *
    system_u             system_u             s0-s0:c0.c1023       *
    

6.4. デフォルトマッピングの変更

Red Hat Enterprise Linux では、Linux ユーザーは、デフォルトで SELinux __default__ login にマッピングされます(SELinux unconfined_u ユーザーにマッピングされます)。新しい Linux ユーザーや、デフォルトで SELinux ユーザーにマッピングされていない Linux ユーザーを使用している場合は、semanage login コマンドでデフォルトのマッピングを変更します。
たとえば、root で以下のコマンドを入力し、デフォルトのマッピングを unconfined_u から user_ u に変更します。
~]# semanage login -m -S targeted -s "user_u" -r s0 __default__
__default__ login が user_u にマッピングされていることを確認します。
~]# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          user_u               s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
system_u             system_u             s0-s0:c0.c1023       *
新しい Linux ユーザーが作成され、SELinux ユーザーが指定されていない場合、または既存の Linux ユーザーがログインし、semanage login -l の出力から特定のエントリーと一致しない場合は、_ default __ ログインに従って user_ u にマッピングされます。
デフォルトの動作に戻すには、root で以下のコマンドを入力して、__default__ ログインを SELinux unconfined_u ユーザーにマッピングします。
~]# semanage login -m -S targeted -s "unconfined_u" -r s0-s0:c0.c1023 __default__

6.5. xguest:kiosk モード

xguest パッケージは、kiosk ユーザーアカウントを提供します。このアカウントは、ライブラリー、バンク、アルポート、情報 kiosks、coffee shops など、人々を進めて使用するマシンのセキュリティーを保護するために使用されます。kiosk ユーザーアカウントは非常に制限されます。基本的に、ユーザーがログインし、Firefox を使用してインターネットの Web サイトを閲覧することができます。ゲストユーザーは xguest_u に割り当てられています。表3.1「SELinux ユーザー機能」 を参照してください。ファイルの作成や設定の変更など、このアカウントでログイン中に行われた変更は、ログアウト時に失われます。
kiosk アカウントを設定するには、以下を実行します。
  1. root で xguest パッケージをインストールします。必要に応じて依存関係をインストールします。
    ~]# yum install xguest
  2. さまざまなユーザーが kiosk アカウントを使用できるようにするために、そのアカウントはパスワード保護ではなく、SELinux が Enforcing モードで実行している場合にのみアカウントを保護できます。このアカウントでログインする前に、getenforce ユーティリティーを使用して SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    この場合、Enforcing モードへの変更に関する情報は、「 「SELinux の状態およびモードの永続的な変更」 」を参照してください。SELinux が Permissive モードになっているか、無効になっている場合は、このアカウントでログインできません。
  3. GNOME Display Manager(GDM)を使用して、このアカウントにのみログインできます。xguest パッケージがインストールされると、Guest アカウントが GDM ログイン画面に追加されます。

6.6. ユーザー実行アプリケーションのブール値

Linux ユーザーが、ホームディレクトリーと /tmp ディレクトリーに(ユーザーのパーミッションを継承する)アプリケーションの実行を許可せず、欠陥のあるアプリケーションや悪意のあるアプリケーションが、ユーザーが所有するファイルを変更できないようにします。
この動作を変更するにはブール値を使用でき、setsebool ユーティリティーで設定できます。これは root で実行する必要があります。setsebool -P コマンドは永続的な変更を行います。再起動後も変更が 維持する必要がない場合は、-P オプションを使用しないでください。

guest_t

guest_t ドメインの Linux ユーザーがホームディレクトリーおよび /tmp でアプリケーションを実行 しないようにするには、以下を実行します。
~]# setsebool -P guest_exec_content off

xguest_t

xguest_t ドメインの Linux ユーザーがホームディレクトリーと /tmp でアプリケーションを実行 しないようにするには、以下を実行します。
~]# setsebool -P xguest_exec_content off

user_t

user_t ドメインの Linux ユーザーがホームディレクトリーおよび /tmp でアプリケーションを実行 しないようにするには、以下を実行します。
~]# setsebool -P user_exec_content off

staff_t

staff_t ドメインの Linux ユーザーがホームディレクトリーおよび /tmp でアプリケーションを実行 しないようにするには、以下を実行します。
~]# setsebool -P staff_exec_content off
staff_exec_content ブール値をオンにし、staff_t ドメインの Linux ユーザーがホームディレクトリーおよび /tmp でアプリケーションを実行できるようにするには、以下を実行します。
~]# setsebool -P staff_exec_content on

第7章 Sandbox を使用したプログラムのセキュリティー保護

sandbox security ユーティリティーは、システム管理者が制限した SELinux ドメイン内でアプリケーションを実行することを可能にする一連の SELinux ポリシーを追加します。新規ファイルを開くパーミッションやネットワークへのアクセス許可の制限を定義できます。これにより、システムへの破損のリスクを及ぼさずに、信頼できないソフトウェアの処理特性を安全にテストできるようになります。

7.1. Sandbox を使用したアプリケーションの実行

sandbox ユーティリティーを使用する前に、policycoreutils-sandbox パッケージがインストールされている必要があります。
~]# yum install policycoreutils-sandbox
アプリケーションを制限する基本的な構文は次のとおりです。
~]$ sandbox [options] application_under_test
サンドボックス でグラフィカルアプリケーションを実行するには、- X オプションを使用します。以下は例になります。
~]$ sandbox -X evince
-X は、必要なリソースをコピーし、ユーザーのホームディレクトリー または /tmp ディレクトリーにクローズされた仮想環境を作成する前に、アプリケーション(この場合は evince)に制限のあるセカンダリー X サーバーをセットアップするように サンドボックス に指示します。
1 つのセッションから次のセッションにデータを保存するには、以下を行います。
~]$ 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_net_t ラベルを使用すると、すべてのネットワークポートへの無制限の双方向ネットワークアクセスが許可されます。sandbox_web_t は、Web 参照に必要なポートのみへの接続を許可します。
sandbox_net_t の使用は、必要な場合にのみ注意する必要があります。
詳細は sandbox(8) man ページと、利用可能なオプションの詳細な一覧を参照してください。

第8章 sVirt

sVirt は、SELinux と仮想化を統合する Red Hat Enterprise Linux に含まれるテクノロジーです。sVirt は Mandatory Access Control(MAC)を適用し、仮想マシンの使用時にセキュリティーを強化します。これらの技術を統合する主な理由は、セキュリティーを改善し、ホストまたは他の仮想マシンに攻撃ベクトルとして使用される可能性があるハイパーバイザー内のバグに対してシステムを強化することです。
本章では、sVirt が Red Hat Enterprise Linux で仮想化テクノロジーと統合する方法を説明します。

非仮想化環境

非仮想化環境では、ホストは物理的に相互を分離しており、各ホストには Web サーバーや DNS サーバーなどのサービスで構成される自己完結型の環境があります。これらのサービスは、独自のユーザースペース、ホストカーネル、物理ホストと直接通信して、ネットワークに直接サービスを提供します。以下の図は、非仮想化環境を示しています。

仮想化環境

仮想化環境では、1 台のホストカーネルと物理ホスト内に複数のオペレーティングシステムを(ゲストとして)配置できます。次のイメージは、仮想化環境を表しています。

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

サービスが仮想化されていない場合は、マシンは物理的に分離されています。ネットワーク攻撃の明らかを除き、通常、エクスプロイトは通常影響を受けるマシンに含まれます。仮想化環境でサービスをグループ化すると、システムに追加の脆弱性が発生します。ハイパーバイザーに、ゲストインスタンスにより悪用される可能性のあるセキュリティー脆弱性がある場合、このゲストはホストだけでなく、そのホストで実行されている他のゲストも攻撃される可能性があります。これは理論上ではなく、攻撃はハイパーバイザーにすでに存在します。これらの攻撃はゲストインスタンスを超えて拡張し、他のゲストを攻撃に公開できます。
sVirt は、ゲストを分離し、悪用した場合にさらなる攻撃を開始する機能を制限する作業です。これは、以下の図で示しています。この場合、攻撃は仮想マシンから抜けなくなり、別のホストインスタンスに拡張できません。
SELinux では、Mandatory Access Control(MAC)の実装で、仮想インスタンス用のプラグ可能なセキュリティーフレームワークが導入されました。sVirt フレームワークにより、ゲストとそのリソースを一意にラベル付けできます。ラベルを付けてルールを適用でき、異なるゲスト間のアクセスを拒否することができます。

8.2. sVirt のラベル付け

SELinux の保護下にある他のサービスと同様に、sVirt はプロセスベースのメカニズムと制限を使用して、ゲストインスタンスに対するセキュリティー層をさらに提供します。通常の使用では、sVirt がバックグラウンドで動作していることにも気付くことはできません。本セクションでは、sVirt のラベル付け機能について説明します。
以下の出力にあるように、sVirt を使用する場合、各仮想マシンに動的に生成されるレベルでラベルが付けられ、実行されます。各プロセスは、異なるレベルを持つ他の仮想マシンから分離されます。
~]# ps -eZ | grep qemu

system_u:system_r:svirt_t:s0:c87,c520 27950 ?  00:00:17 qemu-kvm
system_u:system_r:svirt_t:s0:c639,c757 27989 ? 00:00:06 qemu-system-x86
以下の出力にあるように、実際のディスクイメージには、プロセスに一致するように自動的にラベルが付けられます。
~]# ls -lZ /var/lib/libvirt/images/*

system_u:object_r:svirt_image_t:s0:c87,c520   image1
以下の表は、sVirt を使用する際に割り当てられる各種ラベルの概要を示しています。

表8.1 sVirt ラベル

タイプSELinux Context説明
仮想マシンプロセスsystem_u:system_r:svirt_t:MCS1MCS1 は無作為に選択された MCS フィールドです。現在は、約 500,000 のラベルがサポートされています。
仮想マシンのイメージsystem_u:object_r:svirt_image_t:MCS1同じ MCS フィールドで設定されたvirt _t のプロセスのみが、これらのイメージファイルとデバイスの読み取り/書き込みが可能です。
仮想マシンの共有読み取り/書き込みコンテンツsystem_u:object_r:svirt_image_t:s0svirt_t というラベルが付いたすべてのプロセスは、svirt_image_t:s0 ファイルとデバイスに書き込むことができます。
仮想マシンのイメージsystem_u:object_r:virt_content_t:s0イメージが存在する場合に使用されるシステムのデフォルトラベル。svirt_t 仮想プロセスは、このラベルの付いたファイル/デバイスの読み取りはできません。
sVirt を使用する場合は、静的ラベリングを実行することもできます。静的ラベルにより管理者は、仮想マシン用に MCS/MLS フィールドなどの特定のラベルを選択できます。静的なラベルが付いた仮想マシンを実行する管理者は、イメージファイルに正しいラベルを設定する責任を担います。仮想マシンは常にそのラベルで起動し、sVirt システムは静的なラベルが付いた仮想マシンコンテンツのラベルを変更しません。これにより、sVirt コンポーネントを MLS 環境で実行できます。要件に合わせて、システムに異なる機密レベルを持つ複数の仮想マシンを実行することもできます。

第9章 セキュアな Linux コンテナー

Linuxコンテナー(LXC)は、システム上の同時に同じサービスのコピーを複数実行できる低レベルの仮想化機能です。完全な仮想化と比較すると、コンテナーは新規システム全体を起動する必要がないため、使用するメモリーが少なくなり、読み取り専用の方法でベースオペレーティングシステムを使用できます。たとえば、LXC を使用すると、複数の Web サーバーを同時に実行でき、システムデータを共有し、さらに root ユーザーとして実行することもできます。ただし、コンテナーで特権プロセスを実行すると、他のコンテナーで実行されているコンテナーまたはプロセス以外で実行されている他のプロセスに影響を及ぼす可能性があります。Linux コンテナーを保護すると、SELinux コンテキストを使用するため、そのコンテナー内で実行しているプロセスが、ホストやホストと対話できなくなります。
Docker アプリケーションは、Red Hat Enterprise Linux で Linux コンテナーを管理するためのメインユーティリティーです。別の方法として、libvirt パッケージが提供する virsh コマンドラインユーティリティーを使用することもできます。
Linux コンテナーの詳細は、『 Getting Started with Containers 』を参照してください。

第10章 SELinux systemd アクセス制御

Red Hat Enterprise Linux 7 では、システムサービスは systemd デーモンによって制御されます。Red Hat Enterprise Linux の以前のリリースでは、デーモンは 2 つの方法で起動できました。
  • System V init デーモンは起動時に init .rc スクリプトを起動し、このスクリプトが必要なデーモンを起動した。たとえば、システムの起動時に起動された Apache サーバーは、以下の SELinux ラベルを取得しています。
    system_u:system_r:httpd_t:s0
  • 管理者が init.rc スクリプトを手動で起動しているため、デーモンが実行されます。たとえば、Apache サーバーで service httpd restart コマンドが呼び出されると、生成される SELinux ラベルは以下のようになります。
    unconfined_u:system_r:httpd_t:s0
手動で起動すると、プロセスが開始する SELinux ラベルのユーザーの部分を採用し、上記の 2 つのシナリオでのラベル付けに一貫性がありません。systemd デーモンでは、移行は非常に異なります。systemd は、init _t タイプを使用して、システム上のデーモンを開始および停止するすべての呼び出しを処理するため、デーモンを手動で再起動する際にラベルのユーザー部分を上書きできます。その結果、上記の両方のシナリオのラベルが想定通りに system_u:system_r:httpd_t:s0 になり、SELinux ポリシーが改善され、どのドメインがどのユニットを制御するかを制御することができます。

10.1. サービスの SELinux アクセスパーミッション

以前のバージョンの Red Hat Enterprise Linux では、管理者はシステム V Init スクリプトのラベルに基づいてサービスを開始または停止できるユーザーやアプリケーションを制御できました。systemd が全サービスを開始および停止し、ユーザーおよびプロセスが systemctl ユーティリティーを使用して systemd と通信できるようになりました。systemd デーモンには、SELinux ポリシーを確認し、呼び出しているプロセスのラベルと、呼び出し元が管理するユニットファイルのラベルを確認してから、呼び出し元のアクセスを許可するかどうかを SELinux に尋ねることができます。このアプローチにより、システムサービスの開始や停止などの、重要なシステム機能へのアクセス制御が強化されます。
たとえば、管理者は、NetworkManager が systemctl を実行して systemd に D-Bus メッセージを送信し、NetworkManager が要求するサービスを開始または停止することを許可する必要がありました。実際、NetworkManager は systemctl のすべての実行 が可能でした。制限のある管理者を設定して、特定のサービスだけを起動したり、停止したりすることはできません。
これらの問題を修正するために、systemd は SELinux Access Manager としても機能します。systemctl を実行しているプロセスのラベル、または systemd に D-Bus メッセージを送信したプロセスのラベルを取得できます。次に、デーモンは、プロセスが設定するユニットファイルのラベルを探します。最後に、SELinux ポリシーでプロセスラベルとユニットファイルラベルとの間で特定のアクセスが許可されている場合、systemd はカーネルから情報を取得できます。これは、特定のサービスに対して、systemd と相互作用を必要とする、危険にさらされたアプリケーションをSELinux が制限できることを意味します。ポリシー作成者は、このような粒度の細かい制御を使用して、管理者を制限することもできます。ポリシーの変更には、以下のパーミッションのある service と呼ばれる新しいクラスが含まれます。
class service
{
       start
       stop
       status
       reload
       kill
       load
       enable
       disable
}
たとえば、ポリシーライターは、ドメインがサービスのステータスを取得したり、サービスを起動したり、サービスを有効または無効にすることができるようになりました。SELinux と systemd のアクセス制御操作は、すべてのケースで一致しません。SELinux アクセスチェックで systemd メソッド呼び出しを行わるようにマッピングを定義しました。表10.1「SELinux アクセスチェックにおける systemd ユニットファイルメソッド呼び出しのマッピング」 はユニットファイルへのアクセスチェックをマッピングし、表10.2「SELinux アクセスチェックにおける systemd の一般的なシステムコールのマッピング」 は一般的なシステムのアクセスチェックに対応します。いずれかのテーブルに一致が見つからない場合は、未定義の システムチェックが呼び出されます。

表10.1 SELinux アクセスチェックにおける systemd ユニットファイルメソッド呼び出しのマッピング

systemd ユニットファイルメソッド SELinux アクセスチェック
DisableUnitFiles disable
EnableUnitFiles enable
GetUnit status
GetUnitByPID status
GetUnitFileState status
kill stop
KillUnit stop
LinkUnitFiles enable
ListUnits status
LoadUnit status
MaskUnitFiles disable
PresetUnitFiles enable
ReenableUnitFiles enable
Reexecute start
reload reload
ReloadOrRestart start
ReloadOrRestartUnit start
ReloadOrTryRestart start
ReloadOrTryRestartUnit start
ReloadUnit reload
ResetFailed stop
ResetFailedUnit stop
Restart start
RestartUnit start
Start start
StartUnit start
StartUnitReplace start
停止 stop
StopUnit stop
TryRestart start
TryRestartUnit start
UnmaskUnitFiles enable

表10.2 SELinux アクセスチェックにおける systemd の一般的なシステムコールのマッピング

systemd の一般システムコール SELinux アクセスチェック
ClearJobs reboot
FlushDevices halt
GET status
GetAll status
GetJob status
GetSeat status
GetSession status
GetSessionByPID status
GetUser status
halt halt
イントロスペクション status
kexec reboot
KillSession halt
KillUser halt
ListJobs status
ListSeats status
ListSessions status
ListUsers status
LockSession halt
PowerOff halt
再起動 reboot
SetUserLinger halt
TerminateSeat halt
TerminateSession halt
TerminateUser halt

例10.1 システムサービス用の SELinux ポリシー

sesearch ユーティリティーを使用して、システムサービスのポリシールールを一覧表示できます。たとえば、se search -A -s NetworkManager_t -c service コマンドを実行すると、以下が返されます。
allow NetworkManager_t dnsmasq_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t nscd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t ntpd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t pppd_unit_file_t : service { start stop status reload kill load } ; 
allow NetworkManager_t polipo_unit_file_t : service { start stop status reload kill load } ;

10.2. SELinux および journald

systemd では、journald デーモン( systemd-journalとしても知られている)は、ロギングデータを収集して保存するシステムサービスである syslog ユーティリティーの代替です。これは、カーネルから受信したロギング情報、システムサービスの標準およびエラー出力、またはネイティブ API を使用して、カーネルから受信したロギング情報に基づいて構造化 および インデックス化されたジャーナルを作成し、維持します。セキュアな方法で、各ログメッセージに対して多数のメタデータフィールドを暗黙的に収集します。
systemd-journal サービスを SELinux とともに使用して、セキュリティーを強化できます。SELinux は、設計されている内容を実行させることのみを許可することでプロセスを制御します。ポリシーライターのセキュリティー目標によっては、より少ない場合もあります。たとえば、SELinux は、危険にさらされた ntpd プロセスが、ネットワーク時間以外の処理を防ぎます。ただし、ntpd プロセスは syslog メッセージを送信するため、SELinux が危険にさらされたプロセスがこれらのメッセージを送信し続けます。危険にさらされた ntpd は、他のデーモンと誤って一致させるために syslog メッセージをフォーマットするか、または管理者を誤って使用したり、syslog ファイルを読み取る ユーティリティーをシステム全体にまとめるユーティリティーです。
systemd-journal デーモンはすべてのログメッセージを検証し、その他の理由で SELinux ラベルをそのメッセージに追加します。これにより、ログメッセージで不整合を簡単に検出し、発生する前にこのタイプの攻撃を防ぐことができます。journalctl ユーティリティーを使用して、systemd ジャーナルのログをクエリーできます。コマンドライン引数を指定しないと、このコマンドを実行すると、最も古いエントリーから開始する、ジャーナルの完全な内容が一覧表示されます。システムコンポーネントのログなど、システムで生成されたすべてのログを表示するには、root で journalctl を実行します。root 以外のユーザーとして実行すると、出力は現在ログインしているユーザーに関連するログにのみ制限されます。

例10.2 journalctlを使用したログの一覧表示

journalctl を使用して、特定の SELinux ラベルに関連するすべてのログを一覧表示できます。たとえば、以下のコマンドは system_u:system_r:policykit_t:s0 ラベルでログに記録されるすべてのログを一覧表示します。
~]# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
Oct 21 10:22:42 localhost.localdomain polkitd[647]: Started polkitd version 0.112
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /etc/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Loading rules from directory /usr/share/polkit-1/rules.d
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Finished loading, compiling and executing 5 rules
Oct 21 10:22:44 localhost.localdomain polkitd[647]: Acquired the name org.freedesktop.PolicyKit1 on the system bus Oct 21 10:23:10 localhost polkitd[647]: Registered Authentication Agent for unix-session:c1 (system bus name :1.49, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
Oct 21 10:23:35 localhost polkitd[647]: Unregistered Authentication Agent for unix-session:c1 (system bus name :1.80 [/usr/bin/gnome-shell --mode=classic], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.utf8)
journalctl の詳細は、journalctl(1) の man ページを参照してください。

第11章 トラブルシューティング

本章では、SELinux がアクセスを拒否したときに発生するものを説明します。上位 3 つの問題の原因と、正しいラベリングに関する情報を見つける場所、SELinux 拒否の分析、および audit2allow でのカスタムポリシーモジュールの作成を説明します。

11.1. アクセスが拒否されたときにどのような Happens になるか

アクセスの許可、拒否などの SELinux の結果はキャッシュされます。このキャッシュは、アクセスベクトルキャッシュ (AVC) として知られています。拒否メッセージは、SELinux がアクセスを拒否するとログに記録されます。これらの拒否は「AVC 拒否」としても知られており、どのデーモンを実行しているかによって異なる場所に記録されます。
daemon: auditd on
ログの場所: /var/log/audit/audit.log
daemon: auditd off; rsyslogd on
ログの場所: /var/log/messages
daemon: setroubleshootd、rsyslogd、および auditd on
ログの場所: /var/log/audit/audit.log.読みやすい拒否メッセージも /var/log/messagesに送信される
X Window System を実行している場合は、setroubleshoot パッケージおよび setroubleshoot-server パッケージがインストールされ、setroubleshootd デーモンおよび auditd デーモンが実行していると、SELinux によるアクセスを拒否すると警告が表示されます。
Show をクリックすると、SELinux がアクセスを拒否した理由の詳細な分析と、アクセスを許可することができる解決策が表示されます。X Window System を実行していない場合は、SELinux がアクセスが拒否されたときに明らかになることはありません。たとえば、お使いの Web サイトを参照するユーザーは、以下のようなエラーが表示されます。
Forbidden

You don't have permission to access file name on this server
このような状況では、DAC ルール(標準 Linux パーミッション)がアクセスを許可する場合は、/var/log/messages および /var/ log/audit/audit.log「SELinux is preventing」と 「denied」 エラーをそれぞれチェックしてください。これには、root ユーザーで以下のコマンドを実行します。
~]# grep "SELinux is preventing" /var/log/messages
~]# grep "denied" /var/log/audit/audit.log

11.2. 最も大きな 3 つの原因

以下のセクションでは、問題のラベル付け、サービスのブール値とポートの設定、SELinux ルールに関連する 3 つの原因を説明します。

11.2.1. ラベル付けの問題

SELinux を実行しているシステムでは、すべてのプロセスとファイルに、セキュリティー関連の情報を含むラベルが付いたラベルが付けられます。この情報は、SELinux コンテキスト と呼ばれます。これらのラベルが間違っている場合は、アクセスが拒否される可能性があります。誤ったラベルが付けられたアプリケーションにより、誤ったラベルがプロセスに割り当てられる場合があります。これにより、SELinux がアクセスを拒否し、ファイルに誤ったラベルが付けられたファイルが作成される可能性があります。
ラベル付けの問題の一般的な原因として、非標準ディレクトリーがサービスに使用される場合が挙げられます。たとえば、管理者が /var/www/html/ を Web サイトに使用する代わりに、管理者は /srv/myweb/ を使用します。Red Hat Enterprise Linux では、/srv ディレクトリーには var_t タイプのラベルが付けられます。/srv で作成されるファイルおよびディレクトリーは、このタイプを継承します。また、最上位のディレクトリー( /myserverなど)で新たに作成されたオブジェクトには default_t タイプのラベルが付けられる場合があります。SELinux は、Apache HTTP Server (httpd) がこの両方のタイプにアクセスできないようにします。アクセスを許可するには、SELinux は、/srv/myweb/ のファイルが httpd からアクセスできることを認識する必要があります。
~]# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
この semanage コマンドは、/srv/myweb/ ディレクトリー(およびその下のすべてのファイルおよびディレクトリー)のコンテキストを SELinux ファイルコンテキスト設定に追加します。[8].semanage ユーティリティーはコンテキストを変更しません。root で restorecon ユーティリティーを実行して変更を適用します。
~]# restorecon -R -v /srv/myweb
file-context 設定へのコンテキストの追加に関する詳細は、「永続的な変更: semanage fcontext」 を参照してください。

11.2.1.1. 正しいコンテキストとは何ですか?

matchpathcon ユーティリティーは、ファイルパスのコンテキストを確認し、そのパスのデフォルトラベルと比較します。以下の例は、ラベル が間違っているファイルを含むディレクトリーで matchpathcon を使用する方法を示しています。
~]$ matchpathcon -V /var/www/html/*
/var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
/var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
この例では、index.html ファイルおよび page1.html ファイルに、user_home_t タイプのラベルが付けられています。このタイプは、ユーザーのホームディレクトリーのファイルに使用されます。mv コマンドを使用してファイルをホームディレクトリーから移動すると、ファイルに user_home_t タイプのラベルが付けられることがあります。このタイプは、ホームディレクトリー内しか存在しません。restorecon ユーティリティーを使用して、対象のファイルを正しいタイプに戻します。
~]# restorecon -v /var/www/html/index.html 
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
ディレクトリー下の全ファイルのコンテキストを復元するには、-R オプションを使用します。
~]# restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
matchpathcon のより詳細な例は、「デフォルトの SELinux コンテキストの確認」 を参照してください。

11.2.2. 機密サービスの実行方法

サービスはさまざまな方法で実行できます。これを壊すには、サービスの実行方法を指定する必要があります。これは、SELinux ポリシーの記述に関する知識なしに、ランタイム時に SELinux ポリシーの一部を変更できるようにするブール値を使用して実現できます。これにより、SELinux ポリシーのリロードや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。また、デフォルト以外のポート番号でサービスを実行するには、semanage コマンドを使用してポリシー設定を更新する必要があります。
たとえば、Apache HTTP Server が MariaDB と通信できるようにするには、httpd_can_network_connect_db のブール値を有効にします。
~]# setsebool -P httpd_can_network_connect_db on
特定のサービスでアクセスが拒否される場合は、getsebool ユーティリティーおよび grep ユーティリティーを使用して、アクセスを許可するブール値が利用できるかどうかを確認します。たとえば、getsebool -a | grep ftp コマンドを使用して FTP 関連のブール値を検索します。
~]$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_nfs --> off

ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
ブール値の一覧や、オンまたはオフであるかについては、getsebool -a コマンドを実行します。ブール値の一覧、各項目の概要、および on または off かどうかの説明については、root で semanage boolean -l コマンドを実行します。ブール値の一覧表示および設定に関する詳細は、「ブール値」 を参照してください。

ポート番号

ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。たとえば、root で semanage port -l | grep http コマンドを 実行して、http 関連のポートを一覧表示します。
~]# semanage port -l | grep http
http_cache_port_t              tcp      3128, 8080, 8118
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989
http_port_t ポートタイプは、Apache HTTP Server がリッスン可能なポートを定義します。この場合の TCP ポートは 80、443、488、8008、8009、および 8443 になります。httpd がポート 9876 でリッスンする (Listen 9876) ように、管理者が httpd.conf を設定していれば、これを反映するようにポリシーが更新されていないと、以下のコマンドに失敗します。
~]# systemctl start httpd.service
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
~]# systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago
  Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS)
  Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
以下のような SELinux 拒否メッセージのログは、/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
httpdhttp_port_t ポートタイプに記載されていないポートをリッスンできるようにするには、semanage port コマンドを入力して、そのポートをポリシー設定に追加します。[9]:
~]# semanage port -a -t http_port_t -p tcp 9876
-a オプションは新規レコードを追加します。-t オプションはタイプを定義し、-p オプションはプロトコルを定義します。最後の引数は、追加するポート番号です。

11.2.3. 進化したルールおよびアプリケーション

アプリケーションが破損し、SELinux がアクセスを拒否する可能性があります。また、SELinux ルールは進化しています。アプリケーションが特定の方法で実行しているのを SELinux が認識しておらず、アプリケーションが期待どおりに動作していても、アクセスを拒否してしまうような場合もあります。たとえば、PostgreSQL の新規バージョンがリリースされると、現在のポリシーが事前に確認されていないアクションを実行し、アクセスが許可される場合でもアクセスが拒否されます。
このような状況では、アクセスが拒否された後に audit2allow ユーティリティーを使用して、アクセスを許可するカスタムポリシーモジュールを作成します。audit2allow の使用に関する詳細は、「アクセスの許可: audit2allow」 を参照してください。


[8] /etc/selinux/targeted/contexts/files/ のファイルは、ファイルとディレクトリーのコンテキストを定義します。このディレクトリー内のファイルは restorecon ユーティリティーおよび setfiles ユーティリティーで読み取り、ファイルとディレクトリーをデフォルトのコンテキストに復元します。
[9] semanage port -a コマンドは、エントリーを /etc/selinux/targeted/modules/active/ports.local ファイルに追加します。デフォルトでは、このファイルは root にのみ表示できることに注意してください。

11.3. 問題の解決

以下のセクションでは、問題のトラブルシューティングに役立ちます。これらは、SELinux ルールの前にチェックされる Linux パーミッションの確認。SELinux がアクセスを拒否する可能性はありますが、ログに記録されません。サービスの man ページには、ラベルとブール値に関する情報が含まれるサービスの man ページ、システム全体ではなく、Permissive ドメインなどの 1 つのプロセスが Permissive ドメインを実行できるようになります。拒否メッセージの検索と表示方法、拒否の分析、および audit2allow を使用したカスタムポリシーモジュールの作成。

11.3.1. Linux の権限

アクセスが拒否される場合は、標準の Linux パーミッションを確認してください。1章はじめに で説明されているように、ほとんどのオペレーティングシステムは、Discretionary Access Control(DAC)システムを使用してアクセスを制御し、ユーザーが所有するファイルのパーミッションを制御できるようにします。SELinux ポリシールールは、DAC ルールの後にチェックされます。DAC ルールがアクセスを拒否した場合は、SELinux ポリシールールは使用されません。
アクセスが拒否され、SELinux 拒否がログに記録されていない場合は、以下のコマンドを使用して標準の Linux パーミッションを表示します。
~]$ ls -l /var/www/html/index.html
-rw-r----- 1 root root 0 2009-05-07 11:06 index.html
この例では、index.html は root ユーザーおよびグループが所有しています。root ユーザーには読み取り/書き込みパーミッション(-rw)があり、root グループのメンバーには読み取り権限(-r-)があります。その他にすべてのユーザーはアクセスできません(---)。デフォルトでは、このパーミッションでは httpd がこの ファイルの読み取りを許可しません。この問題を解決するには、chown コマンドを使用して所有者とグループを変更します。このコマンドは、root で実行する必要があります。
~]# chown apache:apache /var/www/html/index.html
ここでは、httpd が Linux Apache ユーザーとして実行されるデフォルト設定を想定しています。httpd を別のユーザーで実行する場合は、apache:apache をそのユーザーに置き換えます。
Linux パーミッションの管理に関する詳細は、Fedora Documentation Project "Permissions" のドラフトを参照してください。

11.3.2. 重大なサービス拒否攻撃の可能性

特定の状況では、SELinux がアクセスを拒否すると AVC 拒否メッセージがログに記録されないことがあります。アプリケーションおよびシステムライブラリーは、タスクを実行するために必要な以上のアクセスを調査することがよくあります。有害のないアプリケーションのプロービングのために AVC 拒否で監査ログを埋めることなく、最低限の権限を維持するには、OpenTnt audit ルールによる許可なしに AVC 拒否を非表示にできます。これらのルールは標準ポリシーで共通です。dontaudit の難点は、SELinux がアクセスを拒否すると、拒否メッセージはログに記録されないため、トラブルシューティングが困難になります。
一時的に dontaudit ルールを無効にし、すべての拒否をログに記録するようにするには、root で次のコマンドを実行します。
~]# semodule -DB
-D オプションは、dotaudit ルールを無効にします。- B オプションは再ビルドポリシーです。semodule -DB を実行した後、パーミッションの問題が発生したアプリケーションを見てみ、SELinux 拒否(アプリケーションに関連する)がログに記録されているかどうかを確認します。dotaudit ルールで無視し、処理される拒否を決定する際には注意が必要です。不明な場合やガイダンスを検索する場合は、fedora-selinux-list などの SELinux 一覧で他の SELinux ユーザーおよび開発者に問い合わせます。
ポリシーと enable dontaudit ルールを再構築するには、root で次のコマンドを実行します。
~]# semodule -B
これにより、ポリシーが元の状態に復元されます。すべての dontaudit ルールの一覧については、se search --dontaudit コマンドを実行します。-s domain オプションと grep コマンドを使用した検索を絞り込みます。以下は例になります。
~]$ sesearch --dontaudit -s smbd_t | grep squid
dontaudit smbd_t squid_port_t : tcp_socket name_bind ;
dontaudit smbd_t squid_port_t : udp_socket name_bind ;
拒否の分析に関する詳細は、「生の監査メッセージ」 および 「sealert メッセージ」 を参照してください。

11.3.3. サービスの man ページ

サービスの man ページには、特定の状況に使用するファイルタイプや、サービスへのアクセスを変更するブール値(NFS ボリュームにアクセスする httpd など)など、貴重な情報が含まれています。この情報は、標準の man ページや man ページにあり、sepolicy の man ユーティリティーを使用して、全サービスドメインの SELinux ポリシーから自動的に生成できます。このような man ページは service-name_selinux 形式で名前が付けられます。このような man ページは、selinux-policy-doc パッケージにも同梱されています。
たとえば、httpd_selinux(8) man ページには、特定の状況に使用するファイルタイプに関する情報と、スクリプトの共有、ファイルの共有、ユーザーのホームディレクトリー内のディレクトリーへのアクセスなどを許可するブール値が含まれます。サービスの SELinux 情報を含むその他の man ページには、以下が含まれます。
  • samba: samba_selinux(8) の man ページでは、samba_enable_home_dirs Boolean を有効にすると、Samba がユーザーのホームディレクトリーを共有できることが説明されています。
  • nfs: nfsd_selinux(8) の man ページでは、ユーザーが nfsd プロセスを可能な限り安全な方法で設定できるようにする SELinux nfsd ポリシーを説明します。
man ページの情報は、SELinux がアクセスを拒否するのを防ぐのに役立つ正しいファイルタイプおよびブール値を設定するのに役立ちます。
sepolicy の man の詳細は 「手動ページの生成: sepolicy の man を参照してください

11.3.4. Permissive ドメイン

SELinux が Permissive モードで実行している場合、SELinux はアクセスを拒否しませんが、Enforcing モードで実行している場合、拒否が拒否されたアクションについてログに記録されます。以前は、1 つのドメイン(remember: プロセスがドメインで実行される)を許容できませんでした。特定の状況では、システム全体を調べて問題のトラブルシューティングを行いました。
Permissive ドメインを使用すると、システム全体を許容するのではなく、単一のプロセス(ドメイン)を Permissive を実行するように設定できます。SELinux チェックは Permissive ドメインに対して実行されますが、カーネルはアクセスを許可し、SELinux がアクセスを拒否した状況で AVC 拒否を報告できます。
Permissive ドメインには、以下の用途があります。
  • 1 つのプロセス(ドメイン)を Permissive を実行して、Permissive を行い、システム全体を危険にさらすことなく問題のトラブルシューティングを行うことができます。
  • 管理者は、新しいアプリケーションのポリシーを作成できます。以前は、最小ポリシーを作成し、マシン全体が Permissive モードに配置され、アプリケーションが実行できるようになりましたが、SELinux 拒否がログに記録されるようになっています。その後、audit2allow を使用して、ポリシーの作成に役立ちます。これにより、システム全体が危険にさらされます。Permissive ドメインでは、システム全体を危険にさらすことなく、新しいポリシーのドメインのみを Permissive とマークできます。

11.3.4.1. ドメイン Permissive の作成

ドメインを Permissive するには、semanage permissive -a domain コマンドを実行します。domain は、Permissive を作成するドメインになります。たとえば、root で次のコマンドを入力して、httpd_t ドメイン(Apache HTTP Server が実行されるドメイン)permissive を設定します。
~]# semanage permissive -a httpd_t
Permissive のドメイン一覧を表示するには、root で semodule -l | grep permissive コマンドを実行します。以下は例になります。
~]# semodule -l | grep permissive
permissive_httpd_t    (null)
permissivedomains     (null)
ドメインを Permissive に設定しなくなった場合は、root で semanage permissive -d domain コマンドを実行します。以下は例になります。
~]# semanage permissive -d httpd_t

11.3.4.2. Permissive ドメインの無効化

permissivedomains.pp モジュールには、システムに表示される Permissive ドメイン宣言がすべて含まれます。Permissive ドメインをすべて無効にするには、root で以下のコマンドを入力します。
~]# semodule -d permissivedomains
注記
semodule -d コマンドでポリシーモジュールが無効になっていると、se module -l コマンドの出力には表示されません。無効になったポリシーモジュールをすべて表示するには、root で以下のコマンドを入力します。
~]# semodule --list-modules=full

11.3.4.3. Permissive ドメインの拒否

The SYSCALL メッセージは Permissive ドメインで異なります。以下は、Apache HTTP Server からの AVC 拒否(および関連するシステムコール)の例です。
type=AVC msg=audit(1226882736.442:86): avc:  denied  { getattr } for  pid=2427 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226882736.442:86): arch=40000003 syscall=196 success=no exit=-13 a0=b9a1e198 a1=bfc2921c a2=54dff4 a3=2008171 items=0 ppid=2425 pid=2427 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
デフォルトでは、httpd_t ドメインは許容されないため、アクションが拒否され、SYSCALL メッセージには success=no が含まれます。以下は、httpd_t ドメイン を許容できるように semanage permissive -a httpd_t コマンドを実行して、同じ状況に対する AVC 拒否の例です。
type=AVC msg=audit(1226882925.714:136): avc:  denied  { read } for  pid=2512 comm="httpd" name="file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226882925.714:136): arch=40000003 syscall=5 success=yes exit=11 a0=b962a1e8 a1=8000 a2=0 a3=8000 items=0 ppid=2511 pid=2512 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
この場合、AVC 拒否はログに記録されましたが、SYSCALL メッセージの success=yes で示されているようにアクセスは拒否されませんでした。
Permissive ドメインの詳細は、「Dan Walsh's "Permissive Domains」 のブログエントリーを参照してください。

11.3.5. サービス拒否検索および表示

本セクションでは、setroubleshootsetroubleshoot-serverdbus および audit パッケージがインストールされ、auditdrsyslogd、および setroubleshootd デーモンが実行していることを前提としています。これらのデーモンの起動に関する詳細は、「使用されているログファイル」 を参照してください。ausearch、aureport、sealert など、SELinux AVC メッセージの検索および表示には、多くのユーティリティー が利用できます。

ausearch

audit パッケージは、さまざまな検索基準に基づいてイベントの 監査 デーモンログをクエリーできる ausearch ユーティリティーを提供します。[10] ausearch ユーティリティーは /var/log/audit/audit.log にアクセスするため、root ユーザーとして実行する必要があります。
検索: すべての拒否
コマンド: ausearch -m avc,user_avc,selinux_err,user_selinux_err
検索: 今の拒否
コマンド: ausearch -m avc -ts today
検索: 過去 10 分間の拒否
コマンド: ausearch -m avc -ts recent
特定のサービスに対して SELinux AVC メッセージを検索するには、- c comm-name オプションを使用します。ここで、comm -name は実行可能ファイルの名前です(Apache HTTP Server の httpd、Samba の smbd など)。
~]# ausearch -m avc -c httpd
~]# ausearch -m avc -c smbd
それぞれの ausearch コマンドでは、読みやすくするために --interpret (-i)オプション、またはスクリプト処理に --raw (-r)オプションを使用することが推奨されます。その他の ausearch オプションについては、ausearch(8) man ページを参照してください。

aureport

audit パッケージは aureport ユーティリティーを提供し、監査ログの概要レポートを生成します。[11] aureport ユーティリティーは /var/log/audit/audit.log にアクセスするため、root ユーザーとして実行する必要があります。SELinux 拒否メッセージのリストと、それぞれが発生した頻度を表示するには、aureport -a コマンドを実行します。以下は、2 つの拒否を含む出力例です。
~]# aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 05/01/2009 21:41:39 httpd unconfined_u:system_r:httpd_t:s0 195 file getattr system_u:object_r:samba_share_t:s0 denied 2
2. 05/03/2009 22:00:25 vsftpd unconfined_u:system_r:ftpd_t:s0 5 file read unconfined_u:object_r:cifs_t:s0 denied 4

sealert

setroubleshoot-server パッケージは、setroubleshoot -server が翻訳された拒否メッセージを読み取る sealert ユーティリティーを提供します。[12] 拒否には、/var/log/messages に示される ID が割り当てられます。以下は、メッセージ の拒否例です。
setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket. For complete SELinux messages. run sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7
この例では、拒否 ID は 8c123656-5dda-4e5d-8791-9e3bd03786b7 です。-l オプションは、ID を引数として取ります。sealert -l 8c123656-5dda-4e5d-8791-9e3bd03786b7 コマンドを実行すると、SELinux がアクセスを拒否した理由の詳細な分析とアクセスを可能にするソリューションが表示されます。
X Window System を実行している場合は、setroubleshoot パッケージおよび setroubleshoot -server パッケージがインストールされ、setroubleshootd、dbus デーモン、および auditd デーモンが実行している場合は、SELinux によるアクセスを拒否すると警告が表示されます。
AVC 拒否メッセージ
Show boot the sealert GUI をクリックすると、問題のトラブルシューティングを行うことができます。
または、sealert -b コマンドを実行して、sealert GUI を起動します。すべての拒否メッセージの詳細な分析を表示するには、sealert -l \* コマンドを実行します。

11.3.6. 生の監査メッセージ

未加工の監査メッセージは /var/log/audit/audit.log に記録されます。以下は、Apache HTTP Server( httpd_t ドメインで実行されている)が /var/www/html/file1 ファイル(samba_ share_t タイプでラベル付け)にアクセスしようとすると発生する AVC 拒否メッセージ(および関連するシステムコール)の例です。
type=AVC msg=audit(1226874073.147:96): avc:  denied  { getattr } for  pid=2465 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file

type=SYSCALL msg=audit(1226874073.147:96): arch=40000003 syscall=196 success=no exit=-13 a0=b98df198 a1=bfec85dc a2=54dff4 a3=2008171 items=0 ppid=2463 pid=2465 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=6 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
{ getattr }
中括弧内の項目は、拒否されたパーミッションを示します。The getattr エントリーは、ソースプロセスがターゲットファイルのステータス情報の読み取りを試行したことを示します。これは、ファイルを読み取る前に発生します。このアクションは、ファイルに誤ったラベルがあるために拒否されます。一般的に表示されるパーミッションには、getattrreadwrite などが含まれます。
comm="httpd"
プロセスを起動した実行ファイル。実行可能ファイルの完全パスは、システムコール(SYSCALL)メッセージの exe= セクションにあります。この場合は exe="/usr/sbin/httpd" になります。
path="/var/www/html/file1"
アクセスを試みたオブジェクト(ターゲット)へのパス。
scontext="unconfined_u:system_r:httpd_t:s0"
拒否されたアクションを試みたプロセスの SELinux コンテキストこの場合、httpd_t ドメインで実行されている Apache HTTP Server の SELinux コンテキストです。
tcontext="unconfined_u:object_r:samba_share_t:s0"
プロセスがアクセスを試みたオブジェクト(ターゲット)の SELinux コンテキストこの例では、これが file1 の SELinux コンテキストです。samba_share_t タイプは、httpd_t ドメインで実行しているプロセスにアクセスできないことに注意してください。
特定の状況では、tcontext が一致することがあります。たとえば プロセスがユーザー ID などの実行中のプロセスの特性を変更するシステムサービスの実行を試みる場合などです。また、tcontext は、プロセスが通常の制限を許可するよりも多くのリソース(メモリーなど)を使用しようとすると scontext と一致する可能性があり、そのプロセスがこれらの制限を壊してしまうかどうかについてセキュリティーチェックが可能になります。
システムコール(SYSCALL)メッセージから、以下の 2 つの項目があります。
  • success=no: 拒否(AVC)が強制されたかどうかを示します。success=no は、システムコールが成功したことを示しています(SELinux がアクセスを拒否した)。success=yes は、システムコールが成功したことを示します。これは、permissive ドメインまたは制限のないドメイン(unconfined _service_t や kernel_t など)で確認できます。
  • exe="/usr/sbin/httpd": プロセスを起動した実行可能ファイルへの完全パスは exe="/usr/sbin/httpd" になります。
誤ったファイルタイプは、SELinux がアクセスを拒否する一般的な原因です。トラブルシューティングを開始するには、ソースコンテキスト(scontext)をターゲットコンテキスト(tcontext)と比較します。プロセス(scontext)は、このようなオブジェクト(tcontext)にアクセスするか?たとえば、Apache HTTP Server(httpd_t)は、httpd_sys_content_tpublic_content_t など、httpd_selinux(8) man ページで指定されたタイプにのみアクセスする必要があります(特に設定されていない限り)。

11.3.7. sealert メッセージ

拒否には、/var/log/messages に示される ID が割り当てられます。以下は、Apache HTTP Server( httpd_t ドメインで実行)が /var/www/html/file1 ファイル(samba_ share_t タイプでラベル付け)にアクセスしようとすると発生する AVC 拒否(ログに記録された メッセージ)の例です。
hostname setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/file1 (samba_share_t). For complete SELinux messages. run sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
推奨されているように、sealert -l 32eee32b-21ca-4846-a22f-0ba050206786 コマンドを実行して完全なメッセージを表示します。このコマンドはローカルマシンでのみ機能し、sealert GUI と同じ情報が表示されます。
~]$ sealert -l 32eee32b-21ca-4846-a22f-0ba050206786
SELinux is preventing httpd from getattr access on the file /var/www/html/file1.

*****  Plugin restorecon (92.2 confidence) suggests   ************************

If you want to fix the label. 
/var/www/html/file1 default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/file1

*****  Plugin public_content (7.83 confidence) suggests   ********************

If you want to treat file1 as public content
Then you need to change the label on file1 to public_content_t or public_content_rw_t.
Do
# semanage fcontext -a -t public_content_t '/var/www/html/file1'
# restorecon -v '/var/www/html/file1'

*****  Plugin catchall (1.41 confidence) suggests   **************************

If you believe that httpd should be allowed getattr access on the file1 file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -i my-httpd.pp


Additional Information:
Source Context                system_u:system_r:httpd_t:s0
Target Context                unconfined_u:object_r:samba_share_t:s0
Target Objects                /var/www/html/file1 [ file ]
Source                        httpd
Source Path                   httpd
Port                          <Unknown>
Host                          hostname.redhat.com
Source RPM Packages           
Target RPM Packages           
Policy RPM                    selinux-policy-3.13.1-166.el7.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     hostname.redhat.com
Platform                      Linux hostname.redhat.com
                              3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57
                              EDT 2017 x86_64 x86_64
Alert Count                   2
First Seen                    2017-07-20 02:52:11 EDT
Last Seen                     2017-07-20 02:52:11 EDT
Local ID                      32eee32b-21ca-4846-a22f-0ba050206786

Raw Audit Messages
type=AVC msg=audit(1500533531.140:295): avc:  denied  { getattr } for  pid=24934 comm="httpd" path="/var/www/html/file1" dev="vda1" ino=31457414 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file


Hash: httpd,httpd_t,samba_share_t,file,getattr
サマリー
拒否されたアクションの概要。これは、/var/log/messages の拒否と同じです。この例では、httpd プロセスにより、samba _share_t タイプのラベルが付けられたファイル(file1) へのアクセスが拒否されました。
詳細な説明
さらに詳細な説明があります。この例では、file1samba_share_t タイプのラベルが付けられています。このタイプは、Samba を使用してエクスポートするファイルおよびディレクトリーに使用されます。この説明では、これらのアクセスが必要な場合に、Apache HTTP Server および Samba がアクセス可能なタイプにタイプを提案します。
アクセスの許可
アクセスを許可するための提案。これは、ファイルの再ラベル付け、ブール値の有効化、またはローカルポリシーモジュールの作成が必要になる場合があります。この場合、提案は Apache HTTP Server と Samba の両方がアクセスできるタイプでファイルにラベルを付けることです。
修正コマンド
アクセスを許可し、拒否を解決するための推奨されるコマンドです。この例では、file1 タイプを public_content_t に変更するコマンドを提供します。これは、Apache HTTP Server および Samba からアクセスできます。
追加情報
ポリシーパッケージ名やバージョン(selinux-policy-3.13.1-166.el7.noarch)などのバグレポートで便利な情報ですが、拒否の原因の解決に役立たない可能性があります。
生の監査メッセージ
拒否に関連付けられた /var/log/audit/audit.log からの生の監査メッセージ。AVC 拒否の各項目の詳細は、「生の監査メッセージ」 を参照してください。

11.3.8. アクセスの許可: audit2allow

警告
本セクションの例は、実稼働環境では使用しないでください。これは、audit2allow ユーティリティーの使用を示すためにのみ使用されます。
audit2allow ユーティリティーは、拒否された操作のログから情報を収集してから、SELinux ポリシー allow ルールを生成します。[13] 「sealert メッセージ」 に従って拒否メッセージを分析し、ラベルの変更やブール値が許可されない場合は、audit2allow を使用してローカルポリシーモジュールを作成します。SELinux でアクセスが拒否されると、audit2allow を実行すると、以前拒否したアクセスを許可する Type Enforcement ルールが生成されます。
audit2allow を使用して、SELinux 拒否を確認する際に、最初のオプションとしてローカルポリシーモジュールを生成することはできません。トラブルシューティングは、ラベル付けの問題があるかどうかを最初に確認します。2 番目に多いのが、SELinux が、プロセスの設定変更を認識していない場合です。詳細は「SELinux Errors white paper」の「 Four Key Causes of SELinux Errors white paper」を参照してください。
以下の例は、audit2allow を使用してポリシーモジュールを作成する方法を示しています。
  1. 拒否メッセージと関連するシステムコールが /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)
    
    この例では、cert watch は、var _t タイプのラベルが付けられたディレクトリーへの書き込みアクセスを拒否しました。「sealert メッセージ」 に従って拒否メッセージを分析します。ラベルの変更やブール値がアクセスが許可されていない場合は、audit2allow を使用してローカルポリシーモジュールを作成します。
  2. 以下のコマンドを実行して、アクセスが拒否された理由について、人間が判読できる説明を生成します。audit2allow ユーティリティーは /var/log/audit/audit.log を読み取るため、root ユーザーで実行する必要があります。
    ~]# audit2allow -w -a
    type=AVC msg=audit(1226270358.848:238): avc:  denied  { write } for  pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir
    	Was caused by:
    		Missing type enforcement (TE) allow rule.
    
    	You can use audit2allow to generate a loadable module to allow this access.
    
    -a コマンドラインオプションにより、すべての監査ログが読み込まれます。-w オプションは、人間が判読できる説明を生成します。示されているように、Type Enforcement ルールがないため、アクセスは拒否されました。
  3. 以下のコマンドを実行して、拒否されたアクセスを許可する Type Enforcement ルールを表示します。
    ~]# audit2allow -a
    
    
    #============= certwatch_t ==============
    allow certwatch_t var_t:dir write;
    
    重要
    Type Enforcement ルールがない理由は、通常、SELinux ポリシーのバグが原因となり、Red Hat Bugzilla で報告してください。Red Hat Enterprise Linux の場合は、Red Hat Enterprise Linux 製品に対してバグを作成し、selinux-policy コンポーネントを選択します。このバグレポートに、audit2allow -w -a コマンドおよび audit2allow -a コマンドの出力を追加します。
  4. audit2allow -a で表示されるルールを使用するには、root で以下のコマンドを入力してカスタムモジュールを作成します。-M オプションは、現在の作業ディレクトリーに、- M で指定した名前の Type Enforcement ファイル(.te)を作成します。
    ~]# audit2allow -a -M mycertwatch
    ******************** IMPORTANT ***********************
    To make this policy package active, execute:
    
    semodule -i mycertwatch.pp
    
  5. また、audit2allow は、Type Enforcement ルールをポリシーパッケージ(.pp)にコンパイルします。
    ~]# ls
    mycertwatch.pp  mycertwatch.te
    
    モジュールをインストールするには、root で以下のコマンドを入力します。
    ~]# semodule -i mycertwatch.pp
    重要
    audit2allow で作成されたモジュールは、必要なよりも多くのアクセスを許可することができます。audit2allow で作成したポリシーを、アップストリームの SELinux 一覧に投稿してレビューすることが推奨されます。 ポリシーにバグがあると思われる場合は、Red Hat Bugzilla でバグを作成します。
複数のプロセスからの拒否メッセージがあり、1 つのプロセスに対してのみカスタムポリシーを作成する場合は、grep ユーティリティーを使用して audit2allow の入力を絞り込みます。以下の例では、grep を使用して audit2allowcertwatch に関連する拒否メッセージのみを送信する方法を示しています。
~]# grep certwatch /var/log/audit/audit.log | audit2allow -R -M mycertwatch2
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i mycertwatch2.pp


[10] ausearch の詳細は、ausearch(8) man ページを参照してください。
[11] aureport の詳細は、aureport(8) man ページを参照してください。
[12] sealert の詳細は、sealert(8) man ページを参照してください。
[13] audit2allow の詳細は、audit2allow(1) man ページを参照してください。

第12章 追加情報

12.1. コントリビューター

12.2. その他リソース

Fedora

NSA(National Security Agency)

NSA は、SELinux の元の開発者です。NSA の National Information Assurance Research Laboratory(NIARL)が設計され、Linux カーネルの主要なサブシステムに柔軟に強制アクセス制御を実装し、Flatsk アーキテクチャーが提供する新しいオペレーティングシステムコンポーネントとアクセスベクトルキャッシュを実装します。

Tresys Technology

Tresys Technology は、以下のアップストリームです。

SELinux GitHub リポジトリー

SELinux Project Wiki

SELinux Notebook - Foundations - 4th Edition

Digitalocean:「Introduction to SELinux on CentOS 7」

IRC

Freenode の場合:
  • #selinux
  • #fedora-selinux

パート II. 機密サービスの管理

本書のこの部分は、実用的なタスクについて詳しく説明し、さまざまなサービスを設定および構成する方法を説明します。各サービスには、仕様とともに最も一般的な型とブール値が一覧表示されています。それらのサービスの設定に関する実際の例や、SELinux が操作を補完する方法のデモンストレーションも含まれています。
SELinux が Enforcing モードの場合、Red Hat Enterprise Linux で使用されるデフォルトのポリシーはターゲットポリシーになります。制限のあるドメインで実行するプロセス、および制限のないドメインでの実行をターゲットとするプロセス。ターゲットポリシーおよび制限のあるプロセスの詳細は、3章ターゲットポリシー を参照してください。

第13章 Apache HTTP サーバー

Apache HTTP Server は、現在の HTTP 標準とともにオープンソースの HTTP サーバーを提供します。[14]
Red Hat Enterprise Linux では、httpd パッケージが Apache HTTP Server を提供します。以下のコマンドを入力して、httpd パッケージがインストールされているかどうかを確認します。
~]$ rpm -q httpd
package httpd is not installed
インストールされておらず、Apache HTTP Server を使用する場合は、root ユーザーとして yum ユーティリティーを使用してインストールします。
~]# yum install httpd

13.1. Apache HTTP サーバーおよび SELinux

SELinux を有効にすると、Apache HTTP Server(httpd)はデフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している httpd プロセスを示しています。この例では、httpdsetroubleshootsetroubleshoot-server および policycoreutils-python パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root で以下のコマンドを入力して、httpd を起動します。
    ~]# systemctl start httpd.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status httpd.service       
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
  3. httpd プロセスを表示するには、以下のコマンドを実行します。
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    19780 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19781 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19782 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19783 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19784 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19785 ?        00:00:00 httpd
    
    httpd プロセスに関連する SELinux コンテキストは、system _u:system_r:httpd_t:s0 です。2 番目のコンテキストの最後の部分である httpd_t はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、httpd プロセスは httpd _t ドメインで実行されます。
SELinux ポリシーは、制限のあるドメイン( httpd_tなど)で実行されているプロセスが、ファイル、その他のプロセス、および一般的なシステムと対話する方法を定義します。httpd アクセスを許可するには、ファイルに適切にラベル付けする必要があります。たとえば、httpd は httpd _sys_content_t タイプのラベルが付いたファイルを読み取りできますが、Linux(DAC)パーミッションで書き込み権限が許可されていても、書き込みはできません。スクリプトネットワークアクセス、NFS および CIFS ボリュームに httpd アクセスを許可し、httpd が Common Gateway Interface(CGI) スクリプトを実行できる など、特定の動作を可能にするブール値を有効にする必要があります。
/etc/httpd/conf/httpd.conf ファイルが設定されると、httpd は TCP ポート 80、443、488、8008、8009、または 8443 以外のポートでリッスンするように、semanage port コマンドを使用して、SELinux ポリシー設定に新しいポート番号を追加する必要があります。以下の例は、httpd の SELinux ポリシー設定でまだ定義されていないポートをリッスンするように httpd を設定する方法を示しています。その結果、httpd が起動に失敗し ます。また、この例では、httpd がポリシーに定義されていない標準以外のポートで正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、httpd パッケージがインストールされていることを前提としています。以下の例で各コマンドを root ユーザーとして実行します。
  1. 以下のコマンドを入力して、httpd が実行していない ことを確認します。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
              Active: inactive (dead)
    
    出力が異なる場合は、プロセスを停止します。
    ~]# systemctl stop httpd.service
  2. semanage ユーティリティーを使用して、SELinux が httpd がリッスンを許可するポートを表示します。
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
    
  3. root で /etc/httpd/conf/httpd.conf ファイルを編集します。Listen オプションを設定します。これにより、httpd の SELinux ポリシー設定で設定されていないポートが一覧表示されます。この例では、httpd がポート 12345 をリッスンするように設定されています。
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 127.0.0.1:12345
    
  4. 以下のコマンドを入力して、httpd を起動します。
    ~]# systemctl start httpd.service
    Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
    
    以下のような SELinux 拒否メッセージがログに記録されます。
    setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
    
  5. この例では httpd がポート 12345 をリッスンできるようにするには、以下のコマンドが必要です。
    ~]# semanage port -a -t http_port_t -p tcp 12345
  6. httpd を再度起動し、新しいポートでリッスンします。
    ~]# systemctl start httpd.service
  7. httpd が標準以外のポート(この例では TCP 12345)でリッスンできるように SELinux が設定されたため、httpd はこのポートで 正常に起動します
  8. httpd が TCP ポート 12345 でリッスンし、通信されていることを確認するには、以下のように、指定されたポートへの telnet 接続を開き、HTTP GET コマンドを実行します。
    ~]# telnet localhost 12345
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET / HTTP/1.0
    
    HTTP/1.1 200 OK
    Date: Wed, 02 Dec 2009 14:36:34 GMT
    Server: Apache/2.2.13 (Red Hat)
    Accept-Ranges: bytes
    Content-Length: 3985
    Content-Type: text/html; charset=UTF-8
    [...continues...]
    

13.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下の例では、/var/www/html/ ディレクトリーに新しいファイルを作成し、親ディレクトリーから httpd_sys_content_t タイプを継承するファイル(/var/www/html/)を継承します。
  1. 以下のコマンドを実行して、/var/www/html/ の SELinux コンテキストを表示します。
    ~]$ ls -dZ /var/www/html
    drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
    
    これにより、/var/www/html/httpd_sys_content_t タイプのラベルが付けられます。
  2. root として touch ユーティリティーを使用して、新規ファイルを作成します。
    ~]# touch /var/www/html/file1
  3. 以下のコマンドを実行して SELinux コンテキストを表示します。
    ~]$ ls -Z /var/www/html/file1
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
    
ls -Z コマンドは、 httpd_sys_content_t タイプのラベルが付いた file1 を表示します。SELinux では、Linux パーミッションで書き込みアクセスを許可する場合でも、httpd がこのタイプのラベルが付いたファイルを読み取りできますが、書き込みはできません。SELinux ポリシーは、httpd _t ドメイン( httpd の実行)で実行中のプロセスが読み書きできるタイプを定義します。これにより、別のプロセスで使用するプロセスが想定されているファイルにアクセスできないようになります。
たとえば、httpd は httpd _sys_content_t タイプのラベルが付いたファイルにアクセスできますが(Apache HTTP Server の場合)、デフォルトでは samba_share_t タイプのラベルが付いたファイルにアクセスすることはできません。また、ユーザーのホームディレクトリーのファイルには、user_home_t タイプのラベルが付けられます。デフォルトでは、httpd がユーザーのホームディレクトリーのファイルの読み取りや書き込みを防ぎます。
以下は、httpd で使用されるタイプの一部 を示しています。異なるタイプを使用すると、柔軟なアクセスを設定できます。
httpd_sys_content_t
静的 Web サイト が使用する 静的な Web コンテンツには、このタイプを使用します。このタイプのラベルが付けられたファイルは、httpd および httpd が実行するスクリプトにアクセス(読み取り専用)されます デフォルトでは、このタイプのラベルが付けられたファイルおよびディレクトリーは、httpd またはその他のプロセスに書き込むことはできず、変更することができません。デフォルトでは、/var/www/html/ ディレクトリーに作成またはコピーされたファイルには httpd_sys_content_t タイプのラベルが付けられていることに注意してください。
httpd_sys_script_exec_t
このタイプは、httpd が 実行するスクリプト に使用します。このタイプは、/var/www/cgi-bin/ ディレクトリーの Common Gateway Interface(CGI)スクリプトに一般的に使用されます。デフォルトでは、SELinux ポリシーにより、httpd が CGI スクリプトを実行しないようにします。これを許可するには、スクリプトを httpd_sys_script_exec_t タイプでラベルを付け、httpd _enable_cgi ブール値を有効にします。httpd で実行すると、httpd_sys_script_exec_t ドメインで実行される httpd_ sys_script_exec_t という名前のスクリプトは、httpd で実行すると、httpd_sys_script_t ドメインで実行されます httpd_sys_script_t ドメインは、postgresql _t や mysqld_t などの他のシステムドメインにアクセスできます。
httpd_sys_rw_content_t
このタイプのラベルが付けられたファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで記述できますが、他のタイプのラベルが付いたスクリプトで変更することはできません。httpd_sys_rw_content_t タイプを使用して、httpd_ sys_script_exec_t タイプでラベルが付けられたスクリプトによって読み書きされるファイルに記述する必要があります。
httpd_sys_ra_content_t
このタイプのラベルが付けられたファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで追加できますが、他のタイプのラベルが付いたスクリプトで変更することはできません。httpd_sys_ra_content_t タイプを使用して、httpd_ sys_script_exec_t タイプでラベルが付いたスクリプトで読み込まれ、追加されたファイルにラベルを付ける必要があります。
httpd_unconfined_script_exec_t
SELinux の保護なしに、このタイプの run でラベルが付けられたスクリプトです。その他のオプションをすべて使い切った後、このタイプは複雑なスクリプトにのみ使用してください。httpd の SELinux 保護を無効にする場合、またはシステム全体で SELinux の保護を無効にする代わりに、このタイプの方法を使用することが推奨されます。
注記
httpd で利用可能なタイプをさらに表示するには、以下のコマンドを入力します。
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts

手順13.1 SELinux コンテキストの変更

ファイルおよびディレクトリーのタイプは、ch con コマンドで 変更できます。chcon で行った変更は、ファイルシステムのラベルや restorecon コマンドを維持しません。SELinux ポリシーは、ユーザーが指定のファイルの SELinux コンテキストを変更できるかどうかを制御します。以下の例は、httpd で使用する新しいディレクトリーと index.html ファイルを作成し そのファイルおよびディレクトリーに httpd アクセスを許可するようにラベル付けします。
  1. mkdir ユーティリティーを root として使用して、httpd が使用する最上位のディレクトリー構造を作成します。
    ~]# mkdir -p /my/website
  2. file-context 設定のパターンに一致しないファイルおよびディレクトリーには、default_t タイプのラベルが付けられる場合があります。このタイプは、制限のあるサービスからはアクセスできません。
    ~]$ ls -dZ /my
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /my
    
  3. root で以下のコマンドを入力し、my / ディレクトリーおよびサブディレクトリーのタイプを、httpd にアクセス可能なタイプに変更します /my/website/ で作成されたファイルは、default _t タイプではなく httpd_sys_content _t タイプを継承するため、httpd にアクセスできるようになりました。
    ~]# chcon -R -t httpd_sys_content_t /my/
    ~]# touch /my/website/index.html
    ~]# ls -Z /my/website/index.html
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
    
chcon の詳細は、「一時的な変更: chcon」 を参照してください。
semanage fcontext コマンド(semanagepolicycoreutils-python パッケージにより提供されます )を使用して、再ラベルと restorecon コマンドを維持するラベルの変更を加えます。このコマンドにより、file-context 設定に変更が追加されます。次に、file-context 設定を読み取る restorecon を実行して、ラベルの変更を適用します。以下の例は、httpd で使用する新しいディレクトリーと index.html ファイルを作成し、そのディレクトリーおよびファイルのラベルを永続的に変更して、httpd アクセスを許可する方法を示しています。
  1. mkdir ユーティリティーを root として使用して、httpd が使用する最上位のディレクトリー構造を作成します。
    ~]# mkdir -p /my/website
  2. root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
    "/my(/.*)?" 式は、ラベルの変更が my/ ディレクトリーおよびそれ下のすべてのファイルおよびディレクトリーに適用されることを意味します。
  3. root として touch ユーティリティーを使用して、新規ファイルを作成します。
    ~]# touch /my/website/index.html
  4. root で以下のコマンドを入力してラベルの変更を適用します(手順2semanage コマンドにより変更された file-context 設定)。
    ~]# restorecon -R -v /my/
    restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
semanage の詳細は、「永続的な変更: semanage fcontext」 を参照してください。

13.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。これは、SELinux ポリシーの記述に関する知識なしに、ランタイム時に SELinux ポリシーの一部を変更できるようにするブール値を使用して実現できます。これにより、SELinux ポリシーのリロードや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。
ブール値の状態を変更するには、setsebool コマンドを使用します。たとえば、httpd_anon_write ブール値を有効にするには、root ユーザーとして以下のコマンドを入力します。
~]# setsebool -P httpd_anon_write on
同じ例を使用してブール値を無効にするには、以下のようにコマンドで off に変更します
~]# setsebool -P httpd_anon_write off
注記
setsebool の変更が再起動後も維持する必要がない場合は、- P オプションを使用しないでください。
以下は、httpd の実行方法に cater で使用できる一般的なブール値の説明です。
httpd_anon_write
このブール値により、httpdpublic_content_rw_t タイプのラベルが付いたファイルの読み取りのみが許可されます。このブール値を有効にすると、httpd はパブリックファイル転送サービスのファイルを含むパブリックディレクトリーなどの public_content_rw_t タイプのラベルが付いたファイルに書き込むことができます。
httpd_mod_auth_ntlm_winbind
このブール値を有効にすると、httpd の mod_auth_ntlm_winbind モジュールを使用して、NTLM および Winbind 認証メカニズムにアクセスできます
httpd_mod_auth_pam
このブール値を有効にすると、httpd で mod_auth_pam モジュールを使用して PAM 認証メカニズムにアクセスできます
httpd_sys_script_anon_write
このブール値は、HTTP スクリプトが、パブリックファイル転送サービスで使用される public_content_rw_t タイプのラベルが付いたファイルへの書き込みアクセスを許可するかどうかを定義します。
httpd_builtin_scripting
このブール値は、httpd スクリプトへのアクセスを定義します。このブール値を有効にすると、PHP コンテンツに必要となることがよくあります。
httpd_can_network_connect
無効にすると、このブール値により、HTTP スクリプトとモジュールがネットワークポートまたはリモートポートへの接続を開始できなくなります。このブール値を有効にして、このアクセスを許可するようにします。
httpd_can_network_connect_db
無効にすると、このブール値により、HTTP スクリプトとモジュールがデータベースサーバーへの接続を開始できなくなります。このブール値を有効にして、このアクセスを許可するようにします。
httpd_can_network_relay
httpd を正引きまたはリバースプロキシーとして使用する場合は、このブール値を有効にします。
httpd_can_sendmail
無効にすると、このブール値により、HTTP モジュールがメールが送信されなくなります。これにより、スパム攻撃が httpd に存在することを防ぐことができます。このブール値を有効にして、HTTP モジュールがメールを送信できるようにします。
httpd_dbus_avahi
無効にすると、このブール値はD-Bus を介した avahi サービスへの httpd アクセスを拒否します。このブール値を有効にして、このアクセスを許可するようにします。
httpd_enable_cgi
無効にすると、このブール値により、httpd が CGI スクリプトを実行できなくなります。このブール値を有効にして、httpd が CGI スクリプトを実行 できるようにします(CGI スクリプトには httpd_sys_script_exec_t タイプでラベル付けする必要があります)。
httpd_enable_ftp_server
このブール値を有効にすると、httpd は FTP ポートでリッスンし、FTP サーバーとして機能します。
httpd_enable_homedirs
無効にすると、このブール値により、httpd がユーザーのホームディレクトリーにアクセスできなくなります。このブール値を有効にして、httpd がユーザーのホームディレクトリー にアクセスできるように します(例: /home/*/ のコンテンツ)。
httpd_execmem
このブール値を有効にすると、httpd が、実行可能および書き込み可能なメモリーアドレスを必要とするプログラムを実行できます。このブール値を有効にすると、バッファーオーバーフローに対する保護が削減されますが、特定のモジュールやアプリケーション(Java や Mono アプリケーションなど)にはこの権限が必要なため、このブール値を有効にすることは推奨されていません。
httpd_ssi_exec
このブール値は、Web ページのサーバー側の include(SSI)要素を実行できるかどうかを定義します。
httpd_tty_comm
このブール値は、httpd が制御する端末へのアクセスを許可するかどうかを定義します。通常、このアクセスは必要ありませんが、SSL 証明書ファイルの設定など、パスワードプロンプトを表示および処理するには端末アクセスが必要になります。
httpd_unified
このブール値を有効にすると、httpd_t がすべての httpd タイプ(実行、読み取り、または書き込み)へのアクセスを許可します。無効にすると、読み取り専用、書き込み可能な、または実行ファイルである Web コンテンツと分離できます。このブール値を無効にするとセキュリティーレベルで追加のレベルが確保されますが、ラベルスクリプトや他の Web コンテンツにはそれぞれ必要なファイルアクセスに基づいて、個別にラベルスクリプトやその他の Web コンテンツに必要な管理オーバーヘッドが追加されます。
httpd_use_cifs
このブール値を有効にして、Samba を使用してマウントされているファイルシステムなど、cifs_t タイプのラベルが付いた CIFS ボリュームのファイルへの httpd アクセスを許可します。
httpd_use_nfs
このブール値を有効にして、NFS を使用してマウントされるファイルシステムなど、nfs_t タイプのラベルが付いた NFS ボリュームのファイルへの httpd アクセスを許可します。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

13.4. 設定の例

以下の例は、SELinux が Apache HTTP Server を補完する方法と、Apache HTTP Server の完全な機能を維持する方法に関する実際のデモを紹介します。

13.4.1. 静的サイトの実行

静的 Web サイトを作成するには、その Web サイトの .html ファイルに httpd_sys_content_t タイプのラベルを付けます。デフォルトでは、Apache HTTP Server は httpd_sys_content_t タイプのラベルが付いたファイルに書き込みできません。以下の例では、読み取り専用 Web サイト用のファイルを格納する新しいディレクトリーを作成します。
  1. mkdir ユーティリティーを root として使用して、トップレベルのディレクトリーを作成します。
    ~]# mkdir /mywebsite
  2. root で /mywebsite/index.html ファイルを作成します。/mywebsite/index.html に以下のコンテンツをコピーアンドペーストします。
    <html>
    <h2>index.html from /mywebsite/</h2>
    </html>
    
  3. Apache HTTP Server が /mywebsite/ へのアクセスのみを許可し、その下のファイルおよびサブディレクトリーを許可するには、httpd_sys_content_t タイプのディレクトリーにラベルを付けます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
  4. root として restorecon ユーティリティーを使用して、ラベルを変更します。
    ~]# restorecon -R -v /mywebsite
    restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
  5. この例では、/etc/httpd/conf/httpd.conf ファイルを root として編集します。既存の DocumentRoot オプションをコメントアウトします。a DocumentRoot "/mywebsite" オプションを追加します。編集後、これらのオプションは以下のようになります。
    #DocumentRoot "/var/www/html"
    DocumentRoot "/mywebsite"
    
  6. root で以下のコマンドを実行して、Apache HTTP Server のステータスを確認します。サーバーが停止している場合は、起動します。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    
    ~]# systemctl start httpd.service
    サーバーを実行している場合は、root で以下のコマンドを実行してサービスを再起動します( httpd.confに加えられた変更も適用します)。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: active (running) since Wed 2014-02-05 13:16:46 CET; 2s ago
    
    ~]# systemctl restart httpd.service
  7. Web ブラウザーを使用して http://localhost/index.html に移動します。以下のような出力が表示されます。
    index.html from /mywebsite/
    

13.4.2. NFS および CIFS ボリュームの共有

デフォルトでは、クライアント側への NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトコンテキストでラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは nfs_t タイプを使用します。また、デフォルトでは、クライアント側にマウントされた Samba 共有には、ポリシーで定義されたデフォルトのコンテキストがラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは cifs_t タイプを使用します。
ポリシー設定によっては、サービスは nfs_t タイプまたは cifs_t タイプのラベルが付いたファイルを読み取れない場合があります。これにより、これらのタイプのラベルが付いたファイルシステムがマウントされ、他のサービスによる読み取りやエクスポートが妨げられる可能性があります。ブール値を有効または無効にして、nfs_t タイプおよび cifs_t タイプにアクセスできるサービスを制御できます。
httpd_use_nfs ブール値を有効にして、httpd が NFS ボリュームにアクセスして共有できるようにします( nfs_t タイプでラベル付け)。
~]# setsebool -P httpd_use_nfs on
httpd_use_cifs ブール値を有効にして、httpd が CIFS ボリューム にアクセスして 共有できるようにします(labeled に cifs_t タイプでラベル付け)。
~]# setsebool -P httpd_use_cifs on
注記
setsebool の変更が再起動後も維持する必要がない場合は、- P オプションを使用しないでください。

13.4.3. サービス間でのファイルの共有

Enforcement タイプを使用すると、別のプロセスで使用されるためにプロセスが目的のファイルにアクセスできなくなります。たとえば、Samba はデフォルトで、Apache HTTP Server が使用することが意図されている httpd_sys_content_t タイプのラベルが付いたファイルを読み込むことができません。必要なファイルに public_content_ t または public_content_rw_t タイプでラベルが付けられている場合、ファイルは Apache HTTP Server、FTP、rsync、および Samba 間で共有できます。
以下の例では、ディレクトリーとファイルを作成し、Apache HTTP Server、FTP、rsync、および Samba を介して、ディレクトリーとファイルを共有(読み取り専用)できるようにします。
  1. mkdir ユーティリティーを root として使用して、複数のサービス間でファイルを共有する新しい最上位ディレクトリーを作成します。
    ~]# mkdir /shares
  2. file-context 設定のパターンに一致しないファイルおよびディレクトリーには、default_t タイプのラベルが付けられる場合があります。このタイプは、制限のあるサービスからはアクセスできません。
    ~]$ ls -dZ /shares
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /shares
    
  3. root で /shares/index.html ファイルを作成します。/shares/index.html に以下のコンテンツをコピーアンドペーストします。
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
    
  4. public_content_t タイプで /shares/ にラベルを付けると、Apache HTTP Server、FTP、rsync、および Samba による読み取り専用アクセスが許可されます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
    ~]# semanage fcontext -a -t public_content_t "/shares(/.*)?"
  5. root として restorecon ユーティリティーを使用して、ラベルの変更を適用します。
    ~]# restorecon -R -v /shares/
    restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
    
Samba 経由で /shares/ を共有するには、以下を実行します。
  1. samba パッケージ、samba-common パッケージ、および samba-client パッケージがインストールされていることを確認します(バージョン番号は異なる場合があります)。
    ~]$ rpm -q samba samba-common samba-client
    samba-3.4.0-0.41.el6.3.i686
    samba-common-3.4.0-0.41.el6.3.i686
    samba-client-3.4.0-0.41.el6.3.i686
    
    これらのパッケージがインストールされていない場合は、root で以下のコマンドを実行してインストールします。
    ~]# yum install package-name
  2. root で /etc/samba/smb.conf ファイルを編集します。このファイルの下部に以下のエントリーを追加して、Samba で /shares/ ディレクトリーを共有します。
    [shares]
    comment = Documents for Apache HTTP Server, FTP, rsync, and Samba
    path = /shares
    public = yes
    writable = no
    
  3. Samba ファイルシステムをマウントするには、Samba アカウントが必要です。root で次のコマンドを実行し、Samba アカウントを作成します。ここで、username は既存の Linux ユーザーになります。たとえば、smbpasswd -a testuser は、Linux testuser ユーザーの Samba アカウントを作成します。
    ~]# smbpasswd -a testuser
    New SMB password: Enter a password
    Retype new SMB password: Enter the same password again
    Added user testuser.
    
    上記のコマンドを実行して、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'! error になります
  4. Samba サービスを起動します。
    ~]# systemctl start smb.service
  5. 以下のコマンドを入力して、利用可能な共有の一覧を表示します。username は、手順 3 で追加した Samba アカウントです。パスワードの入力を求められたら、ステップ 3 で Samba アカウントに割り当てられたパスワードを入力します(バージョン番号が異なる場合があります)。
    ~]$ smbclient -U username -L localhost
    Enter username's password:
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Sharename       Type      Comment
    ---------       ----      -------
    shares          Disk      Documents for Apache HTTP Server, FTP, rsync, and Samba
    IPC$            IPC       IPC Service (Samba Server Version 3.4.0-0.41.el6)
    username        Disk      Home Directories
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Server               Comment
    ---------            -------
    
    Workgroup            Master
    ---------            -------
    
  6. mkdir ユーティリティーを使って新規ディレクトリーを作成します。このディレクトリーは、Samba 共有のマウント に使用されます。
    ~]# mkdir /test/
  7. root で以下のコマンドを実行して、Samba 共有の共有を /test/ にマウントします。username は、手順 3 のユーザー名に置き換えます
    ~]# mount //localhost/shares /test/ -o user=username
    ステップ 3 で設定した ユーザー名のパスワード を入力します。
  8. Samba で共有されるファイルの内容を表示します。
    ~]$ cat /test/index.html
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
    
Apache HTTP Server から /shares/ を共有するには、以下を行います。
  1. httpd パッケージがインストールされていることを確認します(バージョン番号が異なる場合があります)。
    ~]$ rpm -q httpd
    httpd-2.2.11-6.i386
    
    このパッケージがインストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
    ~]# yum install httpd
  2. /var/www/html/ ディレクトリーに移動します。root で以下のコマンドを実行して、/shares/ ディレクトリーへのリンク(名前付き 共有)を作成します。
    html]# ln -s /shares/ shares
  3. Apache HTTP Server を起動します。
    ~]# systemctl start httpd.service
  4. Web ブラウザーを使用して http://localhost/shares に移動します。/shares/index.html ファイルが表示されます。
デフォルトでは、Apache HTTP Server は index.html ファイルが存在する場合は読み取ります。/shares/index.html がなく、代わりに file1file2、および file3 がある場合は 、http://localhost/shares へのアクセス時にディレクトリーの一覧が発生します。
  1. index.html ファイルを削除します。
    ~]# rm -i /shares/index.html
  2. root として touch ユーティリティーを使用して、/shares/ に 3 つのファイルを作成します。
    ~]# touch /shares/file{1,2,3}
    ~]# ls -Z /shares/
    -rw-r--r--  root root system_u:object_r:public_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file3
    
  3. root で以下のコマンドを実行して、Apache HTTP Server のステータスを確認します。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    
    サーバーが停止している場合は、起動します。
    ~]# systemctl start httpd.service
  4. Web ブラウザーを使用して http://localhost/shares に移動します。ディレクトリーの一覧が表示されます。

13.4.4. ポート番号の変更

ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。root ユーザーで semanage ユーティリティーを使用して、httpd がリッスンするポート の一覧を表示します。
~]# semanage port -l | grep -w http_port_t
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
デフォルトでは、SELinux は、httpd が TCP ポート 80、443、488、8008、8009、または 8443 をリッスンできるようにします。httpdhttp_port_t に記載されていないポートをリッスンするように /etc/httpd/conf/httpd.conf を設定すると、httpdは起動に失敗し ます。
TCP ポート 80、443、488、8008、8009、または 8443 以外のポートで httpd を設定するには、以下を実行します。
  1. Listen オプションが httpd 用の SELinux ポリシーで設定されていないポートを一覧表示するように、root として /etc/httpd/conf/httpd.conf ファイルを編集します。以下の例では、httpd が 10.0.0.1 IP アドレスと TCP ポート 12345 をリッスンするように設定します。
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 10.0.0.1:12345
    
  2. root ユーザーで以下のコマンドを実行して、SELinux ポリシー設定にポートを追加します。
    ~]# semanage port -a -t http_port_t -p tcp 12345
  3. ポートが追加されていることを確認します。
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      12345, 80, 443, 488, 8008, 8009, 8443
    
ポート 12345 で httpd を実行しなくなった場合は、root で semanage ユーティリティーを使用して、ポリシー設定からポートを削除します。
~]# semanage port -d -t http_port_t -p tcp 12345

第14章 Samba

Samba は、Server Message Block(SMB)プロトコルおよび Common Internet File System(CIFS)プロトコルのオープンソースの実装です。[15]
Red Hat Enterprise Linux では、samba パッケージが Samba サーバーを提供します。以下のコマンドを入力して、samba パッケージがインストールされ ているかどうかを確認します。
~]$ rpm -q samba
package samba is not installed
インストールされておらず、Samba を使用する場合は、root ユーザーとして yum ユーティリティーを使用してインストールします。
~]# yum install samba

14.1. Samba および SELinux

SELinux を有効にすると、Samba サーバー(smbd)はデフォルトで制限のある実行されます。制限のあるサービスは独自のドメインで実行され、他の制限のあるサービスから分離されます。以下の例は、独自のドメインで実行している smbd プロセスを示しています。この例では、samba パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root で次のコマンドを実行し、smbd を起動します。
    ~]# systemctl start smb.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status smb.service
    smb.service - Samba SMB Daemon
       Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled)
       Active: active (running) since Mon 2013-08-05 12:17:26 CEST; 2h 22min ago
    
  3. smbd プロセスを表示するには、以下のコマンドを実行します。
    ~]$ ps -eZ | grep smb
    system_u:system_r:smbd_t:s0      9653 ?        00:00:00 smbd
    system_u:system_r:smbd_t:s0      9654?        00:00:00 smbd
    
    smbd プロセスに関連付けられた SELinux コンテキストは、system _u:system_r:smbd _t:s0 です。次のコンテキストの最後の部分は smbd_t です。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、smbd プロセスは smbd _t ドメインで実行されます。
smbd がアクセスして共有できるように、ファイルに適切にラベル付けする必要があります。たとえば、smbdsamba_share_t タイプのラベルが付いたファイルに読み取りおよび書き込みできますが、デフォルトでは、Apache HTTP Server が使用することを目的としている httpd_sys_content_t タイプのラベルが付いたファイルにアクセスできません。Samba を介してホームディレクトリーや NFS ボリュームをエクスポートしたり、Samba がドメインコントローラーとして動作することができるようにするなど、特定の動作を許可するブール値を有効にする必要があります。

14.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
Samba がそのタイプを共有できるように、samba_share_t タイプのファイルにラベルを付けます。作成したファイルのみに、samba _share_t タイプでシステムファイルの再ラベル付けは行いません。このようなファイルおよびディレクトリーを共有するブール値を有効にできます。SELinux により、/etc/samba/smb.conf ファイルおよび Linux のパーミッションが適宜設定しない限り、Samba は samba_share_t タイプのラベルが付いたファイルに書き込みできます。
samba_etc_t タイプは、smb.conf などの /etc/samba/ ディレクトリーの特定のファイルで使用されます。samba_etc_t タイプのファイルに手動でラベルを付けないでください。このディレクトリーのファイルが正しくラベル付けされていない場合は、root ユーザーとして restorecon -R -v /etc/samba コマンドを入力して、このようなファイルをデフォルトのコンテキストに復元します。/etc/samba/smb.confsamba_etc_t タイプのラベルが付けられていない場合は、Samba サービスの起動に失敗し、SELinux 拒否メッセージがログに記録される可能性があります。以下は、/etc/samba/smb.confhttpd_sys_content_t タイプのラベルが付けられた場合の拒否メッセージの例です。
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af

14.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
smbd_anon_write
このブール値を有効にすると、smbd は、特別なアクセス制限のない共通ファイルに予約されている領域など、パブリックディレクトリーに書き込むことができます。
samba_create_home_dirs
このブール値を有効にすると、Samba が新しいホームディレクトリーを個別に作成できます。これは多くの場合、PAM などのメカニズムで実行します。
samba_domain_controller
このブール値を有効にすると、Samba がドメインコントローラーとして動作するだけでなく、useraddgroupaddpasswd などの関連するコマンドを実行する権限を与えます。
samba_enable_home_dirs
このブール値を有効にすると、Samba はユーザーのホームディレクトリーを共有できます。
samba_export_all_ro
ファイルまたはディレクトリーをエクスポートし、読み取り専用パーミッションを許可します。これにより、samba _share_t タイプでラベル付けされていないファイルおよびディレクトリーは Samba で共有できるようになります。samba_export_all_ro ブール値が有効になりますが、/etc/samba/smb.conf で書き込みアクセスが設定されている場合でも、samba _ export_all_rw ブール値は、Samba 共有への書き込みアクセスが拒否されます。
samba_export_all_rw
ファイルまたはディレクトリーをエクスポートし、読み取りおよび書き込みのパーミッションを許可します。これにより、samba _share_t タイプでラベル付けされていないファイルおよびディレクトリーは Samba 経由でエクスポートできます。書き込みアクセスを許可するよう、/etc/samba/smb.conf および Linux の権限を設定する必要があります。
samba_run_unconfined
このブール値を有効にすると、Samba は /var/lib/samba/scripts/ ディレクトリーで制限のないスクリプトを実行します。
samba_share_fusefs
Samba が fusefs ファイルシステムを共有するには、このブール値を有効にする必要があります。
samba_share_nfs
このブール値を無効にすると、smbd が Samba 経由で NFS 共有にフルアクセスされないようにします。このブール値を有効にすると、Samba が NFS ボリュームを共有できるようになります。
use_samba_home_dirs
このブール値が Samba ホームディレクトリーにリモートサーバーを使用するようにします。
virt_use_samba
仮想マシンが CIFS ファイルにアクセスできるようにします。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

14.4. 設定の例

以下の例は、SELinux が Samba サーバーを補完する方法と、Samba サーバーの完全な機能を維持する方法に関する実際のデモを紹介します。

14.4.1. 作成するディレクトリーの共有

以下の例では、新しいディレクトリーを作成し、Samba を介してそのディレクトリーを共有します。
  1. samba パッケージ、samba-common パッケージ、および samba-client パッケージがインストールされていることを確認します。
    ~]$ rpm -q samba samba-common samba-client
    package samba is not installed
    package samba-common is not installed
    package samba-client is not installed
    
    これらのパッケージのいずれかがインストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
    ~]# yum install package-name
  2. mkdir ユーティリティーを root として使用して、Samba を介してファイルを共有する新しい最上位ディレクトリーを作成します。
    ~]# mkdir /myshare
  3. touch ユーティリティーの root を使用して空のファイルを作成します。このファイルは後で、Samba 共有が正しくマウントされたことを確認するために使用されます。
    ~]# touch /myshare/file1
  4. SELinux により、/etc/samba/smb.conf ファイルと Linux のパーミッションが随時設定されない限り、Samba が samba_share_t タイプのラベルが付いたファイルに読み取りおよび書き込みを行うことができます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。
    ~]# semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
  5. root として restorecon ユーティリティーを使用して、ラベルの変更を適用します。
    ~]# restorecon -R -v /myshare
    restorecon reset /myshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
    restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
    
  6. root で /etc/samba/smb.conf を編集します。Samba を介して /myshare/ ディレクトリーを共有するには、このファイルの下部に以下を追加します。
    [myshare]
    comment = My share
    path = /myshare
    public = yes
    writable = no
    
  7. Samba ファイルシステムをマウントするには、Samba アカウントが必要です。root で次のコマンドを実行し、Samba アカウントを作成します。ここで、username は既存の Linux ユーザーになります。たとえば、smbpasswd -a testuser は、Linux testuser ユーザーの Samba アカウントを作成します。
    ~]# smbpasswd -a testuser
    New SMB password: Enter a password
    Retype new SMB password: Enter the same password again
    Added user testuser.
    
    上記のコマンドを入力して、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'! error になります
  8. Samba サービスを起動します。
    ~]# systemctl start smb.service
  9. 以下のコマンドを入力して、利用可能な共有の一覧を表示します。username は、手順 7 に追加された Samba アカウントに置き換えます。パスワードの入力を求められたら、ステップ 7 で Samba アカウントに割り当てられたパスワードを入力します(バージョン番号が異なる場合があります)。
    ~]$ smbclient -U username -L localhost
    Enter username's password:
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Sharename       Type      Comment
    ---------       ----      -------
    myshare         Disk      My share
    IPC$            IPC       IPC Service (Samba Server Version 3.4.0-0.41.el6)
    username        Disk      Home Directories
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Server               Comment
    ---------            -------
    
    Workgroup            Master
    ---------            -------
    
  10. mkdir ユーティリティーを root として使用して、新しいディレクトリーを作成します。このディレクトリーは、my share Samba 共有をマウントするために使用されます。
    ~]# mkdir /test/
  11. root で以下のコマンドを実行して、my share Samba 共有を /test/ にマウントします。username は、手順 7 のユーザー名に置き換えます
    ~]# mount //localhost/myshare /test/ -o user=username
    ステップ 7 で設定した ユーザー名のパスワード を入力します。
  12. 以下のコマンドを入力して、手順 3 で作成した file1 ファイルを表示します。
    ~]$ ls /test/
    file1
    

14.4.2. Web サイトの共有

/var/www/html/ ディレクトリーで Web サイトを共有する場合などに、samba _share_t タイプのファイルにラベルを付けることができない場合があります。このような場合は、samba _export_all_ro ブール値を使用して、ファイルまたはディレクトリーを共有し(現在のラベルに関係なく)、読み取りのみのパーミッションまたは samba_export_all_rw ブール値を使用してファイルやディレクトリーを共有し、読み取りおよび書き込みのパーミッションを許可します。
以下の例では、/var/www/html/ に Web サイト用のファイルを作成し、そのファイルを Samba を介して共有し、読み取りおよび書き込みパーミッションを許可します。この例では、httpd、samba samba-commonsamba-clientwget パッケージがインストールされていることを前提としています。
  1. root ユーザーとして、/var/www/html/file1.html ファイルを作成します。このファイルに以下の内容をコピーして貼り付けます。
    <html>
    <h2>File being shared through the Apache HTTP Server and Samba.</h2>
    </html>
    
  2. 以下のコマンドを実行して、file1.html の SELinux コンテキストを表示します。
    ~]$ ls -Z /var/www/html/file1.html
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1.html
    
    このファイルには、httpd_sys_content_t のラベルが付けられます。デフォルトでは、Apache HTTP Server はこのタイプにアクセスできますが、Samba はアクセスできません。
  3. Apache HTTP Server を起動します。
    ~]# systemctl start httpd.service
  4. ユーザーが書き込みアクセスを持つディレクトリーに移動し、以下のコマンドを入力します。デフォルト設定が変更されない限り、このコマンドは成功します。
    ~]$ wget http://localhost/file1.html
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 84 [text/html]
    Saving to: `file1.html.1'
    
    100%[=======================>] 84          --.-K/s   in 0s      
    
    `file1.html.1' saved [84/84]
    
  5. root で /etc/samba/smb.conf を編集します。以下をこのファイルの下部に追加して、Samba で /var/www/html/ ディレクトリーを共有します。
    [website]
    comment = Sharing a website
    path = /var/www/html/
    public = no
    writable = no
    
  6. /var/www/html/ ディレクトリーには、httpd_sys_content_t タイプのラベルが付けられます。デフォルトでは、Samba は、Linux パーミッションが許可していても、このタイプのラベルが付いたファイルおよびディレクトリーにはアクセスできません。Samba のアクセスを許可するには、samba _export_all_ro のブール値を有効にします。
    ~]# setsebool -P samba_export_all_ro on
    再起動後も変更が 維持しない場合は、-P オプションを使用しないでください。samba_export_all_ro ブール値を有効にすると、Samba がすべてのタイプにアクセスできるようにします。
  7. Samba サービスを起動します。
    ~]# systemctl start smb.service

第15章 ファイル転送プロトコル

ファイル転送プロトコル(FTP)は、今日インターネット上で見られる最も古いプロトコルと最も一般的に使用されるプロトコルの 1 つです。その目的は、ユーザーがリモートホストに直接ログインしなくても、もしくはリモートシステムの使用方法に関する知識がなくても、ネットワーク上のコンピューターホスト間で確実にファイルを転送することです。これにより、ユーザーは、標準の簡単なコマンドセットを使用してリモートシステム上のファイルにアクセスすることができます。
Very Secure FTP Daemon(vsftpd)は、高速で安定し、最も重要な点となるように設計されています。多数の接続を効率的かつセキュアに処理できる機能は、vsftpd が Red Hat Enterprise Linux とともに配布される唯一のスタンドアロン FTP であるためです。
Red Hat Enterprise Linux では、vsftpd パッケージは Very Secure FTP デーモンを提供します。以下のコマンドを実行して、vsftpd がインストールされているかどうかを確認します。
~]$ rpm -q vsftpd
package vsftpd is not installed
FTP サーバーと vsftpd パッケージがインストールされていない場合は、root ユーザーとして yum ユーティリティーを使用してインストールします。
~]# yum install vsftpd

15.1. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
デフォルトでは、匿名ユーザーは FTP を使用してログイン時に /var/ftp/ ディレクトリー内のファイルへの読み取りアクセスがあります。書き込みアクセスが /etc/vsftpd/vsftpd.conf に設定されている場合でも、このディレクトリーには public_content_t タイプのラベルが付けられ、読み取りアクセスのみが許可されます。public_content_t タイプは、Apache HTTP Server、Samba、NFS などの他のサービスからアクセスできます。
以下のいずれかのタイプを使用して、FTP でファイルを共有します。
public_content_t
vsftpd 経由で読み取り専用に共有するために、public_content_t タイプで作成したファイルおよびディレクトリーにラベルを付けます。Apache HTTP Server、Samba、NFS などの他のサービスは、このタイプのラベルが付いたファイルにもアクセスできます。Linux パーミッションで書き込みアクセスを許可していても、public_content_t タイプのラベルが付いたファイルは書き込みできません。書き込みアクセスが必要な場合は、public_content_rw_t タイプを使用します。
public_content_rw_t
vsftpd を介して読み取りおよび書き込みパーミッションと共有するために、public_content_rw_t タイプで作成したファイルおよびディレクトリーにラベルを付けます。Apache HTTP Server、Samba、NFS などの他のサービスは、このタイプのラベルが付いたファイルにもアクセスできます。各サービスのブール値は、このタイプのラベルが付けられたファイルに書き込む前に有効にする必要があります。

15.2. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
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
このブール値を有効にすると、vsftpdcifs_t タイプのラベルが付いたファイルおよびディレクトリーにアクセスできるようになります。そのため、このブール値を有効にすると、vsftpd を介して Samba を使用してマウントされたファイルシステムを共有できます。
ftpd_use_nfs
このブール値を有効にすると、vsftpdnfs_t タイプのラベルが付いたファイルやディレクトリーにアクセスすることができるため、このブール値により、vsftpd を介して NFS を使用してマウントされたファイルシステムを共有できます。
ftpd_connect_db
FTP デーモンがデータベースへの接続を開始できるようにします。
httpd_enable_ftp_server
httpd デーモンが FTP ポートをリッスンし、FTP サーバーとして動作することを許可します。
tftp_anon_write
このブール値を有効にすると、特別なアクセス制限のない共通ファイル用に予約されている領域など、TFTP がパブリックディレクトリーにアクセスできるようになります。
重要
Red Hat Enterprise Linux 7.7 では、ftp_home_dir のブール値が提供されていません。詳細は、『 Red Hat Enterprise Linux 7.3 リリースノート』 を参照してください。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

第16章 ネットワークファイルシステム

ネットワークファイルシステム(NFS)により、リモートホストはネットワーク経由でファイルシステムをマウントし、そのファイルシステムを、ローカルにマウントしているファイルシステムと同じように操作できます。また、システム管理者は、リソースをネットワーク上の中央サーバーに統合することができるようになります。[16]
Red Hat Enterprise Linux では、NFS の完全なサポートには nfs-utils パッケージが必要です。以下のコマンドを実行して、nfs-utils がインストールされているかどうかを確認します。
~]$ rpm -q nfs-utils
package nfs-utils is not installed
インストールされておらず、NFS を使用する場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install nfs-utils

16.1. NFS および SELinux

SELinux を実行すると、NFS デーモンはデフォルトで、nfsd プロセス を除き制限されます。これは、制限のない kernel_t ドメインタイプのラベルが付けられます。SELinux ポリシーにより、デフォルトでは NFS がファイルを共有できるようになります。また、クライアントとサーバー間で SELinux ラベルを渡すと、NFS ボリュームにアクセスする制限のあるドメインをより適切に制御できます。たとえば、ホームディレクトリーが NFS ボリュームに設定されている場合、ボリューム上の他のディレクトリーではなく、ホームディレクトリーのみにアクセスできる制限のあるドメインを指定できます。同様に、Secure Virtualization などのアプリケーションは、NFS ボリュームにイメージファイルのラベルを設定することができるため、仮想マシンの分離レベルが向上します。
ラベル付き NFS のサポートは無効です。これを有効にするには、「SELinux ラベル付き NFS サポートの有効化」 を参照してください。

16.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
デフォルトでは、クライアント側にマウントされた NFS ボリュームには、NFS のポリシーで定義されたデフォルトのコンテキストがラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは nfs_t タイプを使用します。root ユーザーは、mount -context オプションを使用してデフォルトタイプを上書きできます。以下のタイプは、NFS とともに使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
var_lib_nfs_t
このタイプは、/var/lib/nfs/ ディレクトリーにコピーまたは作成された既存のファイルと新しいファイルに使用されます。このタイプは、通常の操作で変更する必要はありません。デフォルト設定への変更を復元するには、root ユーザーで restorecon -R -v /var/lib/nfs コマンドを実行します。
nfsd_exec_t
/usr/sbin/rpc.nfsd ファイルには、NFS に関連する他のシステム実行ファイルとライブラリーであるため、nfsd _exec_t というラベルが付けられます。nfsd_exec_t が nfsd_t に移行します

16.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
ftpd_use_nfs
このブール値を有効にすると、ftpd デーモンが NFS ボリュームにアクセスできるようになります。
cobbler_use_nfs
このブール値を有効にすると、cobblerd デーモンが NFS ボリュームにアクセスできるようになります。
git_system_use_nfs
このブール値を有効にすると、Git システムデーモンが NFS ボリュームのシステム共有リポジトリーを読み取ることができます。
httpd_use_nfs
このブール値を有効にすると、httpd デーモンが NFS ボリュームに保存されているファイルにアクセスできるようになります。
samba_share_nfs
このブール値を有効にすると、smbd デーモンが NFS ボリュームを共有できるようになります。このブール値を設定すると、smbd が Samba を使用して NFS 共有にフルアクセスできなくなります。
sanlock_use_nfs
このブール値を有効にすると、sanlock デーモンが NFS ボリュームを管理できます。
sge_use_nfs
このブール値を有効にすると、s ge スケジューラーは NFS ボリュームにアクセスできるようになります。
use_nfs_home_dirs
このブール値を有効にすると、NFS ホームディレクトリーのサポートが追加されました。
virt_use_nfs
このブール値を有効にすると、仮想ゲストが NFS ボリュームのファイルを管理できるようにします。
xen_use_nfs
このブール値を有効にすると、NFS ボリューム上のファイル( Xen )を管理できます。
git_cgi_use_nfs
このブール値を有効にすると、Git Common Gateway Interface(CGI)が NFS ボリュームにアクセスできるようになります。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

16.4. 設定の例

16.4.1. SELinux ラベル付き NFS サポートの有効化

以下の例は、SELinux のラベルが付いた NFS サポートを有効にする方法を示しています。この例では、nfs-utils パッケージがインストールされ、SELinux ターゲットポリシーが使用されていること、および SELinux が Enforcing モードで実行されていることを前提としています。
注記
手順 1-3 は、NFS サーバー( nfs-srv )で実行する必要があります。
  1. NFS サーバーを実行している場合は、停止します。
    [nfs-srv]# systemctl stop nfs
    サーバーが停止していることを確認します。
    [nfs-srv]# systemctl status nfs
    nfs-server.service - NFS Server
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
       Active: inactive (dead)
    
  2. /etc/sysconfig/nfs ファイルを編集し、RPCNFSDARGS フラグを "-V 4.2" に設定します。
    # Optional arguments passed to rpc.nfsd. See rpc.nfsd(8)
    RPCNFSDARGS="-V 4.2"
  3. サーバーを再度起動し、サーバーが稼働していることを確認します。出力には以下の情報が含まれ、タイムスタンプのみが異なります。
    [nfs-srv]# systemctl start nfs
    [nfs-srv]# systemctl status nfs
    nfs-server.service - NFS Server
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
       Active: active (exited) since Wed 2013-08-28 14:07:11 CEST; 4s ago
    
  4. クライアントで、NFS サーバーをマウントします。
    [nfs-client]# mount -o v4.2 server:mntpoint localmountpoint
  5. すべての SELinux ラベルがサーバーからクライアントに正常に渡されるようになりました。
    [nfs-srv]$ ls -Z file
    -rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file
    [nfs-client]$ ls -Z file
    -rw-rw-r--. user user unconfined_u:object_r:svirt_image_t:s0 file
注記
ホームディレクトリーまたは他のコンテンツの NFS サポートにラベルを付けると、コンテンツには EXT ファイルシステム上と同じラベルが付けられます。また、異なるバージョンの NFS があるシステムのマウントや、ラベル付き NFS をサポートしないサーバーのマウントを試みると、エラーが返される可能性があることに注意してください。


[16] 詳細は、『 ストレージ管理ガイド』 の「 ネットワークファイルシステム(NFS)」 の章を参照してください。

第17章 BIND (Berkeley Internet Name Domain)

BIND は、named デーモンを使用して名前解決サービスを実行します BIND を使用すると、ユーザーは数値アドレスではなく、コンピューターリソースとサービスを名前で特定できます。
Red Hat Enterprise Linux では、bind パッケージは DNS サーバーを提供します。以下のコマンドを実行して、bind パッケージがインストールされているかどうかを確認します。
~]$ rpm -q bind
package bind is not installed
インストールされていない場合は、root ユーザーとして yum ユーティリティーを使用してインストールします。
~]# yum install bind

17.1. BIND および SELinux

/var/named/slaves/、/ var/ named/dynamic/、および /var/named/data/ ディレクトリーのデフォルトのパーミッションにより、ゾーン転送および動的 DNS 更新を使用してゾーンファイルを更新できます。/var/named/ のファイルには、マスターゾーンファイルに使用される named_zone_t タイプのラベルが付けられます。
スレーブサーバーの場合は、/etc/named.conf ファイルを / var/named/slaves/ にスレーブゾーンを配置するように設定します。以下は、/ var /named/slaves/ testdomain.com のゾーンファイルを保存するスレーブ DNS サーバーのドメインエントリーの例です。
zone "testdomain.com" {
			type slave;
			masters { IP-address; };
			file "/var/named/slaves/db.testdomain.com";
		       };
ゾーンファイルに named_zone_t というラベルが付けられている場合、ゾーン転送と動的 DNS がゾーンファイルを更新できるように、named _write_master_zones ブール値を有効にする必要があります。また、親ディレクトリーのモードを変更して、名前付き ユーザーまたはグループの読み取りおよび書き込みアクセスを許可する必要があります。
/var/named/ のゾーンファイルに named_cache_t タイプのラベルが付けられると、ファイルシステムのラベルや restorecon -R /var/ の実行で、そのタイプを named_zone_t に変更します。

17.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
BIND では以下のタイプが使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
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. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
named_write_master_zones
無効にすると、このブール値は named が named _zone_t タイプのラベルが付いたゾーンファイルやディレクトリーに書き込むのを防ぎます。デーモンは、通常ゾーンファイルに書き込みする必要はありません。ただし、必要な場合は、またはセカンダリーサーバーがゾーンファイルに書き込みする必要がある場合は、このブール値を有効にして、このアクションを許可します。
named_tcp_bind_http_port
このブール値を有効にすると、BIND が Apache ポートをバインドすることができます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

17.4. 設定の例

17.4.1. Dynamic DNS

BIND を使用すると、ホストは DNS およびゾーンファイルのレコードを動的に更新できます。これは、ホストコンピューターの IP アドレスが頻繁に変更され、DNS レコードにリアルタイムの変更が必要な場合に使用されます。
動的 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
また、以下の SELinux 拒否メッセージがログに記録されます。
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
このラベルの問題を解決するには、root で restorecon ユーティリティーを使用します。
~]# restorecon -R -v /var/named/dynamic

第18章 同時バージョン管理システム

Concurrent Versioning System(CVS)は、無料リビジョン管理システムです。これは、通常、異なるユーザーがアクセスする中央ファイルセットに対する変更を監視および追跡するために使用されます。通常、これはプログラマーがソースコードリポジトリーを管理するために使用され、オープンソース開発者が広く使用されています。
Red Hat Enterprise Linux では、cvs パッケージが CVS を提供します。以下のコマンドを実行して、cv s パッケージがインストールされているかどうかを確認します。
~]$ rpm -q cvs
package cvs is not installed
インストールされておらず、CVS を使用する場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install cvs

18.1. cvs および SELinux

cvs デーモンは cvs_t タイプのラベルが付けられます。Red Hat Enterprise Linux では、CVS は特定のディレクトリーの読み取りと書き込みのみが許可されます。ラベル cvs_data_t は、cvs が読み取りおよび書き込みアクセスを持つエリアを定義します。SELinux で CVS を使用する場合は、クライアントが CVS データ用に予約されている領域にフルアクセスできるようにするには、正しいラベルを割り当てる必要があります。

18.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは CVS で使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
cvs_data_t
このタイプは、CVS リポジトリーのデータに使用されます。CVS は、このタイプのデータに対する完全アクセスのみを取得できます。
cvs_exec_t
このタイプは、/usr/bin/cvs バイナリーに使用します。

18.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
cvs_read_shadow
このブール値により、cvs デーモンがユーザー認証用に /etc/shadow ファイルにアクセスできます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

18.4. 設定の例

18.4.1. CVS の設定

この例では、簡単な CVS 設定と、リモートアクセスを可能にする SELinux 設定を説明します。この例では、ホスト 2 台を使用しています。ホスト名が cvs-srv で、IP アドレスが 192.168.1.1 の CVS サーバーと、cv s-client のホスト名と 192.168.1.100 の IP アドレスを持つクライアント。両方のホストが同じサブネット上にあります(192.168.1.0/24)。これは唯一の例であり、cvs および xinetd パッケージがインストールされ、SELinux のターゲットポリシーが使用され、SELinux が強制モードで実行されていることを前提としています。
この例では、完全な DAC パーミッションであっても、SELinux はファイルラベルに基づいてポリシールールを強制でき、CVS によるアクセスにとくにラベル付けされた特定の領域へのアクセスのみを許可することを示しています。
注記
手順 1-9 は、CVS サーバー cvs-srv で実行する必要があります。
  1. この例では、cv パッケージおよび xinetd パッケージが必要です。パッケージがインストールされていることを確認します。
    [cvs-srv]$ rpm -q cvs xinetd
    package cvs is not installed
    package xinetd is not installed
    
    インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
    [cvs-srv]# yum install cvs xinetd
  2. root で以下のコマンドを入力し、CVS という名前のグループ を作成します
    [cvs-srv]# groupadd CVS
    これは、system-config-users ユーティリティーを使用して行うこともできます
  3. ユーザー名 cvsuser でユーザーを作成し、このユーザーを CVS グループのメンバーにします。これは、system-config-users を使用して実行できます。
  4. /etc/services ファイルを編集し、CVS サーバーに以下のようなエントリーのコメントを解除していることを確認します。
    cvspserver	2401/tcp			# CVS client/server operations
    cvspserver	2401/udp			# CVS client/server operations
    
  5. ファイルシステムのルート領域に CVS リポジトリーを作成します。SELinux を使用する場合は、他のサブディレクトリーに影響を与えずに再帰的なラベルを指定できるように root ファイルシステム内にリポジトリーを指定することが推奨されます。たとえば、root で、リポジトリー を格納する /cvs/ ディレクトリーを作成します。
    [root@cvs-srv]# mkdir /cvs
  6. 全ユーザーに対して /cvs/ ディレクトリーへの完全なパーミッションを付与します。
    [root@cvs-srv]# chmod -R 777 /cvs
    警告
    これは唯一の例であり、これらのパーミッションは実稼働システムでは使用しないでください。
  7. /etc/xinetd.d/cvs ファイルを編集し、CVS セクションのコメントが解除され、/ cvs/ ディレクトリーを使用するように 設定されていることを確認します。ファイルは以下のようになるはずです。
    service cvspserver
    {
    	disable	= no
    	port			= 2401
    	socket_type		= stream
    	protocol		= tcp
    	wait			= no
    	user			= root
    	passenv			= PATH
    	server			= /usr/bin/cvs
    	env			= HOME=/cvs
    	server_args		= -f --allow-root=/cvs pserver
    #	bind			= 127.0.0.1
    
  8. xinetd デーモンを起動します。
    [cvs-srv]# systemctl start xinetd.service
  9. system-config-firewall ユーティリティーを使用して、ポート 2401 で TCP 経由の受信接続を許可するルールを追加します。
  10. クライアント側で、cv suser ユーザーとして以下のコマンドを入力します。
    [cvsuser@cvs-client]$ cvs -d /cvs init
  11. この時点で、CVS は設定されていますが、SELinux はログインおよびファイルのアクセスを拒否します。これを行うには、cv s-client$CVSROOT 変数を設定し、リモートでログインしてみてください。次の手順は、cv s-client で実行する必要があります。
    [cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
    [cvsuser@cvs-client]$
    [cvsuser@cvs-client]$ cvs login
    Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
    CVS password: ********
    cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot open /cvs/CVSROOT/config: Permission denied
    
    SELinux のアクセスがブロックされています。このアクセスを許可する SELinux を取得するには、cv s-srv で以下の手順を実行 する必要があります。
  12. /cvs/ ディレクトリー内の既存データおよび新しいデータを再帰的にラベル付けするために、/ cvs/ ディレクトリーのコンテキストを root として変更し、それに cvs_data_t タイプを指定します。
    [root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?'
    [root@cvs-srv]# restorecon -R -v /cvs
  13. クライアント cvs-client がログインでき、このリポジトリー内のすべての CVS リソースにアクセスできるようになりました。
    [cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
    [cvsuser@cvs-client]$
    [cvsuser@cvs-client]$ cvs login
    Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
    CVS password: ********
    [cvsuser@cvs-client]$
    

第19章 Squid キャッシュプロキシー

Squid は、Web クライアント、FTP、Gopher、および HTTP データオブジェクト用の高パフォーマンスプロキシーキャッシュサーバーです。これにより、頻繁に要求した Web ページをキャッシュして再利用することで、帯域幅が削減され、応答時間が改善します。[17]
Red Hat Enterprise Linux では、squid パッケージは Squid キャッシュプロキシーを提供します。以下のコマンドを入力して、squid パッケージがインストールされ ているかどうかを確認します。
~]$ rpm -q squid
package squid is not installed
インストールされておらず、squid を使用する場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install squid

19.1. Squid キャッシュプロキシーおよび SELinux

SELinux を有効にすると、Squid はデフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している Squid プロセスを示しています。この例では、squid パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root ユーザーで以下のコマンドを実行して、squid デーモンを起動 します
    ~]# systemctl start squid.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:45:53 CEST; 2s ago
  3. 以下のコマンドを入力して、squid プロセス を表示します
    ~]$ ps -eZ | grep squid
    system_u:system_r:squid_t:s0    27018 ?        00:00:00 squid
    system_u:system_r:squid_t:s0    27020 ?        00:00:00 log_file_daemon
    
    squid プロセスに関連付けられている SELinux コンテキストは、system _u:system_r:squid_t:s0 です。2 番目のコンテキストの最後の部分(squid _t )は、タイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、Squid プロセスは squid_t ドメインで実行されます。
SELinux ポリシーは、squid _t などの制限のあるドメインで実行しているプロセスが、ファイル、その他のプロセス、一般的なシステムを操作する方法を定義します。squid のアクセスを許可するには、ファイルに適切にラベル付けする必要があります。
/etc/squid/squid.conf ファイルを設定すると、squid はデフォルトの TCP ポート 3128、3401、または 4827 以外の ポートでリッスン する場合は、semanage port コマンドを使用して、必要なポート番号を SELinux ポリシー設定に追加します。以下の例は、squid を設定して、SELinux ポリシー設定で最初に定義されていないポートをリッスンするように設定します。その結果、サーバーは起動に失敗します。また、この例では、デーモンがポリシーに定義されていない標準以外のポートで正常にリッスンできるように SELinux システムを設定する方法も示しています。この例では、squid パッケージがインストールされていることを前提としています。以下の例で各コマンドを root ユーザーとして実行します。
  1. squid デーモンが実行していないことを確認します。
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: inactive (dead)
    
    出力が異なる場合は、プロセスを停止します。
    ~]# systemctl stop squid.service
  2. 以下のコマンドを実行して、SELinux で squid がリッスンできるようにポートを表示します。
    ~]# semanage port -l | grep -w -i squid_port_t
    squid_port_t                   tcp      3401, 4827
    squid_port_t                   udp      3401, 4827
    
    
  3. root で /etc/squid/squid.conf を編集します。squid の SELinux ポリシー設定で設定されていないポートを一覧表示するように、http _port オプションを設定します。この例では、デーモンはポート 10000 でリッスンするように設定されています。
    # Squid normally listens to port 3128
    http_port 10000
    
  4. setsebool コマンドを実行して、squid _connect_any のブール値が off に設定されていることを確認します。これにより squid は特定のポートでのみ操作できます。
    ~]# setsebool -P squid_connect_any 0
  5. squid デーモンを起動します。
    ~]# systemctl start squid.service
    Job for squid.service failed. See 'systemctl status squid.service' and 'journalctl -xn' for details.
    
    以下のような SELinux 拒否メッセージがログに記録されます。
    localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
    
  6. SELinux で、squid がポート 10000 をリッスン できるようにするには、このコマンドが必要です。
    ~]# semanage port -a -t squid_port_t -p tcp 10000
  7. squid を再度開始して、新しいポートでリッスンします。
    ~]# systemctl start squid.service
  8. Squid が標準以外のポート(この例では TCP 10000)でリッスンできるように SELinux が設定されたため、このポートで正常に起動します。

19.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは Squid で使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。
httpd_squid_script_exec_t
このタイプは、Squid とその設定に関するさまざまな統計を提供する cachemgr.cgi などのユーティリティーに使用されます。
squid_cache_t
このタイプは、/etc/squid/squid.confcache_dir ディレクティブで定義されている Squid がキャッシュするデータに使用します。デフォルトでは、/var/cache/squid/ ディレクトリーおよび /var/spool/squid / ディレクトリーに作成またはコピーされたファイルは、squid _cache_t タイプでラベルが付けられます。/var/squid Guard / ディレクトリーに作成またはコピーされた squid 用の squid Guard URL プラグインのファイルも、squid _cache_t タイプでラベル付けされます。Squid は、キャッシュされたデータに対してこのタイプのラベルが付けられたファイルおよびディレクトリーのみを使用できます。
squid_conf_t
このタイプは、Squid が設定に使用するディレクトリーとファイルに使用されます。既存のファイル、または /etc/squid/ および /usr/ share/squid/ ディレクトリーに作成されたファイルには、エラーメッセージやアイコンなど、このタイプのラベルが付けられます。
squid_exec_t
このタイプは、squid バイナリー /usr/sbin/squid に使用されます。
squid_log_t
このタイプはログに使用されます。既存のファイル、または /var/ log/squid/ または /var/ log/squidGuard/ に作成されたファイルには、このタイプのラベルが付けられる必要があります。
squid_initrc_exec_t
このタイプは、/etc/rc.d/init.d/squid にある squid を起動するために必要な初期化ファイルに使用されます。
squid_var_run_t
このタイプは、/var/run/ ディレクトリーのファイル(特に、実行時に Squid が作成した /var/run/squid.pid という名前のプロセス ID(PID))で使用されます。

19.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
squid_connect_any
このブール値を有効にすると、Squid は任意のポートでリモートホストへの接続を開始できます。
squid_use_tproxy
このブール値を有効にすると、Squid を透過的なプロキシーとして実行できます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

19.4. 設定の例

19.4.1. 非標準ポートへの Squid 接続

以下の例は、上記のブール値を強制します。また、デフォルトで特定のポートへのアクセスのみを許可することで、SELinux が Squid を補完する実際のデモを紹介します。この例では、ブール値を変更し、そのアクセスを許可する方法を示しています。
これはサンプルのみで、SELinux が Squid の簡単な設定にどのように影響するかを実証することに注意してください。Squid の包括的なドキュメントは、本書では扱いません。詳細は、公式の Squid ドキュメント を参照してください。この例では、Squid ホストにはインターネットアクセスの 2 つのネットワークインターフェースがあり、Squid がリッスンするデフォルトの TCP ポート(TCP 3128)を使用して内部インターフェースへのアクセスを許可するファイアウォールが設定されていることを前提としています。
  1. squid がインストールされていることを確認します。
    ~]$ rpm -q squid
    package squid is not installed
    
    このパッケージがインストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
    ~]# yum install squid
  2. 主な設定ファイル /etc/squid/squid.conf を編集し、cache_dir ディレクティブのコメントを解除して、以下のようになります。
    cache_dir ufs /var/spool/squid 100 16 256
    
    この行では、この例で使用する cache_dir ディレクティブのデフォルト設定を指定します。Squid ストレージフォーマット(ufs)、キャッシュが存在するシステムのディレクトリー(/var/spool/squid)で構成されます。これは、キャッシュ(100)に使用するメガバイトのディスク容量(100)、最後に、最初のレベルのキャッシュディレクトリーと 2 次レベルディレクトリー(それぞれ16 および 256 )のデフォルト設定を指定します。
  3. 同じ設定ファイルで、http _access allow localnet ディレクティブのコメントを解除します。これにより、Red Hat Enterprise Linux で Squid のデフォルトインストールに自動的に設定された localnet ACL からのトラフィックが可能になります。この簡単な例では、既存の RFC1918 ネットワーク上のクライアントマシンにプロキシー経由でアクセスすることができます。これは、この簡単な例では十分です。
  4. 同じ設定ファイルで、visible_hostname ディレクティブのコメントを解除し、マシンのホスト名に設定されていることを確認します。この値は、ホストの完全修飾ドメイン名(FQDN)である必要があります。
    visible_hostname squid.example.com
    
  5. root で以下のコマンドを実行して squid デーモンを起動します。squid が最初に開始した時点で、このコマンドは cache_dir ディレクティブで指定されたキャッシュディレクトリーを初期化し、デーモンを起動します。
    ~]# systemctl start squid.service
    squid が正常に起動することを確認します。出力には以下の情報が含まれ、タイムスタンプのみが異なります。
    ~]# systemctl status squid.service
    squid.service - Squid caching proxy
       Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled)
       Active: active (running) since Thu 2014-02-06 15:00:24 CET; 6s ago
    
  6. squid _var_run_t の値で示されているように、squid プロセス ID(PID)が制限のあるサービスとして開始されていることを確認します。
    ~]# ls -lZ /var/run/squid.pid 
    -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
    
  7. この時点で、先に設定された localnet ACL に接続されたクライアントマシンは、このホストの内部インターフェースをプロキシーとして使用することができます。これは、すべての共通の Web ブラウザーまたはシステム全体の設定で設定できます。Squid は、ターゲットマシン(TCP 3128)のデフォルトポートをリッスンしていますが、ターゲットマシンは共通ポートを介したインターネット上の他のサービスへの送信接続のみを許可します。これは、SELinux 自体が定義するポリシーです。SELinux は、次の手順にあるように、標準以外のポートへのアクセスを拒否します。
  8. クライアントが、TCP ポート 10000 でリッスンする Web サイトなど、Squid プロキシーを介して標準以外のポートを使用して要求を行うと、以下のような拒否がログに記録されます。
    SELinux is preventing the squid daemon from connecting to network port 10000
    
  9. このアクセスを許可するには、squid _connect_any ブール値をデフォルトで無効にしているため、変更する必要があります。
    ~]# setsebool -P squid_connect_any on
    注記
    setsebool の変更が再起動後も維持する必要がない場合は、- P オプションを使用しないでください。
  10. Squid は、クライアントの代わりにポートへの接続を開始できるようになるため、クライアントはインターネット上の非標準ポートにアクセスできるようになりました。


[17] 詳細は、Squid Caching Proxy プロジェクトページを参照してください。

第20章 MariaDB(MySQL の代わり)

MariaDB データベースは、MariaDB サーバーデーモン(mysqld)および多くのクライアントプログラムおよびライブラリーで構成されるマルチユーザー、マルチスレッドの SQL データベースサーバーです。[18]
Red Hat Enterprise Linux では、mariadb-server パッケージは MariaDB を提供します。以下のコマンドを入力して、mariadb-server パッケージがインストールされているかどうかを確認します。
~]$ rpm -q mariadb-server
package mariadb-server is not installed
インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install mariadb-server

20.1. MariaDB および SELinux

MariaDB を有効にすると、デフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している MariaDB プロセスを示しています。この例では、mariadb-server パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root ユーザーで以下のコマンドを実行して mariadb を起動します。
    ~]# systemctl start mariadb.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status mariadb.service
    mariadb.service - MariaDB database server
       Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:20:11 CEST; 3h 28min ago
    
  3. 以下のコマンドを実行して mysqld プロセスを表示します。
    ~]$ ps -eZ | grep mysqld
    system_u:system_r:mysqld_safe_t:s0 12831 ?     00:00:00 mysqld_safe
    system_u:system_r:mysqld_t:s0   13014 ?        00:00:00 mysqld
    
    mysqld プロセスに関連付けられた SELinux コンテキストは、system _u:system_r:mysqld_t:s0 です。2 番目のコンテキストの最後の部分である mysqld_t はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、mysqld プロセスが mysqld _t ドメインで実行されます。

20.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは 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. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
selinuxuser_mysql_connect_enabled
このブール値を有効にすると、ユーザーがローカルの MariaDB サーバーに接続できるようになります。
exim_can_connect_db
このブール値を有効にすると、p im mailer がデータベースサーバーへの接続を開始できるようにします。
ftpd_connect_db
このブール値を有効にすると、ftp デーモンがデータベースサーバーへの接続を開始できます。
httpd_can_network_connect_db
このブール値を有効にすると、Web サーバーがデータベースサーバーと通信する必要があります。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

20.4. 設定の例

20.4.1. MariaDB がデータベースの場所の変更

Red Hat Enterprise Linux を使用する場合、MariaDB のデフォルトの場所は /var/lib/mysql/ になります。これは、デフォルトで SELinux が想定されるため、この領域はすでに mysqld_db_t タイプを使用して適切にラベル付けされています。
データベースの保存先は、個々の環境要件または設定に応じて変更できますが、SELinux はこの新しい場所を認識することが重要です。この新しい場所にラベルを付けることが重要です。この例では、MariaDB データベースの場所を変更し、SELinux がコンテンツに基づいて新しい領域に保護メカニズムを提供できるように、新しい場所にラベルを付ける方法を説明します。
これは単なる例であり、SELinux が MariaDB にどのように影響するかを実証することに注意してください。MariaDB の包括的なドキュメントは、本書では扱いません。詳細は、MariaDB の公式ドキュメント を参照してください。この例では、mariadb-server パッケージおよび setroubleshoot-server パッケージがインストールされ、auditd サービスが実行していること、および /var/lib/mysql/ のデフォルトの場所に有効なデータベースがあることを前提としています。
  1. mysql のデフォルトデータベースの場所の SELinux コンテキストを表示します。
    ~]# ls -lZ /var/lib/mysql
    drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    
    これは、データベースファイルの場所のデフォルトコンテキスト要素である mysqld_db_t を表示します。このコンテキストは、正しく機能するためにこの例で使用される新しいデータベースの場所に手動で適用する必要があります。
  2. 次のコマンドを実行して、mysqld root パスワードを入力して、利用可能なデータベースを表示します。
    ~]# mysqlshow -u root -p
    Enter password: *******
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    | wikidb             |
    +--------------------+
    
  3. mysqld デーモンを停止します。
    ~]# systemctl stop mariadb.service
  4. データベースの新しい場所に新しいディレクトリーを作成します。以下の例では、/mysql/ が使用されます。
    ~]# mkdir -p /mysql
  5. データベースファイルを以前の場所から新しい場所にコピーします。
    ~]# cp -R /var/lib/mysql/* /mysql/
  6. この場所の所有権を変更して、mysql ユーザーおよびグループがアクセスできるようにします。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
    ~]# chown -R mysql:mysql /mysql
  7. 以下のコマンドを実行して、新しいディレクトリーの初期コンテキストを表示します。
    ~]# ls -lZ /mysql
    drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql
    
    新たに作成したこのディレクトリーのコンテキスト usr_t は、現在、MariaDB データベースファイルの場所として SELinux に適しているわけではありません。コンテキストを変更すると、MariaDB がこのエリアで適切に機能できるようになります。
  8. テキストエディターでメインの MariaDB 設定ファイル /etc/my.cnf を開き、新しい場所を参照するように datadir オプションを変更します。以下の例では、入力すべき値は /mysql です。
    [mysqld]
    datadir=/mysql
    
    このファイルを保存して終了します。
  9. mysqld を起動します。サービスが起動に失敗し、拒否メッセージが /var/log/messages ファイルに記録されます。
    ~]# systemctl start mariadb.service
    Job for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
    
    ただし、audit デーモンが setroubleshoot サービスとともに実行されている場合は、代わりに拒否が /var/log/audit/audit.log ファイルに記録されます。
    SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
    
    この拒否の理由は、/mysql/ が MariaDB データファイルに対して正しくラベル付けされていないことです。SELinux は、MariaDB が、usr_t とラベルが付いたコンテンツにアクセスできなくなります。この問題を解決するには、以下の手順を実行します。
  10. 以下のコマンドを入力して、/mysql/ のコンテキストマッピングを追加します。semanage ユーティリティーは、デフォルトでインストールされていないことに注意してください。システムに見つからない場合は、policycoreutils-python パッケージをインストールします。
    ~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
  11. このマッピングは、/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
    
  12. これで restorecon ユーティリティーを使用して、稼働中のシステムにこのコンテキストマッピングを適用します。
    ~]# restorecon -R -v /mysql
  13. /mysql/ の場所には、MariaDB の正しいコンテキストでラベルが付けられ、mysqld が起動します。
    ~]# systemctl start mariadb.service
  14. コンテキストが /mysql/ に対して変更されたことを確認します。
    ~]$ ls -lZ /mysql
    drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    
  15. 場所が変更され、ラベル付けされ、mysqld が正常に開始されました。この時点では、通常の操作を確認するには、実行中のサービスをすべてテストする必要があります。


[18] 詳細は、MariaDB プロジェクトページを参照してください。

第21章 PostgreSQL

PostgreSQL は、オブジェクトリレーショナルデータベース管理システム(DBMS)です。[19]
Red Hat Enterprise Linux では、postgresql-server パッケージは PostgreSQL を提供します。以下のコマンドを実行して、postgresql -server パッケージがインストールされているかどうかを確認します。
~]# rpm -q postgresql-server
インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install postgresql-server

21.1. PostgreSQL および SELinux

PostgreSQL を有効にすると、デフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している PostgreSQL プロセスを示しています。この例では、postgresql -server パッケージがインストールされていることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root ユーザーで以下のコマンドを実行して postgresql を起動します。
    ~]# systemctl start postgresql.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl start postgresql.service
    postgresql.service - PostgreSQL database server
       Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
       Active: active (running) since Mon 2013-08-05 14:57:49 CEST; 12s
    
  3. 以下のコマンドを実行して postgresql プロセスを表示します。
    ~]$ ps -eZ | grep postgres
    system_u:system_r:postgresql_t:s0 395 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 397 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 399 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 400 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 401 ?    00:00:00 postmaster
    system_u:system_r:postgresql_t:s0 402 ?    00:00:00 postmaster
    
    postgresql プロセスに関連付けられた SELinux コンテキストは、system _u:system_r:postgresql_t:s0 です。2 番目のコンテキストの最後の部分である postgresql_t はタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、postgresql プロセスが postgresql _t ドメインで実行されます。

21.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは 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. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
selinuxuser_postgresql_connect_enabled
このブール値を有効にすると、任意のユーザードメイン(PostgreSQL で定義された)がデータベースサーバーへの接続を作成できます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

21.4. 設定の例

21.4.1. PostgreSQL がデータベースの場所の変更

Red Hat Enterprise Linux を使用する場合、PostgreSQL のデフォルトの場所は /var/lib/pgsql/data/ になります。これは、デフォルトで SELinux が想定されるため、postgresql _db_t タイプを使用して、この領域はすでに適切にラベル付けされています。
データベースがあるエリアは、個々の環境要件または設定に応じて変更できますが、SELinux はこの新しい場所を認識することが重要です。それに応じて、そのラベルが付けられます。この例では、PostgreSQL データベースの場所を変更し、SELinux がコンテンツに基づいて新しい領域に保護メカニズムを提供できるように、新しい場所にラベルを付ける方法を説明します。
これは単なる例であり、SELinux が PostgreSQL にどのように影響するかを実証することに注意してください。PostgreSQL の包括的なドキュメントは、本書の対象外となります。詳細は、公式の PostgreSQL ドキュメント を参照してください。この例では、postgresql -server パッケージがインストールされていることを前提としています。
  1. postgresql のデフォルトのデータベースの場所の SELinux コンテキストを表示します。
    ~]# ls -lZ /var/lib/pgsql
    drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
    
    これは、データベースファイルの場所のデフォルトコンテキスト要素である postgresql_db_t が表示されます。このコンテキストは、正しく機能するためにこの例で使用される新しいデータベースの場所に手動で適用する必要があります。
  2. データベースの新しい場所に新しいディレクトリーを作成します。この例では、/opt/postgresql/data/ が使用されます。別の場所を使用する場合は、以下の手順のテキストを実際の場所に置き換えます。
    ~]# mkdir -p /opt/postgresql/data
  3. 新しい場所の一覧を実行する。新しいディレクトリーの初期コンテキストは usr_t であることに注意してください。このコンテキストは、SELinux が PostgreSQL に保護メカニズムを提供するためには不十分です。コンテキストを変更すると、新しいエリアで適切に機能できるようになります。
    ~]# ls -lZ /opt/postgresql/
    drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   data
    
  4. 新規の場所の所有権を変更して、postgres ユーザーおよびグループがアクセスできるようにします。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
    ~]# chown -R postgres:postgres /opt/postgresql
  5. テキストエディターで /etc/systemd/system/postgresql.service ファイルを開き、PGDATA 変数および PGLOG 変数を変更して新しい場所を参照します。
    ~]# vi /etc/systemd/system/postgresql.service
    PGDATA=/opt/postgresql/data
    PGLOG=/opt/postgresql/data/pgstartup.log
    
    このファイルを保存してテキストエディターを終了します。
    /etc/systemd/system/postgresql.service ファイルが存在しない場合は作成し、以下の内容を挿入します。
    .include /lib/systemd/system/postgresql.service
    [Service]
    
    # Location of database directory
    Environment=PGDATA=/opt/postgresql/data
    Environment=PGLOG=/opt/postgresql/data/pgstartup.log
  6. 新しい場所でデータベースを初期化します。
    ~]$ su - postgres -c "initdb -D /opt/postgresql/data"
  7. データベースの場所を変更すると、この時点でサービスの起動に失敗します。
    ~]# systemctl start postgresql.service
    Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
    
    SELinux により、サービスが起動しませんでした。これは、新しい場所が適切にラベル付けされていないためです。以下の手順では、新しい場所(/opt/postgresql/)にラベルを付け、postgresqlサービスを正常に起動する方法を説明します。
  8. semanage ユーティリティーを使用して、/opt/postgresql/ と、その中にその他のディレクトリー/ ファイルのコンテキストマッピングを追加します。
    ~]# semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
  9. このマッピングは、/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
    
  10. これで restorecon ユーティリティーを使用して、稼働中のシステムにこのコンテキストマッピングを適用します。
    ~]# restorecon -R -v /opt/postgresql
  11. /opt/postgresql/ の場所に PostgreSQL の正しいコンテキストでラベルが付けられたので、postgresql サービスは 正常に起動します。
    ~]# systemctl start postgresql.service
  12. コンテキストが /opt/postgresql/ に対して正しいことを確認します。
    ~]$ ls -lZ /opt
    drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
    
  13. ps コマンドで、postgresql プロセスに 新しい場所が表示されることを確認します。
    ~]# ps aux | grep -i postmaster
    
    postgres 21564  0.3  0.3  42308  4032 ?        S    10:13   0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data/
  14. 場所が変更され、ラベル付けされ、postgresql が正常に 開始しました。この時点では、通常の操作を確認するには、実行中のサービスをすべてテストする必要があります。


[19] 詳細は、PostgreSQL プロジェクトページを参照してください。

第22章 rsync

rsync ユーティリティーは高速なファイル転送を実行し、システム間のデータ同期に使用されます。[20]
Red Hat Enterprise Linux を使用する場合、rsync パッケージは rsync を提供します。以下のコマンドを実行して rsync パッケージがインストールされているかどうかを確認します。
~]$ rpm -q rsync
package rsync is not installed
インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install rsync

22.1. rsync and SELinux

SELinux では、ファイルタイプを定義する拡張属性がファイルに必要です。ポリシーにより、アクセスデーモンがこれらのファイルにあることを管理します。rsync デーモンを使用してファイルを共有する場合は、ファイルとディレクトリーに public_content_t タイプにラベルを付ける必要があります。ほとんどのサービスと同様に、SELinux が rsync で保護メカニズムを実行するために正しいラベリングが必要です。[21]

22.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは rsync で使用されます。柔軟なアクセスを設定する全タイプ:
public_content_t
これは rsync を使用して共有されるファイルの場所(および実際のファイル)に使用される汎用タイプです。rsync と共有するために特別なディレクトリーが作成される場合、ディレクトリーとその内容がそれらに適用する必要があります。
rsync_exec_t
このタイプは、/usr/bin/rsync システムバイナリーに使用されます。
rsync_log_t
このタイプは、デフォルトで /var/log/rsync.log にある rsync ログファイルに使用されます。ファイル rsync ログの場所を変更するには 、--log-file=FILE オプションをランタイム時に rsync コマンドに使用します。
rsync_var_run_t
このタイプは、/var/run/rsync d.lock にある rsync d ロックファイル に使用されます。このロックファイルは、接続制限を管理するために rsync サーバーによって使用されます。
rsync_data_t
このタイプは、rsync ドメインとして使用するファイルおよびディレクトリーに使用され、他のサービスのアクセス範囲から分離します。また、public_content_t は、ファイルまたはディレクトリーが複数のサービス(例: FTP や NFS ディレクトリーを rsync ドメイン)と対話するときに使用できる一般的な SELinux コンテキストタイプです。
rsync_etc_t
このタイプは、/etc ディレクトリー内の rsync 関連のファイルに使用されます。

22.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
rsync_anon_write
このブール値を有効にすると、rsync _t ドメインの rsync が、タイプが public_content_rw_t のファイル、リンク、ディレクトリーを管理できるようになります。多くの場合、このファイルは、パブリックファイル転送サービスに使用されるパブリックファイルです。ファイルとディレクトリーにこのタイプにラベルを付ける必要があります。
rsync_client
このブール値を有効にすると、rsync が rsync _port_t として定義されたポートへの接続を開始でき、デーモンが rsync_data_t タイプのファイル、リンク、およびディレクトリーを管理できるようにします。SELinux が制御を有効にするには、rsync _t ドメインに rsync_t ドメインに置く 必要があることに注意してください。本章の設定例は、rsync _t ドメインで実行されている rsync を示しています。
rsync_export_all_ro
このブール値を有効にすると、rsync _t ドメインで rsync がクライアントへの読み取り専用アクセスを持つ NFS および CIFS ボリュームをエクスポートできます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

22.4. 設定の例

22.4.1. rsync をデーモンとして使用する

Red Hat Enterprise Linux を使用する場合は、rsync をデーモンとして使用することができ、複数のクライアントを直接中央サーバーとして通信して、集中化されたファイルを格納し、同期を保つことができます。以下の例では、rsync を正しいドメインのネットワークソケット経由でデーモンとして実行し、SELinux がこのデーモンを事前定義(SELinux ポリシー)の TCP ポートで実行することを想定しています。この例では、SELinux ポリシーを変更して、rsync デーモンを標準以外のポートで正常に実行できるようにする方法を説明します。
この例は、SELinux ポリシーと、ローカルデーモンおよびプロセスを制御するために、1 台のシステムで実行します。これは単なる例であり、SELinux が rsync にどのように影響するかを実証することに注意してください。rsync の包括的なドキュメントは、本書の対象外です。詳細は、公式の rsync ドキュメントを参照してください。この例では、rsyncsetroubleshoot-server パッケージ、および audit パッケージが、SELinux のターゲットポリシーが使用され、SELinux が Enforcing モードで実行されていることを前提としています。

手順22.1 rsync を使用して rsync_t として起動

  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. このコマンドを実行して rsync バイナリーがシステムパスにあることを確認します。
    ~]$ which rsync
    /usr/bin/rsync
    
  3. rsync をデーモンとして実行する場合は、設定ファイルを使用し、/etc/rsyncd.conf として保存する必要があります。この例で使用される以下の設定ファイルは非常にシンプルで、使用できるすべてのオプションを示す訳ではなく、rsync デーモンを示すだけで十分です。
    log file = /var/log/rsync.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    [files]
    	path = /srv/rsync
            comment = file area
            read only = false
            timeout = 300
    
  4. rsync がデーモンモードで動作するために単純な設定ファイルが存在するようになったので、以下のコマンドを実行してこれを起動できます。
    ~]# systemctl start rsyncd.service
    rsyncd が正常に起動したことを確認します(出力は以下のようなものであると想定されていますが、タイムスタンプのみが異なる場合があります)。
    ~]# systemctl status rsyncd.service
    rsyncd.service - fast remote file copy program daemon
       Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled)
       Active: active (running) since Thu 2014-02-27 09:46:24 CET; 2s ago
     Main PID: 3220 (rsync)
       CGroup: /system.slice/rsyncd.service
               └─3220 /usr/bin/rsync --daemon --no-detach
    
    SELinux は、rsync _t ドメインで実行されているようになったため、rsync デーモンで保護メカニズムを強制できるようになりました。
    ~]$ ps -eZ | grep rsync
    system_u:system_r:rsync_t:s0     3220 ?        00:00:00 rsync
    
この例では、rsync _t ドメイン で実行されている rsync を取得する方法を示しています。rsync はソケットが有効になったサービスとして実行することもできます。この場合、rsyncd はクライアントがサービスへの接続を試みるまで実行されません。rsyncd がソケットが有効になったサービスとして実行できるようにするには、上記の手順に従ってください。socket-activated サービスとして rsync を起動するには、root で次のコマンドを実行します。
~]# systemctl start rsyncd.socket
以下の例では、このデーモンをデフォルト以外のポートで正常に実行する方法を示しています。次の例で TCP ポート 10000 が使用されます。

手順22.2 デフォルト以外のポートでの rsync デーモンの実行

  1. /etc/rsyncd.conf ファイルを変更し、グローバル設定エリア内のファイルの上部に port = 10000 の行を追加します(つまり、ファイル領域が定義される前)。新しい設定ファイルは以下のようになります。
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    port = 10000
    [files]
            path = /srv/rsync
            comment = file area
            read only = false
    	timeout = 300
    
  2. この新しい設定で 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
    
  3. semanage ユーティリティーを使用して、rsync_port_t の SELinux ポリシーに TCP ポート 10000 を追加します。
    ~]# semanage port -a -t rsync_port_t -p tcp 10000
  4. TCP ポート 10000 が rsync_port_t の SELinux ポリシーに追加され、rsyncd はこのポートで正常に起動し、動作します。
    ~]# systemctl start rsyncd.service
    ~]# netstat -lnp | grep 10000
    tcp        0      0 0.0.0.0:10000   0.0.0.0:*      LISTEN      9910/rsync
    
SELinux のポリシーが変更され、rsyncd が TCP ポート 10000 で動作できるようになりました。


[20] 詳細は、Rsync プロジェクトページを参照してください。
[21] rsync および SELinux の詳細は、rsync_selinux(8) man ページを参照してください。

第23章 postfix

Postfix は、LDAP、SMTP AUTH(SASL)、および TLS などのプロトコルをサポートする、オープンソースの Mail Transport Agent(MTA)です。[22]
Red Hat Enterprise Linux では、postfix パッケージは Postfix を提供します。以下のコマンドを入力して、postfix パッケージがインストールされているかどうかを確認します。
~]$ rpm -q postfix
package postfix is not installed
インストールされていない場合は、yum ユーティリティーの root を使用してインストールします。
~]# yum install postfix

23.1. postfix および SELinux

Postfix が有効な場合は、デフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している Postfix および関連プロセスを示しています。この例では、postfix パッケージがインストールされ、Postfix サービスが起動していることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root ユーザーで以下のコマンドを実行して、postfix を起動します。
    ~]# systemctl start postfix.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status postfix.service
    postfix.service - Postfix Mail Transport Agent
       Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:38:48 CEST; 3h 25min ago
    
  3. 以下のコマンドを実行して postfix プロセスを表示します。
    ~]$ ps -eZ | grep postfix
    system_u:system_r:postfix_master_t:s0 1651 ?   00:00:00 master
    system_u:system_r:postfix_pickup_t:s0 1662 ?   00:00:00 pickup
    system_u:system_r:postfix_qmgr_t:s0 1663 ?     00:00:00 qmgr
    
    上記の出力では、Postfix マスター プロセスに関連する SELinux コンテキストは system_u:system_r:postfix_master_t:s0 です。2 番目以降の目の部分( postfix_master_t )は、このプロセスのタイプです。タイプは、プロセスのドメインとファイルのタイプを定義します。この場合、マスター プロセスは postfix_master_t ドメインで実行されます。

23.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは Postfix で使用されます。柔軟なアクセスを設定する全タイプ:
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 ファイルに使用されます。
注記
Postfix のファイルとそのタイプの全一覧を確認するには、以下のコマンドを入力します。
~]$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts

23.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
postfix_local_write_mail_spool
このブール値を有効にすると、Postfix はシステム上のローカルメールスプールに書き込むことができます。Postfix は、ローカルスプールが使用される場合に、通常の操作に対してこのブール値を有効にする必要があります。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

23.4. 設定の例

23.4.1. SpamAssassin および Postfix

SpamAssasin は、受信メールから未承諾メール(スパムメッセージ)をフィルタリングする方法を提供するオープンソースメールフィルターです。[23]
Red Hat Enterprise Linux を使用する場合、pamassassin パッケージは SpamAssassin を提供します。次のコマンドを実行して、spamassassin パッケージがインストールされ ているかどうかを確認します。
~]$ rpm -q spamassassin
package spamassassin is not installed
インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install spamassassin
SpamAssassin は、スパムフィルタリング機能を提供する Postfix などのメールャーと並行して動作します。SpamAssassin が効果的にインターセプト、分析、およびフィルタリングを行うには、ネットワークインターフェースをリッスンしている必要があります。SpamAssassin のデフォルトのポートは TCP/783 ですが、これは変更できます。以下の例では、デフォルトで特定のポートへのアクセスのみを許可することで、SELinux が SpamAssassin を補完する実際のデモを紹介します。この例では、ポートを変更し、SpamAssassin でデフォルト以外のポートで動作する方法を示しています。
これは唯一の例で、SELinux が SpamAssassin の簡単な設定にどのように影響するのかを実証することに注意してください。SpamAssassin の包括的なドキュメントは、本書の対象外です。詳細は、公式の SpamAssassin ドキュメントを参照してください。この例では、pamassassin がインストールされており、使用中のポートでアクセスを許可するファイアウォールが設定されていること、SELinux ターゲットポリシーが使用されていること、および SELinux が Enforcing モードで実行されていることを前提としています。

手順23.1 デフォルト以外のポートでの SpamAssassin の実行

  1. root として semanage ユーティリティーを使用して、デフォルトで spamd デーモンをリッスンするポートを表示します。
    ~]# semanage port -l | grep spamd
    spamd_port_t		tcp	783
    
    この出力は、TCP/783 が SpamAssassin の ポートとして spamd_port_t に定義されていることを示しています。
  2. /etc/sysconfig/spamassassin 設定ファイルを編集し、ポート TCP/10000 の例で SpamAssassin を起動できるようにします。
    # Options to spamd
    SPAMDOPTIONS="-d -p 10000 -c m5 -H"
    
    この行は、SpamAssassin がポート 10000 で動作するように指定されています。この例の残りの部分では、このソケットを開けるように SELinux ポリシーを修正する方法を示しています。
  3. SpamAssassin を起動し、以下のようなエラーメッセージが表示されます。
    ~]# systemctl start spamassassin.service
    Job for spamassassin.service failed. See 'systemctl status spamassassin.service' and 'journalctl -xn' for details.
    
    この出力は、SELinux がこのポートへのアクセスをブロックしていることを示しています。
  4. 以下のような拒否メッセージは、SELinux によりログに記録されます。
    SELinux is preventing the spamd (spamd_t) from binding to port 10000.
    
  5. root で semanage を実行して SELinux ポリシーを変更し、SpamAssassin がポートの例(TCP/10000)で動作できるようにします。
    ~]# semanage port -a -t spamd_port_t -p tcp 10000
  6. SpamAssassin が起動し、TCP ポート 10000 で稼働していることを確認します。
    ~]# systemctl start spamassassin.service
    
    ~]# netstat -lnp | grep 10000
    tcp	0	0 127.0.0.1:10000	0.0.0.0:*	LISTEN	2224/spamd.pid
    
  7. この時点で、スパムは、SELinux ポリシーによりそのポートへのアクセスが許可されているため、TCP ポート 10000 で適切に操作されています。

第24章 DHCP

dhcpd デーモンは、Red Hat Enterprise Linux で使用され、クライアント用のレイヤー 3 の TCP/IP の詳細を動的に配信および設定します。
dhcp パッケージは、DHCP サーバーおよび dhcpd デーモンを提供します。以下のコマンドを入力して、dhcp パッケージがインストールされているかどうかを確認します。
~]# rpm -q dhcp
package dhcp is not installed
インストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
~]# yum install dhcp

24.1. DHCP および SELinux

dhcpd を有効にすると、デフォルトで制限のある実行されます。制限のあるプロセスは独自のドメインで実行され、他の制限のあるプロセスから分離されます。SELinux ポリシー設定によっては、攻撃者が制限されているプロセスが危険にさらされると、リソースへのアクセスが制限される可能性があります。以下の例は、独自のドメインで実行している dhcpd および関連プロセスを示しています。この例では、dhcp パッケージがインストールされ、dhcpd サービスが起動していることを前提としています。
  1. getenforce コマンドを実行して、SELinux が Enforcing モードで実行されていることを確認します。
    ~]$ getenforce
    Enforcing
    
    このコマンドは、SELinux が Enforcing モードで実行している場合に Enforcing を返します。
  2. root ユーザーで次のコマンドを実行し、dhcpd を起動します。
    ~]# systemctl start dhcpd.service
    サービスが実行していることを確認します。出力には、以下の情報が含まれているはずです(タイムスタンプのみが異なります)。
    ~]# systemctl status dhcpd.service
    dhcpd.service - DHCPv4 Server Daemon
       Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled)
       Active: active (running) since Mon 2013-08-05 11:49:07 CEST; 3h 20min ago
  3. 以下のコマンドを実行して、dhcpd プロセスを表示します。
    ~]$ ps -eZ | grep dhcpd
    system_u:system_r:dhcpd_t:s0 5483 ?        00:00:00 dhcpd
    
    dhcpd プロセスに関連付けられている SELinux コンテキストは、system _u:system_r:dhcpd_t:s0 です。

24.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
DHCP では、以下のタイプが使用されます。
dhcp_etc_t
このタイプは、主に設定ファイルを含む /etc ディレクトリー内のファイルに使用されます。
dhcpd_var_run_t
このタイプは、/var/run/ ディレクトリーの dhcpd の PID ファイルに使用されます。
dhcpd_exec_t
このタイプは、DHCP 実行可能ファイルを dhcpd_t ドメインに移行するために使用されます。
dhcpd_initrc_exec_t
このタイプは、DHCP 実行可能ファイルを dhcpd_initrc_t ドメインに移行するために使用されます。
注記
dhcpd のファイルの完全リストと、そのタイプを表示するには、以下のコマンドを実行します。
~]$ grep dhcp /etc/selinux/targeted/contexts/files/file_contexts

第25章 OpenShift by Red Hat

OpenShift by Red Hat は、開発者が Web アプリケーションをビルドおよびデプロイできるようにする PaaS(サービスとしてのプラットフォーム)です。OpenShift では、Java、Ruby、PHP など、幅広いプログラミング言語およびフレームワークを提供しています。また、Eclipse 統合、JBoss Developer Studio、Jenkins を含むアプリケーションライフサイクルをサポートする統合された開発者ツールも提供します。OpenShift はオープンソースのエコシステムを使用して、モバイルアプリケーション、データベースサービスなどのプラットフォームを提供します。[24]
Red Hat Enterprise Linux では、openshift-clients パッケージが OpenShift クライアントツールを提供します。以下のコマンドを実行して、インストールされているかどうかを確認します。
~]$ rpm -q openshift-clients
package openshift-clients is not installed
openshift-clients パッケージがインストールされていない場合は、『 OpenShift Enterprise Client Tools インストールガイド』および『 OpenShift Online クライアントツールインストールガイド』 で、OpenShift クライアントツールのインストールプロセスについての詳細を確認してください。
重要
以前のバージョンでは、rhc パッケージは OpenShift クライアントツールを提供していました。OpenShift の最新バージョンでは、このパッケージは非推奨となり、Red Hat ではサポートされなくなりました。そのため、OpenShift バージョン 2 以降、rhc パッケージが、サポートされる OpenShift バージョンに使用される OpenShift クライアントツールを提供する openshift-clients パッケージに置き換えられます。

25.1. OpenShift および SELinux

SELinux は、すべてのプロセスに SELinux ポリシーに従ってラベル付けされるため、OpenShift を使用するアプリケーションに対するセキュリティー制御が強化されます。したがって、SELinux は、同じノードで実行されている異なるギア内の悪意のある攻撃から OpenShift を保護します。
SELinux および OpenShift の詳細は、「 Dan Walsh's presentation 」を参照してください。

25.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは OpenShift で使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。

プロセスタイプ

openshift_t
OpenShift プロセスは、SELinux タイプ openshift_t に関連付けられます。

実行ファイルの種類

openshift_cgroup_read_exec_t
SELinux により、このタイプのファイルが実行可能ファイルを openshift_cgroup_read_t ドメインに移行できるようになります。
openshift_cron_exec_t
SELinux により、このタイプのファイルが実行可能ファイルを openshift_cron_t ドメインに移行できるようになります。
openshift_initrc_exec_t
SELinux により、このタイプのファイルが実行可能ファイルを openshift_initrc_t ドメインに移行できるようになります。

書き込み可能なタイプ

openshift_cgroup_read_tmp_t
このタイプは、OpenShift コントロールグループ(cgroup)の読み取りと、/tmp ディレクトリー内の一時ファイルへのアクセスを許可します。
openshift_cron_tmp_t
このタイプにより、/tmp に OpenShift cron ジョブの一時ファイルを保存できます
openshift_initrc_tmp_t
このタイプにより、OpenShift initrc の一時ファイルを /tmp に保存できます
openshift_log_t
このタイプのファイルは OpenShift ログデータとして処理され、通常は /var/log/ ディレクトリー下に保存されます。
openshift_rw_file_t
OpenShift には、このタイプのラベルが付けられたファイルの読み取り、および書き込みを行うパーミッションがあります。
openshift_tmp_t
このタイプは、OpenShift の一時ファイルを /tmp に保存するために使用されます。
openshift_tmpfs_t
このタイプを使用すると、tmpfs ファイルシステムに OpenShift データを保存できます。
openshift_var_lib_t
このタイプにより、OpenShift ファイルを /var/lib/ ディレクトリーに保存できます。
openshift_var_run_t
このタイプにより、OpenShift ファイルを /run/ ディレクトリーまたは / var/run/ ディレクトリーに保存できます。

25.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
openshift_use_nfs
このブール値を有効にすると、OpenShift を NFS 共有にインストールできます。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

25.4. 設定の例

25.4.1. デフォルトの OpenShift ディレクトリーの変更

デフォルトで、OpenShift はデータを /var/lib/openshift/ ディレクトリーに保存します。このディレクトリーには、SELinux タイプ openshift_var_lib_t のラベルが付けられます。OpenShift が別のディレクトリーにデータを保存できるようにするには、適切な SELinux コンテキストで新しいディレクトリーにラベルを付けます。
以下の手順では、/srv/openshift/ にデータを保存するためにデフォルトの OpenShift ディレクトリーを変更する方法を説明します。

手順25.1 データの保管用デフォルトの OpenShift ディレクトリーの変更

  1. root として、/ srv ディレクトリー内に新規の openshift/ ディレクトリーを作成します。新しいディレクトリーに var_t タイプのラベルが付けられます。
    ~]# mkdir /srv/openshift
    ~]$ ls -Zd /srv/openshift
    drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   openshift/
    
  2. root で semanage ユーティリティーを使用して、/srv/openshift/ を適切な SELinux コンテキストにマッピングします。
    ~]# semanage fcontext -a -e /var/lib/openshift /srv/openshift
  3. 次に、root で restorecon ユーティリティーを使用して変更を適用します。
    ~]# restorecon -R -v /srv/openshift
  4. /srv/openshift/ ディレクトリーには、正しい openshift_var_lib_t タイプのラベルが付けられます。
    ~]$ ls -Zd /srv/openshift
    drwxr-xr-x. root root unconfined_u:object_r:openshift_var_lib_t:s0   openshift/
    


[24] OpenShift の詳細は、「 Product Documentation for OpenShift Container Platform 」および「 Product Documentation for OpenShift Online 」を参照してください。

第26章 ID 管理

Identity Management(IdM)は、PAM、LDAP、Kerberos、DNS、NTP、証明書サービスなど、標準定義の一般的なネットワークサービス向けの環境を提供します。IdM を使用すると、Red Hat Enterprise Linux システムがドメインコントローラーとして機能できます。[25]
Red Hat Enterprise Linux では、ipa-server パッケージは IdM サーバーを提供します。以下のコマンドを実行して、ipa-server パッケージがインストールされているかどうかを確認します。
~]$ rpm -q ipa-server
package ipa-server is not installed
インストールされていない場合は、root で以下のコマンドを実行してインストールします。
~]# yum install ipa-server

26.1. Identity Management および SELinux

Identity Management は、IdM ユーザーをホストごとに設定した SELinux ロールにマップし、IdM アクセス権に対して SELinux コンテキストを指定できるようにします。ユーザーログインプロセス中に、SSSD(System Security Services Daemon)は、特定の IdM ユーザーに定義されたアクセス権限をクエリーします。次に、pam_selinux モジュールは、要求をカーネルに送信し、guest_ u:guest_r:guest_t:s0 など、IdM アクセス権限に従って、適切な SELinux コンテキストでユーザープロセスを起動します。

26.1.1. Active Directory ドメインへの信頼

以前のバージョンの Red Hat Enterprise Linux では、Identity Management は WinSync ユーティリティーを使用して、Active Directory(AD)ドメインのユーザーが IdM ドメインに保存されているデータにアクセスできるようにしました。これを行うには、WinSync は、AD サーバーからローカルサーバーにユーザーおよびグループデータを複製して、同期したデータを保存する必要がありました。
Red Hat Enterprise Linux 7 では、SSSD デーモンが AD と連携できるように改良され、ユーザーが IdM ドメインと AD ドメインとの間に信頼できる関係を作成できます。ユーザーおよびグループデータは AD サーバーから直接読み込まれます。さらに、AD ドメインと IdM ドメイン間のシングルサインオン(SSO)認証を許可する Kerberos レルム間の信頼が提供されます。SSO が設定されている場合、AD ドメインのユーザーは、パスワードなしで IdM ドメインに保存される Kerberos により保護されたデータにアクセスできます。
この機能はデフォルトではインストールされていません。これを使用するには、追加の ipa-server-trust-ad パッケージをインストールします。

26.2. 設定の例

26.2.1. SELinux ユーザーの IdM ユーザーへのマッピング

以下の手順では、新しい SELinux マッピングの作成方法と、新しい IdM ユーザーをこのマッピングに追加する方法を説明します。

手順26.1 ユーザーを SELinux マッピングに追加する方法

  1. 新しい SELinux マッピングを作成するには、以下のコマンドを入力します。このコマンドでは、SELinux_mapping は新しい SELinux マッピング名であり 、--selinuxuser オプションは特定の SELinux ユーザーを指定します。
    ~]$ ipa selinuxusermap-add SELinux_mapping --selinuxuser=staff_u:s0-s0:c0.c1023
  2. 以下のコマンドを入力して、t user ユーザー名を持つ IdM ユーザーを SELinux マッピングに追加します。
    ~]$ ipa selinuxusermap-add-user --users=tuser SELinux_mapping
  3. ipaclient.example.com という名前の新規ホストを SELinux マッピングに追加するには、次のコマンドを実行します。
    ~]$ ipa selinuxusermap-add-host --hosts=ipaclient.example.com SELinux_mapping
  4. tuser ユーザーは、ipaclient.example.com ホストにログインすると、staff_u:s0-s0:c0.c1023 ラベルを取得します。
    [tuser@ipa-client]$ id -Z
    staff_u:staff_r:staff_t:s0-s0:c0.c1023
    

第27章 Red Hat Gluster Storage

Red Hat Gluster Storage は、エンタープライズ向けに柔軟かつ非構造化データストレージを提供します。GlusterFS は Gluster の主要なビルディングブロックであり、スタック可能なユーザー空間設計に基づいて、ネットワーク上でさまざまなストレージサーバーを集約し、それらを 1 つの大きな並列ネットワークファイルシステムに接続します。POSIX と互換性のある GlusterFS サーバーは、XFS ファイルシステム形式を使用してディスクにデータを保存するため、NFS や CIFS を含む業界標準のアクセスプロトコルを使用してアクセスできます。
詳細は、『Red Hat Gluster Storage のガイド の製品ドキュメント』 を参照してください。
glusterfs-server パッケージは Red Hat Gluster Storage を提供します。インストールプロセスの詳細は、『 『Installation Guide』 for Red Hat Gluster Storage』を参照してください。

27.1. Red Hat Gluster Storage および SELinux

有効にすると、SELinux は、glusterd (GlusterFS Management Service)および glusterfsd (NFS サーバー)プロセスに柔軟な必須アクセス制御を Red Hat Gluster Storage の一部として提供し、追加のセキュリティー層として機能します。これらのプロセスには、glusterd_t SELinux タイプとバインドされていない高度なプロセスの分離があります。

27.2. types

高度なプロセスの分離を提供するために SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、タイプ Enforcement です。すべてのファイルとプロセスに type: タイプでラベルが付けられ、プロセスの SELinux ドメインとファイルの SELinux タイプが定義されます。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるか、相互にアクセスする方法を定義します。アクセスは、許可する特定の SELinux ポリシールールが存在する場合にのみ許可されます。
以下のタイプは Red Hat Gluster Storage で使用されます。異なるタイプを使用すると、柔軟なアクセスを設定できます。

プロセスタイプ

glusterd_t
Gluster プロセスは、SELinux タイプ glusterd_t に関連付けられます。

実行ファイルの種類

glusterd_initrc_exec_t
Gluster init スクリプトファイルの SELinux 固有のスクリプトタイプコンテキスト。
glusterd_exec_t
Gluster 実行可能ファイルの SELinux 固有の実行ファイルタイプコンテキスト。

ポートタイプ

gluster_port_t
このタイプは glusterd に対して定義されます。デフォルトでは、glusterd は 204007-24027 および 38465-38469 TCP ポートを使用します。

ファイルコンテキスト

glusterd_brick_t
このタイプは、glusterd ブリックデータとして脅威のあるファイルに使用されます。
glusterd_conf_t
このタイプは、通常は /etc ディレクトリーに保存される glusterd 設定データに関連付けられます。
glusterd_log_t
このタイプのファイルは、glusterd ログデータとして扱われ、通常は /var/log/ ディレクトリー下に保存されます。
glusterd_tmp_t
このタイプは、/tmp ディレクトリーに glusterd 一時ファイルを保存するために使用されます。
glusterd_var_lib_t
このタイプにより、glusterd ファイルを /var/lib/ ディレクトリーに保存できます。
glusterd_var_run_t
このタイプにより、glusterd ファイルを /run/ または / var/run/ ディレクトリーに保存できます。

27.3. ブール値

SELinux は、サービスの実行に必要な最低限のアクセスに基づいています。サービスはさまざまな方法で実行できます。したがって、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
gluster_export_all_ro
このブール値を有効にすると 、glusterfsd がファイルとディレクトリーを読み取り専用として共有できます。このブール値はデフォルトで無効になっています。
gluster_export_all_rw
このブール値を有効にすると、glusterfsd が、読み取りおよび書き込みアクセスを持つファイルおよびディレクトリーを共有できます。このブール値はデフォルトで有効です。
gluster_anon_write
このブール値を有効にすると、glusterfsd が SELinux タイプ public_content_rw_t のラベルが付いたパブリックファイル を変更できます
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するブール値が常に含まれない場合があります。一覧を表示するには、以下のコマンドを実行します。
~]$ getsebool -a | grep service_name
以下のコマンドを入力して、特定のブール値の詳細を表示します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する policycoreutils-devel パッケージが必要になることに注意してください。

27.4. 設定の例

27.4.1. Gluster ブリックのラベル付け

Gluster ブリックは、信頼できるストレージプール内のサーバーのエクスポートディレクトリーです。ブリックに正しい SELinux コンテキストでラベル付けされていない場合は、glusterd_brick_t で特定の ファイルアクセス操作を拒否し、さまざまな AVC メッセージを生成します。
以下の手順は、正しい SELinux コンテキストで Gluster ブリックにラベルを付ける方法を説明します。この手順では、以前に /dev/rhgs/gluster などの論理ボリュームを作成してフォーマットし、Gluster ブリックとして使用することを前提としています。
Gluster ブリックの詳細は、『Red Hat Gluster Storage の『 管理ガイド』 の「Red Hat Gluster Storage ボリューム』 」の章を参照してください。

手順27.1 Gluster ブリックにラベルを付ける方法

  1. 以前にフォーマットした論理ボリュームをマウントするディレクトリーを作成します。以下は例になります。
    ~]# mkdir /mnt/brick1
  2. 論理ボリューム(この場合は /dev/vg-group/gluster )を、直前の手順で作成された /mnt/brick1/ ディレクトリーにマウントします。
    ~]# mount /dev/vg-group/gluster /mnt/brick1/
    mount コマンドは、一時的にデバイスをマウントすることに注意してください。デバイスを永続的にマウントするには、以下のようなエントリーを /etc/fstab ファイルに追加します。
    /dev/vg-group/gluster    /mnt/brick1  xfs rw,inode64,noatime,nouuid      1 2
    詳細は、fstab(5) の man ページを参照してください。
  3. /mnt/brick1/ の SELinux コンテキストを確認します。
    ~]$ ls -lZd /mnt/brick1/
    drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /mnt/brick1/
    ディレクトリーには、SELinux タイプ unlabeled_t のラベルが付けられます。
  4. /mnt/brick1/ の SELinux タイプを glusterd_brick_t SELinux タイプに変更します。
    ~]# semanage fcontext -a -t glusterd_brick_t "/mnt/brick1(/.*)?"
  5. restorecon ユーティリティーを使用して変更を適用します。
    ~]# restorecon -Rv /mnt/brick1
  6. 最後に、コンテキストが正常に変更されたことを確認します。
    ~]$ ls -lZd /mnt/brick1
    drwxr-xr-x. root root system_u:object_r:glusterd_brick_t:s0 /mnt/brick1/

第28章 参考資料

以下の参照は、SELinux に関連する追加情報のポインターであり、本書では扱いません。SELinux の迅速な開発により、この資料の一部は Red Hat Enterprise Linux の特定のリリースにのみ適用される可能性があることに注意してください。

books

SELinux の例
Mayer、MacMillan、および Caplan
Prentice Hall, 2007
selinux:NSA のオープンソースセキュリティーの強化 Linux
Bill McCarty
O'Reilly Media Inc., 2004

チュートリアルおよびヘルプ

Russell Coker のチュートリアルおよび対話
Dan Walsh のジャーナル
Red Hat ナレッジベース

メーリングリスト

NSA SELinux メーリングリスト
Fedora SELinux メーリングリスト

コミュニティー

SELinux Project Wiki
SELinux コミュニティーページ
IRC
irc.freenode.net, #selinux

付録A 改訂履歴

改訂履歴
改訂 0.3-06Fri Aug 9 2019Mirek Jahoda
7.7 GA 公開用バージョン
改訂 0.3-05Sat Oct 20 2018Mirek Jahoda
7.6 GA リリースのバージョン。
改訂 0.3-03Tue Apr 3 2018Mirek Jahoda
7.5 GA 公開用バージョン
改訂 0.3-01Thu Jul 13 2017Mirek Jahoda
7.4 GA 公開用バージョン
改訂 0.2-18Wed Nov 2 2016Mirek Jahoda
7.3 GA リリースのバージョン。
改訂 0.2-11Sun Jun 26 2016Mirek Jahoda
修正を含む非同期リリース。
改訂 0.2-10Sun Feb 14 2016Robert Krátký
修正を含む非同期リリース。
改訂 0.2-9Thu Dec 10 2015Barbora Ančincová
Red Hat Gluster Storage の章を追加。
改訂 0.2-8Thu Nov 11 2015Barbora Ančincová
Red Hat Enterprise Linux 7.2 GA リリース用のガイド。
改訂 0.2-7Thu Aug 13 2015Barbora Ančincová
Red Hat Enterprise Linux 7.2 Beta リリース用のガイド。
改訂 0.2-6Wed Feb 18 2015Barbora Ančincová
Red Hat Enterprise Linux 7.1 GA リリース用のガイド。
改訂 0.2-5Fri Dec 05 2014Barbora Ančincová
Red Hat カスタマーポータルで並び替えるよう更新してください。
改訂 0.2-4Thu Dec 04 2014Barbora Ančincová
Red Hat Enterprise Linux 7.1 Beta リリース用のガイド。
改訂 0.1-41Tue May 20 2014Tomáš Čapek
スタイルの変更を再ビルドします。
改訂 0.1-1Tue Jan 17 2013Tomáš Čapek
Red Hat Enterprise Linux 7 向けガイドの初回作成