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

DevOpSec
• 阅读 600

来源: 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. 、创建受限的沙箱根目录,并设置权限以及用户组

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

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

重新挂载/目录
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查看。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
LVS+Keepalived负载均衡实践与心得补遗
一.实践背景,分析:公司研发的业务系统某个功能频繁出现数据库Mysql性能问题,导致系统使用卡顿,响应慢,且数据库所在服务器CPU负载居高不下,影响其他项目系统的正常数据库访问和使用。除去研发人员优化sql工作外,作为运维人员可以尝试对当前服务架构改造,目前架构大致如下:!(https://static.oschina.net/uploads/i
DevOpSec
DevOpSec
Lv1
懂开发的运维,懂安全的运维。公众号:DevOpSec
文章
57
粉丝
6
获赞
26