RHCSAシリーズ:RHEL7のSELinuxでの必須アクセス制御の要点-パート13


このシリーズでは、少なくとも2つのアクセス制御方法について詳しく説明しました。標準のugo/rwxアクセス許可(ユーザーとグループの管理–パート3)とアクセス制御リスト(ファイルシステムでのACLの構成–パート7)です。

第1レベルのアクセス許可およびアクセス制御メカニズムとして必要ですが、Security Enhanced Linux(略してSELinux)によって対処されるいくつかの制限があります。

このような制限の1つは、ユーザーがファイルまたはディレクトリを、巧妙に作成されていないchmodコマンドを介してセキュリティ違反にさらし、予期しないアクセス権の伝播を引き起こす可能性があることです。その結果、そのユーザーが開始したプロセスは、ユーザーが所有するファイルを自由に操作でき、最終的には悪意のあるソフトウェアやその他の方法で侵害されたソフトウェアがシステム全体へのルートレベルのアクセスを実現できます。

これらの制限を念頭に置いて、米国国家安全保障局(NSA)は、システムオブジェクト(ファイル、ディレクトリ、ネットワークポートなど)で他の操作にアクセスまたは実行するプロセスの機能を制限するために、柔軟な強制アクセス制御方法であるSELinuxを最初に考案しました。 、など)最小アクセス許可モデルに変更します。これは、必要に応じて後で変更できます。つまり、システムの各要素には、機能するために必要なアクセスのみが与えられます。

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

SELinuxモード

SELinuxは、次の3つの異なる方法で動作できます。

  1. Enforcing: SELinux denies access based on SELinux policy rules, a set of guidelines that control the security engine.
  2. Permissive: SELinux does not deny access, but denials are logged for actions that would have been denied if running in enforcing mode.
  3. Disabled (self-explanatory).

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

ログアウトと再起動の間で永続性を実現するには、/etc/selinux/config ファイルを編集し、SELINUX変数を強制、許可、または無効のいずれかに設定する必要があります。

# getenforce
# setenforce 0
# getenforce
# setenforce 1
# getenforce
# cat /etc/selinux/config

通常、最初のトラブルシューティング手順として、setenforceを使用してSELinuxモードを切り替えます(許可と戻るを強制します)。特定の問題が発生しているときにSELinuxが現在強制に設定されており、許容に設定すると同じことがなくなる場合は、SELinuxのアクセス許可の問題を確認していると確信できます。

SELinuxコンテキスト

SELinuxコンテキストは、SELinuxユーザー、ロール、およびタイプ(およびオプションでレベル)に基づいて決定が行われるアクセス制御環境で構成されます。

  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. The concept of role acts as an intermediary between domains and SELinux users in that it defines which process domains and file types can be accessed. This will shield your system against vulnerability to privilege escalation attacks.
  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.

次の例で、これらすべてがどのように機能するかを見てみましょう。

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

Port 9999

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

# systemctl restart sshd
# systemctl status sshd

ご覧のとおり、sshdは起動に失敗しました。しかし何が起こった?

/var/log/audit/audit.log を簡単に調べると、sshdがポート9999で開始する権限を拒否されていることがわかります(SELinuxログメッセージには「AVC」という単語が含まれているため、簡単に識別できます)他のメッセージから)これはJBoss Managementサービス用に予約されたポートであるため:

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

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

実行、

# semanage port -l | grep ssh

SELinuxがsshdにリッスンを許可するポートのリストを取得します。

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

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

ご覧のとおり、今回はサービスが正常に開始されました。この例は、SELinuxがTCPポート番号を独自のポートタイプの内部定義に制御するという事実を示しています。

これは、別のプロセスにアクセスするプロセスを管理するSELinuxの例です。 RHEL 7サーバーにApacheとともにmod_securityとmod_evasiveを実装する場合、(D)DoS攻撃を受けてメール通知を送信するには、httpdがsendmailにアクセスできるようにする必要があります。次のコマンドで、再起動後も変更を保持したくない場合は、-Pフラグを省略します。

# semanage boolean -1 | grep httpd_can_sendmail
# setsebool -P httpd_can_sendmail 1
# semanage boolean -1 | grep httpd_can_sendmail

上記の例からわかるように、SELinuxブール設定(または単にブール値)は、SELinuxポリシーに埋め込まれたtrue/falseルールです。 semanage boolean -l を使用してすべてのブール値を一覧表示するか、出力をフィルタリングするためにgrepにパイプすることができます。

デフォルトのディレクトリ(/var/www/html )とは異なるディレクトリを使用して静的なWebサイトを提供しているとします。たとえば、/ website(これは、Webファイルをたとえば、共有ネットワークドライブであり、/ websiteにマウントする必要があります)。

a)。次の内容で/ websites内にindex.htmlファイルを作成します。

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

もしあなたがそうするなら、

# ls -lZ /websites/index.html

index.htmlファイルがdefault_tSELinuxタイプでラベル付けされていることがわかります。これは、Apacheがアクセスできません。

b)。 /etc/httpd/conf/httpd.conf のDocumentRootディレクティブを/ websitesに変更し、対応するDirectoryブロックを更新することを忘れないでください。次に、Apacheを再起動します。

c)。 http:// を参照すると、503 ForbiddenHTTP応答が返されます。

d)。次に、Apacheにそのディレクトリとそのコンテンツへの読み取り専用アクセスを許可するために、/ websitesのラベルを再帰的にhttpd_sys_content_tタイプに変更します。

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

e)。最後に、d)で作成したSELinuxポリシーを適用します。

# restorecon -R -v /websites

次に、Apacheを再起動し、 http:// を再度参照すると、htmlファイルが正しく表示されます。

概要

この記事では、SELinuxの基本について説明しました。主題が広大であるため、1つの記事で完全な詳細な説明を行うことはできませんが、このガイドで概説されている原則は、必要に応じてより高度なトピックに進むのに役立つと考えています。

可能であれば、最初に2つの重要なリソースをお勧めします。NSASELinuxページとRHEL 7SELinuxユーザーおよび管理者ガイドです。

ご不明な点やご意見がございましたら、お気軽にお問い合わせください。