返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2223|回复: 0

[转载] 【转载】如何在 Linux 的 shell 里针对特定用户/组来限制某些命令的使用

[复制链接]
发表于 2023-5-15 12:52:27 | 显示全部楼层 |阅读模式

少侠不来段修仙之旅吗~

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
如何在 Linux 的 shell 里针对特定用户/组来限制某些命令的使用
转载地址:https://blog.csdn.net/BASK2312/article/details/128232726

0-前言
最近,业务侧有个需求,需要禁止特定用户访问linux特定的命令,如禁止用户A使用rm命令。

我们知道,在linux系统中,一切皆文件。

那么,这个问题也可以泛化为:

如何在linux里限制特定用户/用户组对特定文件/文件夹的访问权限的控制?

1-解决方案
为了叙述方便,这里将需求收拢:如何限制用户使用rm命令。

这里会涉及到一些基础知识,可以详见第二章节: 基础知识补充

1.1-使用 chmod
首先看下 rm 的权限

$ ls -l /bin/rm
-rwxr-xr-x  1 root  wheel  105984 Jan  1  2020 /bin/rm
复制代码
可以看到:rm命令针对root用户的权限是755,也就是说root可以可读可写可执行,针对root所在的组(这里是wheel)是可读可执行,针对其他用户是可读可执行。

那么,如果需求是限制非 root 用户执行 rm 命令,就可以执行命令:

$ chmod 754 /bin/rm
$ ls -l /bin/rm
-rwxr-x--x 1 root wheel 105984 Jan 1 2020 /bin/rm



这样,除了 root 用户,其他所有用户,均没办法执行 rm 命令了。

但是这个方案有个缺陷,会“一刀切”,只会区分 root 用户和非 root 用户(严格意义上说,是分为用户、组、其他人)。如果需要更细粒度的权限,比如允许 root 用户和 user_a 用户可以执行 rm 操作,不允许 user_b 用户执行,chmod 命令就不能满足了,此时需要使用 setfacl 命令。

1.2-使用 getfacl+setfacl

首先使用 getfacl 查看 rm 的 acl 权限

$ getfacl /bin/rm
# file: bin/rm
# owner: root
# group: root
user::rwx # 所有用户都有x权限,即执行权限
group::r-x
other::r-x



关闭所有用户的执行权限
$ setfacl -m user::rw /bin/rm
$ setfacl -m other::r /bin/rm
$ getfacl bin/rm
# file: bin/rm
# owner: root
# group: root
user::rw- # 所用用户的x权限被收回
group::r-x
other::r--


打开 root 用户的执行权限



$ setfacl -m user:root:rwx /bin/rm
$ getfacl bin/rm
# file: bin/rm
# owner: root
# group: root
user::rw-
user:root:rwx # 给root用户添加了x权限
group::r-x
mask::rwx
other::r--


打开 user_a 用户的执行权限


$ setfacl -m user:user_a:rwx /bin/rm
$ getfacl bin/rm
# file: bin/rm
# owner: root
# group: root
user::rw-
user:root:rwx # 给root用户添加了x权限
user:user_a:rwx # 给user_a用户添加了x权限
group::r-x
mask::rwx
other::r--


通过上面的设置,就实现了:允许 root 用户和 user_a 用户可以执行 rm 操作,不允许 user_b 用户执行的需求了。



 楼主| 发表于 2023-5-15 12:56:39 | 显示全部楼层
getfacl -- 获取文件访问控制列表
使用方法: getfacl  [-aceEsRLPtpndvh]  文件 ...
  -a,  --access           仅显示文件访问控制列表
  -d, --default           仅显示默认的访问控制列表
  -c, --omit-header     不显示注释表头
  -e, --all-effective     显示所有的有效权限
  -E, --no-effective      显示无效权限
  -s, --skip-base         跳过只有基条目(base entries)的文件
  -R, --recursive         递归显示子目录
  -L, --logical           逻辑遍历(跟随符号链接)
  -P, --physical          物理遍历(不跟随符号链接)
  -t, --tabular           使用制表符分隔的输出格式
  -n, --numeric           显示数字的用户/组标识
  -p, --absolute-names    不去除路径前的 '/' 符号
  -v, --version           显示版本并退出
  -h, --help              显示本帮助信息


setfacl -- 设定文件访问控制列表
用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl 更改文件的访问控制列表
  -M, --modify-file=file 从文件读取访问控制列表条目更改
  -x, --remove=acl 根据文件中访问控制列表移除条目
  -X, --remove-file=file 从文件读取访问控制列表条目并删除
  -b, --remove-all 删除所有扩展访问控制列表条目
  -k, --remove-default 移除默认访问控制列表
      --set=acl 设定替换当前的文件访问控制列表
      --set-file=file 从文件中读取访问控制列表条目设定
      --mask 重新计算有效权限掩码
  -n, --no-mask 不重新计算有效权限掩码
  -d, --default 应用到默认访问控制列表的操作
  -R, --recursive 递归操作子目录
  -L, --logical 依照系统逻辑,跟随符号链接
  -P, --physical 依照自然逻辑,不跟随符号链接
      --restore=file 恢复访问控制列表,和“getfacl -R”作用相反
      --test 测试模式,并不真正修改访问控制列表属性
  -v, --version           显示版本并退出
  -h, --help              显示本帮助信息


使用示例
$ getfacl test
# file: test
# owner: root
# group: root
user::r-x
user:tank:rwx                   #effective:---
group::r-x                      #effective:---
mask::---
other::---

$ setfacl -m u:zhangy:rw- test #修改文件的acl权限,添加一个用户权限
$ getfacl test
# file: test
# owner: root
# group: root
user::r-x
user:zhangy:rw-                       #多出来一个用户
user:tank:rwx
group::r-x
mask::rwx
other::---

$ setfacl -m g:zhangying:r-w test      #添加一个组
$ getfacl test
# file: test
# owner: root
# group: root
user::r-x
user:zhangy:rw-
user:tank:rwx
group::r-x
group:zhangying:rw-
mask::rwx
other::---

$ getfacl test     #查看acl
# file: test
# owner: root
# group: root
user::rw-
group::r--
other::r--

$ setfacl -m u:tank:rx test   #给tank用户向test文件增加读和执行的acl规则
$ getfacl test    #查看acl
# file: test
# owner: root
# group: root
user::rw-
user:tank:r-x      #已加入
group::r--
mask::r-x
other::r--

$ setfacl -m u::rwx test   #设置默认用户,读,写,可执行
$ getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:tank:r-x
group::r--
mask::r-x
other::r--

$ setfacl -b test     #清除所有acl
$ getfacl test
# file: test
# owner: root
# group: root
user::rwx
group::r--
other::r--

$ setfacl -m u:tank:rx test      #给tank用户向test文件增加读和执行的acl规则
$ setfacl -m u:testtank:rx test  #给testtank用户向test文件增加读和执行的acl规则
$ getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:testtank:r-x
user:tank:r-x
group::r--
mask::r-x
other::r--


$ setfacl -x u:tank test    #清除tank用户,对test文件acl规则
$ getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:testtank:r-x
group::r--
mask::r-x
other::r--



回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表