Linux配置SFTP用户的详细过程

0. 背景

Linux机器上已有路径/data/tomcat/apache-tomcat-8.5.96/webapps/webroot,需要在该路径之下配置一个目录对外暴露给业务人员使用。业务人员使用sftp协议上传文件。

下面是相关配置:

  • SFTP 用户名:iios

  • SFTP主目录:/data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp

  • iios用户的sftp目录(用户根目录):/data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios

  • iios用户sftp上传目录:/data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/upload

注意:下面的命令皆在root用户下操作完成

1. 创建sftp相关目录 && 生成 sftp用户

创建目录:
  • mkdir -p /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/upload

Q:为什么创建了 /sftp/iios/upload 三级目录呢?

A:当sftp的方式用户登录到用户根目录(/sftp/iios/)后,根目录是无法写入的。所以还需要在用户根目录下创建upload目录。详细解释在文章末尾

创建角色:
  • 创建用户组:groupadd sftp

  • useradd -g sftp -M -s /sbin/nologin iios

    • -g :指定用户组
    • -M :不要创建该用户的家目录
    • -s:指定该用户登录后使用的shell

有些文章/sbin/nologin 与 /bin/false 区别

  • 配置该用户密码:passwd iios

2. 修改sftp 配置文件

  • vi /etc/ssh/sshd_config

    shell 复制代码
    # Subsystem     sftp    /usr/libexec/openssh/sftp-server   #注释掉此行并添加下列多行
    Subsystem sftp internal-sftp
    Match User iios                  
    ChrootDirectory /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/      #chroot目录,按需自定义
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

    注意:ChrootDirectory 目录不能直接配置到用户sftp上传目录,需要配置到上一级即用户根目录

  • 重启ssh服务:service sshd reload or systemctl restart sshd

3. 配置sftp目录权限

注意:ChrootDirectory 的权限设定有两个非常重要的规则

  • 从该目录开始上钻到系统根目录为止的目录的所有者有且仅是root
  • 从该目录开始上钻到系统根目录为止的目录都不能具有群组写入权限

如果你的目录层级较多,记得逐级检查!!!

按上述规则设置SFTP主目录与用户根目录的目录权限

  • chown root:root /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/
  • chown root:root /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios
  • chmod 755 /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/
  • chmod 755 /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios

将iios用户sftp上传目录的目录权限设置为 iios ,这样iios才可以上传文件

  • chown iios:sftp data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/
  • chmod 777 /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/

4. 测试sftp

  • 终端中测试sftp 是否能登录: sftp iios@localhost ...
  • 之后使用sftp工具上传文件

5. QA

  • Q1:为什么创建了 /sftp/iios/upload 三级目录?

  • A1 :1. sshd_config配置文件的ChrootDirectory 配置的路径属主必须是root且只有属主拥有写权限,即ChrootDirectory (.../sftp/iios)最大权限也只有755

    1. 即在iios的用户根目录中,iios用户没有写入权限

    2. 为了保证iios有写入权限,只能在用户根目录再创建一个子目录(/upload),由于该目录不受规则约束,所以可以自由设置权限例如777

  • Q2 : 为什么会有ChrootDirectory 的规则(属主和写入权限)?文档出处在哪里?

  • A2: 终端输入 man sshd_config, Description 下翻到 ChrootDirectory 条目:原文摘录如下

    ChrootDirectory

    Specifies the pathname of a directory to chroot(2) to after authentication. At session startup sshd(8) checks that all components of the pathname are root-owned directories which are not writable by any other user or group.

    After the chroot, sshd(8) changes the working directory to the user's home directory. Arguments to ChrootDirectory accept the tokens described in the TOKENS section.

    上文中:

    • sshd会将ChrootDirectory 配置的路径的所有目录检查是否是 root所有且其他用户或其他组没有写入权限
    • sshd会将ChrootDirectory 配置的路径之后作为用户的主目录
相关推荐
滴水之功12 分钟前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
saynaihe16 分钟前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
ldinvicible30 分钟前
How to run Flutter on an Embedded Device
linux
YRr YRr1 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.1 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
不想起昵称9292 小时前
Linux SHELL脚本中的变量与运算
linux
loong_XL2 小时前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx
夕泠爱吃糖2 小时前
C++中如何实现序列化和反序列化?
服务器·数据库·c++