Назад | Перейти на главную страницу

Команда rsync работает в терминале, не работает в rundeck

Я пытаюсь использовать rundeck для файлов rsync в томе контейнера докеров на внешний сервер. Я могу выдать себя за пользователя rundeck и просто запустить команду rsync в окне терминала.

Когда rundeck выполнит ту же команду, я получу Неожиданный удаленный аргумент ошибка или Неожиданный локальный аргумент ошибка в зависимости от того, где я размещаю --rsync-путь параметр в команде. Если я оставлю --rsync-путь Я получаю сообщение об отказе в разрешении, потому что файлы находятся в томе докера и требуют корневого доступа.

Примечание: Команды и вывод были отредактированы, но в остальном точны

Команда rsync в терминале на сервере rundeck от имени пользователя rundeck:

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 каким-то образом искажает ее.

Исходный сервер - это виртуальная машина под управлением CentOS 7 в среде OpenStack.

Целевой сервер - это виртуальная машина с CentOS 8 во внешней сети.

Возможно, это не идеальное решение этой проблемы, но, похоже, оно работает, когда SELinux остается в принудительном режиме.

semanage permissive -a rsync_t

По сути, позвольте rsync работать с разрешающими настройками, оставив остальные политики SELinux на месте.

Возможно, кто-то более умный сможет предложить лучший ответ.

Было бы лучше создать собственный модуль SELinux для rsync.

Пользователь Эдвард красиво сказал об этом на канале Unix и Linux в Эта почта. Ниже приведены инструкции по созданию модуля SELinux.

Это достигается за счет того, что демон rsync может выполнять свою работу в разрешающем режиме, фиксируя отказы 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».

Чтобы перестроить политику SELinux, игнорируя все правила "dontaudit", запустите semodule -DB. Параметр -D отключает правила «не проводить аудит»; параметр -B перестраивает политику.

Затем попробуйте, можете ли вы запускать события журнала аудита. Если это так, захватите их, как я показал выше, создайте модуль SELinux, а затем повторно включите правила «dontaudit», запустив: semodule -B.

Чтобы получить полный список правил "dontaudit", выполните команду sesearch --dontaudit. Сузьте поиск, используя параметр -s domain и команду grep. Например: sesearch --dontaudit -s rsync_t.

Я рекомендую перейти к его посту и отдать ему должное.