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
注意:下面的命令皆在root用户下操作完成
1. 创建sftp相关目录 && 生成 sftp用户
创建目录:
mkdir -p /data/tomcat/apache-tomcat-8.5.96/webapps/webroot/sftp/iios/upload
Q:为什么创建了 /sftp/iios/upload 三级目录呢?
A:当sftp的方式用户登录到用户根目录(/sftp/iios/)后,根目录是无法写入的。所以还需要在用户根目录下创建upload目录。详细解释在文章末尾
创建角色:
-
创建用户组:
groupadd sftp
-
useradd -g sftp -M -s /sbin/nologin iios
- -g :指定用户组
- -M :不要创建该用户的家目录
- -s:指定该用户登录后使用的shell
有些文章/sbin/nologin 与 /bin/false 区别
- 配置该用户密码:passwd iios
2. 修改sftp 配置文件
-
vi /etc/ssh/sshd_config
shell# 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
注意:ChrootDirectory 目录不能直接配置到用户sftp上传目录,需要配置到上一级即用户根目录
-
重启ssh服务:
service sshd reload
orsystemctl restart sshd
3. 配置sftp目录权限
注意:ChrootDirectory 的权限设定有两个非常重要的规则
- 从该目录开始上钻到系统根目录为止的目录的所有者有且仅是root
- 从该目录开始上钻到系统根目录为止的目录都不能具有群组写入权限
如果你的目录层级较多,记得逐级检查!!!
按上述规则设置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-
即在iios的用户根目录中,iios用户没有写入权限
-
为了保证iios有写入权限,只能在用户根目录再创建一个子目录(/upload),由于该目录不受规则约束,所以可以自由设置权限例如777
-
-
Q2 : 为什么会有
ChrootDirectory
的规则(属主和写入权限)?文档出处在哪里? -
A2: 终端输入
man sshd_config
,Description
下翻到ChrootDirectory
条目:原文摘录如下ChrootDirectory
Specifies the pathname of a directory to chroot(2) to after authentication. At session startup sshd(8) checks that all components of the pathname are root-owned directories which are not writable by any other user or group.
After the chroot, sshd(8) changes the working directory to the user's home directory. Arguments to ChrootDirectory accept the tokens described in the TOKENS section.
上文中:
- sshd会将ChrootDirectory 配置的路径的所有目录检查是否是 root所有且其他用户或其他组没有写入权限
- sshd会将ChrootDirectory 配置的路径之后作为用户的主目录