使用 File Permissions Manager (fpm) 可以裁减那些不应在视图中启用 SUID 或 SGID 的程序。因此只允许具有特权的用户运行这些程序。fpm 的这种用法是日益丰富的 IBM® AIX® 安全策略的一部分,可帮助系统管理员更好地驾驭他们的系统。

David Tansley, UNIX 管理员, 自由职业者

David Tansley 是一位自由作家。他有 15 年 UNIX 系统管理经验,最近 8 年一直在使用 AIX。他喜欢打羽毛球和观看一级方程式赛车,但是最喜欢与妻子一起开着 GSA 摩托车旅行。



2012 年 9 月 20 日

理解 SUID

SUID 或 SGID 是一些权限位,可以在程序中设置它们,从而允许非特权用户能够像程序所有者那样运行程序(通常但并不总是在程序执行期间)。例如,查看下面的密码命令(root 用户拥有所有权):

$ ls -l passwd
-r-s r-x r-x   1 root security   29122 Aug 8 00:16 passwd

如果要修改密码,则需要运行前面的命令。该命令使我就能够修改密码,并将加密后的密码写入到 /etc/security/passwd 文件中(还会发生其他流程,但是本文不打算对它们进行讨论)。和普通用户一样,我没有更新 /etc/security/passwd 文件的权限。然而,由于密码程序为 SUID 并且归 root 用户所有,可以需要使用 root 用户身份而不是我的 ID 更新文件。简单地说,一个非特权用户可以像程序所有者那样运行 SUID。

AIX 报告两种类型的用户 ID。它们为:

  • 真实用户 ID
  • 有效(特权)用户 ID

有效用户 ID 就是指拥有程序或文件的 ID。因此,在上面的密码示例中,如果用户 dxtans 运行 passwd 命令:

  • 真实的用户 ID 为 dxtans
  • 有效用户 ID 为 root

要确定用户 ID 信息(即真实有效的用户 ID,在所有情况下是相同的),并且如果 id 命令是从命令行中运行的,那么只有真实 ID 会显示出来。真实用户 ID 是指启动流程的用户。

$ whoami
dxtans
$ id
uid=204(dxtans) gid=1(staff) groups=201(admin),208(sysmaint)

要使编译后的 SUID 或 SGID 程序使用 chmod 命令,并且采用八进制计数法,那么将使用第一个 8 位位组,其中:

  • 4 用于 SUID
  • 2 用于 SGID

例如,要使所有人能够读取和运行以下示例,那么:

chmod 4555 <file-name> 将生成文件 SUID:

r-s r-x r-x

chmod 6555 <file-name> 生成 SUID 和 SGID 文件:

r-s r-s r-x

要去掉 SUID,使用第一个例子,运行下面的命令:

chmod 555 < file-name>

如果 id 命令是从 SUID 封装器程序中运行的,后者由 root 用户所有,并由其他(非特权)用户运行,那么将同时显示真实的和有效的用户 ID。下面的 C 代码将调用 id 命令。我们可以看到,只要程序为 SUID,那么将同时显示两种 ID。

# cat idshow.c
int main(void)

{
system("/usr/bin/id");

}

作为 root 用户,创建前面的文件并命名为 idshow.c,然后进行编译。

# gcc -o idshow idshow.c

接下来,在文件中设置 SUID 位。

# chmod 4555 idshow
# ls -l
-r-s r-x r-x 1 root system   52699 Nov 28 10:07 idshow

现在,以另一个用户的身份(例如 dxtans)发出 id 命令:

$ id
uid=204(dxtans) gid=1(staff) groups=201(admin),208(sysmaint)

现在,以另外的用户身份运行新创建的程序:

$ ./idshow
uid=204(dxtans) gid=1(staff) euid=0(root) groups=201(admin),208(sysmaint)

id 命令(调用子 idshow)的输出中,注意用户的 ID 为 dxtans。然而,创建了一个名为 euid 的新字段,这是前面程序中用户的有效用户 ID,在本例中,它是 root 用户。

 Setting the SGID bit on directories that holds logs or documents, you can allow 
different group members to write to one directory, thus allowing the system administrator 
not having to go down the path of doing a chmod 777.

回顾 SUID 的用法

