Administración de Servicios Confinados

Anuncio
Fedora 13
Administración de
Servicios Confinados
Scott Radvan
Administración de Servicios Confinados
Fedora 13 Administración de Servicios Confinados
Autor
Scott Radvan
sradvan@redhat.com
Copyright © 2010 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons
Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available
at http://creativecommons.org/licenses/by-sa/3.0/. The original authors of this document, and Red Hat,
designate the Fedora Project as the "Attribution Party" for purposes of CC-BY-SA. In accordance with
CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the
original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert,
Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, MetaMatrix, Fedora, the Infinity
Logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
For guidelines on the permitted uses of the Fedora trademarks, refer to https://fedoraproject.org/wiki/
Legal:Trademark_guidelines.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States
and/or other countries.
All other trademarks are the property of their respective owners.
La guía de Administración de Servicios Confinados está diseñada para asistir a los usuarios
avanzados y a los administradores en el uso y configuración de SELinux. Se centra en Fedora
Linux y describe los componentes de SELinux en relación a los servicios que un usuario avanzado
o administrador pueda necesitar configurar. También se incluyen ejemplos de la vida real de la
configuración de estos servicios y demostraciones sobre cómo SELinux complementa su operación.
Prefacio
v
1. Convenciones del Documento .......................................................................................... v
1.1. Convenciones Tipográficas ................................................................................... v
1.2. Convenciones del documento ............................................................................... vi
1.3. Notas y Advertencias .......................................................................................... vii
2. ¡Necesitamos sus comentarios! ..................................................................................... viii
1. Información sobre el Registro de Marca
1
2. Introducción
3
3. Política dirigida
3.1. Tipo de obediencia .......................................................................................................
3.2. Procesos confinados ....................................................................................................
3.3. Procesos no confinados ...............................................................................................
5
5
5
8
4. El servidor HTTP Apache
4.1. El servidor HTTP Apache y SELinux ...........................................................................
4.2. Tipos .........................................................................................................................
4.3. Booleanos ..................................................................................................................
4.4. Ejemplos de configuración ..........................................................................................
4.4.1. Cómo ejecutar un sitio estático .........................................................................
4.4.2. Cómo compartir sistemas de archivos NFS y CIFS ............................................
4.4.3. Cómo compartir archivos entre los servicios ......................................................
4.4.4. Cómo modificar los números de puertos ...........................................................
13
13
16
18
21
21
22
23
27
5. Samba
5.1. Samba y SELinux ......................................................................................................
5.2. Tipos .........................................................................................................................
5.3. Booleanos ..................................................................................................................
5.4. Ejemplos de configuración ..........................................................................................
5.4.1. Compartiendo directorios que usted creó ..........................................................
5.4.2. Compartiendo un sitio web ...............................................................................
29
29
30
30
31
31
33
6. File Transfer Protocol (FTP)
6.1. SELinux y FTP ...........................................................................................................
6.2. Tipos .........................................................................................................................
6.3. Booleanos ..................................................................................................................
6.4. Ejemplos de configuración ..........................................................................................
6.4.1. Cómo enviar datos a un sitio FTP ....................................................................
37
37
39
40
41
41
7. Sistema de Archivos en Red (NFS)
7.1. NFS y SELinux ..........................................................................................................
7.2. Tipos .........................................................................................................................
7.3. Booleanos ..................................................................................................................
7.4. Ejemplos de configuración ..........................................................................................
7.4.1. Compartiendo directorios usando NFS ..............................................................
45
45
45
45
46
46
8. Dominio de Nombres de Internet Berkeley (BIND)
8.1. BIND y SELinux .........................................................................................................
8.2. Tipos .........................................................................................................................
8.3. Boolenanos ................................................................................................................
8.4. Ejemplos de configuración ..........................................................................................
8.4.1. DNS Dinámico .................................................................................................
51
51
51
52
52
52
9. Sistema de Versionado Concurrentes (CVS)
53
iii
Administración de Servicios Confinados
9.1.
9.2.
9.3.
9.4.
CVS y SELinux ..........................................................................................................
Tipos .........................................................................................................................
Booleanos ..................................................................................................................
Ejemplos de configuración ..........................................................................................
9.4.1. Configuración de CVS .....................................................................................
9.4.2. Configuración del Servidor ...............................................................................
53
53
53
54
54
54
10. Squid Caching Proxy
10.1. Squid Caching Proxy y SELinux ................................................................................
10.2. Tipos ........................................................................................................................
10.3. Booleanos ................................................................................................................
10.4. Ejemplos de configuración ........................................................................................
10.4.1. Squid Conectando a puertos no estándar ........................................................
57
57
59
60
60
60
11. MySQL
11.1. MySQL y SELinux ....................................................................................................
11.2. Tipos ........................................................................................................................
11.3. Booleanos ................................................................................................................
11.4. Ejemplos de configuración ........................................................................................
11.4.1. Cambiando la ubicación de la Base de Datos MySQL ......................................
63
63
64
64
65
65
12. PostgreSQL
12.1. PostgreSQL y SELinux .............................................................................................
12.2. Tipos ........................................................................................................................
12.3. Booleanos ................................................................................................................
12.4. Ejemplos de configuración ........................................................................................
12.4.1. Cambiando la ubicación de la Base de Datos PostgreSQL ...............................
69
69
70
71
71
71
13. rsync
13.1.
13.2.
13.3.
13.4.
rsync y SELinux .......................................................................................................
Tipos ........................................................................................................................
Booleanos ................................................................................................................
Ejemplos de configuración ........................................................................................
13.4.1. Rsync como demonio ....................................................................................
75
75
75
76
76
76
14. Postfix
14.1. Postfix y SELinux .....................................................................................................
14.2. Tipos ........................................................................................................................
14.3. Booleanos ................................................................................................................
14.4. Ejemplos de configuración ........................................................................................
14.4.1. SpamAssassin y Postfix .................................................................................
81
81
82
82
82
82
15. Referencias
85
iv
Prefacio
1. Convenciones del Documento
Este manual utiliza varias convenciones para resaltar algunas palabras y frases y llamar la atención
sobre ciertas partes específicas de información.
1
En ediciones PDF y de papel, este manual utiliza tipos de letra procedentes de Liberation Fonts .
Liberation Fonts también se utilizan en ediciones de HTML si están instalados en su sistema. Si no,
se muestran tipografías alternativas pero equivalentes. Nota: Red Hat Enterprise Linux 5 y siguientes
incluyen Liberation Fonts predeterminadas.
1.1. Convenciones Tipográficas
Se utilizan cuatro convenciones tipográficas para llamar la atención sobre palabras o frases
específicas. Dichas convenciones y las circunstancias en que se aplican son las siguientes:
Negrita monoespaciado
Utilizada para resaltar la entrada del sistema, incluyendo comandos de shell, nombres de archivo y
rutas. También se utiliza para resaltar teclas claves y combinaciones de teclas. Por ejemplo:
Para ver el contenido del archivo my_next_bestselling_novel en su directorio
actual de trabajo, escriba el comando cat my_next_bestselling_novel en el
intérprete de comandos de shell y pulse Enter para ejecutar el comando.
El ejemplo anterior incluye un nombre de archivo, un comando de shell y una tecla clave. Todo se
presenta en negrita-monoespaciado y distinguible gracias al contexto.
Las combinaciones de teclas se pueden distinguir de las teclas claves mediante el guión que conecta
cada parte de una combinación de tecla. Por ejemplo:
Pulse Enter para ejecutar el comando.
Pulse Control+Alt+F1 para cambiar a la primera terminal virtual. Pulse
Control+Alt+F7 para volver a su sesión de Ventanas-X.
La primera oración resalta la tecla clave determinada que se debe pulsar. La segunda resalta dos
conjuntos de tres teclas claves que deben ser presionadas simultáneamente.
Si se discute el código fuente, los nombres de las clase, los métodos, las funciones, los nombres de
variables y valores de retorno mencionados dentro de un párrafo serán presentados en Negritamonoespaciado. Por ejemplo:
Las clases de archivo relacionadas incluyen filename para sistema de archivos,
file para archivos y dir para directorios. Cada clase tiene su propio conjunto
asociado de permisos.
Negrita proporcional
1
https://fedorahosted.org/liberation-fonts/
v
Prefacio
Esta denota palabras o frases encontradas en un sistema, incluyendo nombres de aplicación, texto de
cuadro de diálogo, botones etiquetados, etiquetas de cajilla de verificación y botón de radio; títulos de
menú y títulos del sub-menú. Por ejemplo:
Seleccionar Sistema → Preferencias → Ratón desde la barra del menú principal
para lanzar Preferencias de Ratón. En la pestaña de Botones, haga clic en la cajilla
ratón de mano izquierda y luego haga clic en Cerrar para cambiar el botón principal
del ratón de la izquierda a la derecha (adecuando el ratón para la mano izquierda).
Para insertar un caracter especial en un archivo de gedit, seleccione desde la barra
del menú principal Aplicaciones → Accesorios → Mapa de caracteres. Luego,
desde la barra del menú mapa de caracteres elija Búsqueda → Hallar…, teclee el
nombre del caracter en el campo Búsqueda y haga clic en Siguiente. El caracter
buscado se resaltará en la Tabla de caracteres. Haga doble clic en este caracter
resaltado para colocarlo en el campo de Texto para copiar y luego haga clic en el
botón de Copiar. Ahora regrese a su documento y elija Editar → Pegar desde la
barra de menú de gedit.
El texto anterior incluye nombres de aplicación; nombres y elementos del menú de todo el sistema;
nombres de menú de aplicaciones específicas y botones y texto hallados dentro de una interfaz
gráfica de usuario, todos presentados en negrita proporcional y distinguibles por contexto.
Itálicas-negrita monoespaciado o Itálicas-negrita proporcional
Ya sea negrita monoespaciado o negrita proporcional, la adición de itálicas indica texto reemplazable
o variable. Las itálicas denotan texto que usted no escribe literalmente o texto mostrado que cambia
dependiendo de la circunstancia. Por ejemplo:
Para conectar a una máquina remota utilizando ssh, teclee ssh
nombredeusuario@dominio.nombre en un intérprete de comandos de shell. Si la
máquina remota es example.com y su nombre de usuario en esa máquina es john,
teclee ssh john@example.com.
El comando mount -o remount file-system remonta el sistema de archivo
llamado. Por ejemplo, para volver a montar el sistema de archivo /home, el comando
es mount -o remount /home.
Para ver la versión de un paquete actualmente instalado, utilice el comando rpm -q
paquete. Éste entregará el resultado siguiente: paquete-versión-lanzamiento.
Observe las palabras en itálicas- negrita sobre — nombre de usuario, domain.name, sistema de
archivo, paquete, versión y lanzamiento. Cada palabra es un marcador de posición, tanto para el texto
que usted escriba al ejecutar un comando como para el texto mostrado por el sistema.
Aparte del uso estándar para presentar el título de un trabajo, las itálicas denotan el primer uso de un
término nuevo e importante. Por ejemplo:
Publican es un sistema de publicación de DocBook.
1.2. Convenciones del documento
Los mensajes de salida de la terminal o fragmentos de código fuente se distinguen visualmente del
texto circundante.
vi
Notas y Advertencias
Los mensajes de salida enviados a una terminal se muestran en romano monoespaciado y se
presentan así:
books
books_tests
Desktop
Desktop1
documentation
downloads
drafts
images
mss
notes
photos
scripts
stuff
svgs
svn
Los listados de código fuente también se muestran en romano monoespaciado, pero se presentan
y resaltan de la siguiente manera:
package org.jboss.book.jca.ex1;
import javax.naming.InitialContext;
public class ExClient
{
public static void main(String args[])
throws Exception
{
InitialContext iniCtx = new InitialContext();
Object
ref
= iniCtx.lookup("EchoBean");
EchoHome
home
= (EchoHome) ref;
Echo
echo
= home.create();
System.out.println("Created Echo");
System.out.println("Echo.echo('Hello') = " + echo.echo("Hello"));
}
}
1.3. Notas y Advertencias
Finalmente, utilizamos tres estilos visuales para llamar la atención sobre la información que de otro
modo se podría pasar por alto.
Nota
Una nota es una sugerencia, atajo o enfoque alternativo para una tarea determinada.
Ignorar una nota no debería tener consecuencias negativas, pero podría perderse de
algunos trucos que pueden facilitarle las cosas.
Importante
Important boxes detail things that are easily missed: configuration changes that
only apply to the current session, or services that need restarting before an update
will apply. Ignoring a box labeled 'Important' won't cause data loss but may cause
irritation and frustration.
Advertencia
Las advertencias no deben ignorarse. Ignorarlas muy probablemente ocasionará
pérdida de datos.
vii
Prefacio
2. ¡Necesitamos sus comentarios!
Si encuentra un error tipográfico en este manual o si sabe de alguna manera de mejorarlo,
nos gustaría escuchar sus sugerencias. Por favor complete un reporte en Bugzilla: http://
bugzilla.redhat.com/bugzilla/ usando el producto Fedora Documentation.
When submitting a bug report, be sure to mention the manual's identifier: selinux-managing-confinedservices-guide
Si tiene una sugerencia para mejorar la documentación, intente ser tan específico como sea posible
cuando describa su sugerencia. Si ha encontrado un error, por favor incluya el número de sección y
parte del texto que rodea el error para que podamos encontrarlo más fácilmente.
viii
Información sobre el Registro de Marca
Linux® es una marcha registrada por Linus Torvalds en los U.S. y otros países.
UNIX es una marca registra de The Open Group
Type Enforcement es una marca registrada de Secure Computing, LLC, una subsidiara de McAfee,
Inc. en los EEUU y otros países. Ni McAfee ni Secure Computing, LLC, ha concedido al autor el uso o
referencia a esta marca registrada más allá de esta guía.
Apache es una marca registra de la fundación Apache.
MySQL es una marca registrada por Sun Microsystem en los Estados Unidos y otros países.
Windows es una marca registrada de Microsoft Corporation en los Estados Unidos y otros países
Otros productos mencionados pueden se marcas registradas de las corporaciones respectivas.
1
2
Introducción
El Linux de Seguridad Mejorada (SELinux) hace referencia a los archivos, tales como los directorios
o los dispositivos, como objetos. Los procesos, tales como los comandos que ejecuta un usuario o la
aplicación Mozilla® Firefox®, son referenciadas como sujetos. La mayoría de los sistemas operativos
usan un sistema de Control de Acceso Discrecional (DAC) que controla cómo los sujetos interactúan
con los objetos, y cómo los sujetos interactúan entre sí. En los sistemas operativos que se usa DAC,
los usuarios controlan los permisos de archivos (objetos) que le pertenecen. Por ejemplo, en sistemas
operativos Linux®, los usuarios pueden hacer que sus directorios personales sean legibles para
todos, sin darse cuenta que le están dando permiso a usuarios y procesos (sujetos) de acceder a
información potencialmente sensible.
Los mecanismos DAC son básicamente inadecuados si se está pensando en una seguridad de
los sistemas poderosa. Las decisiones de los accesos DAC están basadas exclusivamente en la
identidad y grupos de pertenencia del usuario, sin tener en cuenta otro tipo de información relevante
para la seguridad, como lo es, por ejemplo, las funciones del usuario, la confiabilidad del programa
utilizado, y la importancia y la integridad de los datos. Cada usuario posee un control absoluto sobre
sus archivos, haciendo imposible imponer una política de seguridad diseñada para un sistema en
general. Más aún, cada programa ejecutado por un servidor hereda todos los permisos otorgados al
usuario, y tiene la libertad de modificar los accesos a sus archivos, de modo que no se ofrece ningún
tipo de protección contra software malicioso. Numerosos servicios y programas del sistema deben ser
ejecutados con privilegios que superan ampliamente sus requerimientos, de modo que una falla en
1
alguno de estos programas puede ser aprovechada para obtener acceso completo al sistema.
A continuación ofrecemos un ejemplo de los permisos utilizados en sistemas operativos basados en
Linux que no ejecutan Linux con seguridad mejorada (SELinux). Los permisos en estos ejemplos
podrían ser distintos de los de su sistema. Utilice el comando ls -l para conocer los permisos de
archivos:
$ ls -l file1
-rwxrw-r-- 1 user1 group1 0 2010-02-28 07:12 file1
Los primeros tres bits de permisos, rwx, controlan el acceso que el usuario Linux user1 (en este
caso, el dueño) tiene sobre el archivo file1. Los tres bits de permiso siguientes, rw-, controlan el
acceso que el grupo Linux group1 tiene sobre el archivo file1. Los tres últimos bits de permisos,
r--, controlan el acceso que posee el resto sobre el archivo file1, que incluye tanto a los usuarios
como a los procesos.
Linux con seguridad mejorada (SELinux) agrega Control de acceso obligatorio (MAC, por las iniciales
en inglés de Mandatory Access Control) al Kernel de Linux, y se encuentra habilitado por defecto en
Fedora. Una arquitectura MAC de propósitos generales necesita tener la posibilidad de hacer complir
a todos los procesos y archivos del sistema un conjunto de políticas administrativas de seguridad,
fundamentando las decisiones adoptadas en etiquetas que contienen una cantidad determinada de
información relacionada con la seguridad. Cuando se implementa adecuadamente, permite que un
sistema pueda defenderse exitosamente, y ofrece soporte crítico protegiéndolo contra manipulaciones
y anulaciones de las aplicaciones relacionadas con la seguridad. MAC ofrece una poderosa distinción
"Incluyendo en un sistema operativo Linux soporte flexible para políticas de seguridad" (en inglés), por Peter Loscocco y
Stephen Smalley. Este ensayo fue preparado en un princiío para la Agencia de nacional de seguridad norteamericana, y por lo
tanto, es de dominio público. Consulte ensayo original (en inglés) [http://www.nsa.gov/research/_files/selinux/papers/freenix01/
index.shtml] para obtener mayor información y poder conocer la primera edición de este documento. Todas las ediciones y
modificaciones fueron realizadas por Murray McAllister.
3
Capítulo 2. Introducción
entre las aplicaciones, y esto posibilita la ejecución segura de elementos no confiables. Su habilidad
para limtar los privilegios asociados con la ejecución de procesos reduce el alcance del potencial
daño que podría resultar del aprovechamiento de las debilidades en los servicios y las aplicaciones
del sistema. MAC permite que la información sea protegida tanto de los usuarios legítimos con
niveles de autorización limitados, como de los usuarios legítimos que sin saberlo estén ejecutando
2
aplicaciones maliciosas.
A continuación ofrecemos un ejemplo de las etiquetas que contienen información importante
relacionada con la seguridad, y que son utilizadas con los procesos, usuarios y archivos de un
sistema operativo basado en Linux que esté ejecutándose con SELinux activado. A esta información
se la denomina "contexto de Selinux", y puede observarse ejecutando el comando ls -Z:
$ ls -Z archivo1
-rwxrw-r-- usuario1 grupo1 unconfined_u:object_r:user_home_t:s0 archivo1
En este ejemplo, SELinux provee un usuario (unconfined_u), un rol (object_r), un tipo
(user_home_t) y un nivel (s0). Esta información se usa para tomar decisiones de control de acceso.
Este ejemplo también muestra las reglas DAC, que se muestran en el contexto de SELinux vía el
comando ls -Z. Las reglas de la política de SELinux se chequean después de las reglas DAC rules.
Las reglas de la política de SELinux no se usan si las reglas DAC denegaron el acceso al principio.
"Meeting Critical Security Objectives with Security-Enhanced Linux" (en inglés), por Peter Loscocco y Stephen Smalley. Este
ensayo fue preparado en un princiío para la Agencia de nacional de seguridad norteamericana, y por lo tanto, es de dominio
público. Consulte el ensayo original (en inglés) [http://www.nsa.gov/research/_files/selinux/papers/ottawa01/index.shtml] para
obtener mayor información y poder conocer la primera edición de este documento. Todas las ediciones y modificaciones fueron
realizadas por Murray McAllister.
4
Política dirigida
La política dirigida es la política predeterminada de SELinux utilizada en Fedora. Cuando se utilice
una política dirigida, los procesos seleccionados se ejecutan en un dominio confinado, y los procesos
que no son seleccionados son ejecutados en un dominio no confinado. Por ejemplo, por defecto, los
usuarios registrados ejecutan el dominio unconfined_t, y los procesos del sistema iniciados por init
se ejecutan en el dominio initrc_t - ambos no confinados.
SELinux está basado en el menor de los niveles de acceso que un servicio necesita para poder
funcionar. Los servicios pueden ser ejecutados en una variedad de formas; por lo tanto debe decirle
a SELinux de qué manera usted está ejecutando servicios. Esto puede ser logrado mediante los
Booleanos que permiten que determinadas partes de SELinux puedan ser modificadas en el tiempo
de ejecución, sin ningún tipo de conocimiento relacionado con la escritura de políticas SELinux. Esto
permite cambios como permitir el acceso de los servicios a sistemas de archivos NFS, sin por ello
tener que recargar o recompilar políticas de SELinux. La configuración de Booleanos se describe más
adelante.
Otras modificaciones, como ser por ejemplo la utilización de directorios que no sean los
predeterminados para almacenar archivos o servicios, o la modificación de servicios para ejecutarlos
puertos no predeterminados, necesitan que la configuración de la política sea actualizada mediante
herramientas como semanage. Esto será tratado con detalle más adelante, mediante ejemplos de
configuración específicos.
3.1. Tipo de obediencia
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
3.2. Procesos confinados
En Fedora, casi todos los servicios que escuchan sobre una red se encuentran confinados. Además,
la mayoría de los procesos que son ejecutados como usuario root y que realizan tareas para usuarios,
como por ejemplo la herramienta passwd, se encuentran confinados. Cuando un proceso se
encuentra confinado, es ejecutado en su propio dominio, como ser, por ejemplo el proceso httpd
ejecutándose en el dominio httpd_t. Si un servicio confinado es comprometido por un atacante, de
acuerdo a la configuración de la política SELinux, se limita el tipo de acceso que tiene el atacante al
recurso comprometido, y el posible daño realizado.
El ejemplo que ofrecemos a continuación demuestra de qué manera SELinux evita que el servidor
HTTP Apache (httpd) pueda leer archivos que no se encuentran correctamente etiquetados, como
ser, por ejemplo los destinados a ser utilizados por Samba. Este es un ejemplo, y no debería ser
utilizado en entornos de producción. Presupone que los paquetes httpd, wget, setroubleshoot-server,
y audit se encuentran instalados, que se está utilizando una política dirigida, y que SELinux está
siendo ejecutado en modo obligatorio:
1. Ejecute el comando sestatus para confirmar que SELinux se encuentre habilitado, que está
siendo ejecutado en modo obligatorio, y que se está utilizando una política dirigida:
5
Capítulo 3. Política dirigida
$ /usr/sbin/sestatus
SELinux status:
SELinuxfs mount:
Current mode:
Mode from config file:
Policy version:
Policy from config file:
enabled
/selinux
enforcing
enforcing
24
targeted
SELinux status: enabled es lo que se obtiene cuando SELinux está habilitado. Current
mode: enforcing cuando SELinux está ejecutándose en modo obligatorio. Policy from
config file: targeted cuando se está utilizando una política dirigida.
2. Como usuario root, ejecute el comando touch /var/www/html/testfile para crear un
archivo.
3. Ejecute el comando ls -Z /var/www/html/archivoprueba para ver el contexto SELinux:
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/
archivoprueba
El archivo testfile es etiquetado con el usuario SELinux unconfined_u ya que un usuario
Linux que se encuentra mapeado en el usuario SELinux unconfined_u ha creado el archivo.
Los controles de acceso basados en las funciones (RBAC, por las iniciales en inglés de RoleBased Access Control) son utilizados para los procesos, pero no para los archivos. Las funciones
no tienen sentido para los archivos - la función object_r es una función general utilizada para
los archivos (en sistemas de archivos de almacenamiento persistente o de red). Dentro del
directorio /proc/, los archivos relacionados con procesos podrían utilizar la función system_r
1
role. El tipo httpd_sys_content_t permite que el proceso httpd pueda acceder a este
archivo.
4. Como usuario root, ejecute el comando service httpd start para iniciar el proceso httpd.
Si httpd se inicia correctamente, el resultado debería ser el siguiente:
# /sbin/service httpd start
Starting httpd:
[
OK
]
5. Trasládese al directorio al que su usuario Linux tiene permisos de escritura, y ejecute el comando
wget http://localhost/testfile. A menos que existan modificaciones en la configuración
predeterminada, este comando funciona:
--2010-02-28 08:44:36-- http://localhost/testfile
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/plain]
Saving to: `testfile'
[ <=>
] 0
--.-K/s
in 0s
2010-02-28 08:44:36 (0.00 B/s) - `testfile' saved [0/0]
6. El comando chcon re etiqueta archivos; sin embargo, tales modificaciones en el etiquetado
no sobreviven cuando el sistema de archivos es re etiquetado nuevamente. Para que las
modificaciones sean permanentes de modo que sobrevivan a nuevos re etiquetados del sistema
6
Procesos confinados
de archivos, utilice el comando semanage el cual es detallado más adelante. Como usuario root,
ejecute el siguiente comando para modificar el tipo a un tipo utilizado por Samba:
chcon -t samba_share_t /var/www/html/testfile
Ejecute el comando ls -Z /var/www/html/archivoprueba para ver los cambios:
-rw-r--r--
root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
7. Nota: los permisos DAC actuales permiten que los procesos httpd puedan acceder al archivo
testfile. Trasládese hacia un directorio sobre el cual su usuario Linux tenga permisos de
escritura, y ejecute el comando wget http://localhost/testfile. A menos que existan
modificaciones en la configuración predeterminada, este comando no sirve:
--2010-02-28 08:45:07-- http://localhost/testfile
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2010-02-28 08:45:08 ERROR 403: Forbidden.
8. Como usuario root, ejecute el comando rm -i /var/www/html/testfile para eliminar el
archivo testfile.
9. Si no necesita que httpd esté ejecutándose, como usuario root ejecute el comando service
httpd stop para detener httpd:
# /sbin/service httpd stop
Stopping httpd:
[
OK
]
Nuestro ejemplo demuestra la seguridad adicional agregada por SELinux. Las reglas DAC permiten
que el proceso httpd pueda acceder al archivo testfile del paso 7, pero debido a que el archivo
fue etiquetado con un tipo al que el proceso httpd no tiene acceso, SELinux le ha negado el ingreso.
Luego del paso 7, un error similar al siguiente es registrado en el archivo /var/log/messages:
Apr 6 23:00:54 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr"
to /var/www/html/testfile (samba_share_t). For complete SELinux messages.
run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
Los archivos de registro anteriores podrían utilizar un formato /var/log/messages.YYYYMMDD.
Cuando se ejecute syslog-ng, los archivos de registros previos utilizan un formato /var/log/
messages.X format. Si los procesos setroubleshootd y auditd están siendo ejecutados, serán
registrados en /var/log/audit/audit.log errores similares a los siguientes:
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd"
path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13
a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48
gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/
usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Además, un error similar al siguiente es registrado en el archivo /var/log/httpd/error_log:
7
Capítulo 3. Política dirigida
[Sat Apr 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /
testfile denied
3.3. Procesos no confinados
Los procesos no confinados son ejecutados en dominios no confinados. Por ejemplo, los programas
init se ejecutan en el dominio no confinado initrc_t, los servicios no confinados del kernel se
ejecutan en el dominio kernel_t, y los usuarios Linux no confinados en el dominio unconfined_t.
Para dominios no confinados, se aplican reglas de polítcas SELinux, pero existen reglas de políticas
que otorgan casi un acceso total a los procesos que se están ejecutando sobre dominios no
confinados. Los procesos que se estén ejecutando en dominios no confinados no son capaces de
utilizar exclusivamente reglas DAC. Si un proceso no confinado es comprometido, SELinux no evita
que un atacante pueda obtener acceso a los recursos del sistema y a los datos, aunque por supuesto
siguen siendo utilizadas las reglas DAC. SELinux es una mejora en la seguridad construida sobre las
reglas DAC - no las reemplaza.
El ejemplo que ofrecemos a continuación demuestra de qué manera el servidor HTTP Apache
(httpd) es capaz de acceder a datos originalmente destinados a ser utilizados por Samba, cuando
es ejecutado de manera no confinada. Nota: En Fedora, los procesos httpd son ejecutados de forma
predeterminada en el dominio httpd_t. Este es un ejemplo, y no debería ser utilizado en entornos
de producción. Presupone que los paquetes httpd, wget, setroubleshoot-server, y audit se encuentran
instalados, que se está utilizando una política SELinux dirigida, y que SELinux está siendo ejecutado
en modo obligatorio:
1. Ejecute el comando sestatus para confirmar que SELinux se encuentre habilitado, que está
siendo ejecutado en modo obligatorio, y que se está utilizando una política dirigida:
$ /usr/sbin/sestatus
SELinux status:
SELinuxfs mount:
Current mode:
Mode from config file:
Policy version:
Policy from config file:
enabled
/selinux
enforcing
enforcing
24
targeted
SELinux status: enabled es lo que se obtiene cuando SELinux está habilitado. Current
mode: enforcing cuando SELinux está ejecutándose en modo obligatorio. Policy from
config file: targeted cuando se está utilizando una política dirigida.
2. Como usuario root, ejecute el comando touch /var/www/html/test2file para crear un
archivo.
3. Ejecute ls -Z /var/www/html/archivo2prueba para ver el contexto SELinux:
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/
archivo2prueba
test2file está etiquetado con usuario SELinux unconfined_u porque un usuario Linux que
está mapeado en el usuario SELinux unconfined_u ha creado el archivo. RBAC se utiliza para
los procesos, no para los archivos. Las funciones no tienen sentido en los archivos - la función
object_r es una función general utilizada para los archivos (sobre sistemas de archivos de
almacenamiento persistente y de red). Dentro del directorio /proc/, los archivos relacionados
8
Procesos no confinados
2
con procesos pueden utilizar la función system_r role. El tipo httpd_sys_content_t permite
que el proceso httpd pueda acceder a este archivo.
4. El comando chcon re etiqueta archivos; sin embargo, tales modificaciones en el etiquetado
no sobreviven cuando el sistema de archivos es re etiquetado nuevamente. Para que las
modificaciones sean permanentes de modo que sobrevivan a nuevos re etiquetados del sistema
de archivos, utilice el comando semanage el cual es detallado más adelante. Como usuario root,
ejecute el siguiente comando para modificar el tipo a un tipo utilizado por Samba:
chcon -t samba_share_t /var/www/html/test2file
Ejecute el comando ls -Z /var/www/html/archivo2prueba para ver los cambios:
-rw-r--r--
root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/test2file
5. Ejecute el comando service httpd status para verificar que el proceso httpd no esté en
ejecución:
$ /sbin/service httpd status
httpd is stopped
SI el resultado es diferente, ejecute el comando service httpd stop como usuario root para
detener el proceso httpd:
# /sbin/service httpd stop
Stopping httpd:
[
OK
]
6. Para hacer que el proceso httpd sea ejecutado de manera no confinada, ejecute el siguiente
comando como usuario root para modificar el tipo de /usr/sbin/httpd, a un tipo que no se
traslade a un dominio confinado:
chcon -t unconfined_exec_t /usr/sbin/httpd
7. Ejecute el comando ls -Z /usr/sbin/httpd para confirmar que /usr/sbin/httpd se
encuentre etiquetado con el tipo unconfined_exec_t:
-rwxr-xr-x
root root system_u:object_r:unconfined_exec_t /usr/sbin/httpd
8. Como usuario root, ejecute el comando service httpd start para iniciar el proceso httpd.
Si httpd se inicia correctamente, el resultado debería ser el siguiente:
# /sbin/service httpd start
Starting httpd:
[
OK
]
9. Ejecute el comando ps -eZ | grep httpd para conocer los procesos httpd que están
ejecutándose en el dominio unconfined_t domain:
$ ps -eZ | grep httpd
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
7721
7723
7724
7725
7726
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
httpd
httpd
httpd
httpd
httpd
9
Capítulo 3. Política dirigida
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
unconfined_u:system_r:unconfined_t
7727
7728
7729
7730
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
httpd
httpd
httpd
httpd
10. Trasládese a un directorio sobre el que su usuario Linux tenga permisos de escritura, y ejecute
el comando wget http://localhost/test2file. A no ser que existen modificaciones a la
configuración predeterminada, este comando funciona:
--2008-09-07 01:41:10-- http://localhost/test2file
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/plain]
Saving to: `test2file.1'
[ <=>
]--.-K/s
in 0s
2008-09-07 01:41:10 (0.00 B/s) - `test2file.1' saved [0/0]
Si bien es cierto que los procesos httpd no tienen acceso sobre archivos etiquetados con el
tipo samba_share_t, httpd es ejecutado en el dominio no confinado unconfined_t, y no
puede utilizar reglas DAC, y por lo tanto, el comando wget funciona. Si httpd hubiera estado
ejecutándose en el dominio confinado httpd_t, el comando wget habría fallado.
11. El comando restorecon restaura el contexto SELinux predeterminado para los archivos. Como
el usuario root, ejecute el comando restorecon -v /usr/sbin/httpd para restaurar el
contexto predeterminado de SELinux para /usr/sbin/httpd:
# /sbin/restorecon -v /usr/sbin/httpd
restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_notrans_exec_t:s0>system_u:object_r:httpd_exec_t:s0
Ejecute el comando ls -Z /usr/sbin/httpd para verificar que /usr/sbin/httpd se
encuentre etiquetado con el tipo httpd_exec_t:
$ ls -Z /usr/sbin/httpd
-rwxr-xr-x root root system_u:object_r:httpd_exec_t
/usr/sbin/httpd
12. Como usuario root, ejecute el comando /sbin/service httpd restart para reiniciar httpd.
Una vez reiniciado, ejecute el comando ps -eZ | grep httpd para verificar que httpd esté
siendo ejecutado en el dominio confinado httpd_t:
# /sbin/service httpd restart
Stopping httpd:
Starting httpd:
# ps -eZ | grep httpd
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
unconfined_u:system_r:httpd_t
10
[
[
8880
8882
8883
8884
8885
8886
8887
8888
8889
?
?
?
?
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
httpd
httpd
httpd
httpd
httpd
httpd
httpd
httpd
httpd
OK
OK
]
]
Procesos no confinados
13. Como usuario root, ejecute el comando rm -i /var/www/html/test2file para eliminar el
archivo test2file.
14. Si no necesita que httpd esté ejecutándose, como usuario root ejecute el comando service
httpd stop para detener httpd:
# /sbin/service httpd stop
Stopping httpd:
[
OK
]
Los ejemplos en estas secciones mostraron de qué manera pueden protegerse los datos de un
proceso confinado que ha sido comprometido (protegido por SELinux), así como de qué manera los
datos son más accesibles a un atacante desde un proceso no confinado comprometido (que no se
encuentre protegido por SELinux).
11
12
El servidor HTTP Apache
1
De la página Apache HTTP Server Project :
"El Proyecto servidor HTTP Apache es un esfuerzo por desarrollar y mantener un servidor HTTP de
código abierto para sistemas operativos modernos, incluyendo UNIX y Windows NT. El objetivo de
este proyecto es el de ofrecer un servidor seguro, eficiente y extendible que ofrezca servicios HTTP
2
sincronizados con los stándares HTTP actuales".
En Fedora, el paquete httpd ofrece el Servidor HTTp Apache. Ejecute rpm -q httpd para saber si
httpd ya se encuentra instalado. Si no lo está, y desea utilizarlo, ejecute como usuario root el siguiente
comando para instalarlo:
yum install httpd
4.1. El servidor HTTP Apache y SELinux
Cuando SELinux se encuentra habilitado, el servidor HTTP Apache (httpd) se ejecuta de manera
confinada por defecto. Los procesos confinados son ejecutados en sus propios dominios, y estos
son diferentes de otros procesos confinados. Si un proceso confinado se ve comprometido por un
atacante, de acuerdo al tipo de política configurada en SELinux, el acceso del atacante al resto de
los recursos es limitado, y por ende, el daño será menor. El ejemplo que ofrecemos a continuación
muestra los procesos httpd ejecutándose en su propio dominio. El ejemplo presupone que el
paquete httpd se encuentra instalado:
1. Ejecute el comando getenforce para confirmar que SELinux esté ejecutándose en modo
obligatorio:
$ getenforce
Enforcing
El comando getenforce devuelve el resultado Enforcing cuando SELinux se esté ejecutando
en modo obligatorio.
2. Ejecute el comando service httpd start como usuario root para iniciar httpd:
# service httpd start
Starting httpd:
[
OK
]
3. Ejecute el comando ps -eZ | grep httpd para observar los procesos httpd:
$ ps -eZ | grep httpd
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
2850
2852
2853
2854
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
httpd
httpd
httpd
httpd
1
http://httpd.apache.org/
De la sección "El servidor HTTP número uno en Internet (en inglés)" de la página del Proyecto servidor HTTP Apache (en
inglés): http://httpd.apache.org/. Copyright © 2010 The Apache Software Foundation. Accessed 1 March 2010.
13
Capítulo 4. El servidor HTTP Apache
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0
2855
2856
2857
2858
2859
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
httpd
httpd
httpd
httpd
httpd
El contexto SELinux asociado con los procesos httpd es
unconfined_u:system_r:httpd_t:s0. La segunda última parte del contexto, httpd_t, es
el tipo. Un tipo define un dominio para los procesos, y un tipo para los archivos. En este caso, los
procesos httpd están siendo ejecutados en el dominio httpd_t:
La política de SELinux define cómo los procesos ejecutados en dominios confinados (como lo es
httpd_t), interactúan con archivos, otros procesos, y con el sistema en general. Los archivos deben
estar etiquetados correctamente para permitir el acceso de httpd a ellos. Por ejemplo, httpd, puede
leer archivos etiquetados con el tipo httpd_sys_content_t, pero no puede escribir en ellos, ni aún
cuando lo permitan los permisos Linux. Los booleanos deben definirse con valor "on" para permitir
determinados comportamientos: ciertos scripts que permiten el acceso a la red, habilitando a httpd
para que pueda acceder a sistemas de archivos NFS y CIF5; o que a httpd se le permita ejecutar
scripts CGI (Common Gateway Interface).
Cuando /etc/httpd/conf/httpd.conf se encuentre configurado de modo tal que httpd
escuche sobre puerto diferente a los puertos TCP predeterminados (80, 443, 488, 8008, 8009,
o 8443), debe utilizarse el comando semanage port para agregar el nuevo número de puerto
a la configuración de políticas de SELinux. El ejemplo que ofrecemos a continuación demuestra
como configurar httpd para que escuchar sobre un puerto que no se encuentre definido en las
políticas de SELinux para httpd, y cuya consecuencia es que httpd no pueda iniciarse. Además,
nuestro ejemplo muestra como configurar luego el sistema SElinux para permitir que httpd escuche
exitosamente un puerto no estándar que no se encuentre todavía definido en la política. Estos
ejemplos presuponen que el paquete httpd se encuentra instalado. Ejecute cada comando como
usuario root:
1. Ejecute el comando service httpd status para confirmar que httpd no esté ejecutándose:
# service httpd status
httpd is stopped
Si la salida es diferente, ejecute el comando service httpd stop para detener el proceso:
# service httpd stop
Stopping httpd:
[
OK
]
2. Ejecute el comando semanage port -l | grep -w http_port_t para conocer los puertos
que SELinux le permite escuchar a httpd:
# semanage port -l | grep -w http_port_t
http_port_t
tcp
80, 443, 488, 8008, 8009, 8443
3. Edite el archivo /etc/httpd/conf/httpd.conf como usuario root. Configure la opción
Listen de modo que liste los puertos que no están configurados en el archivo de configuración
de políticas SELinux para httpd. En nuestro ejemplo, httpd se encuentra configurado para
escuchar el puerto 12345:
14
El servidor HTTP Apache y SELinux
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 127.0.0.1:12345
4. Ejecute el comando service httpd start para iniciar httpd:
# service httpd start
Starting httpd: (13)Permission denied: make_sock: could not bind to address
127.0.0.1:12345
no listening sockets available, shutting down
Unable to open logs
[FAILED]
Una negación de SELinux similar a la siguiente se encuentra registrada en el archivo /var/log/
messages:
setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For
complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
5. PAra que SELinux permita a httpd escuchar en el puerto 12345, tal como en nuestro ejemplo, el
necesario ejecutar el siguiente comando:
# semanage port -a -t http_port_t -p tcp 12345
6. Ejecute nuevamente el comando service httpd start para iniciar httpd, y hacer que
escuche sobre el nuevo puerto:
# service httpd start
Starting httpd:
[
OK
]
7. Ahora que SELinux ha sido configurado para permitir que httpd escuche en un puerto no
estándar (TCP 12345 en nuestro ejemplo), httpd se inicia exitosamente en dicho puerto.
8. Para verificar que httpd esté escuchando y comunicándose con el puerto TCP 12345, inicie una
conexión telnet en el puerto específico y envié un comando HTTP GET de la siguiente manera:
# telnet localhost 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.1 200 OK
Date: Tue, 31 Mar 2009 13:12:10 GMT
Server: Apache/2.2.11 (Fedora)
Accept-Ranges: bytes
Content-Length: 3918
Content-Type: text/html; charset=UTF-8
15
Capítulo 4. El servidor HTTP Apache
[...continues...]
4.2. Tipos
El tipo de ejecución es el control principal de permisos utilizado en una política de SELinux dirigida.
Todos los archivos y procesos son etiquetados con un tipo determinado: los tipos definen un dominio
para los procesos, y un tipo para los archivos. Las reglas de la política de SELinux definen de qué
manera los tipos son accedidos unos sobre otros, ya sea un dominio accediendo a un tipo, o un
dominio accediendo a otro dominio. Los accesos sólo son permitidos si existe una regla específica de
política de SELinux que así lo establezca.
Los ejemplos que mostramos a continuación generan un nuevo archivo en el directorio /var/www/
html/, y muestra el archivo heredando el tipo httpd_sys_content_t de su directorio paterno (/
var/www/html/):
1. Ejecute el comando ls -dZ /var/www/html para observar los contenidos SELinux del archivo
/var/www/html/:
$ ls -dZ /var/www/html
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
Esto muestra que /var/www/html/ está etiquetado con el tipo httpd_sys_content_t.
2. Ejecute el comando touch /var/www/html/file1 como usuario root para crear un nuevo
archivo.
3. Ejecute el comando ls -Z /var/www/html/file1 para ver el contexto SELinux:
$ ls -Z /var/www/html/file1
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
El comando ls -Z muestra al archivo file1 etiquetado con el tipo httpd_sys_content_t.
SELinux permite que httpd pueda leer archivos etiquetados con este tipo, pero no escribir sobre
ellos, ni siquiera cuando los permisos Linux así lo permitan. La política SELinux define los tipos de
los procesos en ejecución dentro del dominio httpd_t (donde es ejecutado httpd). Esto ayuda a
prevenir que los procesos accedan a archivos que habían sido destinados a ser utilizados por otros
procesos diferentes.
Por ejemplo, httpd puede acceder archivos etiquetados con el tipo httpd_sys_content_t
(destinado para el servidor HTTP Apache), pero por defecto, no puede acceder a archivos
etiquetaodos con el tipo samba_share_t (destinado a Samba). Además, los archivos en los
directoriorios personales de los usuarios son etiquetados con el tipo user_home_t: por defecto, esto
evita que httpd leer o escribir archivos de los directorios personales de los usuarios.
Los siguientes tipos son utilizados con httpd. Diferentes tipos le permiten configurar un acceso más
flexible:
httpd_sys_content_t
Utilice este tipo para contenido web estático, como ser por ejemplo, archivos .html utilizados por
un sitio web estático. Los archivos etiquetados con este tipo son accesibles (sólo para lectura) por
httpd y por scripts ejecutados por httpd. Por defecto, los archivos y los directorios etiquetados
16
Tipos
con este tipo no pueden ser escritos ni modificados por httpd, ni por ningún otro proceso. Nota:
de forma predeterminada, los archivos creados o copiados en la carpeta /var/www/html/ son
etiquetados con el tipo httpd_sys_content_t.
httpd_sys_script_exec_t
Utilice este tipo para programas que quiera que sean ejecutados por httpd. Este tipo es
comúnmente utilizado por scripts CGI (Common Gateway Interface) en /var/www/cgi-bin/.
Por defecto, la política de SELinux evita que httpd ejecute estos scripts. Para permitirlo, etiquete
los scripts con el tipo httpd_sys_script_exec_t y defina el booleano httpd_enable_cgi
con el valor "on". Los scripts etiquetados con httpd_sys_script_exec_t se ejecutan
en el dominio httpd_sys_script_t cuando son ejecutados con httpd. El dominio
httpd_sys_script_t posee acceso a otros dominios del sistema, como ser por ejemplo,
postgresql_t y mysqld_t.
httpd_sys_content_rw_t
Los archivos etiquetados con este tipo pueden ser escritos con scripts etiquetados con el tipo
httpd_sys_script_exec_t, pero no pueden ser modificados por scripts etiquetados con
cualquier otro tipo. Debe utilizar el tipo httpd_sys_content_rw_t para etiquetar archivos que
serán leidos y escritos por scripts etiquetados con el tipo httpd_sys_script_exec_t.
httpd_sys_content_ra_t
Los archivos etiquetados con este tipo pueden ser agregarse otros mediante la utilización
de scripts etiquetados con el tipo httpd_sys_script_exec_t, pero no pueden
ser modificados por scripts etiquetados con cualquier otro tipo. Debe utilizarse el tipo
httpd_sys_content_ra_t para etiquetar archivos que podrán ser leídos y agregados por
scripts etiquetados con el tipo httpd_sys_script_exec_t.
httpd_unconfined_script_exec_t
Los scripts etiquetados con este tipo se ejecutan sin la protección de SELinux. Utilice solo este
tipo para scripts complejos, y luego de haber agotado todas las demás opciones. Es mejor utilizar
este tipo en lugar de deshabilitar la protección de SELinux para httpd, o para la totalidad del
sistema.
Cómo modificar el contexto SELinux
El tipo para los archivos y los directorios puede ser modificado con el comando chcon. Las
modificaciones realizadas con chcon no sobreviven a un re-etiquetado del sistema de archivos, o a
un comando restorecon. La política de SELinux controla si los usuarios se encuentran habilitados
o no para modificar el contexto de SELinux aplicado a cualquier archivo dado. El ejemplo que
ofrecemos a continuación muestra la creación de un nuevo directorio y de un archivo index.html
para ser utilizado por httpd, y como son etiquetados ambos (archivo y directorio) para que httpd
pueda acceder a ellos.
1. Ejecute el comando mkdir -p /my/website como usuario root para crear una estructura de
directorio de nivel superior, para poder almacenar archivos que sean utilizados por httpd.
2. Los archivos y los directorios que no coincidan con un modelo de archivo-configuración de
contexto, podrían ser etiquetados con el tipo default_t. Este tipo es inaccesible a los servicios
confinados:
$ ls -dZ /my
drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
17
Capítulo 4. El servidor HTTP Apache
3. Ejecute el comando chcon -R -t httpd_sys_content_t /my/ como usuario root para
modificar el tipo del directorio /my/ (y sus subdirectorios), a un tipo capaz de ser accedido
por httpd. Ahora, los archivos creados bajo el archivo /my/website/ heredan el tipo
httpd_sys_content_t, en lugar del tipo default_t, y por lo tanto, son accesibles para htttpd:
# chcon -R -t httpd_sys_content_t /my/
# touch /my/website/index.html
# ls -Z /my/website/index.html
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
Utilice el comando semanage fcontext para realizar modificaciones en la etiqueta que
"sobrevivan" a un re-etiquetado, y al comando restorecon. Estos comandos agregan
modificaciones a la configuración archivo-contexto. Entonces, ejecute el comando restorecon
que lee la configuración archivo-contexto, para poder aplicar la modificación del etiquetado. En el
ejemplo que ofrecemos a continuación mostramos la creación de un nuevo directorio y de un archivo
index.html para ser utilizado por httpd, modificando persistentemente la etiqueta tanto del
directorio como del archivo para permitir que httpd pueda acceder a ellos.
1. Ejecute el comando mkdir -p /my/website como usuario root para crear una estructura de
directorio de nivel superior, para poder almacenar archivos que sean utilizados por httpd.
2. Ejecute el siguiente comando como usuario root para agregar la modificación del etiquetado a la
configuración archivo-contexto:
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
La expresión "/my(/.*)?" significa que la modificación del etiquetado se aplica al directorio /
my/ y a todos los archivos y directorios presentes en él.
3. Ejecute el comando touch /my/website/index.html como el usuario root para crear un
nuevo archivo.
4. Ejecute el comando restorecon -R -v /my/ como usuario root para aplicar las
modificaciones del etiquetado (restorecon lee la configuración archivo-contexto que fue
modificada por el comando semanage en el paso 2):
# restorecon -R -v /my/
restorecon reset /my context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
restorecon reset /my/website context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
4.3. Booleanos
SELinux está basado en el menor de los niveles de acceso necesarios para que un servicio funcione.
Los servicios pueden ser ejecutados en una variedad de formas; por lo tanto debe decirle a SELinux
de qué manera usted está ejecutando servicios. Esto puede ser logrado mediante los Booleanos que
permiten que determinadas partes de SELinux puedan ser modificadas en el tiempo de ejecución, sin
ningún tipo de conocimiento relacionado con la escritura de políticas SELinux. Esto permite cambios
18
Booleanos
como permitir el acceso de los servicios a sistemas de archivos NFS, sin por ello tener que recargar o
recompilar políticas de SELinux.
Para modificar el estado de un Booleano, utilice el comando setsebool. Por ejemplo, para encender
el Booleano allow_httpd_anon_write, ejecute el siguiente comando como usuario root:
# setsebool -P allow_httpd_anon_write on
Para apagar un Booleano, utilizando el mismo ejemplo, simplemente modifique el valor on por el de
off, como mostramos a continuación:
# setsebool -P allow_httpd_anon_write off
Nota
No utilice la opción -P si no desea que las modificaciones de setsebool continúen
aún luego de reiniciar el sistema.
A continuación ofrecemos una descripción de Booleanos disponibles y muy utilizados, que influyen en
la forma en que httpd se ejecuta:
allow_httpd_anon_write
Cuando está deshabilitado, este Booleano permite que httpd solo tenga acceso de lectura sobre
archivos etiquetados con el tipo public_content_rw_t. Habilitar este Booleano permitirá
que httpd escriba sobre archivos etiquetados con el tipo public_content_rw_t, como ser
por ejemplo, directorios públicos que contengan archivos para un servicio de transferencia de
archivos público.
allow_httpd_mod_auth_ntlm_winbind
Habilitar este Booleano permite acceso a mecanismos de autenticación NTLM y Windbind,
mediante el módulo mod_auth_ntlm_winbind de httpd.
allow_httpd_mod_auth_pam
Habilitar este Booleano permite acceso a mecanismos de autenticación PAM, mediante el módulo
mod_auth_pam de httpd.
allow_httpd_sys_script_anon_write
Este Booleano define si los scripts HTTP tienen o no permitido acceso de escritura sobre
archivos etiquetados con el tipo public_content_rw_t, como los utilizados en un servicio de
transferencia de archivos público.
httpd_builtin_scripting
Este Booleano define el acceso a la creación de scripts httpd. A menudo es necesario tener este
Booleano habilitado para contenidos PHP.
httpd_can_network_connect
Estando deshabilitado, este Booleano evita que los scripts y módulos HTTP puedan iniciar una
conexión a una red o a un puerto remoto. Encienda este Booleano para permitir este tipo de
acceso.
19
Capítulo 4. El servidor HTTP Apache
httpd_can_network_connect_db
Cuando está deshabilitado, este Booleano evita que tanto scripts como módulos puedan iniciar
una conexión con bases de datos de servidores. Enciéndalo para permitir este tipo de acceso.
httpd_can_network_relay
Encienda este Booleano cuando httpd esté siendo utilizado como un proxy de reenvío o de
reverso.
httpd_can_sendmail
Cuando se encuentra deshabilitado, este Booleano evita que los módulos HTTP sean capaces
de enviar correos. Esto puede prevenir que ataques spam ofrezcan una debilidad en httpd.
Enccienda este Booleano para permitir que los módulos HTTP puedan enviar correos.
httpd_dbus_avahi
Cuando se encuentra deshabilitado, este Booleano niega el acceso de httpd al servicio avahi
mediante D-Bus. Encienda este Booleano para permitir este acceso.
httpd_enable_cgi
Cuando se encuentre deshabilitado, este Booleano evita que httpd pueda ejecutar scripts
CGI. Enciéndalo para permitir que httpd los ejecute (recuerde que los scripts CGI deben estar
etiquetados con el tipo httpd_sys_script_exec_t).
httpd_enable_ftp_server
Encender este Booleano permitirá que httpd pueda escuchar en el puerto FTP y comportarse
como un servidor FTP.
httpd_enable_homedirs
Cuando se encuentre deshabilitado, este Booleano evita que httpd pueda acceder a los
directorios personales del usuario. Enciéndalo para permitir que httpd pueda acceder a esos
directorios. Por ejemplo, al contenido de /home/*/.
httpd_execmem
Cuando se encuentre habilitado, este Booleano permite que httpd pueda ejecutar programas
que necesitan direcciones de memoria que son tanto ejecutables como de escritura. Tomando en
cuenta un criterio relacionado con la seguridad, no se recomienda habilitar a este Booleano ya
que reduce la protección contra desbordamientos del búfer. Sin embargo, determinados módulos
y aplicaciones (como aquellas relacionadas con Java y Mono), necesitan estos privilegios.
httpd_ssi_exec
Este Booleano define cuándo ejecutar elementos SSI (Server Side Include) en una página web, y
cuando no hacerlo.
httpd_tmp_exec
Habilitar este Booleano permite que httpd ejecute archivos de directorios temporales.
httpd_tty_comm
Este Booleano define si httpd tiene o no permitido acceder a la terminal de control. Por lo
general este acceso no es necesario, pero sin embargo, en algunos casos como ser por ejemplo
el de la configuración de un certificado SSL, el acceso a la terminal es requerido para presentar y
procesar peticiones de contraseñas.
20
Ejemplos de configuración
httpd_unified
Cuando se encuentre habilitado, este Booleano le otorga a httpd_t un acceso total a todos
los tipos de httpd (es decir, para ejecutar, leer o escribir sys_content_t). Cuando se encuentre
deshabilitado, hay una separación en curso entre contenidos web de solo lectura, ejecutable, o
de escritura. Deshabilitar este Booleano asegura un nivel adicional de seguridad, pero agrega
la tarea administrativo de tener que etiquetar individualmente scripts y demás contenidos web
basados en el tipo de acceso a los archivos que cada uno debería tener.
httpd_use_cifs
Encienda este Booleano para permitir que httpd pueda acceder a los archivos de sistemas
de archivos CIFS que hayan sido etiquetados con el tipo cifs_t, como ser por ejemplo, los
sistemas de archivos montados mediante Samba.
httpd_use_gpg
Habilitar este Booleano permite que httpd utilice cifrados GPG.
httpd_use_nfs
Encienda este Booleano para permitir que httpd pueda acceder a sistemas de archivos NFS
que hayan sido etiquetados con el tipo nfs_t, como ser por ejemplo los sistemas de archivos
montados a través de NFS.
4.4. Ejemplos de configuración
Los siguientes ejemplos ofrecen una demostración con casos reales de cómo SELinux complementa
el servidor HTTP Apache, y cómo puede ser mantenida una función completa de este servidor.
4.4.1. Cómo ejecutar un sitio estático
Para crear un sitio web estático, etiquete los archivos .html de tal sitio con el tipo
httpd_sys_content_t. Por defecto, el servidor HTTP Apache no puede escribir sobre archivos
que hayan sido etiquetados con el tipo httpd_sys_content_t. El ejemplo que ofrecemos a
continuación crea un nuevo directorio para almacenar los archivos de un sitio web de solo lectura:
1. Ejecute el comando mkdir /mywebsite como usuario root para crerar un directorio de nivel
superior.
2. Como usuario root, cree un archivo denominado /mywebsite/index.html. Copie y pegue el
siguiente contenido en /mywebsite/index.html:
<html>
<h2>index.html from /mywebsite/</h2>
</html>
3. Para permitir que el servidor HTTP Apache tenga acceso de solo lectura tanto sobre /
mywebsite/ como sobre los subdirectorios y archivos que se encuentren en él, etiquete a /
mywebsite/ con el tipo httpd_sys_content_t. Ejecute el siguiente comando como el usuario
root para agregar la modificación del etiquetado en la configuración archivo-contexto.
# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
21
Capítulo 4. El servidor HTTP Apache
4. Ejecute el comando restorecon -R -v /mywebsite como usuario root para realizar las
modificaciones del etiquetado:
# restorecon -R -v /mywebsite
restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:httpd_sys_content_t:s0
5. En este ejemplo, edite el archivo /etc/httpd/conf/httpd.conf como usuario root. Comente
la opción DocumentRoot. Agregue una opción DocumentRoot "/mywebsite". Luego de
editarlo, estas opciones deberían quedar de esta manera:
#DocumentRoot "/var/www/html"
DocumentRoot "/mywebsite"
6. Ejecute el comando service httpd status como usuario root para conocer el estado del
servidor HTTP Apache. Si este servidor se encuentra detenido, ejecute el comando service
httpd start como usuario root para poder reiniciar el servicio (esto también hace que entre en
vigencia cualquier modificación realizada en el archivo httpd.conf).
7. Utilice un navegador web para navegar hacia http://localhost/index.html. Se observará
lo siguiente:
index.html from /mywebsite/
4.4.2. Cómo compartir sistemas de archivos NFS y CIFS
Por defecto, NFS los montajes NFS en el cliente se encuentran etiquetados con un contexto
predeterminado definido por las políticas para sistemas de archivos NFS. En políticas comunes, este
contexto predeterminado utiliza el tipo nfs_t. También, de manera predeterminada, los montajes
Samba compartidos en el cliente se encuentran etiquetados con un contexto predeterminado definido
por la política. En políticas comunes, este contexto predeterminado utiliza el tipo cifs_t.
De acuerdo a la configuración de la política, los servicios podrían no ser capaces de leer archivos
etiquetados con los tipos nfs_t o cifs_t. Esto puede prevenir que sean montados los sistemas
de archivos etiquetados con estos tipos, y por ende ser leídos o exportados por otros servicios. Los
Booleanos pueden ser encendidos o apagados para controlar qué servicios tienen permitido el acceso
a los tipos nfs_t y cifs_t.
Encienda el Booleano httpd_use_nfs para permitir que httpd tenga acceso a (y a la vez que
pueda compartir) sistemas de archivos NFS etiquetados con el tipo nfs_t. Ejecute el comando
setsebool como usuario root para encender el Booleano:
setsebool -P httpd_use_nfs on
Encienda el Booleano httpd_use_cifs para permitir que httpd tenga acceso a (y pueda
compratir) sistemas de archivos CIFS etiquetados con el tipo cifs_t. Ejecute el comando
setsebool como usuario root para encender este Booleano:
22
Cómo compartir archivos entre los servicios
setsebool -P httpd_use_cifs on
Nota
No utilice la opción -P si no desea que las modificaciones de setsebool continúen
aún luego de reiniciar el sistema.
4.4.3. Cómo compartir archivos entre los servicios
El tipo Obligatorio ayuda a evitar que los procesos accedan a archivos destinados a ser utilizados por
otros procesos diferentes. Por ejemplo, por defecto, Samba no puede leer archivos etiquetados con
el tipo httpd_sys_content_t, que están destinados a ser utilizados por el servidor HTTP Apache.
Los archivos pueden ser compartidos entre el servidor HTTP Apache, FTP, rsync y Samba, si los
archivos en cuestión son etiquetados con los tipos public_content_t o public_content_rw_t.
El ejemplo que ofrecemos a continuación genera un directorio y sus archivos, y permite que ese
directorio y esos archivos puedan ser compartidos (en modo de sólo lectura) por el servidor HTTP
Apache, FTP, rsync y Samba:
1. Ejecute el comando mkdir /shares como el usuario root para crear un nuevo directorio de nivel
superior para compartir archivos entre diferentes servicios.
2. Los archivos y los directorios que no coincidan con un modelo de archivo-configuración de
contexto, podrían ser etiquetados con el tipo default_t. Este tipo es inaccesible a los servicios
confinados:
$ ls -dZ /shares
drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /shares
3. Como usuario root, cree un archivo /shares/index.html. Copie y pegue el contenido que
ofrecemos a continuación en el archivo /shares/index.html:
<html>
<body>
<p>Hello</p>
</body>
</html>
4. Etiquetar el archivo /shares/ con el tipo public_content_t permite acceso de solo lectura
al servidor HTTP Apache, FTP, rsync y Samba. ejecute el comando siguiente como usuario root
para agregar la modificación del etiquetado en la configuración archivo-contexto:
semanage fcontext -a -t public_content_t "/shares(/.*)?"
5. Ejecute el comando restorecon -R -v /shares/ como usuario root para aplicar las
modificaciones en el etiquetado:
23
Capítulo 4. El servidor HTTP Apache
# restorecon -R -v /shares/
restorecon reset /shares context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0
restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0
Para compartir /shares/ mediante Samba:
1. Ejecute el comando rpm -q samba samba-common samba-client para verificar que los
paquetes samba, samba-common, y samba-client se encuentren instalados (los números de
versiones podrían diferir):
$ rpm -q samba samba-common samba-client
samba-3.5.2-59.fc13.i386
samba-common-3.5.2-59.fc13.i386
samba-client-3.5.2-59.fc13.i386
Si alguno de estos paquetes no se encuentran instalados, instálelos ejecutando el comando yum
install niombre-del- paquete como usuario root.
2. Edite el archivo /etc/samba/smb.conf como usuario root. Agregue la siguiente entrada al final
de este archivo para compartir el directorio /shares/ a través de Samba:
[shares]
comment = Documents for Apache HTTP Server, FTP, rsync, and Samba
path = /shares
public = yes
writeable = no
3. Es necesario poseer una cuenta Samba para poder montar un sistema de archivos Samba.
Ejecute el comando smbpasswd -a nombre-de-usuario como usuario root para crear una
cuenta Samba, donde nombre-de-usuario es un usuario Linux existente del sistema. Por
ejemplo, smbpasswd -a testuser genera una cuenta Samba para el usuario Linux testuser:
# smbpasswd -a testuser
New SMB password: Enter a password
Retype new SMB password: Enter the same password again
Added user testuser.
Ejecutar el comando smbpasswd -a nombre-de-usuario, donde nombre-de-usuario
sea el nombre de usuario de una cuenta Linux que no exista en el sistema, provocará un error
Cannot locate Unix account for 'username'!.
4. Ejecute el comando service smb start como usuario root para iniciar el servicio Samba:
service smb start
Starting SMB services:
[
OK
]
5. Ejecute el comando smbclient -U nombre-de-usuario -L localhost para conocer la
lista de los elementos compartidos disponibles, donde nombre-de-usuario es la cuenta Samba
24
Cómo compartir archivos entre los servicios
agregada en el paso 3. Cuando le sea pedida una contraseña, ingrese la que ha indicado para la
cuenta Samba del paso 3 (los números de las versiones podrían diferir):
$ smbclient -U username -L localhost
Enter username's password:
Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]
Sharename
Type
Comment
-----------------shares
Disk
Documents for Apache HTTP Server, FTP, rsync, and Samba
IPC$
IPC
IPC Service (Samba Server Version 3.5.2-59)
username
Disk
Home Directories
Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]
Server
---------
Comment
-------
Workgroup
---------
Master
-------
6. Ejecute el comando mkdir /test/ como usuario root para crear un nuevo directorio. Este
directorio será utilizado para montar los elementos compartidos shares de Samba.
7. Ejecute el siguiente comando como usuario root para montar los elementos compartidos shares
de Samba sobre /test/, reemplazando username con el nombre de usuario del paso 3:
mount //localhost/shares /test/ -o user=username
Ingrese la contraseña de username, que fue configurada en el paso 3.
8. Ejecute el comando cat /test/index.html para observar un archivo que esté siendo
compartido a través de Samba:
$ cat /test/index.html
<html>
<body>
<p>Hello</p>
</body>
</html>
Para compartir /shares/ mediante el servidor HTTP Apache:
1. Ejecute el comando rpm -q httpd para verificar que el paquete httpd se encuentre instalado (el
número de las versiones podría diferir):
$ rpm -q httpd
httpd-2.2.11-6.i386
Si este paquete no se encuentra instalado, ejecute el comando yum install httpd como
usuario root para instalarlo.
2. Trasládese al directorio /var/www/html/. Ejecute el siguiente comando como usuario root para
crear un enlace (denominado shares) hacia el directorio /shares/:
25
Capítulo 4. El servidor HTTP Apache
ln -s /shares/ shares
3. Ejecute el comando service httpd start como usuario root para iniciar el Servidor HTTP
Apache:
service httpd start
Starting httpd:
[
OK
]
4. Utilice un navegador web para navegar hasta http://localhost/shares. Observará el
archivo /shares/index.html.
Por defecto, el servidor HTTP Apacghe lee un archivo index.html, si es que existe. Si /shares/
no posee un archivo index.html, pero en su lugar tiene archivos file1, file2, y file3,
observaría el listado de un directorio cuando acceda a http://localhost/shares:
1. Ejecute el comando rm -i /shares/index.html como usuario root para eliminar el archivo
index.html.
2. Ejecute el comando touch /shares/file{1,2,3} como usuario root para crear tres archivos
en /shares/:
# touch /shares/file{1,2,3}
# ls -Z /shares/
-rw-r--r-- root root system_u:object_r:public_content_t:s0 file1
-rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file2
-rw-r--r-- root root unconfined_u:object_r:public_content_t:s0 file3
3. Ejecute el comando service httpd status como usuario root para conocer el estado del
servidor HTTP Apache. Si el servidor se encuentra detenido, ejecute el comando service
httpd start.
4. Utilice un navegador web para navegar hasta http://localhost/shares. Se presenta el
listado de un directorio:
26
Cómo modificar los números de puertos
4.4.4. Cómo modificar los números de puertos
De acuerdo a la configuración de la política, los servicios podrían estar autorizados a ejecutarse
exclusivamente sobre ciertos puertos. Intentar modificar el puerto sobre el que un servicio se está
ejecutando, sin para ello modificar la política, podría provocar que el servicio no se inicie. Ejecute el
comando semanage port -l | grep -w "http_port_t" como usuario root para conocer los
puertos sobre los que SELinux permite escuchar a httpd:
# semanage port -l | grep -w http_port_t
http_port_t
tcp
80, 443, 488, 8008, 8009, 8443
Por defecto, SELinux permite que http escuche sobre los puertos TCP 80, 443, 488, 8008, 8009, o
8443. Si /etc/httpd/conf/httpd.conf está configurado para que httpd pueda escuchar sobre
cualquier otro puerto no listado en http_port_t, entonces httpd no podrá iniciarse.
Para configurar a httpd para que pueda ejecutarse en algún puerto diferente de los puertos TCP 80,
443, 488, 8008, 8009, o 8443:
1. Edite el archivo /etc/httpd/conf/httpd.conf como usuario root de modo que la opción
Listen ofrezca un puerto que no ha sido configurado en la política de SELinux para httpd. En
el ejemplo que ofrecemos a continuación configuramos a httpd para que pueda escuchar la
dirección IP 10.0.0.1, y el puerto 12345:
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 10.0.0.1:12345
2. Ejecute el comando semanage port -a -t http_port_t -p tcp 12345 como usuario
root para agregar el puerto a la configuración de políticas de SELinux.
3. Ejecute el comando semanage port -l | grep -w http_port_t como usuario root para
confirmar que el puerto haya sido agregado:
27
Capítulo 4. El servidor HTTP Apache
# semanage port -l | grep -w http_port_t
http_port_t
tcp
12345, 80, 443, 488, 8008, 8009, 8443
Si ya no está ejecutando httpd sobre el puerto 12345, ejecute el comando semanage port -d -t
http_port_t -p tcp 12345 como usuario root para eliminarlo de la configuración de políticas.
28
Samba
1
Desde el sitio web de Samba
2
3
4
"Samba es una suite de Fuente Abierta /Software Libre , que se desde 1992 , provee servicios de
archivos e impresión a todo tipo de clientes SMB/CIFS, incluyendo las numerosas versiones del
sistema operativo Microsoft Windows. Samba está disponible libremente bajo la GNU Licencia Pública
5 6
General .".
En Fedora, el paquete samba provee el servidor Samba. Ejecute rpm -q samba para ver si el
paquete samba está instalado. Si este no está instalado y quiere usar Samba, ejecute el siguiente
comando como usuario root para instalarlo:
yum install samba
5.1. Samba y SELinux
Cuando SELinux esta habilitado, el servidor Samba (smbd) se ejecuta confinado por defecto.
Los servicios confinados se ejecutan en su propio dominio, y estan separados de otros servicios
confinados. El siguiente ejemplo demuestra el proceso smbd ejecutándose en su propio dominio. Este
ejemplo asume que el paquete samba está instalado:
1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:
$ getenforce
Enforcing
El comando getenforce retorna Enforcing cuando SELinux está corriendo en modo
obediente.
2. Ejecute service smbd start como usuario root para iniciar smbd:
service smb start
Iniciando servicios SMB:
[
OK
]
3. Ejecute ps -eZ | grep smb para ver el proceso smbd:
$ ps -eZ | grep smb
unconfined_u:system_r:smbd_t:s0 16420 ?
unconfined_u:system_r:smbd_t:s0 16422 ?
00:00:00 smbd
00:00:00 smbd
1
http://samba.org/
http://www.opensource.org/
3
http://www.gnu.org/philosophy/free-sw.html
4
http://us1.samba.org/samba/docs/10years.html
5
http://us1.samba.org/samba/docs/GPL.html
Primer párrafo del sitio web de Samba: http://samba.org. Accedido el 20 Enero de 2009.
2
29
Capítulo 5. Samba
El contexto SELinux asociado con el proceso smbd es unconfined_u:system_r:smbd_t:s0.
La segunda parte del contexto, smbd_t, es el tipo. El tipo define el dominio para el proceso y
tipos de archivos. En este caso, el proceso smbd está corriendo en el dominio smbd_t.
Los archivos deben ser etiquetados correctamente para permitir a smbd el acceso y compartición
de los mismos. Por ejemplo, smbd puede leer y escribir en archivos etiquetados con el tipo
samba_share_t, pero por defecto, no puede acceder a los archivos etiquetados con el tipo
httpd_sys_content_t, los cuales son destinados a ser usados por el Servidor HTTP Apache.
Los Booleanos deben ser activados para permitir comportamientos específicos, como es permitir
que directorios home y sistemas de archivos NFS puedan ser exportados a través de Samba, como
también permitir a Samba actuar como controlador de dominio.
5.2. Tipos
Etiquete archivos con el tipo samba_share_t para permitir a Samba compartir los mismos.
Solo etiquete archivos que usted ha creado, y no re-etiquete archivos del sistema con el tipo
samba_share_t: Los Booleanos pueden estar activados para compartir ciertos archivos y
directorios. SELinux permite a Samba escribir en archivos etiquetados con el tipo samba_share_t,
siempre que /etc/samba/smb.conf y los permisos Linux estén establecidos adecuadamente.
El tipo samba_etc_t es usado para archivos específicos en /etc/samba/, como smb.conf. No
etiquete archivos manualmente con el tipo samba_etc_t. Si los archivos en /etc/samba/ no están
etiquetados correctamente, ejecute restorecon -R -v /etc/samba como usuario root para
restablecer los archivos a su contexto por defecto. Si /etc/samba/smb.conf no está etiquetado
con el tipo samba_etc_t, el comando service smb start puede fallar y SELinux puede registrar
la denegación. El siguiente es un ejemplo de denegación registrado en /var/log/messages
cuando /etc/samba/smb.conf fue etiquetado con el tipo httpd_sys_content_t:
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf
(httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50e4cd05ab18af
5.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando Samba:
allow_smbd_anon_write
Teniendo este Booleano habilitado permite a smbd escribir en directorios públicos, como ser un
área reservada para archivos comunes que no requieran restricción de acceso especial.
samba_create_home_dirs
Teniendo este Booleano habilitado permite a Samba crear nuevos directorios home de forma
independiente. Esto se suele hacer por mecanismos tales como PAM.
samba_domain_controller
Cuando esta habilitado, este Booleano permite a Samba actuar como un controlador de dominio,
así como darle permisos para ejecutar ciertos comandos como son useradd, groupadd y
passwd.
30
Ejemplos de configuración
samba_enable_home_dirs
Habilitando este Booleano permite a Samba compartir directorios home de usuarios.
samba_export_all_ro
Exportar cualquier archivo o directorio, permitiendo solo lectura. Esto permite que archivos y
directorios que no están etiquetados con el tipo samba_share_t puedan ser compartidos a
través de Samba. Cuando el Booleano samba_export_all_ro esta activado, pero el Booleano
samba_export_all_rw esta desactivado, el acceso de escritura a recursos compartidos
con Samba es denegado, incluso si el acceso a escritura esta configurado en /etc/samba/
smb.conf, como también si los permisos Linux permiten el acceso de escritura.
samba_export_all_rw
Exportar cualquier archivo o directorio, permitiendo lectura y escritura. Esto permite que archivos
y directorios que no están etiquetados con el tipo samba_share_t puedan ser exportados a
través de Samba. Los permisos en /etc/samba/smb.conf y los permisos Linux deben estar
configurados para permitir el acceso a escritura.
samba_run_unconfined
Teniendo este Booleano habilitado permite a Samba ejecutar scripts no confinados en el directorio
/var/lib/samba/scripts.
samba_share_fusefs
Este Booleano debe estar habilitado para que Samba pueda compartir sistemas de archivos
fusefs.
samba_share_nfs
Deshabilitando este Booleano previene que smbd tenga acceso completo a recursos compartidos
con NFS vía Samba. Habilitando este Booleano permitirá a Samba compartir sistemas de
archivos NFS.
use_samba_home_dirs
Habilite este Booleano para usar un servidor remoto para directorios home de Samba.
virt_use_samba
Permite a virt manejar archivos CIFS.
5.4. Ejemplos de configuración
Los siguientes ejemplos proveen demostraciones del mundo real de como SELinux complementa al
servidor Samba y como puede ser mantenidas todas las funciones del servidor Samba.
5.4.1. Compartiendo directorios que usted creó
El siguiente ejemplo crea un nuevo directorio, y comparte ese directorio usando Samba:
1. Ejecute rpm -q samba samba-common samba-client para confirmar que los paquetes
samba, samba-common y samba-client están instalados. Si alguno de estos paquetes no esta
instalado, instale el mismo usando el comando yum install nombre-paquete como usuario
root.
2. Ejecute mkdir /micomparticion como usuario root para crear un directorio de nivel superior
para compartir archivos usando Samba.
31
Capítulo 5. Samba
3. Ejecute touch /micomparticion/archivo1 como usuario root para crear un archivo vacío.
Este archivo es usado después para verificar que recurso compartido por Samba fue montado
correctamente.
4. SELinux permite a Samba leer y escribir los archivos etiquetados con el tipo samba_share_t,
siempre que /etc/samba/smb.conf y los permisos Linux este establecidos adecuadamente.
Ejecute el siguiente comando como usuario root para agregar el cambio de etiqueta en la
configuración de contexto de archivos:
semanage fcontext -a -t samba_share_t "/micomparticion(/.*)?"
5. Ejecute restorecon -R -v /micomparticion como usuario root para aplicar los cambios de
etiqueta:
# restorecon -R -v /micomparticion
restorecon reset /micomparticion context unconfined_u:object_r:default_t:s0>system_u:object_r:samba_share_t:s0
restorecon reset /micomparticion/archivo1 context unconfined_u:object_r:default_t:s0>system_u:object_r:samba_share_t:s0
6. Edite /etc/samba/smb.conf como usuario root. Agregue lo siguiente al final del archivo para
compartir el directorio /micomparticion/ usando Samba:
[micomparticion]
comment = Mi comparticion
path = /micomparticion
public = yes
writeable = no
7. Es requerido una cuenta Samba para montar sistemas de archivos Samba. Ejecute smbpasswd
-a nombreusuario como usuario root para crear una cuenta Samba, donde nombreusuario
es un usuario Linux existente. Por ejemplo, smbpasswd -a usuariotest crear una cuenta
para el usuario Linux usuariotest:
# smbpasswd -a usuariotest
New SMB password: Ingrese la contraseña
Retype new SMB password: Ingrese la misma contraseña de nuevo
Added user usuariotest.
Ejecutando smbpasswd -a nombreusuario, cuando nombreusuario es el nombre de
usuario de una cuenta Linux que no existe en el sistema, causa el error Cannot locate Unix
account for 'nombreusuario'!
8. Ejecute service smb start como usuario root para iniciar el servicio Samba:
service smb start
Iniciando servicios SMB:
32
[
OK
]
Compartiendo un sitio web
9. Ejecute smbclient -U nombreusuario -L localhost para listar los recursos compartidos
disponibles, donde nombreusuario es la cuenta Samba agregada en el paso 7. Cuando se
solicite la contraseña, ingrese la contraseña asignada para la cuenta Samba en el paso 7 (los
números de versión pueden diferir):
$ smbclient -U nombreusuario -L localhost
Enter nombreusuario's password:
Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]
Sharename
Type
Comment
-----------------micomparticion
Disk
Mi comparticion
IPC$
IPC
IPC Service (Samba Server Version 3.5.2-59.fc13)
nombreusuario
Disk
Home Directories
Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]
Server
---------
Comment
-------
Workgroup
---------
Master
-------
10. Ejecute mkdir /test/ como usuario root para crear un nuevo directorio. Este directorio será
usado para montar el recurso micomparticion compartido con Samba .
11. Ejecute el siguiente comando como usuario root para montar el recursos micomparticion
compartido con Samba en /test/, reemplazando nombreusuario con el nombre de usuario
del paso 7:
mount //localhost/micomparticion /test/ -o user=nombreusuario
Ingrese la contraseña para nombreusuario, la que fue configurada en el paso 7.
12. Ejecute ls /test/ para ver el archivo archivo1 creado en el paso 3:
$ ls /test/
archivo1
5.4.2. Compartiendo un sitio web
Esto no puede ser posible con archivos etiquetados con el tipo samba_share_t, por ejemplo,
cuando quiere compartir un sitio web en /var/www/html/.Para estos casos, use el Booleano
samba_export_all_ro para compartir cualquier archivo o directorio (sin tener en cuenta la etiqueta
actual), permitiendo solo lectura, o el Booleano samba_export_all_rw para compartir cualquier
archivo o directorio (sin tener en cuenta la etiqueta actual), permitiendo lectura y escritura.
El siguiente ejemplo crea un archivo para un sitio web en /var/www/html/, y entonces compartir
ese archivo usando Samba, permitiendo leer y escribir. Este ejemplo asume que los paquetes httpd,
samba, samba-common, samba-client y wget están instalados:
1. Como usuario root, cree el archivo /var/www/html/archivo1.html. Copie y pegue el
siguiente contenido en el archivo /var/www/html/archivo1.html:
33
Capítulo 5. Samba
<html>
<h2>Archivo compartido usando Servidor HTTP Apache y Servidor Samba.</h2>
</html>
2. Ejecute ls -Z /var/www/html/archivo1.html para ver el contexto SELinux del archivo
archivo1.html:
$ ls -Z /var/www/html/archivo1.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/
archivo1.html
archivo1.html esta etiquetado con httpd_sys_content_t. Por defecto, el Servidor HTTP
Apache puede acceder a este tipo, pero Samba no puede.
3. Ejecute service httpd start como usuario root para iniciar el Servidor HTTP Apache:
service httpd start
Iniciando httpd:
[
OK
]
4. Ingrese al directorio en que su usuario tiene acceso para escritura, y ejecute el comando wget
http://localhost/archivo1.html. A menos que existan cambios en la configuración por
defecto, este comando es exitoso:
$ wget http://localhost/archivo1.html
--2009-03-02 16:32:01-- http://localhost/archivo1.html
Resolviendo localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 84 [text/html]
Saving to: `archivo1.html.1'
100%[=======================>] 84
--.-K/s
in 0s
2009-03-02 16:32:01 (563 KB/s) - `archivo1.html.1' saved [84/84]
5. Edite /etc/samba/smb.conf como usuario root. Agregue lo siguiente al final del archivo para
compartir el directorio /var/www/html/ usando Samba:
[sitioweb]
comment = Sitio Web compartido
path = /var/www/html/
public = no
writeable = no
6. El directorio /var/www/html/ está etiquetado con el tipo httpd_sys_content_t.
Por defecto, Samba no puede acceder a los archivos y directorios etiquetados con el
tipo httpd_sys_content_t, incluso si los permisos Linux lo permiten. Para permitir a
Samba el acceso, ejecute el siguiente comando como usuario root para activar el Booleano
samba_export_all_ro:
34
Compartiendo un sitio web
setsebool -P samba_export_all_ro on
No utilice la opción -P si no quiere que los cambios persistan al siguiente reinicio. Nota: activando
el Booleano samba_export_all_ro permite a Samba acceder a cualquier tipo.
7. Ejecute service smb start como usuario root para iniciar smbd:
service smb start
Iniciando servicios SMB:
[
OK
]
35
36
File Transfer Protocol (FTP)
1
De la Guía de despliegue de Linux para empresas de Red Hat 5 (en inglés) :
El Protocolo de transferencia de archivos FTP (por las iniciales en inglés de File Transfer Protocol)
es uno de los protocolos más antiguos y más utilizados que hoy en día se encuentran en Internet.
Su propósito es el de transferir archivos entre equipos de forma confiable sobre una red, sin por ello
necesitar que el usuario se registre directamente en el equipo remoto, o que tenga conocimiento
acerca de cómo utilizar el sistema remoto. Permite que los usuarios accedan a los archivos en los
2
sistemas remotos utilizando un conjunto estándar de comandos simples.
El Demonio FTP muy seguro (vsftpd por las iniciales en inglés de Very Secure FTP Daemon) está
diseñado desde un principio para ser veloz, estable, y, lo más importante, seguro. La capacidad que
tiene vsftpd para manipular numerosas conexiones de manera segura y eficiente, lo convierte en el
3
único FTP autónomo ofrecido con Linux para empresas de Red Hat
En Fedora, el paquete vsftpd ofrece el Demonio FTP muy seguro. Ejecute el comando rpm -q
vsftpd para verificar que vsftpd se encuentre instalado:
$ rpm -q vsftpd
Si desea un servidor FTP y el paquete vsftpd no se encuentra instalado, ejecute el siguiente comando
como usuario root para instalarlo:
yum install vsftpd
6.1. SELinux y FTP
Cuando SELinux esté ejecutándose, el servidor FTP vsftpd, se ejecuta confinado de manera
prededeterminada. Las políticas de SELinux definen cómo vsftpd interactúa con los archivos,
procesos, y con todo el sistema en general. Por ejemplo, cuando un usuario autenticado se registra
mediante FTP, no puede ni leer ni escribir sobre los archivos de sus directorios personales: De
manera predeterminada SELinux evita que vsftpd pueda acceder a los directorios personales de
los usuarios. Además, también por defecto, vsftpd no tiene acceso a sistemas de archivos NFS o
CIFS, y los usuarios anónimos no poseen acceso de escritura, ni siquiera cuando tal tipo de acceso
se encuentre configurado en /etc/vsftpd/vsftpd.conf. Los Booleanos pueden encenderse para
permitir el acceso mencionado recién.
El ejemplo que ofrecemos a continuación muestra a un usuario autenticado registrándose, y a una
negación de SELinux cuando este usuario trata de visualizar archivos en su directorio personal:
1. Ejecute el comando rpm -q vsftpd para verificar que el paquete vsftpd se encuentre instalado.
Si no, ejecute el comando yum install vsftpd como usuario root para instalarlo.
1
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/index.html
El primer parágrafo del capítulo 23 de la Guía de despliegue de Linux para empresas de Red Hat 5 (en inglés): http://
www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/ch-ftp.html. Copyright © 2007 Red Hat, Inc.
El primer parágrafo de la sección 23.2.1. de la Guía de despliegue de Linux para empresas de Red Hat Enterprise 5 (en inglés):
http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/s1-ftp-servers.html#s2-ftp-serversvsftpd. Copyright © 2007 Red Hat, Inc.
37
Capítulo 6. File Transfer Protocol (FTP)
2. En Fedora, de manera predeterminada vsftpd solo permite registrarse a los usuarios
anónimos. Para permitir el registro de los usuarios autenticados, edite el archivo /etc/vsftpd/
vsftpd.conf como usuario root. Descomente la opción local_enable=YES:
# Uncomment this to allow local users to log in.
local_enable=YES
3. Ejecute el comando service vsftpd start como usuario root para iniciar vsftpd. Si el
servicio estaba ejecutándose antes de editar el archivo vsftpd.conf, ejecute el comando
service vsftpd restart como usuario root para que surtan efecto las modificaciones en la
configuración :
service vsftpd start
Starting vsftpd for vsftpd:
[
OK
]
4. Ejecute el comando ftp localhost como el usuario con el que se encuentra registrado en este
momento. Cuando se le pida su nombre, asegúrese de poder observar su nombre de usuario. Si
el nombre de usuario es el correcto, presione la tecla Enter, de lo contrario, ingrese el nombre
de usuario correcto.
$ ftp localhost
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.1.0)
Name (localhost:username):
331 Please specify the password.
Password: Enter your password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
5. Ejecute el comando ls desde el intérprete ftp. Con el Booleano ftp_home_dir apagado,
SELinux evita que vsftpd pueda acceder a directorios personales, haciendo que este comando
no pueda devolver un listado de directorios:
ftp> ls
227 Entering Passive Mode (127,0,0,1,225,210).
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
Una negación de SELinux parecida a la siguiente se encuentra registrada en el archivo /var/
log/messages:
setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories
(username). For complete SELinux messages. run sealert -l c366e889-2553-4c16b73f-92f36a1730ce
6. Habilite el Booleano ftp_home_dir ejecutando el comando siguiente como usuario root:
38
Tipos
# setsebool -P ftp_home_dir=1
Nota
No utilice la opción -P si no desea que las modificaciones continúan una vez que
el sistema sea reiniciado.
Ejecute nuevamente el comando ls desde el intérprete ftp. ahora que SELinux está permitiendo
acceso al directorio personal mediante el Booleano ftp_home_dir, dicho directorio puede ser
observado:
ftp> ls
227 Entering Passive Mode (127,0,0,1,56,215).
150 Here comes the directory listing.
-rw-rw-r-1 501
501
0 Mar 30 09:22 file1
-rw-rw-r-1 501
501
0 Mar 30 09:22 file2
226 Directory Send OK.
ftp>
6.2. Tipos
Por defecto, los usuarios anónimos tienen acceso de solo lectura a los archivos contenidos
en /var/ftp/ cuando se registren mediante FTP. Este directorio está etiquetado con el tipo
public_content_t, permitiendo acceso de solo lectura, aún cuando el acceso de escritura se
encuentre configurado en /etc/vsftpd/vsftpd.conf. El tipo public_content_t es accesible
al resto de los servicios, como por ejemplo el servidor HTTP Apache, Samba y NFS.
Utilice uno de los tipos siguientes para compartir archivos mediante FTP:
public_content_t
Etiquete a los archivos y a los directorios que haya creado con el tipo public_content_t
para poder compartirlos en modo de solo lectura mediante vsftpd. Otros servicios, como el
servidor HTTP Apache, Samba y NFS, también tienen acceso a los archivos etiquetados con este
tipo. Los archivos etiquetados con el tipo public_content_t no pueden ser modificados, ni
siquiera cuando los permisos Linux así lo permitan. Si necesita acceso de escritura, utilice el tipo
public_content_rw_t.
public_content_rw_t
Etiquete a los archivos y a los directorios que haya creado con el tipo public_content_rw_t
para poder compartirlos con permisos de lectura y escritura mediante vsftpd. Otros servicios,
como el servidor HTTP Apache, Samba y NFS, también tienen acceso a los archivos etiquetados
con este tipo. Sin embargo, deben encenderse los Booleanos correspondientes a cada servicio
antes de que esos servicios puedan tener acceso de escritura a los archivos etiquetados con este
tipo.
39
Capítulo 6. File Transfer Protocol (FTP)
6.3. Booleanos
SELinux está basado en el menor de los niveles de acceso necesarios para que un servicio funcione.
Los servicios pueden ser ejecutados en una variedad de formas; por lo tanto debe decirle a SELinux
de qué manera usted está ejecutando servicios. Los Booleanos que describimos a continuación le
permiten informarle a SELinux de qué manera está ejecutando vsftpd:
allow_ftpd_anon_write
Cuando se encuentra deshabilitado, este Booleano evita que vsftpd modifique archivos y
directorios etiquetados como el tipo public_content_rw_t. Encienda este Booleano para
permitir que los usuarios envíen archivos mediante FTP. El directorio al cual los archivos son
enviados debe estar etiquetado con el tipopublic_content_rw_t, y los permisos Linux deben
ser definidos de acuerdo a ello.
allow_ftpd_full_access
Cuando este Booleano esté encendido, sólo los permisos Linux son utilizados para controlar
el acceso, y los usuarios autenticados pueden leer y modificar archivos que no se encuentren
etiquetados con los tipos public_content_t o public_content_rw_t.
allow_ftpd_use_cifs
Tener este Booleano habilitado permite que vsftpd pueda acceder a los archivos y a los
directorios etiquetados con el tipo cifs_t; por lo tanto, tenerlo habilitado le permite compartir
sistemas de archivos montados con Samba a través de vsftpd.
allow_ftpd_use_nfs
Tener este Booleano habilitado permite que vsftpd tenga acceso a los archivos y directorios
etiquetados con el tipo nfs_t type; por lo tanto, tenerlo habilitado le permite compartir sistemas
de archivos montados mediante NFS a través de vsftpd.
ftp_home_dir
Tener este Booleano habilitado permite que los usuarios autenticados puedan leer y modificar
archivos en sus directorios personales. Cuando este Booleano esté apagado, intentar descargar
un archivo desde un directorio personal provocará un error similar a 550 Failed to open
file. Una negación de SELinux será registrada en el archivo /var/log/messages.
ftpd_connect_db
Permite que los demonios FTP inicien una conexión con la base de datos.
httpd_enable_ftp_server
Permite que httpd escuche en el puerto FTP y que actúe como un servidor FTP
tftp_anon_write
Tener este Booleano habilitado permite acceso TFTP a directorios públicod, como ser por ejemplo
un área reservada para archivos comunes que, de otra forma, no tendría restricciones de acceso
especiales.
40
Ejemplos de configuración
6.4. Ejemplos de configuración
6.4.1. Cómo enviar datos a un sitio FTP
El ejemplo que ofrecemos a continuación genera un sitio FTP que permite recibir archivos de un
usuario dedicado. Crea la estructura de directorio y las modificaciones necesarias en la configuración
de SELinux:
1. Ejecute el comando mkdir -p /myftp/pub como usuario root para crear un nuevo directorio
de nivel superior.
2. Defina los permisos Linux en el directorio /myftp/pub/ para permitir que un usuario Linux tenga
acceso de escritura. Nuestro ejemplo modifica el dueño y el grupo (root), y los define como siendo
el user1 el dueño, y root el grupo. Reemplace user1 con el nombre de usuarios al que desee
otorgarle permisos de escritura:
# chown user1:root /myftp/pub
# chmod 775 /myftp/pub
El comando chown modifica los permisos de usuario y de grupo. El comando chmod modifica
el modo, permitiendo que el user1 tenga permisos de lectura, escritura y ejecución, y que los
miembros del grupo root puedan leer, escribir y ejecutar permisos. El resto posee permisos de
lectura y de escritura: esto es necesario para permitir que el servidor HTTP Apache puede leer
archivos desde este directorio.
3. Cuando SELinux esté ejecutándose, los archivos y los directorios deben encontrarse
correctamente etiquetados para permitir el acceso. No es suficiente definir los permisos de
Linux. Los archivos etiquetados con el tipo public_content_t permiten que sean leídos
por FTP, el servidor HTTP Apache, Samba y rsync. Los archivos etiquetados con el tipo
public_content_rw_t pueden ser modificados por FTP. Otros servicios, como Samba,
necesitan la definición de Booleanos antes de poder modificar archivos etiquetados con el
tipo public_content_rw_t. Etiquete el directorio de nivel superior (/myftp/) con el tipo
public_content_t, para evitar que archivos copiados o recientemente creados del directorio /
myftp/ sean sobrescritos o modificados por otros servicios. Ejecute el siguiente comando como
usuario root para agregar la modificación del etiquetado en la configuración archivo-contexto:
semanage fcontext -a -t public_content_t /myftp
4. Ejecute el comando restorecon -R -v /myftp/ para aplicar las modificaciones del
etiquetado:
# restorecon -R -v /myftp/
restorecon reset /myftp context unconfined_u:object_r:default_t:s0>system_u:object_r:public_content_t:s0
5. Verifique que /myftp se encuentre etiquetado con el tipo public_content_t, y que /myftp/
pub/ lo esté con el tipo default_t:
41
Capítulo 6. File Transfer Protocol (FTP)
$ ls -dZ /myftp/
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /myftp/
$ ls -dZ /myftp/pub/
drwxrwxr-x. user1 root unconfined_u:object_r:default_t:s0 /myftp/pub/
6. FTP debe tener permitido escribir sobre un directorio antes que lo usuarios puedan
enviar archivos. SELinux permite a FTP escribir sobre directorios etiquetados con el tipo
public_content_rw_t. Nuestro ejemplo utiliza el directorio /myftp/pub/ como el directorio
al que FTP tiene permitido escribir. Ejecute el siguiente comando como usuario root para agregar
la modificación del etiquetado en la configuración de archivo-contexto:
semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"
7. Ejecute el comando restorecon -R -v /myftp/pub como usuario root para aplicar la
modificación del etiquetado:
# restorecon -R -v /myftp/pub
restorecon reset /myftp/pub context system_u:object_r:default_t:s0>system_u:object_r:public_content_rw_t:s0
8. El Booleano allow_ftpd_anon_write debe estar encendido para permitir que vsftpd
pueda modificar archivos etiquetados con el tipo public_content_rw_t. Ejecute el siguiente
comando como usuario root para encenderlo:
setsebool -P allow_ftpd_anon_write on
No utilice la opción -P si no desea que las modificaciones continúen vigentes luego de reiniciar el
sistema.
El ejemplo que ofrecemos a continuación muestra el registro mediante FTP y el envío de un archivo.
Nuestro ejemplo utiliza al usuario user1 del ejemplo anterior, donde user1 es el dueño dedicado del
directorio /myftp/pub/:
1. Ejecute el comando cd ~/ para transladarse a su directorio personal. Entonces, ejecute el
comando mkdir myftp para crear un directorio en donde almacenar los archivos que luego
serán enviados mediante FTP.
2. Ejecute el comando cd ~/myftp para trasladarse al directorio ~/myftp/. En este directorio,
genere un archivo denominado ftpupload. En dicho archivo, copie los siguientes contenidos:
File upload via FTP from a home directory.
3. Ejecute el comando getsebool allow_ftpd_anon_write para confirmar que el Booleano
allow_ftpd_anon_write se encuentre encendido:
$ getsebool allow_ftpd_anon_write
allow_ftpd_anon_write --> on
42
Cómo enviar datos a un sitio FTP
Si este Booleano está apagado, ejecute el comando setsebool -P
allow_ftpd_anon_write on como usuario root para encenderlo. No utilice la opción -P si no
desea que las modificaciones persistan luego de haber reiniciado el sistema.
4. Ejecute el comando service vsftpd start como usuario root para iniciar vsftpd:
# service vsftpd start
Starting vsftpd for vsftpd:
[
OK
]
5. Ejecute el comando ftp localhost. Cuando se le pida un nombre de usuario, ingrese el
nombre de usuario de aquel que tenga permisos de escritura, y luego ingrese la contraseña
adecuada para dicho usuario:
$ ftp localhost
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.1.0)
Name (localhost:username):
331 Please specify the password.
Password: Enter the correct password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
43
44
Sistema de Archivos en Red (NFS)
1
Fuente: Guía de Referencia de Red Hat Linux :
NFS (las iniciales en inglés de Network File System) permite a los equipos montar particiones
en un sistema remoto y utilizarlas como si fueran sistemas de archivos locales. Esto permite que
los administradores de sistemas puedan almacenar recursos en una ubicación central de la red,
ofreciendo a los usuarios autorizados un acceso continuo a ellos.
En Fedora, el paquete nfs-utils es necesario para un soporte NFS completo. Ejecute el comando
rpm -q nfs-utils para saber si este paquete se encuentra instalado. Si no está instalado y desea
utilizar NFS, ejecute el siguiente comando como usuario root para instalarlo:
yum install nfs-utils
7.1. NFS y SELinux
Cuando SELinux esté ejecutándose, los demonios NFS se encuentran confinados de manera
predeterminada. La política de SELinux no permite que NFS comparta archivos por defecto. Si quiere
compartir particiones NFS, esto puede configurarse mediante los Booleanos nfs_export_all_ro
y nfs_export_all_rw, como lo explicamos más abajo. Sin embargo, estos Booleanos no
son necesarios cuando los archivos a ser compartidos se encuentran etiquetados con los tipos
public_content_t o public_content_rw_t. NFS puede compartir archivos etiquetados con
estos tipos aún si los Booleanos nfs_export_all_ro y nfs_export_all_rw se encuentran
apagados.
7.2. Tipos
Por defecto, los sistemas de archivos NFS montados en el lado del cliente son etiquetados con un
contexto predeterminado definido por la política establecida para sistemas de archivos NFS. En
políticas comunes, este contexto predeterminado utiliza el tipo nfs_t. Los siguientes tipos son
utilizados con NFS. Diferentes tipos le permiten configurar un acceso más flexible:
var_lib_nfs_t
Este tipo es utilizado con archivos nuevos y ya existentes copiados o creados en el directorio /
var/lib/nfs. Este tipo no debería ser modificado en una operatoria normal. Para restaurar las
modificaciones a los valores predeterminados, ejecute el comando restorecon -R -v /var/
lib/nfs como usuario root.
nfsd_exec_t
El archivo /usr/sbin/rpc.nfsd es etiquetado con el tipo nfsd_exec_t, al igual que otras
bibliotecas y archivos ejecutables del sistema que estén relacionados con NFS. Los usuarios no
deberían etiquetar ningún archivo con este tipo. nfsd_exec_t se modicaría a nfs_t.
7.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
1
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/ch-nfs.html
45
Capítulo 7. Sistema de Archivos en Red (NFS)
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando NFS:
allow_ftpd_use_nfs
Cuando se encuentre habilitado. este Booleano permite que ftpd tenga acceso a montajes NFS.
allow_nfsd_anon_write
Cuando se encuentre habilitado, este Booleano permite que nfsd pueda modificar un directorio
público de forma anónima; como ser, por ejemplo, un área reservada para archivos comunes que
de otra manera no tendrían restricciones de acceso particulares.
httpd_use_nfs
Cuando se encuentre habilitado, este Booleano permite que httpd pueda acceder a los archivos
almacenados en un sistema de archivos NFS.
nfs_export_all_ro
Exporta cualquier archivo o directorio mediante NFS, otorgando permisos de solo lectura.
nfs_export_all_rw
Exporta cualquier archivo o directorio mediante NFS, otorgando permisos de lectura y escritura.
qemu_use_nfs
Permite que qemu utilice sistemas de archivos NFS.
samba_share_nfs
Cuando se encuentre deshabilitado, este Booleano evita que smbd tenga acceso completo a
elementos NFS compartidos mediante Samba. Habilitar este Booleano permitirá que Samba
pueda compartir sistemas de archivos NFS.
use_nfs_home_dirs
Tener este Booleano habilitado añade soporte para directorios personales NFS.
virt_use_nfs
Permite a virt usar archivos NFS.
xen_use_nfs
Permite a xen manejar archivos NFS.
7.4. Ejemplos de configuración
7.4.1. Compartiendo directorios usando NFS
El ejemplo en esta sección crea un directorio y lo comparte utilizando NFS y SELinux. Son utilizados
dos equipos; un servidor NFS denominado nfs-srv, cuya dirección IP es 192.168.1.1, y un
cliente denominado nfs-client cuya dirección IP es 192.168.1.100. Ambos equipos se
encuentran en la misma subred (192.168.1.0/24). Este es solo un ejemplo, y presupone que el
paquete nfs-utils se encuentra instalado, que se está utilizando SELinux con una política elegida, y
que se está ejecutando en modo obligatorio.
Este ejemplo enseñará que, aunque teniendo una disponibilidad de red total, y que los permisos
de archivos Linux garanticen un acceso a todos los usuarios mediante NFS, SELinux es capaz de
46
Compartiendo directorios usando NFS
bloquear montajes sobre sistemas de archivos NFS, a menos que sean otorgados los permisos
adecuados mediante SELinux y Booleanos.
7.4.1.1. Configuración del Servidor
Los pasos 1 a 10 que ofrecemos a continuación deberían ser ejecutados en el servidor NFS, nfssrv.
1. Ejecute el comando setsebool para deshabilitar montajes de lectura y escritura sobre sistemas
de archivos NFS:
setsebool -P nfs_export_all_rw off
Nota
No utilice la opción -P si no desea que las modificaciones en setsebool
continúen vigentes luego de haber reiniciado el sistema.
2. Ejecute el comando rpm -q nfs-utils para verificar que el paquete nfs-utils se encuentre
instalado. Este paquete ofrece programas de soporte para utilizar NFS y debería ser instalado
sobre cualquier cliente que esté en uso. Si este paquete no se encuentra instalado, hágalo
ejecutando el comando yum install nfs-utils como usuario root.
3. Ejecute mkdir /micomparticion como usuario root para crear un directorio de nivel superior
para compartir archivos usando NFS.
4. Ejecute el comando touch /myshare/file1 como usuario root para crear un nuevo archivo
vacío en el área compartida. El cliente accederá a este archivo más adelante.
5. Para saber que SELinux aún se encuentra capacitado para bloquear accesos, aún cuando hayan
sido otorgados permisos de Linux, otorgue al directorio /myshare derechos de accesos totales
para todos los usuarios:
# chmod -R 777 /micomparticion
Aviso
Este es solo un ejemplo y estos permisos no deberían ser usados en un sistema
de producción.
6. Edite el archivo /etc/exports y agregue la línea siguiente en la parte superior:
/micomparticion
192.168.1.100(rw)
Esta entrada muestra la ruta completa en el servidor a la carpeta compartida /myshare, el
equipo o rango de red que nfs-srv compartirá con (en este caso la dirección IP de un único
equipo, nfs-client en 192.168.1.100), y por último, los permisos para poder hacerlo. Se
otorgan permisos de lectura y escritura, como es indicado en por (rw).
47
Capítulo 7. Sistema de Archivos en Red (NFS)
7. Los puertos TCP y UDP utilizados por NFS son asignados dinámicamente por rpcbind, lo que
puede generar problemas cuando se creen reglas de cortafuegos. Para simplificar el proceso
de permiso de tráfico NFS a través del cortafuegos, en nuestro ejemplo edite el archivo /etc/
sysconfig/nfs y descomente las variables MOUNTD_PORT, STATD_PORT, LOCKD_TCPPORT y
LOCKD_UDPPORT. En este ejemplo, no es necesario modificar el número de los puertos del
archivo.
Asegúrese que se encuentren permitidas las conexiones entrantes de los puertos TCP 111,
892 y 2049, a través del cortafuegos del servidor. Esto puede ser hecho en Fedora mediante la
utilización de la herramienta system-config-firewall.
8. Ejecute el comando service nfs start como usuario root para iniciar NFS y los servicios
relacionados:
# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
9. Para asegurarse que la tabla de exportación del subsistema NFS se encuentra actualizada,
ejecute el comando exportfs -rv como usuario root:
# exportfs -rv
exporting 192.168.1.100:/myshare
10. Ejecute el coamdno showmount -e como usuario root para conocer todos los sistemas de
archivos exportados:
# showmount -e
Export list for nfs-srv:
/myshare 192.168.1.100
En este momento, el servidor nfs-srv ha sido configurado para permitir comunicaciones NFS hacia
nfs-client en 192.168.1.100, y se encuentran activos todos los permisos Linux de sistemas
de archivos. Si SELinux estuviera deshabilitado, el cliente debería ser capaz de montar la porción
compartida y de tener acceso total sobre ella. Sin embargo, como el Booleano nfs_export_all_rw
se encuentra deshabilitado, el cliente no es capaz de montar este sistema de archivos, como puede
observarse a continuación. Este paso debería ser realizado sobre el cliente, nfs-client:
[nfs-client]# mkdir /myshare
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
mount.nfs: access denied by server while mounting 192.168.1.1:/myshare/
Habilite el Booleano de SELinux que fue deshabilitado anteriormente en el paso 1, y el cliente será
capaz de montar exitosamente el sistema de archivos compartido. Este paso debería ser realizado
sobre el servidor NFS, nfs-srv:
48
Compartiendo directorios usando NFS
[nfs-srv]# setsebool -P nfs_export_all_rw on
Ahora, intente montar nuevamente el sistema de archivos NFS. Este paso debería ser realizado sobre
el cliente NFS, nfs-client:
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
[nfs-client]#
[nfs-client]# ls /myshare
total 0
-rwxrwxrwx. 1 root root 0 2009-04-16 12:07 file1
[nfs-client]#
El sistema de archivos ha sido montado exitosamente en el cliente. Este ejemplo demuestra de qué
manera SELinux agrega otra capa de protección, y cómo pueden reforzarse los permisos de SELinux,
aún cuando los permisos de Linux estaban definidos para otorgar derechos absolutos a todos los
usuarios
49
50
Dominio de Nombres de Internet
Berkeley (BIND)
BIND realiza la resolución de nombre usando el demonio named. BIND permite a los usuario localizar
computadoras, recursos y servicios por un nombre en lugar de una dirección numérica.
En Fedora, el paquete bind provee el servidor DNS. Ejecute rpm -q bind para ver si el paquete
bind está instalado. Si este no esta instalado y usted quiere usar BIND, ejecute el siguiente comando
como usuario root para instarlo:
yum install bind
8.1. BIND y SELinux
Los permisos por defecto sobre los directorios /var/named/slaves,/var/named/dynamic y /
var/named/data permiten zonas de archivos ha ser actualizados por una transferencia de zona
y una actualización dinámica de DNS. Los archivos en /var/named son etiquetados con el tipo
name_zone_t, el cual es usado para los archivos maestros de zona.
Para servidores esclavo, configure /etc/named.conf para reemplazar la zona esclava en /var/
named/slaves. El siguiente es un ejemplo de un dominio ingresado en /etc/named.conf para
un servidor DNS esclavo que almacena el archivo de zona testdomain.com en /var/named/
slaves:
zone "testdomain.com" {
type slave;
masters { IP-address; };
file "/var/named/slaves/db.testdomain.com";
};
Si un archivo de zona es etiquetado con name_zone_t, el Booleano named_write_master_zones
debe estar habilitado para permitir transferencias de zona y actualización dinámica de DNS en el
archivo de zona. También, el modo de el directorio superior debe ser cambiado para permitir al
usuario o grupo named acceso a leer, escribir y ejecutar.
Si los archivos de zona en /var/named/ son etiquetados con el tipo name_cache_t, re-etiquete el
sistema de archivos, o ejecute restorecon -R /var/ que cambiara sus tipos a named_zone_t.
8.2. Tipos
Los siguientes tipos son usados con BIND. Los diferentes tipos le permiten configurar accesos
flexibles:
named_zone_t
Usado para los archivos maestros de zona. Otros servicios no pueden modificar archivos
con este tipo. El demonio named solo puede modificar archivos de este tipo si el Booleano
named_write_master_zones esta habilitado.
51
Capítulo 8. Dominio de Nombres de Internet Berkeley (BIND)
named_cache_t
Por defecto, named puede escribir archivos etiquetados con este tipo, sin establecer Booleanos
adicionales. Los archivos copiados o creados en los directorios /var/named/slaves,/
var/named/dynamic y /var/named/data son automáticamente etiquetados con el tipo
named_cache_t.
8.3. Boolenanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando BIND:
named_write_master_zones
Cuando esta deshabilitado, este Booleano previene que named escriba en archivos de zona o
directorios etiquetados con el tipo named_zone_t. named usualmente no necesita escribir los
archivos de zona; pero en algún casos lo necesite, o si un segundo servidor necesita escribir los
archivos de zona, habilite este Booleano para permitir esta acción.
8.4. Ejemplos de configuración
8.4.1. DNS Dinámico
BIND permite a equipos actualizar sus registros en DNS y archivos de zona en forma dinámica.
Esto es usado cuando equipo modifica su dirección IP frecuentemente y el registro DNS requiere
modificación en tipo real.
Use el directorio /var/named/dynamic para archivos de zona que quiera actualizar usando
DNS dinámico. Los archivos creados o copiados en /var/named/dynamic heredan los permisos
Linux que permiten a named escribir en ellos. Como estos los archivos son etiquetados con el tipo
named_cache_t, SELinux permite a named escribir en ellos.
Si el archivo de zona en /var/named/dynamic es etiquetado con el tipo named_zone_t, las
actualizaciones DNS dinámicas pueden no ser exitosas en determinados periodos de tipo en que las
actualizaciones deben ser escritas en el diario primero, antes de empezar el mezclado. Si el archivo
de zona es etiquetado con el tipo named_zone_t cuando el diario intenta mezclarse, un error como
el siguiente es registrado en /var/log/messages:
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
Tambien, la siguiente negación SELinux es registrada en /var/log/messages:
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
Para resolver problemas de etiquetado, ejecute el comando restorecon -R -v /var/named/
dynamic como usuario root de Linux.
52
Sistema de Versionado Concurrentes
(CVS)
El Sistema de Versionado Concurrente (CVS) es un sistema libre de control de revisiones. Es
utilizado para monitoreo y seguimiento de modificaciones de un conjunto central de archivos
que es usualmente accedido por muchos usuarios diferentes. Esto es comúnmente usado
por programadores para administrar un repositorio de código y es extensamente usado por
programadores de código abierto
En Fedora, el paquete cvs provee CVS. Ejecute rpm -q cvs para ver si el paquete cvs está
instalado. Si este no está instalado y quiere usar CVS, ejecute el siguiente comando como usuario
root para instalarlo:
yum install cvs
9.1. CVS y SELinux
El demonio cvs se ejecuta como cvs_t. Por defecto en Fedora, CVS solo tiene permisos de lectura
y escritura sobre determinados directorios. La etiqueta cvs_data_t define que áreas el demonio
cvs puede acceder para leer y escribir. Cuando se usa CVS con SELinux, asignar correctamente las
etiquetas es esencial para que los clientes tengan acceso completo al área reservada para los datos
CVS.
9.2. Tipos
Los siguientes tipos son usados con CVS. Los diferentes tipos le permiten configurar accesos
flexibles:
cvs_data_t
Este tipo es usado para los datos en el repositorio CVS. CVS solo puede obtener acceso sobre
los datos si tiene este tipo.
cvs_exec_t
Este tipo es usado por los binarios en /usr/bin/cvs
9.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando CVS:
allow_cvs_read_shadow
Este Booleano permite al demonio cvs el acceso al archivo /etc/shadow para autenticar
usuarios.
53
Capítulo 9. Sistema de Versionado Concurrentes (CVS)
9.4. Ejemplos de configuración
9.4.1. Configuración de CVS
Este ejemplo describe una configuración simple de CVS y la configuración de SELinux que permite
acceso remoto. Dos equipos son usados en este ejemplo, un servidor CVS con nombre de equipo
cvs-srv y dirección IP 192.168.1.1 y un cliente con nombre de equipo cvs-client y dirección
IP 192.168.1.100. Ambos equipos son de la misma sub-red (192.168.1.0/24). Este es solo un
ejemplo y asume que los paquetes cvs and xinetd están instalados, que SELinux usa la política por
objetivos (targeted), y que SELinux esta corriendo en modo obligado.
Este ejemplo muestra que incluso con todos los permisos DAC, SELinux pude todavía hacer cumplir
las reglas basadas en etiquetas de archivo y solo permitir acceso a determinadas áreas que sean
específicamente etiquetadas para el acceso por CVS.
9.4.2. Configuración del Servidor
Nota
Pasos 1-9 deben ser efectuados en el servidor CVS, cvs-srv.
1. Como usuario root, instale los paquetes cvs y xinetd. Ejecute Run rpm -q cvs para ver si el
paquete cvs está instalado. Si no esta instalado, ejecute yum install cvs como usuario root
para instalarlo. Ejecute rpm -q xinetd para ver si el paquete xinetd esta instalado. Si no esta
instalado, ejecute yum install xinetd como usuario root para instalarlo.
2. Cree un grupo llamado CVS. Este puede hacerlo usando el comando groupadd CVS como
usuario root, o usando la herramienta system-config-users.
3. Cree un usuario con el nombre cvsuser y haga que este usuario sea miembro del grupo CVS.
Esto puede hacerlo con la herramienta system-config-users.
4. Edite el archivo /etc/services verifique que el servidor CVS tiene sin comentar las entradas
que se ven similar a lo siguiente:
cvspserver 2401/tcp
cvspserver 2401/udp
# CVS client/server operations
# CVS client/server operations
5. Cree un repositorio CVS en el área raíz del sistema de archivos. Cuando esta usando SELinux,
es mejor tener el repositorio en la raíz del sistema de archivos para poder aplicar etiquetas
recursivas sin afectar cualquier otro subdirectorio. Por ejemplo, como usuario root, cree el
directorio /cvs como hogar para su repositorio:
[root@cvs-srv]# mkdir /cvs
6. Otorgue permisos completos al directorio /cvs para todos los usuarios:
54
Configuración del Servidor
[root@cvs-srv]# chmod -R 777 /cvs
Aviso
Este es solo un ejemplo y estos permisos no deberían ser usados en un sistema
de producción.
7. Edite el archivo /etc/xinetd.d/cvs y verifique que la sección CVS esta sin comentar y
configurada para usar el directorio /cvs. El archivo debería verse similar a:
service cvspserver
{
disable = no
port
= 2401
socket_type = stream
protocol = tcp
wait
= no
user
= root
passenv
= PATH
server
= /usr/bin/cvs
env
= HOME=/cvs
server_args = -f --allow-root=/cvs pserver
# bind
= 127.0.0.1
8. Inicie el demonio xinetd ejecutando service xinetd start como usuario root.
9. Agregue una regla que permita enlazar conexiones usando el puerto TPC 2401, puede hacer esto
utilizando la herramienta system-config-firewall.
10. Como usuario cvsuser, ejecute el siguiente comando:
[cvsuser@cvs-client]$ cvs -d /cvs init
11. A este punto, CVS ha sido configurado pero SELinux sigue denegando en ingreso y el acceso
a archivos. Para demostrar esto, establezca la variable $CVSROOT en cvs-client e intente
ingresar remotamente. El siguiente paso debería ser realizado en cvs-client:
[cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
[cvsuser@cvs-client]$
[cvsuser@cvs-client]$ cvs login
Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
CVS password: ********
cvs [login aborted]: unrecognized auth response from 192.168.100.1: cvs pserver: cannot
open /cvs/CVSROOT/config: Permission denied
SELinux ha bloqueado el acceso. Para indicar a SELinux que permita este acceso, debería
realizar el siguiente paso en cvs-srv:
12. Cambiar el contexto del directorio /cvs como usuario root para etiquetar de forma recursiva
cualquier archivo nuevo o existente de datos en el directorio /cvs, estableciendo el tipo
cvs_data_t:
55
Capítulo 9. Sistema de Versionado Concurrentes (CVS)
[root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?'
[root@cvs-srv]# restorecon -R -v /cvs
13. El cliente, cvs-client debería ahora estar habilitado para ingresar y acceder a todos los
recursos CVS en este repositorio:
[cvsuser@cvs-client]$ export CVSROOT=:pserver:cvsuser@192.168.1.1:/cvs
[cvsuser@cvs-client]$
[cvsuser@cvs-client]$ cvs login
Logging in to :pserver:cvsuser@192.168.1.1:2401/cvs
CVS password: ********
[cvsuser@cvs-client]$
56
Squid Caching Proxy
1
Fuente página del proyecto Squid Caching Proxy :
"Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth
and improves response times by caching and reusing frequently-requested web pages. Squid has
extensive access controls and makes a great server accelerator."
En Fedora, el paquete squid provee Squid Caching Proxy. Ejecute rpm -q squid para ver si el
paquete squid está instalado. Si no esta instalado, ejecute el siguiente comando como usuario root
para instarlo:
# yum install squid
10.1. Squid Caching Proxy y SELinux
Cuando SELinux esta habilitado, squid se ejecuta confinado por defecto. Los procesos confinados
se ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un proceso
confinado es comprometido por un atacante, dependiendo de la configuración de políticas de
SELinux, los accesos a recursos del atacante y los posibles daños que pueda causar son limitados.
El siguiente ejemplo demuestra el procesos squid ejecutándose en su propio dominio. Este ejemplo
asume que el paquete squid esta instalado:
1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:
$ getenforce
Enforcing
El comando getenforce retorna Enforcing cuando SELinux está corriendo en modo
obediente.
2. Ejecute service squid start como usuario root para iniciar squid:
# service squid start
Iniciando squid:
[
OK
]
3. Ejecute ps -eZ | grep squid para ver el proceso squid:
$ ps -eZ | grep squid
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
unconfined_u:system_r:squid_t:s0
1
2522
2524
2526
2527
2528
2529
2530
2531
?
?
?
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
squid
squid
ncsa_auth
ncsa_auth
ncsa_auth
ncsa_auth
ncsa_auth
unlinkd
http://www.squid-cache.org/
57
Capítulo 10. Squid Caching Proxy
El contexto SELinux asociado con el proceso squid es
unconfined_u:system_r:squid_t:s0. La segunda parte del contexto, squid_t, es el tipo.
El tipo define el dominio para el proceso y tipos de archivos. En este caso, el proceso squid está
corriendo en el dominio squid_t.
La política SELinux define que procesos se ejecutan en dominios confinados, como por ejemplo
squid_t, interactua con archivos, otros procesos y el sistema en general. Los archivos deben ser
etiquetados correctamente para permitir a squid el acceso a ellos.
Cuando /etc/squid/squid.conf ha sido configurado de modo que squid escuche sobre un
puerto diferente que los TCP predeterminados (3128, 3401 o 4827), el comando semanage port
debe ser utilizado para agregar el número de puerto requerido a la política de configuración de
SELinux. El ejemplo siguiente enseña cómo configurar a squid para que escuche sobre un puerto
que no ha sido definido inicialmente en la configuración de políticas de SELinux para squid, y
como consecuencia de esto, squid no puede iniciarse. Además, nuestro ejemplo demuestra como
configurar luego el sistema SELinux para permitir que squid pueda escuchar exitosamente sobre un
puerto no estándar que aún no haya sido definido en la política. Nuestro ejemplo presupone que el
paquete squid se encuentra instalado. Ejecute cada comando como usuario root:
1. Ejecute service squid status para confirmar que squid no se esta ejecutando:
# service squid status
squid está parado
Si la salida es diferente, ejecute service squid stop para detener el proceso:
# service squid stop
Parando squid:
[
OK
]
2. Ejecute semanage port -l | grep -w squid_port_t para ver los puertos que SELinux
permite a squid escuchar:
semanage port -l | grep -w -i squid_port_t
squid_port_t
tcp
3128, 3401, 4827
squid_port_t
udp
3401, 4827
3. Edite el archivo /etc/squid/squid.conf como usuario root. Configure la opción http_port
para que liste un puerto que no esté configurado en la política de SELinux para la configuración
de squid. En este ejemplo , squid es configurado para escuchar en el puerto 10000:
# Squid normally listens to port 3128
http_port 10000
4. Ejecute service squid start para iniciar squid:
# service squid start
Inciando squid: ....................
58
[FALLÓ]
Tipos
También, la siguiente negación SELinux es registrada en /var/log/messages:
localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port
1000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
5. Para que SELinux permita a squid escuchar el puerto 10000, que es usado en este ejemplo, es
requerido el siguiente comando:
# semanage port -a -t squid_port_t -p tcp 10000
6. Ejecute service squid start nuevamente para iniciar squid y tener a este escuchando en
el nuevo puerto:
# service squid start
Iniciando squid:
[
OK
]
7. Ahora que SELinux ha sido configurado para permitir que squid escuche sobre un puerto TCP
no estándar (TCP 1000 en nuestro ejemplo), squid se inicia exitosamente en tal puerto.
10.2. Tipos
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
El siguiente tipo es usado con squid. Los diferentes tipos le permiten configurar accesos flexibles:
httpd_squid_script_exec_t
Este tipo es utilizado con herramientas como cachemgr.cgi, que ofrecen una variedad de
estadísticas acerca de squid y de su configuración.
squid_exec_t
Utilice este tipo para los datos que hayan sido cacheados por squid, como se define en la
directiva cache_dir en el archivo /etc/squid/squid.conf. Por defecto, los archivos creados
o copiados en /var/cache/squid y en /var/spool/squid son etiquetados con el tipo
2
squid_cache_t. Los archivos para el complemento squidGuard de squid, creados o copiados
en /var/squidGuard también son etiquetados con el tipo squid_cache_t. Para sus datos
cacheados, squid solo es capaz de utilizar archivos y directorios que hayan sido etiquetados con
este tipo.
squid_exec_t
Este tipo es utilizado para archivos y directorios que squid utiliza para su configuración. Los
archivos existentes, o aquellos creados o copiados en /etc/squid y en /usr/share/squid,
son etiquetados con este tipo, incluyendo los íconos y los mensajes de error.
2
http://www.squidguard.org/
59
Capítulo 10. Squid Caching Proxy
squid_exec_t
Este tipo es usado por los binarios en /usr/sbin/squid
squid_var_run_t
Este tipo es utilizado para registros. Los archivos existentes, o aquellos que hayan sido creados
o copiados en /var/log/squid o en /var/log/squidGuard deben ser etiquetados con este
tipo.
squid_var_run_t
Este tipo es utilizado para el archivo de inicialización necesario para lanzar squid, que se
encuentra ubicado en /etc/rc.d/init.d/squid.
squid_var_run_t
Este tipo es utilizado por archivos en /var/run, especialmente los procesos id (PID)
denominados /var/run/squid.pid, y que es creado por squid cuando se encuentra en
ejecución.
10.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando Squid:
squid_use_tproxy
Cuando se encuentra habilitado, este Booleano permite que squid inicie una conexión con un
equipo remoto sobre cualquier puerto.
squid_use_tproxy
Cuando se encuentra habilitado. este Booleano permite que squid se ejecute como un proxy
transparente.
10.4. Ejemplos de configuración
10.4.1. Squid Conectando a puertos no estándar
El siguiente ejemplo ofrece una demostración de un caso real acerca de cómo SELinux complementa
a Squid al hacer cumplir el Booleano recién mencionado, y permitiendo acceso de manera
predeterminada solo a ciertos puertos. Este ejemplo demostrará entonces cómo modificar el
Booleano, mostrando luego que el acceso es permitido.
Tenga en cuenta que este es solo un ejemplo y que demuestra cómo SELinux puede afectar una
configuración básica de Squid. Ofrecer una documentación más completa relacionada con Squid es
algo que se encuentra más allá de los propósitos de este documento. Consulte la Docuemntación
3
oficial de Squid (en inglés) para obtener mayores detalles. Nuestro ejemplo presupone que el
equipo Squid posee dos interfaces de red, acceso a internet, y que cualquier tipo de cortafuegos ha
sido configurado para permitir acceso a la interfaz interna, mediante la utilización del puerto TCO
predeterminado sobre el que Squid está escuchando (TCP 3128).
3
http://www.squid-cache.org/Doc/
60
Squid Conectando a puertos no estándar
1. Como usuario root, instale el paquete squid. Ejecute el comando rpm -q squid para verificar
que ya lo tenga en sus sistema. Si no ha sido instalado, ejecute el comando yum install
squid como usuario root para hacerlo.
2. Edite el archivo de configuración principal, /etc/squid/squid.conf, y confirme que la
directiva cache_dir se encuentre sin comentar y que parezca similar a la siguiente:
cache_dir ufs /var/spool/squid 100 16 256
Esta línea indica las configuraciones predeterminadas para la directiva cache_dir a ser
utilizadas en nuestro ejemplo. Está compuesta por el formato de almacenamiento de Squid (ufs),
el directorio del sistema donde reside el caché (/var/spool/squid), la cantidad de espacio en disco
en megabytes a ser utilizada por el caché (100), y por último, la cantidad de directorios de caché
de primer y segundo nivel a ser creados (16 y 256 respectivamente).
3. En el mismo archivo de configuración, asegúrese que la directiva http_access allow
localnet no se encuentre comentada. Esto permite el tráfico desde localnet ACL, que
es automáticamente configurada en una instalación predeterminada de Squid en Fedora 13.
Permitirá que las máquinas cliente de cualquier red RFC1918 existente tengan acceso a través
del proxy, lo que que a los efectos de nuestro ejemplo es suficiente.
4. En el mismo archivo de configuración, asegúrese que la directiva visible_hostname no se
encuentre comentada y que esté configurada con el nombre de equipo de la máquina. El valor
debería ser el nombre del dominio totalmente calificado del equipo (FQDN, por las iniciales en
inglés de fully qualified domain name);
visible_hostname squid.example.com
5. Como usuario root, ejecute el comando service squid start para iniciar squid. Como esta
es la primera vez que squid se ha iniciado, este comando inicializará los directorios de caché
como se ha indicado recién en la directiva de cache_dir, y entonces iniciará el demonio squid.
El resultado lo indicamos a continuación, si es que squid se ha iniciado exitosamente:
# /sbin/service squid start
init_cache_dir /var/spool/squid... Inciando squid: .
[
OK
]
6. Verifique que el proceso ID (PID) squid se haya iniciado como un servicio confinado, del mismo
modo en que aquí puede observarse en el valor squid_var_run_t:
# ls -lZ /var/run/squid.pid
-rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
7. En este punto, una máquina de cliente conectada en la localnet ACL anteriormente
configurada, podrá de manera exitosa ser capaz de utilizar la interfaz interba de este equipo como
su propio proxy. Esto puede ser configurado en las configuraciones de todos los navegadores
web más utilizados, o en todo el sistema. Squid ahora está escuchando sobre el puerto
predeterminado de la máquina elegida (TCP 3128), pero la máquina elegida sólo permitirá
conexiones salientes de otros servicios a Internet mediante los puertos comunes. Esta es una
61
Capítulo 10. Squid Caching Proxy
política definida por SELinux. SELinux negará el acceso a puertos no estándar, como se muestra
en el paso siguiente:
8. Cuando un cliente realice una petición utilizando un puerto no estándar a través del proxy Squid,
como ser, por ejemplo, un sitio web escuchando en el puerto TCP 1000, se registra una negación
similar a la siguiente:
SELinux está previniendo acerca de la intención del demonio squid de conectarse al puerto
de red 10000
9. Para permitir este acceso, el Booleano squid_connect_any debe ser modificado, ya
que se encuentra deshabilitado en forma predeterminada. Para encender el Booleano
squid_connect_any, ejecute el siguiente comando como usuario root:
# setsebool -P squid_connect_any on
Nota
No utilice la opción -P si no desea que las modificaciones de setsebool
permanezcan vigentes luego de reiniciar el equipo.
10. El cliente ahora será capaz de acceder a puertos no estándar de Internet, ya que ahora Squid
tiene permitido iniciar conexiones sobre cualquier puerto, en nombre de sus clientes.
62
MySQL
1
Fuente página del proyecto MySQL :
"The MySQL® database has become the world's most popular open source database because of
its consistent fast performance, high reliability and ease of use. It's used on every continent -- Yes,
even Antarctica! -- by individual Web developers as well as many of the world's largest and fastestgrowing organizations to save time and money powering their high-volume Web sites, business-critical
systems and packaged software -- including industry leaders such as Yahoo!, Alcatel-Lucent, Google,
Nokia, YouTube, and Zappos.com."
En Fedora, el paquete mysql-server provee MySQL. Ejecute rpm -q mysql-server para ver si el
paquete mysql-server está instalado. Si no esta instalado, ejecute el siguiente comando como usuario
root para instarlo:
yum install mysql-server
11.1. MySQL y SELinux
Cuando MySQL esta habilitado, este se ejecuta confinado por defecto. Los procesos confinados
se ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un proceso
confinado es comprometido por un atacante, dependiendo de la configuración de políticas de
SELinux, los accesos a recursos del atacante y los posibles daños que pueda causar son limitados.
El siguiente ejemplo demuestra el procesos MySQL ejecutándose en su propio dominio. Este ejemplo
asume que el paquete mysql esta instalado:
1. Ejecute getenforce para confirmar que SELinux esta ejecutándose en modo obediente:
$ getenforce
Enforcing
El comando getenforce retorna Enforcing cuando SELinux esta ejecutándose en modo
obediente.
2. Ejecute service mysqld start como usuario root para iniciar mysqld:
# service mysqld start
Iniciando base de datos MySQL:
Iniciando mysqld:
Installing MySQL system tables... [
[ OK
OK
]
]
3. Ejecute ps -eZ | grep mysqld para ver el proceso mysqld:
$ ps -eZ | grep mysqld
unconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safe
unconfined_u:system_r:mysqld_t:s0 6123 pts/1
00:00:00 mysqld
1
http://www.mysql.com/why-mysql/
63
Capítulo 11. MySQL
El contexto SELinux asociado con el proceso mysqld es
unconfined_u:system_r:mysqld_t:s0. La segunda parte del contexto, mysqld_t es el
tipo. Un tipo define el dominio para el proceso y el tipo de los archivos. En este caso, el proceso
mysqld esta ejecutándose en el dominio mysqld_t.
11.2. Tipos
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
El siguiente tipo es usado con mysql. Los diferentes tipos le permiten configurar accesos flexibles:
mysqld_db_t
Este tipo es usado para la ubicación de la base de datos MySQL. En Fedora 13, la ubicación por
defecto de la base es /var/lib/mysql, de todas formas puede ser cambiada. Si la ubicación
de la base de datos MySQL es cambiada, la nueva ubicación debe estar etiquetada con este tipo.
Siga el siguiente ejemplo para instruirse de como cambiar la ubicación y como etiquetar la nueva
sección apropiadamente.
mysqld_etc_t
Este tipo es usado para el archivo de configuración principal /etc/my.cnf de MySQL y
cualquier otro archivo de configuración en el directorio /etc/mysql.
mysqld_exec_t
Este tipo es usado para la ubicación del binario mysqld en /usr/libexec/mysqld, que es la
ubicación por defecto para el binario de MySQL en Fedora 13. Otros sistemas pueden ubicar el
binario en /usr/sbin/mysqld que puede estar también etiquetado con este tipo.
mysqld_initrc_exec_t
Este tipo es usado para el archivo de inicialización de MySQL, ubicado en /etc/rc.d/init.d/
mysqld por defecto en Fedora 13.
mysqld_log_t
Los archivos de registro (Logs) para MySQL necesitan estar etiquetados con esta etiquetados con
este tipo para operar apropiadamente. Todos los archivos log en /var/log/ que coincidan con
el patrón mysql.* deben ser etiquetados con este tipo.
mysqld_var_run_t
Este tipo es usado para los archivos en /var/run/mysqld, especificamente el proceso id
(PID) llamado /var/run/mysqld/mysqld.pid el cual es creado por el demonio mysqld
cuando esta corriendo. Este tipo también es usado para los archivos de relacionados con socket
como son /var/lib/mysql/mysql.sock. Archivos como este deben estar etiquetados
correctamente para la operación adecuada como un servicio confinado.
11.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
64
Ejemplos de configuración
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando MySQL:
exim_can_connect_db
Cuando esta habilitado, este Booleano permite al demonio de correo exim iniciar conexiones al
servidor de base de datos
ftpd_connect_db
Cuando esta habilitado, este Booleano permite al demonio ftp iniciar conexiones al servidor de
base de datos.
httpd_can_network_connect_db
Habilitar este Booleano es requerido para que un servidor web se comunique con el servidor de
base de datos.
11.4. Ejemplos de configuración
11.4.1. Cambiando la ubicación de la Base de Datos MySQL
Cuando usa Fedora, la ubicación por defecto de MySQL para almacenar sus bases de datos es /
var/lib/mysql. Aquí es donde SELinux espera que sea por defecto, y por lo tanto, este ámbito ya
está debidamente etiquetados para usted usando el tipo mysqld_db_t.
El área donde esta ubicada la base de datos puede ser cambiada dependiendo los requerimientos
o preferencias de entorno individuales, de todas formas es importante que SELinux esté consiente
de la nueva ubicación, para lo cual se usa el etiquetado. Este ejemplo explica como cambiar la
ubicación de la base de datos MySQL y luego como etiquetar la nueva ubicación para que SELinux
siga proveyendo sus mecanismos de protección para la nueva área basado en su contenido.
Note que este es solo un ejemplo y demostración de como SELinux puede afectar a MySQL.
Documentación comprensiva de MySQL esta fuera del alcance de este documento. Diríjase a la
2
documentación de MySQL oficial para más detalles. Este ejemplo asume que el paquete mysqlserver esta instalado y que hay una base de datos válida en la ubicación por defecto /var/lib/
mysql.
1. Ejecute ls -lZ /var/lib/mysql para ver el contexto SELinux de la ubicación por defecto de
la base de datos para mysql:
# ls -lZ /var/lib/mysql
drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql
Esto muestra mysqld_db_t lo cual es el elemento de contexto por defecto para la ubicación de
los archivos de base de datos. Este contexto tendrá que ser aplicado manualmente a la nueva
ubicación de la base de datos que se utilizarán en este ejemplo con el fin de asegurar su buen
funcionamiento.
2. Ingrese mysqlshow -u root -p e ingrese la contraseña root de mysqld para ver las bases de
datos disponibles:
2
http://dev.mysql.com/doc/
65
Capítulo 11. MySQL
# mysqlshow -u root -p
Enter password: *******
+--------------------+
|
Databases
|
+--------------------+
| information_schema |
| mysql
|
| test
|
+--------------------+
3. Detenga el demonio mysqld ejecutando service mysqld stop como usuario root:
# service mysqld stop
Parando mysqld:
[
OK
]
4. Cree un nuevo directorio para la nueva ubicación de las bases de datos. En este ejemplo, se usa
/opt/mysql:
# mkdir -p /opt/mysql
5. Copie los archivos de base de datos desde la ubicación anterior a la nueva ubicación:
# cp -R /var/lib/mysql/* /opt/mysql/
6. Cambie el propietario de esta ubicación para permitir acceso al usuario y grupo mysql. Esto se
establece con los permisos tradicionales de Unix que seguirán siendo observados por SELinux.
# chown -R mysql:mysql /opt/mysql
7. Ejecute ls -lZ /opt para ver el contexto inicial del nuevo directorio:
# ls -lZ /opt
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0
mysql
El contexto usr_t de este directorio recientemente creado no es adecuado actualmente para
SELinux como ubicación de archivos de base de datos MySQL. Una vez que el contexto ha
cambiado, MySQL será capaz de funcionar adecuadamente en esta área.
8. Abra el archivo principal de configuración de MySQL /etc/my.cnf con un editor de textos
y modifique la opción datadir e indique la nueva ubicación. En este ejemplo el valor a ser
ingresado es /opt/mysql.
[mysqld]
datadir=/opt/mysql
Guarde este archivo y salga.
9. Ejecute service mysqld start como usuario root para iniciar mysqld. A este punto
aparecerá una negación registrada en /var/log/messages:
66
Cambiando la ubicación de la Base de Datos MySQL
# service mysqld start
MySQL Daemon failed to start.
Iniciando MySQL:
[FAILED]
# tail -f /var/log/messages
localhost setroubleshoot: SELinux is preventing mysqld (mysqld_t) "write" usr_t. For
complete SELinux messages. run sealert -l 50d8e725-994b-499c-9caf-a676c50fb802
La razón de esta negación es que /opt/mysql no esta etiquetado correctamente para los
archivos de datos MySQL. SELinux esta deteniendo a MySQL a tener acceso al contenido
etiquetado con usr_t. Realice los siguientes pasos para resolver este problema:
10. Ejecute el comando semanage y agregue un mapeo de contexto para /opt/mysql:
semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?"
11. Este mapeo es escrito en el archivo /etc/selinux/targeted/contexts/files/
file_contexts.local:
# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
/opt/mysql(/.*)?
system_u:object_r:mysqld_db_t:s0
12. Ahora use el comando restorecon para aplicar este mapeo de contexto al sistema en
ejecución:
restorecon -R -v /opt/mysql
13. Ahora que la ubicación /opt/mysql ha sido etiquetada con el contexto correcto para MySQL, el
demonio mysqld inicia:
# service mysqld start
Iniciando mysqld:
[
OK
]
14. Confirme que el contexto de /opt/mysql ha cambiado:
ls -lZ /opt
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
15. La ubicación ha sido cambiada y etiquetada, y el demonio mysqld se ha reiniciado
satisfactoriamente. A este punto todos los servicios ejecutándose deberían estar probados
confirmando la operación normal.
67
68
PostgreSQL
1
Fuente página del proyecto PostgreSQL :
"PostgreSQL is a powerful, open source object-relational database system. It has more than 15 years
of active development and a proven architecture that has earned it a strong reputation for reliability,
data integrity, and correctness."
En Fedora, el paquete postgresql-server provee PostgreSQL. Ejecute rpm -q postgresqlserver para ver si el paquete postgresql-server está instalado. Si no esta instalado, ejecute el
siguiente comando como usuario root para instarlo:
yum install postgresql-server
12.1. PostgreSQL y SELinux
Cuando PostgreSQL esta habilitado, este se ejecuta confinado por defecto. Los procesos confinados
se ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un proceso
confinado es comprometido por un atacante, dependiendo de la configuración de políticas de
SELinux, los accesos a recursos del atacante y los posibles daños que pueda causar son limitados.
El siguiente ejemplo demuestra el procesos PostgreSQL ejecutándose en su propio dominio. Este
ejemplo asume que el paquete postgresql-server esta instalado:
1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:
$ getenforce
Enforcing
El comando getenforce retorna Enforcing cuando SELinux está corriendo en modo
obediente.
2. Ejecute service postgresql start como usuario root para iniciar postgresql:
# service postgresql start
Iniciando postgresql:
[
OK
]
3. Ejecute ps -eZ | grep postgresql para ver el proceso postgresql:
ps -eZ | grep postgres
unconfined_u:system_r:postgresql_t:s0
unconfined_u:system_r:postgresql_t:s0
unconfined_u:system_r:postgresql_t:s0
unconfined_u:system_r:postgresql_t:s0
unconfined_u:system_r:postgresql_t:s0
unconfined_u:system_r:postgresql_t:s0
395
397
399
400
401
402
?
?
?
?
?
?
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
postmaster
postmaster
postmaster
postmaster
postmaster
postmaster
El contexto SELinux asociado con el proceso postgresql es
unconfined_u:system_r:postgresql_t:s0. La segunda parte del contexto,
1
http://www.postgresql.org/about/
69
Capítulo 12. PostgreSQL
postgresql_t, es el tipo. El tipo define el dominio para el proceso y tipos de archivos. En este
caso, el proceso postgresql está corriendo en el dominio postgresql_t.
12.2. Tipos
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
El siguiente tipo es usado con postgresql. Los diferentes tipos le permiten configurar accesos
flexibles:
postgresql_db_t
Este tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo son
usadas para archivos de datos de PostgreSQL:
• /usr/lib/pgsql/test/regres
• /usr/share/jonas/pgsql
• /var/lib/pgsql/data
• /var/lib/postgres(ql)?
postgresql_etc_t
Este tipo es usado para el archivos de configuración en /etc/postgresql.
postgresql_exec_t
Este tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo son
usadas para binarios de PostgreSQL:
• /usr/bin/initdb(.sepgsql)?
• /usr/bin/(se)?postgres
• /usr/lib(64)?/postgresql/bin/.*
• /usr/lib/phsql/test/regress/pg_regress
postgresql_initrc_exec_t
Este tipo es usado para el archivo de inicialización de PostgreSQL ubicado en /etc/rc.d/
init.d/postgresql.
postgresql_log_t
Este tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo son
usadas para archivos de registro:
• /var/lib/pgsql/logfile
• /var/lib/pgsql/pgstartup.log
• /var/lib/sepgsql/pgstartup.log
• /var/log/postgresql
• /var/log/postgres.log.*
70
Booleanos
• /var/log/rhdb/rhdb
• /var/log/sepostgresql.log.*
postgresql_var_run_t
Este tipo es usado para los archivos en tiempo de ejecución de PostgreSQL, como son el id (PID)
de proceso en /var/run/postgresql.
12.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando PostgreSQL:
allow_user_postgresql_connect
Teniendo este Booleano habilitado permite a cualquier usuario del dominio (definido por
PostgreSQL) establecer conexiones al servidor de base de datos.
12.4. Ejemplos de configuración
12.4.1. Cambiando la ubicación de la Base de Datos PostgreSQL
Cuando esta usando Fedora, la ubicación por defecto de PostgreSQL para almacenar sus bases
de datos es /var/lib/pgsql/data. Aquí es donde SELinux espera que sea por defecto, y por lo
tanto, este ámbito ya está debidamente etiquetados para usted usando el tipo postgresql_db_t.
El área donde esta ubicada la base de datos puede ser cambiada dependiendo los requerimientos o
preferencias de entorno individuales, de todas formas es importante que SELinux esté consiente de
la nueva ubicación, para lo cual se usa el etiquetado. Este ejemplo explica como cambiar la ubicación
de la base de datos PostgreSQL y luego como etiquetar la nueva ubicación para que SELinux siga
proveyendo sus mecanismos de protección para la nueva área basado en su contenido.
Note que este es solo un ejemplo y demostración de como SELinux puede afectar a PostgreSQL.
Documentación comprensiva de PostgreSQL esta fuera del alcance de este documento. Diríjase a la
2
documentación de PostgreSQL oficial para más detalles.
1. Ejecute ls -lZ /var/lib/pgsql para ver el contexto SELinux de la ubicación por defecto de
la base de datos para postgresql:
# ls -lZ /var/lib/pgsql
drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
Esto muestra postgresql_db_t lo cual es el elemento de contexto por defecto para la
ubicación de los archivos de base de datos. Este contexto tendrá que ser aplicado manualmente
a la nueva ubicación de la base de datos que se utilizarán en este ejemplo con el fin de asegurar
su buen funcionamiento.
2
http://www.postgresql.org/docs/
71
Capítulo 12. PostgreSQL
2. Cree un nuevo directorio para la nueva ubicación de las bases de datos. En este ejemplo, se
usa /opt/postgresql/data. Si usted usa una ubicación diferente, reemplace el texto en los
siguiente pasos con su ubicación:
# mkdir -p /opt/postgresql/data
3. Realice un listado de directorios de la nueva ubicación. Note que el contexto inicial del nuevo
directo es usr_t. Este contexto no es suficiente para que SELinux ofrezca sus mecanismos de
protección para PostgreSQL. Una vez que el contexto ha cambiado, PostgreSQL será capaz de
funcionar adecuadamente en esta área.
# ls -lZ /opt/postgresql/
drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0
data
4. Cambie el propietario de esta ubicación para permitir acceso al usuario y grupo postgres. Esto se
establece con los permisos tradicionales de Unix que seguirán siendo observados por SELinux.
# chown -R postgres:postgres /opt/postgresql
5. Abra el archivo /etc/rc.d/init.d/postgresql de inicio de PostgreSQL con un editor de
texto y modifique todas las variables PGDATA y PGLOG para que apunten a la nueva ubicación:
# vi /etc/rc.d/init.d/postgresql
PGDATA=/opt/postgresql/data
PGLOG=/opt/postgresql/data/pgstartup.log
Guarde este archivo y salga del editor de texto.
6. Inicializar la base de datos en la nueva ubicación.
su - postgres -c "initdb -D /opt/postgresql/data"
7. Ejecute el comando semanage para agregar un mapeo de contexto para /opt/postgresql y
cualquier otro directorio o archivo contenido en él:
semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
8. Este mapeo es escrito en el archivo /etc/selinux/targeted/contexts/files/
file_contexts.local:
# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local
/opt/postgresql(/.*)?
system_u:object_r:postgresql_db_t:s0
9. Ahora use el comando restorecon para aplicar este mapeo de contexto al sistema en
ejecución:
72
Cambiando la ubicación de la Base de Datos PostgreSQL
restorecon -R -v /opt/postgresql
10. Ahora que la ubicación /opt/postgresql ha sido etiquetada con el contexto correcto para
PostgreSQL, el demonio postgresql inicia:
# service postgresql start
Iniciando postgreSQL:
[
OK
]
11. Confirme que el contexto de /opt/postgresql ha cambiado:
ls -lZ /opt
drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
12. Verifique con el comando ps que el proceso postgresql muestra la nueva ubicación:
# ps aux | grep -i postmaster
postgres 21564 0.3 0.3 42308
5432 -D /opt/postgresql/data
4032 ?
S
10:13
0:00 /usr/bin/postmaster -p
13. La ubicación ha sido cambiada y etiquetada, y el demonio postgresql se ha reiniciado
satisfactoriamente. A este punto todos los servicios ejecutándose deberían estar probados
confirmando la operación normal.
73
74
rsync
1
Fuente página del proyecto Rsync :
"rsync is an open source utility that provides fast incremental file transfer."
Cuando usa Fedora, el paquete rsync provee rsync. Ejecute rpm -q rsync para ver si el paquete
rsync está instalado. Si no esta instalado, ejecute el siguiente comando como usuario root para
instarlo:
yum install rsync
13.1. rsync y SELinux
SELinux requiere que los archivos tengan definido el atributo extendido del tipo de archivo. La política
gobierna el acceso que los demonios tiene sobre estos archivos. Si usted quiere compartir archivos
usando el demonio rsync, debe etiquetar los archivos y directorios con el tipo public_content_t.
Como la mayoría de los servicios, es requerido un correcto etiquetado para que SELinux accione sus
mecanismos de protección sobre rsync.
13.2. Tipos
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
LEl siguiente tipo es usado con rsync. Los diferentes tipos le permiten configurar accesos flexibles:
public_content_t
Este es un tipo genérico usado para ubicación de archivos (y los archivos actuales) para ser
compartidos usando rsync.Si un directorio especial es creado como hogar de los archivos a
ser compartidos con rsync, el directorio y su contenido necesitan también tener aplicada esta
etiqueta.
rsync_exec_t
Este tipo es usado para los archivos binarios de sistema en /usr/bin/rsync.
rsync_log_t
Este tipo es usado por archivo de registro de rsync, ubicado por defecto en /var/log/
rsync.log. Para cambiar esta ubicación de los archivos de registro de rsync, use la opción -log-file=FILE en el comando rsync al momento de ejecución.
rsync_var_run_t
Este tipo es usado por el archivo de bloqueo de rsyncd, ubicado en /var/run/rsyncd.lock.
Este archivo de bloqueo se usa que el servidor rsync administre el limite de conexiones.
1
http://www.samba.org/rsync/
75
Capítulo 13. rsync
13.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando rsync:
rsync_export_all_ro
Teniendo este Booleano habilitado permite a rsync administrar en el dominio rsync_t archivos,
enlaces y directorios que tengan el tipo public_content_rw_t. A menudo estos son archivos
públicos usados para los servicios de transferencia de archivos públicos. Los archivos y
directorios deben estar etiquetados con public_content_rw_t.
rsync_export_all_ro
Tener este Booleano habilitado permite a rsync iniciar conexiones a puertos definidos para
rsync_port_t, como también permite a rsync administrar archivos, enlaces y directorios que
tengan el tipo rsync_data_t. Note que el demonio rsync debe estar en el dominio rsync_t a fin de
que SELinux tenga control sobre rsync. El ejemplo de configuración en este capitulo muestra a
rsync ejecutando en el dominio rsync_t
rsync_export_all_ro
Teniendo este Booleano habilitado permite a rsync en el dominio rsync_t exportar sistemas de
archivos NFS y CIFS con acceso de solo lectura para los clientes.
13.4. Ejemplos de configuración
13.4.1. Rsync como demonio
Cuando usa Fedora, rsync puede ser usado como un demonio y entonces múltiples clientes pueden
comunicarse directamente con él como un servidor central, a fin de centralizar el alojamiento de
archivos y mantener estos sincronizados. El siguiente ejemplo demostrará a rsync ejecutando como
demonio sobre un red por socket en el dominio correcto, y como SELinux espera que este demonio
este ejecutando en un puerto TCP predefinido (en la política SELinux) Este ejemplo le mostrará como
modificar la política SELinux para permitir al demonio rsync correr normalmente en un puerto no
estándar.
Nuestro ejemplo estará realizado sobre un único sistema para mostrar la política de SELinux y el
control que ejerce sobre demonios y procesos locales. Tenga en cuenta que este es un ejemplo que
sirve solo para demostrar como SELinux influye sobre rsync. Presentar documentación más completa
sobre rsync es algo que se encuentra más allá de los propósitos de este documento. Diríjase al sitio
2
de documentación de rsync (en inglés) para obtener mayores detalles. Nuestro ejemplo presupone
que los paquetes rsync, setroubleshoot-server y audit se encuentran instalados, que la se está
utilizando una política dirigida de SELinux, y que se está utilizando en modo obligatorio.
Haciendo que rsync inicie como rsync_t
1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:
$ getenforce
2
http://www.samba.org/rsync/documentation.html
76
Rsync como demonio
Enforcing
El comando getenforce retorna Enforcing cuando SELinux está corriendo en modo
obediente.
2. Ejecute el comando which para confimar que el binario de rsync esta en la ruta del sistema:
$ which rsync
/usr/bin/rsync
3. Cuando esté ejecutando rsync como un demonio, un archivo de configuración debería
ser utilizado y almacenado como /etc/rsyncd.conf. Tenga en cuenta que el archivo de
configuración utilizado en este ejemplo es muy básico y no es una muestra de todas las opciones
posibles que se encuentran disponibles, pero que es suficiente para mostrar el funcionamiento del
demonio rsync:
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
[files]
path = /srv/files
comment = file area
read only = false
timeout = 300
4. Ahora que existe un archivo básico de configuración para rsync para que pueda funcionar en el
modo de demonio, esta etapa demuestra que el simple hecho de ejecutar rsync --daemon
no es suficiente para que SELinux pueda ofrecer una protección a rsync. Observe el siguiente
resultado:
# rsync --daemon
# ps x | grep rsync
8231 ?
Ss
8233 pts/3
S+
0:00 rsync --daemon
0:00 grep rsync
# ps -eZ | grep rsync
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 8231 ? 00:00:00 rsync
Tenga en cuenta que en resultado del comando final ps, el contexto muestra al demonio rsync
siendo ejecutado en el dominio unconfined_t (no confinado). Esto indica que rsync no se
ha trasladado a dominio rsync_t ya que fue lanzado por el comando rsync --daemon.
En este punto, SELinux no puede hacer cumplir sus reglas o políticas sobre este demonio.
Consulte las siguientes etapas para poder observar cómo solucionar este problema. En los
pasos siguientes, rsync se trasladará al dominio rsync_t al ser ejecutado desde un init script
etiquetado adecuadamente. Solo entonces SELinux y sus mecanismos de protección podrá
tener efecto sobre rsync. Este proceso rsync debería ser finalizado antes de continuar con el
siguiente paso.
5. Para esta etapa es necesario un init script personalizado. Existe disponible un ejemplo en http://
www.fredshack.com/docs/rsync.html. Guárdelo en el archivo /etc/rc.d/init.d/rsyncd. Los
pasos siguientes enseñan cómo etiquetar a este script como initrc_exec_t:
77
Capítulo 13. rsync
6. Ejecute el comando semanage para agregar un mapeo de contexto para /etc/rc.d/init.d/
rsyncd:
semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
7. Este mapeo es escrito en el archivo /etc/selinux/targeted/contexts/files/
file_contexts.local:
# grep rsync /etc/selinux/targeted/contexts/files/file_contexts.local
/etc/rc.d/init.d/rsyncd
system_u:object_r:initrc_exec_t:s0
8. Ahora use el comando restorecon para aplicar este mapeo de contexto al sistema en
ejecución:
restorecon -R -v /etc/rc.d/init.d/rsyncd
9. Ejecute el comando ls para verificar que el script haya sido etiquetado apropiadamente. Tenga
en cuenta que en el siguiente resultado, el script ha sido etiquetado como initrc_exec_t:
ls -lZ /etc/rc.d/init.d/rsyncd
-rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/rsyncd
10. Inicie rsyncd mediante el nuevo script. Ahora que rsync ha sido iniciado desde un init script
etiquetado adecuadamente, el proceso se iniciará comorsync_t:
# /etc/rc.d/init.d/rsync start
Starting rsyncd:
ps -eZ | grep rsync
unconfined_u:system_r:rsync_t:s0 9794 ?
[
OK
]
00:00:00 rsync
SELinux ahora puede hacer cumplir sus mecanismos de protección sobre el demonio rsync, ya
que ahora se está ejecutando en el dominio rsync_t.
Este ejemplo mostró como hacer que rsyncd se ejecute en el dominio rsync_t. El siguiente
ejemplo mostrará como hacer que este demonio se ejecute exitosamente sobre un puerto diferente a
los predeterminados. En el próximo ejemplo se utilizar el puerto TCP número 1000.
Ejecutando el demonio rsync en un puerto no predefinido
1. Modifique el archivo /etc/rsyncd.conf y agregue la linea port = 10000 al comienzo del
archivo en el area de configuración global (antes que cualquier otra ahora sea definida). La nueva
configuración debe verse similiar a:
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
port = 10000
78
Rsync como demonio
[files]
path = /srv/files
comment = file area
read only = false
timeout = 300
2. Luego de lanzar rsync desde el script init con la nueva configuración, es registrada por SELinux
una negación similar a la siguiente:
Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t)
from binding to port 10000. For complete SELinux messages. run sealert -l
c371ab34-639e-45ae-9e42-18855b5c2de8
3. Ejecute el comando semanage para agregar el puerto TPC 10000 a la política SELinux en
rsync_port_t:
# semanage port -a -t rsync_port_t -p tcp 10000
4. Ahora el puerto TCP 10000 ha sido agregado a la política de SELinux para rsync_port_t,
rsyncd será iniciado y operará normalmente en este puerto:
# /etc/rc.d/init.d/rsync start
Inciando rsyncd:
# netstat -lnp | grep 10000
tcp
0
0 0.0.0.0:10000
[
0.0.0.0:*
LISTEN
OK
]
9910/rsync
La política de SELinux ha sido modificada y ahora se permite a rsyncd operar en el puerto TCP
10000.
79
80
Postfix
1
Fuente página del proyecto Postfix :
"What is Postfix? It is Wietse Venema's mailer that started life at IBM research as an alternative to
the widely-used Sendmail program. Postfix attempts to be fast, easy to administer, and secure. The
outside has a definite Sendmail-ish flavor, but the inside is completely different."
En Fedora, el paquete postfix provee postfix. Ejecute rpm -q postfix para ver si el paquete postfix
está instalado. Si no esta instalado, ejecute el siguiente comando como usuario root para instarlo:
yum install postfix
14.1. Postfix y SELinux
Cuando Postfix esta habilitado, este se ejecuta confinado por defecto. Los procesos confinados
se ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un proceso
confinado es comprometido por un atacante, dependiendo de la configuración de políticas de
SELinux, los accesos a recursos del atacante y los posibles daños que pueda causar son limitados.
El siguiente ejemplo demuestra el procesos Postfix ejecutándose en su propio dominio. Este ejemplo
asume que el paquete postfix esta instalado y que el servicio Postfix ha sido iniciado:
1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:
$ getenforce
Enforcing
El comando getenforce retorna Enforcing cuando SELinux está corriendo en modo
obediente.
2. Ejecute service postfix start como usuario root para iniciar postfix:
service postfix start
Iniciando postfix:
[
OK
]
3. Ejecute ps -eZ | grep postfix para ver el proceso postfix:
ps -eZ | grep postfix
system_u:system_r:postfix_master_t:s0 1651 ?
system_u:system_r:postfix_pickup_t:s0 1662 ?
system_u:system_r:postfix_qmgr_t:s0 1663 ?
00:00:00 master
00:00:00 pickup
00:00:00 qmgr
El contexto SELinux asociado con el proceso master de Postfix es
unconfined_u:system_r:postfix_master_t:s0. La segunda parte del contexto,
postfix_master_t es el tipo para este proceso. Un tipo define el dominio para el proceso
y el tipo de los archivos. En este caso, el proceso master esta ejecutándose en el dominio
postfix_master_t.
1
http://www.postfix.org/
81
Capítulo 14. Postfix
14.2. Tipos
El tipo Obediente es el principal control de permisos usado en SELinux con política por objetivo.
Todos los archivos y procesos son etiquetados con un tipo: el tipo define un dominio para el proceso
y los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos con
otros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. El
acceso solo es permitido si existe una política SELinux específica que permita eso.
El siguiente tipo es usado con Postfix. Los diferentes tipos le permiten configurar accesos flexibles:
postfix_etc_t
Este tipo es usado para el archivo de configuración Postfix en /etc/postfix.
postfix_data_t
Este tipo es usado por los archivos de datos Postfix en /var/lib/postfix.
Nota
Para ver la lista completa de archivos y sus tipos para Postfix, ejecute el siguiente
comando:
$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts
14.3. Booleanos
SELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Los
servicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como
esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinux
como está ejecutando Postfix:
allow_postfix_local_write_mail_spool
Teniendo este Booleano habilitado Postfix puede escribir en el spool de mail local del sistema.
Postfix requiere este Booleano habilitado para operar normalmente cuando se usan spools
locales.
14.4. Ejemplos de configuración
14.4.1. SpamAssassin y Postfix
2
Fuente página del proyecto SpamAssassin :
"Open Source mail filter, written in Perl, to identify spam using a wide range of heuristic tests on mail
headers and body text. Free software."
Cuando usa Fedora, el paquete spamassassin provee SpamAssassin. Ejecute rpm -q
spamassassin para ver si el paquete spamassassin está instalado. Si no esta instalado, ejecute el
siguiente comando como usuario root para instarlo:
2
http://spamassassin.apache.org/
82
SpamAssassin y Postfix
yum install spamassassin
SpamAssassin funciona en estrechamente con un programa de correo como ser Postfix para
proporcionar capacidades de filtrado de spam. Con el fin de que SpamAssassin sea eficiente
interceptando, analizando y filtrando el correo, este debe debe escuchar una interfaz de red.
El puerto por defecto para SpamAssassin es TCP/783, sin embargo este puede ser cambiado.
El siguiente ejemplo proporciona una demostración real de cómo SELinux complementa a
SpamAssassin permitiendo sólo el acceso a un determinado puerto de forma predeterminada. Este
ejemplo demostrará cómo cambiar el puerto y hacer que SpamAssassin opere en un puerto no
predeterminado.
Note que este es solo un ejemplo y demostración de como SELinux puede afectar a SpamAssassin.
Documentación comprensiva de SpamAssassin esta fuera del alcance de este documento. Diríjase a
3
la documentación de SpamAssassin oficial para más detalles. Este ejemplo asume que el paquete
spamassassin esta instalado, que cualquier cortafuegos ha sido configurado para permitir el acceso a
los puertos en uso, que SELinux usa política por objetivo, y que SELinux se esta ejecutando en modo
obediente:
Ejecutando SpamAssassin en un puerto no predeterminado
1. Ejecute el comando semanage para mostrar los puertos que SELinux permite a spamd escuchar
por defecto:
# semanage port -l | grep spamd
spamd_port_t tcp 783
Esta salida muestra el TCP/783 definido en spamd_port_t como el puerto para que opere
SpamAssassin.
2. Edite el archivo /etc/sysconfig/spamassassin de configuración y modifique este para que
SpamAssassin inicie en el puerto ejemplo TCP/10000:
# Options to spamd
SPAMDOPTIONS="-d -p 10000 -c m5 -H"
Esta linea ahora especifica a SpamAssassin que opere en el puerto 10000. El resto de este
ejemplo mostrará como modificar la política de SELinux para permitir que este socket este
abierto.
3. Inicie SpamAssassin y aparecerá un mensaje de error similar al siguiente:
/etc/init.d/spamassassin start
Iniciando spamd: [2203] warn: server socket setup failed, retry 1: spamd: could not create
INET socket on 127.0.0.1:10000: Permission denied
[2203] warn: server socket setup failed, retry 2: spamd: could not create INET socket on
127.0.0.1:10000: Permission denied
[2203] error: spamd: could not create INET socket on 127.0.0.1:10000: Permission denied
spamd: could not create INET socket on 127.0.0.1:10000: Permission denied
3
http://spamassassin.apache.org/doc.html
83
Capítulo 14. Postfix
[FAILED]
Esta salida significa que SELinux ha bloqueado el acceso a este puerto.
4. Una negación similar a la siguiente será registrada por SELinux:
SELinux está previniendo acerca de la intención del demonio spamd de conectarse al puerto
de red 10000
5. Como usuario root, ejecute el comando semanage para modificar la política de SELinux a fin de
permitir a SpamAssassin operar sobre el puerto (TCP/10000) del ejemplo:
semanage port -a -t spamd_port_t -p tcp 10000
6. Confirme que SpamAssassin ahora inicia y es operativo en el puerto TCP 10000:
# /etc/init.d/spamassassin start
Iniciando spamd:
[ OK ]
# netstat -lnp | grep 10000
tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 2224/spamd.pid
7. A este puendo, spamd opera apropiadamente en el puerto TPC 10000 tal como se ha permitido el
acceso este puerto en política SELinux.
84
Referencias
Las siguientes referencias son enlaces a información adicional que es relevante para SELinux pero
exceden el alcance de esta guía. Note que por el rápido desarrollo de SELinux, algunos de estos
materiales puede solo aplicarse a lanzamientos específicos de Fedora.
Libros
SELinux by Example
Mayer, MacMillan, and Caplan
Prentice Hall, 2007
SELinux: NSA's Open Source Security Enhanced Linux
Bill McCarty
O'Reilly Media Inc., 2004
Tutorials and Help
Tutorials and talks from Russell Coker
http://www.coker.com.au/selinux/talks/ibmtu-2004/
Dan Walsh's Journal
http://danwalsh.livejournal.com/
Base de Conocimiento Red Hat
http://kbase.redhat.com/
Información General
NSA SELinux sitio web principal
http://www.nsa.gov/research/selinux/index.shtml
NSA SELinux FAQ (Respuestas a Preguntas Frecuentes)
http://www.nsa.gov/research/selinux/faqs.shtml
Listas de Correo
Lista de correo NSA SELinux
http://www.nsa.gov/research/selinux/list.shtml
Lista de correo Fedora SELinux
http://www.redhat.com/mailman/listinfo/fedora-selinux-list
Comunidad
Guía de Usuario SELinux de Fedora
1
http://docs.fedoraproject.org/es-ES/Fedora/13/html/Security-Enhanced_Linux/index.html/
Wiki del Proyecto SELinux
http://selinuxproject.org/page/Main_Page
1
http://docs.fedoraproject.org/es-ES/Fedora/13/html/Security-Enhanced_Linux/index.html
85
Capítulo 15. Referencias
Pagina de la comunidad SELinux
http://selinux.sourceforge.net/
IRC
irc.freenode.net, #selinux and #fedora-selinux
86
Descargar