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
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。whichコマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。which rsync
$ which rsync /usr/bin/rsyncCopy to Clipboard Copied! Toggle word wrap Toggle overflow rsyncをデーモンとして実行する場合、/etc/rsyncd.confと言う名前を付けた設定ファイルを使用する必要があります。ここで使用している設定ファイルは非常に簡潔なファイルになっているため、利用できるすべてのオプションが表示されているわけではありません。rsyncデーモンの事例として必要なものを備えているだけです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで、デーモンモードで動作させる rsync 用の簡単な設定ファイルができました。このステップでは、SELinux による保護メカニズムを rsync に適用させるには、
rsync --daemonを実行するだけでは不十分であることを確認します。次の出力を見てみてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最後の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に保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のようにして、このスクリプトにinitrc_exec_tタイプのラベルを付けます。 semanageコマンドを実行し、/etc/rc.d/init.d/rsyncdのコンテキストマッピングを追加します。semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。grep rsync /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:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow restoreconコマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /etc/rc.d/init.d/rsyncd
restorecon -R -v /etc/rc.d/init.d/rsyncdCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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/rsyncdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しいスクリプトで
rsyncdを起動します。rsync が適切にラベル付けした init スクリプトから起動されるようになりました。プロセスはrsync_tとして開始されるようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow これで、rsync がrsync_tドメイン内で実行するようになったため、SELinux ではその保護メカニズムをrsyncデーモンに適用できるようになります。
rsyncd を rsync_t ドメイン内で実行させる方法について説明してきました。次に、このデーモンをデフォルト以外のポートで適切に実行させる方法について見ていきます。ここでは TCP ポート 10000 を使用します。
デフォルト以外のポートで rsync デーモンを実行する
/etc/rsyncd.confファイルを変更して、port = 10000の行をグローバル設定エリア内にあるファイルの冒頭に追加します (file エリアが定義される直前)。新しい設定ファイルは次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この新しい設定の 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
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-18855b5c2de8Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanageコマンドを実行して、TCP ポート 10000 をrsync_port_tの SELinux ポリシーに追加します。semanage port -a -t rsync_port_t -p tcp 10000
# semanage port -a -t rsync_port_t -p tcp 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで TCP ポート 10000 が
rsync_port_tの SELinux ポリシーに追加されました。rsyncdがこのポートで正常に起動し動作するようになります。service rsyncd start
# service rsyncd start Starting rsyncd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow netstat -lnp | grep 10000
# netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsyncCopy to Clipboard Copied! Toggle word wrap Toggle overflow
SELinux のポリシーが修正されたため、
rsyncd による TCP ポート 10000 での動作が許可されるようになりました。