jenkins外掛Publish Over SSH因安全問題下架

一 定 會 去 旅 行發表於2022-02-12

最近用docker新搭建了一個jenkins,安裝外掛的時候發現publish over ssh找不到了,官方給出的解釋是存在安全隱患於2022.01.12暫停分發,官方解釋如下:https://www.jenkins.io/security/advisory/2022-01-12

之前文章介紹過通過publish over ssh外掛推送jenkins編譯好的專案到對應伺服器,現在該外掛無法使用了,只能尋找替代外掛。

在程式猿bug解決聖地找到一篇諮詢該問題的解決方案:https://stackoverflow.com/questions/70828203/which-plugins-could-replace-publish-over-ssh-from-jenkins,使用ssh外掛(未安裝之前在可選外掛裡叫ssh,安裝之後在已安裝裡叫ssh plugin),不過該外掛上一次版本更新也已經是3年前10個月了(截止2022.02.12)。

查詢資料學習ssh外掛的用法。。。。。。

搜尋關鍵字jenkins ssh,你查到的99.999%資料都是關於publish over ssh的,垃圾。。。

於是搜尋This plugin executes shell commands remotely using SSH protocol,找到一篇完整介紹通過ssh方式配置的文章:https://blog.51cto.com/wujianwei/2492430

一、安裝ssh外掛,如上圖。

二、配置遠端ssh連線伺服器的賬號密碼憑據。(這裡我們以root賬號講解,關於非root賬號(或者說非最大許可權的賬號)我們後面單獨介紹。)
  Manage Jenkins(系統管理) —>Manage Credentials --> Stores scoped to Jenkins 下的許可權域 --> 全域性憑據 --> 點選左側新增憑據按鈕 --> 選擇型別(Username with password 或者 SSH Username with private key)--> 填寫賬號密碼(或private key)後確認新增。

 

 三、配置SSH伺服器引數。

  Manage Jenkins(系統管理) —>System Configuration(系統配置) --> SSH remote hosts --> 點選SSH sites下的新增按鈕 --> 填寫以下資訊 --> 填寫完後點選底部的儲存(或應用)。

   hostname:要ssh連線的伺服器ip;

   port:伺服器埠;

   Credentials:選擇連線的賬號;

   下面的可以暫時不填,表示用預設值。

   點選按鈕Check connection,驗證配置的以上引數是否正確。

 四、構建應用。

  關於建立新任務本文就不介紹了,前面文章有介紹過,網上文章也不少。本次我們只說新增加的ssh方式。

  在構建選項下增加構建步驟:Execute shell script on remote host using ssh

   

   填寫ssh連線的遠端伺服器,和連線後的shell執行語句。我這裡是連線到宿主機,然後把宿主機掛載的tomcat容器專案清理再重新從jenkins容器掛載的編譯資料夾中複製新的。

  

 

 儲存後執行即可成功~~

 


 

以上配置是假設你知道伺服器root賬號(或其他類似root許可權賬號)的基礎上,,很多時候IT給我們的機器是通過堡壘機(即伺服器管理系統)登入的,雖然登入的是root賬號但是不給到root賬號密碼,這個時候可能需要我們自己建立賬號,然後配置對應的引數到jenkins系統管理的ssh中。

關於在centos中建立賬號,可以參考這篇文章:https://www.cnblogs.com/geoffreygao/p/12238231.html

一、新增新賬號:

useradd 你的新賬號;
#例如新增賬戶王小明:useradd wangxiaoming

二、新增密碼:

passwd 你上面建立的新賬號;
# 例如:passwd wangxiaoming

   此時會讓你輸入密碼,輸入密碼時不顯示任何字元,不要以為卡住了,不要按刪除鍵del,密碼輸好後按確認鍵enter,如果密碼太簡單安全性較低會提示你,不用管,繼續就好,會讓你再輸入一遍密碼確認。

 

