web-dev-qa-db-ja.com

rsyncコマンドがターミナルで機能し、rundeckで失敗する

Rundeckを使用して、Dockerコンテナーボリューム内のファイルをオフサイトサーバーにrsyncしようとしています。 rundeckユーザーになりすまして、ターミナルウィンドウでrsyncコマンドを実行できます。

Rundeckが同じコマンドを実行すると、Unexpected Remote ArgエラーまたはUnexpected Local Argエラーが発生します。 -コマンドのrsync-pathオプション。 -rsync-pathを省略した場合、ファイルがDockerボリュームにあり、ルートアクセスを必要とするため、権限拒否エラーが発生します。

注:コマンドと出力は編集されていますが、それ以外は正確です

ユーザーrundeckとしてrundeckサーバーのターミナルでrsyncコマンド:

rsync -avP rundeck@remotehost:/var/lib/docker/volumes/dockervolumename/_data /srv/destination/backup_datetime --rsync-path="Sudo rsync"

コマンド出力:

receiving incremental file list
created directory /srv/destination/backup_datetime
_data/
_data/storage/
_data/storage/upload/
_data/storage/uploads/
_data/storage/uploads/admin/
_data/storage/uploads/group/

sent 48 bytes  received 203 bytes  100.40 bytes/sec
total size is 0  speedup is 0.00

同じコマンド(ローカルコマンド)のrundeckデバッグ出力:

13:56:50    [workflow] Begin step: 1,NodeDispatch
13:56:50    1: Workflow step executing: StepExecutionItem{type='NodeDispatch', keepgoingOnSuccess=false, hasFailureHandler=false}
13:56:50    preparing for sequential execution on 1 nodes
13:56:50    Executing command on node: localhost, NodeEntryImpl{tags=[], attributes={nodename=localhost, hostname=***, osVersion=8, osFamily=linux, osArch=x64, description=Offsite backup server @ ***, osName=CentOS}, project='null'}
13:56:50    [workflow] beginExecuteNodeStep(localhost): NodeDispatch: StepExecutionItem{type='NodeDispatch', keepgoingOnSuccess=false, hasFailureHandler=false}
13:56:50    LocalExecNodeStepPlugin, running command (6): 'rsync''-avP''rundeck@remotehost:/var/lib/docker/volumes/dockervolumename/_data''/srv/destination/backup_datetime''--rsync-path="Sudo''rsync"'
13:56:50    Unexpected local arg: /srv/destination/backup_datetime
13:56:50    If arg is a remote file/dir, prefix it with a colon (:).
13:56:50    rsync error: syntax or usage error (code 1) at main.c(1368) [Receiver=3.1.3]
13:56:50    Failed: NonZeroResultCode: Result code was 1
13:56:50    [workflow] finishExecuteNodeStep(localhost): NodeDispatch: NonZeroResultCode: Result code was 1
13:56:50    1: Workflow step finished, result: Dispatch failed on 1 nodes: [localhost: NonZeroResultCode: Result code was 1 + {dataContext=MultiDataContextImpl(map={}, base=null)} ]
13:56:50    [workflow] Finish step: 1,NodeDispatch

Rundeckがsshキーを介して宛先サーバーとやり取りし、そこでコマンドを正常に実行できることを確認しました。

私が見逃しているrsyncとrundeckの間に何らかの相互作用がありますか?

Rundeckとrsyncは初めてです。通常、コマンドの構文エラーが原因で発生しているエラーがわかります。元のコマンドはターミナルで正常に実行されるので、rundeckが何らかの形で文字化けしていると思い込んでいます。

ソースサーバーはVM OpenStack環境でCentOS 7を実行しています。

宛先サーバーはVM CentOS 8を外部ネットワークで実行しています。

2

Rsync用のカスタムSELinuxモジュールを作成することをお勧めします。

ユーザーエドワードは、UnixとLinuxのチャネルで この投稿 で見事に終わったと言いました。 SELinuxモジュールの作成方法については、以下を参照してください。

これは、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 domainオプションとgrepコマンドを使用して検索を絞り込みます。例:sesearch --dontaudit -s rsync_t。

私は彼のポストに向かい、これについて彼に信用を与えることを勧めます。

0
Gordster

これはこの問題の完璧な解決策ではないかもしれませんが、SELinuxを強制モードのままにしていても機能するようです。

semanage permissive -a rsync_t

基本的に、残りのSELinuxポリシーはそのままにして、rsyncを寛容な設定で実行させます。

おそらく、より賢い誰かがより良い答えを提案できます。

0