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