Két ubuntu példánnyal dolgozom az AWS-en (amelyek eléréséhez pem kulcsot használok).
Mindkét példányhoz beállítottam az rsync alkalmazást, és akkor működik, ha az alapértelmezett felhasználót használom, amely az ubuntu @ ipaddress. Ha azonban megpróbálom más felhasználóval használni az rsync alkalmazást (“beírom a > például, vagy akár beírok sudo
az rsync parancs elé), akkor a következő hibát kapom.
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]
Lépések, amelyeket megtettem:
Megpróbáltam létrehozni egy ssh kulcsot (az ssh-keygen használatával), miközben bejelentkeztem jenkins
néven, és hozzáadtam a authorized_keys
fájl mind a /home/ubuntu/.ssh/authorized_keys
fájlban (ahonnan az “rsync-et futtatom), akár a $JENKINS_HOME/.ssh/authorized_keys
(ahol az rsync-et is onnan próbáltam futtatni).
Még a pem kulcsot is megpróbáltam ugyanazt csinálni, és ez sem működött.
Itt van, amit én “próbálok futni
rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins
És h nincsenek a kulcsfájllal
rsync -avuh --delete -e "ssh -i path/to/key.pem" [email protected]:/var/lib/jenkins/* /var/lib/jenkins
PS: Az egyetlen ok, amiért nem akarom az ubuntuval futtatni a felhasználó azért van, mert sok mindenre failed: Permission denied (13)
-t kapok (mivel a fájlok jenkins tulajdonában vannak).
Végcél:
I “Megpróbálom folyamatosan fenntartani a biztonsági mentés jenkins példányát az elsődleges példánnyal egy cronjob segítségével:
*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins
Megjegyzések
- Hozzáadta az ssh-kulcsot a távoli gazdagép-hitelesített_kulcs fájlhoz vagy ahhoz a kiszolgálóhoz, ahol az rsync parancsot futtatja?
- A kérdés nem ‘ t teljesen egyértelmű. Minden rsync futtatásban van forrás és cél. Tudja tisztázni a forrás és cél rendszert? Hibaelhárítás céljából azt javaslom, hogy ragaszkodjon az ssh-hez az rsync felett, mert az rsync az ssh-t fogja használni. Próbálja meg használni az ssh -vvv jenkins @ < target > forrást, és ide illessze be a kimenetet.
- Meghibásodtam: Sok mindenre megtagadták az engedélyt (13) (mivel a fájlok a jenkins tulajdonában vannak) Tehát miért nem hajtja végre az rsync-et ” jenkins ” felhasználó?
- Ön írta I ‘ Megpróbáltam létrehozni egy ssh kulcsot (az ssh-keygen használatával) miközben jenkins-ként jelentkezett be, és hozzáadta ezt az autor_kulcs fájlhoz mindkét /home/ubuntu/.ssh/authorized_keys-ben (ahol i ‘ m futja az rsync-et) hozzá kell adnia a kulcsot a rendeltetési hely rendszer Authorized_keys fájljához.
Válasz
Tudom, hogy ez egy régi bejegyzés, de csak arra az esetre, ha más embereknek segíthetne …
Két dolgot meg kell különböztetnie:
- ki létrehozza az SSH kapcsolatot .
- mely távoli felhasználóé a másolni kívánt fájlok.
Áttekintés
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser | | sudo su jenkins | v jenkins
Mondjuk ki, hogy újra akarsz szinkronizálni:
- Feladó:
- Gép:
srcmachine
- Felhasználó:
srcuser
- Könyvtár:
/var/lib/jenkins
- Gép:
- Címzett:
- Gép:
destmachine
- Felhasználó:
destuser
– létrehozza az SSH-kapcsolatot . - Könyvtár:
/tmp
- Végső fájltulajdonos:
jenkins
.
- Gép:
Megoldás
rsync --rsync-path "sudo -u jenkins rsync" -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
Magyarázat
--rsync-path=PROGRAM specify the rsync to run on the remote machine
A trükk elmondani rsync
futtatása a távoli gépen egy másik felhasználóval (jenkins
), mint az, aki létrehozza az SSH-kapcsolatot (destuser
).
Követelmények
SSH hozzáférés
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
Ne felejtsd el korlátozni a ~/.ssh
engedélyeket :
chmod 700 ~/.ssh
sudoer a destuser
A destuser
kiváltsággal kell rendelkeznie a sudo -u jenkins rsync
elvégzéséhez.
Általában a destuser
a sudoers
tagja. Ehhez a root
@ destmachine
oldalon:
cat > /etc/sudoers.d/destuser << EOF destuser ALL=(ALL) NOPASSWD:ALL EOF
A rsync
előtti teszteléshez jelentkezzen be a destuser
@ destmachine
oldalra, és futtassa ez:
sudo su jenkins echo $USER
Ha visszatér:
jenkins
ez azt jelenti, hogy bejelentkezett jenkins
felhasználóként, és ez azt jelenti, hogy a rsync
parancsod is működni fog, mert a működik.
Megjegyzés egy rossz megoldásról: létre kell hozni az SSH-kapcsolatot a célfelhasználóval jenkins
Miért nem ” t ezt csináljuk?
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> jenkins [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
mert a jenkins
egy “service” fiók, ami azt jelenti, hogy olyan szolgáltatást futtat, amely kitesz egy portot (80
vagy így) a külső HTTP-hozzáféréshez, és ez azt jelenti, hogy LEHETSÉGES, hogy a Jenkins szolgáltatáson keresztül a HTTP-n keresztül biztonsági rés történt a hozzáférés megszerzéséhez.
Ezért van www-data
felhasználó és hasonlók a különböző szolgáltatások futtatásához. Ha feltörnek az általuk kitett portokból, nem sokat tehetnek:
- minden csak olvasható nekik.
- kivéve a
/var/log/THE_SERVICE
nyelvű írást.
Tehát lehetővé téve A jenkins
felhasználó SSH-hozzáférése felületi támadást tesz közzé (és így van ez az SSH-hozzáféréshez root
!! néven is).
Ezenkívül, ha más felhasználóként szeretne szinkronizálni (root
, www-data
stb.), akkor át kell másolnia a SSH-kulcs nyilvános kulcs ezekhez a fiókokhoz (zavaró).
Jó megoldás : A lehető legkevesebbet kell beállítania az SSH hozzáférést a felhasználói fiókokhoz (destuser
), amely képes átértékelni a a kívánt “service” fiókot (jenkins
, root
stb.).
Válasz
Hasonló problémám volt egy másik felhasználó rsyncelésével kapcsolatban. Megoldotta a következő parancs futtatásával:
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
Felhívjuk figyelmét, hogy lehet, hogy kulcsokkal kell játszania ahhoz, hogy az rsync programot másik felhasználóként futtathassa.
Válasz
sudo -u jenkins -i rsync ...
idézőjelek nélkül .
A -i
beállítás lehetővé teszi a sudo
parancs futtatását a felhasználó környezetével, beleértve az ssh kulcsokat, .profile
, .bash_profile
stb.
A sudo
embertől:
-i, --login
Futtassa a célfelhasználó jelszó-adatbázisának beírt héját bejelentkezési héjként Ez azt jelenti, hogy a bejelentkezési specifikus erőforrásfájlok, például a
.profile
,.bash_profile
vagy a.login
Ha egy parancs meg van adva, akkor az a “s-c
opción keresztül továbbításra kerül a shell számára végrehajtásra. Ha nincs megadva parancs, akkor interaktív shell kerül végrehajtásra. Asudo
megpróbálja áttérni a felhasználó saját könyvtárára a shell futtatása előtt. A parancsot egy olyan környezettel futtatják, mint amelyet a felhasználó a bejelentkezéskor kap. Ne feledje, hogy a legtöbb shell viselkedjen másképp, amikor a parancs meg van adva, mint az interaktív munkamenet; a részletekért olvassa el a shell kézikönyvét. A Parancs környezet szakasz asudoers(5)
kézikönyvben dokumentálja, hogy a-i
beállítás hogyan befolyásolja azt a környezetet, amelyben a parancs fut, amikor a sudoers házirend be van kapcsolva. használat.
Válasz
Hasonló problémám van.
I megoldja ezt a cron használatával. De a cron-nak konkrét felhasználóval kell futnia (pl: jenkins).
Csak készítsen cron-feladatot:
$ crontab -u jenkins -e
majd töltse ki a cront az igényével.
*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log
Megjegyzések
- Ha a
rsync
sikertelen hitelesítési probléma miatt, hogyan segít a javaslat?