jenkins插件Publish Over SSH因安全問題下架


最近用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登錄。下一次我將用這種方式學習並記錄一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM