限制linux用户访问特定目录-centos沙箱环境

来源: DevOpSec公众号 作者: DevOpSec

背景

研发需求:

  1. 研发想查看线上服务日志
  2. 研发要看线上部署代码是否正确
  3. 研发想看业务运行时产生数据是否正确

运维需求:

  1. 运维不想让研发有太多权限
  2. 只有产看某些特定目录的权限和产看日志

问题: 研发具有太多权限后,对线上风险影响较大,比如研发误操作删文件跑路,运维背锅,这时候需要运维既能满足研发需求也能保证线上服务器稳定性和安全性,下面我们用一个案例把上诉研发和运维的需求都实现。

案列: 日志目录:/data/logs/app-name 当研发登陆操作系统后看到的只有这个目录下的日志,系统上其他目录没有权限查看。

下面我们来看看实现。

使用技术

  1. linux ACL ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。
  2. ssh ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。下文中我们修改sshd配置,让其在用户连接是chroot到/目录,本文根目录则是:/data/data/userlimit
  3. chroot chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/位置。

实施

1. 、创建受限的沙箱根目录,并设置权限以及用户组

1mkdir /data/data/userlimit 2chown -R root:root /data/data/userlimit 3chmod -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

1ldd $(which bash) 2cp -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必须的字符设备

1mknod -m 666 /data/data/userlist/dev/null c 1 3 2mknod -m 666 /data/data/userlist/dev/tty c 5 0 3mknod -m 666 /data/data/userlist/dev/zero c 1 5 4mknod -m 666 /data/data/userlist/dev/random c 1 8

通过man sshd_config的说明,可以查看到创建运行shell和sftp所必须的字符设备。

6. 修改profile环境变量

1增加bin目录到PATH变量里 2echo 'PATH=$PATH:/bin' >> /etc/profile 3复制一份profile到沙箱环境下 4cp /etc/profile /data/data/userlist/etc 5使profile中的环境变量立即生效 6source /etc/profile

这一步如果不执行则登录沙箱环境的ssh后会提示-bash: command not found。

7. 创建沙箱用户

1创建沙箱用户 2useradd rd 3修改用户密码 4passwd rd 5 6创建用户家目录 7mkdir -p /data/data/userlist/home/rd 8chown -R rd.rd /data/data/userlist/home/rd 9chmod -R 0700 /data/data/userlist/home/rd

8. 复制用户配置文件到沙箱环境

cp -vf /etc/{passwd,group} /data/data/userlist/etc/

/data/data/userlist/etc/ 目录里的文件只保留沙箱用户即可

9. 用ACL重新设置下rd账号权限

1yum install acl -y 2vi /etc/fstab # 确保根分区下有acl

image

1重新挂载/目录 2mount -o remount,rw / 3设置 rd 帐号的权限,可读可执行 4setfacl -R -m u:rd:rx /data/data/userlimit

10. 配置chroot,在文件末尾增加

vi /etc/ssh/sshd_config

1Match Group rd 2 ChrootDirectory /data/data/userlimit 3 X11Forwarding no 4 AllowTcpForwarding no

11. 重启sshd让chroot配置生效

service sshd restart

13. 应用日志目录让rd访问

mount --bind /data/logs/app-name /data/data/userlimit/home/rd/logs

12. 验证

1> ssh rd@your_ip 2ls logs

注意: 第13步需要我们mount日志目录到rd家目录下的logs目录,这里需要我们打印日志目录规范了,否则不同的模块不同的日志目录需要我们写规则适配了。程序日志标准化也需要我们在运维的过程中和研发一起制定好。

当然还可以提供日志平台,把日志通过filebeat、logstash等工具打到kafka,logstas从kafka里抽数据到远程机器文件里或者到es里通过kibana查看。

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)

0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  

SpringBoot整合Redis乱码原因及解决方案

问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0