别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 工作
  • 规范

  • Linux

    • 术语
    • Yum 常见操作记录
    • ntpd 时钟同步服务
    • rsync 知识总结
    • 给 SFTP 创建新用户、默认打开和限制在某个目录
      • 背景
      • 基本流程
        • 创建用户组
        • 创建新用户
        • 禁止该用户登录 SSH
        • 重新启动 sshd 服务
      • 设定 Chroot 目录权限
        • 遇到的问题
        • 新用户通过 sftp 访问时,权限不全,只能读不能写
      • 参考链接
      • umask 计算
      • 计算规则
    • 用户、组管理
    • TODO,其他暂时无法归类
    • Linux 面试知识总结
    • Linux 下使用 acme.sh 配置 Let's Encrypt 免费 SSL 证书 + 通配符证书
    • Linux 可执行文件添加到 PATH 环境变量的方法
    • npm 安装及换源
    • 日常指令
  • 数据库

  • Git

  • 👨‍💻Web

  • 英语

  • Docker

  • 编辑器

  • 网络

  • 前端

  • 存储

  • 备忘录

  • 如何开始你的单元测试
  • 以程序员的视角看中国——西安篇
  • 💻工作
  • Linux
佚名
2020-05-26
目录

给 SFTP 创建新用户、默认打开和限制在某个目录

# 背景

给外包的工作人员提供我司服务器的某一目录的访问(包括读写)权限,方便他们部署代码文件。

之所以是某一目录的访问,是因为 SFTP 的用户登录后,默认是能看到整个系统的文件目录,这样很不安全。限制用户只能在自己的 home 目录下活动,这里需要使用到 chroot,openssh 4.8p1 以后都支持 chroot。可以输入ssh -V来查看 openssh 的版本,如果低于 4.8p1,需要自行升级安装。

题外话:如果是针对 ftp 的用户权限管理,推荐使用 vsftpd,可通过 yum 直接安装。

# 基本流程

# 创建用户组

groupadd sftp   # 本例中使用sftp作为组名
1

# 创建新用户

创建一个 sftp 用户,名为 mysftp

useradd -g sftp -s /bin/false mysftp
1

设置用户密码

passwd mysftp
1
  • useradd 和 adduser 的区别 参见linux - What's the difference between "adduser" and "useradd"? - Super User (opens new window)

useradd is native binary compiled with the system. But, adduser is a perl script which uses useradd binary in back-end.

adduser is more user friendly and interactive than its back-end useradd. There's no difference in features provided.

# 禁止该用户登录 SSH

因为我们只想该用户使用 SFTP,并不需要该用户能登录 SSH,威胁安全。

usermod -s /bin/false mysftp
1

将mysftp的 shell 改成 /bin/false。

# 4、修改该用户的家目录

usermod -d /data/wwwroot/user1/ mysftp
1

这样每次用户访问服务器都会默认打开/data/www/user1/,但还是可以跳出这个访问其它目录,需要进行下面一步的操作。

# 5、设置 sshd_config

打开sshd_config文件

vi /etc/ssh/sshd_config
1

找到 Subsystem sftp /usr/libexec/openssh/sftp-server 这一行,修改成:

Subsystem sftp internal-sftp    # 指定sftp服务使用系统自带的internal-sftp
Match Group sftp    # 这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割
Match user mysftp   # 当然,也可以匹配用户,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便
ForceCommand internal-sftp
ChrootDirectory /data/www/user1/
1
2
3
4
5

ChrootDirectory /data/sftp/%u用 chroot 将用户的根目录指定到/data/sftp/%u,%u 代表用户名,这样用户就只能在/data/sftp/%u 下活动,chroot 的含义,可以参考这里:理解 chroot (opens new window) 将上面的 mysftp 和 /data/www/user1/ 替换成你需要的。

AllowTcpForwarding no
X11Forwarding no
1
2

这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉;

多个用户请重复配置这三行:

Match user xxxx  
ForceCommand internal-sftp  
ChrootDirectory /data/www/user2/
1
2
3

这样可以为不同的用户设置不同的限制目录。

# 重新启动 sshd 服务

/etc/init.d/sshd restart
1

现在用 SFTP 软件使用mysftp用户登录,就可以发现目录已经被限定、锁死在/data/wwwroot/user1/了。

# 设定 Chroot 目录权限

# chown root:sftp /data/wwwroot/user1
# chmod 755 /data/wwwroot/user1/
1
2

# 遇到的问题

# 1、修改sshd_config文件后重启 sshd,报错:Directive 'UseDNS' is not allowed within a Match block

语法错误,原因未知,只需要把两段配置的位置互调就不报错了。

修改前:

Subsystem sftp internal-sftp
UsePAM yes
Match user mysftp
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
1
2
3
4
5
6
7
8
9
10
11

修改后:

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes

Subsystem sftp internal-sftp
UsePAM yes
Match user mysftp
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
1
2
3
4
5
6
7
8
9
10
11

# 新用户通过 sftp 访问时,权限不全,只能读不能写

我试着用 root 账号去把该用户的家目录权限改成 777,但是会出现该用户 sftp 登陆不了的情况。(报错:Server unexpectedly closed network connection)

给新用户的家目录的权限设定有两个要点:

  1. 由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是 root
  2. 由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限(最大权限 755)

如果违反了上面的两条要求,那么就会出现新用户访问不了 sftp 的情况。

所以/data/www/user1/及上级的所有目录属主一定要是 root,并且组权限和公共权限不能有写入权限,如果一定需要有写入权限,那们可以在/data/www/user1/下建立 777 权限的 upload 文件夹。

mkdir /data/wwwroot/user1/upload
chown -R mysftp:root /data/wwwroot/user1/upload
1
2

这样mysftp用户就可以在/data/wwwroot/user1/upload里随意读写文件了。

# 参考链接

如何将 SFTP 用户限制在某个目录下? (opens new window) centos 下配置 sftp 且限制用户访问目录 (opens new window) CentOS 的 ssh sftp 配置及权限设置[转载-验证可用] - wooya - 博客园 (opens new window)

# umask 计算

umask Calculator - WintelGuy.com (opens new window)

# 计算规则

Linux umask 与文件默认权限 - 诺晨 - OSCHINA (opens new window)

Linux umask 详解:令新建文件和目录拥有默认权限_操作系统_zyy1659949090 的博客-CSDN 博客 (opens new window) linux - How to use os.umask() in Python - StackOverflow (opens new window)

编辑 (opens new window)
#S#F#T#P
上次更新: 2024-07-16, 03:23:38
rsync 知识总结
用户、组管理

← rsync 知识总结 用户、组管理→

最近更新
01
提升沟通亲和力的实用策略
03-26
02
工作
07-15
03
如何选房子
06-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式