自定義構建互動式SSH應用程式,用Python為大家舉例

安全劍客發表於2019-09-23
SSH的使用模式分兩種方式互動式和非互動式的模式。在自動化系統中,更常用的是非互動式SSH,自動化工具都是基於這種模式,比如ansiable和salt-ssh,還有檔案同步工具 rsync的SSH模式。本文我們就來說說互動式SSH應用的構建,並以Python為例實現了一個基本的互動式應用。

自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
SSH的使用模式分兩種方式互動式和非互動式的模式。在自動化系統中,更常用的是非互動式SSH,自動化工具都是基於這種模式,比如ansiable和salt-ssh,還有檔案同步工具 rsync的SSH模式。本文我們就來說說互動式SSH應用的構建,並以Python為例實現了一個基本的互動式應用。
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
自定義 shell

在伺服器上,可以使用OpenSSH完成三個步驟來獲得 shell:身份驗證,shell會話和 命令。我們可以隨意配置shell(通過/etc/passwd)。例如,如果將使用者的登入shell設定為/usr/bin/cshell,登陸後,就會執行cshell(可以為自定義的互動式程式)。shell定義也非常簡單,只需以root許可權編輯/etc/passwd修改最後一個欄位為自定義的shell程式既可。如果使用者通過分配的TTY(預設情況下已完成)連線到伺服器,那就將能夠執行自定義的應用程式或互動式應用程式。

authorized_keys配置

需要注意的是,如果使用自定義的shell應用程式,無法接受使用者傳遞的額外 命令行引數,例如ssh user@host ls -a執行時會丟掉最後的-a引數。為了解決這個問題,需要通過覆蓋執行的命令方式,為了實現覆蓋執行命令的操作,我們可以使用使用者證照驗證檔案authorized_keys檔案。在該檔案每行之前,可以新增適用於使用該金鑰登入的使用者的選項。這些選項中有一個選項是"command"選項。比如給將/home/user/.ssh/authorized_keys新增一下語句:

command ="/usr/bin/Ccommand" ssh-rsa ... user

使用者的shell(可能應該是/bin/sh)就可以自動執行nethack,無論配置何種command,(如果需要,都儲存在環境中的SSH_ORIGINAL_COMMAND中)都會先執行。出於安全原因,一般會設定一下限制配置:

restrict,pty,command ="…" ssh-rsa ... user

更詳細的設定選項,可以參考sshd官方手冊。預設會限制關閉大多數東西,通過pty顯式重新啟用TTY分配,這樣就可以做自定義自己的終端應用(比如Python下curses編寫的應用)。我們再來看一個典型的gitlab下典型的多使用者限制登陸型的authorized_keys配置例項:
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
sshd_config配置

另一個可以用來配置啟動命令的地方sshd配置檔案:/etc/ssh/sshd_config。通過sshd_config的AuthorizedKeysCommand來配置額外執行命令。它設定執行任意程式,並從標準輸出stdout獲取authorized_keys檔案。比如可以配置為:

AuthorizedKeysCommand /usr/bin/Ccommand "%u" "%h" "%t" "%k"
AuthorizedKeysUser root

上面配置中的格式字串的作用是為命令提供嘗試登入的使用者名稱(%u),使用者的主目錄(%h),正在使用的金鑰型別(%t,例如ssh-rsa)和用base64編碼的公鑰(%k)。這裡提供的金鑰可用於識別使用者,可以將使用者公鑰儲存在資料庫中,通過應用查詢並提供給sshd用於認證。可以在此處嵌入自定義的命令列應用。

Python互動式SSH例項

下面是一個一個簡單的的AuthorizedKeysCommand和python例項:
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
上面 指令碼中buildrht-shell命令告訴使用者使用ssh builds@buildhost connect 之類的命令進行連線,可以使用SSH_ORIGINAL_COMMAND變數來獲取其命令列:
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
然後是身份驗證,檢查其金鑰和連線:
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例

自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
互動式SSH中最重要的是對的輸入命令進行實時的反饋。tail程式就是用來實現這個功能構建和列印日誌給標準輸出:
自定義構建互動式SSH應用程式,用Python為大家舉例自定義構建互動式SSH應用程式,用Python為大家舉例
以上我們就構建了一個自定義的個性化的互動式SSH應用例項。

原文地址:linuxprobe.com/ssh-python.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2657950/,如需轉載,請註明出處,否則將追究法律責任。

相關文章