使用RBAC实现精准suid权限控制

字数 1502阅读 534评论 0赞 2

背景知识

在一些特定的场合,我们需要执行某些程序时,进程的属主为程序文件本身的属主,而不是发起者。例如执行一些特权程序比如passwd、ping时,我们需要临时授权root权限,这个时候就需要用到suid权限位。

但suid在解决问题的同时,也给系统带来了安全隐患。举例而言,如果设置了suid 位的程序存在缺陷,比如最常见的缓存区溢出,那么黑客可能通过攻击缺陷获取到root权限。
本文中,我们将介绍一种方法,使用AIX的RBAC功能对suid权限进行精准控制,只允许特定的授权用户获得suid能力。

使用RBAC精准控制suid授权范围

本文接下来将演示将用户程序(/test.sh)的suid权限精准授予test用户。即只有test用户能以root身份运行/test.sh程序;其他用户执行时,不会获得root授权。

创建test_auth授权:

#mkauth test_auth

将命令(/test.sh)与授权(test_auth)相互关联:

#setsecattr -c accessauths=test_auth euid=0 egid=0 /test.sh

创建test_role角色,其授权为test_auth:

#mkrole authorizations=test_auth test_role

把test_role角色与test用户相关联:

#chuser roles=test_role default_roles=test_role test

注意本示例将test_role设置为test用户的默认role,这样test用户可以默认获得并激活test_role角色。如果不进行default_roles设置,则需要首先”swrole test_role”,否则不会得到test_role角色的操作权限。

使用setkst更新内核表,使得上述设置生效:

#setkst

test.sh脚本内容如下:

# ls -l /test.sh

-rwxr-xr-x 1 root system 69 Sep 17 02:05 /test.sh

# cat /test.sh

#!/bin/ksh

mypid=$(sh -c 'echo $PPID')

proccred $mypid

sleep 600

效果测试

设置了 RBAC 权限之后,只有获得授权的用户才能得到 suid 权限:

比如有授权的 test 用户:

# su - test

$ /test.sh

14155778: e/suid=0 ruid=204 e/sgid=0 rgid=1

可以看到,test用户执行/test.sh时,其有效用户为root。

没有授权的 test2 用户:

# su - test2

$ ls

$ /test.sh

8060958: e/r/suid=205 e/r/sgid=1

可以看到,没有RBAC授权的test2用户执行/test.sh时,其有效用户仍为其本身(test2)。

注:

1. setsecattr/ mkrole 等 等命令之后,需要 setkst 才能生效。

2 .配置信息实际上采用文本方式记录在 /etc/security/privcmds 文件中:


/test.sh:

accessauths = test_auth

euid = 0

egid = 0

关于RBAC的基本介绍,可以参考:
https://www.ibm.com/developerworks/aix/library/au-aix_rbac/index.html

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

核心数据库服务器选型优先顺序调查

发表您的选型观点,参与即得50金币。