Я пытаюсь использовать 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.
Я рекомендую перейти к его посту и отдать ему должное.