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)の基本設定および高度な設定

Mirek Jahoda

Red Hat Customer Content Services

Barbora Ančincová

Red Hat Customer Content Services

Ioanna Gkioka

Red Hat Customer Content Services

Tomáš Čapek

Red Hat Customer Content Services

概要

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

パート I. selinux

第1章 はじめに

Security Enhanced Linux(SELinux)は、システムセキュリティーの層を追加で提供します。SELinux は基本的に「May <subject> do <action> to <object>」と回答します(例:「May a Web server access files in users' home directories?」)。
ユーザー、グループ、およびその他のパーミッションに基づく標準のアクセスポリシーは Discretionary Access Control(DAC)として知られるものであり、システム管理者が、包括的で詳細なセキュリティーポリシー(たとえば、特定のアプリケーションによるログファイルの表示のみに制限し、その他のアプリケーションではログファイルに新しいデータを追加できるようにする)を有効にできません。
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/ ディレクトリーにアクセスでき、同じプロセスが /data/mysql/ ディレクトリーにアクセスするのは拒否します。これは、httpd_t タイプコンテキストと mysqld_db_t タイプコンテキストに許可ルールがないためです。一方、mysqld_t として実行する MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスでき、SELinux は、mysqld_t タイプを持つプロセスが、httpd_sys_content_t とラベルが付けられた /var/www/html/ ディレクトリーにアクセスするのも拒否します。

SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスでき、同じプロセスが /data/mysql/ ディレクトリーにアクセスするのは拒否します。これは、httpd_t タイプコンテキストと mysqld_db_t タイプコンテキストに許可ルールがないためです。一方、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 ユーザーにマッピングして、セキュリティールールおよびそれらに適用されるメカニズムを利用できます。たとえば、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 blocks real-world exploits 」を参照してください。[2]SELinux の背景情報、および SELinux が阻止されたさまざまな不正使用に関する情報を提供します。


[1] DNS サーバーで使用される IP アドレスマッピングへのホスト名などの情報が含まれるテキストファイル。
[2] Marti(言い)"A seatbelt for server software: SELinux blocks real-world exploits"2008 年 2 月 24 日アクセスされた 27 年 8 月 27 日:

1.3. SELinux アーキテクチャー

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

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

SELinux は、3 つのモード (Disabled、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
注記
永続的な状態とモードの変更については、「SELinux のステータスおよびモードの永続的な変更」

1.5. 関連情報

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

第2章 SELinux コンテキスト

プロセスとファイルには、SELinux ユーザー、ロール、タイプ、オプションでレベルなどの追加情報が含まれる SELinux コンテキストのラベルが付けられます。SELinux を実行すると、この情報はすべて、アクセス制御の決定を行います。Red Hat Enterprise Linux では、SELinux はロールベースアクセス制御(RBAC)、Type Enforcement(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 ユーザーアイデンティティーは、特定のロールセットおよび特定の MLS/MCS 範囲で許可されるポリシーに認識されるアイデンティティーです。各 Linux ユーザーは、SELinux ポリシーを使用して SELinux ユーザーにマッピングされます。これにより、Linux ユーザーは SELinux ユーザーに配置される制限を継承できます。マップされた SELinux ユーザーアイデンティティーは、そのセッションのプロセスに対して 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 ユーザー コラムは、Linux ユーザーがマッピングされる SELinux ユーザーを一覧表示します。プロセスでは、SELinux ユーザーはアクセス可能なロールおよびレベルを制限します。
  • MLS/MCS Range 列は、Multi-Level Security(MLS)および Multi-Category Security(MCS)で使用されるレベルです。
  • サービス のコラムは、Linux ユーザーがシステムにログインする想定されている、正しい SELinux コンテキストを決定します。デフォルトでは、アスタリスク(*)記号が使用されます。
role
SELinux は、ロールベースのアクセス制御(RBAC)セキュリティーモデルです。ロールは RBAC の属性です。SELinux ユーザーはロールに対応し、ドメインに対するロールが許可されます。このロールは、ドメインと SELinux ユーザー間の中間として機能します。入力できるロールは、入力可能なドメインを決定します。最終的には、アクセス可能なオブジェクトタイプを制御します。これにより、権限昇格攻撃に対する脆弱性が軽減されます。
type
type は、Type Enforcement の属性です。タイプはプロセス用のドメインと、ファイルのタイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかに関わらず、そのタイプへのアクセス方法を定義します。アクセスは、許可される特定の SELinux ポリシールールが存在する場合に限り許可されます。
level
このレベルは MLS および MCS の属性です。MLS 範囲は、レベルが異なる場合、またはレベルが同じ場合(s0-s0 が同じ) の場合、低レベルレベルとして記述されているレベルのペアです 各レベルは機密レベルのペアであり、カテゴリーはオプションです。カテゴリーがある場合は、レベルは sensitivity: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 は、c1023 までの 1024 つの異なるカテゴリーである c0 に対応します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 参照ポリシーからの 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 ユーティリティーは /etc/shadow にアクセスします。これには、shadow_t タイプのラベルが付けられます。
    ~]$ 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 ドメインで実行されているアプリケーションを許可(その他)されており、passwd アプリケーションは shadow_t タイプでラベルが付いたファイルにアクセスできるようにします。passwd アプリケーションは /etc/shadow にアクセスでき、ユーザーのパスワードを更新することが許可されます。
この例は網羅的ではなく、ドメインの移行についての基本的な例として使用されています。passwd_t ドメインで実行中のサブジェクトが shadow_t ファイルタイプのラベルが付いたオブジェクトにアクセスできるようにする実際のルールがありますが、別の SELinux ポリシールールが新しいドメインに移行する前に満たされる必要があります。この例では、Type Enforcement ensures:
  • 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. アプリケーションシステムツールターミナルなどのターミナルを開きます
  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 で定義され、すべてのカテゴリー (c1023まで )です。

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

ターゲットポリシーは、Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーです。ターゲットポリシーを使用する場合、制限のあるドメインで実行するプロセス、および制限のないドメインでの実行がターゲットに設定されたプロセスです。たとえば、デフォルトでは、ログインしているユーザーは unconfined_t ドメインで実行され、unconfined_service_t ドメインでの init の実行により開始されるシステムプロセスも制限されません。
実行可能なメモリーと書き込み可能なメモリーチェックは、制限のあるドメインと制限のないドメインの両方に適用できます。ただし、デフォルトでは、制限のないドメインで実行されるサブジェクトは、書き込み可能なメモリーを割り当てて実行できます。これらのメモリーチェックはブール値を設定し、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 のステータスおよびモードの永続的な変更」 モードの変更に関する詳細は、を参照してください。
  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 で制限なく実行されます。このため、testfile ファイルには SELinux unconfined_u ユーザーのラベルが付けられます。RBAC はファイルではなくプロセスに使用されます。ロールにはファイルに対する意味がありません。object_r ロールは、ファイル(永続ストレージおよびネットワークファイルシステム上)に使用される汎用ロールです。/proc ディレクトリーで、プロセスに関連するファイルは system_r ロールを使用できます。httpd_sys_content_t タイプにより、httpd プロセスがこのファイルにアクセスできるようになります
以下の例は、SELinux が、Apache HTTP Server(httpd)が、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. httpd を実行する必要がない場合は、root で以下のコマンドを実行して停止します。
    ~]# systemctl stop httpd.service
この例では、SELinux が追加した追加のセキュリティーを示しています。DAC ルールは、ステップ 2 httpd プロセスによるテストファイルへのアクセスを許可しますが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 ドメインで実行される制限のないサービス)、kernel_t ドメインで実行される制限のないサービス、制限のない Linux ユーザーが実行し、unconfeded ドメインで実行される制限のないサービスを実行します。制限のないプロセスの場合、SELinux ポリシールールが適用されますが、制限のないドメインで実行中のプロセスを許可するポリシールールが存在します。制限のないドメインで実行されるプロセスは、DAC ルールのみの使用にフォールバックします。制限のないプロセスが危険にさらされると、SELinux は攻撃者がシステムリソースおよびデータへのアクセスを妨げませんが、当然ながら DAC ルールが依然として使用されます。SELinux は、DAC ルール上におけるセキュリティーの強化です。これらは置き換えられません。
以下の例は、制限なしで実行している場合は、Apache HTTP Server(httpd)が Samba が使用するデータにアクセスする方法を示しています。Red Hat Enterprise Linux では、httpd プロセスが、デフォルトで制限のある httpd_t ドメインで実行されることに注意してください。これは例であり、実稼働では使用しないでください。httpdwgetdbusaudit パッケージがインストールされ、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 が、制限された httpd_t ドメインで実行されていたため、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/httpdhttpd_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 で保護される)からデータを保護する方法や、不正アクセスの unconfined-process(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__ ログインにマッピングされ、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 で次のコマンドを実行して、newuser という名前の新規 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 ユーザー機能

ユーザー ロール ドメイン X Window System su または sudo ホームディレクトリーおよび /tmp (デフォルト) での実行 ネットワーク
sysadm_u sysadm_r sysadm_t su および sudo はい
staff_u staff_r staff_t only 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 タイプの処理のみが可能です。「タイプ」
  • dbadm_r は、MariaDB データベースおよび PostgreSQL データベース管理システムに関連する SELinux タイプの処理のみが可能です。「タイプ」「タイプ」 を参照してください。
  • logadm_r は、syslog および auditlog プロセスに関連する SELinux タイプの処理のみが 可能 です。
  • secadm_r は SELinux の処理のみが可能です。
  • auditadm_r は、audit サブシステムに関連するプロセスのみを管理できます。
利用可能なロールの一覧を表示するには、以下のコマンドを入力します。
~]$ seinfo -r
前述したように、seinfo コマンドは、デフォルトではインストールされない setools-console パッケージで提供されます。

3.3.1. sudo Transition ロールおよび 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 の実行後、ユーザーの SELinux コンテキストは、/etc/sudoers.d/linux_user で指定した補助 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
    bellow の例では、デフォルトの割り当てられた staff_r で、新しい SELinux ユーザー limited_u を staff_r から webadm_ r に変更するように sudo を設定しています
    ~]# 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 モードの設定、ファイルおよびディレクトリーラベルの永続的な変更、マウントコマンドでファイルシステムラベルをオーバーライドし、NFS ボリュームのマウント、およびアーカイブ処理時の SELinux コンテキストを保持する方法を示します。

