Estoy trabajando con dos instancias de ubuntu en AWS (que uso una clave pem para acceder a ellas).
Configuré rsync para ambas instancias y funciona si uso el usuario predeterminado que es ubuntu@ipaddress. Sin embargo, si intento usar rsync con otro usuario (estoy escribiendo, sudo su - jenkins
por ejemplo, o incluso escribiendo sudo
antes del comando rsync), aparece el siguiente error.
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]
Pasos que he tomado:
Intenté crear una clave ssh (usando ssh-keygen) mientras estaba conectado jenkins
y la agregué al authorized_keys
archivo tanto en /home/ubuntu/.ssh/authorized_keys
(desde donde estoy ejecutando rsync) como incluso $JENKINS_HOME/.ssh/authorized_keys
(donde también intenté ejecutar rsync desde allí).
Incluso intenté usar la tecla pem para hacer lo mismo y tampoco funcionó.
Esto es lo que estoy tratando de ejecutar
rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins
Y aquí está el archivo clave.
rsync -avuh --delete -e 'ssh -i path/to/key.pem' [email protected]:/var/lib/jenkins/* /var/lib/jenkins
PD: La única razón por la que no quiero ejecutarlo con el usuario de ubuntu es porque me meto failed: Permission denied (13)
en muchas cosas (ya que los archivos son propiedad de jenkins).
Objetivo final:
Estoy tratando de mantener una copia de seguridad constante de la instancia de jenkins de respaldo con la instancia principal haciendo un cronjob:
*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins
Respuesta1
Hay que diferenciar 2 cosas:
- OMSestablece la conexión SSH.
- cualel usuario remoto es propietario de los archivosque quieres copiar.
Descripción general
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
|
| sudo su jenkins
|
v
jenkins
Digamos que quieres rsync:
- De:
- Máquina:
srcmachine
- Usuario:
srcuser
- Directorio:
/var/lib/jenkins
- Máquina:
- A:
- Máquina:
destmachine
- Usuario:
destuser
aestablecer la conexión SSH. - Directorio:
/tmp
- Propietario de los archivos finales:
jenkins
.
- Máquina:
Solución
rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
Explicaciones
--rsync-path=PROGRAM specify the rsync to run on the remote machine
El truco consiste en decirle que se ejecute rsync
en la máquina remota con otro usuario ( jenkins
) distinto al que establece la conexión SSH ( destuser
).
Requisitos
Acceso SSH
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
No olvide restringir los permisos en ~/.ssh
:
chmod 700 ~/.ssh
sudoer para eldestuser
Deben destuser
tener el privilegio de hacerlo sudo -u jenkins rsync
.
En general, configuramos el destuser
como miembro de sudoers
. Para hacer esto, en el root
@ destmachine
:
cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF
Para probarlo antes rsync
, puede iniciar sesión en destuser
@ destmachine
y ejecutar esto:
sudo su jenkins
echo $USER
Si regresa:
jenkins
significa que ha iniciado sesión como jenkins
usuario y que su rsync
comando también funcionará, porque el privilegio de escalada jenkins
funciona.
Nota sobre una mala solución: establezca la conexión SSH con el usuario de destinojenkins
¿Por qué no hacemos esto?
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> jenkins
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
porque jenkins
es una cuenta de "servicio", lo que significa que ejecuta un servicio que expone un puerto ( 80
más o menos) para acceso HTTP externo, y significa que es POSIBLE que haya una violación de seguridad a través del servicio Jenkins a través de HTTP para obtener acceso .
Es por eso que tenemos www-data
usuarios y similares para ejecutar los diferentes servicios. En caso de que sean pirateados desde los puertos que exponen, no podrán hacer mucho:
- todo es de sólo lectura para ellos.
- excepto escribir en
/var/log/THE_SERVICE
.
Por lo tanto, permitir el acceso SSH al jenkins
usuario expone un ataque superficial (¡y lo mismo ocurre con el acceso SSH root
!).
Además, si desea realizar rsync como otro usuario ( root
,, www-data
etc.), deberá copiar su clave pública SSH a esas cuentas (problemático).
Buena solución: Deberías configurarAcceso SSH al menor número posible de cuentas de usuario( destuser
) esoPUEDE escalara la cuenta de "servicio" que desee ( jenkins
, root
, etc.).
Respuesta2
Tuve un problema similar con rsyncing como otro usuario. Lo resolvió ejecutando el siguiente comando:
rsync -avu -e "ssh -i my-key -o StrictHostKeyChecking=no -l user-i-want-to-use-in-rsync" ./local_dir remote_host:remote-host-dir
Tenga en cuenta que tal vez necesite jugar con las claves para poder ejecutar rsync como otro usuario.
Respuesta3
sudo -u jenkins -i rsync ...
consin comillas.
La -i
opción hace que el sudo
comando se ejecute con el entorno del usuario, incluidas las claves ssh .profile
, .bash_profile
etc.
Del sudo
hombre:
-i, --login
Ejecute el shell especificado por la entrada de la base de datos de contraseñas del usuario de destino como shell de inicio de sesión. Esto significa que el shell leerá los archivos de recursos específicos de inicio de sesión, como
.profile
,.bash_profile
o ..login
Si se especifica un comando, se pasa al shell para su ejecución mediante la-c
opción del shell. Si no se especifica ningún comando, se ejecuta un shell interactivo.sudo
intenta cambiar al directorio de inicio de ese usuario antes de ejecutar el shell. El comando se ejecuta en un entorno similar al que recibiría un usuario al iniciar sesión. Tenga en cuenta que la mayoría de los shells se comportan de manera diferente cuando se especifica un comando en comparación con una sesión interactiva; consulte el manual del caparazón para obtener más detalles. La sección Entorno de comando delsudoers(5)
manual documenta cómo la-i
opción afecta el entorno en el que se ejecuta un comando cuando se utiliza la política sudoers.
Respuesta4
Tengo un problema similar.
Resuelvo esto usando cron. Pero cron debe ejecutarse con un usuario específico (por ejemplo, jenkins)
Simplemente haz el trabajo cron:
$ crontab -u jenkins -e
luego llene cron con su necesidad.
*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log