Appearance
Linux 安装 SFTP
1. 概述
之前我服务器是使用的 Windows Server 2003,这段时间由于访问量变大我还是机智的换成 Linux 了,在搭建 FTP 的时候看到网上都是推荐 vsftpd,不过我不推荐这个家伙,看官且看下文。
我推荐使用 SSH 自带的 SFTP,SFTP 是 Secure File Transfer Protocol 的缩写,安全文件传送协议。SFTP 使用加密传输认证信息和传输的数据,所以使用 SFTP 是非常安全的。SFTP 之于 FTP 可以理解为 Https 之于 Http,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的 FTP 要低得多,如果您对网络安全性要求更高时,可以使用 SFTP 代替 FTP。
本文最终的效果:在 Linux 下建立 sftp-users 用户组,在该组下建多个用户,禁止该组所有用户 ssh 远程登录服务器,但是允许该组所有用户登录 sftp,并只能访问自己的目录及子目录中的文件。
2. 安装 ssh 和 openssh-sftp-server
其实 Linux 发行版基本都是安装了 OpenSSH 的,不过我们这里还是确认一下是否安装,一般我们需要安装 openssh-server、openssh-sftp-server,所以我们检查是否安装了 SSH。
Debian 检查是否安装了 OpenSSH
Bash$ dpkg --get-selections | grep opensshRHEL 检查是否安装了 OpenSSH
- 以 yum 方式安装的:
yum list installed openssh - 以 rpm 包安装的:
rpm -qa | grep openssh - 以 deb 包安装的:
dpkg -l | grep openssh
- 以 yum 方式安装的:
如果已经三个包都安装了,那么你的命令行该是如下:
Text
openssh-server installed
openssh-sftp-server installed
...1
2
3
2
3
哪个没有打印就是没有安装,安装即可。
Debian 安装,依次执行以下命令,install 后面只写没有安装的包名即可
Bash$ sudo apt-get updateBash$ sudo apt-get install openssh-client openssh-server openssh-sftp-serverRHEL 安装,install 后面只写没有安装的包名即可
Bash$ sudo yum install openssh-client openssh-server openssh-sftp-server
如果都是安装的,我们需要保证 OpenSSH 的版本不得低于 4.8,因为我们要用 ChrootDirectory 配置用户访问目录,所以检查下 SSH 的版本,执行命令 ssh -V 会打印出如下版本信息:
Text
OpenSSH_6.6.1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f...如果 SSH 的版本低于 4.8,需要升级。
Debian 升级 SSH
Bash$ sudo apt-get updateBash$ sudo apt-get install openssh-serverRHEL 升级 SSH
Bash$ sudo yum update -y openssh-server
3. 建立用户组和用户
我们要建立一个专门管理 sftp 用户的用户组,方便我们管理权限。
建立一个名为
sftp-users的sftp用户组Bash$ sudo groupadd sftp-users在该组建立几个需要登录
sftp的用户新建用户名为
sftp-admin的用户:Bash$ sudo useradd -g sftp-users -m sftp-admin修改
sftp-admin的密码:Bash$ passwd sftp-admin然后连续两次输入你要给该用户设置的密码即可。
如果该用户已存在,但是不在
sftp-users组中,可以移动用户到改组Bash$ usermod –g sftp_users sftp-admin
4. 配置 ssh 和权限
打开
/etc/ssh/sshd_config文件修改
Subsystem sftp为internal-sftp原先应该是:
INISubsystem sftp /usr/libexec/openssh/sftp-server或者:
INISubsystem sftp /usr/lib/openssh/sftp-server现在修改为:
INISubsystem sftp internal-sftp在文件末尾增加内容
INIMatch Group sftp-users AllowTcpForwarding no X11Forwarding no ChrootDirectory %h ForceCommand internal-sftp1
2
3
4
5Match Group sftp-users指定以下的子行配置是匹配sftp-users用户组的,多个用户组用英文逗号分隔;ChrootDirectory %h指定Match Group行指定的用户组验证后用于chroot环境的路径,也就是默认的用户目录,比如/home/sftp-admin;也可以写明确路径,例如/data/www;ForceCommand internal-sftp该行强制执行内部sftp,并忽略任何~/.ssh/rc文件中的命令;
这里要特别注意,因为 ChrootDirectory %h 模式,所以我们等下要设置 sftp-users 中的所有用户的用户目录权限为 root 拥有,否则 sftp-users 组中的用户无法用 sftp 登录。 文件前后内容修改对比如下:

5. 修改 sftp-users 用户组用户目录权限
上面说了,因为使用了 ChrootDirectory %h,现在来修改权限。
修改权限为
root用户拥有Bash$ chown root /home/sftp-admin修改权限为
root可读写执行,其它用户可读Bash$ chmod 755 /home/sftp-admin重启 ssh,登录 sftp
Bash$ sudo systemctl restart sshd重启 ssh 服务 Bash$ sudo systemctl enable sshd设置 ssh 为开机启动 对于不使用 systemd 发行版的 Linux 使用以下命令重启 ssh 服务:
Bash$ sudo service ssh restart现在就可以使用 sftp 登录了,但是我们发现,我们不能上传文件,那是因为登录后默认是用户目录,比如
/home/sftp-admin,但是该目录是root用户拥有,因此我们还要修改权限。在用户目录下建立子目录,让
sftp-users中的用户可读写文件我们现在在
/home/sftp-admin目录下新建一个upload文件夹:Bash$ cd /home/sftp-admin/Bash$ mkdir upload授权
upload文件夹读写让子文件夹
upload属于sftp-adminBash$ chown sftp-admin /home/sftp-admin/upload让子文件夹
upload被sftp-admin读写Bash$ chmod 755 /home/sftp-admin/upload重启 ssh,登录 sftp
现在全部都配置完了,如果在上面第 3 步没有重启 ssh 的话,现在重启后既可以登录使用了。
Bash$ sudo systemctl restart sshd或:
Bash$ sudo service ssh restart
6. 最后
Windows 登录 sftp 推荐使用 WinScp,Linux 用命令即可,Mac 推荐使用 Yummy FTP。