4.1. SELinux パッケージ

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

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

Red Hat Enterprise Linux では、デフォルトのパッケージの選択で削除されない限り、dbus パッケージおよび audit パッケージはデフォルトでインストールされます。Yum を使用して setroubleshoot-server をインストールする必要があります (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 拒否メッセージが返されると、sedispatchdbus を使用してメッセージを送信します。これらのメッセージは、すでに実行されている場合は 「setroubleshootd 」と簡単に行われます。実行されていない場合は、sedispatch が自動的に開始します。
  • 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 コマンドを使用して、コマンド出力でキーワード enabled を検索します。以下に例を示します。
    ~]$ systemctl status auditd.service | grep enabled
    auditd.service - Security Auditing Service
       Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled)
    

4.3. 主な設定ファイル

/etc/selinux/config ファイルは、メインの SELinux 設定ファイルです。これは、SELinux が有効または無効か、SELinux モードおよび SELinux ポリシーが使用されるかどうかを制御します。
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#       targeted - Targeted processes are protected,
#       mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELINUX=
SELINUX オプションは、SELinux が無効または有効になっていて、Enforcing または Permissive モード(稼働中)を設定します。
  • SELINUX=enforcing を使用すると、SELinux ポリシーが有効になり、SELinux ポリシールールに基づいてアクセスが拒否されます。拒否メッセージがログに記録されます。
  • SELINUX=permissive を使用すると、SELinux ポリシーは強制されません。SELinux はアクセスを拒否しませんが、SELinux を Enforcing モードで実行すると拒否されたアクションの拒否がログに記録されません。
  • SELINUX=disabled を使用すると、SELinux は無効になり、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 モードで SELinux を使用してカスタムアプリケーションを実行するには、以下のいずれかのシナリオを選択します。
  • unconfined_service_t ドメインでアプリケーションを実行します。詳細は 「制限のないプロセス」 を参照してください。
  • アプリケーションに新しいポリシーを記述します。詳細は、ナレッジベースの記事「 Writing Custom SELinux Policy 」を参照してください。

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. 強制モード

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

手順4.3 Enforcing モードへの変更

この手順では、selinux-policy-targetedselinux-policylibselinuxlibselinux-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 のステータスおよびモード」

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 boolean 列には、ブール値名が一覧表示されます。Description 列には、ブール値がオンまたはオフかどうか、およびその作業を行います。
getsebool -a コマンドは、ブール値(on または off であるかを示し)を一覧表示しますが、各ブール値の説明は表示されません。以下の例では、すべてのブール値を一覧表示しません。
~]$ getsebool -a
cvs_read_shadow --> off
daemons_dump_core --> on
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 のブール値がオフであるため、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. getsebool ユーティリティーを使用してブール値が有効であることを確認します。
    ~]$ getsebool httpd_can_network_connect_db
    httpd_can_network_connect_db --> on
    
    これにより、Apache HTTP Server スクリプトおよびモジュールがデータベースサーバーに接続できます。
  4. この変更は、システムを再起動すると元に戻ります。再起動後も持続させる場合は、root で setsebool -P boolean-name on コマンドを実行します。[3]
    ~]# setsebool -P httpd_can_network_connect_db on

4.6.3. シェルの自動完了

getsebool、setsebool 、および semanage ユーティリティーでシェル自動補完を使用できます。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 ユーティリティーは、あるコマンドライン引数により完了した複数のコマンドライン引数で使用されます。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 エントリーの名前を完了します。エントリーとヒットタブの入力を開始します
~]# 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)、および level(s0)を提供します。この情報は、アクセス制御の決定に使用されます。DAC システムでは、アクセスは Linux ユーザーおよびグループ ID に基づいて制御されます。SELinux ポリシールールは DAC ルールの後に確認されます。DAC ルールがアクセスを拒否すると、SELinux ポリシールールは使用されません。
注記
デフォルトでは、新規作成したファイルおよびディレクトリーは、その親ディレクトリーの SELinux タイプを継承します。たとえば、etc ディレクトリーに新しいファイルを etc_t タイプで作成すると、新しいファイルは同じタイプを継承します。
~]$ 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 fcontextrestorecon、matchpathcon などのファイルシステムのラベリングを管理する複数のコマンドを提供します

4.7.1. 一時的な変更: chcon

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

クイックリファレンス

  • chcon -t type file-name コマンドを実行してファイルタイプを変更します。type 、httpd_sys_content_t などの SELinux タイプで、file-name はファイルまたはディレクトリー名です。
    ~]$ chcon -t httpd_sys_content_t file-name
  • chcon -R -t type directory-name コマンドを実行して、ディレクトリーのタイプとそのコンテンツを変更します。typehttpd_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 user、object_r ロール、user_home_t タイプ、s0 レベルが含まれます。SELinux 2章SELinux コンテキスト
  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つのファイル(file1、file2 、file3) を作成します。その web/ ディレクトリーとそのファイルには、default_t タイプのラベルが付けられます。
    ~]# mkdir /web
    ~]# touch /web/file{1,2,3}
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  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つのファイル(file1、file2 、file3) を作成します。その web/ ディレクトリーとそのファイルには、default_t タイプのラベルが付けられます。
    ~]# mkdir /web
    ~]# touch /web/file{1,2,3}
    ~]# ls -dZ /web
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /web
    
    ~]# ls -lZ /web
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:default_t:s0 file3
    
  2. root で次のコマンドを実行して、Web/ ディレクトリーとそのファイルの種類を httpd_sys_content_t に変更します。-a オプションは新しいレコードを追加し、-t オプションはタイプ(httpd_sys_content_t)を定義します。"/web(/.*)?" 正規表現により、semanage は変更を Web/ とファイルに適用します。このコマンドを実行すると、タイプを直接変更しません。web/ とファイルに含まれるファイルは、引き続き default_t タイプでラベル付けされます。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    ~]$ ls -dZ /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 は recursive の場合で、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
    
    最初の部分は test になります。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_contexts.homedirs および file_contexts ファイルの内容)で指定される file-context の定義は、評価前に 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 設定のパターンに一致しないファイルで使用され、このようなファイルはディスクにコンテキストを持たないファイルからの区別でき、通常は制限のあるドメインに保持されます。たとえば、mydirectory/ などの新しい最上位ディレクトリーを作成すると、このディレクトリーには default_t タイプのラベルが付けられることがあります。サービスがこのディレクトリーへのアクセスが必要な場合は、この場所の file-contexts 設定を更新する必要があります。コンテキストを file-context 「永続的な変更: semanage fcontext」 を参照してください。


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

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

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

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

指定されたコンテキストでファイルシステムをマウントするか、既存のコンテキストを上書きするか、または拡張属性に対応していないファイルシステムのデフォルトコンテキストを指定するには、root ユーザーとして mount -o context= SELinux_user:role:type:level コマンドを使用して、必要なファイルシステムのマウント時に mount -o context= SELinux_user:role: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 コンテキストを上書きする場合は、SELinuxsystem_u ユーザーと object_r ロールを使用し、タイプに集中することができます。MLS ポリシーまたはマルチカテゴリーセキュリティーを使用していない場合は、s0 レベルを使用します。
注記
ファイルシステムがコンテキストオプションでマウントされると、ユーザーおよびプロセスによるコンテキストの変更は禁止されます。たとえば、コンテキストオプションでマウントされているファイルシステムで 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 が「ラベルされていないファイルのデフォルトのセキュリティーコンテキスト」であることを定義します。[5].
  • マウントされると、ファイルシステムのルートディレクトリー(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 タイプをオーバーライドしてください。以下のコンテキストオプションを使用して 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 サーバーに 1 つの export/ があり、これには web/ database/ の 2 つのサブディレクトリーがあります。以下のコマンドは、1 つの NFS エクスポートから 2 つのマウントを試行し、それぞれのマウントのコンテキストを上書きしようとします。
~]# mount server:/export/web /local/web -o context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export/database /local/database -o context="system_u:object_r:mysqld_db_t:s0"
2 つ目の mount コマンドが失敗し、以下が /var/log/messages に記録されます。
kernel: SELinux: mount invalid.  Same superblock, different security settings for (dev 0:15, type nfs)
単一の NFS エクスポートから複数のマウントをマウントするため、それぞれのマウントに異なるコンテキストを持つ状態で、-o nosharecache,context オプションを使用します。以下の例では、1 つの NFS エクスポートから複数のマウントをマウントしますが、各マウントに異なるコンテキストでマウントします(各マウントに対して単一のサービスアクセスを許可します)。
~]# mount server:/export/web /local/web -o nosharecache,context="system_u:object_r:httpd_sys_content_t:s0"
~]# mount server:/export/database /local/database -o \ nosharecache,context="system_u:object_r:mysqld_db_t:s0"
この例では、server:/export/web/local/web/ ディレクトリーにローカルにマウントされ、すべてのファイルに httpd_sys_content_t タイプのラベルが付けられ、Apache HTTP Server へのアクセスが許可されます。server:/export/database ローカルで /local/database/ にマウントされ、すべてのファイルに mysqld_db_t タイプでラベル付けされ、MariaDB アクセスが許可されます。これらのタイプの変更はディスクに書き込まれます。
重要
nosharecache オプションでは、エクスポートと同じサブディレクトリーを複数回マウントできます。たとえば、/export/web/ を複数回マウントすることができます。エクスポートに異なるコンテキストで複数回、同じサブディレクトリーをマウントしないでください。重複マウントが作成され、2 つの異なるコンテキストでファイルにアクセスできることになります。

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

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


[5] Morris, James.「SELinux のファイルシステムのラベル」2004 年 10 月 1 日2008 年 10 月 14 日へのアクセス:

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 には etc_t タイプのラベルが付けられ、デフォルトラベルのルールに準拠しています。
ファイルを既存のファイルにコピーする際に、ユーザーが指定した cp オプション (--preserve=context など)のコンテキストを保持するように指定しない限り、既存のファイルコンテキストが保持されます。SELinux ポリシーにより、コピー中にコンテキストが保持されない可能性があります。

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

