Linux

為任何/每個連接使用者名配置 OpenSSH shell

  • September 2, 2016

使用 Debian 的預設 OpenSSH sshd 包,有沒有辦法將其配置為將每個使用者名視為相同?

例如,如果某人連接了一個隨機使用者名(即:8LaRiQRd8Qjh),而該使用者名並不作為 Linux 使用者存在,我可以配置 sshd 以將其視為一些一致的使用者名,如“testuser”嗎?

我知道從 SSH 客戶端的角度來看如何做到這一點,但我希望 SSH 伺服器本身接受任何連接憑據(允許我的 shell 處理該級別的身份驗證)。

理想情況下,我想要的是一條規則,例如“如果沒有現有的使用者名,請改用這個”。甚至“始終使用此使用者名”也可以,只是不太理想。

使用預設的 OpenSSH sshd 服務而不是執行我自己的 sshd 服務找到一個簡單的解決方案會很好。

我不知道你為什麼要這樣做,這似乎是一個糟糕的主意。

也就是說,出於某種原因,這個問題讓我著迷,我需要找到答案。

簡短的回答是,這不能通過簡單地在 debian 中配置可用的包來完成。

如果你想這樣做,你必須編寫兩個模組:一個用於 NSS,一個用於 PAM。

對於NSS 模組,您至少需要提供_getpwbynam_r. 對於PAM 模組,還有更多樣板文件。

這似乎需要做很多工作,而不是您想要的,但既然您提到您想自己處理身份驗證,這就是這樣做的方法。

一個更簡單的選擇(並且可能不太安全)是使用paramiko設置 Python SSH 伺服器並自定義/掛鉤身份驗證功能。

幸運的是,paramiko 的人已經在他們的 repo中的這個展示伺服器中完成了大部分繁重的工作。

通過替換check_auth_passwordorcheck_auth_publickey您可以接受任何使用者為有效使用者。**密碼驗證(*)**的範例:

# pip install pam
import pam
MYUSER = 'testuser'

class Server(paramiko.ServerInterface):
   def check_auth_password(self, username, password):
       if password and pam.authenticate(username=MYUSER, password=password):
           return paramiko.AUTH_SUCCESSFUL
       return paramiko.AUTH_FAILED

由於這不是 StackOverflow,我將停在那裡 :)

這將創建一個 ssh 伺服器,它將忽略使用者名進行密碼驗證,並將檢查給定的密碼testuser

預設情況下,此伺服器將提示輸入名稱並退出。您可能希望將其替換為 shell 或您的自定義應用程序。

我對使用者名進行了硬編碼,但您可以輕鬆地從配置文件或數據庫查找或其他任何東西中獲取它。

您可能還想替換host_key變數,也許還需要替換埠號。

有很多方法可以用這個來擊中自己的腳。你應該非常非常非常小心。此程式碼尚未準備好生產,請查看整個內容。如果您沒有發現任何錯誤,則說明您沒有進行良好的審查;-)。


*****:這只是替換Server類中的一個函式demo_server.py並在頂部添加一些東西

引用自:https://unix.stackexchange.com/questions/307330