我正在尝试为互联网上的某人提供对本地文件夹的访问权限。经过一番谷歌搜索后,我得出结论,SFTP 是通过防火墙向混乱而邪恶的互联网世界公开的最安全的方式。我打算为此使用 openssh-server。尽管我相信 openssh 会阻止随机攻击者,但一旦有人通过 ssh 连接,我不太确定我的计算机是否安全。
尤其是,即使我没有授予该人的用户帐户任何权限,他也可能能够“su”到“nobody”。由于我以前从未担心过这样的事情,我可能在某个时候向 nobody 授予了一些中等权限(当然不是 sudo 权限!)。
我当然会重视你关于首先不向任何人授予特权的评论,但这不是重点。我的目标是在沙盒状态下向某人授予 SFTP 访问权限,这样我就不需要担心这些事情了(至少不会比我以前更担心)。
这真的有可能吗?我是在胡说八道还是在白担心?
答案1
您可能需要稍微强化服务器(查看失败2ban并将端口从 22 更改为一个好的开始),但是,假设我正确阅读了您的问题,您希望 chroot SFTP 用户并限制他们只能使用 SFTP(而不是执行任何其他命令)
我已经在我的一台服务器上使用以下脚本实现了此功能:
echo 'CREATING USER' $1
echo 'adding user ..'
sudo useradd -d /home/$1 -s /usr/lib/sftp-server -M -N -g sftponly $1
echo '..done'
echo '--------------'
echo 'set a password'
sudo passwd $1
echo 'creating dir structure ..'
sudo mkdir -p /home/$1/uploads /home/$1/.ssh
sudo chown $1:sftponly /home/$1/uploads /home/$1/.ssh
#
cd /home/$1
echo 'adding shares ..'
sudo mkdir -p {ebooks,misc,movies,music,tv}
echo 'ebooks' && sudo mount --rbind /home/media/ebooks /home/$1/ebooks -o ro
echo 'misc' && sudo mount --rbind /home/media/misc /home/$1/misc -o ro
echo 'movies' && sudo mount --rbind /home/media/movies /home/$1/movies -o ro
echo 'music' && sudo mount --rbind /home/media/music /home/$1/music -o ro
echo 'tv' && sudo mount --rbind /home/media/tv /home/$1/tv -o ro
#
echo '..done'
它能做什么:
- 创建用户,将其添加到“sftponly”组并更改其 shell
- 为该用户创建一个目录结构,以便将其 chroot 到其中
- 使用 mount + rbind 将现有文件树挂载到新用户等效文件夹中(只读)
在使用之前,您需要通过执行以下操作来准备系统:
添加群组
sudo addgroup sftponly
修改 sshd_config
/etc/ssh/sshd_config
文件并添加以下内容:
Match group sftponly
ChrootDirectory %h
X11Forwarding no
ForceCommand internal-sftp
AllowTcpForwarding no
在同一个文件中,找到类似以下内容的行Subsystem sftp /usr/lib/openssh/sftp-server
,并将其更改为Subsystem sftp internal-sftp
编辑可用的 shell
sudo nano /etc/shells
在底部添加以下内容:
/usr/lib/sftp-server