Ich arbeite mit zwei Ubuntu-Instanzen auf AWS (für den Zugriff darauf verwende ich einen PEM-Schlüssel).
Ich habe rsync für beide Instanzen eingerichtet und es funktioniert, wenn ich den Standardbenutzer ubuntu@ipaddress verwende. Wenn ich jedoch versuche, rsync mit einem anderen Benutzer zu verwenden (ich tippe sudo su - jenkins
beispielsweise oder sogar sudo
vor dem rsync-Befehl), erhalte ich den folgenden Fehler.
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]
Schritte, die ich unternommen habe:
Ich habe versucht, einen SSH-Schlüssel (mit ssh-keygen) zu erstellen, während ich angemeldet war, jenkins
und habe diesen authorized_keys
sowohl /home/ubuntu/.ssh/authorized_keys
(von wo aus ich rsync ausführe) als auch $JENKINS_HOME/.ssh/authorized_keys
(von wo aus ich auch versucht habe, rsync auszuführen) der Datei hinzugefügt.
Ich habe sogar versucht, dasselbe mit dem PEM-Schlüssel zu tun, aber das hat auch nicht funktioniert.
Hier ist, was ich versuche auszuführen
rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins
Und hier ist die Schlüsseldatei
rsync -avuh --delete -e 'ssh -i path/to/key.pem' [email protected]:/var/lib/jenkins/* /var/lib/jenkins
PS: Der einzige Grund, warum ich es nicht mit dem Ubuntu-Benutzer ausführen möchte, ist, dass ich failed: Permission denied (13)
auf viele Dinge stoße (da die Dateien Jenkins gehören).
Endziel:
Ich versuche, die Backup-Jenkins-Instanz ständig zusammen mit der primären Instanz zu sichern, indem ich einen Cronjob ausführe:
*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins
Antwort1
Man muss 2 Dinge unterscheiden:
- WHOstellt die SSH-Verbindung her.
- welcheDer Remote-Benutzer besitzt die Dateiendie Sie kopieren möchten.
Überblick
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
|
| sudo su jenkins
|
v
jenkins
Nehmen wir an, Sie möchten rsync verwenden:
- Aus:
- Maschine:
srcmachine
- Benutzer:
srcuser
- Verzeichnis:
/var/lib/jenkins
- Maschine:
- Zu:
- Maschine:
destmachine
- Benutzer:
destuser
andie SSH-Verbindung herstellen. - Verzeichnis:
/tmp
- Endgültiger Besitzer der Dateien:
jenkins
.
- Maschine:
Lösung
rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
Erläuterungen
--rsync-path=PROGRAM specify the rsync to run on the remote machine
rsync
Der Trick besteht darin , auf dem Remote-Computer einen anderen Benutzer ( ) auszuführen jenkins
als den, der die SSH-Verbindung ( destuser
) herstellt.
Anforderungen
SSH-Zugriff
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> destuser
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
Vergessen Sie nicht, die Berechtigungen für Folgendes einzuschränken ~/.ssh
:
chmod 700 ~/.ssh
sudoer für diedestuser
Sie destuser
müssen das Privileg haben, dies zu tun sudo -u jenkins rsync
.
Im Allgemeinen setzen wir den destuser
als Mitglied des sudoers
. Dazu auf dem root
@ destmachine
:
cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF
Um es vorher zu testen rsync
, können Sie sich beim destuser
@ anmelden destmachine
und Folgendes ausführen:
sudo su jenkins
echo $USER
Wenn es zurückkommt:
jenkins
Dies bedeutet, dass Sie als Benutzer angemeldet sind jenkins
und dass Ihr rsync
Befehl auch funktioniert, da die Berechtigungserweiterung jenkins
funktioniert.
Hinweis zu einer schlechten Lösung: Stellen Sie die SSH-Verbindung mit dem Zielbenutzer herjenkins
Warum machen wir das nicht einfach?
(srcmachine) (rsync) (destmachine)
srcuser -- SSH --> jenkins
[~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]
weil jenkins
es sich um ein „Dienst“-Konto handelt, was bedeutet, dass es einen Dienst ausführt, der einen Port ( 80
oder so) für den externen HTTP-Zugriff verfügbar macht, und es bedeutet, dass es MÖGLICH ist, dass es durch den Jenkins-Dienst zu einer Sicherheitsverletzung kommt, um über HTTP Zugriff zu erhalten.
Aus diesem Grund haben wir www-data
Benutzer und ähnliche, um die verschiedenen Dienste auszuführen. Falls sie über die Ports, die sie freigeben, gehackt werden, können sie nicht viel tun:
- Für sie ist alles schreibgeschützt.
- außer dem Schreiben in
/var/log/THE_SERVICE
.
Wenn dem jenkins
Benutzer also SSH-Zugriff gewährt wird, stellt dies einen Oberflächenangriff dar (und das ist beim SSH-Zugriff genauso root
!!).
root
Wenn Sie darüber hinaus als anderer Benutzer ( , usw.) rsync verwenden möchten www-data
, müssen Sie Ihren öffentlichen SSH-Schlüssel in diese Konten kopieren (mühselig).
Gute Lösung: Sie solltenMöglichst wenige SSH-Zugriffe auf Benutzerkonten( destuser
) DasKANN eskalierenzu dem gewünschten „Dienst“-Konto ( jenkins
, root
, usw.).
Antwort2
Ich hatte ein ähnliches Problem mit rsyncing wie ein anderer Benutzer. Es wurde durch Ausführen des folgenden Befehls gelöst:
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
Bitte beachten Sie, dass Sie möglicherweise mit Schlüsseln herumspielen müssen, um rsync als anderer Benutzer ausführen zu können.
Antwort3
sudo -u jenkins -i rsync ...
mitkeine Anführungszeichen.
Die -i
Option bewirkt, dass der sudo
Befehl mit der Umgebung des Benutzers einschließlich SSH-Schlüsseln usw. ausgeführt wird .profile
..bash_profile
Vom sudo
Mann:
-i, --login
Führen Sie die Shell, die durch den Kennwortdatenbankeintrag des Zielbenutzers angegeben ist, als Anmelde-Shell aus. Dies bedeutet, dass anmeldespezifische Ressourcendateien wie
.profile
oder.bash_profile
von.login
der Shell gelesen werden. Wenn ein Befehl angegeben ist, wird er über die Option der Shell zur Ausführung an die Shell übergeben-c
. Wenn kein Befehl angegeben ist, wird eine interaktive Shell ausgeführt.sudo
versucht, vor dem Ausführen der Shell in das Home-Verzeichnis des Benutzers zu wechseln. Der Befehl wird in einer Umgebung ausgeführt, die der ähnelt, die ein Benutzer beim Anmelden erhalten würde. Beachten Sie, dass sich die meisten Shells bei Angabe eines Befehls anders verhalten als bei einer interaktiven Sitzung. Weitere Informationen finden Sie im Handbuch der Shell. Der Abschnitt „Befehlsumgebung“ imsudoers(5)
Handbuch dokumentiert, wie sich die-i
Option auf die Umgebung auswirkt, in der ein Befehl ausgeführt wird, wenn die sudoers-Richtlinie verwendet wird.
Antwort4
Ich habe ein ähnliches Problem.
Ich löse es mit cron. Aber cron muss mit einem bestimmten Benutzer ausgeführt werden (z. B. Jenkins).
Machen Sie einfach einen Cron-Job:
$ crontab -u jenkins -e
Füllen Sie dann cron mit Ihrem Bedarf.
*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log