概述

概述

我正在 AWS 上使用兩個 ubuntu 實例(我使用 pem 金鑰來存取它們)。

我為兩個實例設定了 rsync,如果我使用預設使用者 ubuntu@ipaddress,它就可以工作。但是,如果我嘗試與其他使用者一起使用 rsync(sudo su - jenkins例如,我正在輸入,甚至sudo在 rsync 命令之前輸入),則會出現以下錯誤。

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]

我已採取的步驟:

我嘗試在登入時創建一個 ssh 金鑰(使用 ssh-keygen),jenkins並將其添加到authorized_keys文件中/home/ubuntu/.ssh/authorized_keys(我從中運行 rsync 的地方)甚至$JENKINS_HOME/.ssh/authorized_keys(我也嘗試從那裡運行 rsync 的地方)。

我什至嘗試使用 pem 密鑰來做同樣的事情,但這也不起作用。

這就是我想要運行的

rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins

這是密鑰文件

rsync -avuh --delete -e 'ssh -i path/to/key.pem' [email protected]:/var/lib/jenkins/* /var/lib/jenkins

PS:我不想用 ubuntu 用戶運行它的唯一原因是因為我得到了failed: Permission denied (13)很多東西(因為這些檔案歸 jenkins 所有)。

最終目標:

我試圖透過執行 cronjob 來保持備份 jenkins 實例與主實例的持續備份:

*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins

答案1

你必須區分兩件事:

  • 世界衛生組織建立 SSH 連接
  • 哪個遠端使用者擁有文件您想要複製的內容。

概述

(srcmachine)  (rsync)   (destmachine)
  srcuser    -- SSH -->   destuser
                             |
                             | sudo su jenkins
                             |
                             v
                          jenkins

假設您想要 rsync:

  • 從:
    • 機器:srcmachine
    • 用戶:srcuser
    • 目錄:/var/lib/jenkins
  • 到:
    • 機器:destmachine
    • 使用者:destuser建立 SSH 連接
    • 目錄:/tmp
    • 最終文件所有者:jenkins.

解決方案

rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp

說明

     --rsync-path=PROGRAM    specify the rsync to run on the remote machine

訣竅是告訴rsync在遠端電腦上使用另一個使用者 ( jenkins) 運行,而不是建立 SSH 連線的使用者 ( destuser) 。

要求

SSH 訪問

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->   destuser

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

不要忘記限制以下權限~/.ssh

chmod 700 ~/.ssh

蘇多爾為destuser

必須destuser有特權才能做sudo -u jenkins rsync

一般來說,我們將 設為destuser的成員sudoers。為此,請在root@上destmachine

cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF

要在之前測試它rsync,您可以登入destuser@destmachine並執行以下命令:

sudo su jenkins
echo $USER

如果返回:

jenkins

這意味著您以jenkins使用者身分登錄,並且意味著您的rsync命令也將起作用,因為升級權限會jenkins起作用。

注意一個糟糕的解決方案:與目標用戶建立 SSH 連接jenkins

我們為什麼不這麼做呢?

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->    jenkins

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

因為jenkins是一個「服務」帳戶,這意味著它運行一個服務,該服務公開一個連接埠(80或其他)以供外部 HTTP 訪問,並且這意味著透過 HTTP 的 Jenkins 服務取得存取權限可能存在安全漏洞。

這就是為什麼我們有www-data用戶和類似人來運行不同的服務。如果他們暴露的端口遭到駭客攻擊,他們就無能為力:

  • 一切對他們來說都是唯讀的。
  • 除了寫在/var/log/THE_SERVICE.

因此,允許jenkins用戶進行 SSH 訪問會暴露表面攻擊(SSH 訪問也是如此root!!)。

此外,如果您想以其他使用者身分進行 rsync(rootwww-data等),則必須將 SSH 金鑰公鑰複製到這些帳戶(很麻煩)。

好的解決方案: 你應該設定盡可能少地對使用者帳戶進行 SSH 訪問destuser) 那可以升級到您想要的「服務」帳戶(jenkinsroot等)。

答案2

我作為另一個用戶在 rsyncing 時遇到了類似的問題。透過執行下一個命令解決了這個問題:

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

請注意,也許您需要使用按鍵才能以其他使用者身分執行 rsync。

答案3

sudo -u jenkins -i rsync ...

沒有引號

-i選項使sudo命令在使用者的環境下運行,包括 ssh 金鑰等.profile.bash_profile

來自sudo男人:

-i, --login

執行由目標使用者的密碼資料庫條目指定的 shell 作為登入 shell。這意味著shell 將讀取特定於登入名稱的資源文件,例如 .profile.bash_profile或。.login如果指定了命令,則會透過 shell 的-c選項將其傳遞到 shell 執行。如果未指定命令,則執行互動式 shell。 sudo在執行 shell 之前嘗試變更到該使用者的主目錄。此命令在與使用者登入時收到的環境類似的環境中執行。有關詳細信息,請參閱 shell 手冊。sudoers(5)手冊中的命令環境部分記錄了-i在使用 sudoers 策略時該選項如何影響命令運行的環境。

答案4

我有類似的問題。
我使用 cron 解決了這個問題。但 cron 必須以特定使用者執行(例如:jenkins)

只需讓 cron 工作:

$ crontab -u jenkins -e

然後根據您的需要填寫 cron 。

*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log

相關內容