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 EnforcingSELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。whichコマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。$ which rsync /usr/bin/rsyncrsyncをデーモンとして実行する場合、/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/rsyncdls -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 での動作が許可されるようになりました。