この手順では、cpw コマンドでファイルをコピーする場合に、オプションが指定されていない場合、タイプはターゲット親ディレクトリーから継承されることを示しています。
  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 コンテキストが保持されます。以下のように、ファイルが /var/www/html/ にコピーされると、file1user_home_t タイプが保持されています。
    ~]# 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. file2 で file1 を上書きします:
    ~]# cp /tmp/file2 /etc/file1
  4. コピー後、次のコマンドは、 /etc/file1 に置き換えられた /tmp/file2 からの user_tmp_t タイプではなく、etc_t タイプでラベル付けされた file1 を表示します
    ~]$ 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 タイプのラベルが付けられている場合、または Mozilla Firefox などの Web ブラウザーを使用してアクセスしようとすると、Apache HTTP Server が読み取りできない別のタイプになります。
重要
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、file 2、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. 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 -
ディレクトリーによっては、restorecon を実行するために root ユーザーである必要があることに注意してください。
以下の例は、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. test/ ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリーとそのすべてのファイルを削除します。
    ~]# rm -ri /test/
すべての拡張属性を保持する --xattrs オプションなど、tar についての詳細は、tar(1) man ページを参照してください。

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

star ユーティリティーは、デフォルトで拡張属性を保持しません。SELinux コンテキストは拡張属性に保存されるため、ファイルのアーカイブ時にコンテキストが失われる可能性があります。star -xattr -H=exustar コマンドを使用して、コンテキストを保持するアーカイブを作成します。star パッケージはデフォルトでインストールされていません。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. test/ ディレクトリーが必要なくなった場合は、root で以下のコマンドを実行して、そのディレクトリーとそのすべてのファイルを削除します。
    ~]# rm -ri /test/
  8. 星がなくなったら、root でパッケージを削除します。
    ~]# yum remove star
star の詳細は、star(1) man ページを参照してください。


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

4.11. Gathering Tools

以下に挙げるユーティリティーは、アクセスベクターキャッシュの統計情報やクラス、タイプ、ブール値の数などの情報を便利な形式で提供するコマンドラインツールです。

avcstat

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

seinfo

このユーティリティーは、クラスの数、タイプ、ブール値、ルールの許可など、ポリシーの内訳を説明する場合に便利です。seinfo は、policy.conf ファイル、バイナリーポリシーファイル、ポリシーパッケージのモジュラーリスト、入力としてポリシー一覧ファイルを使用するコマンドラインユーティリティーです。seinfo ユーティリティーを使用するには、setools-console パッケージがインストールされている。
seinfo の出力は、バイナリーファイルとソースファイルによって異なります。たとえば、ポリシーソースファイルは { } 括弧を使用して複数のルール要素を 1 行にグループ化します。同様の効果は、1 つの属性が 1 つまたは複数のタイプに展開される属性で実行されます。それらは拡張され、バイナリーポリシーファイルに関連しなくなったため、検索結果にゼロの値があります。ただし、以前は括弧を使用する行ごとに 1 行が多いため、ルールの数は、大幅に増加していました。
バイナリーポリシーには、一部の項目がありません。たとえば、neverallow ルールはランタイム時にポリシーコンパイル時にのみチェックされます。また、起動時にカーネルがロードされる前に初期セキュリティー識別子(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 オプションを使用してカウントできます。
~]# 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
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)

Multi-Level セキュリティー技術は、Bell-La Padula Mandatory Access Model を強制するセキュリティースキームを参照します。MLS では、ユーザーおよびプロセスは サブジェクト と ファイル、デバイス、およびその他のパッシブのコンポーネントは オブジェクト と呼ばれます。サブジェクトとオブジェクトの両方にセキュリティーレベルのラベルが付けられ、サブジェクトの明確さやオブジェクトの分類が関係します。各セキュリティーレベルは機密性と カテゴリーで構成されます。たとえば、内部リリーススケジュールは機密性を持つ内部ドキュメントカテゴリーに記録されます。
図4.1「クリアランスのレベル」 米国事業者コミュニティーが元々設計されたクリアランスのレベルを表示します。上記の内部スケジュールの例に関連する場合、機密性が明確化されたユーザーのみが機密カテゴリーでドキュメントを閲覧できます。しかし、機密クリアランスのみを持つユーザーは、より高いレベルまたはクリアランスが必要なドキュメントを表示できません。読み取りアクセスは、クリアランスレベルの低いレベルのドキュメントのみ、さらにクリアランスレベルの高いドキュメントへの書き込みが可能です。

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

クリアランスのレベル
図4.2「MLS を使用した許可されるデータフロー」 は、「Secret」セキュリティーレベルで実行中のサブジェクトと、異なるセキュリティーレベルのさまざまなオブジェクト間で許可されるすべてのデータフローを表示します。簡単な用語では、Bell-LaPadula モデルは読み取り、書き込みダウンの 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 個のファイルを表します。上記の例では、* の文字がラベル付けされた 11000 個のファイルを示しています。すべてのファイルにラベルを付ける時間は、システムのファイル数やハードディスクドライブの速度によって異なります。最新のシステムでは、この処理には 10 分ほどかかります。ラベリングプロセスが完了すると、システムが自動的に再起動します。
  6. Permissive モードでは、SELinux ポリシーは強制されませんが、Enforcing モードで実行している場合は拒否が拒否されたアクションに対して記録されます。Enforcing モードに変更を加える前に、root で以下のコマンドを実行して、最後に起動した時に 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 /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 を認識しています。次に、これらのアプリケーションはカーネルに対して、必要なラベルの付いたオブジェクトを作成するよう要求します。SELinux が認識するアプリケーションの例は、rpm パッケージマネージャー、restorecon ユーティリティー、または udev デバイスマネージャーです。ただし、SELinux が認識するファイルまたはディレクトリーを作成するすべてのアプリケーションに指示することはできません。多くの場合は、作成後に適切なラベルを持つオブジェクトの再ラベルが必要になります。それ以外の場合、制限のあるドメインがオブジェクトの使用を試みると、AVC メッセージが返されます。
ファイル名の遷移機能は、誤ったラベル付けに関連する問題が減り、システムの安全性が高まります。ポリシー作成者は、特定のアプリケーションが指定したディレクトリーに指定した名前を持つファイルのみを作成できることを適切にすることができます。ルールは、ファイルパスではなくファイル名を考慮に入れます。これは、ファイルパスのベース名になります。ファイル名の移行には、strcmp() 関数が行う完全一致を使用することに注意してください。正規表現またはワイルドカード文字の使用は考慮されません。
注記
ファイルパスは、カーネルやファイル名の移行によってラベルを判断できない場合があります。そのため、この機能は初期のファイルの作成にのみ影響し、すでに作成されたオブジェクトのラベルを修正しません。

例4.2 File Name Transition のポリシールール例

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

4.15. ptrace()の無効化

ptrace() システムコールを使用すると、あるプロセスが別のプロセスの実行を監視および制御して、メモリーおよびレジスタを変更できるようになります。この呼び出しは、主に、strace ユーティリティーを使用する場合など、デバッグ時に主に使用されます。ptrace() が必要ない場合は、システムセキュリティーを改善するために無効にすることができます。これは、deny_ptrace ブール値を有効にします。これは、unconfined_t ドメインで実行しているものであっても、他のプロセスで ptrace() を使用できなくなるプロセスをすべて拒否することで実行できます。
deny_ptrace のブール値はデフォルトで無効になっています。これを有効にするには、root で で setsebool -P deny_ptrace を実行します。
~]# 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 ポリシーをクエリーする機能スイートを提供します。これらの機能は、sepolgen setrans などの別のユーティリティーにより提供されていた新機能です。スイートでは、移行レポート、man ページ、または新しいポリシーモジュールを生成できるため、SELinux ポリシーへのアクセスと理解が容易になります。
policycoreutils-devel パッケージは sepolicy を提供します。root ユーザーで以下のコマンドを実行し、sepolicy をインストールします。
~]# yum install policycoreutils-devel
sepolicy スイートは、コマンドラインパラメーターとして呼び出される以下の機能を提供します。

表5.1 sepolicy の機能

機能説明
booleansSELinux ポリシーに問い合わせてブール値の詳細を表示する
communicateドメインが相互通信を行えるかどうかを SELinux ポリシーに問い合わせる
generateSELinux ポリシーモジュールのテンプレートを生成する
guiSELinux ポリシーのグラフィカルユーザーインターフェース
interfaceSELinux ポリシーインターフェースを一覧表示する
manpageSELinux man ページを生成する
networkSELinux ポリシーネットワーク情報を問い合わせる
transitionSELinux ポリシーのクエリーとプロセス移行レポートの生成

5.1. sepolicy Python バインディング

以前のバージョンの Red Hat Enterprise Linux では、setools パッケージに sesearch ユーティリティーおよび seinfo ユーティリティーが含まれていました。seinfo ユーティリティーを使うと、sesearch ユーティリティーは、ポリシー内の他のコンポーネントにクエリーを行う一方で、SELinux ポリシーのルール検索に使用されます。
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 生成

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


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

5.3. ドメイン遷移の理解: sepolicy transition

以前では、setrans ユーティリティーは、2 つのドメインまたはプロセスタイプ間の移行が可能かどうかを検証するために使用され、これらのドメインまたはプロセス間の移行に使用される中間タイプをすべて出力していました。Red Hat Enterprise Linux 7 では、sepolicy スイートの一部として setrans が提供され、代わりに sepolicy transition コマンドが使用されるようになりました。
sepolicy transition コマンドは SELinux ポリシーをクエリーし、プロセス移行レポートを作成します。sepolicy transition コマンドには、2 つのコマンドライン引数 (-s オプションで指定)およびターゲットドメイン (-t オプションで指定した)が必要です。ソースドメインのみを入力した場合、sepolicy はソースドメインが遷移できる可能性のあるドメインをすべて一覧表示します。以下の出力には、すべてのエントリーが含まれていません。@ 文字は、以下を実行することを意味します
~]$ 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. Manual Page の生成: sepolicy man ページ

