管理用户和角色权限的最安全的方法是将权限使用限制在权限配置文件内的命令中。然后,此权限配置文件就包括在某个角色中。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 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,proc_exec,proc_fork,proc_info,proc_session I: file_link_any,proc_exec,proc_fork,proc_info,proc_session P: file_link_any,proc_exec,proc_fork,proc_info,proc_session L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time |
角色使用管理 shell 或配置文件 shell。必须承担角色并使用此角色的 shell 列出已直接指定给此角色的权限。在以下示例中,角色 sysadmin 不具有直接指定的权限。
% su sysadmin Password: <键入 sysadmin 的口令> $ /usr/ucb/whoami sysadmin $ ppriv -v $$ 1400: pfksh flags = <none> E: file_link_any,proc_exec,proc_fork,proc_info,proc_session I: file_link_any,proc_exec,proc_fork,proc_info,proc_session P: file_link_any,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 |
通过在 /etc/name_to_sysnum 文件中查找 syscall 编号来确定失败的系统调用。
% grep 224 /etc/name_to_sysnum creat64 224 |
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 输出中的错误代码后面报告缺少的权限。
ppriv 命令可以在配置文件 shell 中调试权限的使用。如果将权限配置文件指定给用户,并且此权限配置文件包括具有权限的命令,则必须在配置文件 shell 中键入这些命令。在常规 shell 中键入特权命令时,这些命令执行时不使用特权。
在此示例中,jdoe 用户可以承担角色 objadmin。objadmin 角色拥有对象访问管理配置文件。使用此权限配置文件,objadmin 角色可以更改不属于 objadmin 的文件的权限。
在以下摘录中,jdoe 无法更改 useful.script 文件的权限:
jdoe% ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Mar 11 05:29 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: <键入 objadmin 的口令> $ ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Mar 11 05:29 useful.script $ chown objadmin useful.script $ ls -l useful.script -rw-r--r-- 1 objadmin staff 2303 Mar 11 05:29 useful.script $ chgrp admin useful.script $ ls -l objadmin.script -rw-r--r-- 1 objadmin admin 2303 Mar 11 05:31 useful.script |
此示例说明防止权限升级的方法。有关说明,请参见防止权限升级。此文件归 root 用户所有。由于权限较低的 objadmin 角色需要所有权限才能更改文件的拥有权,因此操作失败。
jdoe% su objadmin Password: <键入 objadmin 的口令> $ cd /etc; ls -l system -rw-r--r-- 1 root sys 1883 Mar 20 14:04 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 GUI。
有关说明,请参见如何在 Solaris Management Console 中承担角色。
使用权限工具更新相应的配置文件。
选择要包括的命令。对于每个包括的命令,添加此命令所需的权限。
在权限配置文件中添加命令并向命令中添加权限后,这些命令在配置文件 shell 中运行时会使用这些权限执行。
配置文件的顺序很重要。配置文件 shell 使用帐户配置文件列表内的最早配置文件中指定的安全属性执行命令或操作。例如,如果 chgrp 命令位于具有权限的对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则 chgrp 命令执行时使用在对象访问管理配置文件中指定的权限。
您可能始终信任某些具有特定权限的用户。只有对系统影响非常小的仅有的几个特定权限才适合指定给用户。有关直接指定权限所涉及内容的介绍,请参见直接指定安全属性时的安全注意事项。
用户 jdoe 可以通过以下过程使用高分辨率计时器。
承担主管理员角色,或成为超级用户。
主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2 章 “使用 Solaris Management Console(任务)”。
$ usermod -K defaultpriv=basic,proc_clock_highres jdoe |
读取产生的 user_attr 项。
$ grep jdoe /etc/user_attr jdoe::::type=normal;defaultpriv=basic,proc_clock_highres |
$ /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 |
可以通过减少基本集或减少限制集来限制用户或角色可用的权限。由于此类限制可能产生预料不到的副作用,因此不是非常必要时不要使用此方法限制用户权限。
为某个用户修改了基本集或限制集时,应该彻底测试任何用户的功能。
当基本集少于缺省值时,可阻止用户使用此系统。
当限制集少于所有权限时,需要使用有效 UID=0 运行的进程可能会失败。
确定用户基本集和限制集中的权限。
有关过程,请参见如何确定进程的权限。
$ 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 的身份登录,并尝试执行 username 必须在系统上执行的任务。
在以下示例中,防止所有源自 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 |
在以下示例中,防止所有源自 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 或任何其他配置文件 shell 作为此脚本的第一行。
#!/bin/pfsh # Copyright (c) 2003 by Sun Microsystems, Inc. |
确定脚本中的命令所需的权限。
% ppriv -eD script-full-path |
打开 Solaris Management Console GUI。
有关说明,请参见如何在 Solaris Management Console 中承担角色。选择可以创建权限配置文件的角色,如主管理员。
使用权限工具创建或更新相应的配置文件。
选择脚本,并在此权限配置文件中包括需要权限才能运行的 shell 脚本中的每个命令。对于每个包括的命令,添加此命令所需的权限。
权限配置文件的顺序很重要。配置文件 shell 执行配置文件列表中最早的命令实例。例如,如果 chgrp 命令位于对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则执行 chgrp 命令时使用在对象访问管理配置文件中指定的权限。
向角色中添加权限配置文件并将此角色指定给用户。
为了执行此配置文件,用户会承担角色并在此角色的配置文件 shell 中运行脚本。