Jag arbetar med två ubuntu-instanser på AWS (som jag använder en pem-nyckel för att komma åt dem).
Jag ställer in rsync för båda instanser, och det fungerar om jag använder standardanvändaren som är ubuntu @ ipaddress. Men om jag försöker använda rsync med en annan användare (jag skriver sudo su - jenkins
till exempel eller till och med att skriva sudo
före kommandot rsync), då får jag följande fel.
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]
Steg som jag har tagit:
Jag har försökt skapa en ssh-nyckel (med ssh-keygen) medan jag är inloggad som jenkins
och lade till det i authorized_keys
-fil i både /home/ubuntu/.ssh/authorized_keys
(där jag kör rsync från) och till och med $JENKINS_HOME/.ssh/authorized_keys
(där jag försökte köra rsync därifrån också).
Jag försökte till och med använda pem-tangenten för att göra samma sak och det fungerade inte heller.
Här är vad jag ”jag försöker köra
rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins
Och h innan ”med nyckelfilen
rsync -avuh --delete -e "ssh -i path/to/key.pem" [email protected]:/var/lib/jenkins/* /var/lib/jenkins
PS: Den enda anledningen till att jag inte vill köra den med ubuntu användare beror på att jag får failed: Permission denied (13)
på många saker (eftersom filerna ägs av jenkins).
Slutmål:
I ”jag försöker hålla säkerhetskopian av jenkins-instansen säkerhetskopierad konstant med den primära instansen genom att göra en cronjob:
*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins
Kommentarer
- Har du lagt till ssh-nyckeln i filen fjärrvärden autoriserade_key eller på servern där du kör kommandot rsync?
- Frågan är inte ’ t helt klart. I varje rsync-körning har du en källa och en destination. Kan du klargöra käll- och destinationssystem? För felsökningsändamål rekommenderar jag att du håller med bara ssh över rsync, eftersom rsync använder ssh. Försök använda ssh -vvv jenkins @ < target > från källan och klistra in utmatningen här.
- Jag misslyckades: Tillstånd nekad (13) för många saker (eftersom filerna ägs av jenkins) Så varför inte utföra rsync som ” jenkins ” användare?
- Du skrev Jag ’ har försökt skapa en ssh-nyckel (med ssh-keygen) medan du är inloggad som jenkins och lade till den i filen authorised_keys i båda /home/ubuntu/.ssh/authorized_keys (där jag ’ jag kör rsync från) , men du bör lägga till nyckeln till filen authorised_keys på destination -systemet.
Svar
Jag vet att det är ett gammalt inlägg, men bara om det kan hjälpa andra människor …
Du måste skilja på två saker:
- vem skapar SSH-anslutningen .
- vilken fjärranvändare äger filerna som du vill kopiera.
Översikt
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser | | sudo su jenkins | v jenkins
Låt oss säga att du vill rsync:
- Från:
- Maskin:
srcmachine
- Användare:
srcuser
- Katalog:
/var/lib/jenkins
- Maskin:
- Till:
- Maskin:
destmachine
- Användare:
destuser
till upprätta SSH-anslutningen . - Katalog:
/tmp
- Slutliga filägare:
jenkins
.
- Maskin:
Lösning
rsync --rsync-path "sudo -u jenkins rsync" -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
Förklaringar
--rsync-path=PROGRAM specify the rsync to run on the remote machine
Tricket är att berätta att köra rsync
på fjärrmaskinen med en annan användare (jenkins
) än den som upprättar SSH-anslutningen (destuser
).
Krav
SSH-åtkomst
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
Glöm inte att begränsa behörigheter på ~/.ssh
:
chmod 700 ~/.ssh
sudoer för destuser
destuser
måste ha privilegiet att göra sudo -u jenkins rsync
.
I allmänhet ställer vi in destuser
en medlem av sudoers
. För att göra detta, på root
@ destmachine
:
cat > /etc/sudoers.d/destuser << EOF destuser ALL=(ALL) NOPASSWD:ALL EOF
För att testa det före rsync
kan du logga in på destuser
@ destmachine
detta:
sudo su jenkins echo $USER
Om det returnerar:
jenkins
betyder det att du är inloggad som jenkins
-användare, och det betyder att ditt rsync
-kommando fungerar också, eftersom escalade-privilegiet till jenkins
fungerar.
Anmärkning om en dålig lösning: upprätta SSH-anslutningen med målanvändaren jenkins
Varför inte ” gör vi bara det här?
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> jenkins [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
eftersom jenkins
är ett ”service” -konto, vilket innebär att den kör en tjänst som exponerar en port (80
eller så) för extern HTTP-åtkomst, och det betyder att det är MÖJLIG att det finns en säkerhetsöverträdelse genom Jenkins-tjänsten via HTTP för att få åtkomst.
Därför har vi www-data
användare och liknande för att köra de olika tjänsterna. Om de blir hackade från de portar de exponerar kan de inte göra mycket:
- allt är skrivskyddat för dem.
- utom att skriva i
/var/log/THE_SERVICE
.
Så tillåter SSH-åtkomst för jenkins
-användaren exponerar en ytattack (och så är det för SSH-åtkomst som root
!!).
Dessutom, om du vill rsync som en annan användare (root
, www-data
, etc.), måste du kopiera din SSH-nyckel offentlig nyckel till dessa konton (besvärande).
Bra lösning : Du bör ställa in SSH-åtkomst så få som möjligt till användarkonton (destuser
) att KAN eskalera till det ”tjänst” -konto du vill ha (jenkins
, root
, etc.).
Svar
Jag hade ett liknande problem med rsyncing som en annan användare. Löste det genom att köra nästa kommando:
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
Observera att du kanske måste spela med tangenter för att kunna köra rsync som en annan användare.
Svar
sudo -u jenkins -i rsync ...
med inga citat .
Alternativet -i
gör att kommandot sudo
körs med användarens miljö inklusive ssh-tangenter, .profile
, .bash_profile
etc.
Från sudo
mannen:
-i, --login
Kör skalet som anges av målanvändarens lösenordsdatabaspost som inloggningsskal Detta innebär att inloggningsspecifika resursfiler som
.profile
,.bash_profile
eller.login
läsas av skalet. Om ett kommando specificeras skickas det till skalet för körning via skalet ”s-c
. Om inget kommando anges, körs ett interaktivt skal.sudo
försöker ändra till den användarens hemkatalog innan skalet körs. Kommandot körs i en miljö som liknar den som en användare skulle få vid inloggning. Observera att de flesta skalen beter sig annorlunda när ett kommando anges jämfört med en interaktiv session, se shell-handboken för mer information. Avsnittet Kommandomiljön isudoers(5)
handboken dokumenterar hur alternativet-i
påverkar den miljö där ett kommando körs när sudoers-policyn finns använd.
Svar
Jag har liknande problem.
I lösa detta med cron. Men cron måste köras med specifik användare (ex: jenkins)
Gör bara cron-jobb:
$ crontab -u jenkins -e
och fyll sedan cron med ditt behov.
*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log
Kommentarer
- Om
rsync
är misslyckades på grund av ett autentiseringsproblem hur hjälper ditt förslag?