sepolicy の man ページは、プロセスドメインを文書化する SELinux ポリシーに基づいて man ページを生成します。そのため、このようなドキュメントは常に最新の状態になります。自動生成された man ページの名前は、プロセスドメイン名と_selinux 接尾辞で構成されます(例: httpd_selinux )。
man ページには、制限のあるドメインの SELinux ポリシーのさまざまな情報を提供する複数のセクションが含まれます。
  • Entrypoints セクションには、ドメインの移行時に実行する必要があるすべての実行可能ファイルが含まれます。
  • Process Types セクションは、ターゲットドメインと同じ接頭辞で始まるすべてのプロセスタイプを一覧表示します。
  • Booleans セクションは、ドメインに関連付けられたブール値を一覧表示します。
  • Port Types セクションには、ドメインと同じ接頭辞に一致するポートタイプが含まれ、このポートタイプに割り当てられたデフォルトのポート番号を説明します。
  • Managed Files セクションでは、ドメインが書き込みできるタイプと、これらのタイプに関連付けられたデフォルトのパスを説明します。
  • ファイルコンテキスト セクションには、ドメインに関連付けられているすべてのファイルタイプが含まれ、そのファイルタイプをシステム上のデフォルトのパスラベルと一緒に使用する方法が説明されています。
  • 共有ファイル セクションでは 、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 コマンドを実行できません。これにより、ユーザーからシステムを保護できます。「制限のあるユーザーおよび制約のないユーザー」、を参照してください。

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__ ログインにマッピングされます(これは、SELinux unconfined_u ユーザーにマッピングされます)。useradd コマンドで Linux ユーザーが作成されると、オプションが指定されていない場合は、SELinux unconfined_u ユーザーにマッピングされます。以下は、default-mapping を定義します。
__default__          unconfined_u         s0-s0:c0.c1023       *

6.2. 新規 Linux ユーザーの制限: useradd

SELinux unconfined_u ユーザーにマッピングされた Linux ユーザーは、unconfined_t ドメインで実行されます。これは、unconfin_u にマッピングされた Linux ユーザーとしてログイン中に id -Z コマンドを実行します。
~]$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Linux ユーザーが unconfined_t ドメインで実行する場合、SELinux ポリシールールが適用されますが、unconfed_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 ユーザーが root ユーザーになるのを防ぐことができます。

手順6.1 新しい Linux ユーザーを user_u SELinux ユーザーに制限する

  1. root で、SELinux user_u ユーザーにマッピングされた新しい Linux ユーザー(useruuser )を作成します。
    ~]# 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 useruuser ユーザーに割り当てます。
    ~]# 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 ユーザーユーザーでログインします。ログインすると、pam_selinux モジュールは Linux ユーザーを SELinux ユーザー(この場合は user_u)にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。以下のコマンドを実行して、Linux ユーザーのコンテキストを表示します。
    ~]$ id -Z
    user_u:user_r:user_t:s0
    
  5. Linux ユーザーユーザー「s session」からログアウトし、アカウントで再度ログインします。Linux useruuser ユーザーを使用しない場合は、root で以下のコマンドを実行して、そのホームディレクトリーと共に削除します。
    ~]# userdel -Z -r useruuser

6.3. 既存の Linux ユーザーの制限: semanage login

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

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

  1. root で、新しい Linux ユーザーを作成します(新しいユーザー)。このユーザーはデフォルトのマッピングを使用するため、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 ユーザーとしてログインします。以下のコマンドを実行して、newuser の SELinux コンテキストを表示します。
    ~]$ id -Z
    user_u:user_r:user_t:s0
  6. Linux newuser の 's session からログアウトし、アカウントで再度ログインします。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__ ログインにマッピングされます(これは、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__ ログインが 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 パッケージがインストールされると、GDM ログイン画面に Guest アカウントが追加されます。

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 ユーティリティーを使用する前に、policycoreutils-sandbox パッケージをインストールする必要があります。
~]# yum install policycoreutils-sandbox
アプリケーションを制限するための基本的な構文は以下のとおりです。
~]$ sandbox [options] application_under_test
サンドボックスでグラフィカルアプリケーションを実行するには 、-X オプションを使用します。以下に例を示します。
~]$ sandbox -X evince
-X は、アプリケーション用に制限のあるセカンダリー X Server(この場合は evinceをセットアップするように指示します
1 つのセッションから次のセッションへデータを保存するには、次のコマンドを実行します。
~]$ sandbox -H sandbox/home -T sandbox/tmp -X firefox
/home および sandbox/tmp には sandbox/home/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 を使用すると注意して行って、必要な場合のみです。
詳細は、サンドボックス(8)man ページと、利用可能なオプションの詳細一覧を参照してください。

第8章 sVirt

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

非仮想化環境

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

仮想化環境

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

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

サービスが仮想化されない場合は、マシンは物理的に分離されます。通常、すべての不正使用は、ネットワーク攻撃の明らかな例外で、影響を受けるマシンに含まれます。仮想化環境でサービスをグループ化すると、システム内で新たな脆弱性のマージが行われます。ゲストインスタンスで悪用可能なハイパーバイザーにセキュリティー上の欠陥がある場合は、このゲストはホストを攻撃するだけでなく、そのホストで実行している他のゲストも可能になる可能性があります。これは理論上の攻撃ではなく、ハイパーバイザーにすでに存在する攻撃です。これらの攻撃はゲストインスタンスより長くなる可能性があり、他のゲストが攻撃にさらされる可能性があります。
sVirt は、ゲストを分離して、悪用があった場合にさらなる攻撃を起動する機能を制限する努力的です。これは、以下のイメージを示しています。この場合、攻撃は仮想マシンから外れず、別のホストインスタンスに拡張できます。
SELinux は、Mandatory Access Control(MAC)の実装で、仮想インスタンス用のプラグ可能なセキュリティーフレームワークを導入しています。sVirt フレームワークにより、ゲストとそれらのリソースを一意にラベル付けできます。ラベルが付けられると、ルールを適用することができ、ゲスト間のアクセスを拒否することができます。

8.2. sVirt Labeling

SELinux の保護時にその他のサービスと同様に、sVirt はプロセスベースのメカニズムおよび制限を使用して、ゲストインスタンスを介したセキュリティーの層を提供します。一般的な用途では、バックグラウンドで sVirt が機能しているという通知も注意する必要があります。このセクションでは、sVirt のラベリング機能を説明します。
以下の出力にあるように、sVirt を使用する場合は、各仮想マシン(VM)プロセスにラベルが付けられ、動的に生成されたレベルで実行されます。各プロセスは、異なるレベルを持つ他の仮想マシンから分離されます。
~]# 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 コンテキスト説明
仮想マシンプロセス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:s0ラベルのあるすべてのプロセスは、svirt_image_t:s0 ファイルとデバイスへの書き込みが許可されます
仮想マシンイメージsystem_u:object_r:virt_content_t:s0イメージが存在する場合に使用されるシステムのデフォルトラベル。Nosvirt_t 仮想プロセスは、このラベルの付いたファイル/デバイスを読み取ることができます。
sVirt を使用する場合に、静的なラベル付けを実行することもできます。静的ラベルを使用すると、管理者は仮想マシンの MCS/MLS フィールドなどの特定のラベルを選択できます。静的にラベルを付けた仮想マシンを実行する管理者は、イメージファイルに正しいラベルを設定する責任があります。仮想マシンは常にそのラベルで起動し、sVirt システムは、静的にラベルが付けられた仮想マシンのコンテンツのラベルを変更しません。これにより、sVirt コンポーネントを MLS 環境で実行できます。必要に応じて、システムで異なる機密レベルを持つ複数の仮想マシンを実行することもできます。

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

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

第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 では、管理者は System V Init スクリプトのラベルに基づいてサービスを開始または停止するユーザーまたはアプリケーションが制御できました。systemd は、全サービスを開始および停止し、ユーザーとプロセスが systemctl ユーティリティーを使用して systemd と通信するようになりました。systemd デーモンは、SELinux ポリシーを確認し、呼び出しているプロセスのラベルと、呼び出し元が管理するユニットファイルのラベルを確認してから、呼び出し元のアクセスを許可するかどうかを SELinux に確認します。このアプローチにより、システムサービスの開始や停止などの重要なシステム機能へのアクセス制御が強化されます。
以前は、管理者は、NetworkManager が systemctl を実行して D-Bus メッセージを送信できるようにする必要があります。これにより、NetworkManager が要求するサービスを開始または停止していました。実際、NetworkManager はすべての systemctl の実行が可能でした。また、制限のある管理者を設定して、特定のサービスのみを起動したり、停止したりすることができませんでした。
これらの問題を修正するために、systemd は SELinux Access Manager としても機能します。D-Bus メッセージを systemd に送信した systemctl またはプロセスを実行するプロセスのラベルを取得できます。次に、デーモンは、プロセスが設定するユニットファイルのラベルを探します。最後に、SELinux ポリシーでプロセスラベルとユニットファイルラベルとの間で特定のアクセスが許可されている場合は、systemd はカーネルから情報を取得できます。これは、特定のサービスに対して systemd と対話する必要がある、危険にさらされたアプリケーションを SELinux が制限できることを意味します。ポリシー作成者は、このような粒度の細かい制御を使用して、管理者を制限することもできます。ポリシーを変更するには、service という新しいクラスと、以下のパーミッションがあります。
class service
{
       start
       stop
       status
       reload
       kill
       load
       enable
       disable
}
たとえば、ポリシーライターは、サービスのステータスを取得したり、サービスの起動/停止も可能になりましたが、サービスを有効または無効にすることはできません。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 ステータス
GetUnitFileState ステータス
kill stop
KillUnit stop
LinkUnitFiles enable
ListUnits ステータス
LoadUnit ステータス
MaskUnitFiles 無効にする
PresetUnitFiles enable
ReenableUnitFiles enable
再実行 start
Reload reload
ReloadOrRestart 開始
ReloadOrRestartUnit 開始
ReloadOrTryRestart 開始
ReloadOrTryRestartUnit 開始
ReloadUnit 再読み込み
ResetFailed stop
ResetFailedUnit stop
再起動 開始
RestartUnit 開始
開始 開始
StartUnit 開始
StartUnitReplace 開始
stop stop
StopUnit stop
TryRestart 開始
TryRestartUnit 開始
UnmaskUnitFiles enable

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

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

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

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

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 denials」とも呼ばれています。デーモンが実行している場所に応じて、別の場所にログに記録されます。
daemon: auditd on
ログ記録の場所: /var/log/audit/audit.log
daemon: auditd off; rsyslogd on
ログ記録の場所: /var/log/messages
daemon: setroubleshootd、rsyslogd、および auditd
ログ記録の場所: /var/log/audit/audit.log.読み取りが容易な拒否メッセージも /var/log/messagesに送信されます。
X Window System を実行している場合は、setroubleshoot パッケージおよび setroubleshoot-server パッケージがインストールされており、setroubled デーモンおよび 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 ルールの展開になります。

11.2.1. ラベル付けの問題

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

