本文大部分来自文章Linux建立SFTP专用帐号,并设置Chroot环境教程 _ 小媛啾
但是安装本文操作还是会报错误: fatal: bad ownership or modes for chroot directory "/home/ftpuser" [postauth]. ( 通过命令:vim /var/log/secure 或 journalctl -ex 查看错误日志)关键还是有一步没说清楚!!!特修改记录下。
介绍如何在 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.
参考数据:Tecmint、StackExchange、DigitalOcean、The Geek Stuff