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

退出打印视图

更新时间: 2014 年 7 月
 
 

使用扩展特权锁定资源

在对应用程序的攻击成功的情况下,扩展特权策略可以限制攻击者对系统的访问权限。扩展策略规则将特权指定的作用范围限定到该规则中的资源。扩展策略规则的表示方法为:将特权括在花括号中,后跟一个冒号和关联的资源。有关更多介绍,请参见扩展用户或角色的特权。有关语法的示例,请参见 ppriv(1)privileges(5) 手册页。

管理员和一般用户都可以使用扩展特权锁定资源。管理员可以为用户、端口和应用程序创建扩展特权。一般用户可以使用命令行或者编写使用 ppriv -r 命令的脚本,防止应用程序将文件写入用户指定的目录之外。

如何将扩展特权策略应用于端口

用于网络时间协议 (Network Time Protocol, NTP) 的服务使用特权端口 123 进行 udp 通信。运行此服务需要使用特权。如果恶意用户获得了指定给此端口的特权,以下示例过程可修改服务清单以保护其他端口免受恶意用户访问。

开始之前

您必须承担 root 角色。有关详细信息,请参见使用所指定的管理权限

  1. 读取此端口的缺省服务清单项。

    在下面的 /lib/svc/manifest/network/ntp.xml start 方法项中,可能其他进程也使用 net_privaddr、proc_lock_memory 和 sys_time 特权:

    privileges='basic,!file_link_any,!proc_info,!proc_session,net_privaddr,
    proc_lock_memory,sys_time'

    删除 !file_link_any,!proc_info,!proc_session 指定的特权可防止服务接收信号或观察任何其他进程以及创建硬链接来重命名文件。也就是说,由该服务启动的进程只能绑定到 NTP 的端口 123,而不能绑定到任何其他特权端口。

    如果黑客能够利用该服务启动其他进程,则该进程将会受到类似限制。

  2. 修改 startrestart 方法以使 net_privaddr 特权仅限于该端口。
    # svccfg -s ntp editprop
    1. 搜索字符串 net_privaddr
    2. 取消对包含 net_privaddr 的项的注释。
    3. 在这两项中,将 net_privaddr 替换为 {net_privaddr}:123/udp

      扩展特权策略将从该服务中删除指定特权以及未指定的基本特权以外的所有特权。因此,特权集合中有可能加以利用的特权由超过八十个减少为不到八个。

  3. 重新启动服务以使用扩展特权策略。
    # svcadm restart ntp
  4. 验证该服务是否在使用扩展特权。
    # svccfg -s ntp listprop | grep privileges
    start/privileges    astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    restart/privileges  astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    

如何锁定 MySQL 服务

安装时,MySQL 数据库配置为通过不受保护的端口使用 root 的全部特权运行。在本任务中,需要在权限配置文件中向 MySQL 服务指定扩展特权策略。在权限配置文件成为服务的 exec 方法之后,MySQL 通过受保护的端口作为用户 mysql 运行,非 MySQL 进程对数据库的访问将受到限制。

开始之前