11.2.1.1. Correct Context とは

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. 機密サービスの実行方法

サービスはさまざまな方法で実行できます。そのためには、cater に、サービスの実行方法を指定する必要があります。これは、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 コマンドを実行します。ブール値の一覧、それぞれの項目の説明と、そのブール値がオンまたはオフであるかは、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、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. ルールおよびBroken アプリケーションへの進化

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


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

11.3. 問題の修正

以下のセクションでは、問題のトラブルシューティングに役に立ちます。SELinux ルールの前に確認される Linux パーミッションの確認 - SELinux によりアクセスが拒否される可能性はありますが、記録されない可能性があります。サービスの man ページには、ラベルやブール値の情報を含むサービスの man ページ、許容ドメイン、システム全体ではなく、許容するドメイン (システムの検索方法や表示方法、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 をそのユーザーに置き換えます。

11.3.2. 考えられる原因

特定の状況では、SELinux がアクセスを拒否すると AVC 拒否メッセージはログに記録されないことがあります。アプリケーションとシステムライブラリー関数は、多くの場合、タスクの実行に必要な多くのアクセスについてプローブします。監査ログを AVC 拒否で埋めずに最小限の権限を維持するため、このポリシーは dontaudit ルールを使用して許可を許可せずに AVC 拒否をサイレンスにできます。これらのルールは、標準ポリシーで一般的です。dontaudit のマイナス面は、SELinux はアクセスを拒否し、拒否メッセージはログに記録されず、トラブルシューティングがより困難になることです。
一時的に dontaudit ルールを無効にし、すべての拒否をログに記録できるようにするには、root で次のコマンドを実行します。
~]# semodule -DB
-D オプションは dontaudit ルールを無効にします。-B オプションはポリシーを再構築します。semodule -DB を実行した後、パーミッションの問題が発生するアプリケーションを試行し、アプリケーションに関連する SELinux 拒否(現在は記録)かを確認します。許可される拒否を決定してください。一部の拒否は無視され、dontaudit ルールによって処理されるためです。不明な場合やガイダンスを検索する場合は、fedora-selinux-list などの SELinux リストで他の SELinux ユーザーおよび開発者に連絡してください。
ポリシーを再構築して dontaudit ルールを有効にするには、root で次のコマンドを実行します。
~]# semodule -B
これにより、ポリシーが元の状態に復元されます。dontaudit ルールの全一覧については、sesearch --dontaudit コマンドを実行します。-s ドメインオプションと grep コマンドを使用して検索を絞り込みます。以下に例を示します。
~]$ sesearch --dontaudit -s smbd_t | grep squid
dontaudit smbd_t squid_port_t : tcp_socket name_bind ;
dontaudit smbd_t squid_port_t : udp_socket name_bind ;

11.3.3. サービスの man ページ

サービスの man ページには、特定の状況に使用するファイルタイプや、サービスへのアクセスを変更するブール値 (httpd が NFS ボリュームにアクセスするなど)が含まれます。この情報は、標準の 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 ブール値を有効にすると、Samba がユーザーのホームディレクトリーを共有できる)を説明します。
  • nfs - nfsd_selinux(8) の man ページでは、ユーザーが可能な限り安全な方法で nfsd プロセスを設定できるようにする SELinux nfsd ポリシーを説明します。
man ページの情報は、SELinux がアクセスを拒否しないように、正しいファイルタイプとブール値の設定に役立ちます。
sepolicy man 「Manual Page の生成: sepolicy man ページ、を参照してください

11.3.4. Permissive ドメイン

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

11.3.4.1. ドメイン許容(Permissive)

ドメインを許容するには、semanage permissive -a domain コマンドを実行します。ここでの domain は、許容するドメインになります。たとえば、root で以下のコマンドを実行して、httpd_t ドメイン(Apache HTTP Server が実行するドメイン)を Permissive します。
~]# semanage permissive -a httpd_t
許容しているドメインの一覧を表示するには、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 ドメイン宣言がすべて含まれます。すべての許容ドメインを無効にするには、root で次のコマンドを実行します。
~]# semodule -d permissivedomains
注記
semodule -d コマンドでポリシーモジュールを無効にしたら、semodule -l コマンドの出力にポリシーモジュールが表示されなくなりました。無効にしたポリシーモジュールをすべて表示するには、root で以下のコマンドを実行します。
~]# semodule --list-modules=full

11.3.4.3. Permissive ドメインの拒否

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

type=SYSCALL msg=audit(1226882736.442:86): arch=40000003 syscall=196 success=no exit=-13 a0=b9a1e198 a1=bfc2921c a2=54dff4 a3=2008171 items=0 ppid=2425 pid=2427 auid=502 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
デフォルトでは、httpd_t ドメインは Permissive ではないため、アクションは拒否されます。また、SYSCALL メッセージには success=no が含まれます。以下は、semanage permissive -a httpd_t コマンドを実行して 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. 探索と表示

本セクションでは、setroubleshoot パッケージ、setroubleshoot-server パッケージ、dbus、および audit パッケージがインストールされ、auditd、rsyslogd、および setroubleshootd デーモンが実行していることを前提としています。「使用されているログファイル」、を参照してください。utilites は、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 用の httpd など)。
~]# 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 パッケージがインストールされており、setroubled、dbusデーモン、および auditd デーモンが実行されている場合は、SELinux によるアクセスが拒否されると警告が表示されます。
AVC 拒否メッセージ
Show をクリックすると、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 }
中括弧内の項目は、拒否されたパーミッションを示します。getattr エントリーは、ソースプロセスがターゲットファイルのステータス情報の読み取りを試みたことを示します。これは、ファイルを読み取る前に発生します。このアクションは、ファイルに誤ったラベルがないために拒否されます。一般的に表示されるパーミッションには、getattrread、および write が含まれます。
comm="httpd"
プロセスを起動した実行ファイル。実行可能ファイルの完全パスは、システムコール(SYSCALL)メッセージの exe= セクションにあります。この場合は exe="/usr/sbin/httpd" です。
path="/var/www/html/file1"
プロセスがアクセスしようとしたオブジェクト(ターゲット)へのパス。
scontext="unconfined_u:system_r:httpd_t:s0"
拒否されたアクションを試みたプロセスの SELinux コンテキスト。この場合、Apache HTTP Server は httpd_t ドメインで実行している SELinux コンテキストです。
tcontext="unconfined_u:object_r:samba_share_t:s0"
プロセスがアクセスしようとしたオブジェクト(ターゲット)の SELinux コンテキスト。この例では、これが file1 の SELinux コンテキストです。samba_share_t タイプには、httpd_t ドメインで実行しているプロセスにアクセスできないことに注意してください。
特定の状況では、プロセスが実行中のプロセスの特性(ユーザー ID など)を変更するシステムサービスの実行を試みる場合など、tcontextscontext と一致する場合があります。また、プロセスが通常の制限なくより多くのリソース(メモリーなど)の使用を試みると、tcontextscontext に一致する可能性があります。そのため、そのプロセスが制限を壊すことができるかどうかを確認するセキュリティーチェックが行われます。
システムコール(SYSCALL)のメッセージには、2 つの項目があります。
  • success=no: 拒否(AVC)が強制されたかどうかを示します。success=no システムコールが成功しなかったことを示します(SELinux は拒否されたアクセスを拒否)。success=yes システムコールが成功したことを示します。これは、unconfined_service_t や kernel_t などの Permissive ドメインまたは制限のないドメインで確認できます
  • exe="/usr/sbin/httpd": プロセスが起動した実行可能ファイルへの完全パスです。この場合は exe="/usr/sbin/httpd" になります。
ファイルタイプが間違っているのは、SELinux 拒否アクセスの一般的な原因です。トラブルシューティングを開始するには、ソースコンテキスト(scontext)をターゲットコンテキスト(tcontext)と比較します。プロセス(scontext)がこのオブジェクトにアクセスするべきか(tcontext)?たとえば、Apache HTTP Server(httpd_t)は、特に設定されていない限り、httpd_selinux(8) man ページ (httpd_sys_content_t、public_content_t など)で指定されたタイプのみにアクセスする必要があります。

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

11.3.8. アクセスの許可: audit2allow

警告
本項に記載する例は、実稼働環境で使用しないでください。これは、audit2allow ユーティリティーの使用を示すために使用されます。
audit2allow ユーティリティーは、拒否された操作のログから情報を収集してから、SELinux ポリシー allow ルールを生成します。[13] 「Sealert メッセージ」 を使用してローカルポリシーモジュールを作成します。SELinux によるアクセスが拒否されると、audit2allow により、以前拒否されたアクセスを許可する Type Enforcement ルールが実行されます。
audit2allow を使用して、SELinux 拒否を確認する際に、最初のオプションとしてローカルポリシーモジュールを生成しないでください。トラブルシューティングは、ラベル付けの問題があるかどうかを最初に確認します。2 番目に多いのが、SELinux がプロセス設定を変更していない場合です。詳細は「Fiour 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)
    
    この例では、certwatch は、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;
    
    重要
    タイプの適用ルールは不要です。通常、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 のバグを作成します。
複数のプロセスからの拒否メッセージが複数あり、単一のプロセス用のカスタムポリシーのみを作成する場合は、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

National Security Agency(NSA)

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

Tresys テクノロジープレビュー

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

SELinux GitHub リポジトリー

SELinux プロジェクトの Wiki

The SELinux Notebook - The Foundations - 4th Edition

Digitalocean: CentOS 7 での SELinux の概要

IRC

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

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

第13章 はじめに

本パートでは実用的なタスクに関する重点を置き、さまざまなサービスを設定および構成する方法を説明します。サービスごとに、仕様と共に最も一般的なタイプおよびブール値の一覧が記載されています。また、SELinux が操作を補完する方法のサービスやデモの設定に関する実際の例も含まれています。
SELinux が Enforcing モードの場合、Red Hat Enterprise Linux で使用されるデフォルトのポリシーはターゲットポリシーになります。ターゲットが制限のあるドメインで実行するプロセス、および制限のないドメインでの実行がターゲット化されたプロセスです。3章ターゲットポリシー、を参照してください。

第14章 Apache HTTP Server

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 を使用する場合は、yum ユーティリティーを使用して root ユーザーとしてインストールします。
~]# yum install httpd

