许多管理员都有关于 AIX 基于角色的访问控制(RBAC)方面的问题:

它会正常运行吗?
将打破什么?
我已经试过了,但是现在为什么还没有看到任何区别?
将一个应用程序集成到 RBAC 中怎么样?
对于那些想要一个程序模板来将应用程序集成到 AIX RBAC 中的管理员来说,可以考虑下列关于如何使用 AIX RBAC 启动 / 停止 Apache HTTPD 的示例。该示例演示了在没有管理员特权的情况下,如何启动 / 停止 httpd 服务。进一步采用这些步骤时,记住一定要在以 root 用户启动时验证应用程序是否在正常运行。如果当以 root 用户启动时应用程序无法运行,那么您就可以假定该应用程序不是访问问题,而是其他需要首先解决的问题。

步骤 1:创建一个沙盒

使用默认值安装 AIX V6.1 或 7.1。同时,还可以安装 openssh,但不是必须的。

步骤 2:安装一个应用程序,例如,Apache HTTPD

安装 Apache HTTPD 服务。可以通过任何方式完成安装。例如,在本例中,我使用了一个我自己构建的资源和主机作为 AIXTOOLS。

步骤 3:验证成功安装,以 root 用户验证是否可以使用命令 "apachectl start" 启动 / 停止 httpd 服务,当您浏览 “首页” 时,可以得到 Apache “It works!” 页面,或者是一些您已安装的内容。

步骤 4:启动“非 root” 环境

以 root 用户编辑 httpd.conf 文件,这样就可以使用用户 / 组 httpd/httpd:创建 httpd 组和用户 id,然后使用命令 chown -R httpd:httpd /var/httpd。再次以 root 用户进行验证,您可以启动 / 停止 httpd 以及显示 “It Works!” 页面。

步骤 5:展开调查

现在,您可以开始调查对于启动和停止 httpd 服务,非 root 用户可以做什么,不可以做什么。从我们刚刚创建的用户开始。因为用户 httpd 拥有所有文件的所有正常访问权(读、写、执行),这些特权应该在适当的地方提供。如果步骤 4 中一切正常运行,那么我们在这里看到的任何启动问题都是由于缺乏一个或多个特权导致的。