初始用户可以安装软件包。其余步骤必须由 root 角色来执行。有关详细信息,请参见使用所指定的管理权限

  1. 安装 MySQL 软件包。
    # pkg search basename:mysql
    ...
    basename ... pkg:/database/mysql-51@version
    # pfexec pkg install mysql-51

    注 - 如果升级到 MySQL 数据库的版本 5.5,则需要将所有步骤修改为使用 5.555,而非 5.151
  2. 显示 MySQL 服务的 FMRI 和状态。
    # svcs mysql
    STATE          STIME    FMRI
    disabled       May_15   svc:/application/database/mysql:version_51
  3. 创建修改服务的执行方法的权限配置文件。

    该服务的服务清单指定执行方法为 shell 脚本包装 /lib/svc/method/mysql_51

    # svccfg -s mysql listprop | grep manifest
    ... astring     /lib/svc/manifest/application/database/mysql_51.xml
    # grep exec= /lib/svc/manifest/application/database/mysql_51.xml
                    exec='/lib/svc/method/mysql_51 start'
                    exec='/lib/svc/method/mysql_51 stop'
    

    在配置文件中使用命令的 /lib/svc/method/mysql_51 包装。

    % su -
    Password: xxxxxxxx
    # profiles -p "MySQL Service"
    MySQL Service> set desc="Locking down the MySQL Service"
    MySQL Service> add cmd=/lib/svc/method/mysql_51
    MySQL Service:mysql_51> set privs=basic
    MySQL Service:mysql_51> add privs={net_privaddr}:3306/tcp
    MySQL Service:mysql_51> add privs={file_write}:/var/mysql/5.1/data/*
    MySQL Service:mysql_51> add privs={file_write}:/tmp/mysql.sock
    MySQL Service:mysql_51> add privs={file_write}:/var/tmp/ib*
    MySQL Service:mysql_51> end
    MySQL Service> set uid=mysql
    MySQL Service> set gid=mysql
    MySQL Service> exit

    file_write 特权是缺省情况下授予所有进程的基本特权。通过显式枚举可写路径,将写入访问仅限于这些路径。该约束应用于指定的可执行文件及其子进程。

  4. 使 MySQL 的缺省端口成为特权端口。
    # ipadm set-prop -p extra_priv_ports+=3306 tcpipadm show-prop -p extra_priv_ports tcp
    PROTO PROPERTY            PERM CURRENT     PERSISTENT   DEFAULT    POSSIBLE
    tcp   extra_priv_ports    rw   2049,4045,  3306         2049,4045  1-65535
                                     3306

    net_privaddr 特权需要绑定到特权端口。对于 MySQL,绑定到缺省端口号 3306 通常不需要此特权。

  5. 将权限配置文件指定给 MySQL 服务并通知服务使用该配置文件。
    # svccfg -s mysql:version_51
    ...version_51> setprop method_context/profile="MySQLService"
    ...version_51> setprop method_context/use_profile=true
    ...version_51> refresh
    ...version_51> exit
  6. 启用服务。

    FMRI 的最后组成部分 mysql:version_51 足以唯一指定服务。

    svcadm enable mysql:version_5
  7. (u53ef选) 验证服务是否正在使用 MySQL 服务权限配置文件中指定的权限运行。
    # ppriv $(pgrep mysql)
    103697:   /usr/mysql/5.1/bin/mysqld --basedir=/usr/mysql/5.1 
                                        --datadir=/var/mysql/5.1/data
    flags =   PRIV_XPOLICY
        Extended policies: 
                 {net_privaddr}:3306/tcp   
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock  
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write
            I: basic,!file_write
            P: basic,!file_write
            L: all
    103609:  /bin/sh /usr/mysql/5.1/bin/mysqld_safe --user=mysql 
                                   --datadir=/var/mysql/5.1/data
    flags =  PRIV_XPOLICY
        Extended policies:
                 {net_privaddr}:3306/tcp
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write       
            I: basic,!file_write       
            P: basic,!file_write       
            L: all

如何将特定特权指定给 Apache Web 服务器

此过程通过仅向 Web 服务器守护进程指定需要的特权来锁定该守护进程。Web 服务器只能绑定到端口 80,并且只能写入 webservd 守护进程所拥有的文件。没有 apache22 服务进程以 root 身份运行。

开始之前

您必须承担 root 角色。有关详细信息,请参见使用所指定的管理权限

  1. 创建 Web 服务器权限配置文件。
    # profiles -p "Apache2"
    profiles:Apache2> set desc="Apache Web Server Extended Privilege"
    profiles:Apache2> add cmd=/lib/svc/method/http-apache22
    profiles:Apache2:http-apache22> add privs={net_privaddr}:80/tcp
    ...http-apache22> add privs={zone}:/system/volatile/apache2
    ...http-apache22> add privs={zone}:/var/apache2/2.2/logs/*
    ...http-apache22> add privs={zone}:/var/user
    ...http-apache22> add privs={file_write}:/var/user/webserv*
    ...http-apache22> add privs={file_write}:/tmp/*
    ...http-apache22> add privs={file_write}:/system/volatile/apache*
    ...http-apache22> add privs={file_write}:/proc/*
    ...http-apache22> add privs=basic,proc_priocntl
    ...http-apache22> set uid=webservd
    ...http-apache22> set gid=webservd
    ...http-apache22> end
    ---Apache2> exit
  2. (u53ef选) 如果要将 SSL 内核代理与 Apache2 配合使用,则必须将 SSL 端口添加到 webservd 扩展策略。
    # profiles -p "Apache2"
    profiles:Apache2> add privs={net_privaddr}:443/tcp
    profiles:Apache2> add privs={net_privaddr}:8443/tcp
    profiles:Apache2:http-apache22> end

    在 Oracle Solaris 11.2 中确保网络安全 中的如何配置 Apache 2.2 Web 服务器以使用 SSL 内核代理对 SSL 内核代理过程进行了介绍。

  3. 将权限配置文件添加到 apache22 SMF 启动方法。
    # svccfg -s apache22
    svc:/network/http:Apache2> listprop start/exec
    start/exec	 astring	"/lib/svc/method/http-apache22 start"
    ...
    svc:/network/http:Apache2> setprop start/profile="Apache2"
    svc:/network/http:Apache2> setprop start/use_profile=true
    svc:/network/http:Apache2> refresh
    svc:/network/http:Apache2> exit

    启用 apache22 服务后,将使用 Apache2 配置文件。

  4. 启用 apache22 服务。
    # svcadm enable apache22
  5. 验证 Web 服务器是否正常工作。

    打开浏览器并在 Firefox URL 字段中键入 localhost

接下来的步骤

要验证特权是否已正确应用,请继续执行如何确定 Apache Web 服务器正在使用的特权这一过程。

如何确定 Apache Web 服务器正在使用的特权

在该任务中,通过创建 Apache2 权限配置文件的调试版本确定 Web 服务器正在使用的特权。

开始之前

您已完成如何将特定特权指定给 Apache Web 服务器apache22 服务处于禁用状态。您现在处于 root 角色。

  1. 克隆 Apache2 配置文件以调用其他命令。

    调试命令比调试 SMF 服务简单。apachectl 以交互方式启动 Apache 服务。

    # profiles -p "Apache2"
    profiles:Apache2> set name="Apache-debug"
    profiles:Apache-debug> sel <Tab><Tab>
    profiles:Apache-debug:http-apache22> set id=/usr/apache2/2.2/bin/apachectl
    profiles:Apache-debug:apachectl> end
    profiles:Apache-debug> exit

    有关更多信息,请参见 apachectl(8) 手册页。

  2. 将克隆的配置文件指定给 webservd 帐户。
    # usermod -K profiles+=Apache-debug webservd
  3. 切换为 webservd 身份。
    # su - webservd
  4. (u53ef选) 验证身份。
    # id   
    uid=80(webservd) gid=80(webservd)
  5. 在配置文件 shell 中以调试模式启动 Web 服务。

    请勿直接使用 SMF。使用 Apache-debug 权限配置文件中的命令。

    % pfbash
    # ppriv -De /usr/apache2/2.2/bin/apachectl start
  6. root 角色中,检查第一个 http 守护进程的特权。
    # ppriv $(pgrep httpd|head -1)
    2999:   httpd
    flags = PRIV_DEBUG|PRIV_XPOLICY|PRIV_EXEC
      5         Extended policies:
      6                 {net_privaddr}:80/tcp
      7                 {zone}:/system/volatile/apache2
      8                 {zone}:/var/apache2/2.2/logs/*
      9                 {zone}:/var/user
     10                 {file_write}:/var/user/webserv*
     11                 {file_write}:/tmp/*
     12                 {file_write}:/system/volatile/apache*
     13                 {file_write}:/proc/*
     14         E: basic,!file_write,!proc_info,proc_priocntl
     15         I: basic,!file_write,!proc_info,proc_priocntl
     16         P: basic,!file_write,!proc_info,proc_priocntl
     17         L: all