Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
12.4. 設定例
12.4.1. デーモンとして rsync を使用する
Red Hat Enterprise Linux を使用する場合、rsync をデーモンとして使用し、一元的にファイルを格納、継続的に同期しておくためのセントラルサーバーとして複数のクライアントが直接通信を行なえるようにすることができます。以下では、rsync を適切なドメイン内のネットワークソケット全体でデーモンとして実行させようした場合、事前定義された TCP ポート (SELinux ポリシー内) での実行を期待している SELinux がどのような反応を示すかについて見ていきます。次に、非標準のポートでの
rsync
デーモンによる正常な実行を許可するため SELinux を編集する方法について説明していきます。
SELinux ポリシーとローカルのデーモンおよびプロセスに対する制御力を示すため、本例は単一のシステム上で行います。以下に示す例は、rsync に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。rsync に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の rsync ドキュメント を参照してください。ここでは、rsync パッケージ、setroubleshoot-server パッケージ、audit パッケージがインストールされていること、SELinux targeted ポリシーを使用していること、SELinux が enforcing モードで実行されていることを前提としています。
rsync を rsync_t として起動させる
getenforce
を実行して、 SELinux が enforcing モードで実行していることを確認します。$ getenforce Enforcing
SELinux が enforcing モードで実行している場合は、getenforce
コマンドを実行するとEnforcing
が返されます。which
コマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。$ which rsync /usr/bin/rsync
rsync
をデーモンとして実行する場合、/etc/rsyncd.conf
と言う名前を付けた設定ファイルを使用する必要があります。ここで使用している設定ファイルは非常に簡潔なファイルになっているため、利用できるすべてのオプションが表示されているわけではありません。rsync
デーモンの事例として必要なものを備えているだけです。log file = /var/log/rsync.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock [files] path = /srv/files comment = file area read only = false timeout = 300
- これで、デーモンモードで動作させる rsync 用の簡単な設定ファイルができました。このステップでは、SELinux による保護メカニズムを rsync に適用させるには、
rsync --daemon
を実行するだけでは不十分であることを確認します。次の出力を見てみてください。# rsync --daemon # ps x | grep rsync 8231 ? Ss 0:00 rsync --daemon 8233 pts/3 S+ 0:00 grep rsync # ps -eZ | grep rsync unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 8231 ? 00:00:00 rsync
最後のps
コマンドからの出力に注目してください。コンテキストではrsync
デーモンはunconfined_t
デーモン内で実行していることを示しています。つまり、rsync がrsync --daemon
コマンドで起動されたため、rsync_t
には遷移していないということです。この状態では、SELinux はこのデーモンに対してルールとポリシーを施行することができません。この問題を解決するため次のステップを見てみます。次のステップでは、rsync
を適切にラベル付けした init スクリプトから起動させるため、rsync_t
に遷移するようになります。これではじめて SELinux とその保護メカニズムをrsync
に適用できるようになります。rsync
プロセスを終了してから、次のステップに進みます。 - rsync 用のカスタムの init スクリプトには次のステップが必要になります。次を
/etc/rc.d/init.d/rsyncd
に保存します。#!/bin/bash # Source function library. . /etc/rc.d/init.d/functions [ -f /usr/bin/rsync ] || exit 0 case "$1" in start) action "Starting rsyncd: " /usr/bin/rsync --daemon ;; stop) action "Stopping rsyncd: " killall rsync ;; *) echo "Usage: rsyncd {start|stop}" exit 1 esac exit 0
以下のようにして、このスクリプトにinitrc_exec_t
タイプのラベルを付けます。 semanage
コマンドを実行し、/etc/rc.d/init.d/rsyncd
のコンテキストマッピングを追加します。semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
- このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます。# grep rsync /etc/selinux/targeted/contexts/files/file_contexts.local /etc/rc.d/init.d/rsyncd system_u:object_r:initrc_exec_t:s0
restorecon
コマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /etc/rc.d/init.d/rsyncd
ls -lZ
コマンドを実行して、確かにスクリプトに適切なタイプのラベルが付けられているかを確認します。以下の出力では、スクリプトにはinitrc_exec_t
タイプのラベルが付けられています。ls -lZ /etc/rc.d/init.d/rsyncd -rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/rsyncd
- 新しいスクリプトで
rsyncd
を起動します。rsync が適切にラベル付けした init スクリプトから起動されるようになりました。プロセスはrsync_t
として開始されるようになります。# service rsyncd start Starting rsyncd: [ OK ] ps -eZ | grep rsync unconfined_u:system_r:rsync_t:s0 9794 ? 00:00:00 rsync
これで、rsync がrsync_t
ドメイン内で実行するようになったため、SELinux ではその保護メカニズムをrsync
デーモンに適用できるようになります。
rsyncd
を rsync_t
ドメイン内で実行させる方法について説明してきました。次に、このデーモンをデフォルト以外のポートで適切に実行させる方法について見ていきます。ここでは TCP ポート 10000 を使用します。
デフォルト以外のポートで rsync デーモンを実行する
/etc/rsyncd.conf
ファイルを変更して、port = 10000
の行をグローバル設定エリア内にあるファイルの冒頭に追加します (file エリアが定義される直前)。新しい設定ファイルは次のようになります。log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock port = 10000 [files] path = /srv/files comment = file area read only = false timeout = 300
- この新しい設定の init スクリプトから rsync を起動すると、次のような拒否が SELinux によりログ記録されます。
Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages. run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8
semanage
コマンドを実行して、TCP ポート 10000 をrsync_port_t
の SELinux ポリシーに追加します。# semanage port -a -t rsync_port_t -p tcp 10000
- これで TCP ポート 10000 が
rsync_port_t
の SELinux ポリシーに追加されました。rsyncd
がこのポートで正常に起動し動作するようになります。# service rsyncd start Starting rsyncd: [ OK ]
# netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsync
SELinux のポリシーが修正されたため、
rsyncd
による TCP ポート 10000 での動作が許可されるようになりました。