14.1. Apache HTTP Server および 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 です。コンテキストの最後の部分は httpd_t の 2 番目の部分がタイプです。タイプは、プロセス用のドメインとファイルのタイプを定義します。この場合、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、9009、または 8443 以外のポートでリッスンすると、semanage port コマンドを使用して、新しいポート番号を SELinux ポリシー設定に追加します。以下の例は、httpd の SELinux ポリシー設定で定義されていないポートをリッスンするように httpd を設定する方法を示しています。そのため、httpd が起動に失敗します。また、この例では、SELinux システムを設定して、httpd がポリシーで定義されていない非標準ポートで正常にリッスンできるようにする方法も実証しています。この例では、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...]
    

14.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type Enforcement です。すべてのファイルおよびディレクトリーにはタイプでラベルが付けられます。type は、プロセス用に SELinux ドメインとファイルの SELinux タイプを定義します。SELinux ポリシールールは、タイプにアクセスするドメインであるか、別のドメインにアクセスするドメインであるかに関わらず、そのタイプへのアクセス方法を定義します。アクセスは、許可される特定の SELinux ポリシールールが存在する場合に限り許可されます。
以下の例では、/var/www/html/ ディレクトリーに新しいファイルを作成し、親ディレクトリー(/var/www/html/)から httpd_sys_content_t タイプを継承するファイルを示しています。
  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 により、httpd はこのタイプのラベルが付いたファイルを読み取ることができますが、Linux の権限が書き込みアクセスを許可していても、書き込みはできません。SELinux ポリシーは、httpd_t ドメインで実行するプロセスのタイプ (httpd の実行場所)を定義します。これにより、プロセスが、別のプロセスで使用する予定のファイルにアクセスするのを防ぐのに役立ちます。
たとえば、httpd は httpd _sys_content_t タイプ(Apache HTTP Server の制約)でラベル付けされたファイルにアクセスできますが、デフォルトでは samba_share_t タイプ(「Samba 向けの)」とラベルが付けられたファイルにアクセスできません。また、ユーザーのホームディレクトリーのファイルには、user_home_t タイプでラベル付けされます。デフォルトでは、httpd がユーザーのホームディレクトリー内のファイルの読み取りまたは書き込みを防ぎます。
以下は、httpd で使用されるタイプの一覧です。異なるタイプにより、柔軟なアクセスを設定できます。
httpd_sys_content_t
静的 Web サイトが使用する静的 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_sys_script_exec_t のラベルが付けられたスクリプトは、httpd の実行時に httpd_sys_script_t ドメインで実行されます。httpd_sys_script_t ドメインが、postgresql_t や mysqld_t などのその他のシステムドメインにアクセスできる。
httpd_sys_rw_content_t
このタイプのラベルのファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで作成できますが、他のタイプのラベルが付けられたスクリプトで修正することはできません。httpd_sys_rw_content_t タイプを使用して、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで読み込まれ、書き込まれたファイルにラベルを付ける必要があります。
httpd_sys_ra_content_t
このタイプのラベルのファイルは、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトに追加できますが、他のタイプのラベルが付けられたスクリプトで修正することはできません。httpd_sys_ra_content_t タイプを使用して、httpd_sys_script_exec_t タイプのラベルが付いたスクリプトで読み込まれ、追加されたファイルにラベルを付ける必要があります。
httpd_unconfined_script_exec_t
このタイプのラベルが付けられたスクリプトは、SELinux 保護なしで実行します。他のすべてのオプションを使い切った後に、複雑なスクリプトにはこのタイプのみを使用します。httpd の SELinux 保護を無効にする代わりに、このタイプを使用することが推奨されます。
注記
httpd で利用可能なタイプの詳細は、以下のコマンドを入力します。
~]$ grep httpd /etc/selinux/targeted/contexts/files/file_contexts

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

chcon コマンドを使用して、ファイルおよびディレクトリーのタイプを変更できます。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. touch ユーティリティーを使用して新規ファイルを作成します。
    ~]# touch /my/website/index.html
  4. root で次のコマンドを実行し、ラベルの変更を適用します(restorecon は手順 2 の semanage コマンドによって変更された file-context 設定を読み込みます)。
    ~]# restorecon -R -v /my/
    restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
    
semanage 「永続的な変更: semanage fcontext」 を参照してください。

14.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 オプションは使用しないでください。
以下は、cater が httpd の実行方法に使用できる一般的なブール値の説明です。
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 applications など)では、この権限が必要になります。
httpd_ssi_exec
このブール値は、Web ページのサーバー側に含まれる(SSI)要素を実行するかどうかを定義します。
httpd_tty_comm
このブール値は、httpd が制御されているターミナルへのアクセスが許可されているかどうかを定義します。通常、このアクセスは必要ありませんが、SSL 証明書ファイルの設定などでは、パスワードプロンプトを表示して処理するには端末アクセスが必要になります。
httpd_unified
有効にすると、このブール値により、httpd_t が全 httpd タイプ(つまり sys_content_t の実行、読み取り、書き込み)への完全なアクセスを許可します。無効にすると、読み取り専用、書き込み、または実行可能な Web コンテンツ間で分離が行われます。このブール値を無効にすると、より多くのセキュリティーレベルが確保されますが、ラベルスクリプトを個別にする管理のオーバーヘッドおよび各ファイルアクセスに基づいて、その他の Web コンテンツを追加します。
httpd_use_cifs
このブール値を有効にして、Samba を使用してマウントされたファイルシステムなど、cifs_t タイプでラベル付けされた CIFS ボリュームのファイルに httpd がアクセスできるようにします。
httpd_use_nfs
このブール値を有効にして、NFS を使用してマウントされたファイルシステムなど、nfs_t タイプでラベル付けされた NFS ボリュームのファイルへの httpd アクセスを可能にします。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するすべてのブール値が常に含まれていない可能性があります。一覧を表示するには、以下のコマンドを入力します。
~]$ getsebool -a | grep service_name
特定のブール値の説明を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要になることに注意してください。

14.4. 設定例

以下では、SELinux がどのように Apache HTTP Server を補完するのか、Apache HTTP Server の全機能をどのように維持するのかを実践的な例を用いて示します。

14.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. この例では、root で /etc/httpd/conf/httpd.conf ファイルを編集します。既存のDocumentRoot オプションをコメントアウトします。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/
    

14.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 ボリュームにアクセスして共有できるようにします (cifs_t タイプとラベル付き)。
~]# setsebool -P httpd_use_cifs on
注記
setsebool への変更が再起動後も維持しない場合は、-P オプションは使用しないでください。

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

タイプの適用は、プロセスが別のプロセスで使用するファイルにアクセスできないようにします。たとえば、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. sambasamba-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'! エラーが発生します。
  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 ユーティリティーユーザーと、新しいディレクトリーを作成します。このディレクトリーは、shares Samba 共有のマウントに使用されます。
    ~]# mkdir /test/
  7. root で以下のコマンドを実行して、shares Samba 共有を /test/ にマウントします。ユーザー名は手順 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/ ディレクトリーへのリンク(名前: 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 がなく、代わりに file1、file2、および 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 に移動します。ディレクトリーの一覧が表示されます。

14.4.4. ポート番号の変更

ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。root ユーザーで semanage ユーティリティーを使用して、SELinux ポートを一覧表示すると、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. root で /etc/httpd/conf/httpd.conf ファイルを編集し、Listen オプションは httpd の SELinux ポリシーで設定されていないポートを一覧表示します。以下の例では、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] 詳細は、『システム管理者のガイド』の「Apache HTTP Sever https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#s1-The_Apache_HTTP_Server 」というセクションを参照してください

第15章 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 を使用する場合は、yum ユーティリティーを使用して root ユーザーとしてインストールします。
~]# yum install samba

15.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 です。コンテキストの最後の 2 番目の部分は、smbd_t というタイプになります。タイプは、プロセス用のドメインとファイルのタイプを定義します。この場合、smbd プロセスが smbd _t ドメインで実行されます
smbd がそれらにアクセスおよび共有できるようにするには、ファイルにラベルが付けられている必要があります。たとえば、smbdsamba_share_t タイプのファイルに読み取りおよび書き込みが可能ですが、デフォルトでは、httpd_sys_content_t タイプのラベルが付いたファイルにアクセスできません。これは Apache HTTP Server で使用することが意図されています。ホームディレクトリーや NFS ボリュームを Samba 経由でエクスポートし、Samba がドメインコントローラーとして動作するのを許可するなど、特定の動作を可能にするブール値を有効にする必要があります。

15.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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.conf のタイプが httpd_sys_content_t タイプのラベル付けされた時の拒否メッセージの例になります。
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af

15.3. ブール値

SELinux は、サービスの実行に必要な最小限のアクセスレベルに基づいています。サービスはさまざまな方法で実行できるため、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
smbd_anon_write
このブール値を有効にすると、smbd は、特別なアクセス制限のない共通ファイル用に予約される領域など、パブリックディレクトリーへの書き込みが可能になります。
samba_create_home_dirs
このブール値を有効にすると、Samba は新しいホームディレクトリーを個別に作成することができます。通常は、PAM などのメカニズムにより行われます。
samba_domain_controller
これを有効にすると、このブール値は Sambaがドメインコントローラーとして機能し、useradd、groupadd passwd などの関連コマンドを実行するパーミッションを付与できます。
samba_enable_home_dirs
このブール値を有効にすると、Samba がユーザーのホームディレクトリーを共有できます。
samba_export_all_ro
ファイルまたはディレクトリーをエクスポートし、読み取り専用パーミッションを許可します。これにより、samba_share_t タイプのラベル付けされていないファイルおよびディレクトリーが Samba 経由で共有できるようになります。samba_export_all_ro のブール値が有効化されると、samba_export_all_rw のブール値が無効になっている場合は、/etc/samba/smb.conf で書き込みアクセスが設定されていても、Samba 共有への書き込みアクセスは拒否されます。
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 パッケージが必要になることに注意してください。

15.4. 設定例

SELinux でどのように Samba サーバーを補完するのか、Samba サーバーの全機能をどのように管理するのかなど、実践的な例を以下に示します。

15.4.1. 作成したディレクトリーを共有する

