Pracuji se dvěma instancemi ubuntu na AWS (ke kterým k nim používám klíč pem).
Nastavil jsem rsync pro obě instance a funguje to, když použiji výchozího uživatele, kterým je ubuntu @ ipaddress. Pokud se však pokusím použít rsync s jiným uživatelem (zadávám sudo su - jenkins například nebo dokonce zadáním sudo před příkazem rsync), pak se zobrazí následující chyba.
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]
Kroky, které jsem přijal:
Pokusil jsem se vytvořit klíč ssh (pomocí ssh-keygen), když jsem přihlášen jako jenkins a přidal jsem ho do authorized_keys soubor v /home/ubuntu/.ssh/authorized_keys (odkud spouštím rsync) i $JENKINS_HOME/.ssh/authorized_keys (kde jsem se také pokusil spustit rsync odtamtud).
Dokonce jsem se pokusil použít totéž i pomocí klíče pem a to také nefungovalo.
Tady je to, co jsem „pokouším se spustit
rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins
A h s klíčovým souborem
rsync -avuh --delete -e "ssh -i path/to/key.pem" [email protected]:/var/lib/jenkins/* /var/lib/jenkins
PS: Jediný důvod, proč jej nechci spouštět s ubuntu uživatel je proto, že dostávám failed: Permission denied (13) spoustu věcí (protože soubory vlastní Jenkins).
Konečný cíl:
I „Snažím se udržet záložní instanci Jenkinse neustále zálohovanou primární instancí pomocí cronjob:
*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins
Komentáře
- Přidali jste ssh-key do souboru vzdálených hostitelů authorized_keys nebo na server, na kterém spouštíte příkaz rsync?
- Otázka není ' t zcela jasný. V každém běhu rsync máte zdroj a cíl. Můžete objasnit zdrojový a cílový systém? Pro účely řešení problémů doporučuji držet se pouze ssh přes rsync, protože rsync použije ssh. Zkuste použít ssh -vvv jenkins @ < target > ze zdroje a vložit výstup sem.
- Zlyhal jsem: Oprávnění odepřeno (13) na spoustu věcí (protože soubory vlastní Jenkins) Proč tedy neprovést rsync jako " jenkins " uživatel?
- Napsali jste Pokusil jsem se ' vytvořit klíč ssh (pomocí ssh-keygen) když jste přihlášeni jako Jenkins a přidali to do souboru authorized_keys v obou /home/ubuntu/.ssh/authorized_keys (kde i ' m běží rsync z) , ale měli byste přidávat klíč do souboru authorized_keys v cílovém systému.
Odpovědět
Vím, že se jedná o starý příspěvek, ale pro případ, že by mohl pomoci ostatním lidem …
Musíte rozlišovat 2 věci:
- kdo naváže připojení SSH .
- který vzdálený uživatel vlastní soubory , které chcete zkopírovat.
Přehled
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser | | sudo su jenkins | v jenkins
Řekněme, že chcete rsync:
- Od:
- Stroj:
srcmachine - Uživatel:
srcuser - Adresář:
/var/lib/jenkins
- Stroj:
- Komu:
- Stroj:
destmachine - Uživatel:
destuserdo navázat připojení SSH . - Adresář:
/tmp - Vlastník finálních souborů:
jenkins.
- Stroj:
Řešení
rsync --rsync-path "sudo -u jenkins rsync" -avP --delete /var/lib/jenkins destuser@destmachine:/tmp
Vysvětlení
--rsync-path=PROGRAM specify the rsync to run on the remote machine
Trik je říct spustit rsync na vzdáleném počítači s jiným uživatelem (jenkins) než s tím, kdo naváže připojení SSH (destuser).
Požadavky
Přístup SSH
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> destuser [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
Nezapomeňte omezit oprávnění pro ~/.ssh :
chmod 700 ~/.ssh
sudoer pro destuser
destuser musí mít oprávnění dělat sudo -u jenkins rsync.
Obecně nastavujeme destuser jako člen sudoers. Za tímto účelem na stránce root @ destmachine:
cat > /etc/sudoers.d/destuser << EOF destuser ALL=(ALL) NOPASSWD:ALL EOF
Chcete-li to před rsync otestovat, můžete se přihlásit do destuser @ destmachine a spustit toto:
sudo su jenkins echo $USER
Pokud se vrátí:
jenkins
znamená to, že jste přihlášeni jako jenkins uživatel, což znamená, že bude fungovat i váš rsync příkaz, protože privilegium escalade k jenkins funguje.
Poznámka ke špatnému řešení: navázat spojení SSH s cílovým uživatelem jenkins
Proč ne “ Prostě to děláme?
(srcmachine) (rsync) (destmachine) srcuser -- SSH --> jenkins [~/.ssh/id_rsa] [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside [~/.ssh/id_rsa.pub]
protože jenkins je účet „služby“, což znamená, že provozuje službu, která vystavuje port (80 nebo tak) pro externí přístup HTTP a znamená to, že je MOŽNÉ, aby došlo k narušení zabezpečení prostřednictvím služby Jenkins přes HTTP, aby se získal přístup.
Proto máme www-data uživatele a podobné služby, které provozují různé služby. V případě, že budou hacknuti z portů, které vystavují, nemohou dělat mnoho:
- vše je pro ně jen pro čtení.
- kromě zápisu do
/var/log/THE_SERVICE.
povoleno Přístup SSH pro uživatele jenkins vystavuje povrchový útok (a tak je pro přístup SSH jako root !!).
Navíc, pokud chcete rsync použít jako jiný uživatel (root, www-data atd.), budete muset zkopírovat Veřejný klíč SSH k těmto účtům (problematické).
Dobré řešení : Pro uživatelské účty byste měli nastavit přístup SSH co nejméně „fc37a0f7d5″>
(destuser), které MŮŽE eskalovat do požadovaný „servisní“ účet (jenkins, root atd.).
odpověď
S rsyncingem jsem měl podobný problém jako jiný uživatel. Vyřešil to spuštěním dalšího příkazu:
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
Upozorňujeme, že možná budete muset hrát s klávesami, abyste mohli rsync spouštět jako jiný uživatel.
Odpověď
sudo -u jenkins -i rsync ...
bez bez uvozovek .
Díky možnosti -i je příkaz sudo spuštěn s prostředím uživatele, včetně klíčů ssh, .profile, .bash_profile atd.
Od sudo muže:
-i, --loginJako přihlašovací shell spusťte prostředí zadané v databázi hesel cílového uživatele. . To znamená, že soubory prostředků specifických pro přihlášení, například
.profile,.bash_profilenebo.loginbudou číst shellem. Pokud je zadán příkaz, je předán shellu k provedení prostřednictvím možnosti shellu „s-c. Pokud není zadán žádný příkaz, provede se interaktivní prostředí.sudose před spuštěním prostředí pokusí změnit domovský adresář daného uživatele. Příkaz je spuštěn v prostředí podobném tomu, které by uživatel obdržel při přihlášení. Pamatujte, že většina skořápek chovat se jinak, když je zadán příkaz ve srovnání s interaktivní relací; podrobnosti najdete v příručce prostředí. Sekce prostředí příkazů v příručcesudoers(5)dokumentuje, jak možnost-iovlivňuje prostředí, ve kterém je spuštěn příkaz, když je zásada sudoers použít.
Odpovědět
Mám podobný problém.
I vyřešte to pomocí cron. Ale cron musí běžet s konkrétním uživatelem (např. Jenkins).
Stačí vytvořit úlohu cronu:
$ crontab -u jenkins -e
a poté vyplnit cron podle potřeby.
*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log
Komentáře
- Pokud je
rsyncselhalo kvůli problému s ověřením, jak pomůže váš návrh?