在本文其余部分,当我提到 SUID 时,我还在引用中包括了 SGID。一般来讲,某些 SUID 程序被认为存在潜在的安全风险。它们以有效用户 ID 的身份运行,在最常见的情况下,这些 ID 均为 root 用户。因此,root 用户对于设置了 SUID 程序的所有用户均是开放的。Shell 脚本对 SUID shell 脚本采用非常松懈的写权限,虽然内核忽略了这些脚本,但是它们会造成很严重的问题,因为这将把整个系统公开给不适宜的对象。这仅仅解释了 AIX 和大多数其他 UNIX® 及 Linux® 系统忽略所有设置了 SUID 或 SGID 位的 shell 脚本的部分原因。如今,一种常见的做法是禁用或移除一些 SUID 系统或应用程序命令,而是使用 sudo 或基于角色的权限由非授权用户运行程序。在履行安全策略并需要限制 root 访问时就需要这样做。这意味着对基于 root 的 SUID 命令进行重新评估。AIX 支持这种方法并提供了一个名为 fpm 的实用工具,可以从程序中移除 SUID 位。fpm 实用工具控制您希望设置或移除的 SUID 和 SGID 程序数量。虽然 fpm 是 AIX 安全基于角色访问控制 (RBAC) 和 AIX 6 的 aixpert 实现的一部分,它也包含在 5.3 TL6 版本中。虽然应当对 SUID 程序的使用进行回顾,但是有许多类似于 passwd 命令的 SUID 程序可以忽略不管。

To locate all the SUID and SGID programs in your server, use the following find command:
# find / -perm -4000 -o -perm
-2000|more
/usr/bin/acctctl/usr/bin/acctras

fpm 工具

fpm 工具通过移除相应的 SUID 位,使您能够限制对 SUID 程序的执行。AIX 提供了以下安全级别,基于通用的安全策略和非特权用户最有可能的使用方法。

  • 高级
  • 中级
  • 低级
  • 额外的自定义级别

fpm 使用的文件的位置为:

  • /usr/lib/security/fpm/data

    中的文件包含不同级别的系统 SUID

  • /usr/lib/security/fpm/custom

    中的文件为包含 bespoke SUID 的自定义文件

在 /usr/lib/security/fpm/data 目录中,您具有以下列表,其中包含将要修改的文件:

  • 高级别使用 high_fpm 列表,并将移除列表中所有的 SUID/SGID。
  • 中级别使用 med_fpm 列表并将移除列表中所有的 SUID/SGID。
  • 低级别使用 med_fpm 列表并将移除列表中所有的 SUID。
  • 默认级别将使用 default_list_example 并将该列表中的 SUID/SGID 存储到一个

    AIX 默认安装中。

在 /usr/lib/security/fpm/custom 目录内,您将看到以下子目录,可以根据安全级别存放自定义列表,其中 SUID 将移除或添加位:

  • Default
  • High
  • Medium

fpm 命令最常见的用法是:

fpm -l <level>  -p -v -f

其中:

  • level 可以是高、中、低或默认级别
  • -p 仅用于预览结果,不会对文件进行修改
  • -v 会生成详细的输出,默认情况下,在不运行预览时为最小输出
  • -f 是一个文件,包含将要修改的文件名

自定义目录保存您希望进行处理的 bespoke/custom SUID 文件。

数据目录保存 IBM AIX 确定的不同安全级别,文件名具有自解释性。您应当查看这些文件的内容,了解哪些程序被修改过。您需要了解从文件中删除的某些 SUID 位的含义。

fpm 所作的任何修改都将记录到位于 /var/security/fpm/log 的日志文件中。

在运行 fpm 时,根据所解析的安全级别,它还将包括文件内容(如果在相应的自定义目录中给出的话)。因此,如果我需要在中级安全级别上运行 fpm,它将使用 /usr/lib/security/fpm/data/med_fpm_list 中包含的列表,以及 /usr/lib/security/fpm/custom/medium 中的列表(如果有的话)。

为了谨慎起见,在第一次运行 fpm 时,我对系统进行了备份。然而,fpm 按照预期运行,期间未出现任何问题。

如果运行了 fpm 并且产生的变更对系统产生不良影响,那么可以恢复到先前的设置或恢复到在服务器中安装 AIX 时的初始设置。


