在 Oracle® Solaris 11.2 中确保用户和进程的安全

退出打印视图

更新时间: 2014 年 7 月
 
 

如何确定程序所需的特权

可在命令或进程失败时使用此调试过程。在找到并修复第一个特权问题之后,您可能需要再次运行 ppriv -eD command 命令以查找其他特权要求。

  1. 键入失败的命令作为 ppriv 调试命令的参数。
    % ppriv -eD touch /etc/acct/yearly
    
    touch[5245]: missing privilege "file_dac_write"
         (euid = 130, syscall = 224) needed at zfs_zaccess+0x258
    touch: cannot create /etc/acct/yearly: Permission denied 
  2. 使用调试输出的 syscall 编号来确定哪个系统调用失败。

    /etc/name_to_sysnum 文件中查找 syscall 编号的名称。

    % grep 224 /etc/name_to_sysnum
    
    creat64                 224

    在此示例中,creat64() 调用失败。要成功执行进程,必须为该进程指定可在 /etc/acct/yearly 目录中创建文件的权限。

示例 7-5  使用 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 输出中的错误代码后面报告缺少 file_dac_write 特权。

示例 7-6  使用 ppriv 命令在配置文件 Shell 中检查特权使用

在此示例中,jdoe 用户可以承担角色 objadminobjadmin 角色拥有 "Object Access Management"(对象访问管理)权限配置文件。使用此权限配置文件,objadmin 角色可以更改不属于 objadmin 的文件的权限。

在以下摘录中,jdoe 无法更改 useful.script 文件的权限:

jdoe% ls -l useful.script

-rw-r--r--  1 aloe  staff  2303 Apr 10 10:10 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 zfs_zaccess+0x258
chown: useful.script: Not owner

jdoe 承担 objadmin 角色时,更改了该文件的权限:

jdoe% su - objadmin
Password: xxxxxxxx

# ls -l useful.script
-rw-r--r--  1 aloe  staff  2303 Apr 10 10:10 useful.script

# chown objadmin useful.script
# ls -l useful.script
-rw-r--r--  1 objadmin  staff  2303 Apr 10 10:10 useful.script
# chgrp admin useful.script

# ls -l objadmin.script
-rw-r--r--  1 objadmin  admin  2303 Apr 10 10:11 useful.script
示例 7-7  更改 root 用户拥有的文件

此示例说明了防止特权升级的方法。有关讨论,请参见特权升级和内核特权。此文件归 root 用户所有。由于权限较低的 objadmin 角色需要所有特权才能更改文件的所有权,因此操作失败。

jdoe% su - objadmin
Password: xxxxxxxx

# cd /etc; ls -l system
-rw-r--r--  1 root  sys   1883 Oct 10 10:20 system

# chown objadmin system
chown: system: Not owner
# ppriv -eD chown objadmin system
chown[11481]: missing privilege "ALL" 
     (euid = 101, syscall = 16) needed at zfs_zaccess+0x258
chown: system: Not owner