運維安全 | 如何限制指定賬戶不能SSH只能SFTP在指定目錄
*本文作者:ForrestX386,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
最近,我司線上搞了一臺檔案中轉伺服器,用於sftp上傳下載一些檔案(包括測試日誌之類),但是領導希望用的人只能在特定目錄上傳下載,不能獲取Linux shell之類。運維安全部研究了一番之後,搞了一個方案,可以限制特定組內的使用者只能sftp 連線上去至指定目錄,ssh 連線就提示只接受sftp 連線,總算是滿足了領導的要求。現在總結一下,和大家分享一下, 測試與分析如下。
0×01 測試環境配置
比如以限制sftpgroup 組的使用者都只能在自己的家目錄sftp 上傳下載,不能ssh 連接獲取shell為例進行說明,假設zhangsan 是被限制的賬戶之一
1、新建一個sftpgroup,以組為單位進行限制
groupadd sftpgroup
2、 新建一個賬戶zhangsan,加入sftpgroup
useradd -d /home/zhangsan -s /usr/sbin/nologin -M -N -gsftpgroup zhangsan
這裡shell 設定為/usr/sbin/nologin, 使其無法獲取互動式shell,其實這裡設定成啥都無所謂,關鍵點在4節中的ForceCommand internal-sftp 配置,稍後會解釋。
3、zhangsan賬戶以公鑰方式認證,額外配置如下
mkdir -p /home/zhangsan/.ssh chown zhangsan:sftpgroup /home/zhangsan/.ssh chmod 700 /home/zhangsan/.ssh cat xxx.pub >/home/zhangsan/.ssh/authorized_keys chown zhangsan:sftpgroup /home/zhangsan/.ssh/authorized_keys chmod 700 /home/zhangsan/.ssh/authorized_keys
4、 配置sshd_config
配置如下:
這裡有3點需要解釋:
Subsystem sftp /usr/lib/openssh/sftp-server 更為 internal-sftp,這兩者有什麼區別呢?
簡單的說預設sftp 程序由單獨的二進位制檔案:/usr/lib/openssh/sftp-server啟動,而internal-sftp 則無需外部二進位制檔案額外啟動一個程序,整合在sshd程序內了。
internal-sftp相較於 /usr/lib/openssh/sftp-server 優點在於:
效能好,無需額外程序了嘛;
安全性好,無需使用者登入shell,且可使用ChrootDirectory 限制sftp行為活動的目錄;
sftp-server 的存在主要是向後相容。
綜上,考慮internal-sftp的安全性,故更改為internal-sftp。
Match指令是用來幹什麼的?
Match指令主要用於條件匹配,比如上圖:
Match group sftpgroup
這告訴sshd 程序,sftpgroup 使用者組中的使用者適用下面的限制:
ChrootDirectory %h # 限制sftp的活動目錄在其Home 目錄; X11Forwarding no # 禁止X11轉發; AllowTcpForwarding no # 禁止tcp轉發。
ForceCommand internal-sftp
ForceCommand internal-sftp 是什麼意思?
防止使用者執行他們自己自定義的命令,限制使用者命令執行上下文為sftp(可以理解為使用者的’shell’就是sftp 那個上下文環境), 即:使用者除了能執行sftp中允許的命令外,其他命令啥也執行不了
0×02 測試驗證
1、ssh 連線失敗
ssh 連線提示只接受sftp connection,這就是0×02提到的ForceCommand internal-sftp 配置的效果,如果配置了這個,不管zhangsan這個使用者的登入shell是啥都不好使。 如果去掉0×02提到的ForceCommand internal-sftp 配置,則ssh連線時候提示如下:
2、sftp連線被接受,但活動目錄受限