Protección de los usuarios y los procesos en Oracle® Solaris 11.2

Salir de la Vista de impresión

Actualización: Julio de 2014
 
 

Bloqueo de recursos utilizando privilegios ampliados

La política de privilegio extendido puede limitar el acceso de agresores a un sistema cuando se ejecuta con éxito un ataque sobre una aplicación. Una regla de asignación de privilegios limita el ámbito del efecto de una política extendida sólo al recurso que está en la regla. Las reglas de política extendida se expresan colocando los privilegios entre llaves, seguidos de dos puntos y el recurso asociado. Para obtener más información, consulte Ampliación de los privilegios de un usuario o rol. Para ver ejemplos de la sintaxis, consulte las páginas del comando man ppriv(1) y privileges(5).

Tanto los administradores y los usuarios comunes pueden bloquear recursos utilizando privilegios ampliados. Los administradores pueden crear reglas de privilegio extendido para los usuarios, los puertos y las aplicaciones. Los usuarios comunes pueden utilizar la línea de comandos o escribir secuencias de comandos que utilice el comando ppriv -r para evitar que las aplicaciones escriban archivos fuera de los directorios especificados por el usuario.

Cómo aplicar una política de privilegio extendida a un puerto

El servicio para el protocolo de hora de red (NTP) utiliza el puerto con privilegios 123 para el tráfico udp. Se requieren privilegios para que se ejecute este servicio. Este procedimiento modifica el manifiesto del servicio para proteger a otros puertos contra el acceso de un usuario malintencionado que puede obtener los privilegios que están asignados a este puerto.

Antes de empezar

Debe asumir el rol root. Para obtener más información, consulte Uso de sus derechos administrativos asignados.

  1. Lea la entrada de manifiesto de servicio predeterminada para el puerto.

    Desde el siguiente método de entrada /lib/svc/manifest/network/ntp.xml start, los privilegios net_privaddr, proc_lock_memory y sys_time se pueden usar en otros procesos:

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

    Los privilegios eliminados especificados por !file_link_any,!proc_info,!proc_session evitan que el servicio indique u observe otros procesos y creen enlaces físicos como una manera de renombrar archivos. Es decir, el proceso que inicia el servicio solamente se puede enlazar con el puerto NTP 123 y no se puede enlazar con ningún otro puerto con privilegios.

    Si un pirata informático quisiera aprovechar el servicio para iniciar otro proceso, ese estaría limitado de manera similar.

  2. Modifique los métodos start y restart para limitar el privilegio net_privaddr solamente para este puerto.
    # svccfg -s ntp editprop
    1. Busque la cadena net_privaddr.
    2. Elimine el comentario de las entradas que contienen net_privaddr.
    3. En ambas entradas, reemplace net_privaddr con {net_privaddr}:123/udp.

      La política de privilegio extendido, elimina todos los privilegios de este servicio, excepto los privilegios especificados más los privilegios básicos que no están especificados. Por lo tanto, el conjunto de más de ochenta privilegios potencialmente explotables se reduce a menos de ocho.

  3. Reinicie el servicio para utilizar la política de privilegio extendido.
    # svcadm restart ntp
  4. Verifique que el servicio esté utilizando el privilegio extendido.
    # 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
    

Cómo bloquear el servicio MySQL

En la instalación, la base de datos MySQL se configura para ejecutarse con los privilegios completos de root sobre un puerto no protegido. En esta tarea, se asigna la política de privilegio extendido al servicio MySQL en un perfil de derechos. Una vez que el perfil de derechos se convierte en el método exec del servicio, MySQL se ejecuta sobre un puerto protegido como el usuario mysql, con acceso limitado a la base de datos por parte de los procesos que no son de MySQL.

Antes de empezar

