来源: DevOpSec公众号 作者: DevOpSec
背景
研发需求:
- 研发想查看线上服务日志
- 研发要看线上部署代码是否正确
- 研发想看业务运行时产生数据是否正确
运维需求:
- 运维不想让研发有太多权限
- 只有产看某些特定目录的权限和产看日志
问题: 研发具有太多权限后,对线上风险影响较大,比如研发误操作删文件跑路,运维背锅,这时候需要运维既能满足研发需求也能保证线上服务器稳定性和安全性,下面我们用一个案例把上诉研发和运维的需求都实现。
案列: 日志目录:/data/logs/app-name 当研发登陆操作系统后看到的只有这个目录下的日志,系统上其他目录没有权限查看。
下面我们来看看实现。
使用技术
- linux ACL
ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件
/
目录的访问权限。 - ssh
ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。下文中我们修改sshd配置,让其在用户连接是chroot到
/
目录,本文根目录则是:/data/data/userlimit
- chroot
chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以
/
,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/
位置。
实施
1. 、创建受限的沙箱根目录,并设置权限以及用户组
mkdir /data/data/userlimit
chown -R root:root /data/data/userlimit
chmod -R 0755 /data/data/userlist
2. 创建沙箱环境需要的基本环境目录
mkdir /data/data/userlist/{bin,dev,lib64,etc}
同时创建了四个目录: /data/data/userlist/bin /data/data/userlist/dev /data/data/userlist/lib64 /data/data/userlist/etc
其中bin目录是用于存放沙箱环境可执行的命令 dev是用于挂载外部设备的目录 lib64是用于存放沙箱环境依赖的动态链路库文件 etc用于存放沙箱环境的配置文件
3. 复制沙箱依赖的动态链路库文件到lib64
ldd $(which bash)
cp -r /lib64/* /data/data/userlist/lib64
如果需要单独复制某些命令则可以单独查询命令的依赖文件,然后拷贝到/data/data/userlist/lib64/目录下
4. 开放指定命令到沙箱环境
cp /bin/{ls,date,cat,grep,tail} /data/data/userlist/bin/
以上是希望开放ls命令给沙箱环境的用户,如果需要开放其他命令则同样处理。
5. 创建ssh以及sftp必须的字符设备
mknod -m 666 /data/data/userlist/dev/null c 1 3
mknod -m 666 /data/data/userlist/dev/tty c 5 0
mknod -m 666 /data/data/userlist/dev/zero c 1 5
mknod -m 666 /data/data/userlist/dev/random c 1 8
通过man sshd_config的说明,可以查看到创建运行shell和sftp所必须的字符设备。
6. 修改profile环境变量
增加bin目录到PATH变量里
echo 'PATH=$PATH:/bin' >> /etc/profile
复制一份profile到沙箱环境下
cp /etc/profile /data/data/userlist/etc
使profile中的环境变量立即生效
source /etc/profile
这一步如果不执行则登录沙箱环境的ssh后会提示-bash: command not found。
7. 创建沙箱用户
创建沙箱用户
useradd rd
修改用户密码
passwd rd
创建用户家目录
mkdir -p /data/data/userlist/home/rd
chown -R rd.rd /data/data/userlist/home/rd
chmod -R 0700 /data/data/userlist/home/rd
8. 复制用户配置文件到沙箱环境
cp -vf /etc/{passwd,group} /data/data/userlist/etc/
/data/data/userlist/etc/
目录里的文件只保留沙箱用户即可
9. 用ACL重新设置下rd账号权限
yum install acl -y
vi /etc/fstab # 确保根分区下有acl
重新挂载/目录
mount -o remount,rw /
设置 rd 帐号的权限,可读可执行
setfacl -R -m u:rd:rx /data/data/userlimit
10. 配置chroot,在文件末尾增加
vi /etc/ssh/sshd_config
Match Group rd
ChrootDirectory /data/data/userlimit
X11Forwarding no
AllowTcpForwarding no
11. 重启sshd让chroot配置生效
service sshd restart
13. 应用日志目录让rd访问
mount --bind /data/logs/app-name /data/data/userlimit/home/rd/logs
12. 验证
> ssh rd@your_ip
ls logs
注意:
第13步需要我们mount日志目录到rd
家目录下的logs目录,这里需要我们打印日志目录规范了,否则不同的模块不同的日志目录需要我们写规则适配了。程序日志标准化也需要我们在运维的过程中和研发一起制定好。
当然还可以提供日志平台,把日志通过filebeat、logstash等工具打到kafka,logstas从kafka里抽数据到远程机器文件里或者到es里通过kibana查看。