本章提供了在系统上管理和使用权限的逐步说明。以下是本章中信息的列表:
有关权限的概述,请参见权限(概述)。有关参考信息,请参见第 12 章,权限(参考)。
任务 |
说明 |
参考 |
---|---|---|
在站点使用权限 |
涉及指定、删除、添加和调试权限的使用。 | |
运行命令时使用权限 |
涉及使用已指定给您的权限。 |
以下任务列表介绍了查看权限、指定权限以及运行包含特权命令的脚本的过程。
任务 |
说明 |
参考 |
---|---|---|
确定进程中的权限 |
列出进程的有效权限集、可继承权限集、允许权限集和限制权限集。 | |
确定进程缺少的权限 |
列出失败进程成功运行所需的权限。 | |
为命令添加权限 |
为权限配置文件的命令添加权限。可以将权限配置文件指定给用户或角色。然后,用户可以在配置文件 shell 中运行具有指定权限的命令。 | |
为用户指定权限 |
扩展用户或角色的可继承权限集。使用此过程时应谨慎。 | |
限制用户的权限 |
限制用户的基本权限集。使用此过程时应谨慎。 | |
运行特权 shell 脚本 |
为 shell 脚本和 shell 脚本中的命令添加权限。然后,在配置文件 shell 中运行此脚本。 |
管理用户和角色权限的最安全的方法是将权限使用限制在权限配置文件内的命令中。然后,此权限配置文件就包括在某个角色中。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 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 中运行脚本。
任务 |
说明 |
参考 |
---|---|---|
以用户的身份在任何 shell 中查看权限 |
显示已直接指定给您的权限。由您运行的所有进程都将以这些权限运行。 | |
确定可以使用权限运行的命令 |
将权限指定给权限配置文件中的可执行文件后,必须在配置文件 shell 中键入此可执行文件。 | |
确定角色可以使用权限运行的命令 |
承担此角色来确定其可以使用权限运行的命令。 |
直接将权限指定给用户时,这些权限在每个 shell 中都有效。未直接将权限指定给用户时,则此用户必须打开一个配置文件 shell。例如,当具有指定权限的命令位于用户权限配置文件列表内的权限配置文件中时,此用户必须在配置文件 shell 中执行此命令。
以下过程显示如何确定是否已直接为您指定权限。
不当使用直接指定的权限可能导致无意的安全性破坏。有关介绍,请参见直接指定安全属性时的安全注意事项。
列出进程可以使用的权限。
有关过程,请参见如何确定进程的权限。
在任何 shell 中调用操作并运行命令。
有效集中列出的权限在整个会话中都有效。如果已为您直接指定了除基本集之外的权限,则会在有效集中列出这些权限。
如果已经为您直接指定权限,则基本集包含的权限会多于缺省基本集。在此示例中,用户始终能够访问 proc_clock_highres 权限。
% /usr/ucb/whoami jdoe % ppriv -v $$ 1800: pfksh flags = <none> E: file_link_any,…,proc_clock_highres,proc_session I: file_link_any,…,proc_clock_highres,proc_session P: file_link_any,…,proc_clock_highres,proc_session L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time % ppriv -vl proc_clock_highres Allows a process to use high resolution timers. |
角色使用管理 shell 或配置文件 shell。承担角色的用户可以使用此角色的 shell 列出已直接指定给此角色的权限。在以下示例中,已经直接将处理日期和时间程序的权限指定给角色 realtime。
% su realtime Password: <键入 realtime 的口令> $ /usr/ucb/whoami realtime $ ppriv -v $$ 1600: pfksh flags = <none> E: file_link_any,…,proc_clock_highres,proc_session,sys_time I: file_link_any,…,proc_clock_highres,proc_session,sys_time P: file_link_any,…,proc_clock_highres,proc_session,sys_time L: cpc_cpu,dtrace_kernel,dtrace_proc,dtrace_user,…,sys_time |
未直接将权限指定给用户时,此用户可通过权限配置文件获取特权命令的访问权限。必须在配置文件 shell 中执行权限配置文件中的命令。
验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read
授权。基本 Solaris 用户权限配置文件包括此授权。
确定已指定给您的权限配置文件。
$ /usr/sadm/bin/smuser list -- -n username -l Authenticating as user: admin … Please enter a string value for: password :: … User name: username User ID (UID): 130 Primary group: staff Secondary groups: Comment: object mgt jobs Login Shell: /bin/sh Home dir server: system Home directory: /export/home/username AutoHome setup: True Mail server: system Rights: Object Access Management Assigned Roles: |
找到以 "Rights:" 开头的行。
"Rights" 行列出已直接指定给您的权限配置文件的名称。
在 exec_attr 数据库中查找权限配置文件的名称。
$ cd /etc/security $ grep "Object Access Management" exec_attr Object Access Management:solaris:cmd:::/usr/bin/chgrp:privs=file_chown Object Access Management:solaris:cmd:::/usr/bin/chown:privs=file_chown Object Access Management:suser:cmd:::/usr/bin/chgrp:euid=0 Object Access Management:suser:cmd:::/usr/bin/chmod:euid=0 … |
具有已添加权限的命令列在 solaris 策略项的末尾。
在配置文件 shell 中键入需要权限的命令。
在常规 shell 中键入这些命令时,它们不会使用权限运行,因而不会成功运行。
% pfsh $ |
在以下示例中,用户 jdoe 不能从其常规 shell 中更改文件的组权限。但是,在配置文件 shell 中键入命令时,jdoe 可以更改这些权限。
% whoami jdoe % ls -l useful.script -rwxr-xr-- 1 nodoe eng 262 Apr 2 10:52 useful.script chgrp staff useful.script chgrp: useful.script: Not owner % pfksh $ /usr/ucb/whoami jdoe $ chgrp staff useful.script $ chown jdoe useful.script $ ls -l useful.script -rwxr-xr-- 1 jdoe staff 262 Apr 2 10:53 useful.script |
角色通过包含具有指定权限的命令的权限配置文件来获取特权命令的访问权限。为用户提供特权命令访问权限的最安全的方法是为用户指定一个角色。承担此角色之后,用户便可执行所有包括在此角色权限配置文件中的特权命令。
验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read
授权。基本 Solaris 用户权限配置文件包括此授权。
确定可以承担的角色。
$ /usr/sadm/bin/smuser list -- -n username -l Authenticating as user: primadmin … User name: username User ID (UID): 110 Primary group: staff Secondary groups: Comment: Has admin roles Login Shell: /bin/sh … Rights: Assigned Roles: primadmin, admin |
找到以 "Assigned Roles:" 开头的行。
"Assigned Roles" 行列出可以承担的角色。
确定角色之一拥有的权限配置文件。
$ /usr/sadm/bin/smuser list -- -n admin -l Authenticating as user: primadmin … User name: admin User ID (UID): 101 Primary group: sysadmin Secondary groups: Comment: system administrator Login Shell: /bin/pfksh … Rights: System Administrator Assigned Roles: |
在 "Rights:" 行中找到该角色的权限配置文件的名称。
在 prof_attr 数据库中查找权限配置文件。
由于系统管理员配置文件是配置文件的集合,因此需要在系统管理员配置文件中列出这些配置文件。
$ cd /etc/security $ grep "System Administrator" prof_attr System Administrator:::Can perform most non-security administrative tasks:profiles=Audit Review,Printer Management,Cron Management, Device Management,File System Management,Mail Management,Maintenance and Repair,Media Backup,Media Restore,Name Service Management,Network Management,Object Access Management,Process Management,Software Installation,User Management,All;help=RtSysAdmin.html |
对于每个权限配置文件,在 exec_attr 数据库中查找与其相关的权限配置文件。
例如,Network Management 配置文件是 System Administrator 配置文件的补充配置文件。Network Management 配置文件包括一些特权命令。
$ cd /etc/security $ grep "Network Management" exec_attr Network Management:solaris:cmd:::/usr/sbin/ifconfig:privs=sys_net_config Network Management:solaris:cmd:::/usr/sbin/route:privs=sys_net_config … |
这些命令及其指定权限是 solaris 策略项的最后两个字段。可以在角色的配置文件 shell 中运行这些命令。
当用户承担角色时,其 shell 成为配置文件 shell。因此,将使用指定给命令的权限来执行这些命令。在以下示例中,admin 角色可以更改 useful.script 文件的权限。
% whoami jdoe % ls -l useful.script -rwxr-xr-- 1 elsee eng 262 Apr 2 10:52 useful.script chgrp admin useful.script chgrp: useful.script: Not owner % su admin Password: <键入 admin 的口令> $ /usr/ucb/whoami admin $ chgrp admin useful.script $ chown admin useful.script $ ls -l useful.script -rwxr-xr-- 1 admin admin 262 Apr 2 10:53 useful.script |