以下の例では、新しいディレクトリーを作成し、Samba 経由でそのディレクトリーを共有します。
  1. sambasamba-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
    
    このパッケージのいずれかがインストールされていない場合は、yum ユーティリティーを使用して root でインストールします。
    ~]# yum install package-name
  2. mkdir ユーティリティーを root として使用して、Samba を介してファイルを共有する新しい最上位ディレクトリーを作成します。
    ~]# mkdir /myshare
  3. touch ユーティリティーの root を使用して、空のファイルを作成します。このファイルは後で、Samba 共有が正しくマウントされたことを確認します。
    ~]# touch /myshare/file1
  4. SELinux により、Samba は、/etc/samba/smb.conf ファイルと Linux パーミッションが設定されている限り、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'! エラーが発生します。
  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 として使用して、新しいディレクトリーを作成します。このディレクトリーは、myshare Samba 共有のマウントに使用されます。
    ~]# mkdir /test/
  11. root で以下のコマンドを実行して、myshare Samba 共有を /test/ にマウントします。ユーザー名は、手順 7 のユーザー名に置き換えます。
    ~]# mount //localhost/myshare /test/ -o user=username
    手順 7 で設定されたユーザー名のパスワードを入力します
  12. 以下のコマンドを入力して、手順 3 で作成した file1 ファイルを表示します。
    ~]$ ls /test/
    file1
    

15.4.2. Web サイトの共有

たとえば、/var/www/html/ ディレクトリーの Web サイトを共有する場合は、samba_share_t タイプでファイルにラベルを付けることはできません。これらの場合には、samba_export_all_ro のブール値を使用してすべてのファイルまたはディレクトリーを共有し(現在のラベルに拘らず)、読み取りのみのパーミッション、または samba_export_all_rw のブール値を使用して、ファイルまたはディレクトリーを共有し(現在のラベルとは無い)、読み取りおよび書き込みパーミッションを許可します。
以下の例では、/var/www/html/ の Web サイトのファイルを作成し、Samba 経由でそのファイルを共有し、読み取りおよび書き込みパーミッションを許可します。この例では、httpd パッケージ、sambasamba-commonsamba-client、および wget パッケージがインストールされていることを前提としています。
  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] 詳細は、『システム管理者のガイド』の「Samba https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#sect-Samba 」セクションを参照してください

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

ファイル転送プロトコル(FTP)は、今日インターネット上で見られる、最も古く、一般的に使用されているプロトコルです。この目的は、ユーザーがリモートホストに直接ログインしなくても、またはリモートシステムの使用法についての知識がなくても、ネットワーク上のコンピューターホスト間で確実にファイルを転送することです。これにより、標準の簡単なコマンドセットを使用して、リモートシステムのファイルにアクセスできます。
vsftpd(Very Secure FTP Daemon)は、高速で安定性があり、かつ重要な点として安全性となるように、ギャラウンドから設計されています。多数の接続を効率的に処理できる機能は、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 パッケージがインストールされないようにするには、yum ユーティリティーを使用して root ユーザーとしてインストールします。
~]# yum install vsftpd

16.1. タイプ

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

16.2. ブール値

SELinux は、サービスの実行に必要な最小限のアクセスレベルに基づいています。サービスはさまざまな方法で実行できるため、サービスの実行方法を指定する必要があります。以下のブール値を使用して SELinux を設定します。
ftpd_anon_write
無効にすると、このブール値は vsftpdpublic_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 でマウントされたファイルシステムを共有することができます。
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 パッケージが必要になることに注意してください。

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

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

17.1. NFS および SELinux

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

17.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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
NFS に関連するシステム実行可能ファイルおよびライブラリーであるため、/usr/sbin/rpc.nfsd ファイルにはnfsd_exec_t のラベルが付けられます。ユーザーには、このタイプのファイルにラベルを付けることはできません。nfsd_exec_t will transition to nfsd_t.

17.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 ボリュームを共有できます。無効にすると、このブール値は Samba を使用して、smbd が NFS 共有に完全にアクセスできないようにします。
sanlock_use_nfs
これを有効にすると、このブール値により、sanlock デーモンが NFS ボリュームを管理できます。
sge_use_nfs
これを有効にすると、このブール値により、スケジューラーが NFS ボリュームにアクセスできます。
use_nfs_home_dirs
これを有効にすると、このブール値で NFS ホームディレクトリーのサポートが追加されました。
virt_use_nfs
このブール値を有効にすると、暗号化された仮想ゲストが NFS ボリューム上のファイルを管理できるようになります。
xen_use_nfs
これを有効にすると、このブール値により、Xen が NFS ボリューム上のファイルを管理できます。
git_cgi_use_nfs
これを有効にすると、Git Common Gateway Interface(CGI)が NFS ボリュームにアクセスできるようになります。
注記
SELinux ポリシーの継続的な開発により、上記のリストには、サービスに関連するすべてのブール値が常に含まれていない可能性があります。一覧を表示するには、以下のコマンドを入力します。
~]$ getsebool -a | grep service_name
特定のブール値の説明を表示するには、以下のコマンドを実行します。
~]$ sepolicy booleans -b boolean_name
このコマンドが機能するには、sepolicy ユーティリティーを提供する追加の policycoreutils-devel パッケージが必要になることに注意してください。

17.4. 設定の例

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

以下の例は、SELinux が NFS サポートとアノテーションを付けた 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] 詳細は、『ストレージ管理ガイド』「Network File System(NFS)」の章を参照してください

第18章 Berkeley Internet Name Domain

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

18.1. BIND および SELinux

/var/named/slaves/ ディレクトリー、/ var/named/dynamic/ および /var/named/data/ ディレクトリーのデフォルトのパーミッションにより、ゾーンファイルは、ゾーン転送と動的 DNS の更新を使用して更新できます。/var/named/ のファイルには、マスターゾーンファイルに使用される named_zone_t タイプのラベルが付けられます。
スレーブサーバーの場合は、/etc/named.conf ファイルを、スレーブゾーンを /var/named/slaves/ に配置するように /etc/named.conf ファイルを設定します。以下は、/var/named/slaves/ に testdomain.com のゾーンファイルを保存するスレーブ DNS サーバー用の /etc/named.conf のドメインエントリーの例です。
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 に変更します。

18.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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 タイプにラベル付けされます

18.3. ブール値

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

18.4. 設定の例

18.4.1. 動的 DNS

BIND を使用すると、ホストは DNS およびゾーンファイルのレコードを動的に更新できます。これは、ホストコンピューターの IP アドレスが頻繁に変更され、DNS レコードにリアルタイム変更が必要な場合に使用します。
動的 DNS で更新したゾーンファイルには、/var/named/dynamic/ ディレクトリーを使用します。このディレクトリーで作成されたか、またはこのディレクトリーにコピーしたファイルは、named がそれらへの書き込みを可能にする Linux パーミッションは継承されます。このようなファイルには named_cache_t タイプでラベル付けされているため、SELinux では named_cache_t タイプのラベルが付けられます。
/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

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

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

19.1. CVS および SELinux

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

19.2. タイプ

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

19.3. ブール値

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

19.4. 設定の例

19.4.1. CVS の設定

この例では、簡単な CVS 設定と、リモートアクセスを許可する SELinux 設定を説明します。この例では、2 つのホストが使用されます。CVS サーバーには、IP アドレスが 192.168.1.1cvs-srv のホスト名を持つ CVS サーバー、およびホスト名が cvs-client の IP アドレスと 192.168.1.100 の IP アドレスを持つクライアントが提供されます。両方のホストが同じサブネット上にあります(192.168.1.0/24)。この例では、cvs パッケージおよび xinetd パッケージがインストールされ、SELinux が SELinux ターゲットポリシーを使用し、SELinux が強制モードで実行されていることを前提としています。
この例では、完全な DAC パーミッションでも、SELinux はファイルラベルに基づいてポリシールールを適用し、CVS でのアクセスがとくにラベル付けされた特定の領域のみへのアクセスを許可します。
注記
手順 1-9 は CVS サーバー cvs-srv で実行する必要があります。
  1. この例では、cvs および 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 で、リポジトリーを格納する /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. クライアント側で、cvsuser ユーザーで以下のコマンドを入力します。
    [cvsuser@cvs-client]$ cvs -d /cvs init
  11. この時点で、CVS が設定されていますが、SELinux はログインとファイルアクセスを拒否します。これを行うには、cvs-client$CVSROOT 変数を設定し、リモートでログインを試行します。cvs-client で以下のステップを実行します。
    [cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
    [cvsuser@cvs-client]$
    [cvsuser@cvs-client]$ cvs login
    Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
    CVS password: ********
    cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot open /cvs/CVSROOT/config: Permission denied
    
    SELinux はアクセスをブロックしました。このアクセスを許可する SELinux を取得するには、以下の手順を cvs-srv で実行するとします。
  12. /cvs/ ディレクトリーの既存データおよび新規データを再帰的にラベルを付け 、cvs_data_t タイプを指定するには、/cvs/ ディレクトリーのコンテキストを変更します。
    [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]$
    

第20章 Squid Caching Proxy

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

20.1. Squid Caching Proxy および 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 ポリシー設定に必要なポート番号を追加する必要があります。以下の例は、最初に SELinux ポリシー設定で定義されていないポートをリッスンするように squid を設定する方法を示しています。その結果、サーバーの起動に失敗します。また、この例では、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. /etc/squid/squid.conf を root として編集します。squid の SELinux ポリシー設定で設定されていないポートを一覧表示するよう http_port オプションを設定します。この例では、デーモンはポート 10000 でリッスンするように設定されます。
    # Squid normally listens to port 3128
    http_port 10000
    
  4. setsebool コマンドを実行して、squid_connect_any ブール値がオフに設定されていることを確認します。これにより、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 が設定されました(この例では TCP 10000)。

20.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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/squidGuard / ディレクトリーに作成またはコピーされた squid の squid プラグイン用の squidGuard プラグイン用のファイルも、squid_cache_t タイプでラベル付けされます。Squid は、キャッシュされたデータに対してこの種別にラベル付けされたファイルおよびディレクトリーのみを使用できる。
squid_conf_t
このタイプは、Squid の設定に使用するディレクトリーおよびファイルに使用されます。/etc/squid/ ディレクトリーおよび /usr/share/squid/ ディレクトリーにコピーされた既存のファイル、または /usr/share/squid/ ディレクトリーにコピーして、エラーメッセージやアイコンなど、このタイプのラベルが付けられます。
squid_exec_t
このタイプは、squid バイナリー 、/usr/sbin/squid に使用されます。
squid_log_t
このタイプはログに使用されます。/var/log/squid/ または /var/log/squidGuard/ にコピーされた既存のファイルか、または /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)のファイルで使用します。

