添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

看到某云的CDN居然是使用ftp这种早该淘汰的协议,不禁有些吐槽。ftp曾经作为互联网上最重要的协议,但漫长使用过程中体现出的各种缺点,已不适合再使用。其中最致命的问题就是明文传输用户密码。建议使用这种CDN时,最好长个心眼关闭ftp管理方式,直接使用回源透传的模式。

不过某些情况下,不适合使用svn、git之类的方式来传输文件时(一般是不需要版本管理的二进制文件),最合适的选择就是ftp这种类型的协议。ftp的替代品也不少,如sftp、ftps、webdav。我个人最看好的是webdav,但是鉴于几乎所有的linux服务器都安装了ssh,使用sftp可以更省资源,不需要开启额外的进程和端口。接下来记录sftp的设置过程,系统环境基于debian 8。

我的需求是这样的:设置一个sftp目录,可以通过sftp上传/下载,同时nginx也需要能够读写,以方便我上传/更新web程序,以及下载web服务器的日志。

操作流程如下:

  • 添加sftp账号
  • 首先建立好sftp的目录:
  • mkdir /var/sftp
    
  • 创建用于sftp的用户和用户组
  • groupadd sftp
    useradd -g sftp -d /var/sftp -s /bin/false sftp
    passwd sftp
    # 设置密码
    
  • 通过chroot限制sftp服务的访问目录
  • 编辑ssh的配置文件,设置chroot目录,把sftp限制在他的用户目录下(%h代表用户目录),并且禁止掉其他不需要的ssh权限
  • nano /etc/ssh/sshd_config
    # 找到Subsystem,注释掉原来的那行
    #Subsystem sftp /usr/lib/openssh/sftp-server
    # 再添加下面的新行
    Subsystem sftp internal-sftp
    # 限制sftp的目录,让他看不到不应该看到的东西
    Match Group sftp
    ChrootDirectory %h
    AllowTcpForwarding no
    X11Forwarding no
    ForceCommand internal-sftp
    
  • 创建上传目录并设置权限,ChrootDirectory的目录和其所有上层目录的所有者必须是root,并且权限不能大于755
  • cd /var/sftp
    mkdir www
    chmod 770 www
    chown sftp:sftp www
    cd ..
    chmod 755 sftp
    chown root:root sftp
    
  • 设置掩码,以便外部程序能够使用
  • sftp上传过程中创建的目录和文件所有者固定为sftp:sftp,权限默认为755,其他用户只能读不能写。这里我们需要修改为可以被组成员读写(当然了解原理后你也可以图省事,直接允许所有用户读写)
  • nano /etc/pam.d/sshd
    # 在文件最末尾添加
    session optional pam_umask.so umask=0007 # 也可以是0002
    
  • 给nginx使用的用户添加用户组sftp,我这里是www-data
  • usermod -G sftp www-data
    
  • 还原shell中的默认umask,避免被sftp覆盖
  • nano /etc/profile
    # 在文件最末尾添加
    umask 022
    

    到此,我们已经顺利的架设了sftp服务,可以使用各种流行的ftp客户端,比如FileZilla、FlashFXP安逸的上传/下载文件啦。

    最后修改于 2016-11-06