Linux

Linux 建立 SFTP 專用帳號,並設定 Chroot 環境教學

介紹如何在 Linux 系統上建立 SFTP 傳輸檔案專用的帳號,禁止該帳號以 SSH 登入,並以 chroot 將使用者限制在自己的家目錄中,加強系統安全性。

SFTP 是一種加密的檔案傳輸協定,功能跟 FTP 類似,都可以傳輸大量的檔案,不過比傳統的 FTP 更為安全。以下我們將介紹如何在 Linux 中建立 SFTP 檔案傳輸專用帳號,讓帳號只能用來傳輸檔案,不可以登入系統執行指令,增加系統的安全性。

設定僅允許以 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 伺服器無法啟動,把自己擋在伺服器之外:

# 測試 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

更改登入 Shell

在本機的設定部份,我們也可以更改這些 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.

參考資料:TecmintStackExchangeDigitalOceanThe Geek Stuff

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago