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
1. 创建sftp相关目录 && 生成 sftp用户
创建目录:
mkdir -p /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/upload
创建角色:
-
创建用户组:
groupadd sftp
-
useradd -g sftp -M -s /sbin/nologin iios
- -g :指定用户组
- -M :不要创建该用户的家目录
- -s:指定该用户登录后使用的shell
- 配置该用户密码:passwd iios
2. 修改sftp 配置文件
-
vi /etc/ssh/sshd_config
# 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
-
重启ssh服务:
service sshd reload
orsystemctl restart sshd
3. 配置sftp目录权限
按上述规则设置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
2. 即在iios的用户根目录中,iios用户没有写入权限
3. 为了保证iios有写入权限,只能在用户根目录再创建一个子目录(/upload),由于该目录不受规则约束,所以可以自由设置权限例如777 -
Q2 : 为什么会有
ChrootDirectory
的规则(属主和写入权限)?文档出处在哪里? -
A2: 终端输入
man sshd_config
,Description
下翻到ChrootDirectory
条目:原文摘录如下上文中:
- sshd会将ChrootDirectory 配置的路径的所有目录检查是否是 root所有且其他用户或其他组没有写入权限
- sshd会将ChrootDirectory 配置的路径之后作为用户的主目录