linux中一般默认就会有ssh功能,也就自带了sftp功能了。想用sftp来替代ftp,做文件共享使用。最简单的方法就是直接新增一个linux的用户就可以了。但如果新增用户,权限就会有点过高,这个用户可以查看很多目录,也能ssh到服务器上,让人没有安全感。那么怎么配置一个单纯只为了分享文件的SFTP呢?只有指定目录的权限。
本文测试环境:
Ubuntu 20.04.1 LTS
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
用户名,这样就可以单独为指定用户做配置。
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 用户
groupadd 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
权限要求有以下两点:
上面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
权限要求有以下两点:
一定要看一下,主目录是否是root是唯一拥有者。
虽然sftp用户无法对自己的根目录拥有所有的权限,美中不足。但是不影响我使用了。
https://www.cnblogs.com/convict/p/16411632.html
https://blog.csdn.net/programm_er/article/details/128253492