Я знаю, что это старый пост, но на всякий случай, он может помочь другим людям...
Вы должны различать 2 вещи:
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
|
| sudo su jenkins
|
v
jenkins
Допустим, вы хотите выполнить rsync:
srcmachine
srcuser
/var/lib/jenkins
destmachine
destuser
по устанавливают соединение SSH . /tmp
jenkins
. rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
--rsync-path=PROGRAM specify the rsync to run on the remote machine
Хитрость заключается в том, чтобы указать запустить rsync
на удаленной машине с другим пользователем (jenkins
), а не с тем, который устанавливает SSH-соединение(destuser
).
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
Не забудьте ограничить права на~/.ssh
:
chmod 700 ~/.ssh
destuser
У destuser
должны быть права на выполнение sudo -u jenkins rsync
.
Как правило, мы устанавливаем destuser
как член sudoers
. Для этого на root
@destmachine
:
cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF
Чтобы проверить это до rsync
, вы можете войти в destuser
@ destmachine
и запустить это:
sudo su jenkins
echo $USER
Если возвращается:
jenkins
это означает, что вы вошли в систему как пользователь jenkins
, и это означает, что ваша команда rsync
также будет работать, потому что работает привилегия перехода к jenkins
.
jenkins
Почему бы нам просто не сделать это?
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> jenkins
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
, потому что jenkins
является «служебной» учетной записью, что означает, что она запускает службу, которая предоставляет порт(80
или около того )для внешнего HTTP-доступа,и это означает, что ВОЗМОЖНО, что существует нарушение безопасности через службу Jenkins через HTTP для получения доступа.
Вот почему у нас есть www-data
пользователь и ему подобные для запуска различных служб. Если их взломают через открытые порты, они мало что смогут сделать:
/var/log/THE_SERVICE
. Таким образом, предоставление доступа по SSH для пользователя jenkins
подвергает поверхностной атаке (, и то же самое относится к доступу по SSH как root
!! ).
Кроме того, если вы хотите выполнить rsync от имени другого пользователя (root
, www-data
и т. д. ), вам придется скопировать открытый ключ SSH-ключа в эти учетные записи (проблемные ).
Хорошее решение:Вы должны установить SSH-доступ как можно меньшему количеству учетных записей пользователей (destuser
), которые МОГУТ эскалировать до нужной вам «служебной» учетной записи (jenkins
, root
и т. д. ).