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:
destuser
do 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, --login
Jako 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_profile
nebo.login
budou čí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í.sudo
se 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-i
ovlivň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
rsync
selhalo kvůli problému s ověřením, jak pomůže váš návrh?