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

退出打印视图

更新时间: 2014 年 7 月
 
 

用户锁定其运行的应用程序

用户可以使用扩展特权策略从应用程序中删除基本特权。该策略可防止应用程序访问其不应访问的目录。


注 -  顺序非常重要。必须在为大多数 $HOME/.* 目录指定限制性强的特权之后为 $HOME/Download* 等目录指定限制性弱的特权。
示例 4-4  在受保护的环境中运行浏览器

本示例说明了用户如何在受保护的环境中运行 Firefox 浏览器。在此配置中,用户的 Documents 目录对 Firefox 隐藏。

通过使用以下命令,用户可以从 /usr/bin/firefox 命令中删除基本特权。ppriv -r 命令的扩展特权参数可将浏览器限定为仅在用户指定的目录中执行读取和写入。–e 选项及其参数使用扩展特权策略打开浏览器。

% ppriv -r "\
{file_read}:/dev/*,\
{file_read}:/etc/*,\
{file_read}:/lib/*,\
{file_read}:/usr/*,\
{file_read}:/var/*,\
{file_read}:/proc,\
{file_read}:/proc/*,\
{file_read}:/system/volatile/*,\
{file_write}:$HOME,\
{file_read}:$HOME/.*,\
{file_read,file_write}:$HOME/.mozill*,\
{file_read,file_write}:$HOME/.gnome*,\
{file_read,file_write}:$HOME/Downloa*,\
{file_read,file_write}:/tmp,\
{file_read,file_write}:/tmp/*,\
{file_read,file_write}:/var/tmp,\
{file_read,file_write}:/var/tmp/*,\
{proc_exec}:/usr/*\
" -e /usr/bin/firefox file:///$HOME/Desktop

在扩展策略中使用 file_readfile_write 特权时,必须向应当读取或写入的每个文件授予显式访问权限。在此类策略中需要使用通配符 (*)。

要处理自动挂载的起始目录,用户需要为自动挂载路径添加显式条目,例如:

{file_read,file_write}:/export/home/$USER

如果站点未使用 automount 工具,则只需受保护目录的初始列表即可。

用户可以通过创建 shell 脚本自动运行此受命令行保护的浏览器。之后,要启动浏览器,用户需要调用脚本,而非 /usr/bin/firefox 命令。

示例 4-5  保护系统上的目录免受应用程序进程访问

在本示例中,一般用户使用 shell 脚本包装为应用程序创建沙箱。脚本的第一部分限制应用程序只能访问特定目录。例外情况(如 Firefox)在脚本的后面部分进行处理。脚本后跟有关其各个部分的注释。

1 #!/bin/bash
2 
3 # Using bash because ksh misinterprets extended policy syntax
4 
5 PATH=/usr/bin:/usr/sbin:/usr/gnu/bin
6 
7 DENY=file_read,file_write,proc_exec,proc_info
8 
9 SANDBOX="\
10 {file_read}:/dev/*,\
11 {file_read}:/etc/*,\
12 {file_read}:/lib/*,\
13 {file_read,file_write}:/usr/*,\
14 {file_read}:/proc,\
15 {file_read,file_write}:/proc/*,\
16 {file_read}:/system/volatile/*,\
17 {file_read,file_write}:/tmp,\
18 {file_read,file_write}:/tmp/*,\
19 {file_read,file_write}:/var/*,\
20 {file_write}:$HOME,\
21 {file_read}:$HOME/.*,\
22 {file_read,file_write}:$PWD,\
23 {file_read,file_write}:$PWD/*,\
24 {proc_exec}:/usr/*\
25 "
26 
27 # Default program is restricted bash shell
28 
29 if [[ ! -n $1 ]]; then
30     program="/usr/bin/bash --login --noprofile
        --restricted"
31 else
32     program="$@"
33 fi
34 
35 
36 # Firefox needs more file and network access
37 if [[ "$program" =~ firefox ]]; then
38     SANDBOX+=",\
39 {file_read,file_write}:$HOME/.gnome*,\
40 {file_read,file_write}:$HOME/.mozill*,\
41 {file_read,file_write}:$HOME/.dbu*,\
42 {file_read,file_write}:$HOME/.puls*\
43 "
44 
45 else
46     DENY+=",net_access"
47 fi
48 
49 echo Starting $program in sandbox
50 ppriv -s I-$DENY -r $SANDBOX -De $program

可对策略进行调整,以授予特定应用程序更多或更少的访问权限。一项调整位于第 38-42 行,其中授予 Firefox 对多个点文件(在用户的起始目录中维护会话信息)的写入访问权限。此外,Firefox 不受第 46 行的约束,该行删除了网络访问权限。但是,不允许 Firefox 读取用户的起始目录中的任意文件,并且只能将文件保存在其当前目录中。

额外一级保护位于第 30 行,即缺省程序使用受限 Bash shell。受限 shell 无法更改其当前目录或执行用户的点文件。因此,从该 shell 启动的命令会以类似方式锁定在沙箱中。

在脚本的最后一行,为 ppriv 命令传递了两个特权集合作为 shell 变量,即 $DENY$SANDBOX

第一个特权集合 $DENY 可防止进程读取或写入任何文件、执行任何子进程、观察其他用户的进程以及(有条件地)访问网络。这些限制过于严格,因此在第二个特权集合 $SANDBOX 中,通过枚举允许读取、写入和执行的目录对策略进行了细化。

另外,第 50 行中指定了调试选项 –D。访问失败实时显示在终端窗口中,并显示成功访问所需的特定对象以及相应特权。此调试信息可帮助用户为其他应用程序定制策略。