在一些特定的场合,我们需要执行某些程序时,进程的属主为程序文件本身的属主,而不是发起者。例如执行一些特权程序比如passwd、ping时,我们需要临时授权root权限,这个时候就需要用到suid权限位。
但suid在解决问题的同时,也给系统带来了安全隐患。举例而言,如果设置了suid 位的程序存在缺陷,比如最常见的缓存区溢出,那么黑客可能通过攻击缺陷获取到root权限。
本文中,我们将介绍一种方法,使用AIX的RBAC功能对suid权限进行精准控制,只允许特定的授权用户获得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 条评论