RHCSAシリーズ:RHEL 7におけるSELinuxの強制アクセス制御エッセンシャル – パート13

このシリーズでは、少なくとも2つのアクセス制御方法について詳しく調査してきました: 標準のugo/rwxパーミッション (ユーザーとグループの管理-パート3) およびアクセス制御リスト (ファイルシステム上のACLの構成-パート7)。

RHCSA Exam: SELinux Essentials and Control FileSystem Access

これらは最初のレベルの権限とアクセス制御メカニズムとして必要ですが、いくつかの制限があり、それにはSecurity Enhanced Linux (通称SELinux) が対処しています。

そのような制限の1つは、ユーザーが不十分に詳細化されたchmodコマンドによってファイルやディレクトリをセキュリティ違反にさらし、予期しないアクセス権の伝播を引き起こすことができるというものです。その結果、そのユーザーが開始したプロセスは、そのユーザーが所有するファイルに対して好きなように行うことができ、最終的には悪意のあるまたは他の方法で侵害されたソフトウェアがシステム全体にルートレベルのアクセスを達成することができます。

これらの制限を考慮すると、アメリカ合衆国国家安全保障局 (NSA) は最初にSELinuxと呼ばれる柔軟な強制アクセス制御方法を考案し、プロセスがシステムオブジェクト (ファイル、ディレクトリ、ネットワークポートなど) にアクセスしたりその他の操作を行う能力を制限し、後で必要に応じて変更できる最小限の権限モデルにしました。要するに、システムの各要素には機能に必要なアクセスのみが与えられます。

RHEL 7では、SELinuxはカーネル自体に組み込まれ、デフォルトでEnforcingモードで有効になっています。この記事では、SELinuxおよびその動作に関連する基本的な概念を簡単に説明します。

SELinuxモード

SELinuxは、次の3つの異なる方法で動作することができます:

  1. Enforcing:SELinuxはSELinuxポリシールールに基づいてアクセスを拒否し、セキュリティエンジンを制御する一連のガイドラインです。
  2. Permissive:SELinuxはアクセスを拒否しませんが、強制モードで実行されていれば拒否された操作についてログが記録されます。
  3. Disabled(自明な意味)。

getenforceコマンドはSELinuxの現在のモードを表示しますが、setenforce1または0に続く)は、現在のセッション中にモードをEnforcingまたはPermissiveに変更するために使用されます。

ログアウトや再起動時に持続させるには、/etc/selinux/configファイルを編集し、SELINUX変数をenforcingpermissive、またはdisabledのいずれかに設定する必要があります:

# getenforce
# setenforce 0
# getenforce
# setenforce 1
# getenforce
# cat /etc/selinux/config
Set SELinux Mode

通常、SELinuxモード(強制から適合に切り替える)をトグルするためにsetenforceを使用します。SELinuxがenforcingに設定されている状態で特定の問題が発生している場合、それをpermissiveに設定すると問題が解消される場合、SELinuxのパーミッションの問題を確認できます。

SELinuxコンテキスト

A SELinux context consists of an access control environment where decisions are made based on SELinux user, role, and type (and optionally a level):

  1. A SELinux user complements a regular Linux user account by mapping it to a SELinux user account, which in turn is used in the SELinux context for processes in that session, in order to explicitly define their allowed roles and levels.
  2. ロールの概念は、ドメインとSELinuxユーザーの間の仲介役として機能し、どのプロセスドメインとファイルタイプにアクセスできるかを定義します。これにより、システムが特権昇格攻撃に対して脆弱になるのを防ぐことができます。
  3. A type defines an SELinux file type or an SELinux process domain. Under normal circumstances, processes are prevented from accessing files that other processes use, and and from accessing other processes, thus access is only allowed if a specific SELinux policy rule exists that allows it.

次の例を通じて、それがどのように機能するかを見てみましょう。

例1: sshdデーモンのデフォルトポートの変更

SSHのセキュリティ強化 – パート8で説明したように、sshdがリッスンするデフォルトポートを変更することは、サーバーを外部攻撃から保護する最初のセキュリティ対策の1つです。/etc/ssh/sshd_configファイルを編集し、ポートを9999に設定しましょう。

