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/private
のaudit2why -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
デーモンでエクスポートできるファイルのセットに追加するにはどうすればよいですか? (そしてこの変更が再起動後も持続するために。)
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 --
何らかの理由で「エッジケース」ファイルにまだアクセスできず、ausearch
コマンドで結果が得られない場合は、「dontaudit」ルールが適用されている可能性があります。
すべての「dontaudit」ルールを無視してSELinuxポリシーを再構築するには、semodule -DB
を実行します。 -D
オプションは「dontaudit」ルールを無効にします。 -B
オプションはポリシーを再構築します。
次に、監査ログイベントをトリガーできるかどうかを試してください。その場合は、上記で示したようにそれらをキャプチャし、SELinuxモジュールを作成してから、semodule -B
を実行して「dontaudit」ルールを再度有効にします。
「dontaudit」ルールの完全なリストについては、sesearch --dontaudit
コマンドを実行してください。 -s
ドメインオプションとgrep
コマンドを使用して検索を絞り込みます。例:sesearch --dontaudit -s rsync_t
。