rsync avec un utilisateur différent

Je « travaille avec deux instances ubuntu sur AWS (à laquelle jutilise une clé pem pour y accéder).

Jai configuré rsync pour les deux instances, et cela fonctionne si jutilise lutilisateur par défaut qui est ubuntu @ ipaddress. Cependant, si jessaye dutiliser rsync avec un autre utilisateur (je « m tape sudo su - jenkins par exemple ou même en tapant sudo avant la commande rsync), alors jobtiens lerreur suivante.

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] 

Étapes que jai suivies:

Jai essayé de créer une clé ssh (en utilisant ssh-keygen) en étant connecté en tant que jenkins et je lai ajoutée à authorized_keys fichier à la fois dans /home/ubuntu/.ssh/authorized_keys (où i « m exécute la rsync à partir de) et même $JENKINS_HOME/.ssh/authorized_keys (où jai essayé dexécuter rsync à partir de là aussi).

Jai même essayé dutiliser la touche pem pour faire la même chose et cela na pas fonctionné non plus.

Voici ce que jai « Jessaye de courir

rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins

Et h ere « s avec le fichier clé

rsync -avuh --delete -e "ssh -i path/to/key.pem" [email protected]:/var/lib/jenkins/* /var/lib/jenkins

PS: La seule raison pour laquelle je ne veux pas lexécuter avec ubuntu lutilisateur est parce que jobtiens failed: Permission denied (13) sur beaucoup de choses (puisque les fichiers appartiennent à jenkins).

Objectif final:

I « Jessaie de garder linstance de sauvegarde jenkins constamment sauvegardée avec linstance principale en effectuant un cronjob:

*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins

Commentaires

  • Avez-vous ajouté la clé ssh sur le fichier des hôtes distants allowed_keys ou sur le serveur sur lequel vous exécutez la commande rsync?
  • La question nest pas ‘ t assez clair. Dans chaque exécution de rsync, vous avez une source et une destination. Pouvez-vous clarifier les systèmes source et de destination? À des fins de dépannage, je recommande de sen tenir uniquement à ssh sur rsync, car rsync utilisera ssh. Essayez dutiliser ssh -vvv jenkins @ < target > à partir de la source et collez la sortie ici.
  • Jai échoué: Permission refusée (13) sur beaucoup de choses (puisque les fichiers appartiennent à jenkins) Alors pourquoi ne pas effectuer la rsync comme  » jenkins  » user?
  • Vous avez écrit Jai ‘ essayé de créer une clé ssh (en utilisant ssh-keygen) tout en étant connecté en tant que jenkins et ajouté cela au fichier allowed_keys dans les deux /home/ubuntu/.ssh/authorized_keys (où je ‘ m exécutant la rsync à partir de) , mais vous devriez ajouter la clé au fichier allowed_keys sur le système destination .

Réponse

Je sais que cest un ancien message, mais juste au cas où cela pourrait aider dautres personnes …

Vous devez différencier 2 choses:

  • qui établit la connexion SSH .
  • quel utilisateur distant possède les fichiers que vous souhaitez copier.

Présentation

(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser | | sudo su jenkins | v jenkins 

Disons que vous voulez rsync:

  • De:
    • Machine: srcmachine
    • Utilisateur: srcuser
    • Répertoire: /var/lib/jenkins
  • À:
    • Machine: destmachine
    • Utilisateur: destuser à établir la connexion SSH .
    • Répertoire: /tmp
    • Propriétaire des fichiers finaux: jenkins.

Solution

rsync --rsync-path "sudo -u jenkins rsync" -avP --delete /var/lib/jenkins destuser@destmachine:/tmp 

Explications

 --rsync-path=PROGRAM specify the rsync to run on the remote machine 

Lastuce est de dire pour exécuter rsync sur la machine distante avec un autre utilisateur (jenkins) que celui qui établit la connexion SSH (destuser).

Conditions requises

Accès SSH

(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub] 

Noubliez pas de restreindre les autorisations sur ~/.ssh :

chmod 700 ~/.ssh 

sudoer pour le destuser

Le destuser doit avoir le privilège de faire sudo -u jenkins rsync.

En général, nous définissons destuser comme un membre de sudoers. Pour ce faire, sur le root @ destmachine:

cat > /etc/sudoers.d/destuser << EOF destuser ALL=(ALL) NOPASSWD:ALL EOF 

Pour le tester avant rsync, vous pouvez vous connecter à destuser @ destmachine et exécuter ceci:

sudo su jenkins echo $USER 

Sil renvoie:

jenkins 

cela signifie que vous êtes connecté en tant quutilisateur jenkins, et cela signifie que votre commande rsync fonctionnera également, car le privilège délever à jenkins fonctionne.

Remarque sur une mauvaise solution: établissez la connexion SSH avec lutilisateur de destination jenkins

Pourquoi ne pas  » on fait juste ça?

(srcmachine) (rsync) (destmachine) srcuser -- SSH --> jenkins [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub] 

car jenkins est un compte « service », ce qui signifie quil exécute un service qui expose un port (80 environ) pour un accès HTTP externe, et cela signifie quil est POSSIBLE quil y ait une faille de sécurité via le service Jenkins via HTTP pour y accéder.

Cest pourquoi nous avons www-data utilisateurs et similaires pour exécuter les différents services. Au cas où ils seraient piratés à partir des ports quils exposent, ils ne peuvent « pas faire grand chose:

  • tout est en lecture seule pour eux.
  • sauf lécriture en /var/log/THE_SERVICE.

Donc Laccès SSH pour lutilisateur jenkins expose une attaque de surface (et il en va de même pour laccès SSH en tant que root !!).

De plus, si vous voulez rsync en tant quun autre utilisateur (root, www-data, etc.), vous devrez copier votre Clé publique SSH pour ces comptes (problématique).

Bonne solution : vous devez définir laccès SSH aussi peu que possible aux comptes utilisateurs (destuser) qui PEUT escalader en le compte « service » souhaité (jenkins, root, etc.).

Réponse

Jai eu un problème similaire avec rsyncing en tant quautre utilisateur. Résolu le problème en exécutant la commande suivante:

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 

Veuillez noter que vous devrez peut-être jouer avec les touches pour pouvoir exécuter rsync en tant quautre utilisateur.

Réponse

sudo -u jenkins -i rsync ... 

avec sans guillemets .

Loption -i fait exécuter la commande sudo avec lenvironnement de lutilisateur, y compris les clés ssh, .profile, .bash_profile etc.

De lhomme sudo:

-i, --login

Exécutez le shell spécifié par lentrée de la base de données de mots de passe de lutilisateur cible comme shell de connexion . Cela signifie que les fichiers de ressources spécifiques à la connexion, tels que .profile, .bash_profile ou .login être lue par le shell. Si une commande est spécifiée, elle est passée au shell pour exécution via loption shell « s -c. Si aucune commande nest spécifiée, un shell interactif est exécuté. sudo tente de passer au répertoire de base de cet utilisateur avant dexécuter le shell. La commande est exécutée avec un environnement similaire à celui quun utilisateur recevrait lors de la connexion. Notez que la plupart des shells se comportent différemment lorsquune commande est spécifiée par rapport à une session interactive, consultez le manuel du shell pour plus de détails. La section Environnement de commande du manuel sudoers(5) décrit comment loption -i affecte lenvironnement dans lequel une commande est exécutée lorsque la stratégie sudoers est en cours utiliser.

Réponse

Jai un problème similaire.
I résolvez ceci en utilisant cron. Mais cron doit fonctionner avec un utilisateur spécifique (ex: jenkins)

Il suffit de faire cron job:

$ crontab -u jenkins -e 

puis de remplir cron avec votre besoin.

*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log 

Commentaires

  • Si rsync est échec en raison dun problème dauthentification, comment votre suggestion vous aidera-t-elle?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *