如何在 Linux 中设置安全的 SFTP 服务器
SFTP 服务通过 SSH 隧道提供安全的文件访问和传输机制。如果您要设置多个用户访问的SFTP服务器,则需要加强安全保护,不仅要保护SFTP用户免受外部入侵者的侵害,还要保护SFTP服务器免受(潜在恶意)SFTP用户的攻击,并在各个SFTP用户之间提供隔离。
在本教程中,我将描述如何在 Linux 中设置安全的 SFTP 服务器,方法是正确保护 SFTP 服务器免受 SFTP 用户的攻击,并将各个 SFTP 用户相互隔离。可以有许多不同的方法来实现此目标,但我将在这里描述基于 MySecureShell
的方法。
MySecureShell
是基于 OpenSSH
的 SFTP 服务器,具有许多安全功能:
限制每个连接的下载/上传带宽
限制每个帐户的并发连接数
隐藏文件和目录所有者/组/权限
隐藏用户无权访问的文件和目录
限制连接的生命周期
Chroot SFTP 用户进入他/她的主目录
拒绝上传与正则表达式匹配的文件和目录
在 Linux 上安装 MySecureShell
要在 Linux 上使用 MySecureShell
,您首先需要安装以下先决条件。
要在 Ubuntu 或 Debian 上安装先决条件:
$ sudo apt-get install libssl0.9.8 ssh openssh-server gcc make
要在 CentOS、RHEL 或 Fedora 上安装先决条件:
$ sudo yum install openssl-devel openssh-server gcc make
安装所有先决条件后,您可以在 Linux 上构建并安装 MySecureShell
,如下所示。
$ wget http://mysecureshell.free.fr/repository/index.php/source/mysecureshell_1.31.tar.gz
$ tar xvfvz mysecureshell_1.31.tar.gz
$ cd mysecureshell_1.31
$ ./configure
$ make
$ sudo ./install.sh en
#########################################
# MySecureShell #
#########################################
Welcome to the MySecureShell installation script !
Detecting needed files for installation:
Existing file MySecureShell [ OK ]
Existing file sftp_config [ OK ]
Do you want to test MySecureShell (check libraries requirement) ? (Y/n)
Test MySecureShell...
Test ending
This script will made a few operations:
- Install MySecureShell in /bin
- Make a configuration file in /etc/ssh/sftp_config
- Introduce if which MySecureShell as a valid shell
- Install utilities in /usr/bin
WARNING: The server will shutdown and all sftp connected clients will be killed !
- Do you want to continue installation ? (Y/n)
MySecureShell Installation
MySecureShell file created [ OK ]
MySecureShell file created [ OK ]
Do you want MySecureShell shell to be add like valid shell on your system ? (Y/n)
MySecureShell shell added like a valid shell [ OK ]
Installation of tool sftp-who [ OK ]
Installation of tool sftp-kill [ OK ]
Installation of tool sftp-state [ OK ]
Installation of tool sftp-admin [ OK ]
Installation of tool sftp-verif [ OK ]
Installation of tool sftp-user [ OK ]
Do you want to automatically rotate MySecureShell logs ? (Y/n)
Initialisation of MySecureShell rotation logs [ OK ]
cp: target `/share/man/fr/man8' is not a directory
Installation of Manuals [ OK ]
Installation Finished !
配置MySecureShell
安装后,验证 MySecureShell
的安装位置。
$ whereis MySecureShell
/usr/bin/MySecureShell
为了使用 MySecureShell
管理 SFTP 用户,首先创建 SFTP 用户所属的 Linux 组。假设该组名为 sftp
。
$ sudo groupadd sftp
然后配置现有的 SFTP 用户(例如 alice
),使该用户属于 sftp
组,并在登录时使用 MySecureShell
shell。
$ sudo usermod -s /usr/bin/MySecureShell -g sftp alice
如果您要从头开始创建新的 SFTP 用户,请改为运行以下命令。
$ sudo useradd -m -s /usr/bin/MySecureShell -g sftp bob
要自定义 MySecureShell
的默认设置,请编辑其位于 /etc/ssh/sftp_config
的配置文件。在配置文件中,您可以定义各种每组安全设置。例如,对于 Linux 组 sftp
:
$ sudo vi /etc/ssh/sftp_config
<Group sftp>
Download 50k # limit download speed for each connection
Upload 0 # unlimit upload speed for each connection
StayAtHome true # limit user to his/her home directory
VirtualChroot true # fake a chroot to the home account
LimitConnectionByUser 1 # max connection for each account
LimitConnectionByIP 1 # max connection by IP for each account
IdleTimeOut 300 # disconnect user if idle too long time (in sec)
HideNoAccess true # hide file/directory which user has no access
</Group>
编辑配置文件后,请确保按如下方式重新启动 sshd。
要在 Ubuntu 或 Debian 上重新启动 sshd
:
$ sudo service ssh restart
要在 CentOS、RHEL 或 Fedora 上重新启动 sshd:
$ sudo service sshd restart
访问和管理SFTP服务器
在客户端,您可以按如下方式登录SFTP服务器。用户被chroot到他自己的主目录,并且服务器上的其他目录对用户不可见。
$ sftp [email _host.com
[email 's password:
Connected to 192.168.233.141.
sftp> pwd
Remote working directory: /
sftp>
在SFTP服务器端,您可以按如下方式管理SFTP服务器及其用户。
监控当前连接的SFTP用户:
$ sftp-who
--- 1 / 10 clients ---
Global used bandwith : 0 bytes/s / 0 bytes/s
PID: 24377 Name: bob IP: 192.168.10.55
Home: /home/bob
Status: idle Path: /
File:
Connected: 2013/05/28 20:57:42 [since 01mins 05s]
Speed: Download: 0 bytes/s [50.00 kbytes/s] Upload: 0 bytes/s [unlimited]
Total: Download: 1002 bytes Upload: 82 bytes
强制断开特定 SFTP 用户的连接:
$ sudo sftp-kill bob