一、环境:

CentOS 6.8

使用 FileZilla 进行 sftp 连接

二、背景

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

之所以是某一目录的访问,是因为 SFTP 的用户登录后,默认是能看到整个系统的文件目录,这样很不安全。

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

三、正文

1、创建新用户

adduser sftpuser1

useradd 和 adduser 的区别

useradd 只会添加一个用户,并没有创建它的主目录,除了添加一个新用户之外什么都没有。这个用户甚至不能登录,因为没有密码。所以这里选择 adduser。

2、设置该用户密码

passwd sftpuser1

回车后再输入密码即可

3、禁止该用户登录 SSH

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

usermod -s /bin/false sftpuser1

sftpuser1的 shell 改成 /bin/false。

4、修改该用户的家目录

usermod -d /data/wwwroot/user1/ sftpuser1

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

5、设置 sshd_config:

打开sshd_config文件

vi /etc/ssh/sshd_config

找到 Subsystem sftp 这一行,修改成:

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

将上面的 sftpuser1/data/wwwroot/user1/ 替换成你需要的。

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

Match user sftpuser2

ForceCommand internal-sftp

ChrootDirectory /data/wwwroot/user2/

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

6、重新启动 sshd 服务:

/etc/init.d/sshd restart

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


四、可能遇到的问题

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

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

修改前:

Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/ UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes

修改后:

UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/

注:当你出现这个错误的时候,sftp 肯定是连不上了。如果你习惯用 FileZilla 去修改配置文件,那么此时你得不情愿的切换到

shell,去用 vi/vim 去修改它了。

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

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

google 了原因如下:

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

1、由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是 root

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

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

的情况。

所以/data/wwwroot/user1/及上级的所有目录属主一定要是

root,并且组权限和公共权限不能有写入权限,如果一定需要有写入权限,那们可以在/data/wwwroot/user1/下建立 777 权限的文件夹

mkdir /data/wwwroot/user1/upload
chown -R sftpuser1:root /data/wwwroot/user1/upload

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

给sftp创建新用户、默认打开和限制在某个目录的更多相关文章

  1. Ubuntu创建新用户并增加管理员权限

    1.Ubuntu中的root帐号默认是被禁用了的,所以登陆的时候没有这个账号 打开终端开启root账户 sudo passwd -u root sudo passwd root 设置root密码,输入 ...

  2. mysql5.6创建新用户并给授权指定的数据库权限

    一.环境: CentOS 6.8 mysql 5.6 二.背景 给外包的工作人员提供我司某台服务器的 mysql 中某个数据库的访问权限. 之所以要做限制,是防止他们对我司其他的数据库非法进行操作. ...

  3. ubuntu创建新用户

    ubuntu和windows一样,可以任意创建或者删除新的用户,windows下比较简单,ubuntu下需要使用命令,不过操作起来不是很繁琐,所以我尽量写的详细一些.  如何创建ubuntu新用户? ...

  4. Ubuntu创建新用户并设置权限

    打开终端开启root账户 sudo passwd -u root 设置root密码,输入两次 sudo passwd root 切换root账号 su - 或 su root 退出root账户使用ex ...

  5. Ubuntu创建新用户并增加管理员权限(授权有问题)

    转自:Ubuntu创建新用户并增加管理员权限 $是普通管员,#是系统管理员,在Ubuntu下,root用户默认是没有密码的,因此也就无法使用(据说是为了安全).想用root的话,得给root用户设置一 ...

  6. Linux下如何创建新用户

    Linux下如何创建新用户 Linux系统中,只有root用户有创建其他用户的权限.创建过程如下:   useradd -d /home/newuser newuser(设定了该用户的主目录和用户名) ...

  7. linux私有ftp搭建与创建新用户

    一.私有ftp搭建 以后补充 1. 搭建 2.修改配置文件 二.创建新用户 在linux搭建好私有ftp后,默认存放目录是 /var/ftp/ 我们有时候需要给外部公司之类的用,但又不想让他们直接在  ...

  8. TestCase--网站创建新用户管理模块

    对于web测试,用户权限管理模块是必测的一个点,所以今天就来总结一下创建新用户管理模块的测试用例 参考图如下: 测试用例设计如下: 一.功能测试 1.  什么都不输入,单击“立即提交”,页面是否有提示 ...

  9. [转帖]postgres 创建新用户并授权-- 非常好的

    postgres 创建新用户并授权 https://blog.csdn.net/XuHang666/article/details/81506297 原作者总结的挺好的 可以用来学习一下. grant ...

随机推荐

  1. cssreset

    /** * http://cssreset.com */html, body, div, span, applet, object, iframe,h1, h2, h3, h4, h5, h6, p, ...

  2. 给我的cnblogs主页做一个响应式布局模板

    在cnblogs,一直都是使用官方自带的那些模板,而且感觉也一直很良好!不过最近用手机搜索一些相关的技术资料,很多都来自cnblogs,有些博主的页面在和机端显得很好,有些则展示得不那么友好了……忽然 ...

  3. 关闭discuzX3.2注册页面的注册邮箱验证

    论坛升级后发现注册用户在输入任何邮箱email时,一直提示email 地址无效.用firephp跟踪发现:随机生成的email的后缀是@localhost! 找到原因,修改如下: //原来代码 if( ...

  4. 使用VsCode编写和调试.NET Core项目

    ​ 本来我还想介绍以下VSCode或者donet core,但是发现都是废话,没有必要,大家如果对这个不了解可以直接google这两个关键字,或者也根本不会看我这边文章. ​ 好直接进入主题了,本文的 ...

  5. CocoaAsyncSocket + Protobuf 处理粘包和拆包问题

    在上一篇文章<iOS之ProtocolBuffer搭建和示例demo>分享环境的搭建, 我们和服务器进行IM通讯用了github有名的框架CocoaAsynSocket, 然后和服务器之间 ...

  6. SQL基础函数

    首先咱们一起来看一下SQL的基本函数 一.聚合函数 二.数学函数 三.字符串函数 四.转换函数 五.时间函数 这样子看起来可能很多,那咱们给变得---------------------------- ...

  7. CF #345 Div1 D Zip-line

    题目链接:http://codeforces.com/contest/650/problem/D 大意是给一个数组,若干询问,每一次把一个数字改为另一个数字,问当前数组最长上升子序列,询问之间是独立的 ...

  8. MyBatis-plus 代码自动生成器

    MyBatis-plus  代码自动生成器 1.添加pom文件依赖 <!-- Mybatis-Plus 自动生成实体类--> <dependency> <groupId& ...

  9. APP反编译第一课《如何找到核心代码》

    相信很多人都应该会去接触APP反编译,本小七给大家带来入门级别套路,自己也在慢慢摸索学习,一起成长吧.第一步,反编译需要的工具有:一.java环境,其实这里你只要安装了burp就不用管这个的二.apk ...

  10. python 错误之SyntaxError: Missing parentheses in call to 'print'

    SyntaxError: Missing parentheses in call to 'print' 由于python的版本差异,造成的错误. python2: print "hello ...