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

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