# apachectl stop
# su - httpd
$ apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
$ apachectl start
(13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
(13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
 


该示例显示,虽然用户 httpd 安装的模块可被列出(apachectl -l),但是我不能启动全服务(full-service)。Error (AH00072) 表示用户 httpd 缺乏绑定到端口 80 的足够特权。由于缺乏 “超级” 用户特权,应用程序没有执行 LISTEN 的任何套接字,最后关闭。

步骤 6: 设置应用程序 / 数据所有者

上述步骤使用帐户 id “httpd” 确保文件访问特权并不是问题所在。然而,对于一个真实环境,数据所有者和应用程序管理用户身份应该有所不同。使用组写入特权和 / 或切换用户(超级用户)访问特权来管理一个应用程序,将会使应用程序数据完整性处于危险中。

从 su - httpd 环境退出,返回到 root 特权。httpd 帐户意味着一个所有者帐户,而不是一个操作帐户。要阻止任何人以超级用户特权访问 httpd 帐户,进行以下更改(更改 PS1 提示来声明哪个身份被激活):

 root@x103:[/]chsec -f /etc/security/login.cfg -s usw -a
 shells="/bin/sh,/bin/bsh,/bin/csh,/bin/ksh,/bin/tsh,/bin/ksh93,/usr/bin/sh,
 /usr/bin/bsh,/usr/bin/csh,/usr/bin/ksh,/usr/bin/tsh,/usr/bin/ksh93,
 /usr/bin/rksh,/usr/bin/rksh93,/bin/
 false"

 root@x103:[/]mkgroup -a NONE

 root@x103:[/]chuser pgrp=httpd groups=httpd home=/dev/null shell=/bin/false login=false
 su=false rlogin=false daemon=false admin=true sugroups=NONE httpd

 root@x103:[/]su - httpd
 3004-614 Unable to change directory to "/dev/null".
         You are in "/home/guest" instead.
 root@x103:[/]id
 uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit),11(lp)
 root@x103:[/]
 


粗体文本显示,root 用户甚至也不能成为 httpd(存在 shell /bin/false)。此外,非 root 用户将由属性 login、rlogin、su 和 sugroups 锁定。

步骤 7: 为应用程序操作建立一个 userid

以 root 用户创建一个新用户(身份),该用户身份将可用于管理 httpd 服务,例如,httpd_op(httpd 操作)。

 root@x103:[/]mkuser httpd_op
 


(请注意,该帐户不在 httpd 组中,我们将使用 RBAC 获取任何所需的访问特权 - 非组特权。)

步骤 8:为 root 和 非 root 用户创建不同的会话

在一个新的窗口中,以 httpd_op 身份登录,并重复步骤 5 的动作。应该的到相同的错误,甚至更糟的是,现在都没有特权来运行这个程序了。同时,像前面一样,检查 root 会话中,httpd 服务依旧可以使用 apachctl 来启动和关闭。

步骤 9:使用 tracepriv 命令确定所需的特权。在 httpd_op 的会话窗口中,得到 Shell 进程的 ID:

 httpd_op@x103:[/home/httpd_op]echo $$
 5243132
 


在 root 会话窗口中,利用进程 ID 来提升会话的特权,这样后面这个会话就具有 root 特权了:

 root@x103:[/]setsecattr -p iprivs=PV_ROOT 5243132
 
步骤 10:启动 / 关闭 httpd

在 http_op 会话经过特权提升以后,使用 apachectl 脚本启动 / 关闭 httpd:

 httpd_op@x103:[/home/httpd_op]id
 uid=204(httpd_op) gid=1(staff)
 httpd_op@x103:[/home/httpd_op]apachectl start
 httpd_op@x103:[/home/httpd_op]apachectl stop
 
我们现在知道了可以通过 tracepriv 得到的所需特权以及 Shell 提升的方法来实现上面的功能。-f 选项十分重要,我们可以通过它知道从 Shell 启动 /opt/httpd/sbin/httpd 需要哪些特权:

 httpd_op@x103:[/home/httpd_op]tracepriv -ef apachectl start
 6619318: Used privileges for /usr/bin/apachectl:
  PV_DAC_R                           PV_KER_ACCT                     
  PV_KER_RAC                      

 6619318: Used privileges for /etc/apachectl:
  PV_DAC_R                           PV_KER_ACCT                     
  PV_KER_RAC                      

 6357072: Used privileges for /usr/sbin/apachectl:
  PV_TP_SET                          PV_KER_RAC                      

 6357072: Used privileges for /opt/httpd/sbin/httpd:  
 PV_DAC_R                           PV_DAC_W                           
 PV_DAC_X                           PV_DAC_O                           
 PV_KER_RAC                         PV_NET_CNTL                        
 PV_NET_PORT                     

 6619318: Used privileges for /usr/sbin/apachectl:
  PV_AZ_ROOT                         PV_TP_SET                       
  PV_KER_ACCT                        PV_KER_RAC 

 httpd_op@x103:[/home/httpd_op]tracepriv -ef apachectl stop
 6422566: Used privileges for /usr/bin/apachectl:
  PV_DAC_R                           PV_KER_ACCT                     
  PV_KER_RAC                      

 6422566: Used privileges for /etc/apachectl:
  PV_DAC_R                           PV_KER_ACCT                     
  PV_KER_RAC                      

 5832890: Used privileges for /usr/sbin/apachectl:
  PV_TP_SET                          PV_KER_RAC                      

 5832890: Used privileges for /opt/httpd/sbin/httpd:  
 PV_DAC_R                           PV_DAC_X                           
 PV_DAC_O                           PV_PROC_SIG                        
 PV_KER_RAC                         PV_NET_CNTL                        
 PV_NET_PORT                     

 6422566: Used privileges for /usr/sbin/apachectl:
  PV_AZ_ROOT                         PV_TP_SET                       
 PV_KER_ACCT                        PV_KER_RAC 
 


步骤 11:创建授权

从上面,我们看到使用 apachectl 启动 httpd 服务需要一系列的特权。作为 root,还需要创建相应的授权来关联这一系列特权。换句话说,我们目前具有的特权还无法以更细颗粒度的方式来实现分配还是不分配给哪些用户。RBAC 中的授权像是打开特权集合的钥匙。

特权是可以分层次的,所以必须从根部开始进行定义。所有以 aix 开头的授权都是保留给 root 用户使用的。如果没有创建完整的层次,AIX 会在命令执行完成后报出错误。在这个例子中,我们使用 aixtools.httpd.operate 特权来代表所需的特权:

root@x103:[/]mkauth aixtools.httpd.operate
1420-004 Authorization hierarchy "aixtools.httpd" does not exist.
root@x103:[/]mkauth aixtools
root@x103:[/]mkauth aixtools.httpd
root@x103:[/]mkauth aixtools.httpd.operate
 


现在,授权创建好了,可以使用 setsecattr 命令继续向可执行的命令分配“授权:特权”对。

 root@x103:[/]setsecattr -c authprivs=aixtools.httpd.operate=
 PV_DAC_R+PV_DAC_W+PV_DAC_X+PV_DAC_O+PV_KER_RAC+PV_NET_CNTL+PV_NET_PORT
 accessauths=aixtools.httpd.operate secflags=FSF_EPS /opt/httpd/sbin/httpd
 


所有这些操作会修改 /etc 目录下的一些文件。为了让内核了解这些更新,我们需要手动地更新内核的安全表:

 root@x103:[/]setsecattr -c
 authprivs=aixtools.httpd.operate=PV_DAC_R+PV_DAC_W+PV_DAC_X+PV_DAC_O+PV_KER_RAC
 +PV_NET_CNTL+PV_NET_PORT
 accessauths=aixtools.httpd.operate secflags=FSF_EPS /opt/httpd/sbin/httpd
 


步骤 12:创建和委派角色给用户

现在,命令已经被赋予了相应的 RBAC 授权和特权,这时候需要将相应的钥匙授予用户了。RBAC 中的角色(role)就是这个钥匙。现在,就需要创建一个角色,然后将角色和授权联系起来。一旦联系完成,就可以将角色授予用户了:

 root@x103:[/]mkrole authorizations="aixtools.httpd.operate"
 dfltmsg="APACHE HTTPD Control" apacheops
 root@x103:[/]setkst
 root@x103:[/]chuser roles=apacheops httpd_op
 


步骤 13:重新登录,然后使用角色用户来操作 Apahce HTTPD

RBAC 已经就绪了!特权已经定义,授权已经创建,并将“授权:特权”对赋予了命令。角色也创建好,并授予了用户。现在,就检验一下成果吧。记住:不要再继续使用旧的 Shell 会话,

 *******************************************************************************
 *                                                                             *
 *  Welcome to AIX Version 6.1!                                                *
 *                                                                             *
 *                                                                             *
 *  Please see the README file in /usr/lpp/bos for information pertinent to    *
 *  this release of the AIX Operating System.                                  *
 *                                                                             *
 *                                                                             *
 *******************************************************************************

 Last login: Wed Sep  5 13:49:04 GMT+02:00 2012 on /dev/pts/3 from felt45.xfeltx.nl
 httpd_op@x103:[/home/httpd_op]apachectl start
 (13)Permission denied: AH00072: make_sock: could not bind to address [::]:80
 (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:80
 no listening sockets available, shutting down
 AH00015: Unable to open logs
 httpd_op@x103:[/home/httpd_op]swrole apacheops
 httpd_op@x103:[/home/httpd_op]apachectl start
 httpd_op@x103:[/home/httpd_op]apachectl stop
 


RBAC 基础

以上的实例演示如何在没有管理员特权的情况下,也可以执行一些受限的命令。在不依靠传统的 Unix 组和 SUID 实现方式的情况下,RBAC 为实现更加细颗粒度地管理文件执行特权提供了更好的解决方案。

本文的英文原文最先在 IBM Systems Magazine 在线网站(www.ibmsystemsmag.com)上发布。

 

参考资料

学习

Domain RBAC 简介:本文介绍的 Domain RBAC 可以通过自定义的域获得对资源和对象的细颗粒度访问,您还可以通过本文提供的示例具体了解如何对相关的资源(文件或卷组)进行访问控制设置。


了解 AIX 高级特性:简便的基于角色的访问控制:本文将向您介绍 AIX 上的新特性-基于角色的访问控制(RBAC)和多级安全性,其中会讨论如何在 AIX 上启用基于角色的访问控制以及如何把根用户的角色、责任和授权分配给多个用户。


AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。


AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。


AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。


AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。


IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。


讨论

加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。


关于作者

Michael A.M. Felt 自 1979 年开始就在 UNIX 业界十分活跃,曾从事过程序员、系统开发人员等职务。自 1996 年开始,他开始在 IBM STG 实验室服务团队工作,成为一名 AIX 专家和顾问,主要负责 PowerVM、性能和安全相关的工作。