1 基本设置

很简单,用文本编辑器打开/etc/ssh/sshd_config,寻找下面这一行文字:

Subsystem       sftp    /usr/libexec/openssh/sftp-server

如果这行文字存在且没有被注释掉,那么SFTP已经开启。所有可使用ssh的用户都可使用SFTP。

但是这种方式有一个缺陷,就是用户在SFTP软件里面可以cd /从而看到系统所有文件。

2 进阶设置

2.1 把用户的SFTP操作记录到日志文件中

  1. 用文本编辑器打开/etc/ssh/sshd_config,把Subsystem那一行修改为下面样子:

    Subsystem       sftp    /usr/libexec/openssh/sftp-server -l INFO
  2. 用文本编辑器打开/etc/rsyslogd.conf,增加下面一行:

    # Log sftp-server in a separate file
    :programname, isequal, "sftp-server" /var/log/sftp.log
  3. 重启sshd服务和rsyslog服务:

    # systemctl restart sshd.service
    # systemctl restart rsyslog.service
  4. 可在/var/log/sftp.log中查看用户登录及文件操作信息。

  5. 设置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服务器后,在客户端里可以切换到/目录,并查看所有有权查看的内容。如果想把用户限定在特定目录里,可以遵循以下步骤:

  1. ssh账户就是系统账户,把用户限制到某特定目录是通过ssh的chroot功能实现的。如果我们想让用户可以ssh登录到shell界面,必须在chroot目录下提供支持交互登陆所必须的一些文件。换句话说,我们做不到既能限制用户的SFTP访问目录,还能ssh正常登录并使用系统所有命令。因此必须创建一个只用于SFTP访问的用户sftp:

    # useradd -m -s /sbin/nologin sftp
  2. 把现有用户加入sftp的用户组中,以便访问其上传的文件。以用户john为例:

    groupadd sftps

    # usermod -aG sftps sftp
  3. 修改sftp家目录权限,让sftp用户组的所有用户都可访问其中文件:

    # chmod 770 /home/sftp/
  4. 修改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设置项)。

  5. 重启sshd服务,使设置生效:

    # systemctl restart sshd.service

需要注意的是,设置了ChrootDirectory之后,系统无法记录SFTP的访问信息。具体到上面例子,使用sftp这个用户登录及操作文件的信息将不会被记录在服务器日志中。解决方法如下:

  1. 在chroot目录下创建dev目录:

    # mkdir /home/dev
  2. 用文本编辑器打开/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
  3. 注意如果系统开启了SELinux,$AddUnixListenSocket这一行设置无法生效。暂不想深入研究SELinux,在这里我们简单地禁用它。编辑/etc/selinux/config文件,把“SELINUX=”一行改为下面内容,然后重启系统:

    SELINUX=disabled

    今后再使用sftp这个用户访问SFTP服务器,/var/log/sftp.log就会有相关记录(设置logrotate见2.1 把用户的SFTP操作记录到日志文件中 )。

3 主要参考文档

3.1 CentOS 6.0的sftp配置

3.2 Secure chroot() remote file access via SFTP and SSH

3.3 Fedora 17的System Administrator's Guide