修改 SUID 许可

在运行 fpm 之前,确定您希望实现的安全级别。例如,如果您希望实现中级安全级别,您首先需要预览 SUID 修改会影响到的文件,这些文件位于:/usr/lib/security/fpm/data/med_fpm_list。

然后运行 fpm 预览,了解实现中级安全策略后的情况,如下所示

# fpm -l medium -p
chmod 0555 /sbin/helpers/jfs2/backbyinode
chmod 0550 /sbin/helpers/jfs2/diskusg
chmod 0555 /sbin/helpers/jfs2/restbyinode
..
..

输出显示了新修改过的文件许可,也就是指出哪些文件移除了 SUID 位和生成的新许可。由于是在预览模式中运行,因此没有发生任何修改。如果对将移除 SUID 位的文件满意,您可以继续处理并对它们执行真正的移除操作:

# fpm -l medium
..
..

一个或多个文件已经是安全的。因此,当前的许可可能不匹配默认许可。如果您需要返回到运行该命令之前的许可快照,那么运行命令:/usr/bin/fpm -l default -f /var/security/fpm/log/12062011_17:48:35 fpm 将继续移除 SUID 许可。

如果希望获得详细输出,也就是说,类似于使用预览选项时的输出,那么使用 v 参数。

现在可以真正地从文件中移除它们的 SUID 位。在 fpm 输出中,注意用于恢复所作的任何变更的命令。初始设置位于一个输出文件中,如上面的例子所示。

接下来,查看一些从其中真正移除了 SUID 位的文件。

# ls -l /usr/sbin/chdev
-r-xr-x---    1 root     system        27496 Mar 22 2011  /usr/sbin/chdev

最后,确定在使用 fpm 时您的安全级别为中级,只需运行以下命令。

# fpm -s
Medium level security.

下一个任务是进行重复测试,确保您的应用程序和操作环境没有受到 SUID 变化的影响。


恢复

如果实现了中级安全级别后发现效果并不理想,只需对文件许可执行恢复操作。日志文件位于 /var/security/fpm/log 目录中。

日志文件内容的格式为:

<suid octal permission to restore> < full path/file-name> <current octal permission>

如下所示为日志文件的样例输出,供您参考。

# cat 12062011_17:48:35
4550 /usr/sbin/cfgmgr 0550
4550 /usr/sbin/chcod 0550
4550 /usr/sbin/chcons 0550
4550 /usr/sbin/chdev 0550
…
…

通过使用前面的中级安全级别修改生成的日志文件,我们可以恢复到此前的时间点。使用 -f 选项并指定安全级别为默认级别:

 # fpm -l default  -f /var/security/fpm/log/12062011_17:48:35

接下来,通过查看已恢复的许可文件确认修改。

# ls -l /usr/sbin/chdev
-r-sr-x---    1 root     system        27496 Mar 22 2011  /usr/sbin/chdev

接着,查看安全级别的状态。它将说明为自定义,因为已经从此前的备份中恢复了 SUID 列表。

# fpm -s
Customized level security.

虽然 AIX 提供了一个列表,其中指定了针对不同安全设置需要包含的文件,但是您可以进一步修改来包含或排除特定的文件。我去掉了在中级安全级别文件 /usr/lib/security/fpm/data/med_fpm_list 中包含的许多 SUID 程序,并以此作为我的标准设置。这样做非常适合系统管理员的角色。

要将 SUID 恢复到出厂默认值(即刚刚安装 AIX 时的 SUID 设置),使用下面的命令:

# fpm -l default

然后,确认新安全级别的状态。

# fpm -s
Default level security.

自定义 SUID 修改

要向列表添加自定义的文件,即包含应用程序和其他系统 SUID,您有几个不同的选择。

  • 创建一个列表,其中包含将要移除 SUID 的文件的名称。
  • 创建一个列表,其中包含将要恢复 SUID 的文件的名称。

在 /usr/lib/security/fpm 目录中,有一个称为 custom 的子目录,在该子目录中又包含以下目录:defaultmediumhigh

如果您需要恢复到原来的 SUID 程序设置,您也可以包含额外的文件,其中可能包括您的 bespoke 或应用程序 SUID。文件的格式为:

