一、需求
初创公司,资源和资金有限,无法搭建日志系统。
系统上线初期,开发人员需要经常查看生产日志来定位bug,且不能给予开发人员生产服务器的权限。
需要一个简单、安全、轻量级、不耗费资源的方法来满足查看日志的需求。
二、方案
经过调研,使用基于SSH服务的SFTP和Mount挂载本机目录的方法,可以满足需求。
此方法,可以进行严格的权限控制:只读、不能访问其他目录、不能登录服务器。
三、实施步骤
1、新建用做SFTP的用户
groupadd log_ro -g 2000
useradd log_ro -u 2000 -g 2000 -d /home/log_ro -s /sbin/nologin
- 如果服务器是使用密码的登录的,就需要设置log_ro用户的密码
passwd log_ro
- 如果是使用密钥登录的,就要为log_ro做密钥登录的相关配置,和ssh登录一样
- -s /sbin/nologin 控制其不能登录服务器
2、控制权限
对SFTP用户,做不能切换目录和只读的权限控制。
注意:只读是针对SFTP的home目录的,对于日志的只读权限,由日志本身的权限属性进行控制。
chown root:log_ro /home/log_ro
chmod 755 /home/log_ro
3、修改sshd配置
sed -i "s/Subsystem/#Subsystem/g" /etc/ssh/sshd_config
cat >> /etc/ssh/sshd_config << EOF
# sftp for read log
Subsystem sftp internal-sftp
UsePAM yes
Match User log_ro
ChrootDirectory /home/log_ro/
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
EOF
在配置文件中, User指定了sftp的用户,ChrootDirectory指定了sftp登录后的根目录。
注意:
- 根目录本身所属必须是root,属组为sftp用户的属组,权限最小为755。意味着log_ro本身是不能在/home/log_ro中建立新文件、文件夹或者修改文件的。
- 虽然ftp用户对于登录后的根目录没有写权限,但是我们可以用root新建一个文件夹,比如叫upload,然后把这个文件夹所属改为log_ro,这样ftp用户就对/home/log_ro/upload拥有完全的写权限了。上传文件不要放到根目录而是放到upload下面。
4、重启sshd
关掉Selinux:setenforce 0
,重启sshd服务systemctl restart sshd
5、使用mount挂载日志文件
因为软连接在ftp中不能生效,又因为硬链接不能链接目录,所以采用mount挂载本机文件系统的方法实现软连接。
mkdir fps_logs
chown log_ro.log_ro fps_logs
mount --bind /data/app/fps/logs fps_logs
6、验证
使用ftp客户端来验证对于ftp用户权限的控制。
四、其他
最后介绍一下,如果不使用家目录作为sftp的根目录,使用其他目录的方法。
但是有一个原则还是要遵守,就是sftp所在的根目录,和其所有的上级目录,所属必须是root,不然就会碰到sftp连接马上被关闭的情况。
比如我们想要登录后的根目录为/data/haha/abc
/data/haha/abc 应该为root:zhongan 755
/data/haha/ 应该为root:root 755
/data 应该为root:root 755
如果想要上传文件,应该建立/data/haha/abc/upload文件夹,所属zhongan:zhongan , 755,然后上传文件的目标路径为/upload
然后修改/etc/ssh/sshd_config ,修改ChrootDirectory后面的目录为/data/haha/abc/
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com