Port 9999

変更を保存し、sshdを再起動します。

# systemctl restart sshd
# systemctl status sshd
Restart SSH Service

ご覧の通り、sshdが起動できませんでした。では、何が起こったのでしょうか?

A quick inspection of /var/log/audit/audit.log indicates that sshd has been denied permissions to start on port 9999 (SELinux log messages include the word “AVC” so that they might be easily identified from other messages) because that is a reserved port for the JBoss Management service:

# cat /var/log/audit/audit.log | grep AVC | tail -1
Inspect SSH Logs

この時点でSELinuxを無効にする(しかし、やめてください!)ことを先に説明した通り、sshdを再起動しようとすると、うまくいくはずです。しかし、semanageユーティリティは、sshdを問題なく起動できるようにするために何を変更する必要があるのかを教えてくれます。

実行して、SELinuxがsshdがリッスンできるポートのリストを取得します。

# semanage port -l | grep ssh

Semanage Tool

それでは、/etc/ssh/sshd_configのポートをPort 9998に変更し、ポートをssh_port_tコンテキストに追加して、サービスを再起動しましょう。

# semanage port -a -t ssh_port_t -p tcp 9998
# systemctl restart sshd
# systemctl is-active sshd
Semanage Add Port

こんな感じですね。サービスが今回はうまく起動しました。この例から、SELinuxがTCPポート番号を独自のポートタイプの内部定義にコントロールしていることがわかります。

例2: httpdがsendmailにアクセスを送信することを許可する

これは、SELinuxがプロセスが他のプロセスにアクセスすることを管理する例です。もしあなたがRHEL 7サーバーでApacheと共にmod_securityとmod_evasiveを実装するとしたら、httpdsendmailにアクセスできるようにして、(D)DoS攻撃が発生した際にメール通知を送信できるようにする必要があります。次のコマンドで、再起動時に変更が持続しないようにしたければ-Pフラグを省略してください。

# semanage boolean -1 | grep httpd_can_sendmail
# setsebool -P httpd_can_sendmail 1
# semanage boolean -1 | grep httpd_can_sendmail
Allow Apache to Send Mails

上記の例から、SELinuxブール設定(または単にブール値)は、SELinuxポリシーに埋め込まれた真/偽のルールであることがわかります。すべてのブール値をsemanage boolean -lでリストアップでき、さらにgrepで出力をフィルタリングすることもできます。

例3: デフォルト以外のディレクトリから静的サイトを提供する

たとえば、デフォルトのディレクトリ(/var/www/html)ではなく、/websitesから静的なウェブサイトを提供しているとします(これは、ウェブファイルを共有ネットワークドライブに保存していて、/websitesでマウントする必要がある場合などです)。

a). Create an index.html file inside /websites with the following contents:

<html>
<h2>SELinux test</h2>
</html>

その場合、

# ls -lZ /websites/index.html

index.htmlファイルはdefault_t SELinuxタイプでラベル付けされており、Apacheはアクセスできません:

Check SELinux File Permission

b). Change the DocumentRoot directive in /etc/httpd/conf/httpd.conf to /websites and don’t forget to update the corresponding Directory block. Then, restart Apache.

c). Browse to http://<web server IP address>, and you should get a 503 Forbidden HTTP response.

d). Next, change the label of /websites, recursively, to the httpd_sys_content_t type in order to grant Apache read-only access to that directory and its contents:

# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"

e). Finally, apply the SELinux policy created in d):

# restorecon -R -v /websites

Apacheを再起動し、http://<web server IP address>にブラウズして、htmlファイルが正しく表示されるのを確認してください:

Verify Apache Page

概要

この記事では、SELinuxの基本を説明しました。このトピックは広範囲なため、詳細な説明を1つの記事で行うことはできませんが、このガイドで概説した原則が、より高度なトピックに進む際に役立つと信じています。

始めるための2つの重要なリソースをお勧めします: NSA SELinuxページRHEL 7 SELinuxユーザーおよび管理者ガイド

ご質問やコメントがある場合は、遠慮なくお知らせください。

Source:
https://www.tecmint.com/selinux-essentials-and-control-filesystem-access/