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
Enforcing
# setenforce 0
# getenforce
Permissive
# setenforce 1
# getenforce
Enforcing
Red Hat Enterprise Linux では、システムを Enforcing モードで実行している場合に、個々のドメインを Permissive モードに設定できます。たとえば、httpd_t ドメインを Permissive に設定するには、以下のコマンドを実行します。
# 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 ポリシーを返します。
$ 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
Memory protection checking: actual (secure)
Max kernel policy version: 31
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/configSELINUX=permissiveオプションを設定します。# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targetedシステムを再起動します。
# reboot
検証
システムの再起動後に、
getenforceコマンドがPermissiveを返すことを確認します。$ getenforce Permissive
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/configSELINUX=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=targeted変更を保存して、システムを再起動します。
# reboot次にシステムを起動する際に、SELinux はシステム内のファイルおよびディレクトリーのラベルを再設定し、SELinux が無効になっている間に作成したファイルおよびディレクトリーに SELinux コンテキストを追加します。
検証
システムの再起動後に、
getenforceコマンドがEnforcingを返すことを確認します。$ getenforce Enforcing
トラブルシューティング
Enforcing モードに変更したあと、SELinux ポリシールールが間違っていたか、設定されていなかったため、SELinux が一部のアクションを拒否する場合があります。
SELinux に拒否されるアクションを表示するには、root で以下のコマンドを実行します。
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayまたは、
setroubleshoot-serverパッケージがインストールされている場合は、次のように入力します。# grep "SELinux is preventing" /var/log/messagesSELinux が有効で、Audit デーモン (
auditd) がシステムで実行していない場合は、dmesgコマンドの出力で SELinux メッセージを検索します。# dmesg | grep -i -e type=1300 -e type=1400
詳細は 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- SELinux 拒否メッセージを確認します。詳細は、SELinux 拒否の特定 を参照してください。
次の再起動時に、ファイルが再ラベル付けされていることを確認します。
# fixfiles -F onbootこれにより、
-Fオプションを含む/.autorelabelファイルが作成されます。警告fixfiles -F onbootコマンドを入力する前に、必ず Permissive モードに切り替えてください。デフォルトでは、
autorelabelはシステムで使用可能な CPU コアと同じ数のスレッドを並列に使用します。ラベルの自動再設定中に単一のスレッドのみを使用するには、fixfiles -T 1 onbootコマンドを使用します。- 拒否がない場合は、Enforcing モードに切り替えます。詳細は システム起動時の SELinux モードの変更 を参照してください。
検証
システムの再起動後に、
getenforceコマンドがEnforcingを返すことを確認します。$ getenforce Enforcing
次のステップ
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 grubby-<version>
手順
ブートローダーを設定して、カーネルコマンドラインに
selinux=0を追加します。$ sudo grubby --update-kernel ALL --args selinux=0システムを再起動します。
$ reboot
検証
再起動したら、
getenforceコマンドがDisabledを返すことを確認します。$ getenforce Disabled
代替方法
RHEL 8 では、/etc/selinux/config ファイルの SELINUX=disabled オプションを使用して SELinux を無効にする 非推奨 の方法を引き続き使用できます。その結果、カーネルは SELinux が有効な状態で起動し、起動プロセスの後半で無効モードに切り替わります。その結果、メモリーリークや競合状態が発生し、カーネルパニックが発生する可能性があります。この方法を使用するには以下を実行します。
任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。# vi /etc/selinux/configSELINUX=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変更を保存して、システムを再起動します。
# reboot
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ファイルシステムに間違ったラベルが付いたオブジェクトが大量に含まれる場合は、システムを 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- SELinux ユーザーです。
user_r- SELinux ロールです。
user_t- SELinux タイプです。
Linux ユーザーのログイン後に、その SELinux ユーザーを変更することはできません。ただし、そのタイプとロールは、移行中などに変更できます。
システムで SELinux ユーザーマッピングを表示するには、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 *
Red Hat Enterprise Linux では、Linux ユーザーはデフォルトで SELinux の __default__ ログインにマッピングされ、これは、SELinux unconfined_u ユーザーにマッピングされます。以下の行は、デフォルトのマッピングを定義します。
default unconfined_u s0-s0:c0.c1023 *
制限のあるユーザーは、現在の SELinux ポリシーで明示的に定義されている SELinux ルールにより制限されます。制限のないユーザーには、SELinux による制限が最小限にとどまります。
制限のある Linux ユーザー、および制限のない Linux ユーザーは、実行可能なメモリーチェックおよび書き込み可能なメモリーチェックに依存し、また MCS または MLS によっても制限されます。
利用可能な SELinux ユーザーをリスト表示するには、以下のコマンドを実行します。
$ seinfo -u
Users: 8
guest_u
root
staff_u
sysadm_u
system_u
unconfined_u
user_u
xguest_u
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 -r
Roles: 14
auditadm_r
dbadm_r
guest_r
logadm_r
nx_server_r
object_r
secadm_r
staff_r
sysadm_r
system_r
unconfined_r
user_r
webadm_r
xguest_r
seinfo コマンドは、setools-console パッケージにより提供されることに注意してください。これは、デフォルトではインストールされません。
3.3. SELinux における制限のある非管理者ロール リンクのコピーリンクがクリップボードにコピーされました!
SELinux では、制限のある非管理者ロールは、特定のタスクを実行するための特定の権限とアクセス権のセットを、そのロールに割り当てられた Linux ユーザーに付与します。個別の制限のある非管理者ロールを割り当てることで、個々のユーザーに特定の権限を割り当てることができます。これは、複数のユーザーにそれぞれ異なるレベルの認可を与えるシナリオで役立ちます。
システム上の関連する SELinux ブール値を変更することで、SELinux ロールの権限をカスタマイズすることもできます。SELinux のブール値とその現在の状態を確認するには、root として semanage boolean -l コマンドを使用します。selinux-policy-devel パッケージをインストールすると、より詳細な説明を取得できます。
# semanage boolean -l
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
…
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 contentxguest_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 devicesuser_r非特権アクセス権と完全なユーザー権限を持ちます。このロールに割り当てられたユーザーは、管理者権限を必要としないほとんどのアクションを実行できます。
関連するブール値:
SELinux boolean State Default Description unprivuser_use_svirt (off , off) Allow unprivileged user to create and transition to svirt domains.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.
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 contentdbadm_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.logadm_rログ管理者ロールでは、ログ、特に Rsyslog ログサービスと監査サブシステムに関連する SELinux タイプを管理できます。
関連するブール値:
SELinux boolean State Default Description logadm_exec_content (on , on) Allow logadm to exec contentwebadm_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.secadm_rセキュリティー管理者ロールでは、SELinux データベースを管理できます。
関連するブール値:
SELinux boolean State Default Description secadm_exec_content (on , on) Allow secadm to exec contentsysadm_rシステム管理者のロールでは、前述のロールのすべてを行うことができ、追加の特権があります。デフォルト以外の設定では、SELinux ポリシーで
sysadm_secadmモジュールを無効にして、セキュリティー管理をシステム管理から切り離すことができます。詳細な手順については、MLS でのシステム管理とセキュリティー管理の分離 を参照してください。sysadm_uユーザーは、SSH を使用して直接ログインできません。sysadm_uの SSH ログインを有効にするには、ssh_sysadm_loginブール値をonに設定します。# setsebool -P ssh_sysadm_login on関連するブール値:
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
3.5. SELinux の unconfined_u ユーザーに自動的にマッピングされる新規ユーザーの追加 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順では、新しい Linux ユーザーをシステムに追加する方法を説明します。ユーザーは自動的に SELinux unconfined_u ユーザーにマッピングされます。
前提条件
-
rootユーザーは、Red Hat Enterprise Linux でデフォルトで実行されるように、制限なしで実行されています。
手順
次のコマンドを入力して、
<example_user>という名前の新しい Linux ユーザーを作成します。# useradd <example_user>Linux の
<example_user>ユーザーにパスワードを割り当てるには、次のコマンドを実行します。# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.- 現在のセッションからログアウトします。
-
Linux の
<example_user>ユーザーとしてログインします。ログインすると、PAM モジュールpam_selinuxは Linux ユーザーを SELinux ユーザー (この場合はunconfined_u) に自動的にマッピングし、作成された SELinux コンテキストを設定します。Linux ユーザーのシェルはこのコンテキストで起動します。
検証
<example_user>ユーザーとしてログインしたら、Linux ユーザーのコンテキストを確認します。$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
3.6. 新規ユーザーを SELinux で制限されたユーザーとして追加する リンクのコピーリンクがクリップボードにコピーされました!
SELinux で制限されたユーザーをシステムに新たに追加するには、以下の手順に従います。この手順では、ユーザーアカウントを作成するコマンドを使用して、ユーザーを SELinux の staff_u ユーザー権限にマッピングします。
前提条件
-
rootユーザーは、Red Hat Enterprise Linux でデフォルトで実行されるように、制限なしで実行されています。
手順
次のコマンドを入力して、
<example_user>という名前の新しい Linux ユーザーを作成し、それを SELinuxStaff_uユーザーにマッピングします。# useradd -Z staff_u <example_user>Linux の
<example_user>ユーザーにパスワードを割り当てるには、次のコマンドを実行します。# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.- 現在のセッションからログアウトします。
-
Linux の
<example_user>ユーザーとしてログインします。ユーザーのシェルはstaff_uコンテキストで起動します。
検証
<example_user>ユーザーとしてログインしたら、Linux ユーザーのコンテキストを確認します。$ id -Z uid=1000(<example_user>) gid=1000(<example_user>) groups=1000(<example_user>) context=staff_u:staff_r:staff_t:s0-s0:c0.c1023
3.7. SELinux で一般ユーザーの設定 リンクのコピーリンクがクリップボードにコピーされました!
SELinux ユーザー user_u にマッピングすることで、システムのすべての一般ユーザーを制限できます。
デフォルトでは、管理者権限を持つユーザーを含め、Red Hat Enterprise Linux のすべての Linux ユーザーは、制限のない SELinux ユーザー unconfined_u にマッピングされます。SELinux の制限のあるユーザーにユーザーを割り当てることで、システムのセキュリティーを強化できます。これは、V-71971 Security Technical Implementation Guide に準拠するのに役立ちます。
手順
SELinux ログインレコードのリストを表示します。このリストには、SELinux ユーザーへの Linux ユーザーのマッピングが表示されます。
# 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 *明示的なマッピングのないすべてのユーザーを表す
__default__ユーザーを、SELinux ユーザーuser_uにマッピングします。# semanage login -m -s user_u -r s0 __default__
検証
__default__ユーザーが SELinux ユーザーuser_uにマッピングされていることを確認します。# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ user_u s0 * root unconfined_u s0-s0:c0.c1023 *新規ユーザーのプロセスが SELinux コンテキスト
user_u:user_r:user_t:s0で実行されることを確認します。新しいユーザーを作成します。
# adduser <example_user><example_user>のパスワードを定義します。# passwd <example_user>-
rootとしてログアウトし、新規ユーザーとしてログインします。 ユーザーの ID のセキュリティーコンテキストを表示します。
[<example_user>@localhost ~]$ id -Z user_u:user_r:user_t:s0ユーザーの現在のプロセスのセキュリティーコンテキストを表示します。
[<example_user>@localhost ~]$ ps axZ LABEL PID TTY STAT TIME COMMAND - 1 ? Ss 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 - 3729 ? S 0:00 (sd-pam) user_u:user_r:user_t:s0 3907 ? Ss 0:00 /usr/lib/systemd/systemd --user - 3911 ? S 0:00 (sd-pam) user_u:user_r:user_t:s0 3918 ? S 0:00 sshd: <example_user>@pts/0 user_u:user_r:user_t:s0 3922 pts/0 Ss 0:00 -bash user_u:user_r:user_dbusd_t:s0 3969 ? Ssl 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only user_u:user_r:user_t:s0 3971 pts/0 R+ 0:00 ps axZ
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新しいユーザーまたは既存のユーザーを
sysadm_uSELinux ユーザーにマッピングします。新規ユーザーをマッピングするには、新規ユーザーを
wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーsysadm_uにマッピングします。# adduser -G wheel -Z sysadm_u <example_user>既存のユーザーをマッピングするには、ユーザーを
wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーsysadm_uにマッピングします。# usermod -G wheel -Z sysadm_u <example_user>
ユーザーのホームディレクトリーのコンテキストを復元します。
# restorecon -R -F -v /home/<example_user>
検証
<example_user>が、SELinux ユーザーsysadm_uにマッピングされていることを確認します。# semanage login -l | grep <example_user> <example_user> sysadm_u s0-s0:c0.c1023 *SSH などを使用して
<example_user>としてログインし、ユーザーのセキュリティーコンテキストを表示します。[<example_user>@localhost ~]$ id -Z sysadm_u:sysadm_r:sysadm_t:s0-s0:c0.c1023rootユーザーに切り替えます。$ sudo -i [sudo] password for <example_user>:セキュリティーコンテキストが変更されていないことを確認します。
# id -Z sysadm_u:sysadm_r:sysadm_t:s0-s0:c0.c1023sshdサービスを再起動するなど、管理タスクを実行します。# systemctl restart sshd出力がない場合は、コマンドが正常に完了します。
コマンドが正常に完了しない場合は、以下のメッセージが表示されます。
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.
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>既存のユーザーをマッピングするには、ユーザーを
Wheelユーザーグループに追加し、そのユーザーを SELinux ユーザーstaff_uにマッピングします。# usermod -G wheel -Z staff_u <example_user>
ユーザーのホームディレクトリーのコンテキストを復元します。
# restorecon -R -F -v /home/<example_user><example_user>が SELinux 管理者ロールを取得できるようにするには、/etc/sudoers.d/ディレクトリーに新規ファイルを作成します。以下に例を示します。# visudo -f /etc/sudoers.d/<example_user>以下の行を新規ファイルに追加します。
<example_user> ALL=(ALL) TYPE=sysadm_t ROLE=sysadm_r ALL
検証
<example_user>が SELinux ユーザーstaff_uにマッピングされていることを確認します。# semanage login -l | grep <example_user> <example_user> staff_u s0-s0:c0.c1023 *SSH などを使用して
<example_user>としてログインし、rootユーザーに切り替えます。[<example_user>@localhost ~]$ sudo -i [sudo] password for <example_user>:rootセキュリティーコンテキストを表示します。# id -Z staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023sshdサービスを再起動するなど、管理タスクを実行します。# systemctl restart sshd出力がない場合は、コマンドが正常に完了します。
コマンドが正常に完了しない場合は、以下のメッセージが表示されます。
Failed to restart sshd.service: Access denied See system logs and 'systemctl status sshd.service' for details.
第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サービスを起動して、ステータスを確認します。# systemctl start httpd # systemctl status httpd … httpd[14523]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:3131 … systemd[1]: Failed to start The Apache HTTP Server. …SELinux ポリシーは、
httpdがポート 80 で実行していることを前提としています。# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989ポート 3131 の SELinux タイプを、ポート 80 に一致させるように変更します。
# semanage port -a -t http_port_t -p tcp 3131httpdを再開します。# systemctl start httpdただし、コンテンツにはアクセスできません。
# wget localhost:3131/index.html … HTTP request sent, awaiting response... 403 Forbidden …sealertツールの理由を確認します。# sealert -l "*" ... SELinux is preventing httpd from getattr access on the file /var/test_www/html/index.html. …matchpathconツールを使用して、標準パスと新規パスの SELinux タイプを比較します。# 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:s0新しい
/var/test_www/html/コンテンツディレクトリーの SELinux タイプを、デフォルトの/var/ディレクトリーのタイプに変更します。# semanage fcontext -a -e /var/www /var/test_www再帰的に、
/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:s0
検証
httpdサービスが実行していることを確認します。# systemctl status httpd … Active: active (running) … systemd[1]: Started The Apache HTTP Server. httpd[14888]: Server configured, listening on: port 3131 …Apache HTTP サーバーが提供するコンテンツがアクセスできることを確認します。
# wget localhost:3131/index.html … HTTP request sent, awaiting response... 200 OK Length: 0 [text/html] Saving to: ‘index.html’ …
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 httpd_use_cifs (off , off) Allow httpd to access cifs file systems httpd_use_nfs (off , off) Allow httpd to access nfs file systemsブール値の現在の状態をリスト表示します。
$ getsebool -a | grep 'nfs\|cifs' | grep httpd httpd_use_cifs --> off httpd_use_nfs --> off指定されたブール値を有効にします。
# setsebool httpd_use_nfs on # setsebool httpd_use_cifs on注記setseboolで-Pオプションを使用使用すると、システムを再起動しても変更が持続します。setsebool -Pコマンドは、ポリシー全体を再構築する必要がありますが、設定によっては少し時間がかかる場合があります。
検証
ブール値が
onになっていることを確認します。$ getsebool -a | grep 'nfs\|cifs' | grep httpd httpd_use_cifs --> on httpd_use_nfs --> on
4.3. 非標準ディレクトリーへのアクセスを管理するための適切な SELinux タイプを見つける リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの SELinux ポリシーに含まれないアクセス制御ルールを設定する必要がある場合は、まずユースケースに合ったブール値を検索します。適切なブール値が見つからない場合は、適切な SELinux タイプを使用するか、ローカルポリシーモジュールを作成します。
前提条件
-
selinux-policy-docおよびsetools-consoleパッケージがシステムにインストールされている。
手順
SELinux 関連のすべてのトピックをリスト表示し、設定するコンポーネントに結果を絞り込みます。以下に例を示します。
# 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 …お客様の状況に関連する man ページで、関連する SELinux ブール値、ポートタイプ、およびファイルタイプを見つけます。
man -k selinuxまたはapropos selinuxコマンドを使用するには、先にselinux-policy-docパッケージをインストールする必要があることに注意してください。オプション:
semanage fcontext -lコマンドを使用すると、デフォルトの場所にあるプロセスのデフォルトのマッピングを表示できます。次に例を示します。# semanage fcontext -l | grep samba … /var/cache/samba(/.*)? all files system_u:object_r:samba_var_t:s0 … /var/spool/samba(/.*)? all files system_u:object_r:samba_spool_t:s0 …sesearchコマンドを使用して、デフォルトの SELinux ポリシーのルールを表示します。対応するルールをリスト表示することで、使用するタイプとブール値を見つけることができます。次に例を示します。$ sesearch -A | grep samba | grep httpd … allow httpd_t cifs_t:dir { getattr open search }; [ use_samba_home_dirs && httpd_enable_homedirs ]:True …場合によっては、SELinux ブール値が、設定の問題に対する最も簡単な解決策であることがあります。
getsebool -aコマンドを使用すると、使用可能なすべてのブール値とその値を表示できます。次に例を示します。$ getsebool -a | grep homedirs git_cgi_enable_homedirs --> off git_system_enable_homedirs --> off httpd_enable_homedirs --> off mock_enable_homedirs --> off mpd_enable_homedirs --> off openvpn_enable_homedirs --> on ssh_chroot_rw_homedirs --> offsesearchコマンドを使用すると、選択したブール値が意図するとおりに機能するかどうかを確認できます。次に例を示します。$ 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 …お客様の状況に合ったブール値がない場合は、状況に合った SELinux タイプを見つけます。
sesearchを使用してデフォルトのポリシーから対応するルールを照会することで、ファイルのタイプを見つけることができます。次に例を示します。$ 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 }; …- 以上の解決策がどれもお客様の状況に当てはまらない場合は、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- 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任意のテキストエディターで
/etc/selinux/configファイルを開きます。以下に例を示します。# vi /etc/selinux/configSELinux モードを Enforcing から Permissive に変更し、ターゲットポリシーから MLS に切り替えます。
SELINUX=permissive SELINUXTYPE=mls変更を保存し、エディターを終了します。
MLS ポリシーを有効にする前に、MLS ラベルでファイルシステム上の各ファイルに再度ラベル付けする必要があります。
# fixfiles -F onboot System will relabel on next bootシステムを再起動します。
# rebootSELinux 拒否を確認します。
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -i上記のコマンドはすべてのシナリオに対応していないため、SELinux 拒否の識別、分析、修正のガイダンスは SELinux 関連の問題のトラブルシューティング を参照してください。
システムに SELinux に関連する問題がないことを確認したら、
/etc/selinux/configで該当するオプションを変更して、SELinux を Enforcing モードに切り替えます。SELINUX=enforcingシステムを再起動します。
# reboot
システムが起動しなかったり、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 EnforcingSELinux のステータスが
mlsの値を返すことを確認します。# sestatus | grep mls Loaded policy name: mls
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 0permissive モードでは、SELinux はアクティブなポリシーを適用せず、Access Vector Cache (AVC) メッセージをログに記録するだけです。このログは、トラブルシューティングやデバッグに使用できます。
SELinux ユーザー
staff_uのクリアランスの範囲を定義します。たとえば、このコマンドは、クリアランスの範囲をs1からs15に、デフォルトのクリアランスレベルをs1に設定します。# semanage user -m -L s1 -r s1-s15 staff_uユーザーのホームディレクトリー用の SELinux ファイルコンテキスト設定エントリーを生成します。
# genhomedirconファイルセキュリティーコンテキストをデフォルトに復元します。
# 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:s1ユーザーにクリアランスレベルを割り当てます。
# semanage login -m -r s1 example_userここで、
s1は、ユーザーに割り当てられたクリアランスレベルに置き換えます。ユーザーのホームディレクトリーのラベルをユーザーのクリアランスレベルに付け直します。
# chcon -R -l s1 /home/example_user必要に応じて、SELinux モードを
Permissiveに切り替えた場合は、すべてが想定通りに動作することを確認したら、SELinux モードをEnforcingモードに戻します。# setenforce 1
検証
ユーザーが正しい SELinux ユーザーにマッピングされ、クリアランスレベルが正しく割り当てられていることを確認します。
# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ user_u s0-s0 * example_user user_u s1 * …- 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 user_u:user_r:user_t:s0-s2この例では、ユーザーは
user_uSELinux ユーザー、user_rロール、user_tタイプ、s0-s2の MLS セキュリティーファイルに割り当てられます。現在のユーザーのセキュリティーコンテキストを確認します。
$ id -Z user_u:user_r:user_t:s1-s2ユーザーのクリアランス範囲内で別のセキュリティークリアランス範囲に切り替えます。
$ newrole -l s1最大が割り当てられた範囲以下の範囲に切り替えることができます。単一レベルの範囲を入力すると、割り当てられた範囲の下限が変更されます。たとえば、範囲が
s0-s2のユーザーとしてnewrole -l s1を入力することは、newrole -l s1-s2を入力することに相当します。
検証
現在のユーザーのセキュリティーコンテキストを確認します。
$ id -Z user_u:user_r:user_t:s1-s2現在のシェルを終了し、元の範囲で前のシェルに戻ります。
$ exit
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 user_u:user_r:user_t:s0-s2ユーザーの MLS クリアランス範囲の下位レベルを、ファイルに割り当てるレベルに変更します。
$ newrole -l s1-s2オプション: 現在のユーザーのセキュリティーコンテキストを表示します。
$ id -Z user_u:user_r:user_t:s1-s2オプション: ファイルのセキュリティーコンテキストを表示します。
$ ls -Z /path/to/file user_u:object_r:user_home_t:s0 /path/to/fileファイルを変更して、ファイルの機密レベルをユーザーのクリアランス範囲の下位レベルに変更します。
$ touch /path/to/file重要システムで
restoreconコマンドを使用すると、分類レベルはデフォルト値に戻ります。オプション: シェルを終了して、ユーザーの以前のセキュリティー範囲に戻ります。
$ exit
検証
ファイルのセキュリティーコンテキストを表示します。
$ ls -Z /path/to/file user_u:object_r:user_home_t:s1 /path/to/file
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 -rw-r-----. 1 User1 User1 user_u:object_r:user_home_t:s1 0 12. Feb 10:43 /path/to/fileファイルのデフォルトの区分レベルを変更します。
# semanage fcontext -a -r s2 /path/to/fileファイルの SELinux コンテキストのラベルを強制的につけ直します。
# 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:s2
検証
ファイルの区分レベルを確認します。
# 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/fileオプション: クリアランスが低いユーザーがファイルを読み込めないことを確認します。
$ cat /path/to/file cat: file: Permission denied
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>sudoersファイルを整理しておくには、<sec_adm_user>をsecadmロールに割り当てられる Linux ユーザーに置き換えます。/etc/sudoers.d/<sec_adm_user>ファイルに、以下の内容を追加します。<sec_adm_user> ALL=(ALL) TYPE=secadm_t ROLE=secadm_r ALLこの行は、すべてのホスト上の
<secadmuser>が、すべてのコマンドを実行することを許可し、デフォルトでユーザーをsecadmSELinux タイプとロールにマップします。<sec_adm_user> ユーザーでログインします。
SELinux コンテキスト (SELinux のユーザー、ロール、タイプで構成) が変更されていることを確認するために、
ssh、コンソール、またはxdmを使用してログイン します。suおよびsudoなどの他の方法では、SELinux コンテキスト全体を変更することはできません。ユーザーのセキュリティーコンテキストを確認します。
$ 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.c1023root ユーザーの対話型シェルを実行します。
$ sudo -i [sudo] password for <sec_adm_user>:現在のユーザーのセキュリティーコンテキストを確認します。
# id uid=0(root) gid=0(root) groups=0(root) context=staff_u:secadm_r:secadm_t:s0-s15:c0.c1023ポリシーから
sysadm_secadmモジュールを無効にします。# semodule -d sysadm_secadm重要semodule -rコマンドを使用してシステムポリシーモジュールを削除する代わりに、semodule -dコマンドを使用します。semodule -rコマンドは、システムのストレージからモジュールを削除します。これは、selinux-policy-mlsパッケージを再インストールしないと、モジュールを再び読み込むことができないことを意味します。
検証
secadmロールに割り当てられたユーザーとして、root ユーザーの対話型シェルで、セキュリティーポリシーデータにアクセスできることを確認します。# seinfo -xt secadm_t Types: 1 type secadm_t, can_relabelto_shadow_passwords, (…) userdomain;root シェルからログアウトします。
# logout<sec_adm_user>ユーザーからログアウトします。$ logout Connection to localhost closed.現在のセキュリティーコンテキストを表示します。
# id uid=0(root) gid=0(root) groups=0(root) context=root:sysadm_r:sysadm_t:s0-s15:c0.c1023sysadm_secadmモジュールの有効化を試してください。コマンドは失敗するはずです。# semodule -e sysadm_secadm SELinux: Could not load policy file /etc/selinux/mls/policy/policy.31: Permission denied /sbin/load_policy: Can't load policy: Permission denied libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory). SELinux: Could not load policy file /etc/selinux/mls/policy/policy.31: Permission denied /sbin/load_policy: Can't load policy: Permission denied libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory). semodule: Failed!sysadm_tSELinux タイプに関する詳細の表示を試してください。コマンドは失敗するはずです。# seinfo -xt sysadm_t [Errno 13] Permission denied: '/sys/fs/selinux/policy'
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) ポリシーのセキュアな端末を定義します。
ファイルのデフォルトコンテンツ:
console_device_t
sysadm_tty_device_t
user_tty_device_t
staff_tty_device_t
auditadm_tty_device_t
secureadm_tty_device_t
端末タイプをセキュアな端末リストに追加すると、システムがセキュリティーリスクにさらされる可能性があります。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 - すでにセキュアな端末から接続しているか、SELinux が Permissive モードである。
セキュリティー管理者権限が割り当てられている。以下のいずれかに割り当てます。
-
secadm_rロール。 -
sysadm_secadmモジュールが有効になっている場合は、sysadm_rロール。sysadm_secadmモジュールはデフォルトで有効になっています。
-
-
policycoreutils-python-utilsパッケージがインストールされている。
手順
現在の端末タイプを確認します。
# ls -Z `tty` root:object_r:user_devpts_t:s0 /dev/pts/0この出力例では、
user_devpts_tが現在の端末タイプです。-
/etc/selinux/mls/contexts/securetty_typesファイルの新しい行に、関連する SELinux タイプを追加します。 オプション: SELinux を強制モードに切り替えます。
# setenforce 1
検証
-
/etc/selinux/mls/contexts/securetty_typesファイルに追加した、以前はセキュアでなかった端末からログインします。
6.10. MLS ユーザーによる下位レベルのファイルの編集を許可する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MLS ユーザーは、クリアランス範囲の下限値を下回る機密レベルのファイルに書き込むことはできません。シナリオで、ユーザーによる下位レベルのファイルの編集を許可する必要がある場合は、ローカル SELinux モジュールを作成することで実行できます。ただし、ファイルへの書き込みにより、機密レベルがユーザーの現在の範囲の下限まで上昇します増加します。
前提条件
-
SELinux ポリシーが
mlsに設定されている。 -
SELinux モードが
Enforcingに設定されている。 -
policycoreutils-python-utilsパッケージがインストールされている。 -
検証用の
setools-consoleパッケージおよびauditパッケージ。
手順
オプション: トラブルシューティングを実施しやすくするために、Permissive モードに切り替えます。
# setenforce 0~/local_mlsfilewrite.cilなどのテキストエディターで新しい.cilファイルを開き、以下のカスタムルールを挿入します。(typeattributeset mlsfilewrite (_staff_t_))staff_tは、別の SELinux タイプに置き換えることができます。ここで SELinux タイプを指定することで、下位レベルのファイルを編集できる SELinux ロールを制御できます。ローカルモジュールをより適切に整理するには、ローカル SELinux ポリシーモジュール名で接頭辞
local_を使用します。ポリシーモジュールをインストールします。
# semodule -i ~/local_mlsfilewrite.cil注記ローカルポリシーモジュールを削除するには、
semodule -r ~/local_mlsfilewriteを使用します。モジュール名を参照する場合は、接頭辞.cilなしで参照する必要がある点に注意してください。オプション: 以前に permissive モードに戻した場合は、enforcing モードに戻ります。
# setenforce 1
検証
インストールされている SELinux モジュールのリストでローカルモジュールを検索します。
# semodule -lfull | grep "local_mls" 400 local_mlsfilewrite cilローカルモジュールの優先度は
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
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以下のルールを挿入します。
(typeattributeset mcs_constrained_type (user_t))ポリシーモジュールをインストールします。
# semodule -i local_mcs_user.cil
検証
各ユーザードメインに、すべてのコンポーネントの詳細を表示します。
# 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;
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ポリシーの
setrans.confファイルで、構文s_<security level>_:c_<category number>_=<category.name>を使用して、シナリオで必要なカテゴリーの組み合わせを定義します。以下に例を示します。s0:c0=Marketing s0:c1=Finance s0:c2=Payroll s0:c3=Personnel-
カテゴリー番号は、
c0からc1023まで使用できます。 -
targetedポリシーでは、s0セキュリティーレベルを使用します。 -
mlsポリシーでは、機密レベルとカテゴリーの組み合わせにラベルを付けることができます。
-
カテゴリー番号は、
-
必要に応じて、
setrans.confファイル内で、MLS 機密レベルにラベルを付けることもできます。 - ファイルを保存し、終了します。
変更を有効にするには、MCS 変換サービスを再起動します。
# systemctl restart mcstrans
検証
現在のカテゴリーを表示します。
# chcat -L上の例の出力は、以下となります。
s0:c0 Marketing s0:c1 Finance s0:c2 Payroll s0:c3 Personnel s0 s0-s0:c0.c1023 SystemLow-SystemHigh s0:c0.c1023 SystemHigh
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>setrans.confファイルで定義されているように、c0からc1023までのカテゴリー番号またはカテゴリーラベルを使用します。詳細は、MCS でのカテゴリーラベルの定義 を参照してください。Linux ユーザーに MCS カテゴリーを割り当てます。指定できるのは、関連する SELinux ユーザーに定義された範囲内でのみです。
# semanage login -m -rs0:c1 <Linux.user1>注記chcatコマンドを使用して、Linux ユーザーにカテゴリーを追加または削除できます。以下の例では、<category1>を追加し、<Linux.user1>および<Linux.user2>から<category2>を削除します。# chcat -l -- +<category1>,-<category2> <Linux.user1>,<Linux.user2>-<category>構文を使用する前に、コマンドラインで--を指定する必要があります。指定しないと、chcatコマンドは、カテゴリーの削除をコマンドオプションであると誤って解釈します。
検証
Linux ユーザーに割り当てられているカテゴリーのリストを表示します。
# chcat -L -l <Linux.user1>,<Linux.user2> <Linux.user1>: <category1>,<category2> <Linux.user2>: <category1>,<category2>
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>setrans.confファイルで定義されているように、c0からc1023までのカテゴリー番号またはカテゴリーラベルを使用します。詳細は、MCS でのカテゴリーラベルの定義 を参照してください。同じ構文を使用して、ファイルからカテゴリーを削除できます。
$ chcat -- -<category1>,-<category2> <path/to/file1>注記カテゴリーを削除する場合は、コマンドラインで
--を指定してから-<category>構文を使用する必要があります。指定しないと、chcatコマンドは、カテゴリーの削除をコマンドオプションであると誤って解釈します。
検証
ファイルのセキュリティーコンテキストを表示して、カテゴリーが正しいことを確認します。
$ ls -lZ <path/to/file> -rw-r--r-- <LinuxUser1> <Group1> root:object_r:user_home_t:_<sensitivity>_:_<category>_ <path/to/file>ファイルの特定のセキュリティーコンテキストは異なる場合があります。
(必要に応じて) ファイルと同じカテゴリーに割り当てられていない Linux ユーザーとしてログインしたときに、ファイルにアクセスしようとします。
$ cat <path/to/file> cat: <path/to/file>: Permission Denied
第8章 カスタム SELinux ポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
SELinux によって制限されたアプリケーションを実行するには、カスタムポリシーを作成して使用する必要があります。
8.2. カスタムアプリケーション用の SELinux ポリシーの作成および実施 リンクのコピーリンクがクリップボードにコピーされました!
SELinux によってアプリケーションを制限することで、ホストシステムとユーザーのデータのセキュリティーを強化できます。各アプリケーションには特定の要件があるため、ユースケースに応じてこの手順を変更してください。ここでは例として、単純なデーモンを制限する SELinux ポリシーを作成します。
前提条件
-
selinux-policy-develパッケージとその依存関係がシステムにインストールされている。
手順
この手順例では、
/var/log/messagesファイルを開いて書き込みを行う簡単なデーモンを準備します。新しいファイルを作成して、選択したテキストエディターで開きます。
$ vi mydaemon.c以下のコードを挿入します。
#include <unistd.h> #include <stdio.h> FILE *f; int main(void) { while(1) { f = fopen("/var/log/messages","w"); sleep(5); fclose(f); } }ファイルをコンパイルします。
$ gcc -o mydaemon mydaemon.cデーモンの
systemdユニットファイルを作成します。$ vi mydaemon.service [Unit] Description=Simple testing daemon [Service] Type=simple ExecStart=/usr/local/bin/mydaemon [Install] WantedBy=multi-user.targetデーモンをインストールして起動します。
# cp mydaemon /usr/local/bin/ # cp mydaemon.service /usr/lib/systemd/system # systemctl start mydaemon # systemctl status mydaemon ● mydaemon.service - Simple testing daemon Loaded: loaded (/usr/lib/systemd/system/mydaemon.service; disabled; vendor preset: disabled) Active: active (running) since Sat 2020-05-23 16:56:01 CEST; 19s ago Main PID: 4117 (mydaemon) Tasks: 1 Memory: 148.0K CGroup: /system.slice/mydaemon.service └─4117 /usr/local/bin/mydaemon May 23 16:56:01 localhost.localdomain systemd[1]: Started Simple testing daemon.新しいデーモンが SELinux によって制限されていないことを確認します。
$ ps -efZ | grep mydaemon system_u:system_r:unconfined_service_t:s0 root 4117 1 0 16:56 ? 00:00:00 /usr/local/bin/mydaemon
デーモンのカスタムポリシーを生成します。
$ sepolicy generate --init /usr/local/bin/mydaemon Created the following files: /home/example.user/mysepol/mydaemon.te # Type Enforcement file /home/example.user/mysepol/mydaemon.if # Interface file /home/example.user/mysepol/mydaemon.fc # File Contexts file /home/example.user/mysepol/mydaemon_selinux.spec # Spec file /home/example.user/mysepol/mydaemon.sh # Setup Script直前のコマンドで作成した設定スクリプトを使用して、新しいポリシーモジュールでシステムポリシーを再構築します。
# ./mydaemon.sh Building and Loading Policy + make -f /usr/share/selinux/devel/Makefile mydaemon.pp Compiling targeted mydaemon module Creating targeted mydaemon.pp policy package rm tmp/mydaemon.mod.fc tmp/mydaemon.mod + /usr/sbin/semodule -i mydaemon.pp ...restoreconコマンドを使用して、設定スクリプトがファイルシステムの対応する部分の再ラベル付けを行うことに注意してください。restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/systemデーモンを再起動して、SELinux が制限のあるデーモンを実行していることを確認します。
# 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/mydaemonデーモンは SELinux によって制限されているため、SELinux はこのデーモンが
/var/log/messagesにアクセスできないようにします。対応する拒否メッセージを表示します。# 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 ...sealertツールを使用して追加情報を取得することもできます。$ sealert -l "*" SELinux is preventing mydaemon from open access on the file /var/log/messages. ***** Plugin catchall (100. confidence) suggests ************************** If you believe that mydaemon should be allowed open access on the messages 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 'mydaemon' --raw | audit2allow -M my-mydaemon # semodule -X 300 -i my-mydaemon.pp Additional Information: Source Context system_u:system_r:mydaemon_t:s0 Target Context unconfined_u:object_r:var_log_t:s0 Target Objects /var/log/messages [ file ] Source mydaemon …audit2allowツールを使用して、変更を提案します。$ ausearch -m AVC -ts recent | audit2allow -R require { type mydaemon_t; } #============= mydaemon_t ============== logging_write_generic_logs(mydaemon_t)audit2allowが提案するルールは特定のケースでは正しくない可能性があるため、出力の一部のみを使用して対応するポリシーインターフェイスを見つけます。macro-expanderツールを使用してlogging_write_generic_logs (mydaemon_t)マクロを検査し、マクロが提供するすべての許可ルールを確認します。$ macro-expander "logging_write_generic_logs(mydaemon_t)" allow mydaemon_t var_t:dir { getattr search open }; allow mydaemon_t var_log_t:dir { getattr search open read lock ioctl }; allow mydaemon_t var_log_t:dir { getattr search open }; allow mydaemon_t var_log_t:file { open { getattr write append lock ioctl } }; allow mydaemon_t var_log_t:dir { getattr search open }; allow mydaemon_t var_log_t:lnk_file { getattr read };ここでは、提案されたインターフェイスを使用できます。このインターフェイスは、ログファイルとその親ディレクトリーへの読み取りおよび書き込みアクセスのみを提供するためです。Type Enforcement ファイルに対応するルールを追加します。
$ echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.teまたは、インターフェイスを使用する代わりに、このルールを追加することもできます。
$ echo "allow mydaemon_t var_log_t:file { open write getattr };" >> mydaemon.teポリシーを再インストールします。
# ./mydaemon.sh Building and Loading Policy + make -f /usr/share/selinux/devel/Makefile mydaemon.pp Compiling targeted mydaemon module Creating targeted mydaemon.pp policy package rm tmp/mydaemon.mod.fc tmp/mydaemon.mod + /usr/sbin/semodule -i mydaemon.pp ...
検証
アプリケーションが SELinux によって制限されて実行されていることを確認します。以下に例を示します。
$ ps -efZ | grep mydaemon system_u:system_r:mydaemon_t:s0 root 8150 1 0 17:18 ? 00:00:00 /usr/local/bin/mydaemonカスタムアプリケーションが SELinux 拒否を生じさせないことを確認します。
# ausearch -m AVC -ts recent <no matches>
第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 udicaudicaを含むコンテナーソフトウェアパッケージセットを提供するcontainer-toolsモジュールをインストールします。# yum module install -y container-tools/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コンテナーは、SELinux のタイプが
container_tで実行されることに注意してください。このタイプは、SELinux ポリシー内のすべてのコンテナーの汎用ドメインであり、シナリオに対して厳密すぎるか緩すぎる可能性があります。新しいターミナルを開き、
podman psコマンドを入力して、コンテナーの ID を取得します。# 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_lewinコンテナーの JSON ファイルを作成し、
udicaを使用して JSON ファイルの情報に基づいてポリシーモジュールを作成します。# podman inspect 37a3635afb8f > container.json # udica -j container.json my_container Policy my_container with container id 37a3635afb8f created! […]または、次のようになります。
# podman inspect 37a3635afb8f | udica my_container Policy my_container with container id 37a3635afb8f created! Please load these modules using: # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil} Restart the container with: "--security-opt label=type:my_container.process" parameter前の手順の
udicaの出力で提案されているように、ポリシーモジュールを読み込みます。# semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}コンテナーを停止し、
--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
検証
コンテナーが、
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 bashSELinux が、マウントポイント
/homeおよび/var/spoolへのアクセスを許可していることを確認します。[root@37a3635afb8f /]# cd /home [root@37a3635afb8f home]# ls username [root@37a3635afb8f ~]# cd /var/spool/ [root@37a3635afb8f spool]# touch test [root@37a3635afb8f spool]#SELinux がポート 21 へのバインドのみを許可していることを確認します。
[root@37a3635afb8f /]# yum install nmap-ncat [root@37a3635afb8f /]# nc -lvp 21 … Ncat: Listening on :::21 Ncat: Listening on 0.0.0.0:21 ^C [root@37a3635afb8f /]# nc -lvp 80 … Ncat: bind to :::80: Permission denied. QUITTING.
第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) を作成します。--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Restore SELinux context ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_restore_dirs: - /var/www/ - /etc/サンプル Playbook で指定されている設定は次のとおりです。
selinux_restore_dirs: <list>- ロールによって SELinux コンテキストをリセットするディレクトリーのリストを定義します。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.selinux/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
コンテキストをリセットしたファイルまたはディレクトリーの SELinux コンテキストを表示します。たとえば、
/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/
10.2. selinux RHEL システムロールを使用した SELinux ネットワークポートラベルの管理 リンクのコピーリンクがクリップボードにコピーされました!
標準以外のポートでサービスを実行する場合は、このポートに対応する SELinux タイプラベルを設定する必要があります。これにより、サービスが標準以外のポートでリッスンしようとする際に、そのサービスへの許可が SELinux によって拒否されなくなります。selinux RHEL システムロールを使用すると、このタスクを自動化し、ポートにタイプラベルをリモートで割り当てることができます。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。
手順
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Set http_port_t label on network port ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_ports: - ports: <port_number> proto: tcp setype: http_port_t state: presentサンプル 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このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
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, 9000
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) を作成します。--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Deploying a SELinux module ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_modules: - path: <module_file> priority: <value> state: enabledサンプル 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このコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook ~/playbook.yml
検証
SELinux モジュールのリストをリモートで表示し、Playbook で使用したモジュールをフィルタリングします。
# ansible managed-node-01.example.com -m shell -a 'semodule -l | grep <module>'モジュールがリストされている場合、そのモジュールはインストールされ、有効になっています。
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設定を含むファイルを新しいシステムにコピーします。
# scp ./my-selinux-settings.mod new-system-hostname:新しいシステムにログインします。
$ ssh root@new-system-hostname新しいシステムに設定をインポートします。
new-system-hostname# semanage import -f ./my-selinux-settings.mod
第11章 ポリインスタンス化されたディレクトリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、すべてのプログラム、サービス、およびユーザーは、一時ストレージとして /tmp、/var/tmp、およびホームディレクトリーを使用します。これにより、これらのディレクトリーは、ファイル名に基づく競合状態攻撃や情報漏洩に対して脆弱になります。/tmp/、/var/tmp/、およびホームディレクトリーをインスタンス化して、これらがすべてのユーザー間で共有されないようにし、各ユーザーの /tmp-inst および /var/tmp/tmp-inst が /tmp および /var/tmp ディレクトリーに個別にマウントされるようにすることができます。
手順
SELinux でポリインスタンス化を有効にする:
# setsebool -P allow_polyinstantiation 1getsebool allow_polyinstantiationコマンドを入力すると、SELinux でポリインスタンス化が有効になっているかどうかを確認できます。必要な権限を使用して、再起動後もデータが永続的になるようにディレクトリー構造を作成します。
# mkdir /tmp-inst /var/tmp/tmp-inst --mode 000SELinux ユーザー部分を含むセキュリティーコンテキスト全体を復元します。
# 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:s0システムで
fapolicydアプリケーション制御フレームワークを使用している場合は、/etc/fapolicyd/fapolicyd.conf設定ファイルでallow_filesystem_markオプションを有効にして、基礎となるファイルシステムがバインドマウントされているときに、fapolicydがファイルアクセスイベントを監視できるようにします。allow_filesystem_mark = 1/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マルチレベルセキュリティー (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
セッションに
pam_namespace.soモジュールが設定されていることを確認します。$ grep namespace /etc/pam.d/login session required pam_namespace.soオプション: クラウドユーザーが SSH キーを使用してシステムにアクセスできるようにします。
-
openssh-keycatパッケージをインストールします。 /etc/ssh/sshd_config.d/ディレクトリーに次の内容のファイルを作成します。AuthorizedKeysCommand /usr/libexec/openssh/ssh-keycat AuthorizedKeysCommandRunAs rootsshd_configのPubkeyAuthentication変数がyesに設定されているかどうかを確認して、公開鍵認証が有効になっていることを確認します。デフォルトでは、sshd_configの行がコメントアウトされているにもかかわらず、PubkeyAuthenticationは yes に設定されています。$ grep -r PubkeyAuthentication /etc/ssh/ /etc/ssh/sshd_config:#PubkeyAuthentication yes
-
ポリインスタンス化を適用する各サービスのモジュールに、
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 [...]
検証
- 非 root ユーザーとしてログインします。ポリインスタンス化が設定される前にログインしていたユーザーは、変更が有効になる前にログアウトしてログインする必要があります。
/tmp/ディレクトリーが/tmp-inst/の下にマウントされていることを確認します。$ findmnt --mountpoint /tmp/ TARGET SOURCE FSTYPE OPTIONS /tmp /dev/vda1[/tmp-inst/<user>] xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquotaSOURCEの出力は環境によって異なります。* 仮想システムでは、/dev/vda_<number>_と表示されます。* ベアメタルシステムでは、/dev/sda_<number>_または/dev/nvme*が表示されます。