web-dev-qa-db-ja.com

selinuxポリシーを適用するrsyncデーモンrsync_export_all_roは、/ var / pool / postfix / private /の下のファイルへのアクセスを引き続き防止します。

rsyncを使用して定期的にバックアップされるDebianベースのシステムがいくつかあります。いくつかの理由で、小さなCentOS 7サーバーを展開する必要があり、それをバックアップスケジュールに追加したいと考えています。 rsync oversshを使用してバックアップすることはできません。代わりに、rsyncデーモンを使用する必要があります。

CentOSではSELinuxが強制モードで有効になっているため、急な学習曲線に陥ります。

rsyncd構成セクション(簡略化)

[root]
    comment = Filesystem
    path = /
    exclude = /proc/*** /run/*** /sys/*** [...]
    read only = yes
    list = yes
    uid = root
    secrets file = [...]
    ignore errors = no
    ignore nonreadable = no
    refuse options = delete

プロセスには正しくラベルが付けられていると思います。

ps -eZ | grep rsync
system_u:system_r:rsync_t:s0    26020 ?        00:00:00 rsync

最初に、rsyncデーモンを介したバックアップの試行は、SELinuxラベルに起因するあらゆる種類の権限エラーで失敗しました。さらに掘り下げるI 参照が見つかりましたrsyncデーモンがすべてのファイルを読み取り専用でエクスポートすることを許可するSELinuxポリシーへ:

setsebool -P rsync_export_all_ro 1

これはこのセットになります

getsebool -a | grep '^rsync'
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> on
rsync_full_access --> off

残念ながら、これでもシステム上のすべてのファイルにアクセスできるわけではありません。具体的には、/var/spool/postfix/privateの下に読み取り不可能なファイルがいくつかあります。

rsync: readlink_stat("/var/spool/postfix/private/defer" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/trace" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/verify" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/proxymap" (in root)) failed: Permission denied (13)
...

/var/spool/postfix/privateaudit2why -aに関連する1つのサンプルエントリを次に示します。どのエントリもrsync_export_all_roを参照していないことに注意してください。

type=AVC msg=audit(1565118203.332:21775): avc:  denied  { getattr } for  pid=26597 comm="rsync" path="/var/spool/postfix/private/scache" dev="dm-0" ino=9148374 scontext=system_u:system_r:rsync_t:s0 tcontext=system_u:object_r:postfix_private_t:s0 tclass=sock_file permissive=0
        Was caused by:
        The boolean rsync_full_access was set incorrectly.
        Description:
        Allow rsync to full access

        Allow access by executing:
        # setsebool -P rsync_full_access 1

rsync_full_accessへの参照(設定したくないため、トリガーしないでください)がある理由はわかりませんが、rsync_export_all_roへの参照はありません。

完全なバックアップを取得するために、このディレクトリツリーをrsyncデーモンでエクスポートできるファイルのセットに追加するにはどうすればよいですか? (そしてこの変更が再起動後も持続するために。)

3
roaima

rsync_tドメインのSELinuxを無効にしたくないのは当然です。残念ながら、rsyncのSELinux実装の configurability はかなり広範囲ですが、rsync_export_all_roブール値を設定してもnotrsyncデーモンが特定のファイルにアクセスできるようにします。 1つのBugzillaエントリ があります。これはあなたのトラブルによく似ています。そこに与えられた提案は、セキュリティを損なうものの、問題を克服するためにrsync_full_accessを使用することです(ただし、semanage permissive -a rsync_tよりも優れています)。

カスタムポリシーモジュールの作成

したがって、質問に答えるために、より安全なオプションrsync_export_all_roを使用する場合は、rsyncデーモンに "Edgeケース」ファイル/ディレクトリの場合、独自のポリシーモジュールを作成する必要があります。

これは、rsyncデーモンにpermissiveモードで動作させ、AVC拒否をキャプチャし、AVC拒否をポリシーに変換することで行われます。

# put SELinux in permissive mode
setenforce 0

# --- do your rsync stuff ---

# get related AVC denials
# I'm using 'recent' here, depending on the rsync run time please adjust accordingly
ausearch -m avc -ts recent --subject rsync_t

# go through the output. If you're satisfied, create the module
ausearch -m avc -ts recent --subject rsync_t | audit2allow -m roaima-rsync-custom-1 > roaima-rsync-custom-1.te
checkmodule -M -m -o roaima-rsync-custom-1.mod roaima-rsync-custom-1.te
semodule_package -o roaima-rsync-custom-1.pp -m roaima-rsync-custom-1.mod

# load the policy module
semodule -i roaima-rsync-custom-1.pp

# disable permissive mode
setenforce 1

# --- do your rsync stuff again --

監査されないAVC拒否のキャッチ( "dontaudit")

何らかの理由で「エッジケース」ファイルにまだアクセスできず、ausearchコマンドで結果が得られない場合は、「dontaudit」ルールが適用されている可能性があります。

すべての「dontaudit」ルールを無視してSELinuxポリシーを再構築するには、semodule -DBを実行します。 -Dオプションは「dontaudit」ルールを無効にします。 -Bオプションはポリシーを再構築します。

次に、監査ログイベントをトリガーできるかどうかを試してください。その場合は、上記で示したようにそれらをキャプチャし、SELinuxモジュールを作成してから、semodule -Bを実行して「dontaudit」ルールを再度有効にします。

「dontaudit」ルールの完全なリストについては、sesearch --dontauditコマンドを実行してください。 -sドメインオプションとgrepコマンドを使用して検索を絞り込みます。例:sesearch --dontaudit -s rsync_t

3
Edward