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.
Limitar el acceso disponible para un usuario malintencionado que ingresa mediante un puerto: Cómo aplicar una política de privilegio extendida a un puerto
Ejecute una base de datos como un daemon root daemon: Cómo bloquear el servicio MySQL
Ejecutar el servidor Apache como un daemon servidor no root: Cómo asignar los privilegios específicos al servidor web Apache
Verificar que el servidor web Apache se esté ejecutando con privilegios: Cómo determinar qué privilegios está utilizando el servidor web de Apache
Evitar Firefox que escriba en directorios en el sistema: Example 4–4
Limitar las aplicaciones a directorios específicos en el sistema: Example 4–5
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.
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.
# svccfg -s ntp editprop
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.
# svcadm restart ntp
# 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
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.
# pkg search basename:mysql ... basename ... pkg:/database/mysql-51@version # pfexec pkg install mysql-51
# svcs mysql STATE STIME FMRI disabled May_15 svc:/application/database/mysql:version_51
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.
# ipadm set-prop -p extra_priv_ports+=3306 tcp # ipadm 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.
# 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
El último componente del FMRI mysql:version_51, es suficiente para especificar de forma única el servicio.
# svcadm enable mysql:version_5
# 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
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.
# 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
# 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 .
# 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.
# svcadm enable apache22
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.
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.
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).
# usermod -K profiles+=Apache-debug webservd
# su - webservd
# id uid=80(webservd) gid=80(webservd)
No utilice SMF directamente. Utilice el comando en el perfil de derechos Apache-debug.
% pfbash # ppriv -De /usr/apache2/2.2/bin/apachectl start
# 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