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 として起動させる

  1. getenforce を実行して、 SELinux が enforcing モードで実行していることを確認します。
    $ getenforce
    Enforcing
    
    SELinux が enforcing モードで実行している場合は、 getenforce コマンドを実行すると Enforcing が返されます。
  2. which コマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。
    $ which rsync
    /usr/bin/rsync
    
  3. 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
    
  4. これで、デーモンモードで動作させる 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 プロセスを終了してから、次のステップに進みます。
  5. 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 タイプのラベルを付けます。
  6. semanage コマンドを実行し、/etc/rc.d/init.d/rsyncd のコンテキストマッピングを追加します。
    semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
    
  7. このマッピングは /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
    
  8. restorecon コマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。
    restorecon -R -v /etc/rc.d/init.d/rsyncd
    
  9. 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
    
  10. 新しいスクリプトで 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 デーモンに適用できるようになります。
rsyncdrsync_t ドメイン内で実行させる方法について説明してきました。次に、このデーモンをデフォルト以外のポートで適切に実行させる方法について見ていきます。ここでは TCP ポート 10000 を使用します。

デフォルト以外のポートで rsync デーモンを実行する

  1. /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
    
  2. この新しい設定の 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
    
  3. semanage コマンドを実行して、TCP ポート 10000 を rsync_port_t の SELinux ポリシーに追加します。
    # semanage port -a -t rsync_port_t -p tcp 10000
    
  4. これで 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 での動作が許可されるようになりました。