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

第 11 章 权限(任务)

本章提供了在系统上管理和使用权限的逐步说明。以下是本章中信息的列表:

有关权限的概述,请参见权限(概述)。有关参考信息,请参见第 12 章,权限(参考)

管理和使用权限(任务列表)

以下任务列表介绍了管理权限和使用权限的任务列表。

任务 

说明 

参考 

在站点使用权限 

涉及指定、删除、添加和调试权限的使用。 

管理权限(任务列表)

运行命令时使用权限 

涉及使用已指定给您的权限。 

确定权限(任务列表)

管理权限(任务列表)

以下任务列表介绍了查看权限、指定权限以及运行包含特权命令的脚本的过程。

任务 

说明 

参考 

确定进程中的权限 

列出进程的有效权限集、可继承权限集、允许权限集和限制权限集。 

如何确定进程的权限

确定进程缺少的权限 

列出失败进程成功运行所需的权限。 

如何确定程序所需的权限

为命令添加权限 

为权限配置文件的命令添加权限。可以将权限配置文件指定给用户或角色。然后,用户可以在配置文件 shell 中运行具有指定权限的命令。 

如何为命令添加权限

为用户指定权限 

扩展用户或角色的可继承权限集。使用此过程时应谨慎。 

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

限制用户的权限 

限制用户的基本权限集。使用此过程时应谨慎。 

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

运行特权 shell 脚本 

为 shell 脚本和 shell 脚本中的命令添加权限。然后,在配置文件 shell 中运行此脚本。 

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

管理权限

管理用户和角色权限的最安全的方法是将权限使用限制在权限配置文件内的命令中。然后,此权限配置文件就包括在某个角色中。此角色会指定给某个用户。当此用户承担指定的角色时,特权命令便可在配置文件 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 中运行脚本。

确定权限(任务列表)

以下任务列表介绍了有关使用已指定给您的权限的过程。

任务 

说明 

参考 

以用户的身份在任何 shell 中查看权限 

显示已直接指定给您的权限。由您运行的所有进程都将以这些权限运行。 

如何确定已直接指定给您的权限

确定可以使用权限运行的命令 

将权限指定给权限配置文件中的可执行文件后,必须在配置文件 shell 中键入此可执行文件。 

如何确定可以运行的特权命令

确定角色可以使用权限运行的命令 

承担此角色来确定其可以使用权限运行的命令。 

如何确定角色可以运行的特权命令

确定已指定的权限

直接将权限指定给用户时,这些权限在每个 shell 中都有效。未直接将权限指定给用户时,则此用户必须打开一个配置文件 shell。例如,当具有指定权限的命令位于用户权限配置文件列表内的权限配置文件中时,此用户必须在配置文件 shell 中执行此命令。

Procedure如何确定已直接指定给您的权限

以下过程显示如何确定是否已直接为您指定权限。


注意 – 注意 –

不当使用直接指定的权限可能导致无意的安全性破坏。有关介绍,请参见直接指定安全属性时的安全注意事项


  1. 列出进程可以使用的权限。

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

  2. 在任何 shell 中调用操作并运行命令。

    有效集中列出的权限在整个会话中都有效。如果已为您直接指定了除基本集之外的权限,则会在有效集中列出这些权限。


示例 11–9 确定直接指定给您的权限

如果已经为您直接指定权限,则基本集包含的权限会多于缺省基本集。在此示例中,用户始终能够访问 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.


示例 11–10 确定直接指定给角色的权限

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

Procedure如何确定可以运行的特权命令

未直接将权限指定给用户时,此用户可通过权限配置文件获取特权命令的访问权限。必须在配置文件 shell 中执行权限配置文件中的命令。

开始之前

验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read 授权。基本 Solaris 用户权限配置文件包括此授权。

  1. 确定已指定给您的权限配置文件。


    $ /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:
  2. 找到以 "Rights:" 开头的行。

    "Rights" 行列出已直接指定给您的权限配置文件的名称。

  3. 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 策略项的末尾。

  4. 在配置文件 shell 中键入需要权限的命令。

    在常规 shell 中键入这些命令时,它们不会使用权限运行,因而不会成功运行。


    % pfsh
    
    $

示例 11–11 在配置文件 Shell 中运行特权命令

在以下示例中,用户 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

Procedure如何确定角色可以运行的特权命令

角色通过包含具有指定权限的命令的权限配置文件来获取特权命令的访问权限。为用户提供特权命令访问权限的最安全的方法是为用户指定一个角色。承担此角色之后,用户便可执行所有包括在此角色权限配置文件中的特权命令。

开始之前

验证到 Solaris Management Console 的用户或角色必须具有 solaris.admin.usermgr.read 授权。基本 Solaris 用户权限配置文件包括此授权。

  1. 确定可以承担的角色。


    $ /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
  2. 找到以 "Assigned Roles:" 开头的行。

    "Assigned Roles" 行列出可以承担的角色。

  3. 确定角色之一拥有的权限配置文件。


    $ /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:
  4. 在 "Rights:" 行中找到该角色的权限配置文件的名称。

  5. 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
  6. 对于每个权限配置文件,在 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 中运行这些命令。


示例 11–12 在角色中运行特权命令

当用户承担角色时,其 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