SELinux の使用
Security-Enhanced Linux (SELinux) を使用して、ユーザーやプロセスによるファイルやデバイスに対する不正な操作を防止する
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat ドキュメントに関するご意見やご感想をお寄せください。また、改善点があればお知らせください。
Jira からのフィードバック送信 (アカウントが必要)
- Jira の Web サイトにログインします。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
第1章 SELinux の使用 リンクのコピーリンクがクリップボードにコピーされました!
Security Enhanced Linux (SELinux) は、新たにシステムセキュリティーの層を提供します。SELinux は、基本的に May <subject> do <action> to <object>? の形式の問い (たとえば May a web server access files in users' home directories? (Web サーバーは、ユーザーのホームディレクトリーのファイルにアクセスできますか ?)) に答えていきます。
1.1. SELinux の概要 リンクのコピーリンクがクリップボードにコピーされました!
ユーザー、グループ、およびその他のアクセス権に基づいた標準のアクセスポリシーは Discretionary Access Control (DAC) として知られており、システム管理者が、包括的で詳細なセキュリティーポリシー (たとえば、特定のアプリケーションではログファイルの表示だけを許可し、その他のアプリケーションではログファイルに新しいデータを追加するのを許可するなど) を作成することはできません。
Security Enhanced Linux (SELinux) は Mandatory Access Control (MAC) を実装します。それぞれのプロセスおよびシステムリソースには、SELinux コンテキスト と呼ばれる特別なセキュリティーラベルがあります。SELinux コンテキストは SELinux ラベル として参照されることがありますが、システムレベルの詳細を抽象化し、エンティティーのセキュリティープロパティーに焦点を当てた識別子です。これにより、SELinux ポリシーでオブジェクトを参照する方法に一貫性を持たせ、他の識別方法に含まれる曖昧さがなくなりました。たとえば、バインドマウントを使用するシステムで、ファイルに、有効なパス名を複数設定できます。
SELinux ポリシーは、プロセスが、互いに、またはさまざまなシステムリソースと相互作用する方法を定義する一連のルールにこのコンテキストを使用します。デフォルトでは、最初にルールが明示的にアクセスを許可し、その後ポリシーが任意の対話を許可します。
SELinux ポリシールールが DAC ルールの後に確認されている点に注意してください。DAC ルールがアクセスを拒否すると、SELinux ポリシールールは使用されません。これは、従来の DAC ルールがそのアクセスを拒否すると、SELinux 拒否がログに記録されないということを示しています。
SELinux コンテキストには、複数のフィールド (ユーザー、ロール、タイプ、セキュリティーレベル) があります。プロセスとシステムリソースとの間で許可される相互作用を定義する最も一般的なポリシールールは、完全な SELinux コンテキストではなく、SELinux タイプを使用するため、SELinux ポリシーでは、SELinux のタイプ情報がおそらく最も重要です。SELinux のタイプの名前は、最後に _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/ にあるコンテキストを持つファイルおよびディレクトリーと、その他の Web サーバーディレクトリー (httpd_sys_content_t) へのアクセスを許可します。通常、/tmp および /var/tmp/ に含まれるファイルのポリシーには、許可ルールがないため、アクセスは許可されません。SELinux を使用すれば、Apache が危険にさらされ、悪意のあるスクリプトがアクセスを得た場合でも、/tmp ディレクトリーにアクセスすることはできなくなります。
図1.1 Apache と MariaDB を安全に実行する SELinux の例
このスキーマが示すように、SELinux は、httpd_t として実行している Apache プロセスが /var/www/html/ ディレクトリーにアクセスするのは許可しますが、同じ Apache プロセスが /data/mysql/ ディレクトリーにアクセスするのは拒否します。これは、httpd_t タイプコンテキストと mysqld_db_t タイプコンテキストに許可ルールがないのが原因です。一方、mysqld_t として実行する MariaDB プロセスは /data/mysql/ ディレクトリーにアクセスできますが、SELinux により、mysqld_t タイプを持つプロセスが、httpd_sys_content_t とラベルが付いた /var/www/html/ ディレクトリーにアクセスするのは拒否されます。
1.2. SELinux を実行する利点 リンクのコピーリンクがクリップボードにコピーされました!
SELinux は、次のような利点を提供します。
- プロセスとファイルにはすべてラベルが付いています。SELinux ポリシーにより、プロセスがファイルと相互作用する方法と、プロセスが互いに相互作用する方法が定義されます。アクセスは、それを特別に許可する SELinux ポリシールールが存在する場合に限り許可されます。
- SELinux はきめ細かなアクセス制御を提供します。SELinux のアクセスは、ユーザーの裁量と、Linux のユーザー ID およびグループ ID に基づいて制御される従来の UNIX アクセス権だけでなく、SELinux のユーザー、ロール、タイプなど (必要に応じてセキュリティーレベルも) の、入手可能なすべての情報に基づいて決定されます。
- SELinux ポリシーは管理者が定義し、システム全体に適用されます。
- SELinux は権限昇格攻撃を軽減できます。プロセスはドメインで実行するため、互いに分離しています。SELinux ポリシールールは、プロセスがどのようにファイルやその他のプロセスにアクセスするかを定義します。プロセスへのアクセスが不正に行われても、攻撃者は、そのプロセスの通常の機能と、そのプロセスがアクセスするように設定されているファイルにしかアクセスできません。たとえば、Apache HTTP Server へのアクセスが不正に行われても、そのアクセスを許可する特別な SELinux ポリシールールが追加されたり、設定された場合を除き、ユーザーのホームディレクトリーにあるファイルを読み込むプロセスを攻撃者が利用することはできません。
- SELinux はデータの機密性と整合性を強化し、信頼できない入力からプロセスを保護できます。
SELinux は、ウイルス対策ソフトウェア、セキュアなパスワード、ファイアウォール、その他のセキュリティーシステムに代わるものではなく、既存のセキュリティーソリューションを強化することを目的としたものです。SELinux を実行している場合でも、ソフトウェアを最新の状態にする、推測が困難なパスワードを使用する、ファイアウォールを使用するなど、優れたセキュリティー対策を続けることが重要です。
1.3. SELinux の例 リンクのコピーリンクがクリップボードにコピーされました!
以下の例は、SELinux がどのようにセキュリティーを向上するかを説明します。
- デフォルトのアクションは拒否です。アクセスを許可する SELinux のポリシールール (ファイルを開くプロセスなど) が存在しない場合は、アクセスが拒否されます。
-
SELinux は、Linux ユーザーに制限をかけられます。SELinux ポリシーには、制限がかけられた SELinux ユーザーが多数含まれます。Linux ユーザーを、制限がかけられた SELinux ユーザーにマッピングして、SELinux ユーザーに適用されているセキュリティールールおよびメカニズムを利用できます。たとえば、Linux ユーザーを SELinux
user_uユーザーにマッピングすると、その Linux ユーザーは、sudoやsuなどの setuid (set user ID) アプリケーションを実行できなくなります。 - プロセスとデータの分離が向上します。SELinux ドメイン の概念により、特定のファイルやディレクトリーにアクセスできるプロセスの定義が可能になります。たとえば、SELinux を実行している場合に、(許可が設定されていない限り) 攻撃者は Samba サーバーを危険にさらすことはできず、その Samba サーバーを攻撃ベクトルとして使用して、その他のプロセス (MariaDB など) が使用するファイルの読み書きを行うことはできません。
-
SELinux は、設定ミスによるダメージを軽減します。ドメインネームシステム (DNS) サーバーは、多くの場合、ゾーン転送で相互に情報をレプリケートします。攻撃者は、ゾーン転送を使用して、虚偽の情報で DNS サーバーを更新できます。RHEL で Berkeley Internet Name Domain (BIND) を DNS サーバーとして実行している場合、管理者がゾーン転送を実行できるサーバーを制限するのを忘れた場合でも、デフォルトの SELinux ポリシーによってゾーンファイルの更新が妨げられます。 [1] BIND
namedのデーモン自体、およびその他のプロセスによって、ゾーン転送を使用します。 -
SELinux を使用しない場合、攻撃者は脆弱性を悪用して Apache Web サーバーのパストラバーサルを行い、
../などの特別な要素を使用してファイルシステムに保存されているファイルやディレクトリーにアクセスできます。SELinux を enforcing モードで実行しているサーバーに対して攻撃者が攻撃を試みた場合、SELinux は、httpdプロセスがアクセスしてはならないファイルへのアクセスを拒否します。SELinux はこのタイプの攻撃を完全にブロックすることはできませんが、効果的に緩和します。 -
Enforcing モードの SELinux は、非 SMAP プラットフォームでのカーネル NULL ポインター逆参照 Operator の悪用を正常に防止します (CVE-2019-9213)。攻撃者は、null ページのマッピングをチェックしない
mmap関数の脆弱性を利用して、このページに任意のコードを配置します。 -
deny_ptraceSELinux ブール値と Enforcing モードの SELinux は、システムを PTRACE_TRACEME 脆弱性 (CVE-2019-13272) から保護します。このような設定により、攻撃者がroot権限を取得できるシナリオが防止されます。 -
nfs_export_all_rwおよびnfs_export_all_roSELinux ブール値は、/homeディレクトリーの偶発的な共有など、ネットワークファイルシステム (NFS) の設定ミスを防ぐための使いやすいツールを提供します。
1.4. SELinux のアーキテクチャーおよびパッケージ リンクのコピーリンクがクリップボードにコピーされました!
SELinux は、Linux カーネルに組み込まれる Linux セキュリティーモジュール (LSM) です。カーネルの SELinux サブシステムは、管理者が制御し、システムの起動時に読み込まれるセキュリティーポリシーにより動作します。システムにおけるセキュリティー関連の、カーネルレベルのアクセス操作はすべて SELinux により傍受され、読み込んだセキュリティーポリシーのコンテキストに従って検討されます。読み込んだポリシーが操作を許可すると、その操作は継続します。許可しないと、その操作はブロックされ、プロセスがエラーを受け取ります。
アクセスの許可、拒否などの SELinux の結果はキャッシュされます。このキャッシュは、アクセスベクトルキャッシュ (AVC) として知られています。このように結果がキャッシュされると、確認が必要な量が減るため、SELinux ポリシーのパフォーマンスが向上します。DAC ルールがアクセスを拒否した場合は、SELinux ポリシールールが適用されないことに注意してください。未加工の監査メッセージのログは、行頭に type=AVC 文字列が追加されて、/var/log/audit/audit.log に記録されます。
RHEL 8 では、システムサービスは systemd デーモンによって制御されています。systemd はすべてのサービスを起動および停止し、ユーザーとプロセスは systemctl ユーティリティーを使用して systemd と通信します。systemd デーモンは、SELinux ポリシーを調べ、呼び出しているプロセスのラベルと、呼び出し元が管理するユニットファイルのラベルを確認してから、呼び出し元のアクセスを許可するかどうかを SELinux に確認します。このアプローチにより、システムサービスの開始や停止などの、重要なシステム機能へのアクセス制御が強化されます。
また、systemd デーモンは SELinux Access Manager としても起動します。systemctl を実行しているプロセス、または systemd に D-Bus メッセージを送信したプロセスのラベルを取得します。次に、デーモンは、プロセスが設定するユニットファイルのラベルを探します。最後に、SELinux ポリシーでプロセスラベルとユニットファイルラベルとの間で特定のアクセスが許可されている場合、systemd はカーネルから情報を取得できます。これは、特定のサービスに対して、systemd と相互作用を必要とする、危険にさらされたアプリケーションを SELinux が制限できることを意味します。ポリシー作成者は、このような粒度の細かい制御を使用して、管理者を制限することもできます。
プロセスが別のプロセスに D-Bus メッセージを送信しているときに、この 2 つのプロセスの D-Bus 通信が SELinux ポリシーで許可されていない場合は、システムが USER_AVC 拒否メッセージを出力し、D-Bus 通信がタイムアウトになります。2 つのプロセス間の D-Bus 通信は双方向に機能することに注意してください。
SELinux ラベリングが誤っているために問題が発生するのを回避するには、systemctl start コマンドを使用してサービスを開始するようにしてください。
RHEL 8 では、SELinux を使用するために以下のパッケージが提供されています。
-
ポリシー -
selinux-policy-targeted、selinux-policy-mls -
ツール -
policycoreutils、policycoreutils-gui、libselinux-utils、policycoreutils-python-utils、setools-console、checkpolicy
1.5. SELinux のステータスおよびモード リンクのコピーリンクがクリップボードにコピーされました!
SELinux は、3 つのモード (Enforcing、Permissive、または Disabled) のいずれかで実行できます。
- Enforcing モードは、デフォルトのモードで、推奨される動作モードです。SELinux は、Enforcing モードでは正常に動作し、読み込んだセキュリティーポリシーをシステム全体に強制します。
- Permissive モードでは、システムは、読み込んだセキュリティーポリシーを SELinux が強制しているように振る舞い、オブジェクトのラベリングや、アクセスを拒否したエントリーをログに出力しますが、実際に操作を拒否しているわけではありません。Permissive モードは、実稼働システムで使用することは推奨されませんが、SELinux ポリシーの開発やデバッグには役に立ちます。
- Disabled モードを使用することは推奨されません。システムは、SELinux ポリシーの強制を回避するだけでなく、ファイルなどの任意の永続オブジェクトにラベルを付けなくなり、将来的に SELinux を有効にすることが難しくなります。
Enforcing モードと Permissive モードとの間を切り替えるには setenforce ユーティリティーを使用してください。setenforce で行った変更は、システムを再起動すると元に戻ります。Enforcing モードに変更するには、Linux の root ユーザーで、setenforce 1 コマンドを実行します。Permissive モードに変更するには、setenforce 0 コマンドを実行します。getenforce ユーティリティーを使用して、現在の SELinux モードを表示します。
getenforce
# getenforce
Enforcing
setenforce 0 getenforce
# setenforce 0
# getenforce
Permissive
setenforce 1 getenforce
# setenforce 1
# getenforce
Enforcing
Red Hat Enterprise Linux では、システムを Enforcing モードで実行している場合に、個々のドメインを Permissive モードに設定できます。たとえば、httpd_t ドメインを Permissive に設定するには、以下のコマンドを実行します。
semanage permissive -a httpd_t
# semanage permissive -a httpd_t
Permissive ドメインは、システムのセキュリティーを侵害できる強力なツールです。Red Hat は、特定のシナリオのデバッグ時など、Permissive ドメインを使用する場合は注意することを推奨します。
第2章 SELinux のステータスおよびモードの変更 リンクのコピーリンクがクリップボードにコピーされました!
SELinux が有効になっている場合は、Enforcing モードまたは Permissive モードのいずれかで実行できます。以下のセクションでは、これらのモードに永続的に変更する方法を説明します。
2.1. SELinux のステータスおよびモードの永続的変更 リンクのコピーリンクがクリップボードにコピーされました!
SELinux のステータスおよびモード で説明されているように、SELinux は有効または無効にできます。有効にした場合の SELinux のモードには、Enforcing および Permissive の 2 つがあります。
getenforce コマンド、または sestatus コマンドを使用して、SELinux が実行しているモードを確認できます。getenforce コマンドは、Enforcing、Permissive、または Disabled を返します。
sestatus コマンドは SELinux のステータスと、使用されている SELinux ポリシーを返します。
Permissive モードで SELinux を実行すると、ユーザーやプロセスにより、さまざまなファイルシステムオブジェクトのラベルが間違って設定される可能性があります。SELinux が無効になっている間に作成されたファイルシステムのオブジェクトには、ラベルが追加されません。ただし、SELinux では、ファイルシステムオブジェクトのラベルが正しいことが必要になるため、これにより Enforcing モードに変更したときに問題が発生します。
SELinux では、誤ったラベル付けやラベル付けされていないファイルが問題を引き起こすことを防ぐため、Disabled 状態から Permissive モードまたは Enforcing モードに変更すると、ファイルシステムのラベルが自動的に再設定されます。root で fixfiles -F onboot コマンドを使用して、-F オプションを含む /.autorelabel ファイルを作成し、次回のシステムの再起動時にファイルに再ラベル付けされるようにします。
再ラベル付けのためにシステムを再起動する前に、enforcing=0 カーネルオプションを使用するなどして、システムが Permissive モードで起動することを確認します。これにより、selinux-autorelabel サービスを起動する前に、systemd が必要とするラベルのないファイルがシステムにある場合に、システムが起動に失敗することを防ぎます。詳細は、RHBZ#2021835 を参照してください。
2.2. SELinux の Permissive モードへの変更 リンクのコピーリンクがクリップボードにコピーされました!
SELinux を Permissive モードで実行していると、SELinux ポリシーは強制されません。システムは動作し続け、SELinux がオペレーションを拒否せず AVC メッセージをログに記録できるため、このログを使用して、トラブルシューティングやデバッグ、ならびに SELinux ポリシーの改善に使用できます。この場合、各 AVC は一度だけログに記録されます。
前提条件
-
selinux-policy-targeted、libselinux-utils、およびpolicycoreutilsパッケージがシステムにインストールされている。 -
selinux=0またはenforcing=0カーネルパラメーターは使用されません。
手順
任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。vi /etc/selinux/config
# vi /etc/selinux/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELINUX=permissiveオプションを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
システムの再起動後に、
getenforceコマンドがPermissiveを返すことを確認します。getenforce
$ getenforce PermissiveCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. SELinux の Enforcing モードへの変更 リンクのコピーリンクがクリップボードにコピーされました!
SELinux を Enforcing モードで実行している場合は、SELinux ポリシーが強制され、SELinux ポリシールールに基づいてアクセスが拒否されます。RHEL では、システムに SELinux を最初にインストールした時に、Enforcing モードがデフォルトで有効になります。
前提条件
-
selinux-policy-targeted、libselinux-utils、およびpolicycoreutilsパッケージがシステムにインストールされている。 -
selinux=0またはenforcing=0カーネルパラメーターは使用されません。
手順
任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。vi /etc/selinux/config
# vi /etc/selinux/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELINUX=enforcingオプションを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を保存して、システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次にシステムを起動する際に、SELinux はシステム内のファイルおよびディレクトリーのラベルを再設定し、SELinux が無効になっている間に作成したファイルおよびディレクトリーに SELinux コンテキストを追加します。
検証
システムの再起動後に、
getenforceコマンドがEnforcingを返すことを確認します。getenforce
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow
トラブルシューティング
Enforcing モードに変更したあと、SELinux ポリシールールが間違っていたか、設定されていなかったため、SELinux が一部のアクションを拒否する場合があります。
SELinux に拒否されるアクションを表示するには、root で以下のコマンドを実行します。
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayCopy to Clipboard Copied! Toggle word wrap Toggle overflow または、
setroubleshoot-serverパッケージがインストールされている場合は、次のように入力します。grep "SELinux is preventing" /var/log/messages
# grep "SELinux is preventing" /var/log/messagesCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が有効で、Audit デーモン (
auditd) がシステムで実行していない場合は、dmesgコマンドの出力で SELinux メッセージを検索します。dmesg | grep -i -e type=1300 -e type=1400
# dmesg | grep -i -e type=1300 -e type=1400Copy to Clipboard Copied! Toggle word wrap Toggle overflow
詳細は Troubleshooting problems related to SELinux を参照してください。
2.4. SELinux が無効になっていたシステムで SELinux を有効にする リンクのコピーリンクがクリップボードにコピーされました!
以前に SELinux を無効にしていたシステムで SELinux を有効にする場合は、システムの起動失敗やプロセスの失敗などの問題を回避するために、まずアクセスベクターキャッシュ (AVC) メッセージを permissive モードで解決します。
Permissive モードで SELinux を実行すると、ユーザーやプロセスにより、さまざまなファイルシステムオブジェクトのラベルが間違って設定される可能性があります。SELinux が無効になっている間に作成されたファイルシステムのオブジェクトには、ラベルが追加されません。ただし、SELinux では、ファイルシステムオブジェクトのラベルが正しいことが必要になるため、これにより Enforcing モードに変更したときに問題が発生します。
SELinux では、誤ったラベル付けやラベル付けされていないファイルが問題を引き起こすことを防ぐため、Disabled 状態から Permissive モードまたは Enforcing モードに変更すると、ファイルシステムのラベルが自動的に再設定されます。
再ラベル付けのためにシステムを再起動する前に、enforcing=0 カーネルオプションを使用するなどして、システムが Permissive モードで起動することを確認します。これにより、selinux-autorelabel サービスを起動する前に、systemd が必要とするラベルのないファイルがシステムにある場合に、システムが起動に失敗することを防ぎます。詳細は、RHBZ#2021835 を参照してください。
手順
- SELinux を Permissive モードで有効にします。詳細は Permissive モードへの変更 を参照してください。
システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux 拒否メッセージを確認します。詳細は、SELinux 拒否の特定 を参照してください。
次の再起動時に、ファイルが再ラベル付けされていることを確認します。
fixfiles -F onboot
# fixfiles -F onbootCopy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、
-Fオプションを含む/.autorelabelファイルが作成されます。警告fixfiles -F onbootコマンドを入力する前に、必ず Permissive モードに切り替えてください。デフォルトでは、
autorelabelはシステムで使用可能な CPU コアと同じ数のスレッドを並列に使用します。ラベルの自動再設定中に単一のスレッドのみを使用するには、fixfiles -T 1 onbootコマンドを使用します。- 拒否がない場合は、Enforcing モードに切り替えます。詳細は システム起動時の SELinux モードの変更 を参照してください。
検証
システムの再起動後に、
getenforceコマンドがEnforcingを返すことを確認します。getenforce
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
Enforcing モードで SELinux を使用してカスタムアプリケーションを実行するには、次のいずれかのシナリオを選択してください。
-
unconfined_service_tドメインでアプリケーションを実行します。 - アプリケーションに新しいポリシーを記述します。詳細は、カスタム SELinux ポリシーの作成 のセクションを参照してください。
2.5. SELinux の無効化 リンクのコピーリンクがクリップボードにコピーされました!
SELinux を無効にすると、システムが SELinux ポリシーをロードしなくなります。その結果、システムは SELinux ポリシーを適用せず、Access Vector Cache (AVC) メッセージをログに記録しません。したがって、SELinux を実行する利点 はすべて失われます。
パフォーマンスが重視されるシステムなど、セキュリティーを弱めても重大なリスクが生じない特殊な状況を除き、SELinux を無効にしないでください。
実稼働環境でデバッグを実行する必要がある場合は、SELinux を永続的に無効にするのではなく、一時的に permissive モードを使用してください。Permissive モードの詳細は Permissive モードへの変更 を参照してください。
前提条件
grubbyパッケージがインストールされている。rpm -q grubby
$ rpm -q grubby grubby-<version>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
手順
ブートローダーを設定して、カーネルコマンドラインに
selinux=0を追加します。sudo grubby --update-kernel ALL --args selinux=0
$ sudo grubby --update-kernel ALL --args selinux=0Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動します。
reboot
$ rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
再起動したら、
getenforceコマンドがDisabledを返すことを確認します。getenforce
$ getenforce DisabledCopy to Clipboard Copied! Toggle word wrap Toggle overflow
代替方法
RHEL 8 では、/etc/selinux/config ファイルの SELINUX=disabled オプションを使用して SELinux を無効にする 非推奨 の方法を引き続き使用できます。その結果、カーネルは SELinux が有効な状態で起動し、起動プロセスの後半で無効モードに切り替わります。その結果、メモリーリークや競合状態が発生し、カーネルパニックが発生する可能性があります。この方法を使用するには以下を実行します。
任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。vi /etc/selinux/config
# vi /etc/selinux/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELINUX=disabledオプションを設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を保存して、システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6. システム起動時の SELinux モードの変更 リンクのコピーリンクがクリップボードにコピーされました!
ブート時に、次のカーネルパラメーターを設定して、SELinux の実行方法を変更できます。
enforcing=0このパラメーターを設定すると、システムを起動する際に、Permissive モードで起動します。これは、問題のトラブルシューティングを行うときに便利です。ファイルシステムの破損がひどい場合は、Permissive モードを使用することが、問題を検出するための唯一の選択肢となるかもしれません。また、Permissive モードでは、ラベルの作成が適切に行われます。このモードで作成した AVC メッセージは、Enforcing モードと同じになるとは限りません。
Permissive モードでは、一連の同じ拒否の最初の拒否のみが報告されます。一方、Enforcing モードでは、ディレクトリーの読み込みに関する拒否が発生し、アプリケーションが停止する場合がします。Permissive モードでは、表示される AVC メッセージは同じですが、アプリケーションは、ディレクトリー内のファイルを読み続け、拒否が発生するたびに AVC を取得します。
selinux=0このパラメーターにより、カーネルは、SELinux インフラストラクチャーのどの部分も読み込まないようになります。init スクリプトは、システムが
selinux=0パラメーターで起動してるのを認識し、/.autorelabelファイルのタイムスタンプを変更します。これにより、次回 SELinux を有効にしてシステムを起動する際にシステムのラベルが自動的に再設定されます。重要実稼働環境では
selinux=0パラメーターを使用しないでください。システムをデバッグするには、SELinux を無効にする代わりに、一時的に permissive モードを使用してください。autorelabel=1このパラメーターにより、システムで、以下のコマンドと同様の再ラベルが強制的に行われます。
touch /.autorelabel reboot
# touch /.autorelabel # rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルシステムに間違ったラベルが付いたオブジェクトが大量に含まれる場合は、システムを Permissive モードで起動して自動再ラベルプロセスを正常に実行します。
第3章 制限のあるユーザーおよび制限のないユーザーの管理 リンクのコピーリンクがクリップボードにコピーされました!
各 Linux ユーザーは、SELinux ポリシーのルールに基づいて SELinux ユーザーにマッピングされます。管理者は、semanage login ユーティリティーを使用するか、Linux ユーザーを特定の SELinux ユーザーに直接割り当てることで、このルールを変更できます。したがって、Linux ユーザーには、割り当てられている SELinux ユーザーの制限が適用されます。SELinux ユーザーに割り当てられた Linux ユーザーがプロセスを起動すると、他のルールで別のロールまたはタイプが指定されていない限り、このプロセスは SELinux ユーザーの制限を継承します。
3.1. SELinux における制限のあるユーザーおよび制限のないユーザー リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、管理者権限を持つユーザーを含め、Red Hat Enterprise Linux のすべての Linux ユーザーは、制限のない SELinux ユーザー unconfined_u にマッピングされます。SELinux の制限のあるユーザーにユーザーを割り当てることで、システムのセキュリティーを強化できます。
Linux ユーザーのセキュリティーコンテキストは、SELinux ユーザー、SELinux ロール、および SELinux タイプで構成されます。以下に例を示します。
user_u:user_r:user_t
user_u:user_r:user_t
詳細は、以下のようになります。
user_u- SELinux ユーザーです。
user_r- SELinux ロールです。
user_t- SELinux タイプです。
Linux ユーザーのログイン後に、その SELinux ユーザーを変更することはできません。ただし、そのタイプとロールは、移行中などに変更できます。
システムで SELinux ユーザーマッピングを表示するには、root で semanage login -l コマンドを使用します。
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 *
Red Hat Enterprise Linux では、Linux ユーザーはデフォルトで SELinux の __default__ ログインにマッピングされ、これは、SELinux unconfined_u ユーザーにマッピングされます。以下の行は、デフォルトのマッピングを定義します。
default unconfined_u s0-s0:c0.c1023 *
default unconfined_u s0-s0:c0.c1023 *
制限のあるユーザーは、現在の SELinux ポリシーで明示的に定義されている SELinux ルールにより制限されます。制限のないユーザーには、SELinux による制限が最小限にとどまります。
制限のある Linux ユーザー、および制限のない Linux ユーザーは、実行可能なメモリーチェックおよび書き込み可能なメモリーチェックに依存し、また MCS または MLS によっても制限されます。
利用可能な SELinux ユーザーをリスト表示するには、以下のコマンドを実行します。
seinfo コマンドは、setools-console パッケージにより提供されることに注意してください。これは、デフォルトではインストールされません。
制限のない Linux ユーザーが、unconfined_t ドメインから自身の制限のあるドメインに移行できるものとして SELinux ポリシーが定義するアプリケーションを実行すると、制限のない Linux ユーザーは制限のあるドメインの制限を引き続き受けます。このセキュリティー上の利点は、Linux ユーザーが制限なしで実行している場合でも、アプリケーションは制限されたままになります。したがって、アプリケーションにおける不具合の悪用はポリシーによって制限できます。
同様に、これらのチェックを制限のあるユーザーに適用できます。制限のある各ユーザーは、制限のあるユーザードメインによって制限されます。SELinux ポリシーは、制限のあるユーザードメインから自身のターゲット制限のあるドメインへの移行を定義することもできます。このような場合、制限のあるユーザーはそのターゲットの制限のあるドメインの制限を受けます。主な点として、特別な権限は、ロールに応じて制限のあるユーザーに関連付けられる点が挙げられます。
3.2. SELinux ユーザーのロールとアクセス権 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーは、各 Linux ユーザーを SELinux ユーザーにマッピングします。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できます。
ポリシーのブール値を調整することで、SELinux ポリシーの制限ユーザーの権限を、特定のニーズに合わせてカスタマイズできます。semanage boolean -l コマンドを使用すると、このブール値の現在の状態を確認できます。すべての SELinux ユーザー、その SELinux ロール、MLS および MCS のレベルと範囲をリスト表示するには、root として semanage user -l コマンドを使用します。
| User | デフォルトロール | 追加のロール |
|---|---|---|
|
|
|
|
|
|
| |
|
|
| |
|
|
| |
|
|
|
|
|
| ||
|
| ||
|
|
| |
|
|
|
|
|
| ||
|
| ||
|
|
|
system_u は、システムプロセスおよびオブジェクトの特別なユーザー ID であり、system_r は関連付けられたロールであることに注意してください。管理者は、この system_u ユーザーと system_r ロールを Linux ユーザーに関連付けることはできません。また、unconfined_u および root は制限のないユーザーです。このため、これらの SELinux ユーザーに関連付けられたロールは、以下の表 SELinux ロールの種類とアクセス権 には含まれていません。
各 SELinux ロールは SELinux のタイプに対応しており、特定のアクセス権限を提供します。
| ロール | 型 | X Window System を使用したログイン | su および sudo | ホームディレクトリーおよび /tmp (デフォルト) での実行 | ネットワーク |
|---|---|---|---|---|---|
|
|
| はい | はい | はい | はい |
|
|
| いいえ | いいえ | はい | いいえ |
|
|
| はい | いいえ | はい | Web ブラウザーのみ (Mozilla Firefox、GNOME Web) |
|
|
| はい | いいえ | はい | はい |
|
|
| はい |
| はい | はい |
|
|
| はい | はい | はい | |
|
|
| はい | はい | はい | |
|
|
| はい | はい | はい | |
|
|
| はい | はい | はい | |
|
|
| はい | はい | はい | |
|
|
|
| はい | はい | はい |
非管理者ロールの詳細は、SELinux における制限のある非管理者ロール を参照してください。
管理者ロールの詳細は、SELinux における制限のある管理者ロール を参照してください。
利用可能なロールの一覧を表示するには、seinfo -r コマンドを実行します。
seinfo コマンドは、setools-console パッケージにより提供されることに注意してください。これは、デフォルトではインストールされません。
3.3. SELinux における制限のある非管理者ロール リンクのコピーリンクがクリップボードにコピーされました!
SELinux では、制限のある非管理者ロールは、特定のタスクを実行するための特定の権限とアクセス権のセットを、そのロールに割り当てられた Linux ユーザーに付与します。個別の制限のある非管理者ロールを割り当てることで、個々のユーザーに特定の権限を割り当てることができます。これは、複数のユーザーにそれぞれ異なるレベルの認可を与えるシナリオで役立ちます。
システム上の関連する SELinux ブール値を変更することで、SELinux ロールの権限をカスタマイズすることもできます。SELinux のブール値とその現在の状態を確認するには、root として semanage boolean -l コマンドを使用します。selinux-policy-devel パッケージをインストールすると、より詳細な説明を取得できます。
user_t、guest_t、および xguest_t ドメインの Linux ユーザーは、SELinux ポリシーで許可されている場合のみ (passwd など)、setuid (set user ID) アプリケーションを実行できます。これらのユーザーは setuid アプリケーション su および sudo を実行できないため、これらのアプリケーションを使用して root になることはできません。
デフォルトでは、staff_t ドメイン、user_t ドメイン、guest_t ドメイン、および xguest_t ドメインの Linux ユーザーは、ホームディレクトリーと /tmp でアプリケーションを実行できます。アプリケーションは、それを実行したユーザーの権限を継承します。
guest_t および xguest_t ユーザーが書き込みアクセス権を持つディレクトリーでアプリケーションを実行できないようにするには、guest_exec_content および xguest_exec_content のブール値を off に設定します。
SELinux には、次の制限のある非管理者ロールがあり、それぞれに特定の権限と制限があります。
guest_r非常に限られた権限しかありません。このロールに割り当てられたユーザーは、ネットワークにアクセスできませんが、
/tmpおよび/homeディレクトリー内のファイルを実行できます。関連するブール値:
SELinux boolean State Default Description guest_exec_content (on , on) Allow guest to exec content
SELinux boolean State Default Description guest_exec_content (on , on) Allow guest to exec contentCopy to Clipboard Copied! Toggle word wrap Toggle overflow xguest_r権限が制限されています。このロールに割り当てられたユーザーは、X Window にログインし、ネットワークブラウザーを使用して Web ページにアクセスし、メディアにアクセスできます。
/tmpおよび/homeディレクトリー内のファイルを実行することもできます。関連するブール値:
SELinux boolean State Default Description xguest_connect_network (on , on) Allow xguest users to configure Network Manager and connect to apache ports xguest_exec_content (on , on) Allow xguest to exec content xguest_mount_media (on , on) Allow xguest users to mount removable media xguest_use_bluetooth (on , on) Allow xguest to use blue tooth devices
SELinux boolean State Default Description xguest_connect_network (on , on) Allow xguest users to configure Network Manager and connect to apache ports xguest_exec_content (on , on) Allow xguest to exec content xguest_mount_media (on , on) Allow xguest users to mount removable media xguest_use_bluetooth (on , on) Allow xguest to use blue tooth devicesCopy to Clipboard Copied! Toggle word wrap Toggle overflow user_r非特権アクセス権と完全なユーザー権限を持ちます。このロールに割り当てられたユーザーは、管理者権限を必要としないほとんどのアクションを実行できます。
関連するブール値:
SELinux boolean State Default Description unprivuser_use_svirt (off , off) Allow unprivileged user to create and transition to svirt domains.
SELinux boolean State Default Description unprivuser_use_svirt (off , off) Allow unprivileged user to create and transition to svirt domains.Copy to Clipboard Copied! Toggle word wrap Toggle overflow staff_ruser_rと同様の権限と追加の特権を持ちます。特に、このロールに割り当てられたユーザーは、sudoを実行して、通常はrootユーザー用に予約されている管理コマンドを実行できます。これにより、ロールと実効ユーザー ID (EUID) が変更されますが、SELinux ユーザーは変更されません。関連するブール値:
SELinux boolean State Default Description staff_exec_content (on , on) Allow staff to exec content staff_use_svirt (on , on) allow staff user to create and transition to svirt domains.
SELinux boolean State Default Description staff_exec_content (on , on) Allow staff to exec content staff_use_svirt (on , on) allow staff user to create and transition to svirt domains.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4. SELinux における制限のある管理者ロール リンクのコピーリンクがクリップボードにコピーされました!
SELinux では、制限のある管理者ロールは、特定のタスクを実行するための特定の権限とアクセス権のセットを、そのロールに割り当てられた Linux ユーザーに付与します。個別の制限のある管理者ロールを割り当てることにより、システム管理のさまざまなドメインに対する権限を個々のユーザーに分割できます。これは、複数の管理者がそれぞれ別のドメインを持つシナリオで役立ちます。
このロールは、semanage user コマンドを使用して SELinux ユーザーに割り当てることができます。
SELinux には、次の制限のある管理者ロールがあります。
auditadm_r監査管理者のロールでは、監査サブシステムに関連するプロセスを管理できます。
関連するブール値:
SELinux boolean State Default Description auditadm_exec_content (on , on) Allow auditadm to exec content
SELinux boolean State Default Description auditadm_exec_content (on , on) Allow auditadm to exec contentCopy to Clipboard Copied! Toggle word wrap Toggle overflow dbadm_rデータベース管理者ロールでは、MariaDB および PostgreSQL データベースを管理できます。
関連するブール値:
SELinux boolean State Default Description dbadm_exec_content (on , on) Allow dbadm to exec content dbadm_manage_user_files (off , off) Determine whether dbadm can manage generic user files. dbadm_read_user_files (off , off) Determine whether dbadm can read generic user files.
SELinux boolean State Default Description dbadm_exec_content (on , on) Allow dbadm to exec content dbadm_manage_user_files (off , off) Determine whether dbadm can manage generic user files. dbadm_read_user_files (off , off) Determine whether dbadm can read generic user files.Copy to Clipboard Copied! Toggle word wrap Toggle overflow logadm_rログ管理者ロールでは、ログ、特に Rsyslog ログサービスと監査サブシステムに関連する SELinux タイプを管理できます。
関連するブール値:
SELinux boolean State Default Description logadm_exec_content (on , on) Allow logadm to exec content
SELinux boolean State Default Description logadm_exec_content (on , on) Allow logadm to exec contentCopy to Clipboard Copied! Toggle word wrap Toggle overflow webadm_rWeb 管理者は、Apache HTTP サーバーの管理を許可します。
関連するブール値:
SELinux boolean State Default Description webadm_manage_user_files (off , off) Determine whether webadm can manage generic user files. webadm_read_user_files (off , off) Determine whether webadm can read generic user files.
SELinux boolean State Default Description webadm_manage_user_files (off , off) Determine whether webadm can manage generic user files. webadm_read_user_files (off , off) Determine whether webadm can read generic user files.Copy to Clipboard Copied! Toggle word wrap Toggle overflow secadm_rセキュリティー管理者ロールでは、SELinux データベースを管理できます。
関連するブール値:
SELinux boolean State Default Description secadm_exec_content (on , on) Allow secadm to exec content
SELinux boolean State Default Description secadm_exec_content (on , on) Allow secadm to exec contentCopy to Clipboard Copied! Toggle word wrap Toggle overflow sysadm_rシステム管理者のロールでは、前述のロールのすべてを行うことができ、追加の特権があります。デフォルト以外の設定では、SELinux ポリシーで
sysadm_secadmモジュールを無効にして、セキュリティー管理をシステム管理から切り離すことができます。詳細な手順については、MLS でのシステム管理とセキュリティー管理の分離 を参照してください。sysadm_uユーザーは、SSH を使用して直接ログインできません。sysadm_uの SSH ログインを有効にするには、ssh_sysadm_loginブール値をonに設定します。setsebool -P ssh_sysadm_login on
# setsebool -P ssh_sysadm_login onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 関連するブール値:
SELinux boolean State Default Description ssh_sysadm_login (on , on) Allow ssh logins as sysadm_r:sysadm_t sysadm_exec_content (on , on) Allow sysadm to exec content xdm_sysadm_login (on , on) Allow the graphical login program to login directly as sysadm_r:sysadm_t
SELinux boolean State Default Description ssh_sysadm_login (on , on) Allow ssh logins as sysadm_r:sysadm_t sysadm_exec_content (on , on) Allow sysadm to exec content xdm_sysadm_login (on , on) Allow the graphical login program to login directly as sysadm_r:sysadm_tCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.5. SELinux の unconfined_u ユーザーに自動的にマッピングされる新規ユーザーの追加 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順では、新しい Linux ユーザーをシステムに追加する方法を説明します。ユーザーは自動的に SELinux unconfined_u ユーザーにマッピングされます。
前提条件
-
rootユーザーは、Red Hat Enterprise Linux でデフォルトで実行されるように、制限なしで実行されています。
手順
次のコマンドを入力して、
<example_user>という名前の新しい Linux ユーザーを作成します。useradd <example_user>
# useradd <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Linux の
<example_user>ユーザーにパスワードを割り当てるには、次のコマンドを実行します。passwd <example_user>
# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在のセッションからログアウトします。
-
Linux の
<example_user>ユーザーとしてログインします。ログインすると、PAM モジュールpam_selinuxは Linux ユーザーを SELinux ユーザー (この場合はunconfined_u) に自動的にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。
検証
<example_user>ユーザーとしてログインしたら、Linux ユーザーのコンテキストを確認します。id -Z
$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.6. 新規ユーザーを SELinux で制限されたユーザーとして追加する リンクのコピーリンクがクリップボードにコピーされました!
SELinux で制限されたユーザーをシステムに新たに追加するには、以下の手順に従います。この手順では、ユーザーアカウントを作成するコマンドを使用して、ユーザーを SELinux の staff_u ユーザー権限にマッピングします。
前提条件
-
rootユーザーは、Red Hat Enterprise Linux でデフォルトで実行されるように、制限なしで実行されています。
手順
次のコマンドを入力して、
<example_user>という名前の新しい Linux ユーザーを作成し、それを SELinuxStaff_uユーザーにマッピングします。useradd -Z staff_u <example_user>
# useradd -Z staff_u <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Linux の
<example_user>ユーザーにパスワードを割り当てるには、次のコマンドを実行します。passwd <example_user>
# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在のセッションからログアウトします。
-
Linux の
<example_user>ユーザーとしてログインします。ユーザーのシェルはstaff_uコンテキストで起動します。
検証
<example_user>ユーザーとしてログインしたら、Linux ユーザーのコンテキストを確認します。id -Z
$ id -Z uid=1000(<example_user>) gid=1000(<example_user>) groups=1000(<example_user>) context=staff_u:staff_r:staff_t:s0-s0:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.7. SELinux で一般ユーザーの設定 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ユーザー user_u にマッピングすることで、システムのすべての一般ユーザーを制限できます。
デフォルトでは、管理者権限を持つユーザーを含め、Red Hat Enterprise Linux のすべての Linux ユーザーは、制限のない SELinux ユーザー unconfined_u にマッピングされます。SELinux の制限のあるユーザーにユーザーを割り当てることで、システムのセキュリティーを強化できます。これは、V-71971 Security Technical Implementation Guide に準拠するのに役立ちます。
手順
SELinux ログインレコードのリストを表示します。このリストには、SELinux ユーザーへの Linux ユーザーのマッピングが表示されます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 明示的なマッピングのないすべてのユーザーを表す
__default__ユーザーを、SELinux ユーザーuser_uにマッピングします。semanage login -m -s user_u -r s0 __default__
# semanage login -m -s user_u -r s0 __default__Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
__default__ユーザーが SELinux ユーザーuser_uにマッピングされていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新規ユーザーのプロセスが SELinux コンテキスト
user_u:user_r:user_t:s0で実行されることを確認します。新しいユーザーを作成します。
adduser <example_user>
# adduser <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <example_user>のパスワードを定義します。passwd <example_user>
# passwd <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
rootとしてログアウトし、新規ユーザーとしてログインします。 ユーザーの ID のセキュリティーコンテキストを表示します。
[<example_user>@localhost ~]$ id -Z user_u:user_r:user_t:s0
[<example_user>@localhost ~]$ id -Z user_u:user_r:user_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーの現在のプロセスのセキュリティーコンテキストを表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.8. sysadm_u へのマッピングによる管理者の制限 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ユーザー sysadm_u に直接マッピングすることで、管理者権限を持つユーザーを制限できます。ユーザーがログインすると、セッションは SELinux コンテキスト sysadm_u:sysadm_r:sysadm_t で実行されます。
デフォルトでは、管理者権限を持つユーザーを含め、Red Hat Enterprise Linux のすべての Linux ユーザーは、制限のない SELinux ユーザー unconfined_u にマッピングされます。SELinux の制限のあるユーザーにユーザーを割り当てることで、システムのセキュリティーを強化できます。これは、V-71971 Security Technical Implementation Guide に準拠するのに役立ちます。
前提条件
-
rootユーザーは制限なしで実行します。これは、Red Hat Enterprise Linux のデフォルトです。
手順
必要に応じて、
sysadm_uユーザーが SSH を使用してシステムに接続できるようにするには、次のコマンドを実行します。setsebool -P ssh_sysadm_login on
# setsebool -P ssh_sysadm_login onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいユーザーまたは既存のユーザーを
sysadm_uSELinux ユーザーにマッピングします。新規ユーザーをマッピングするには、新規ユーザーを
wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーsysadm_uにマッピングします。adduser -G wheel -Z sysadm_u <example_user>
# adduser -G wheel -Z sysadm_u <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 既存のユーザーをマッピングするには、ユーザーを
wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーsysadm_uにマッピングします。usermod -G wheel -Z sysadm_u <example_user>
# usermod -G wheel -Z sysadm_u <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ユーザーのホームディレクトリーのコンテキストを復元します。
restorecon -R -F -v /home/<example_user>
# restorecon -R -F -v /home/<example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
<example_user>が、SELinux ユーザーsysadm_uにマッピングされていることを確認します。semanage login -l | grep <example_user>
# semanage login -l | grep <example_user> <example_user> sysadm_u s0-s0:c0.c1023 *Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSH などを使用して
<example_user>としてログインし、ユーザーのセキュリティーコンテキストを表示します。[<example_user>@localhost ~]$ id -Z sysadm_u:sysadm_r:sysadm_t:s0-s0:c0.c1023
[<example_user>@localhost ~]$ id -Z sysadm_u:sysadm_r:sysadm_t:s0-s0:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow rootユーザーに切り替えます。sudo -i
$ sudo -i [sudo] password for <example_user>:Copy to Clipboard Copied! Toggle word wrap Toggle overflow セキュリティーコンテキストが変更されていないことを確認します。
id -Z
# id -Z sysadm_u:sysadm_r:sysadm_t:s0-s0:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow sshdサービスを再起動するなど、管理タスクを実行します。systemctl restart sshd
# systemctl restart sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力がない場合は、コマンドが正常に完了します。
コマンドが正常に完了しない場合は、以下のメッセージが表示されます。
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.9. sudo および sysadm_r ロールを使用した管理者の制限 リンクのコピーリンクがクリップボードにコピーされました!
管理者権限を持つ特定のユーザーを SELinux ユーザー staff_u にマッピングし、ユーザーが SELinux 管理者ロール sysadm_r を取得できるように sudo を設定できます。このロールにより、SELinux 拒否なしで管理タスクを実行できます。ユーザーがログインすると、セッションは SELinux コンテキスト staff_u:staff_r:staff_t で実行されますが、ユーザーが sudo を使用してコマンドを入力すると、セッションは staff_u:sysadm_r:sysadm_t コンテキストに変更されます。
デフォルトでは、管理者権限を持つユーザーを含め、Red Hat Enterprise Linux のすべての Linux ユーザーは、制限のない SELinux ユーザー unconfined_u にマッピングされます。SELinux の制限のあるユーザーにユーザーを割り当てることで、システムのセキュリティーを強化できます。これは、V-71971 Security Technical Implementation Guide に準拠するのに役立ちます。
前提条件
-
rootユーザーは制限なしで実行します。これは、Red Hat Enterprise Linux のデフォルトです。
手順
新規または既存のユーザーを
staff_uSELinux ユーザーにマッピングします。新規ユーザーをマッピングするには、新規ユーザーを
wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーstaff_uにマッピングします。adduser -G wheel -Z staff_u <example_user>
# adduser -G wheel -Z staff_u <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 既存のユーザーをマッピングするには、ユーザーを
Wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーstaff_uにマッピングします。usermod -G wheel -Z staff_u <example_user>
# usermod -G wheel -Z staff_u <example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ユーザーのホームディレクトリーのコンテキストを復元します。
restorecon -R -F -v /home/<example_user>
# restorecon -R -F -v /home/<example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <example_user>が SELinux 管理者ロールを取得できるようにするには、/etc/sudoers.d/ディレクトリーに新規ファイルを作成します。以下に例を示します。visudo -f /etc/sudoers.d/<example_user>
# visudo -f /etc/sudoers.d/<example_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の行を新規ファイルに追加します。
<example_user> ALL=(ALL) TYPE=sysadm_t ROLE=sysadm_r ALL
<example_user> ALL=(ALL) TYPE=sysadm_t ROLE=sysadm_r ALLCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
<example_user>が SELinux ユーザーstaff_uにマッピングされていることを確認します。semanage login -l | grep <example_user>
# semanage login -l | grep <example_user> <example_user> staff_u s0-s0:c0.c1023 *Copy to Clipboard Copied! Toggle word wrap Toggle overflow SSH などを使用して
<example_user>としてログインし、rootユーザーに切り替えます。[<example_user>@localhost ~]$ sudo -i [sudo] password for <example_user>:
[<example_user>@localhost ~]$ sudo -i [sudo] password for <example_user>:Copy to Clipboard Copied! Toggle word wrap Toggle overflow rootセキュリティーコンテキストを表示します。id -Z
# id -Z staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow sshdサービスを再起動するなど、管理タスクを実行します。systemctl restart sshd
# systemctl restart sshdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力がない場合は、コマンドが正常に完了します。
コマンドが正常に完了しない場合は、以下のメッセージが表示されます。
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第4章 非標準設定でのアプリケーションとサービスの SELinux 設定 リンクのコピーリンクがクリップボードにコピーされました!
SELinux が Enforcing モードの場合、デフォルトのポリシーはターゲットポリシーになります。以下のセクションでは、ポート、データベースの場所、プロセスのファイルシステムパーミッションなどの設定のデフォルトを変更した後に、さまざまなサービスに対して SELinux ポリシーを設定および設定する方法を説明します。
非標準ポート用に SELinux タイプを変更し、デフォルトディレクトリーの変更に関する間違ったラベルを特定して修正し、SELinux ブール値を使用してポリシーを調整する方法を説明します。
4.1. 非標準設定での Apache HTTP サーバーの SELinux ポリシーのカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP サーバーを設定して、別のポートでリッスンし、デフォルト以外のディレクトリーにコンテンツを提供できます。SELinux の拒否を防止するには、以下の手順に従い、システムの SELinux ポリシーを調整します。
前提条件
-
httpdパッケージがインストールされ、Apache HTTP サーバーが TCP ポート 3131 をリッスンし、デフォルトの/var/www/ディレクトリーの代わりに/var/test_www/ディレクトリーを使用するように設定されています。 -
policycoreutils-python-utilsパッケージおよびsetroubleshoot-serverパッケージがシステムにインストールされている。
手順
httpdサービスを起動して、ステータスを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux ポリシーは、
httpdがポート 80 で実行していることを前提としています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポート 3131 の SELinux タイプを、ポート 80 に一致させるように変更します。
semanage port -a -t http_port_t -p tcp 3131
# semanage port -a -t http_port_t -p tcp 3131Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdを再開します。systemctl start httpd
# systemctl start httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow ただし、コンテンツにはアクセスできません。
wget localhost:3131/index.html
# wget localhost:3131/index.html … HTTP request sent, awaiting response... 403 Forbidden …Copy to Clipboard Copied! Toggle word wrap Toggle overflow sealertツールの理由を確認します。sealert -l "*"
# sealert -l "*" ... SELinux is preventing httpd from getattr access on the file /var/test_www/html/index.html. …Copy to Clipboard Copied! Toggle word wrap Toggle overflow matchpathconツールを使用して、標準パスと新規パスの SELinux タイプを比較します。matchpathcon /var/www/html /var/test_www/html
# matchpathcon /var/www/html /var/test_www/html /var/www/html system_u:object_r:httpd_sys_content_t:s0 /var/test_www/html system_u:object_r:var_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しい
/var/test_www/html/コンテンツディレクトリーの SELinux タイプを、デフォルトの/var/ディレクトリーのタイプに変更します。semanage fcontext -a -e /var/www /var/test_www
# semanage fcontext -a -e /var/www /var/test_wwwCopy to Clipboard Copied! Toggle word wrap Toggle overflow 再帰的に、
/varディレクトリーのラベルを再設定します。restorecon -Rv /var/
# restorecon -Rv /var/ ... Relabeled /var/test_www/html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0 Relabeled /var/test_www/html/index.html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
httpdサービスが実行していることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Apache HTTP サーバーが提供するコンテンツがアクセスできることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. SELinux ブール値で NFS ボリュームおよび CIFS ボリュームの共有に関するポリシーの調整 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーの記述に関する知識がなくても、ブール値を使用して、ランタイム時に SELinux ポリシーの一部を変更できます。これにより、SELinux ポリシーの再読み込みや再コンパイルを行わずに、サービスが NFS ボリュームにアクセスするのを許可するなどの変更が可能になります。以下の手順では、SELinux ブール値のリストを表示して、ポリシーで必要な変更を実現するように設定します。
クライアント側の NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトのコンテキストでラベル付けされます。RHEL では、このデフォルトのコンテキストは nfs_t タイプを使用します。また、クライアント側にマウントされた Samba 共有には、ポリシーで定義されたデフォルトのコンテキストがラベル付けされます。このデフォルトのコンテキストは cifs_t タイプを使用します。ブール値を有効または無効にすると、nfs_t タイプおよび cifs_t タイプにアクセスできるサービスを制御できます。
Apache HTTP サーバーサービス (httpd) による NFS ボリュームおよび CIFS ボリュームへのアクセスおよび共有を許可するには、以下の手順を実行します。
前提条件
-
必要に応じて、
selinux-policy-develパッケージをインストールして、semanage boolean -lコマンドの出力で SELinux ブール値の詳細を、より明確で詳細な形で取得します。
手順
NFS、CIFS、および Apache に関する SELinux ブール値を特定します。
semanage boolean -l | grep 'nfs\|cifs' | grep httpd
# semanage boolean -l | grep 'nfs\|cifs' | grep httpd httpd_use_cifs (off , off) Allow httpd to access cifs file systems httpd_use_nfs (off , off) Allow httpd to access nfs file systemsCopy to Clipboard Copied! Toggle word wrap Toggle overflow ブール値の現在の状態をリスト表示します。
getsebool -a | grep 'nfs\|cifs' | grep httpd
$ getsebool -a | grep 'nfs\|cifs' | grep httpd httpd_use_cifs --> off httpd_use_nfs --> offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定されたブール値を有効にします。
setsebool httpd_use_nfs on setsebool httpd_use_cifs on
# setsebool httpd_use_nfs on # setsebool httpd_use_cifs onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記setseboolで-Pオプションを使用使用すると、システムを再起動しても変更が持続します。setsebool -Pコマンドは、ポリシー全体を再構築する必要がありますが、設定によっては少し時間がかかる場合があります。
検証
ブール値が
onになっていることを確認します。getsebool -a | grep 'nfs\|cifs' | grep httpd
$ getsebool -a | grep 'nfs\|cifs' | grep httpd httpd_use_cifs --> on httpd_use_nfs --> onCopy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. 非標準ディレクトリーへのアクセスを管理するための適切な SELinux タイプを見つける リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの SELinux ポリシーに含まれないアクセス制御ルールを設定する必要がある場合は、まずユースケースに合ったブール値を検索します。適切なブール値が見つからない場合は、適切な SELinux タイプを使用するか、ローカルポリシーモジュールを作成します。
前提条件
-
selinux-policy-docおよびsetools-consoleパッケージがシステムにインストールされている。
手順
SELinux 関連のすべてのトピックをリスト表示し、設定するコンポーネントに結果を絞り込みます。以下に例を示します。
man -k selinux | grep samba
# man -k selinux | grep samba samba_net_selinux (8) - Security Enhanced Linux Policy for the samba_net processes samba_selinux (8) - Security Enhanced Linux Policy for the smbd processes …Copy to Clipboard Copied! Toggle word wrap Toggle overflow お客様の状況に関連する man ページで、関連する SELinux ブール値、ポートタイプ、およびファイルタイプを見つけます。
man -k selinuxまたはapropos selinuxコマンドを使用するには、先にselinux-policy-docパッケージをインストールする必要があることに注意してください。オプション:
semanage fcontext -lコマンドを使用すると、デフォルトの場所にあるプロセスのデフォルトのマッピングを表示できます。次に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow sesearchコマンドを使用して、デフォルトの SELinux ポリシーのルールを表示します。対応するルールをリスト表示することで、使用するタイプとブール値を見つけることができます。次に例を示します。sesearch -A | grep samba | grep httpd
$ sesearch -A | grep samba | grep httpd … allow httpd_t cifs_t:dir { getattr open search }; [ use_samba_home_dirs && httpd_enable_homedirs ]:True …Copy to Clipboard Copied! Toggle word wrap Toggle overflow 場合によっては、SELinux ブール値が、設定の問題に対する最も簡単な解決策であることがあります。
getsebool -aコマンドを使用すると、使用可能なすべてのブール値とその値を表示できます。次に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow sesearchコマンドを使用すると、選択したブール値が意図するとおりに機能するかどうかを確認できます。次に例を示します。sesearch -A | grep httpd_enable_homedirs
$ sesearch -A | grep httpd_enable_homedirs … allow httpd_suexec_t autofs_t:dir { getattr open search }; [ use_nfs_home_dirs && httpd_enable_homedirs ]:True allow httpd_suexec_t autofs_t:dir { getattr open search }; [ use_samba_home_dirs && httpd_enable_homedirs ]:True …Copy to Clipboard Copied! Toggle word wrap Toggle overflow お客様の状況に合ったブール値がない場合は、状況に合った SELinux タイプを見つけます。
sesearchを使用してデフォルトのポリシーから対応するルールを照会することで、ファイルのタイプを見つけることができます。次に例を示します。sesearch -A -s httpd_t -c file -p read
$ sesearch -A -s httpd_t -c file -p read … allow httpd_t httpd_t:file { append getattr ioctl lock open read write }; allow httpd_t httpd_tmp_t:file { append create getattr ioctl link lock map open read rename setattr unlink write }; …Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 以上の解決策がどれもお客様の状況に当てはまらない場合は、SELinux ポリシーにカスタムルールを追加できます。詳細は、ローカル SELinux ポリシーモジュールの作成 セクションを参照してください。
第6章 MLS (Multi-Level Security) の使用 リンクのコピーリンクがクリップボードにコピーされました!
Multi-Level Security (MLS) ポリシーは、米国のコミュニティーが最初に設計したクリアランスの レベル を使用します。MLS は、軍隊など、厳格に管理された環境での情報管理をベースにした、非常に限定的なセキュリティー要件を満たしています。
MLS の使用は複雑で、一般的なユースケースのシナリオには適切にマッピングされません。
6.1. Multi-Level Security (MLS) リンクのコピーリンクがクリップボードにコピーされました!
Multi-Level Security (MLS) テクノロジーは、以下の情報セキュリティーレベルを使用して、データを階層に分類します。
- [lowest] Unclassified
- [low] Confidential
- [high] Secret
- [highest] Top secret
デフォルトでは、MLS SELinux ポリシーは機密レベルを 16 個使用します。
-
s0は、最も機密レベルが低く、 -
s15は、最も機密レベルが高くなります。
MLS は特定の用語を使用して機密レベルに対応します。
- ユーザーおよびプロセスは サブジェクト と呼ばれ、その機密レベルは クリアランス と呼ばれます。
- システムのファイル、デバイス、およびその他のパッシブコンポーネントは オブジェクト と呼ばれ、その機密レベルは 区分 と呼ばれます。
SELinux は Bell-La Padula Model (BLP) モデルを使用して、MLS を実装します。このモデルは、各サブジェクトおよびオブジェクトに割り当てられたラベルに基づいてシステム内で情報をフローする方法を指定します。
BLP の基本的な原則は “No read up, no write down.” で、自分の機密レベルと同じかそれ以下のファイルは読み取りだけでき、データは、低いレベルから高いレベルにしか流せず、反対方向には流せません。
MLS SELinux ポリシー (RHEL 上の MLS の実装) では、書き込み等価を使用した Bell-La Padula と呼ばれる修正済みの原則を適用します。つまり、ユーザーは自分の機密レベル以下のファイルを読み取ることができますが、書き込みは自分のレベルだけにしか不可能です。これにより、クリアランスが低いユーザーがコンテンツを Top secret ファイルに書き込めないようにします。
たとえば、デフォルトではクリアランスレベル s2 を持つユーザーには以下が適用されます。
-
機密レベルが
s0、s1、およびs2のファイルを読み取ることができます。 -
機密レベルが
s3以上のファイルを読み取ることはできません。 -
機密レベルが
s2のファイルを変更できます。 -
機密レベルが
s2以外のファイルは変更できません。
セキュリティー管理者は、システムの SELinux ポリシーを変更することで、この動作を調整できます。たとえば、ユーザーがより低いレベルでファイルを変更できるようにすることで、ファイルの機密レベルをユーザーのクリアランスレベルまで引き上げることができます。
実際には、ユーザーは通常、s1-s2 などの範囲のクリアランスレベルに割り当てられます。ユーザーは、自分の最大レベルよりも低い機密レベルのファイルの読み取りと、その範囲内の任意のファイルへの書き込みが可能です。
たとえば、デフォルトではクリアランス範囲が s1-s2 のユーザーには以下が適用されます。
-
機密レベル
s0とs1のファイルを読み取ることができます。 -
機密レベル
s2以上のファイルを読み取ることはできません。 -
機密レベル
s1のファイルを変更できます。 -
機密レベルが
s1以外のファイルは変更できません。 -
自分のクリアランスレベルを
s2に変更できます。
MLS 環境における非特権ユーザーのセキュリティーコンテキストは次のとおりです。
user_u:user_r:user_t:s1
user_u:user_r:user_t:s1
詳細は、以下のようになります。
user_u- SELinux ユーザーです。
user_r- SELinux ロールです。
user_t- SELinux タイプです。
s1- MLS 機密レベルの範囲です。
システムは、MLS アクセス制御ルールと従来のファイルアクセスパーミッションを常に組み合わせます。たとえば、セキュリティーレベルが "Secret" のユーザーが、DAC (Discretionary Access Control) を使用して他のユーザーによるファイルへのアクセスをブロックした場合に、“Top Secret” のユーザーはそのファイルにアクセスできなくなります。セキュリティーのクリアランスが高くても、ユーザーはファイルシステム全体を自動的に閲覧できません。
トップレベルの許可があるユーザーは、マルチレベルのシステムで自動的に管理者権限を取得しません。システムに関するすべての機密情報にアクセスできる場合もありますが、これは管理者権限を持つこととは異なります。
さらに、管理者権限があっても機密情報にアクセスできるわけではありません。たとえば、root としてログインした場合でも、Top secret 情報を読み込めません。
カテゴリーを使用して MLS システム内でアクセスをさらに調整できます。Multi-Category Security (MCS) を使用すると、プロジェクトや部門などのカテゴリーを定義でき、ユーザーは割り当てられたカテゴリーのファイルにしかアクセスできません。詳細は、Using Multi-Category Security (MCS) for data confidentiality を参照してください。
6.2. MLS の SELinux ロール リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーは、各 Linux ユーザーを SELinux ユーザーにマッピングします。これにより、Linux ユーザーは SELinux ユーザーの制限を継承できます。
MLS ポリシーには、制限なしのユーザー、タイプおよびロールなど、Unconfined モジュールは含まれません。そのため、root など制限のないユーザーは、すべてのオブジェクトにアクセスして、ターゲットポリシーで実行可能なアクションをすべて実行できるわけではありません。
ポリシーのブール値を調整することで、SELinux ポリシーの制限ユーザーの権限を、特定のニーズに合わせてカスタマイズできます。semanage boolean -l コマンドを使用すると、このブール値の現在の状態を確認できます。すべての SELinux ユーザー、SELinux ロール、および MLS/MCS レベルおよび範囲を一覧表示するには、root で semanage user -l コマンドを使用します。
| User | デフォルトロール | 追加のロール |
|---|---|---|
|
|
| |
|
|
| |
|
|
| |
|
|
|
|
|
| ||
|
| ||
|
| ||
|
|
| |
|
|
|
|
|
| ||
|
| ||
|
| ||
|
|
|
system_u は、システムプロセスおよびオブジェクトの特別なユーザー ID であり、system_r は関連付けられたロールであることに注意してください。管理者は、この system_u ユーザーと system_r ロールを Linux ユーザーに関連付けることはできません。また、unconfined_u および root は制限のないユーザーです。このため、この SELinux ユーザーに関連付けられたロールは、以下の表の SELinux ロールの種類とアクセスには含まれていません。
各 SELinux ロールは SELinux のタイプに対応しており、特定のアクセス権限を提供します。
| ロール | 型 | X Window System を使用したログイン | su および sudo | ホームディレクトリーおよび /tmp (デフォルト) での実行 | ネットワーク |
|---|---|---|---|---|---|
|
|
| いいえ | いいえ | はい | いいえ |
|
|
| はい | いいえ | はい | Web ブラウザーのみ (Firefox、GNOME Web) |
|
|
| はい | いいえ | はい | はい |
|
|
| はい |
| はい | はい |
|
|
| はい | はい | はい | |
|
|
| はい | はい | はい | |
|
|
|
| はい | はい | はい |
-
デフォルトでは、
sysadm_rロールにはsecadm_rロールの権限があります。つまり、sysadm_rロールを持つユーザーは、セキュリティーポリシーを管理できることを意味します。ユースケースが一致しない場合は、ポリシーのsysadm_secadmを無効にすることで、2 つのロールを分離できます。詳細は、MLS でのシステム管理とセキュリティー管理の分離 を参照してください。 -
ログイン以外のロールの
dbadm_r、logadm_r、およびwebadm_rは、管理タスクのサブセットに使用できます。デフォルトでは、これらのロールは SELinux ユーザーに関連付けられていません。
6.3. SELinux ポリシーの MLS への切り替え リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーをターゲットの MLS (Multi-Level Security) から Multi-Level Security (MLS) に切り替えるには、以下の手順に従います。
X Window System を実行しているシステムでは、MLS ポリシーを使用しないでください。さらに、MLS ラベルでファイルシステムのラベルを変更すると、制限のあるドメインにアクセスできなくなる可能性があるため、システムが正常に起動しなくなる可能性があります。したがって、ファイルに再ラベルする前に、SELinux を Permissive モードに切り替えます。多くのシステムでは、MLS に移動後に SELinux の拒否が多く表示され、そのほとんどは修正するだけでは限りません。
手順
selinux-policy-mlsパッケージをインストールします。yum install selinux-policy-mls
# yum install selinux-policy-mlsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。vi /etc/selinux/config
# vi /etc/selinux/configCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux モードを Enforcing から Permissive に変更し、ターゲットポリシーから MLS に切り替えます。
SELINUX=permissive SELINUXTYPE=mls
SELINUX=permissive SELINUXTYPE=mlsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 変更を保存し、エディターを終了します。
MLS ポリシーを有効にする前に、MLS ラベルでファイルシステム上の各ファイルに再度ラベル付けする必要があります。
fixfiles -F onboot
# fixfiles -F onboot System will relabel on next bootCopy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux 拒否を確認します。
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -i
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -iCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上記のコマンドはすべてのシナリオに対応していないため、SELinux 拒否の識別、分析、修正のガイダンスは SELinux 関連の問題のトラブルシューティング を参照してください。
システムに SELinux に関連する問題がないことを確認したら、
/etc/selinux/configで該当するオプションを変更して、SELinux を Enforcing モードに切り替えます。SELINUX=enforcing
SELINUX=enforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow システムを再起動します。
reboot
# rebootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
システムが起動しなかったり、MLS に切り替えた後にログインできない場合は、enforcing=0 パラメーターをカーネルコマンドラインに追加します。詳細は、システムの起動時に SELinux モードの変更 を参照してください。
また、MLS では、sysadm_r SELinux ロールにマッピングされた root ユーザーとしての SSH ログインは staff_r で root としてログインするのとは異なります。MLS で初めてシステムを起動する前に、SELinux ブール値 ssh_sysadm_login を 1 に設定して、SSH ログインを sysadm_r として許可することを検討してください。後ですでに MLS に存在する ssh_sysadm_login を有効にするには、すでに MLS にいる場合、root として staff_r ログインし、newrole -r sysadm_r コマンドを使用して sysadm_r で root に切り替えてから、ブール値を 1 に設定します。
検証
SELinux が Enforcing モードで実行されていることを確認します。
getenforce
# getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux のステータスが
mlsの値を返すことを確認します。sestatus | grep mls
# sestatus | grep mls Loaded policy name: mlsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.4. MLS でのユーザークリアランスの確立 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーを MLS に切り替えた後に、制限のある SELinux ユーザーにマッピングすることで、セキュリティークリアランスレベルをユーザーに割り当てる必要があります。デフォルトでは、セキュリティークリアランスが指定されているユーザーには以下が適用されます。
- 機密レベルが高いオブジェクトを読み取ることはできません。
- 機密レベルが異なるオブジェクトに書き込むことはできません。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
Enforcingに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 SELinux の制限のあるユーザーに割り当てられているユーザー:
-
非特権ユーザーの場合、
user_u(以下の手順では example_user) に割り当てられます。 -
特権ユーザーの場合、
staff_u(以下の手順では staff) に割り当てられます。
-
非特権ユーザーの場合、
MLS ポリシーがアクティブな時に、ユーザーが作成されていることを確認します。他の SELinux ポリシーで作成されたユーザーは MLS で使用できません。
手順
必要に応じて、SELinux ポリシーにエラーを追加しないようにするには、
PermissiveSELinux モードに切り替えてください。切り替えることでトラブルシューティングが容易になります。setenforce 0
# setenforce 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow permissive モードでは、SELinux はアクティブなポリシーを適用せず、Access Vector Cache (AVC) メッセージをログに記録するだけです。このログは、トラブルシューティングやデバッグに使用できます。
SELinux ユーザー
staff_uのクリアランスの範囲を定義します。たとえば、このコマンドは、クリアランスの範囲をs1からs15に、デフォルトのクリアランスレベルをs1に設定します。semanage user -m -L s1 -r s1-s15 staff_u
# semanage user -m -L s1 -r s1-s15 staff_uCopy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーのホームディレクトリー用の SELinux ファイルコンテキスト設定エントリーを生成します。
genhomedircon
# genhomedirconCopy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルセキュリティーコンテキストをデフォルトに復元します。
restorecon -R -F -v /home/
# restorecon -R -F -v /home/ Relabeled /home/staff from staff_u:object_r:user_home_dir_t:s0 to staff_u:object_r:user_home_dir_t:s1 Relabeled /home/staff/.bash_logout from staff_u:object_r:user_home_t:s0 to staff_u:object_r:user_home_t:s1 Relabeled /home/staff/.bash_profile from staff_u:object_r:user_home_t:s0 to staff_u:object_r:user_home_t:s1 Relabeled /home/staff/.bashrc from staff_u:object_r:user_home_t:s0 to staff_u:object_r:user_home_t:s1Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーにクリアランスレベルを割り当てます。
semanage login -m -r s1 example_user
# semanage login -m -r s1 example_userCopy to Clipboard Copied! Toggle word wrap Toggle overflow ここで、
s1は、ユーザーに割り当てられたクリアランスレベルに置き換えます。ユーザーのホームディレクトリーのラベルをユーザーのクリアランスレベルに付け直します。
chcon -R -l s1 /home/example_user
# chcon -R -l s1 /home/example_userCopy to Clipboard Copied! Toggle word wrap Toggle overflow 必要に応じて、SELinux モードを
Permissiveに切り替えた場合は、すべてが想定通りに動作することを確認したら、SELinux モードをEnforcingモードに戻します。setenforce 1
# setenforce 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
ユーザーが正しい SELinux ユーザーにマッピングされ、クリアランスレベルが正しく割り当てられていることを確認します。
semanage login -l
# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * example_user user_u s1 * …Copy to Clipboard Copied! Toggle word wrap Toggle overflow - MLS 内のユーザーとしてログインします。
ユーザーのセキュリティーレベルが正しく機能していることを確認します。
警告検証に使用するファイルには、設定が間違っており、ユーザーが実際に認証なしにファイルにアクセスできてしまう場合に備え、機密情報を含めないようにしてください。
- ユーザーが機密レベルの高いファイルを読み取れないことを確認します。
- ユーザーが同じ機密レベルのファイルに書き込めることを確認します。
- ユーザーが機密レベルの低いファイルを読み取れることを確認します。
6.5. MLS で定義されたセキュリティー範囲内におけるユーザーのクリアランスレベルの変更 リンクのコピーリンクがクリップボードにコピーされました!
Multi-Level Security (MLS) のユーザーとして、管理者が割り当てた範囲内で現在のクリアランスレベルを変更できます。範囲の上限を超えたり、範囲の下限を超えてレベルを下げることはできません。これにより、たとえば、機密レベルを最高のクリアランスレベルまで上げることなく、機密性の低いファイルを変更できます。
たとえば、s1-s3 の範囲に割り当てられたユーザーには以下が適用されます。
-
レベル
s1、s2、およびs3に移行できます。 -
s1-s2およびs2-s3の範囲に切り換えることができます。 -
s0-s3またはs1-s4の範囲に切り替えることはできません。
別のレベルに切り替えると、異なるクリアランスで新しいシェルが開きます。つまり、下げる場合と同じ方法で元のクリアランスレベルに戻すことはできません。ただし、exit を入力すると、いつでも前のシェルに戻ることができます。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
enforcingに設定されている。 - MLS クリアランスレベルの範囲に割り当てられたユーザーとしてログインできます。
手順
セキュアな端末からユーザーとしてログインします。
セキュアな端末は、、
/etc/selinux/mls/contexts/securetty_typesファイルで定義されています。デフォルトでは、コンソールはセキュアな端末ですが、SSH はセキュアではありません。現在のユーザーのセキュリティーコンテキストを確認します。
id -Z
$ id -Z user_u:user_r:user_t:s0-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、ユーザーは
user_uSELinux ユーザー、user_rロール、user_tタイプ、s0-s2の MLS セキュリティーファイルに割り当てられます。現在のユーザーのセキュリティーコンテキストを確認します。
id -Z
$ id -Z user_u:user_r:user_t:s1-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーのクリアランス範囲内で別のセキュリティークリアランス範囲に切り替えます。
newrole -l s1
$ newrole -l s1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最大が割り当てられた範囲以下の範囲に切り替えることができます。単一レベルの範囲を入力すると、割り当てられた範囲の下限が変更されます。たとえば、範囲が
s0-s2のユーザーとしてnewrole -l s1を入力することは、newrole -l s1-s2を入力することに相当します。
検証
現在のユーザーのセキュリティーコンテキストを確認します。
id -Z
$ id -Z user_u:user_r:user_t:s1-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 現在のシェルを終了し、元の範囲で前のシェルに戻ります。
exit
$ exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.6. MLS におけるファイル機密レベルの引き上げ リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MLS (Multi-Level Security) ユーザーはファイル機密レベルを高くすることはできません。ただし、セキュリティー管理者 (secadm_r) は、システムの SELinux ポリシーにローカルモジュール mlsfilewrite を追加することで、デフォルトの動作を変更し、ユーザーによるファイルの機密レベルの引き上げを許可できます。次に、ポリシーモジュールで定義された SELinux タイプに割り当てられたユーザーは、ファイルを変更することで、ファイルの分類レベルを引き上げることができます。ユーザーがファイルを変更すると、ユーザーの現在のセキュリティー範囲の下限値までファイルの機密性レベルが引き上げられます。
セキュリティー管理者は、secadm_r ロールに割り当てられたユーザーとしてログインすると、chcon -l s0 /path/to/file コマンドを使用してファイルのセキュリティーレベルを変更できます。詳細は、MLS でのファイル機密レベルの変更 を参照してください。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
enforcingに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 -
mlsfilewriteローカルモジュールが SELinux MLS ポリシーにインストールされている。 MLS のユーザーとしてログインしている。つまり:
-
定義済みのセキュリティー範囲に割り当てられている。以下の例は、セキュリティー範囲が
s0-s2のユーザーを示しています。 -
mlsfilewriteモジュールで定義されているのと同じ SELinux タイプに割り当てられている。この例では、(typeattributeset mlsfilewrite (user_t))モジュールが必要です。
-
定義済みのセキュリティー範囲に割り当てられている。以下の例は、セキュリティー範囲が
手順
オプション: 現在のユーザーのセキュリティーコンテキストを表示します。
id -Z
$ id -Z user_u:user_r:user_t:s0-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow ユーザーの MLS クリアランス範囲の下位レベルを、ファイルに割り当てるレベルに変更します。
newrole -l s1-s2
$ newrole -l s1-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 現在のユーザーのセキュリティーコンテキストを表示します。
id -Z
$ id -Z user_u:user_r:user_t:s1-s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: ファイルのセキュリティーコンテキストを表示します。
ls -Z /path/to/file
$ ls -Z /path/to/file user_u:object_r:user_home_t:s0 /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルを変更して、ファイルの機密レベルをユーザーのクリアランス範囲の下位レベルに変更します。
touch /path/to/file
$ touch /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要システムで
restoreconコマンドを使用すると、分類レベルはデフォルト値に戻ります。オプション: シェルを終了して、ユーザーの以前のセキュリティー範囲に戻ります。
exit
$ exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
ファイルのセキュリティーコンテキストを表示します。
ls -Z /path/to/file
$ ls -Z /path/to/file user_u:object_r:user_home_t:s1 /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.7. MLS でのファイル機密レベルの変更 リンクのコピーリンクがクリップボードにコピーされました!
MLS SELinux ポリシーでは、ユーザーは自分の機密レベルのファイルしか変更できません。これは、クリアランスレベルが低いユーザーに極秘情報が公開されないようにすること、またクリアランスレベルの低いユーザーが機密レベルの高いドキュメントを作成できないようにすることが目的です。ただし、管理者は、ファイルをより高いレベルで処理するなど、ファイル区分を手動で増やすことができます。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 - SELinux モードが Enforcing に設定されている。
セキュリティー管理者権限が割り当てられている。以下のいずれかに割り当てます。
-
secadm_rロール。 -
sysadm_secadmモジュールが有効になっている場合は、sysadm_rロール。sysadm_secadmモジュールはデフォルトで有効になっています。
-
-
policycoreutils-python-utilsパッケージがインストールされている。 クリアランスレベルが割り当てられているユーザー。詳細は、Establishing user clearance levels in MLS を参照してください。
この例では、
User1のクリアランスレベルはs1です。区分レベルが割り当てられ、アクセスできるファイル。
この例では、
/path/to/fileの区分レベルはs1です。
手順
ファイルの区分レベルを確認します。
ls -lZ /path/to/file
# ls -lZ /path/to/file -rw-r-----. 1 User1 User1 user_u:object_r:user_home_t:s1 0 12. Feb 10:43 /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルのデフォルトの区分レベルを変更します。
semanage fcontext -a -r s2 /path/to/file
# semanage fcontext -a -r s2 /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルの SELinux コンテキストのラベルを強制的につけ直します。
restorecon -F -v /path/to/file
# restorecon -F -v /path/to/file Relabeled /path/to/file from user_u:object_r:user_home_t:s1 to user_u:object_r:user_home_t:s2Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
ファイルの区分レベルを確認します。
ls -lZ /path/to/file
# ls -lZ /path/to/file -rw-r-----. 1 User1 User1 user_u:object_r:user_home_t:s2 0 12. Feb 10:53 /path/to/fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: クリアランスが低いユーザーがファイルを読み込めないことを確認します。
cat /path/to/file cat: file: Permission denied
$ cat /path/to/file cat: file: Permission deniedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8. MLS でのシステム管理とセキュリティー管理の分離 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、sysadm_r ロールには secadm_r ロールの権限があります。つまり、sysadm_r ロールを持つユーザーは、セキュリティーポリシーを管理できることを意味します。セキュリティー認証の制御を強化する必要がある場合は、Linux ユーザーを secadm_r ロールに割り当て、SELinux ポリシーの sysadm_secadm モジュールを無効にすることで、システム管理をセキュリティー管理から分離することができます。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
Enforcingに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 secadm_rロールに割り当てられる Linux ユーザー。-
ユーザーは、
staff_uSELinux ユーザーに割り当てられます。 - このユーザーのパスワードが定義されています。
警告secadmロールに割り当てられるユーザーでログインできることを確認してください。そうでない場合は、システムの SELinux ポリシーの将来の変更を防ぐことができます。-
ユーザーは、
手順
ユーザー向けに、新しい
sudoersファイルを/etc/sudoers.dディレクトリーに作成します。visudo -f /etc/sudoers.d/<sec_adm_user>
# visudo -f /etc/sudoers.d/<sec_adm_user>Copy to Clipboard Copied! Toggle word wrap Toggle overflow sudoersファイルを整理しておくには、<sec_adm_user>をsecadmロールに割り当てられる Linux ユーザーに置き換えます。/etc/sudoers.d/<sec_adm_user>ファイルに、以下の内容を追加します。<sec_adm_user> ALL=(ALL) TYPE=secadm_t ROLE=secadm_r ALL
<sec_adm_user> ALL=(ALL) TYPE=secadm_t ROLE=secadm_r ALLCopy to Clipboard Copied! Toggle word wrap Toggle overflow この行は、すべてのホスト上の
<secadmuser>が、すべてのコマンドを実行することを許可し、デフォルトでユーザーをsecadmSELinux タイプとロールにマップします。<sec_adm_user> ユーザーでログインします。
SELinux コンテキスト (SELinux のユーザー、ロール、タイプで構成) が変更されていることを確認するために、
ssh、コンソール、またはxdmを使用してログイン します。suおよびsudoなどの他の方法では、SELinux コンテキスト全体を変更することはできません。ユーザーのセキュリティーコンテキストを確認します。
id
$ id uid=1000(<sec_adm_user>) gid=1000(<sec_adm_user>) groups=1000(<sec_adm_user>) context=staff_u:staff_r:staff_t:s0-s15:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow root ユーザーの対話型シェルを実行します。
sudo -i
$ sudo -i [sudo] password for <sec_adm_user>:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 現在のユーザーのセキュリティーコンテキストを確認します。
id
# id uid=0(root) gid=0(root) groups=0(root) context=staff_u:secadm_r:secadm_t:s0-s15:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーから
sysadm_secadmモジュールを無効にします。semodule -d sysadm_secadm
# semodule -d sysadm_secadmCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重要semodule -rコマンドを使用してシステムポリシーモジュールを削除する代わりに、semodule -dコマンドを使用します。semodule -rコマンドは、システムのストレージからモジュールを削除します。これは、selinux-policy-mlsパッケージを再インストールしないと、モジュールを再び読み込むことができないことを意味します。
検証
secadmロールに割り当てられたユーザーとして、root ユーザーの対話型シェルで、セキュリティーポリシーデータにアクセスできることを確認します。seinfo -xt secadm_t
# seinfo -xt secadm_t Types: 1 type secadm_t, can_relabelto_shadow_passwords, (…) userdomain;Copy to Clipboard Copied! Toggle word wrap Toggle overflow root シェルからログアウトします。
logout
# logoutCopy to Clipboard Copied! Toggle word wrap Toggle overflow <sec_adm_user>ユーザーからログアウトします。logout
$ logout Connection to localhost closed.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 現在のセキュリティーコンテキストを表示します。
id
# id uid=0(root) gid=0(root) groups=0(root) context=root:sysadm_r:sysadm_t:s0-s15:c0.c1023Copy to Clipboard Copied! Toggle word wrap Toggle overflow sysadm_secadmモジュールの有効化を試してください。コマンドは失敗するはずです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow sysadm_tSELinux タイプに関する詳細の表示を試してください。コマンドは失敗するはずです。seinfo -xt sysadm_t
# seinfo -xt sysadm_t [Errno 13] Permission denied: '/sys/fs/selinux/policy'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.9. MLS でのセキュアな端末の定義 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーは、ユーザーが接続している端末のタイプをチェックし、特定の SELinux アプリケーション (newrole など) の実行を安全な端末からのみ許可します。セキュアでない端末からこれを試みると、次のエラーが発生します。Error: you are not allowed to change levels on a non secure terminal;
/etc/selinux/mls/contexts/securetty_types ファイルは、MLS (Multi-Level Security) ポリシーのセキュアな端末を定義します。
ファイルのデフォルトコンテンツ:
端末タイプをセキュアな端末リストに追加すると、システムがセキュリティーリスクにさらされる可能性があります。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 - すでにセキュアな端末から接続しているか、SELinux が Permissive モードである。
セキュリティー管理者権限が割り当てられている。以下のいずれかに割り当てます。
-
secadm_rロール。 -
sysadm_secadmモジュールが有効になっている場合は、sysadm_rロール。sysadm_secadmモジュールはデフォルトで有効になっています。
-
-
policycoreutils-python-utilsパッケージがインストールされている。
手順
現在の端末タイプを確認します。
ls -Z `tty`
# ls -Z `tty` root:object_r:user_devpts_t:s0 /dev/pts/0Copy to Clipboard Copied! Toggle word wrap Toggle overflow この出力例では、
user_devpts_tが現在の端末タイプです。-
/etc/selinux/mls/contexts/securetty_typesファイルの新しい行に、関連する SELinux タイプを追加します。 オプション: SELinux を強制モードに切り替えます。
setenforce 1
# setenforce 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
-
/etc/selinux/mls/contexts/securetty_typesファイルに追加した、以前はセキュアでなかった端末からログインします。
6.10. MLS ユーザーによる下位レベルのファイルの編集を許可する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MLS ユーザーは、クリアランス範囲の下限値を下回る機密レベルのファイルに書き込むことはできません。シナリオで、ユーザーによる下位レベルのファイルの編集を許可する必要がある場合は、ローカル SELinux モジュールを作成することで実行できます。ただし、ファイルへの書き込みにより、機密レベルがユーザーの現在の範囲の下限まで上昇します増加します。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
Enforcingに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 -
検証用の
setools-consoleパッケージおよびauditパッケージ。
手順
オプション: トラブルシューティングを実施しやすくするために、Permissive モードに切り替えます。
setenforce 0
# setenforce 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow ~/local_mlsfilewrite.cilなどのテキストエディターで新しい.cilファイルを開き、以下のカスタムルールを挿入します。(typeattributeset mlsfilewrite (_staff_t_))
(typeattributeset mlsfilewrite (_staff_t_))Copy to Clipboard Copied! Toggle word wrap Toggle overflow staff_tは、別の SELinux タイプに置き換えることができます。ここで SELinux タイプを指定することで、下位レベルのファイルを編集できる SELinux ロールを制御できます。ローカルモジュールをより適切に整理するには、ローカル SELinux ポリシーモジュール名で接頭辞
local_を使用します。ポリシーモジュールをインストールします。
semodule -i ~/local_mlsfilewrite.cil
# semodule -i ~/local_mlsfilewrite.cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記ローカルポリシーモジュールを削除するには、
semodule -r ~/local_mlsfilewriteを使用します。モジュール名を参照する場合は、接頭辞.cilなしで参照する必要がある点に注意してください。オプション: 以前に permissive モードに戻した場合は、enforcing モードに戻ります。
setenforce 1
# setenforce 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
インストールされている SELinux モジュールのリストでローカルモジュールを検索します。
semodule -lfull | grep "local_mls"
# semodule -lfull | grep "local_mls" 400 local_mlsfilewrite cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow ローカルモジュールの優先度は
400であるため、semodule -lfull | grep -v ^100コマンドを使用してリスト表示することもできます。-
カスタムルールで定義されているタイプ (
staff_tなど) に割り当てられたユーザーとしてログインします。 機密レベルが低いファイルに書き込みを試みます。これにより、ファイルの区分レベルがユーザーのクリアランスレベルまで上昇します。
重要検証に使用するファイルには、設定が間違っており、ユーザーが実際に認証なしにファイルにアクセスできてしまう場合に備え、機密情報を含めないようにしてください。
第7章 データの機密性に MCS (Multi-Category Security) を使用する リンクのコピーリンクがクリップボードにコピーされました!
MCS を使用すると、データのカテゴリーを分類し、特定のプロセスやユーザーに特定のカテゴリーへのアクセスを許可することで、システムのデータの機密性を高めることができます。
7.1. Multi-Category Security (MCS) リンクのコピーリンクがクリップボードにコピーされました!
MCS (Multi-Category Security) は、プロセスおよびファイルに割り当てられたカテゴリーを使用するアクセス制御メカニズムです。その後、同じカテゴリーに割り当てられているプロセスのみがファイルにアクセスできます。MCS の目的は、システムでデータの機密性を維持することです。
MCS カテゴリーは、c0 から c1023 までの値で定義されますが、“Personnel"、“ProjectX"、または “ProjectX.Personnel" のように、カテゴリーごと、またはカテゴリーの組み合わせに対して、テキストラベルを定義することもできます。その後、mcstrans (MCS Translation Service) では、カテゴリー値を、システムの入出力内の適切なラベルに置き換え、カテゴリー値の代わりにこれらのラベルを使用できるようにします。
ユーザーは、カテゴリーに割り当てられているときに、割り当てられているカテゴリーのいずれかでファイルにラベルを付けることができます。
MCS は単純な原則に基づいて動作します。ファイルにアクセスするには、ファイルに割り当てられたすべてのカテゴリーにユーザーを割り当てる必要があります。MCS チェックは、通常の Linux DAC (Discretionary Access Control) ルールおよび SELinux TE (Type Enforcement) ルールの後に適用されるため、既存のセキュリティー設定をさらに制限する必要があります。
Multi-Level Security 内の MCS
MCS は、単独で非階層システムとして使用することも、マルチレベルセキュリティー (MLS) と組み合わせて、階層システム内の非階層レイヤーとして使用することもできます。
MLS 内の MCS の例を以下に示します。ファイルが以下のように分類されます。
| セキュリティーレベル | カテゴリー | |||
| Not specified | プロジェクト X | プロジェクト Y | プロジェクト Z | |
| Unclassified |
|
|
|
|
| Confidential |
|
|
|
|
| Secret |
|
|
|
|
| Top secret |
|
|
|
|
範囲が s0:c0.1023 のユーザーは、DAC や Type Enforcement ポリシールールなどの他のセキュリティーメカニズムでアクセスが禁止されていない限り、レベル s0 のすべてのカテゴリーに割り当てられたすべてのファイルにアクセスできます。
ファイルまたはプロセスのセキュリティーコンテキストは、以下の組み合わせになります。
- SELinux ユーザー
- SELinux ロール
- SELinux タイプ
- MLS 機密レベル
- MCS カテゴリー
たとえば、MLS/MCS 環境で、機密レベル 1 およびカテゴリー 2 にアクセスできる非特権ユーザーには、以下の SELinux コンテキストを持つことができます。
user_u:user_r:user_t:s1:c2
user_u:user_r:user_t:s1:c2
7.2. データの機密性にマルチカテゴリーセキュリティーを設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Multi-Category Security (MCS) は、SELinux ポリシー targeted および mls でアクティブになっていますが、ユーザーに対しては設定されていません。targeted ポリシーでは、MCS は以下の場合にのみ設定されます。
- OpenShift
- virt
- サンドボックス (sandbox)
- ネットワークラベリング
-
コンテナー (
container-selinux)
Type Enforcement に加え、MCS ルールで user_t SELinux タイプを制約するルールを使用して、ローカルの SELinux モジュールを作成することにより、ユーザーを分類するように MCS を設定できます。
特定のファイルのカテゴリーを変更すると、一部のサービスが稼働しなくなる場合があります。専門家でない場合は、Red Hat の営業担当者に連絡し、コンサルティングサービスを依頼してください。
前提条件
-
SELinux モードが
enforcingに設定されている。 -
SELinux のポリシーは
targetedまたはmlsに設定されている。 -
policycoreutils-python-utilsパッケージおよびsetools-consoleパッケージがインストールされている。
手順
新しいファイルを作成します (例:
local_mcs_user.cil)。vim local_mcs_user.cil
# vim local_mcs_user.cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のルールを挿入します。
(typeattributeset mcs_constrained_type (user_t))
(typeattributeset mcs_constrained_type (user_t))Copy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーモジュールをインストールします。
semodule -i local_mcs_user.cil
# semodule -i local_mcs_user.cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
各ユーザードメインに、すべてのコンポーネントの詳細を表示します。
seinfo -xt user_t
# seinfo -xt user_t Types: 1 type user_t, application_domain_type, nsswitch_domain, corenet_unlabeled_type, domain, kernel_system_state_reader, mcs_constrained_type, netlabel_peer_type, privfd, process_user_target, scsi_generic_read, scsi_generic_write, syslog_client_type, pcmcia_typeattr_1, user_usertype, login_userdomain, userdomain, unpriv_userdomain, userdom_home_reader_type, userdom_filetrans_type, xdmhomewriter, x_userdomain, x_domain, dridomain, xdrawable_type, xcolormap_type;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3. MCS でのカテゴリーラベルの定義 リンクのコピーリンクがクリップボードにコピーされました!
setrans.conf ファイルを編集することで、MCS カテゴリーのラベル、または MCS カテゴリーと MLS レベルの組み合わせをシステムで管理および維持できます。このファイルでは、SELinux は、内部の機密レベルとカテゴリーレベル、および人間が判読できるラベルとの間でマッピングを維持しています。
カテゴリーラベルは、ユーザーがカテゴリーを使いやすくするためだけのものです。MCS は、ラベルを定義するかどうかに関係なく同じように機能します。
前提条件
-
SELinux モードが
Enforcingに設定されている。 -
SELinux のポリシーは
targetedまたはmlsに設定されている。 -
policycoreutils-python-utilsパッケージおよびmcstransパッケージがインストールされている。
手順
テキストエディターで
/etc/selinux/<selinuxpolicy>/setrans.confファイルを編集して、既存のカテゴリーを修正したり、カテゴリーを新たに作成したりできます。お使いの SELinux ポリシーに応じて、<selinuxpolicy> をtargetedまたはmlsに置き換えます。以下に例を示します。vi /etc/selinux/targeted/setrans.conf
# vi /etc/selinux/targeted/setrans.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーの
setrans.confファイルで、構文s_<security level>_:c_<category number>_=<category.name>を使用して、シナリオで必要なカテゴリーの組み合わせを定義します。以下に例を示します。s0:c0=Marketing s0:c1=Finance s0:c2=Payroll s0:c3=Personnel
s0:c0=Marketing s0:c1=Finance s0:c2=Payroll s0:c3=PersonnelCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
カテゴリー番号は、
c0からc1023まで使用できます。 -
targetedポリシーでは、s0セキュリティーレベルを使用します。 -
mlsポリシーでは、機密レベルとカテゴリーの組み合わせにラベルを付けることができます。
-
カテゴリー番号は、
-
必要に応じて、
setrans.confファイル内で、MLS 機密レベルにラベルを付けることもできます。 - ファイルを保存し、終了します。
変更を有効にするには、MCS 変換サービスを再起動します。
systemctl restart mcstrans
# systemctl restart mcstransCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
現在のカテゴリーを表示します。
chcat -L
# chcat -LCopy to Clipboard Copied! Toggle word wrap Toggle overflow 上の例の出力は、以下となります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.4. MCS でのユーザーへのカテゴリーの割り当て リンクのコピーリンクがクリップボードにコピーされました!
Linux ユーザーにカテゴリーを割り当てることで、ユーザー認証を定義できます。カテゴリーが割り当てられているユーザーは、ユーザーのカテゴリーのサブセットがあるファイルにアクセスして修正できます。また、ユーザーは自分が所有するファイルを、割り当てられたカテゴリーに割り当てることもできます。
Linux ユーザーは、関連する SELinux ユーザーに定義されたセキュリティー範囲外のカテゴリーに割り当てることはできません。
カテゴリーアクセスは、ログイン時に割り当てられます。そのため、ユーザーは再度ログインするまで、新しく割り当てられたカテゴリーにアクセスできません。同様に、カテゴリーへのユーザーのアクセスを取り消した場合は、ユーザーが再度ログインしないと有効になりません。
前提条件
-
SELinux モードが
Enforcingに設定されている。 -
SELinux のポリシーは
targetedまたはmlsに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 Linux ユーザーが SELinux で制限されたユーザーに割り当てられている。
-
特権のないユーザーは、
user_uに割り当てられます。 -
特権ユーザーは、
staff_uに割り当てられます。
-
特権のないユーザーは、
手順
SELinux ユーザーのセキュリティー範囲を定義します。
semanage user -m -rs0:c0,c1-s0:c0.c9 <user_u>
# semanage user -m -rs0:c0,c1-s0:c0.c9 <user_u>Copy to Clipboard Copied! Toggle word wrap Toggle overflow setrans.confファイルで定義されているように、c0からc1023までのカテゴリー番号またはカテゴリーラベルを使用します。詳細は、MCS でのカテゴリーラベルの定義 を参照してください。Linux ユーザーに MCS カテゴリーを割り当てます。指定できるのは、関連する SELinux ユーザーに定義された範囲内でのみです。
semanage login -m -rs0:c1 <Linux.user1>
# semanage login -m -rs0:c1 <Linux.user1>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記chcatコマンドを使用して、Linux ユーザーにカテゴリーを追加または削除できます。以下の例では、<category1>を追加し、<Linux.user1>および<Linux.user2>から<category2>を削除します。chcat -l -- +<category1>,-<category2> <Linux.user1>,<Linux.user2>
# chcat -l -- +<category1>,-<category2> <Linux.user1>,<Linux.user2>Copy to Clipboard Copied! Toggle word wrap Toggle overflow -<category>構文を使用する前に、コマンドラインで--を指定する必要があります。指定しないと、chcatコマンドは、カテゴリーの削除をコマンドオプションであると誤って解釈します。
検証
Linux ユーザーに割り当てられているカテゴリーのリストを表示します。
chcat -L -l <Linux.user1>,<Linux.user2>
# chcat -L -l <Linux.user1>,<Linux.user2> <Linux.user1>: <category1>,<category2> <Linux.user2>: <category1>,<category2>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.5. MCS でのファイルへのカテゴリーの割り当て リンクのコピーリンクがクリップボードにコピーされました!
カテゴリーをユーザーに割り当てるには、管理者特権が必要です。ユーザーはカテゴリーをファイルに割り当てることができます。ファイルのカテゴリーを変更するには、そのファイルへのアクセス権が必要です。ユーザーは、割り当てられているカテゴリーにのみファイルを割り当てることができます。
このシステムは、カテゴリーアクセスルールと従来のファイルアクセス権限を組み合わせています。たとえば、bigfoot のカテゴリーを持つユーザーが DAC (Discretionary Access Control) を使用して他のユーザーによるファイルへのアクセスをブロックすると、他の bigfoot ユーザーはそのファイルにアクセスできなくなります。利用可能なすべてのカテゴリーに割り当てられたユーザーは、ファイルシステム全体にアクセスできない場合があります。
前提条件
-
SELinux モードが
Enforcingに設定されている。 -
SELinux のポリシーは
targetedまたはmlsに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 以下に該当する Linux ユーザーのアクセスおよびパーミッション
- SELinux ユーザーに割り当てられている。
- ファイルの割り当て先となるカテゴリーに割り当てられている。詳細は、MCS でユーザーへのカテゴリーの割り当て を参照してください。
- カテゴリーに追加するファイルへのアクセスと権限。
- 検証目的: このカテゴリーに割り当てられていない Linux ユーザーへのアクセスとパーミッション
手順
カテゴリーをファイルに追加します。
chcat -- +<category1>,+<category2> <path/to/file1>
$ chcat -- +<category1>,+<category2> <path/to/file1>Copy to Clipboard Copied! Toggle word wrap Toggle overflow setrans.confファイルで定義されているように、c0からc1023までのカテゴリー番号またはカテゴリーラベルを使用します。詳細は、MCS でのカテゴリーラベルの定義 を参照してください。同じ構文を使用して、ファイルからカテゴリーを削除できます。
chcat -- -<category1>,-<category2> <path/to/file1>
$ chcat -- -<category1>,-<category2> <path/to/file1>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記カテゴリーを削除する場合は、コマンドラインで
--を指定してから-<category>構文を使用する必要があります。指定しないと、chcatコマンドは、カテゴリーの削除をコマンドオプションであると誤って解釈します。
検証
ファイルのセキュリティーコンテキストを表示して、カテゴリーが正しいことを確認します。
ls -lZ <path/to/file>
$ ls -lZ <path/to/file> -rw-r--r-- <LinuxUser1> <Group1> root:object_r:user_home_t:_<sensitivity>_:_<category>_ <path/to/file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルの特定のセキュリティーコンテキストは異なる場合があります。
(必要に応じて) ファイルと同じカテゴリーに割り当てられていない Linux ユーザーとしてログインしたときに、ファイルにアクセスしようとします。
cat <path/to/file> cat: <path/to/file>: Permission Denied
$ cat <path/to/file> cat: <path/to/file>: Permission DeniedCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第8章 カスタム SELinux ポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
SELinux によって制限されたアプリケーションを実行するには、カスタムポリシーを作成して使用する必要があります。
8.2. カスタムアプリケーション用の SELinux ポリシーの作成および実施 リンクのコピーリンクがクリップボードにコピーされました!
SELinux によってアプリケーションを制限することで、ホストシステムとユーザーのデータのセキュリティーを強化できます。各アプリケーションには特定の要件があるため、ユースケースに応じてこの手順を変更してください。ここでは例として、単純なデーモンを制限する SELinux ポリシーを作成します。
前提条件
-
selinux-policy-develパッケージとその依存関係がシステムにインストールされている。
手順
この手順例では、
/var/log/messagesファイルを開いて書き込みを行う簡単なデーモンを準備します。新しいファイルを作成して、選択したテキストエディターで開きます。
vi mydaemon.c
$ vi mydaemon.cCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコードを挿入します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイルをコンパイルします。
gcc -o mydaemon mydaemon.c
$ gcc -o mydaemon mydaemon.cCopy to Clipboard Copied! Toggle word wrap Toggle overflow デーモンの
systemdユニットファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow デーモンをインストールして起動します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいデーモンが SELinux によって制限されていないことを確認します。
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:unconfined_service_t:s0 root 4117 1 0 16:56 ? 00:00:00 /usr/local/bin/mydaemonCopy to Clipboard Copied! Toggle word wrap Toggle overflow
デーモンのカスタムポリシーを生成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 直前のコマンドで作成した設定スクリプトを使用して、新しいポリシーモジュールでシステムポリシーを再構築します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restoreconコマンドを使用して、設定スクリプトがファイルシステムの対応する部分の再ラベル付けを行うことに注意してください。restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow デーモンを再起動して、SELinux が制限のあるデーモンを実行していることを確認します。
systemctl restart mydaemon ps -efZ | grep mydaemon
# systemctl restart mydaemon $ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemonCopy to Clipboard Copied! Toggle word wrap Toggle overflow デーモンは SELinux によって制限されているため、SELinux はこのデーモンが
/var/log/messagesにアクセスできないようにします。対応する拒否メッセージを表示します。ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent ... type=AVC msg=audit(1590247112.719:5935): avc: denied { open } for pid=8150 comm="mydaemon" path="/var/log/messages" dev="dm-0" ino=2430831 scontext=system_u:system_r:mydaemon_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=file permissive=1 ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow sealertツールを使用して追加情報を取得することもできます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow audit2allowツールを使用して、変更を提案します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow audit2allowが提案するルールは特定のケースでは正しくない可能性があるため、出力の一部のみを使用して対応するポリシーインターフェイスを見つけます。macro-expanderツールを使用してlogging_write_generic_logs (mydaemon_t)マクロを検査し、マクロが提供するすべての許可ルールを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、提案されたインターフェイスを使用できます。このインターフェイスは、ログファイルとその親ディレクトリーへの読み取りおよび書き込みアクセスのみを提供するためです。Type Enforcement ファイルに対応するルールを追加します。
echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
$ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.teCopy to Clipboard Copied! Toggle word wrap Toggle overflow または、インターフェイスを使用する代わりに、このルールを追加することもできます。
echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.te$ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.teCopy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーを再インストールします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
アプリケーションが SELinux によって制限されて実行されていることを確認します。以下に例を示します。
ps -efZ | grep mydaemon
$ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemonCopy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムアプリケーションが SELinux 拒否を生じさせないことを確認します。
ausearch -m AVC -ts recent
# ausearch -m AVC -ts recent <no matches>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第9章 コンテナーの SELinux ポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
RHEL 9 には、udica パッケージを使用してコンテナーの SELinux ポリシーを生成するツールがあります。udica を使用すると、最適なセキュリティーポリシーを作成して、ストレージ、デバイス、ネットワークなどのホストシステムリソースにコンテナーがアクセスする方法を制御できます。これにより、セキュリティー違反に対してコンテナーのデプロイメントを強化でき、規制コンプライアンスの実現や維持も簡単になります。
9.1. udica の SELinux ポリシージェネレーターの概要 リンクのコピーリンクがクリップボードにコピーされました!
カスタムコンテナーの SELinux ポリシーの新規作成を簡素化するために、RHEL 8 には udica ユーティリティーが用意されています。このツールを使用して、Linux の機能、マウントポイント、およびポート定義を含むコンテナーの JavaScript Object Notation (JSON) ファイルの検査に基づいてポリシーを作成できます。したがって、ツールは、検査の結果を使用して生成されたルールと、指定された SELinux Common Intermediate Language (CIL) ブロックから継承されたルールを組み合わせます。
udica を使用してコンテナーの SELinux ポリシーを生成するプロセスには、以下の 3 つの主要な部分があります。
- JSON 形式のコンテナー仕様ファイルを解析する。
- 最初の部分の結果に基づいて適切な許可ルールを見つける。
- 最終的な SELinux ポリシーを生成する。
解析フェーズでは、udica が Linux 機能、ネットワークポート、およびマウントポイントを探します。
この結果に基づいて、udica はコンテナーに必要な Linux 機能を検出し、これらすべての機能を許可する SELinux ルールを作成します。コンテナーが特定のポートにバインドする場合は、udica が SELinux ユーザー空間ライブラリーを使用して、検査対象のコンテナーが使用するポートの正しい SELinux ラベルを取得します。
その後、udica は、どのディレクトリーがホストからコンテナーのファイルシステムのネームスペースにマウントされているかを検出します。
CIL のブロック継承機能により、udica は SELinux のテンプレートを作成でき、特定のアクションに焦点を当てた ルール を許可します。次に例を示します。
- ホームディレクトリーへのアクセスを許可する。
- ログファイルへのアクセスを許可する。
- Xserver との通信へのアクセスを許可する。
このようなテンプレートはブロックと呼ばれ、最終的な SELinux ポリシーはブロックをマージして作成されます。
9.2. カスタムコンテナーの SELinux ポリシーを作成して使用 リンクのコピーリンクがクリップボードにコピーされました!
udica ユーティリティーを使用すると、カスタムコンテナー用の SELinux セキュリティーポリシーを生成できます。
前提条件
-
コンテナーを管理する
podmanツールがインストールされている。そうでない場合は、yum install podmanコマンドを使用します。 - カスタムの Linux コンテナー - この例では ubi8 です。
手順
udicaパッケージをインストールします。yum install -y udica
# yum install -y udicaCopy to Clipboard Copied! Toggle word wrap Toggle overflow udicaを含むコンテナーソフトウェアパッケージセットを提供するcontainer-toolsモジュールをインストールします。yum module install -y container-tools
# yum module install -y container-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow /homeディレクトリーを読み取り権限でマウントする ubi8 コンテナーと、読み取りおよび書き込みの権限で/var/spoolディレクトリーをマウントします。コンテナーはポート 21 を公開します。podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
# podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーは、SELinux のタイプが
container_tで実行されることに注意してください。このタイプは、SELinux ポリシー内のすべてのコンテナーの汎用ドメインであり、シナリオに対して厳密すぎるか緩すぎる可能性があります。新しいターミナルを開き、
podman psコマンドを入力して、コンテナーの ID を取得します。podman ps
# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37a3635afb8f registry.access.redhat.com/ubi8:latest bash 15 minutes ago Up 15 minutes ago heuristic_lewinCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーの JSON ファイルを作成し、
udicaを使用して JSON ファイルの情報に基づいてポリシーモジュールを作成します。podman inspect 37a3635afb8f > container.json udica -j container.json my_container
# podman inspect 37a3635afb8f > container.json # udica -j container.json my_container Policy my_container with container id 37a3635afb8f created! […]Copy to Clipboard Copied! Toggle word wrap Toggle overflow または、次のようになります。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前の手順の
udicaの出力で提案されているように、ポリシーモジュールを読み込みます。semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}# semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}Copy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーを停止し、
--security-opt label=type:my_container.processオプションを使用して再起動します。podman stop 37a3635afb8f podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
# podman stop 37a3635afb8f # podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
コンテナーが、
my_container.processタイプで実行されることを確認します。ps -efZ | grep my_container.process
# ps -efZ | grep my_container.process unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434 1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305 0 13:49 pts/0 00:00:00 bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が、マウントポイント
/homeおよび/var/spoolへのアクセスを許可していることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux がポート 21 へのバインドのみを許可していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第10章 複数のシステムへの同じ SELinux 設定のデプロイメント リンクのコピーリンクがクリップボードにコピーされました!
次のいずれかの方法を使用して、検証済みの SELinux 設定を複数のシステムにデプロイできます。
- RHEL システムロールおよび Ansible の使用
- RHEL Web コンソールの使用
-
スクリプトで
semanageの export コマンドおよび import コマンドの使用
10.1. selinux RHEL システムロールを使用したディレクトリーの SELinux コンテキストの復元 リンクのコピーリンクがクリップボードにコピーされました!
ファイルの SELinux コンテキストの誤りは、さまざまな場合に発生します。たとえば、ファイルをディレクトリーにコピーまたは移動する場合、ファイルの SELinux コンテキストが、新しい場所の予想されるコンテキストと一致しないことがあります。SELinux コンテキストが正しくないと、アプリケーションがファイルにアクセスできない可能性があります。多数のホストにあるディレクトリーの SELinux コンテキストをリモートでリセットするには、selinux RHEL システムロールを使用できます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル Playbook で指定されている設定は次のとおりです。
selinux_restore_dirs: <list>- ロールによって SELinux コンテキストをリセットするディレクトリーのリストを定義します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.selinux/README.mdファイルを参照してください。Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
コンテキストをリセットしたファイルまたはディレクトリーの SELinux コンテキストを表示します。たとえば、
/var/www/ディレクトリーのコンテキストを表示するには、次のように入力します。ansible rhel9.example.com -m command -a 'ls -ldZ /var/www/'
# ansible rhel9.example.com -m command -a 'ls -ldZ /var/www/' drwxr-xr-x. 4 root root system_u:object_r:httpd_sys_content_t:s0 33 Feb 28 13:20 /var/www/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.2. selinux RHEL システムロールを使用した SELinux ネットワークポートラベルの管理 リンクのコピーリンクがクリップボードにコピーされました!
標準以外のポートでサービスを実行する場合は、このポートに対応する SELinux タイプラベルを設定する必要があります。これにより、サービスが標準以外のポートでリッスンしようとする際に、そのサービスへの許可が SELinux によって拒否されなくなります。selinux RHEL システムロールを使用すると、このタスクを自動化し、ポートにタイプラベルをリモートで割り当てることができます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル Playbook で指定されている設定は次のとおりです。
ports: <port_number>- SELinux ラベルを割り当てるポート番号を定義します。複数の値はコンマで区切ります。
setype: <type_label>- SELinux タイプラベルを定義します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.selinux/README.mdファイルを参照してください。Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
http_port_tラベルが割り当てられているポート番号を表示します。ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t'
# ansible managed-node-01.example.com -m shell -a 'semanage port --list | grep http_port_t' http_port_t tcp 80, 81, 443, <port_number>, 488, 8008, 8009, 8443, 9000Copy to Clipboard Copied! Toggle word wrap Toggle overflow
10.3. selinux RHEL システムロールを使用した SELinux モジュールのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの SELinux ポリシーがお客様の要件に合わない場合は、カスタムモジュールを作成して、アプリケーションに必要なリソースへのアクセスを許可できます。selinux RHEL システムロールを使用すると、このプロセスを自動化し、SELinux モジュールをリモートでデプロイできます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。 - デプロイする SELinux モジュールが、Playbook と同じディレクトリーに保存されている。
SELinux モジュールが Common Intermediate Language (CIL) またはポリシーパッケージ (PP) 形式で利用できる。
PP モジュールを使用している場合は、管理対象ノード上の
policydbバージョンが、PP モジュールのビルドに使用されたバージョン以降であることを確認してください。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サンプル Playbook で指定されている設定は次のとおりです。
path: <module_file>- コントロールノード上のモジュールファイルへのパスを設定します。
priority: <value>-
SELinux モジュールの優先度を設定します。デフォルトは
400です。 state: <value>モジュールの状態を定義します。
-
enabled: モジュールをインストールまたは有効にします。 -
disabled: モジュールを無効にします。 -
absent: モジュールを削除します。
-
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.selinux/README.mdファイルを参照してください。Playbook の構文を検証します。
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
SELinux モジュールのリストをリモートで表示し、Playbook で使用したモジュールをフィルタリングします。
ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'
# ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'Copy to Clipboard Copied! Toggle word wrap Toggle overflow モジュールがリストされている場合、そのモジュールはインストールされ、有効になっています。
10.4. Web コンソールで SELinux 設定の Ansible Playbook の作成 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールでは、SELinux 設定のシェルスクリプトまたは Ansible Playbook を生成できます。Ansible Playbook の場合、複数のシステムに設定を簡単に適用できます。
前提条件
- RHEL 8 Web コンソールがインストールされている。
- cockpit サービスが有効になっている。
ユーザーアカウントが Web コンソールにログインできる。
手順は、Web コンソールのインストールおよび有効化 を参照してください。
手順
RHEL 8 Web コンソールにログインします。
詳細は、Web コンソールへのログイン を参照してください。
- SELinux をクリックします。
をクリックします。
生成されたスクリプトを含むウィンドウが開きます。シェルスクリプトと Ansible Playbook の生成オプションタブ間を移動できます。
- ボタンをクリックし、スクリプトまたは Playbook を選択して適用します。
これにより、他のマシンに適用できる自動スクリプトがあります。
10.5. semanage で別のシステムへの SELinux 設定の転送 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順に従って、RHEL 8 ベースのシステム間で、カスタムおよび検証された SELinux 設定を転送します。
前提条件
-
policycoreutils-python-utilsパッケージがシステムにインストールされている。
手順
検証された SELinux 設定をエクスポートします。
semanage export -f ./my-selinux-settings.mod
# semanage export -f ./my-selinux-settings.modCopy to Clipboard Copied! Toggle word wrap Toggle overflow 設定を含むファイルを新しいシステムにコピーします。
scp ./my-selinux-settings.mod new-system-hostname:
# scp ./my-selinux-settings.mod new-system-hostname:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいシステムにログインします。
ssh root@new-system-hostname
$ ssh root@new-system-hostnameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 新しいシステムに設定をインポートします。
new-system-hostname# semanage import -f ./my-selinux-settings.mod
new-system-hostname# semanage import -f ./my-selinux-settings.modCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第11章 ポリインスタンス化されたディレクトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、すべてのプログラム、サービス、およびユーザーは、一時ストレージとして /tmp、/var/tmp、およびホームディレクトリーを使用します。これにより、これらのディレクトリーは、ファイル名に基づく競合状態攻撃や情報漏洩に対して脆弱になります。/tmp/、/var/tmp/、およびホームディレクトリーをインスタンス化して、これらがすべてのユーザー間で共有されないようにし、各ユーザーの /tmp-inst および /var/tmp/tmp-inst が /tmp および /var/tmp ディレクトリーに個別にマウントされるようにすることができます。
手順
SELinux でポリインスタンス化を有効にする:
setsebool -P allow_polyinstantiation 1
# setsebool -P allow_polyinstantiation 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow getsebool allow_polyinstantiationコマンドを入力すると、SELinux でポリインスタンス化が有効になっているかどうかを確認できます。必要な権限を使用して、再起動後もデータが永続的になるようにディレクトリー構造を作成します。
mkdir /tmp-inst /var/tmp/tmp-inst --mode 000
# mkdir /tmp-inst /var/tmp/tmp-inst --mode 000Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux ユーザー部分を含むセキュリティーコンテキスト全体を復元します。
restorecon -Fv /tmp-inst /var/tmp/tmp-inst
# restorecon -Fv /tmp-inst /var/tmp/tmp-inst Relabeled /tmp-inst from unconfined_u:object_r:default_t:s0 to system_u:object_r:tmp_t:s0 Relabeled /var/tmp/tmp-inst from unconfined_u:object_r:tmp_t:s0 to system_u:object_r:tmp_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow システムで
fapolicydアプリケーション制御フレームワークを使用している場合は、/etc/fapolicyd/fapolicyd.conf設定ファイルでallow_filesystem_markオプションを有効にして、基礎となるファイルシステムがバインドマウントされているときに、fapolicydがファイルアクセスイベントを監視できるようにします。allow_filesystem_mark = 1
allow_filesystem_mark = 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow /tmp、/var/tmp/、およびユーザーのホームディレクトリーのインスタンス化を有効にします。重要pam_namespace_helperプログラムは/etc/security/namespace.d内の追加ファイルを読み取らないため、/etc/security/namespace.d/ディレクトリー内の別のファイルではなく、/etc/security/namespace.confを使用します。マルチレベルセキュリティー (MLS) を備えたシステムでは、
/etc/security/namespace.confファイルの最後の 3 行のコメントを解除します。/tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ level
/tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ levelCopy to Clipboard Copied! Toggle word wrap Toggle overflow マルチレベルセキュリティー (MLS) のないシステムでは、
/etc/security/namespace.confファイルに次の行を追加します。/tmp /tmp-inst/ user root,adm /var/tmp /var/tmp/tmp-inst/ user root,adm $HOME $HOME/$USER.inst/ user
/tmp /tmp-inst/ user root,adm /var/tmp /var/tmp/tmp-inst/ user root,adm $HOME $HOME/$USER.inst/ userCopy to Clipboard Copied! Toggle word wrap Toggle overflow
セッションに
pam_namespace.soモジュールが設定されていることを確認します。grep namespace /etc/pam.d/login
$ grep namespace /etc/pam.d/login session required pam_namespace.soCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: クラウドユーザーが SSH キーを使用してシステムにアクセスできるようにします。
-
openssh-keycatパッケージをインストールします。 /etc/ssh/sshd_config.d/ディレクトリーに次の内容のファイルを作成します。AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat AuthorizedKeysCommandRunAs root
AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat AuthorizedKeysCommandRunAs rootCopy to Clipboard Copied! Toggle word wrap Toggle overflow sshd_configのPubkeyAuthentication変数がyesに設定されているかどうかを確認して、公開鍵認証が有効になっていることを確認します。デフォルトでは、sshd_configの行がコメントアウトされているにもかかわらず、PubkeyAuthenticationは yes に設定されています。grep -r PubkeyAuthentication /etc/ssh/
$ grep -r PubkeyAuthentication /etc/ssh/ /etc/ssh/sshd_config:#PubkeyAuthentication yesCopy to Clipboard Copied! Toggle word wrap Toggle overflow
-
ポリインスタンス化を適用する各サービスのモジュールに、
session required pam_namespace.so unmnt_remntエントリーを、session include system-auth行の後に追加します。たとえば、/etc/pam.d/su、/etc/pam.d/sudo、/etc/pam.d/ssh、および/etc/pam.d/sshd: の場合:[...] session include system-auth session required pam_namespace.so unmnt_remnt [...]
[...] session include system-auth session required pam_namespace.so unmnt_remnt [...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
- 非 root ユーザーとしてログインします。ポリインスタンス化が設定される前にログインしていたユーザーは、変更が有効になる前にログアウトしてログインする必要があります。
/tmp/ディレクトリーが/tmp-inst/の下にマウントされていることを確認します。findmnt --mountpoint /tmp/
$ findmnt --mountpoint /tmp/ TARGET SOURCE FSTYPE OPTIONS /tmp /dev/vda1[/tmp-inst/<user>] xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquotaCopy to Clipboard Copied! Toggle word wrap Toggle overflow SOURCEの出力は環境によって異なります。* 仮想システムでは、/dev/vda_<number>_と表示されます。* ベアメタルシステムでは、/dev/sda_<number>_または/dev/nvme*が表示されます。