sftp限定用户权限指定目录

linux中一般默认就会有ssh功能,也就自带了sftp功能了。想用sftp来替代ftp,做文件共享使用。最简单的方法就是直接新增一个linux的用户就可以了。但如果新增用户,权限就会有点过高,这个用户可以查看很多目录,也能ssh到服务器上,让人没有安全感。那么怎么配置一个单纯只为了分享文件的SFTP呢?只有指定目录的权限。

本文测试环境:
Ubuntu 20.04.1 LTS

配置SSH

修改/etc/ssh/sshd_config

vim /etc/ssh/sshd_config

注释–
Subsystem sftp /usr/lib/openssh/sftp-server

新增++
Subsystem sftp internal-sftp
表示sftp服务使用系统自带的internal-sftp

文件最后面新增内容:

Match Group sftp  			# 匹配组,多个组用逗号分隔
ChrootDirectory %h			# 指定用户根目录。%h表示用户home目录,%u表示用户名
X11Forwarding no			# 禁止X11转发
AllowTcpForwarding no		# 禁止TCP转发
ForceCommand internal-sftp	# 强制使用系统internal-sftp

也可以Match User 用户名,这样就可以单独为指定用户做配置。

重启ssh 服务

systemctl restart sshd

解决报错

至次,大部分人都已经成功了,成功的人可以忽略这一段。显然我是踩坑之人,解决办法如下:
如果这一步有报错,可以执行

/usr/sbin/sshd -T

检查到底哪里配置错误了。
提醒上面一段如果不加到文件最后面可能会遇到重启ssh服务报错的情况。形如:

/etc/ssh/sshd_config line 134: Directive 'UseDNS' is not allowed within a Match block

如果你跟我一样是个倔种,就不想放在文件末尾,你可以在这段的末尾增加一行

Match all

我的配置如下:

# override default of no subsystems
#Subsystem      sftp    /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp                        # 匹配组,多个组用逗号分隔
ChrootDirectory %h                      # 指定用户根目录。%h表示用户home目录,%u表示用户名
X11Forwarding no                        # 禁止X11转发
AllowTcpForwarding no           # 禁止TCP转发
ForceCommand internal-sftp      # 强制使用系统internal-sftp
Match all

至此sftp服务器就配置完成了。基本可以做到一劳永逸。

初始化

先做一些准备工作,一劳永逸的活儿。

创建sftp用户组

# 因为有多个 sftp 用户,所以需要建立一个组为sftp,专门管理 sftp 用户
groupadd sftp

创建用于存储sftp的主目录

修改SFTP_PATH变量的值即可。

#【修改】定义SFTP存放的基础目录,修改成你喜欢的
export SFTP_PATH=/home/sftp_data/
# 创建目录
mkdir -p ${SFTP_PATH}
# 给root授权
chown -R root:root ${SFTP_PATH}
chmod 755 ${SFTP_PATH}

为什么要这么做?
ssh中指定了ChrootDirectory,而ChrootDirectory权限要求有以下两点:

  • ChrootDirectory指定的目录及该目录到系统根目录为止,目录拥有者都只能是root
  • ChrootDirectory指定的目录及该目录到系统根目录为止,群组用户不能有写入权限

创建用户

上面sftp已经成功配置了,那么我们现在新增一个用户就可以使用了。

考虑到用户会多次创建,为了方便,我直接写成一个脚本,大家复制即可。只需修改SFTP_PATH,SFTP_USER_NAME两个变量的值即可。

#【修改】定义SFTP存放的基础目录,修改成你喜欢的
export SFTP_PATH=/home/sftp_data/
#【修改】用户名,修改成你喜欢的
export SFTP_USER_NAME=ftpuser2
#添加用户
useradd -m -d $SFTP_PATH$SFTP_USER_NAME -s /usr/sbin/nologin -g sftp $SFTP_USER_NAME
#给sftp用户授权update目录
mkdir -p ${SFTP_PATH}${SFTP_USER_NAME}/upload
chown ${SFTP_USER_NAME}:sftp ${SFTP_PATH}${SFTP_USER_NAME}/upload
# 给root设置主目录权限
chown root ${SFTP_PATH}${SFTP_USER_NAME}
#配置密码
passwd ${SFTP_USER_NAME}

执行完成,输入一下密码即可。

创建用户参数解释
-m:自动创建 home 目录
-d:指定 home 目录为 /data/sftp_data/ftp1 这里会被作为根目录
-s:shell 为 /usr/sbin/nologin 禁止用户使用SSH登录,仅用于 SFTP
-g:指定组为 sftp

原以为这一步就结束了,可以登录以后其中upload目录可以上传下载操作。
这时你可能跟我一样有个疑问为什么不可以直接对sftp用户的主目录授权。比如你这样授权了

chown ${SFTP_USER_NAME}:sftp ${SFTP_PATH}${SFTP_USER_NAME}

授权以后就会导致这个ftp用户无法登录了。原因是

ChrootDirectory指定的目录及该目录到系统根目录为止,目录拥有者都只能是root

其实我想让sftp用户可对主目录有操作权限,暂时没有找到完美的解决办法。

无法连接,报错?

虽然上面已经提过了,我还是要在强调一下,因为我在此次浪费了不少时间。
ssh中指定了ChrootDirectory,而ChrootDirectory权限要求有以下两点:

  • ChrootDirectory指定的目录及该目录到系统根目录为止,目录拥有者都只能是root
  • ChrootDirectory指定的目录及该目录到系统根目录为止,群组用户不能有写入权限

一定要看一下,主目录是否是root是唯一拥有者。

总结

虽然sftp用户无法对自己的根目录拥有所有的权限,美中不足。但是不影响我使用了。

参考

https://www.cnblogs.com/convict/p/16411632.html

https://blog.csdn.net/programm_er/article/details/128253492

你可能感兴趣的:(linux,sftp)