三、設定許可權:

  此時的新賬號只有檢視許可權, 如果你想複製(cp)檔案、移動檔案(mv)、刪除檔案(rm)都是沒有許可權的。

   

#切換賬號,有的文章介紹中su後面加-,發現在centos中會有不正確提示,不需要加就能切換。
su wangxiaoming

#執行復制檔案。非root賬號前需要加sudo關鍵字。
sudo cp favicon.ico favicon.ico3

#提示輸入密碼驗證後才能操作,此時輸入密碼提示沒有再sudoers檔案中存在許可權。

  根據前面參考文章介紹要在/etc/sudoers中新增許可權,而本身該檔案是沒有寫入許可權的,需要先修改該檔案為可寫入許可權。而修改sudoers檔案需要root賬號操作。

# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell視窗以root賬號操作。
# 為sudoers新增可寫許可權
chomd -v u+w /etc/sudoers
# 編輯sudoers檔案
vi /etc/sudoers

按Insert鍵進入編輯模式

# 在 sudoers 檔案新增新使用者資訊到 ## Allow root to run any commands anywhere 下,修改後的效果為:
## Allow root to run any commands anywher
root   ALL=(ALL)    ALL
wangxiaoming    ALL=(ALL)    ALL

按Esc 後 輸入 :wq 儲存並退出

  此時再執行sudo cp favicon.ico favicon.ico3,輸入密碼後複製檔案成功。

 

   還有一種方式是將普通賬號放入wheel使用者組中(usermod -G wheel wangxiaoming),但這種方式不適合在jenkins中使用,因為下面我們要去掉驗證密碼,假如使用者組中的話需要將整個wheel組去掉密碼驗證,得不償失,放棄此方式。

 

四、去掉密碼驗證。

  上面我們發現執行sudo cp語句後需要輸入密碼驗證,但我們本意是要在jenkins中執行的,而jenkins中自動執行的過程中是無法輸入密碼的,所以會導致構建失敗(大家可以去試下)。

  那麼我們是否可以設為不用輸入密碼就執行呢,答案是可以的。方法還是修改上面的sudoers檔案,只不過最後的ALL變為NOPASSWD: ALL即可。

# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell視窗以root賬號操作。

# 編輯sudoers檔案
vi /etc/sudoers 按Insert鍵進入編輯模式 # 在 sudoers 檔案新增新使用者資訊到 ## Allow root to run any commands anywhere 下,修改後的效果為: ## Allow root to run any commands anywher root ALL=(ALL) ALL wangxiaoming ALL=(ALL) NOPASSWD: ALL 按Esc 後 輸入 :wq 儲存並退出

 

  再執行sudo cp語句發現不需要輸入密碼驗證了。

 

五、修改sudoers檔案回不可寫入模式。

  前面我們將sudoers檔案設為了可寫入模式,此時記得重新將其許可權設為不可寫入哦,當然要用root賬號操作~~

# 注意要切換回root賬號,因為我在堡壘機上沒有root賬號密碼,所以是重新開啟新shell視窗以root賬號操作。

#取消 sudoers 檔案可寫許可權     
chmod -v u-w /etc/sudoers

 

 

這樣在jenkins中用非root賬號執行shell便不需要再輸入賬號密碼了。

 


 

 

最後,雖然本次方式暫時解決了沒有publish over ssh的問題,但目前該方式僅適合兩種情況:

1、ssh連線到遠端伺服器後在遠端伺服器執行構建操作,或在遠端伺服器直接獲取已構建好的專案。

2、使用docker容器模式,而且jenkins容器和對應的伺服器容器(比如tomcat)在同一個宿主機上,這樣可以通過ssh連線到宿主機進行資料夾之間的增刪移動複製操作。

我這次情況是2。

其他的情況可能不適用本文方式。

今天大佬給了一個新思路,說將兩個伺服器新增互信,然後不用外掛方式,有私鑰公鑰後直接shell執行ssh登入。下一次我將用這種方式學習並記錄一下。

 

相關文章