跳过导航链接 | |
退出打印视图 | |
![]() |
系统管理指南:安全性服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
管理用户和角色特权的最安全的方法是将特权使用限制在权限配置文件内的命令中。然后,在角色中包括该权限配置文件。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 shell 中运行。以下过程说明了如何指定特权、删除特权以及调试特权使用。
此过程说明如何确定可用于进程的特权。列出内容不包括已经指定给特定命令的特权。
% ppriv pid $ ppriv -v pid
进程号。使用双美元符号 ($$) 将父 shell 的进程号传递给命令。
提供特权名称的详细列表。
示例 11-1 确定当前 shell 中的特权
在以下示例中,列出了用户 shell 进程的父进程中的特权。在下面第二个示例中,列出了特权的全名。输出中的单个字母指代以下特权集:
有效特权集。
可继承特权集。
允许特权集。
限制特权集。
% ppriv $$ 1200: -csh flags = <none> E: basic I: basic P: basic L: all % ppriv -v $$ 1200: -csh flags = <none> E: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session I: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session P: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time
示例 11-2 确定可承担的角色的特权
角色使用管理 shell 或配置文件 shell。必须承担角色并使用此角色的 shell 列出已直接指定给此角色的特权。在以下示例中,角色 sysadmin 不具有直接指定的特权。
% su - sysadmin Password: <Type sysadmin password> $ /usr/ucb/whoami sysadmin $ ppriv -v $$ 1400: pfksh flags = <none> E: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session I: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session P: file_link_any,net_access,proc_exec,proc_fork,proc_info,proc_session L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time
开始之前
此过程必须在命令或进程已经失败后才有效。
% ppriv -eD touch /etc/acct/yearly touch[11365]: missing privilege "file_dac_write" (euid = 130, syscall = 224) needed at ufs_direnter_cm+0x27c touch: /etc/acct/yearly cannot create
% grep 224 /etc/name_to_sysnum creat64 224
示例 11-3 使用 truss 命令检查特权使用
truss 命令可以在常规 shell 中调试特权使用。例如,以下命令调试失败的 touch 进程:
% truss -t creat touch /etc/acct/yearly creat64("/etc/acct/yearly", 0666) Err#13 EACCES [file_dac_write] touch: /etc/acct/yearly cannot create
扩展的 /proc 接口在 truss 输出中的错误代码后面报告缺少的特权。
示例 11-4 使用 ppriv 命令在配置文件 Shell 中检查特权使用
ppriv 命令可以在配置文件 shell 中调试特权使用。如果为用户指定了权限配置文件,并且此权限配置文件包括具有特权的命令,则必须在配置文件 shell 中键入这些命令。在常规 shell 中键入特权命令时,这些命令执行时不会使用特权。
在此示例中,jdoe 用户可以承担角色 objadmin。objadmin 角色拥有 Object Access Management(对象访问管理)权限配置文件。使用此权限配置文件,objadmin 角色可以更改不属于 objadmin 的文件的权限。
在以下摘录中,jdoe 无法更改 useful.script 文件的权限:
jdoe% ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Apr 10 10:10 useful.script jdoe% chown objadmin useful.script chown: useful.script: Not owner jdoe% ppriv -eD chown objadmin useful.script chown[11444]: missing privilege "file_chown" (euid = 130, syscall = 16) needed at ufs_setattr+0x258 chown: useful.script: Not owner
当 jdoe 承担 objadmin 角色时,更改了该文件的权限:
jdoe% su - objadmin Password: <Type objadmin password> $ ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Apr 10 10:10 useful.script $ chown objadmin useful.script $ ls -l useful.script -rw-r--r-- 1 objadmin staff 2303 Apr 10 10:10 useful.script $ chgrp admin useful.script $ ls -l objadmin.script -rw-r--r-- 1 objadmin admin 2303 Apr 10 10:11 useful.script
示例 11-5 更改 root 用户拥有的文件
此示例说明了防止特权升级的方法。有关讨论,请参见防止特权升级。此文件归 root 用户所有。由于权限较低的 objadmin 角色需要所有特权才能更改文件的所有权,因此操作失败。
jdoe% su - objadmin Password: <Type objadmin password> $ cd /etc; ls -l system -rw-r--r-- 1 root sys 1883 Oct 10 10:20 system $ chown objadmin system chown: system: Not owner $ ppriv -eD chown objadmin system chown[11481]: missing privilege "ALL" (euid = 101, syscall = 16) needed at ufs_setattr+0x258 chown: system: Not owner
应在将命令添加到权限配置文件时为该命令添加特权。使用这些特权,具有权限配置文件的角色可以运行管理命令,但不会获得任何其他超级用户功能。
开始之前
命令或程序必须可识别特权。有关更全面的讨论,请参见进程如何获取特权。
角色包含授权和具有一定特权的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)。
有关说明,请参见如何在 Solaris Management Console 中承担角色。
选择要包括的命令。对于每个包括的命令,添加此命令所需的特权。
![]() | 注意 - 在权限配置文件中包括命令并为命令添加特权后,这些命令在配置文件 shell 中运行时会使用这些特权执行。 配置文件的顺序很重要。配置文件 shell 使用帐户配置文件列表中最早的配置文件中指定的安全属性执行命令或操作。例如,如果 chgrp 命令位于具有特权的 Object Access Management(对象访问管理)权限配置文件中,并且 Object Access Management(对象访问管理)配置文件是包含 chgrp 命令的第一个配置文件,则 chgrp 命令执行时使用在 Object Access Management(对象访问管理)配置文件中指定的特权。 |
您可能始终信任某些具有特定特权的用户。影响系统的一小部分的非常有针对性特权适合指定给用户。有关直接指定特权所涉及内容的讨论,请参见直接指定安全属性时的安全注意事项。
用户 jdoe 可通过以下过程使用高精度计时器。
Primary Administrator(主管理员)角色拥有 Primary Administrator(主管理员)配置文件。要创建该角色并将其指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 "使用 Solaris Management Console(任务)"。
$ usermod -K defaultpriv=basic,proc_clock_highres jdoe
defaultpriv 关键字的值将替换现有的值。因此,对于要保留 basic(基本)特权的用户,必须指定值 basic。在缺省配置中,所有用户都拥有基本特权。
$ grep jdoe /etc/user_attr jdoe::::type=normal;defaultpriv=basic,proc_clock_highres
示例 11-6 创建具有特权的角色来配置系统时间
$ /usr/sadm/bin/smrole -D nisplus:/examplehost/example.domain \ -r primaryadm -l <Type primaryadm password> \ add -- -n clockmgr \ -c "Role that sets system time" \ -F "Clock Manager" \ -s /bin/pfksh \ -u 108 \ -P <Type clockmgr password> \ -K defaultpriv=basic,proc_priocntl,sys_cpu_config, proc_clock_highres,sys_time
根据显示的需要,-K 行进行了换行。
如果角色是在本地创建的,则此角色的 user_attr 项的显示将类似如下:
clockmgr:::Role that sets system time: type=role;defaultpriv=basic,proc_priocntl,sys_cpu_config, proc_clock_highres,sys_time
可以通过减少基本特权集或减少限制特权集来限制可供用户或角色使用的特权。由于此类限制可能产生预料不到的副作用,因此不是非常必要时不要使用这种方法限制用户的特权。
![]() | 注意 - 为某个用户修改了基本特权集或限制特权集时,应该彻底测试任何用户的功能。
|
有关过程,请参见如何确定进程的特权。
$ usermod -K defaultpriv=basic,!priv-name username
通过删除 proc_session 特权,可以防止用户检查其当前会话以外的任何进程。通过删除 file_link_any 特权,可以防止用户生成指向不归其所有的文件的硬链接。
![]() | 注意 - 请勿删除 proc_fork 或 proc_exec 特权。如果没有这些特权,用户将无法使用系统。事实上,只能从不对其他进程执行 fork() 或 exec() 操作的守护进程中删除这两个特权。 |
$ usermod -K limitpriv=all,!priv-name username
以 username 身份登录,并尝试执行 username 必须在系统上执行的任务。
示例 11-7 从用户的限制特权集中删除特权
在以下示例中,防止所有源自 jdoe 初始登录的会话使用 sys_linkdir 特权。也就是说,即使在用户运行 su 命令之后,也不能生成指向目录的硬链接,并且也不能解除目录链接。
$ usermod -K limitpriv=all,!sys_linkdir jdoe $ grep jdoe /etc/user_attr jdoe::::type=normal;defaultpriv=basic;limitpriv=all,!sys_linkdir
示例 11-8 从用户的基本特权集中删除特权
在以下示例中,防止所有源自 jdoe 初始登录的会话使用 proc_session 特权。也就是说,即使在用户运行 su 命令之后,也不能检查此用户会话以外的任何进程。
$ usermod -K defaultpriv=basic,!proc_session jdoe
$ grep jdoe /etc/user_attr jdoe::::type=normal;defaultpriv=basic,!proc_session;limitpriv=all
注 - 创建运行具有继承特权的命令的 shell 脚本时,相应的权限配置文件必须包含具有指定特权的命令。
#!/bin/pfsh # Copyright (c) 2009, 2011 by Oracle Corporation
% ppriv -eD script-full-path
有关说明,请参见如何在 Solaris Management Console 中承担角色。选择可以创建权限配置文件的角色,如 Primary Administrator(主管理员)。
选择脚本,并在权限配置文件中包括需要特权才能运行的 shell 脚本中的每个命令。对于每个包括的命令,添加此命令所需的特权。
![]() | 注意 - 权限配置文件的顺序很重要。配置文件 shell 执行配置文件列表中最早的命令实例。例如,如果 chgrp 命令位于 Object Access Management(对象访问管理)权限配置文件中,并且 Object Access Management(对象访问管理)配置文件是包含 chgrp 命令的第一个配置文件,则 chgrp 命令执行时使用在 Object Access Management(对象访问管理)配置文件中指定的特权。 |
为了执行配置文件,用户将承担该角色,并在该角色的配置文件 shell 中运行脚本。