El usuario inicial puede instalar el depósito de paquetes. Los pasos restantes se deben realizar mediante el rol de usuario root. Para obtener más información, consulte Uso de sus derechos administrativos asignados.

  1. Instale el depósito de paquetes MySQL.
    # pkg search basename:mysql
    ...
    basename ... pkg:/database/mysql-51@version
    # pfexec pkg install mysql-51

    Notas - Si realiza la actualización a la versión 5.5 de la base de datos MySQL, modifique todos los pasos para utilizar 5.5 y 55 en lugar de 5.1 y 51.
  2. Muestre el FMRI y el estado del servicio MySQL.
    # svcs mysql
    STATE          STIME    FMRI
    disabled       May_15   svc:/application/database/mysql:version_51
  3. Cree un perfil de derechos que modifica el método de ejecución del servicio.

    El manifiesto del servicio para este servicio especifica que el método de ejecución es una secuencia de comandos de 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'
    

    Use el envoltorio /lib/svc/method/mysql_51 para el comando en el perfil.

    % 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

    El privilegio file_write es un privilegio básico otorgado de manera predeterminada a todos los procesos. Enumerando las rutas de acceso de escritura de forma explícita, el acceso de escritura está restringido sólo a aquellas rutas. Esta restricción se aplica para el ejecutable especificado y sus procesos secundarios.

  4. Haga que el puerto predeterminado para MySQL sea un puerto con privilegios.
    # 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

    Se necesita el privilegio net_privaddr para enlazar a un puerto con privilegios. En el caso de que MySQL, el enlace al número de puerto predeterminado, 3306, normalmente no requiere este privilegio.

  5. Asigne el perfil de derechos para el servicio MySQL e indique al servicio que lo utilice.
    # 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. Active el servicio.

    El último componente del FMRI mysql:version_51, es suficiente para especificar de forma única el servicio.

    svcadm enable mysql:version_5
  7. (Opcional) Compruebe que el servicio esté funcionando con los derechos que se especifican en el perfil de derechos del servicio 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

Cómo asignar los privilegios específicos al servidor web Apache

Este procedimiento bloquea el daemon del servidor web al asignarle solamente los privilegios que necesita. El servidor web sólo puede enlazar al puerto 80 y sólo puede escribir en archivos que son propiedad del daemon webservd. No hay ningún servicio apache22 los procesos se ejecutan como root.

Antes de empezar

Debe asumir el rol root. Para obtener más información, consulte Uso de sus derechos administrativos asignados.

  1. Cree el perfil de derechos del servidor 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. (Opcional) Si utiliza el proxy SSL en el nivel del núcleo con Apache2, debe agregar los puertos SSL a la política extendida 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

    El procedimiento del núcleo SSL procedimiento se describe en Cómo configurar un servidor web Apache 2.2 para utilizar el Proxy SSL en el nivel del núcleo de Protección de la red en Oracle Solaris 11.2 .

  3. Agregue el perfil de derechos al método de inicio de 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

    Cuando el servicio apache22 servicio está activado, se utilizará el perfil Apache2.

  4. Active el servicio apache22.
    # svcadm enable apache22
  5. Verifique que el servidor web esté funcionando.

    Abra un explorador y escriba localhost en el campo URL de Firefox.

Pasos siguientes

Para verificar que los privilegios se aplican correctamente, continúe con Cómo determinar qué privilegios está utilizando el servidor web de Apache.

Cómo determinar qué privilegios está utilizando el servidor web de Apache

En esta tarea, se determinan los privilegios que usa el servidor web mediante la creación de una versión de la depuración del perfil de derechos Apache2.

Antes de empezar

Ha completado Cómo asignar los privilegios específicos al servidor web Apache. El servicio apache22 está desactivado. Debe estar en el rol root.

  1. Clone el perfil de Apache2 para llamar a otro comando.

    Depurar un comando es más sencillo que la depuración de un servicio SMF. El comando apachectl inicia el servicio Apache de forma interactiva.

    # 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

    Para obtener más información, consulte la página del comando man apachectl(8).

  2. Asigne el perfil clonado a la cuenta webservd.
    # usermod -K profiles+=Apache-debug webservd
  3. Cambie a la identidad webservd.
    # su - webservd
  4. (Opcional) Verifique la identidad.
    # id   
    uid=80(webservd) gid=80(webservd)
  5. Inicie el servicio web en modo de depuración en un shell de perfil.

    No utilice SMF directamente. Utilice el comando en el perfil de derechos Apache-debug.

    % pfbash
    # ppriv -De /usr/apache2/2.2/bin/apachectl start
  6. En el rol root, examine los privilegios del primer daemon 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