介紹如何在 Linux 系統上建立 SFTP 傳輸檔案專用的帳號,禁止該帳號以 SSH 登入,並以 chroot 將使用者限制在自己的家目錄中,加強系統安全性。
SFTP 是一種加密的檔案傳輸協定,功能跟 FTP 類似,都可以傳輸大量的檔案,不過比傳統的 FTP 更為安全。以下我們將介紹如何在 Linux 中建立 SFTP 檔案傳輸專用帳號,讓帳號只能用來傳輸檔案,不可以登入系統執行指令,增加系統的安全性。
若要讓使用者只能以 SFTP 傳輸檔案,可以透過使用者帳號的方式設定單一使用者,或是以群組來設定多個使用者帳號,選擇其中一種方式即可(或是混用亦可)。
首先建立 SFTP 專用的使用者帳號(YOUR_ACCOUNT
請換為自己的帳號名稱):
# 建立使用者
sudo adduser YOUR_ACCOUNT
接著編輯 /etc/ssh/sshd_config
這個 sshd 伺服器設定檔,在檔案的最後加上這一段針對單一帳號的特殊設定:
# 設定 YOUR_ACCOUNT 為 SFTP 專用帳號 Match User YOUR_ACCOUNT ForceCommand internal-sftp PasswordAuthentication yes ChrootDirectory /home/%u PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
其中的 YOUR_ACCOUNT
要替換為自己的 SFTP 專用帳號名稱。這些設定的作用就是讓此帳號不能使用 SSH 的各種功能,只能以 SFTP 傳輸檔案,並且以 chroot 的方式限制在自己的家目錄,無法看到系統上的其他檔案。
如果一次要建立多個 SFTP 專用帳號,可以用群組的方式來設定,首先建立一個 SFTP 專用群組:
# 新增系統群組 addgroup --system YOUR_GROUP
然後將所有的 SFTP 專用帳號都加入這個群組中,我們可以在新建帳號時就直接指定主要群組,或是將既有的帳號加入此群組:
# 建立新帳號並指定主要群組 adduser YOUR_ACCOUNT YOUR_GROUP # 設定既有帳號的主要群組 usermod -g YOUR_GROUP YOUR_ACCOUNT # 將既有帳號加入指定群組 usermod -a -G YOUR_GROUP YOUR_ACCOUNT
接著編輯 /etc/ssh/sshd_config
這個 sshd 伺服器設定檔,在檔案的最後加上這一段針對該 SFTP 群組的特殊設定:
# 設定 YOUR_GROUP 為 SFTP 專用群組 Match Group YOUR_GROUP ForceCommand internal-sftp PasswordAuthentication yes ChrootDirectory /home/%u PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
這一段設定跟上面單一使用者的設定幾乎相同,只不過這裡是將設定套用在 YOUR_GROUP
群組中的所有使用者。
調整好 sshd 伺服器的設定檔之後,建議先測試一下設定檔是否有錯誤,以免採用錯誤的設定造成 sshd 伺服器無法啟動,把自己擋在伺服器之外:
# 測試 sshd 伺服器設定檔是否有錯誤 sudo sshd -t
若沒有任何錯誤訊息,就表示沒問題。
重新啟動 sshd 伺服器:
# 重新啟動 sshd 伺服器
sudo systemctl restart sshd
使用 chroot 的時候,根目錄的擁有者必須為 root
,並且權限要是 755
,所以這裡要設定好擁有者與權限:
# 設定 Chroot 根目錄擁有者與權限 sudo chown root:root /home/YOUR_ACCOUNT sudo chmod 755 /home/YOUR_ACCOUNT
如果沒有設定正確的根目錄權限,client 端連線時就會出現類似這樣的錯誤。
client_loop: send disconnect: Broken pipe
而伺服器的紀錄檔則會顯示這樣的錯誤訊息:
sshd[869]: fatal: bad ownership or modes for chroot directory "/home/YOUR_ACCOUNT"
如果需要讓使用者上傳檔案,就要另外建立一個上傳專用的目錄,並設定好擁有者與權限:
# 建立上傳專用目錄 sudo mkdir /home/YOUR_ACCOUNT/upload sudo chown YOUR_ACCOUNT:YOUR_GROUP /home/YOUR_ACCOUNT/upload
在本機的設定部份,我們也可以更改這些 SFTP 專用帳號的登入 shell,避免這些帳號從本機登入。
如果不想讓使用者登入,可以將其登入 shell 改為 /usr/sbin/nologin
,但是這個 shell 沒有在系統的 shell 清單之內,所以要先將其加入:
# 於 /etc/shells 新增 /usr/sbin/nologin echo "/usr/sbin/nologin" | sudo tee -a /etc/shells
接著更改 SFTP 專用帳號的登入 shell:
# 更改指定帳號的登入 Shell sudo chsh --shell /usr/sbin/nologin YOUR_ACCOUNT
這樣一來,該帳號不管從何處都無法登入主機執行任何指令。
若要查詢帳號的登入 shell,可以使用 getent
指令:
# 查詢指定帳號的登入 Shell getent passwd YOUR_ACCOUNT | cut -d: -f7
我們可以測試一下以 SFTP 專用帳號透過 SSH 登入,縱使帳號密碼都正確,還是無法登入系統,只會顯示這樣的錯誤訊息:
This service allows sftp connections only.
如果從本機登入的話,由於我們已經改了登入 shell,所以也是無法登入的,只會顯示這樣的錯誤訊息:
This account is currently not available.