<suid octal permission to restore> < full path/file-name>

例如,运行以下命令,在名为 mydefaults 的文件中包含两个自定义 SUID,称为 grab_db2_auditload_extract

# pwd
/usr/lib/security/fpm/custom/default

# cat mydefaults
4550 /usr/local/bin/grab_db2_audit
4550 /usr/local/bin/load_extract

我在本节演示的自定义流程也适用于其他安全级别。

如果恢复到默认 级别,那么当对 SUID 修改许可时,将包括该目录中的所有文件(假设格式均正确)。

 # fpm -l default
…
...
chmod 4550 /usr/sbin/invscoutd
chmod 4550 /usr/local/bin/grab_db2_audit
chmod 4550 /usr/local/bin/load_extract

要对自定义 SUID 或任何额外的文件移除 SUID 位,创建一个文件,其中包含您需要移除它们的 SUID 位的文件的列表。文件内容的格式为:

< full path /file-name>

例如,在我的 mydefaults2 文件中,我可以包含下面的内容:

# pwd
/usr/lib/security/fpm/custom/med

# cat  mydefaults2
/usr/local/bin/load_extract
/usr/local/bin/grab_db2_audit

在 fpm 移除 SUID 之前,这两个 SUID 文件位于 /usr/local/bin 目录中:

# pwd
/usr/local/bin

# ls -lt |head
total 9512
-r-sr-x---    1 root     app1          30681 Dec 05 22:17 load_extract
-r-sr-x---    1 aixdev   app1          52697 Dec 05 18:08 grab_db2_audit

接下来,运行 fpm 以将安全级别修改为 medium。然后在运行 fpm 后确认安全级别的状态。查看自定义文件是否移除了它们的 SUID 位。

# fpm -l medium

# fpm -s
Medium level security.
# ls -lt |head
total 9512
-r-xr-x---    1 root     app1          30681 Dec 05 22:17 load_extract
-r-xr-x---    1 aixdev   app1          52697 Dec 05 18:08 grab_db2_audit

注意 ACL

需要注意的是,在对访问控制列表 (ACL) 文件运行 fpm 时将会禁用 ACL 文件。但是 ACL 属性保持不变,这是因为对所处理的文件运行了一个八进制 chmod,它可以重新设置支持 ACL 的属性。在运行 fpm 之前,查看名为 load_extract 的 ACL 文件:

# aclget load_extract
*
* ACL_type   AIXC
*
attributes: SUID
base permissions
    owner(root):  r-x
    group(app1):  r-x
    others:  ---
extended permissions
    enabled
    deny     r-x     u:alpha

可以看到该文件启用了 SUID 和 ACL,用户 alpha 被拒绝了运行许可。此外,要确认该文件确实为 ACL,注意以下许可属性末端的 + 号:

# ls -lUt |head
total 9512
-r-sr-x---+    1 root     app1          30681 Dec 05 22:17 load_extract

如果我们要运行 fpm 并且它包含 load_extract 文件,那么 ACL 将被禁用。

#  fpm -l medium
# fpm -s
Medium level security.

# ls -lUt |head
-r-xr-x---    1 root     app1          30681 Dec 05 22:17 load_extract

在列表中,注意不再出现 + 号。fpm 重新设置了支持 ACL 的属性。我们可以通过对文件发出 aclget 命令确认这一点。

# aclget load_extract
*
* ACL_type   AIXC
*
attributes:
base permissions
    owner(root):  r-x
    group(app1):  r-x
    others:  ---
extended permissions
    disabled
    deny     r-x     u:alpha

一定要留意 ACL 的情况,并使用 acledit 命令重新启用它们。


结束语

在我看来,使用 fpm 是一种非常好的实践。它可以进一步增强您的安全策略。然而,默认文件不一定适合所有情况。您需要针对自己的系统安全需求对默认设置进行修改。

参考资料

学习

  • AIX 7 信息中心 中查看 fpm 主页。
  • 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 系统时有一个更好的认识。

获得产品和技术

  • 免费试用 IBM 软件。下载试用版,登录在线试用版,在沙箱环境中试用产品,或通过云访问。有超过 100 种 IBM 产品试用版可供选择。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=836047
ArticleTitle=精通 fpm
publish-date=09202012