OpenSSH版本6.1p1,操作系统Fedora 18。
1 基本设置
很简单,用文本编辑器打开/etc/ssh/sshd_config,寻找下面这一行文字:
Subsystem sftp /usr/libexec/openssh/sftp-server
如果这行文字存在且没有被注释掉,那么SFTP已经开启。所有可使用ssh的用户都可使用SFTP。
但是这种方式有一个缺陷,就是用户在SFTP软件里面可以cd /
从而看到系统所有文件。
2 进阶设置
2.1 把用户的SFTP操作记录到日志文件中
- 用文本编辑器打开/etc/ssh/sshd_config,把Subsystem那一行修改为下面样子:
Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO
- 用文本编辑器打开/etc/rsyslogd.conf,增加下面一行:
# Log sftp-server in a separate file :programname, isequal, "sftp-server" /var/log/sftp.log
- 重启sshd服务和rsyslog服务:
# systemctl restart sshd.service # systemctl restart rsyslog.service
- 可在/var/log/sftp.log中查看用户登录及文件操作信息。
- 设置logrotate,避免日志文件过大。方法是创建/etc/logrotate.d/sftp文件,输入下面内容,保存:
/var/log/sftp.log { postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
2.2 把SFTP用户限定到特定目录中
前面我们知道,用户使用客户端成功连接SFTP服务器后,在客户端里可以切换到/
目录,并查看所有有权查看的内容。如果想把用户限定在特定目录里,可以遵循以下步骤:
- ssh账户就是系统账户,把用户限制到某特定目录是通过ssh的chroot功能实现的。如果我们想让用户可以ssh登录到shell界面,必须在chroot目录下提供支持交互登陆所必须的一些文件。换句话说,我们做不到既能限制用户的SFTP访问目录,还能ssh正常登录并使用系统所有命令。因此必须创建一个只用于SFTP访问的用户sftp:
# useradd -m -s /sbin/nologin sftp
- 把现有用户加入sftp的用户组中,以便访问其上传的文件。以用户john为例:
# usermod -aG sftp john
- 修改sftp家目录权限,让sftp用户组的所有用户都可访问其中文件:
# chmod 770 /home/sftp/
- 修改sshd配置文件/etc/ssh/sshd_config,找到Subsystem一行,改为下面的样子(注意里面把2.1节的“/usr/libexec/openssh/sftp-server”换成了“internal-sftp”,这是为了避免chroot后找不到sftp-server这个文件,无法正常使用SFTP服务器的情况。不过实际测试下来,在Fedora 18环境下,这一行不修改也可以正常使用):
Subsystem sftp internal-sftp -l INFO
然后添加下面内容:
Match User sftp X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp -l INFO ChrootDirectory /home
由于chroot的目录及其父目录所有者必须是root,且对root外其他用户不可写,简单起见我们把它设置为/home(上面ChrootDirectory设置项)。
- 重启sshd服务,使设置生效:
# systemctl restart sshd.service
需要注意的是,设置了ChrootDirectory之后,系统无法记录SFTP的访问信息。具体到上面例子,使用sftp这个用户登录及操作文件的信息将不会被记录在服务器日志中。解决方法如下:
- 在chroot目录下创建dev目录:
# mkdir /home/dev
- 用文本编辑器打开/etc/rsyslog.conf,添加下面内容:
# Create an additional socket for some of the sshd chrooted users. $AddUnixListenSocket /home/dev/log # Log internal-sftp in a separate file :programname, isequal, "internal-sftp" /var/log/sftp.log
- 注意如果系统开启了SELinux,$AddUnixListenSocket这一行设置无法生效。暂不想深入研究SELinux,在这里我们简单地禁用它。编辑/etc/selinux/config文件,把“SELINUX=”一行改为下面内容,然后重启系统:
SELINUX=disabled
今后再使用sftp这个用户访问SFTP服务器,/var/log/sftp.log就会有相关记录(设置logrotate见2.1 把用户的SFTP操作记录到日志文件中 )。
3 主要参考文档
3.2 Secure chroot() remote file access via SFTP and SSH
3.3 Fedora 17的System Administrator's Guide
Visits: 6525