系统管理指南:安全性服务

管理权限

管理用户和角色权限的最安全的方法是将权限使用限制在权限配置文件内的命令中。然后,此权限配置文件就包括在某个角色中。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 shell 中运行。以下过程显示了如何指定权限、删除权限以及调试权限的使用。

Procedure如何确定进程的权限

此过程说明如何确定可用于进程的权限。列出内容不包括已经指定给特定命令的权限。

    列出可用于 shell 进程的权限。


    % ppriv pid
    
    $ ppriv -v pid
    
    pid

    进程号。使用双美元符号 ($$) 将父 shell 的进程号传递到命令。

    -v

    提供权限名称的详细列表。


示例 11–1 确定当前 shell 中的权限

在以下示例中,列出了用户 shell 进程的父进程中的权限。在下面第二个示例中,列出了权限的全名。输出中的单个字母指代以下权限集:

E

有效权限集。

I

可继承权限集。

P

允许权限集。

L

限制权限集。


% 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


示例 11–2 确定可承担的角色的权限

角色使用管理 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

Procedure如何确定程序所需的权限

此过程确定成功运行命令或进程所需的权限。

开始之前

命令或进程必须已经失败,才执行此过程。

  1. 键入失败的命令作为 ppriv 调试命令的参数。


    % 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
  2. 通过在 /etc/name_to_sysnum 文件中查找 syscall 编号来确定失败的系统调用。


    % 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 用户可以承担角色 objadminobjadmin 角色拥有对象访问管理配置文件。使用此权限配置文件,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


示例 11–5 更改 root 用户拥有的文件

此示例说明防止权限升级的方法。有关说明,请参见防止权限升级。此文件归 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

Procedure如何为命令添加权限

应在将命令添加到权限配置文件时为此命令添加权限。使用这些权限,拥有权限配置文件的角色可以运行管理命令,但不会获取任何其他超级用户功能。

开始之前

命令或程序必须可识别权限。有关更全面的介绍,请参见进程如何获取权限

  1. 成为超级用户或承担等效角色。

    角色包含授权和具有一定权限的命令。有关角色的更多信息,请参见配置 RBAC(任务列表)

  2. 打开 Solaris Management Console GUI。

    有关说明,请参见如何在 Solaris Management Console 中承担角色

  3. 使用权限工具更新相应的配置文件。

    选择要包括的命令。对于每个包括的命令,添加此命令所需的权限。


    注意 – 注意 –

    在权限配置文件中添加命令并向命令中添加权限后,这些命令在配置文件 shell 中运行时会使用这些权限执行。

    配置文件的顺序很重要。配置文件 shell 使用帐户配置文件列表内的最早配置文件中指定的安全属性执行命令或操作。例如,如果 chgrp 命令位于具有权限的对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则 chgrp 命令执行时使用在对象访问管理配置文件中指定的权限。


Procedure如何将权限指定给用户或角色

您可能始终信任某些具有特定权限的用户。只有对系统影响非常小的仅有的几个特定权限才适合指定给用户。有关直接指定权限所涉及内容的介绍,请参见直接指定安全属性时的安全注意事项

用户 jdoe 可以通过以下过程使用高分辨率计时器。

  1. 承担主管理员角色,或成为超级用户。

    主管理员角色拥有主管理员配置文件。要创建角色并将角色指定给用户,请参见《系统管理指南:基本管理》中的第 2  章 “使用 Solaris Management Console(任务)”

  2. 将影响高分辨率时间的权限添加到用户的初始可继承权限集。


    $ usermod -K defaultpriv=basic,proc_clock_highres jdoe
    
  3. 读取产生的 user_attr 项。


    $ 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

Procedure如何限制用户或角色的权限

可以通过减少基本集或减少限制集来限制用户或角色可用的权限。由于此类限制可能产生预料不到的副作用,因此不是非常必要时不要使用此方法限制用户权限。


注意 – 注意 –

为某个用户修改了基本集或限制集时,应该彻底测试任何用户的功能。


  1. 确定用户基本集和限制集中的权限。

    有关过程,请参见如何确定进程的权限

  2. (可选的)从基本集中删除一项权限。


    $ usermod -K defaultpriv=basic,!priv-name username
    

    通过删除 proc_session 权限,可以防止用户检查其当前会话以外的任何进程。通过删除 file_link_any 权限,可以防止用户生成指向不归其所有的文件的硬链接。


    注意 – 注意 –

    请勿删除 proc_forkproc_exec 权限。如果没有这些权限,用户将无法使用系统。事实上,只能从不对其他进程执行 fork()exec() 操作的守护进程中删除这两个权限。


  3. (可选的)从限制集中删除一项权限。


    $ usermod -K limitpriv=all,!priv-name username
    
  4. 测试 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

Procedure如何运行具有特权命令的 Shell 脚本


注 –

创建运行具有继承权限的命令的 shell 脚本时,相应的权限配置文件必须包含具有指定权限的命令。


  1. /bin/pfsh 或任何其他配置文件 shell 作为此脚本的第一行。


    #!/bin/pfsh
    
    # Copyright (c) 2003 by Sun Microsystems, Inc.
  2. 确定脚本中的命令所需的权限。


    % ppriv -eD script-full-path
    
  3. 打开 Solaris Management Console GUI。

    有关说明,请参见如何在 Solaris Management Console 中承担角色。选择可以创建权限配置文件的角色,如主管理员。

  4. 使用权限工具创建或更新相应的配置文件。

    选择脚本,并在此权限配置文件中包括需要权限才能运行的 shell 脚本中的每个命令。对于每个包括的命令,添加此命令所需的权限。


    注意 – 注意 –

    权限配置文件的顺序很重要。配置文件 shell 执行配置文件列表中最早的命令实例。例如,如果 chgrp 命令位于对象访问管理权限配置文件中,并且对象访问管理配置文件是包含 chgrp 命令的第一个配置文件,则执行 chgrp 命令时使用在对象访问管理配置文件中指定的权限。


  5. 向角色中添加权限配置文件并将此角色指定给用户。

    为了执行此配置文件,用户会承担角色并在此角色的配置文件 shell 中运行脚本。