20.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 パッケージが必要になることに注意してください。

20.4. 設定の例

20.4.1. 非標準ポートへの squid 接続

以下の例は、上記のブール値を適用し、デフォルトで特定のポートへのアクセスのみを許可することで SELinux が Squid を補完する方法の実際のデモを示しています。この例では、ブール値の変更方法を示し、そのアクセスが許可されています。
これは単なる例であり、SELinux が Squid のシンプルな設定にどのように影響するかを示しています。Squid の包括的なドキュメントは、本書では扱いません。詳細は、公式の Squid ドキュメント を参照してください。この例では、Squid ホストには、インターネットへのアクセス、および Squid がリッスンするデフォルトの TCP ポートを使用する内部インターフェースでアクセスを許可するように設定されたファイアウォールが 2 つあることを前提としています(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)、最後に作成される最初のレベルおよび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 サイトなど、標準以外のポートを使用して要求を行うと、以下のような拒否がログに記録されます。
    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 プロジェクトページを参照してください。

第21章 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

21.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 ドメインで実行されます

21.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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 などの関連するソケットファイルに使用されます。このようなファイルには、制限のあるサービスとして適切な操作に対して適切にラベル付けする必要があります。

21.3. ブール値

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

21.4. 設定の例

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

Red Hat Enterprise Linux を使用する場合、MariaDB がデータベースを保存する場所が /var/lib/mysql/ です。これは、SELinux がデフォルトで想定されていることを前提としています。したがって、この領域には mysqld_db_t タイプを使用してすでに適切なラベルが付けられています。
データベースの保存先は、個別の環境要件や設定に合わせて変更できますが、SELinux はこの新しい場所を認識していることが重要です。この場合、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
    
    新規作成されたディレクトリーの contextusr_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 プロジェクトページを参照してください。

第22章 PostgreSQL

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

22.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 ドメインで実行されています。

22.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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 のランタイムファイルに使用されます。

22.3. ブール値

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

22.4. 設定の例

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

Red Hat Enterprise Linux を使用する場合、PostgreSQL がデータベースを保存するデフォルトの場所は /var/lib/pgsql/data/ です。これは、SELinux がデフォルトで想定されていることを前提としています。したがって、この領域には postgresql_db_t タイプを使用して、すでに適切なラベルが付けられています。
データベースが置かれている領域は、個別の環境要件または設定に応じて変更できますが、SELinux はこの新しい場所を認識していることが重要です。この場合、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. postgresql プロセスが新しい場所を表示する ps コマンドを確認します。
    ~]# 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 プロジェクトページを参照してください。

第23章 rsync

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

23.1. rsync および SELinux

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

23.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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/rsyncd.lock にある rsyncd ロックファイルに使用されます。このロックファイルは、接続制限を管理するために rsync サーバーによって使用されます。
rsync_data_t
このタイプは、rsync ドメインとして使用するファイルおよびディレクトリーに使用され、それらを他のサービスのアクセススコープから分離します。また、public_content_t は一般的な SELinux コンテキストタイプです。これは、ファイルやディレクトリーが複数のサービスと対話する場合に使用できます(例: FTP および NFS ディレクトリーを rsync ドメインとする)。
rsync_etc_t
このタイプは、/etc ディレクトリー内の rsync 関連のファイルに使用されます。

23.3. ブール値

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

23.4. 設定の例

23.4.1. rsync as a daemon

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

手順23.1 rsync で rsync として起動します。

  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 はソケットでアクティベートされたサービスとしても実行できます。この場合、rsyncd はクライアントがサービスへの接続を試みるまでは実行されません。rsyncd がソケットでアクティブ化されたサービスとして実行できるようにするには、上記の手順に従います。ソケットをアクティベートしたサービスとして rsync を起動するには、root で次のコマンドを実行します。
~]# systemctl start rsyncd.socket
次の例では、デフォルト以外のポートでこのデーモンを正常に実行する方法を説明します。TCP ポート 10000 は次の例では使用されています。

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

  1. /etc/rsyncd.conf ファイルを変更し、global 設定エリア(ファイル領域が定義されている前に)ファイルの最上部に 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 ユーティリティーを使用して、TCP ポート 10000 を rsync_port_t の SELinux ポリシーに追加します。
    ~]# semanage port -a -t rsync_port_t -p tcp 10000
  4. rsync_port_t の SELinux ポリシーに TCP ポート 10000 が追加され、rsync d はこのポートで通常起動し、操作するようになりました。
    ~]# 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 ページを参照してください。

第24章 postfix

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

24.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 ドメインで実行されます

24.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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

24.3. ブール値

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

24.4. 設定の例

24.4.1. SpamAssassin および Postfix

SpamAssasin は、受信メールから未承諾メール(スパムメッセージ)をフィルタリングする方法を提供するオープンソースのメールフィルターです。[23]
Red Hat Enterprise Linux を使用する場合、spamassassin パッケージは 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 ドキュメントを参照してください。この例では、spamassassin がインストールされており、使用しているポート、SELinux ターゲットポリシーを使用し、SELinux が Enforcing モードで実行されているファイアウォールが設定されていることを前提としています。

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

  1. semanage ユーティリティーを root として使用し、SELinux が 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 で SpamAssassin が example ポート(TCP/10000) で動作できるようにするには、semanage を実行して SELinux ポリシーを変更します。
    ~]# 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. この時点で、spamd は SELinux ポリシーによるポートへのアクセスが許可されるため、TCP ポート 10000 で適切に動作します。


[23] 詳細は、『システム管理者のガイド』の「Spam Filters https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#s1-email-mda 」セクションを参照してください


[22] 詳細は、『システム管理者のガイド』の「Postfix https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#s2-email-mta-postfix 」セクションを参照してください

第25章 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

25.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 です。

25.2. タイプ

高度なプロセス分離を提供するために、SELinux ターゲットポリシーで使用される主なパーミッション制御方法は、Type 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

第26章 OpenShift by Red Hat

Red Hat による OpenShift は Service(PaaS)としてのプラットフォームであり、開発者は Web アプリケーションをビルドおよびデプロイできます。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 Installation Guide』および『OpenShift Online Client Tools Installation Guide』で OpenShift クライアントツールのインストールプロセスの詳細を参照してください。
重要
以前のバージョンでは、rhc パッケージは OpenShift クライアントツールを提供していました。OpenShift の最新バージョンでは、このパッケージは非推奨となり、Red Hat のサポート対象外となります。そのため、OpenShift バージョン 2 以降、rhc パッケージは、サポートされる OpenShift バージョンに使用される OpenShift クライアントツールを提供する openshift-clients パッケージに置き換えられます。

26.1. OpenShift および SELinux

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

26.2. タイプ

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

プロセスタイプ

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

実行タイプ

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

書き込み可能なタイプ

openshift_cgroup_read_tmp_t
このタイプでは、OpenShift コントロールグループ(cgroup)の /tmp ディレクトリーの一時ファイルの読み取りおよびアクセスが可能になります。
openshift_cron_tmp_t
このタイプにより、OpenShift cron ジョブの一時ファイルを /tmp に保存できます
openshift_initrc_tmp_t
このタイプにより、OpenShift initrc の一時ファイルを /tmp に保存できます
openshift_log_t
このタイプのファイルは、通常 /var/log/ ディレクトリー下に保存される OpenShift ログデータとして処理されます。
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/ ディレクトリーに保存できます。

26.3. ブール値

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

26.4. 設定の例

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

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

手順26.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/
    

第27章 Identity Management

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

27.1. Identity Management および SELinux

Identity Management は、IdM ユーザーを、ホストごとに設定した SELinux ロールにマッピングして、IdM アクセス権の SELinux コンテキストを指定できます。ユーザーのログインプロセスでは、System Security Services Daemon(SSSD)は、特定の IdM ユーザーに定義されているアクセス権限をクエリーします。次に、pam_selinux モジュールはカーネルにリクエストを送信して、IdM アクセス権限(例: guest_u:guest_r:guest_t:s0 )に従って、適切な SELinux コンテキストでユーザープロセスを起動します。
Identity Management および SELinux の詳細は、Red Hat Enterprise Linux 7 の Linux ドメイン、ID、認証、およびポリシーガイドを参照してください

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

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

27.2. 設定の例

27.2.1. SELinux ユーザーを IdM ユーザーにマッピングする

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

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

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

第28章 Red Hat Gluster Storage

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

28.1. Red Hat Gluster Storage と SELinux

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

28.2. タイプ

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

プロセスタイプ

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

実行タイプ

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

ポートタイプ

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

ファイルコンテキスト

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

28.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 パッケージが必要になることに注意してください。

28.4. 設定の例

28.4.1. Gluster ブリックのラベリング

Gluster ブリックは、信頼できるストレージプールのサーバー上のエクスポートディレクトリーです。ブリックが正しい SELinux コンテキスト glusterd_brick_t でラベル付けされていない場合、SELinux は特定のファイルアクセス操作を拒否し、各種 AVC メッセージを生成します。
以下の手順は、正しい SELinux コンテキストで Gluster ブリックにラベルを付ける方法を示しています。この手順では、以前論理ボリューム (/dev/rhgs/gluster など)を作成し、Gluster ブリックとして使用することを前提とします。

手順28.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/
    ディレクトリーには、unlabeled_t SELinux タイプのラベルが付けられます。
  4. /mnt/brick1/ の SELinux タイプを、SELinux タイプ glusterd_brick_t に変更します。
    ~]# 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/

第29章 参考資料

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

書籍

SELinux by Example
Mayer、MacMillan、Caplan 著
2007年、Prentice Hall 出版
SELinux: NSA's Open Source Security Enhanced Linux
Bill McCarty 著
2004年、O'Reilly Media Inc. 出版

チュートリアルとヘルプ

チュートリアルおよび会議は Russell Coker から
Dan Walsh's Journal
Red Hat ナレッジベース

メーリングリスト

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

コミュニティー

SELinux プロジェクトの 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 用の本書ガイドの初期作成。

法律上の通知

Copyright © 2019 Red Hat, Inc.
このドキュメントは、Red Hat が Creative Commons Attribution-ShareAlike 3.0 Unported License に基づいてライセンスを提供しています。If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original.If the document is modified, all Red Hat trademarks must be removed.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent.Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission.We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.