Administración de Servicios Confinados · actual de trabajo, escriba el comando cat...

94
Fedora 13 Administración de Servicios Confinados Scott Radvan

Transcript of Administración de Servicios Confinados · actual de trabajo, escriba el comando cat...

Page 1: Administración de Servicios Confinados · 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

Fedora 13

Administración deServicios Confinados

Scott Radvan

Page 2: Administración de Servicios Confinados · 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

Administración de Servicios Confinados

Fedora 13 Administración de Servicios ConfinadosAutor Scott Radvan [email protected]

Copyright © 2010 Red Hat, Inc.

The text of and illustrations in this document are licensed by Red Hat under a Creative CommonsAttribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is availableat 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 withCC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for theoriginal 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 InfinityLogo, 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 Statesand/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 usuariosavanzados y a los administradores en el uso y configuración de SELinux. Se centra en FedoraLinux y describe los componentes de SELinux en relación a los servicios que un usuario avanzadoo administrador pueda necesitar configurar. También se incluyen ejemplos de la vida real de laconfiguración de estos servicios y demostraciones sobre cómo SELinux complementa su operación.

Page 3: Administración de Servicios Confinados · 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

iii

Prefacio v1. Convenciones del Documento .......................................................................................... v

1.1. Convenciones Tipográficas ................................................................................... v1.2. Convenciones del documento ............................................................................... vi1.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 53.1. Tipo de obediencia ....................................................................................................... 53.2. Procesos confinados .................................................................................................... 53.3. Procesos no confinados ............................................................................................... 8

4. El servidor HTTP Apache 134.1. El servidor HTTP Apache y SELinux ........................................................................... 134.2. Tipos ......................................................................................................................... 164.3. Booleanos .................................................................................................................. 184.4. Ejemplos de configuración .......................................................................................... 21

4.4.1. Cómo ejecutar un sitio estático ......................................................................... 214.4.2. Cómo compartir sistemas de archivos NFS y CIFS ............................................ 224.4.3. Cómo compartir archivos entre los servicios ...................................................... 234.4.4. Cómo modificar los números de puertos ........................................................... 27

5. Samba 295.1. Samba y SELinux ...................................................................................................... 295.2. Tipos ......................................................................................................................... 305.3. Booleanos .................................................................................................................. 305.4. Ejemplos de configuración .......................................................................................... 31

5.4.1. Compartiendo directorios que usted creó .......................................................... 315.4.2. Compartiendo un sitio web ............................................................................... 33

6. File Transfer Protocol (FTP) 376.1. SELinux y FTP ........................................................................................................... 376.2. Tipos ......................................................................................................................... 396.3. Booleanos .................................................................................................................. 406.4. Ejemplos de configuración .......................................................................................... 41

6.4.1. Cómo enviar datos a un sitio FTP .................................................................... 41

7. Sistema de Archivos en Red (NFS) 457.1. NFS y SELinux .......................................................................................................... 457.2. Tipos ......................................................................................................................... 457.3. Booleanos .................................................................................................................. 457.4. Ejemplos de configuración .......................................................................................... 46

7.4.1. Compartiendo directorios usando NFS .............................................................. 46

8. Dominio de Nombres de Internet Berkeley (BIND) 518.1. BIND y SELinux ......................................................................................................... 518.2. Tipos ......................................................................................................................... 518.3. Boolenanos ................................................................................................................ 528.4. Ejemplos de configuración .......................................................................................... 52

8.4.1. DNS Dinámico ................................................................................................. 52

9. Sistema de Versionado Concurrentes (CVS) 53

Page 4: Administración de Servicios Confinados · 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

Administración de Servicios Confinados

iv

9.1. CVS y SELinux .......................................................................................................... 539.2. Tipos ......................................................................................................................... 539.3. Booleanos .................................................................................................................. 539.4. Ejemplos de configuración .......................................................................................... 54

9.4.1. Configuración de CVS ..................................................................................... 549.4.2. Configuración del Servidor ............................................................................... 54

10. Squid Caching Proxy 5710.1. Squid Caching Proxy y SELinux ................................................................................ 5710.2. Tipos ........................................................................................................................ 5910.3. Booleanos ................................................................................................................ 6010.4. Ejemplos de configuración ........................................................................................ 60

10.4.1. Squid Conectando a puertos no estándar ........................................................ 60

11. MySQL 6311.1. MySQL y SELinux .................................................................................................... 6311.2. Tipos ........................................................................................................................ 6411.3. Booleanos ................................................................................................................ 6411.4. Ejemplos de configuración ........................................................................................ 65

11.4.1. Cambiando la ubicación de la Base de Datos MySQL ...................................... 65

12. PostgreSQL 6912.1. PostgreSQL y SELinux ............................................................................................. 6912.2. Tipos ........................................................................................................................ 7012.3. Booleanos ................................................................................................................ 7112.4. Ejemplos de configuración ........................................................................................ 71

12.4.1. Cambiando la ubicación de la Base de Datos PostgreSQL ............................... 71

13. rsync 7513.1. rsync y SELinux ....................................................................................................... 7513.2. Tipos ........................................................................................................................ 7513.3. Booleanos ................................................................................................................ 7613.4. Ejemplos de configuración ........................................................................................ 76

13.4.1. Rsync como demonio .................................................................................... 76

14. Postfix 8114.1. Postfix y SELinux ..................................................................................................... 8114.2. Tipos ........................................................................................................................ 8214.3. Booleanos ................................................................................................................ 8214.4. Ejemplos de configuración ........................................................................................ 82

14.4.1. SpamAssassin y Postfix ................................................................................. 82

15. Referencias 85

Page 5: Administración de Servicios Confinados · 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

v

Prefacio

1. Convenciones del DocumentoEste manual utiliza varias convenciones para resaltar algunas palabras y frases y llamar la atenciónsobre ciertas partes específicas de información.

En ediciones PDF y de papel, este manual utiliza tipos de letra procedentes de Liberation Fonts1.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 siguientesincluyen Liberation Fonts predeterminadas.

1.1. Convenciones TipográficasSe utilizan cuatro convenciones tipográficas para llamar la atención sobre palabras o frasesespecí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 yrutas. 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 directorioactual de trabajo, escriba el comando cat my_next_bestselling_novel en elinté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 sepresenta en negrita-monoespaciado y distinguible gracias al contexto.

Las combinaciones de teclas se pueden distinguir de las teclas claves mediante el guión que conectacada 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. PulseControl+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 dosconjuntos 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 devariables y valores de retorno mencionados dentro de un párrafo serán presentados en Negrita-monoespaciado. 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 conjuntoasociado de permisos.

Negrita proporcional

1 https://fedorahosted.org/liberation-fonts/

Page 6: Administración de Servicios Confinados · 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

Prefacio

vi

Esta denota palabras o frases encontradas en un sistema, incluyendo nombres de aplicación, texto decuadro de diálogo, botones etiquetados, etiquetas de cajilla de verificación y botón de radio; títulos demenú y títulos del sub-menú. Por ejemplo:

Seleccionar Sistema → Preferencias → Ratón desde la barra del menú principalpara lanzar Preferencias de Ratón. En la pestaña de Botones, haga clic en la cajillaratón de mano izquierda y luego haga clic en Cerrar para cambiar el botón principaldel 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 elnombre del caracter en el campo Búsqueda y haga clic en Siguiente. El caracterbuscado se resaltará en la Tabla de caracteres. Haga doble clic en este caracterresaltado 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 labarra 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 interfazgrá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 reemplazableo variable. Las itálicas denotan texto que usted no escribe literalmente o texto mostrado que cambiadependiendo de la circunstancia. Por ejemplo:

Para conectar a una máquina remota utilizando ssh, teclee [email protected] en un intérprete de comandos de shell. Si lamáquina remota es example.com y su nombre de usuario en esa máquina es john,teclee ssh [email protected].

El comando mount -o remount file-system remonta el sistema de archivollamado. Por ejemplo, para volver a montar el sistema de archivo /home, el comandoes mount -o remount /home.

Para ver la versión de un paquete actualmente instalado, utilice el comando rpm -qpaquete. Éste entregará el resultado siguiente: paquete-versión-lanzamiento.

Observe las palabras en itálicas- negrita sobre — nombre de usuario, domain.name, sistema dearchivo, paquete, versión y lanzamiento. Cada palabra es un marcador de posición, tanto para el textoque 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 untérmino nuevo e importante. Por ejemplo:

Publican es un sistema de publicación de DocBook.

1.2. Convenciones del documentoLos mensajes de salida de la terminal o fragmentos de código fuente se distinguen visualmente deltexto circundante.

Page 7: Administración de Servicios Confinados · 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

Notas y Advertencias

vii

Los mensajes de salida enviados a una terminal se muestran en romano monoespaciado y sepresentan así:

books Desktop documentation drafts mss photos stuff svnbooks_tests Desktop1 downloads images notes scripts svgs

Los listados de código fuente también se muestran en romano monoespaciado, pero se presentany 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 AdvertenciasFinalmente, utilizamos tres estilos visuales para llamar la atención sobre la información que de otromodo se podría pasar por alto.

NotaUna 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 dealgunos trucos que pueden facilitarle las cosas.

ImportanteImportant boxes detail things that are easily missed: configuration changes thatonly apply to the current session, or services that need restarting before an updatewill apply. Ignoring a box labeled 'Important' won't cause data loss but may causeirritation and frustration.

AdvertenciaLas advertencias no deben ignorarse. Ignorarlas muy probablemente ocasionarápérdida de datos.

Page 8: Administración de Servicios Confinados · 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

Prefacio

viii

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-confined-services-guide

Si tiene una sugerencia para mejorar la documentación, intente ser tan específico como sea posiblecuando describa su sugerencia. Si ha encontrado un error, por favor incluya el número de sección yparte del texto que rodea el error para que podamos encontrarlo más fácilmente.

Page 9: Administración de Servicios Confinados · 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

1

Información sobre el Registro de MarcaLinux® 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 oreferencia 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.

Page 10: Administración de Servicios Confinados · 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

2

Page 11: Administración de Servicios Confinados · 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

3

IntroducciónEl Linux de Seguridad Mejorada (SELinux) hace referencia a los archivos, tales como los directorioso los dispositivos, como objetos. Los procesos, tales como los comandos que ejecuta un usuario o laaplicación Mozilla® Firefox®, son referenciadas como sujetos. La mayoría de los sistemas operativosusan un sistema de Control de Acceso Discrecional (DAC) que controla cómo los sujetos interactúancon 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 sistemasoperativos Linux®, los usuarios pueden hacer que sus directorios personales sean legibles paratodos, sin darse cuenta que le están dando permiso a usuarios y procesos (sujetos) de acceder ainformación potencialmente sensible.

Los mecanismos DAC son básicamente inadecuados si se está pensando en una seguridad delos sistemas poderosa. Las decisiones de los accesos DAC están basadas exclusivamente en laidentidad y grupos de pertenencia del usuario, sin tener en cuenta otro tipo de información relevantepara la seguridad, como lo es, por ejemplo, las funciones del usuario, la confiabilidad del programautilizado, y la importancia y la integridad de los datos. Cada usuario posee un control absoluto sobresus archivos, haciendo imposible imponer una política de seguridad diseñada para un sistema engeneral. Más aún, cada programa ejecutado por un servidor hereda todos los permisos otorgados alusuario, y tiene la libertad de modificar los accesos a sus archivos, de modo que no se ofrece ningúntipo de protección contra software malicioso. Numerosos servicios y programas del sistema deben serejecutados con privilegios que superan ampliamente sus requerimientos, de modo que una falla enalguno de estos programas puede ser aprovechada para obtener acceso completo al sistema. 1

A continuación ofrecemos un ejemplo de los permisos utilizados en sistemas operativos basados enLinux que no ejecutan Linux con seguridad mejorada (SELinux). Los permisos en estos ejemplospodrían ser distintos de los de su sistema. Utilice el comando ls -l para conocer los permisos dearchivos:

$ 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 estecaso, el dueño) tiene sobre el archivo file1. Los tres bits de permiso siguientes, rw-, controlan elacceso 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 usuarioscomo a los procesos.

Linux con seguridad mejorada (SELinux) agrega Control de acceso obligatorio (MAC, por las inicialesen inglés de Mandatory Access Control) al Kernel de Linux, y se encuentra habilitado por defecto enFedora. Una arquitectura MAC de propósitos generales necesita tener la posibilidad de hacer complira 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 deinformación relacionada con la seguridad. Cuando se implementa adecuadamente, permite que unsistema pueda defenderse exitosamente, y ofrece soporte crítico protegiéndolo contra manipulacionesy 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 yStephen Smalley. Este ensayo fue preparado en un princiío para la Agencia de nacional de seguridad norteamericana, y por lotanto, 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 ymodificaciones fueron realizadas por Murray McAllister.

Page 12: Administración de Servicios Confinados · 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

Capítulo 2. Introducción

4

entre las aplicaciones, y esto posibilita la ejecución segura de elementos no confiables. Su habilidadpara limtar los privilegios asociados con la ejecución de procesos reduce el alcance del potencialdaño que podría resultar del aprovechamiento de las debilidades en los servicios y las aplicacionesdel sistema. MAC permite que la información sea protegida tanto de los usuarios legítimos conniveles de autorización limitados, como de los usuarios legítimos que sin saberlo estén ejecutandoaplicaciones maliciosas. 2

A continuación ofrecemos un ejemplo de las etiquetas que contienen información importanterelacionada con la seguridad, y que son utilizadas con los procesos, usuarios y archivos de unsistema operativo basado en Linux que esté ejecutándose con SELinux activado. A esta informaciónse 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 elcomando 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. Esteensayo fue preparado en un princiío para la Agencia de nacional de seguridad norteamericana, y por lo tanto, es de dominiopúblico. Consulte el ensayo original (en inglés) [http://www.nsa.gov/research/_files/selinux/papers/ottawa01/index.shtml] paraobtener mayor información y poder conocer la primera edición de este documento. Todas las ediciones y modificaciones fueronrealizadas por Murray McAllister.

Page 13: Administración de Servicios Confinados · 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

5

Política dirigidaLa política dirigida es la política predeterminada de SELinux utilizada en Fedora. Cuando se utiliceuna política dirigida, los procesos seleccionados se ejecutan en un dominio confinado, y los procesosque no son seleccionados son ejecutados en un dominio no confinado. Por ejemplo, por defecto, losusuarios registrados ejecutan el dominio unconfined_t, y los procesos del sistema iniciados por initse 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 poderfuncionar. Los servicios pueden ser ejecutados en una variedad de formas; por lo tanto debe decirlea SELinux de qué manera usted está ejecutando servicios. Esto puede ser logrado mediante losBooleanos que permiten que determinadas partes de SELinux puedan ser modificadas en el tiempode ejecución, sin ningún tipo de conocimiento relacionado con la escritura de políticas SELinux. Estopermite cambios como permitir el acceso de los servicios a sistemas de archivos NFS, sin por ellotener que recargar o recompilar políticas de SELinux. La configuración de Booleanos se describe másadelante.

Otras modificaciones, como ser por ejemplo la utilización de directorios que no sean lospredeterminados para almacenar archivos o servicios, o la modificación de servicios para ejecutarlospuertos no predeterminados, necesitan que la configuración de la política sea actualizada medianteherramientas como semanage. Esto será tratado con detalle más adelante, mediante ejemplos deconfiguración específicos.

3.1. Tipo de obedienciaEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso solo es permitido si existe una política SELinux específica que permita eso.

3.2. Procesos confinadosEn 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 seencuentra confinado, es ejecutado en su propio dominio, como ser, por ejemplo el proceso httpdejecutándose en el dominio httpd_t. Si un servicio confinado es comprometido por un atacante, deacuerdo a la configuración de la política SELinux, se limita el tipo de acceso que tiene el atacante alrecurso comprometido, y el posible daño realizado.

El ejemplo que ofrecemos a continuación demuestra de qué manera SELinux evita que el servidorHTTP Apache (httpd) pueda leer archivos que no se encuentran correctamente etiquetados, comoser, por ejemplo los destinados a ser utilizados por Samba. Este es un ejemplo, y no debería serutilizado 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:

Page 14: Administración de Servicios Confinados · 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

Capítulo 3. Política dirigida

6

$ /usr/sbin/sestatusSELinux status: enabledSELinuxfs mount: /selinuxCurrent mode: enforcingMode from config file: enforcingPolicy version: 24Policy from config file: targeted

SELinux status: enabled es lo que se obtiene cuando SELinux está habilitado. Currentmode: enforcing cuando SELinux está ejecutándose en modo obligatorio. Policy fromconfig file: targeted cuando se está utilizando una política dirigida.

2. Como usuario root, ejecute el comando touch /var/www/html/testfile para crear unarchivo.

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 usuarioLinux 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 Role-Based Access Control) son utilizados para los procesos, pero no para los archivos. Las funcionesno tienen sentido para los archivos - la función object_r es una función general utilizada paralos archivos (en sistemas de archivos de almacenamiento persistente o de red). Dentro deldirectorio /proc/, los archivos relacionados con procesos podrían utilizar la función system_rrole.1 El tipo httpd_sys_content_t permite que el proceso httpd pueda acceder a estearchivo.

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 startStarting httpd: [ OK ]

5. Trasládese al directorio al que su usuario Linux tiene permisos de escritura, y ejecute el comandowget http://localhost/testfile. A menos que existan modificaciones en la configuraciónpredeterminada, este comando funciona:

--2010-02-28 08:44:36-- http://localhost/testfileResolving localhost... 127.0.0.1Connecting to localhost|127.0.0.1|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 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 etiquetadono sobreviven cuando el sistema de archivos es re etiquetado nuevamente. Para que lasmodificaciones sean permanentes de modo que sobrevivan a nuevos re etiquetados del sistema

Page 15: Administración de Servicios Confinados · 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

Procesos confinados

7

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 archivotestfile. Trasládese hacia un directorio sobre el cual su usuario Linux tenga permisos deescritura, y ejecute el comando wget http://localhost/testfile. A menos que existanmodificaciones en la configuración predeterminada, este comando no sirve:

--2010-02-28 08:45:07-- http://localhost/testfileResolving localhost... 127.0.0.1Connecting to localhost|127.0.0.1|:80... connected.HTTP request sent, awaiting response... 403 Forbidden2010-02-28 08:45:08 ERROR 403: Forbidden.

8. Como usuario root, ejecute el comando rm -i /var/www/html/testfile para eliminar elarchivo testfile.

9. Si no necesita que httpd esté ejecutándose, como usuario root ejecute el comando servicehttpd stop para detener httpd:

# /sbin/service httpd stopStopping httpd: [ OK ]

Nuestro ejemplo demuestra la seguridad adicional agregada por SELinux. Las reglas DAC permitenque el proceso httpd pueda acceder al archivo testfile del paso 7, pero debido a que el archivofue 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ánregistrados 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:

Page 16: Administración de Servicios Confinados · 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

Capítulo 3. Política dirigida

8

[Sat Apr 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied

3.3. Procesos no confinadosLos procesos no confinados son ejecutados en dominios no confinados. Por ejemplo, los programasinit se ejecutan en el dominio no confinado initrc_t, los servicios no confinados del kernel seejecutan 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íticasque otorgan casi un acceso total a los procesos que se están ejecutando sobre dominios noconfinados. Los procesos que se estén ejecutando en dominios no confinados no son capaces deutilizar exclusivamente reglas DAC. Si un proceso no confinado es comprometido, SELinux no evitaque un atacante pueda obtener acceso a los recursos del sistema y a los datos, aunque por supuestosiguen siendo utilizadas las reglas DAC. SELinux es una mejora en la seguridad construida sobre lasreglas 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, cuandoes ejecutado de manera no confinada. Nota: En Fedora, los procesos httpd son ejecutados de formapredeterminada en el dominio httpd_t. Este es un ejemplo, y no debería ser utilizado en entornosde producción. Presupone que los paquetes httpd, wget, setroubleshoot-server, y audit se encuentraninstalados, que se está utilizando una política SELinux dirigida, y que SELinux está siendo ejecutadoen 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/sestatusSELinux status: enabledSELinuxfs mount: /selinuxCurrent mode: enforcingMode from config file: enforcingPolicy version: 24Policy from config file: targeted

SELinux status: enabled es lo que se obtiene cuando SELinux está habilitado. Currentmode: enforcing cuando SELinux está ejecutándose en modo obligatorio. Policy fromconfig file: targeted cuando se está utilizando una política dirigida.

2. Como usuario root, ejecute el comando touch /var/www/html/test2file para crear unarchivo.

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 queestá mapeado en el usuario SELinux unconfined_u ha creado el archivo. RBAC se utiliza paralos procesos, no para los archivos. Las funciones no tienen sentido en los archivos - la funciónobject_r es una función general utilizada para los archivos (sobre sistemas de archivos dealmacenamiento persistente y de red). Dentro del directorio /proc/, los archivos relacionados

Page 17: Administración de Servicios Confinados · 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

Procesos no confinados

9

con procesos pueden utilizar la función system_r role.2 El tipo httpd_sys_content_t permiteque el proceso httpd pueda acceder a este archivo.

4. El comando chcon re etiqueta archivos; sin embargo, tales modificaciones en el etiquetadono sobreviven cuando el sistema de archivos es re etiquetado nuevamente. Para que lasmodificaciones sean permanentes de modo que sobrevivan a nuevos re etiquetados del sistemade 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é enejecución:

$ /sbin/service httpd statushttpd is stopped

SI el resultado es diferente, ejecute el comando service httpd stop como usuario root paradetener el proceso httpd:

# /sbin/service httpd stopStopping httpd: [ OK ]

6. Para hacer que el proceso httpd sea ejecutado de manera no confinada, ejecute el siguientecomando como usuario root para modificar el tipo de /usr/sbin/httpd, a un tipo que no setraslade 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 seencuentre 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 startStarting httpd: [ OK ]

9. Ejecute el comando ps -eZ | grep httpd para conocer los procesos httpd que estánejecutándose en el dominio unconfined_t domain:

$ ps -eZ | grep httpdunconfined_u:system_r:unconfined_t 7721 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7723 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7724 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7725 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7726 ? 00:00:00 httpd

Page 18: Administración de Servicios Confinados · 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

Capítulo 3. Política dirigida

10

unconfined_u:system_r:unconfined_t 7727 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7728 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7729 ? 00:00:00 httpdunconfined_u:system_r:unconfined_t 7730 ? 00:00:00 httpd

10. Trasládese a un directorio sobre el que su usuario Linux tenga permisos de escritura, y ejecuteel comando wget http://localhost/test2file. A no ser que existen modificaciones a laconfiguración predeterminada, este comando funciona:

--2008-09-07 01:41:10-- http://localhost/test2fileResolving localhost... 127.0.0.1Connecting to localhost|127.0.0.1|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 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 eltipo samba_share_t, httpd es ejecutado en el dominio no confinado unconfined_t, y nopuede utilizar reglas DAC, y por lo tanto, el comando wget funciona. Si httpd hubiera estadoejecutá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. Comoel usuario root, ejecute el comando restorecon -v /usr/sbin/httpd para restaurar elcontexto predeterminado de SELinux para /usr/sbin/httpd:

# /sbin/restorecon -v /usr/sbin/httpdrestorecon 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 seencuentre 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 restartStopping httpd: [ OK ]Starting httpd: [ OK ]# ps -eZ | grep httpdunconfined_u:system_r:httpd_t 8880 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8882 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8883 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8884 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8885 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8886 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8887 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8888 ? 00:00:00 httpdunconfined_u:system_r:httpd_t 8889 ? 00:00:00 httpd

Page 19: Administración de Servicios Confinados · 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

Procesos no confinados

11

13. Como usuario root, ejecute el comando rm -i /var/www/html/test2file para eliminar elarchivo test2file.

14. Si no necesita que httpd esté ejecutándose, como usuario root ejecute el comando servicehttpd stop para detener httpd:

# /sbin/service httpd stopStopping httpd: [ OK ]

Los ejemplos en estas secciones mostraron de qué manera pueden protegerse los datos de unproceso confinado que ha sido comprometido (protegido por SELinux), así como de qué manera losdatos son más accesibles a un atacante desde un proceso no confinado comprometido (que no seencuentre protegido por SELinux).

Page 20: Administración de Servicios Confinados · 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

12

Page 21: Administración de Servicios Confinados · 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

13

El servidor HTTP ApacheDe la página Apache HTTP Server Project1:

"El Proyecto servidor HTTP Apache es un esfuerzo por desarrollar y mantener un servidor HTTP decódigo abierto para sistemas operativos modernos, incluyendo UNIX y Windows NT. El objetivo deeste proyecto es el de ofrecer un servidor seguro, eficiente y extendible que ofrezca servicios HTTPsincronizados con los stándares HTTP actuales". 2

En Fedora, el paquete httpd ofrece el Servidor HTTp Apache. Ejecute rpm -q httpd para saber sihttpd ya se encuentra instalado. Si no lo está, y desea utilizarlo, ejecute como usuario root el siguientecomando para instalarlo:

yum install httpd

4.1. El servidor HTTP Apache y SELinuxCuando SELinux se encuentra habilitado, el servidor HTTP Apache (httpd) se ejecuta de maneraconfinada por defecto. Los procesos confinados son ejecutados en sus propios dominios, y estosson diferentes de otros procesos confinados. Si un proceso confinado se ve comprometido por unatacante, de acuerdo al tipo de política configurada en SELinux, el acceso del atacante al resto delos recursos es limitado, y por ende, el daño será menor. El ejemplo que ofrecemos a continuaciónmuestra los procesos httpd ejecutándose en su propio dominio. El ejemplo presupone que elpaquete httpd se encuentra instalado:

1. Ejecute el comando getenforce para confirmar que SELinux esté ejecutándose en modoobligatorio:

$ getenforceEnforcing

El comando getenforce devuelve el resultado Enforcing cuando SELinux se esté ejecutandoen modo obligatorio.

2. Ejecute el comando service httpd start como usuario root para iniciar httpd:

# service httpd startStarting httpd: [ OK ]

3. Ejecute el comando ps -eZ | grep httpd para observar los procesos httpd:

$ ps -eZ | grep httpdunconfined_u:system_r:httpd_t:s0 2850 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2852 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2853 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2854 ? 00:00:00 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 (eninglés): http://httpd.apache.org/. Copyright © 2010 The Apache Software Foundation. Accessed 1 March 2010.

Page 22: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

14

unconfined_u:system_r:httpd_t:s0 2855 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2856 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2857 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2858 ? 00:00:00 httpdunconfined_u:system_r:httpd_t:s0 2859 ? 00:00:00 httpd

El contexto SELinux asociado con los procesos httpd esunconfined_u:system_r:httpd_t:s0. La segunda última parte del contexto, httpd_t, esel tipo. Un tipo define un dominio para los procesos, y un tipo para los archivos. En este caso, losprocesos 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 eshttpd_t), interactúan con archivos, otros procesos, y con el sistema en general. Los archivos debenestar etiquetados correctamente para permitir el acceso de httpd a ellos. Por ejemplo, httpd, puedeleer archivos etiquetados con el tipo httpd_sys_content_t, pero no puede escribir en ellos, ni aúncuando lo permitan los permisos Linux. Los booleanos deben definirse con valor "on" para permitirdeterminados comportamientos: ciertos scripts que permiten el acceso a la red, habilitando a httpdpara que pueda acceder a sistemas de archivos NFS y CIF5; o que a httpd se le permita ejecutarscripts CGI (Common Gateway Interface).

Cuando /etc/httpd/conf/httpd.conf se encuentre configurado de modo tal que httpdescuche 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 puertoa la configuración de políticas de SELinux. El ejemplo que ofrecemos a continuación demuestracomo configurar httpd para que escuchar sobre un puerto que no se encuentre definido en laspolí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 escucheexitosamente un puerto no estándar que no se encuentre todavía definido en la política. Estosejemplos presuponen que el paquete httpd se encuentra instalado. Ejecute cada comando comousuario root:

1. Ejecute el comando service httpd status para confirmar que httpd no esté ejecutándose:

# service httpd statushttpd is stopped

Si la salida es diferente, ejecute el comando service httpd stop para detener el proceso:

# service httpd stopStopping httpd: [ OK ]

2. Ejecute el comando semanage port -l | grep -w http_port_t para conocer los puertosque SELinux le permite escuchar a httpd:

# semanage port -l | grep -w http_port_thttp_port_t tcp 80, 443, 488, 8008, 8009, 8443

3. Edite el archivo /etc/httpd/conf/httpd.conf como usuario root. Configure la opciónListen de modo que liste los puertos que no están configurados en el archivo de configuraciónde políticas SELinux para httpd. En nuestro ejemplo, httpd se encuentra configurado paraescuchar el puerto 12345:

Page 23: Administración de Servicios Confinados · 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

El servidor HTTP Apache y SELinux

15

# 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:80Listen 127.0.0.1:12345

4. Ejecute el comando service httpd start para iniciar httpd:

# service httpd startStarting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345no listening sockets available, shutting downUnable 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, elnecesario 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 queescuche sobre el nuevo puerto:

# service httpd startStarting httpd: [ OK ]

7. Ahora que SELinux ha sido configurado para permitir que httpd escuche en un puerto noestá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 unaconexión telnet en el puerto específico y envié un comando HTTP GET de la siguiente manera:

# telnet localhost 12345Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.GET / HTTP/1.0

HTTP/1.1 200 OKDate: Tue, 31 Mar 2009 13:12:10 GMTServer: Apache/2.2.11 (Fedora)Accept-Ranges: bytesContent-Length: 3918Content-Type: text/html; charset=UTF-8

Page 24: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

16

[...continues...]

4.2. TiposEl 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 dominiopara 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 undominio accediendo a otro dominio. Los accesos sólo son permitidos si existe una regla específica depolí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/htmldrwxr-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 nuevoarchivo.

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 sobreellos, ni siquiera cuando los permisos Linux así lo permitan. La política SELinux define los tipos delos procesos en ejecución dentro del dominio httpd_t (donde es ejecutado httpd). Esto ayuda aprevenir que los procesos accedan a archivos que habían sido destinados a ser utilizados por otrosprocesos 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 archivosetiquetaodos con el tipo samba_share_t (destinado a Samba). Además, los archivos en losdirectoriorios personales de los usuarios son etiquetados con el tipo user_home_t: por defecto, estoevita 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ásflexible:

httpd_sys_content_tUtilice este tipo para contenido web estático, como ser por ejemplo, archivos .html utilizados porun sitio web estático. Los archivos etiquetados con este tipo son accesibles (sólo para lectura) porhttpd y por scripts ejecutados por httpd. Por defecto, los archivos y los directorios etiquetados

Page 25: Administración de Servicios Confinados · 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

Tipos

17

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/ sonetiquetados con el tipo httpd_sys_content_t.

httpd_sys_script_exec_tUtilice este tipo para programas que quiera que sean ejecutados por httpd. Este tipo escomú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, etiquetelos scripts con el tipo httpd_sys_script_exec_t y defina el booleano httpd_enable_cgicon el valor "on". Los scripts etiquetados con httpd_sys_script_exec_t se ejecutanen el dominio httpd_sys_script_t cuando son ejecutados con httpd. El dominiohttpd_sys_script_t posee acceso a otros dominios del sistema, como ser por ejemplo,postgresql_t y mysqld_t.

httpd_sys_content_rw_tLos archivos etiquetados con este tipo pueden ser escritos con scripts etiquetados con el tipohttpd_sys_script_exec_t, pero no pueden ser modificados por scripts etiquetados concualquier otro tipo. Debe utilizar el tipo httpd_sys_content_rw_t para etiquetar archivos queserán leidos y escritos por scripts etiquetados con el tipo httpd_sys_script_exec_t.

httpd_sys_content_ra_tLos archivos etiquetados con este tipo pueden ser agregarse otros mediante la utilizaciónde scripts etiquetados con el tipo httpd_sys_script_exec_t, pero no puedenser modificados por scripts etiquetados con cualquier otro tipo. Debe utilizarse el tipohttpd_sys_content_ra_t para etiquetar archivos que podrán ser leídos y agregados porscripts etiquetados con el tipo httpd_sys_script_exec_t.

httpd_unconfined_script_exec_tLos scripts etiquetados con este tipo se ejecutan sin la protección de SELinux. Utilice solo estetipo para scripts complejos, y luego de haber agotado todas las demás opciones. Es mejor utilizareste tipo en lugar de deshabilitar la protección de SELinux para httpd, o para la totalidad delsistema.

Cómo modificar el contexto SELinuxEl tipo para los archivos y los directorios puede ser modificado con el comando chcon. Lasmodificaciones realizadas con chcon no sobreviven a un re-etiquetado del sistema de archivos, o aun comando restorecon. La política de SELinux controla si los usuarios se encuentran habilitadoso no para modificar el contexto de SELinux aplicado a cualquier archivo dado. El ejemplo queofrecemos a continuación muestra la creación de un nuevo directorio y de un archivo index.htmlpara ser utilizado por httpd, y como son etiquetados ambos (archivo y directorio) para que httpdpueda acceder a ellos.

1. Ejecute el comando mkdir -p /my/website como usuario root para crear una estructura dedirectorio 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 decontexto, podrían ser etiquetados con el tipo default_t. Este tipo es inaccesible a los serviciosconfinados:

$ ls -dZ /mydrwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my

Page 26: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

18

3. Ejecute el comando chcon -R -t httpd_sys_content_t /my/ como usuario root paramodificar el tipo del directorio /my/ (y sus subdirectorios), a un tipo capaz de ser accedidopor httpd. Ahora, los archivos creados bajo el archivo /my/website/ heredan el tipohttpd_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 agreganmodificaciones a la configuración archivo-contexto. Entonces, ejecute el comando restoreconque lee la configuración archivo-contexto, para poder aplicar la modificación del etiquetado. En elejemplo que ofrecemos a continuación mostramos la creación de un nuevo directorio y de un archivoindex.html para ser utilizado por httpd, modificando persistentemente la etiqueta tanto deldirectorio 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 dedirectorio 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 laconfiguració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 unnuevo archivo.

4. Ejecute el comando restorecon -R -v /my/ como usuario root para aplicar lasmodificaciones del etiquetado (restorecon lee la configuración archivo-contexto que fuemodificada 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:s0restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0

4.3. BooleanosSELinux 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 SELinuxde qué manera usted está ejecutando servicios. Esto puede ser logrado mediante los Booleanos quepermiten que determinadas partes de SELinux puedan ser modificadas en el tiempo de ejecución, sinningún tipo de conocimiento relacionado con la escritura de políticas SELinux. Esto permite cambios

Page 27: Administración de Servicios Confinados · 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

Booleanos

19

como permitir el acceso de los servicios a sistemas de archivos NFS, sin por ello tener que recargar orecompilar políticas de SELinux.

Para modificar el estado de un Booleano, utilice el comando setsebool. Por ejemplo, para encenderel 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 deoff, como mostramos a continuación:

# setsebool -P allow_httpd_anon_write off

NotaNo utilice la opción -P si no desea que las modificaciones de setsebool continúenaún luego de reiniciar el sistema.

A continuación ofrecemos una descripción de Booleanos disponibles y muy utilizados, que influyen enla forma en que httpd se ejecuta:

allow_httpd_anon_writeCuando está deshabilitado, este Booleano permite que httpd solo tenga acceso de lectura sobrearchivos 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 serpor ejemplo, directorios públicos que contengan archivos para un servicio de transferencia dearchivos público.

allow_httpd_mod_auth_ntlm_winbindHabilitar 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_pamHabilitar este Booleano permite acceso a mecanismos de autenticación PAM, mediante el módulomod_auth_pam de httpd.

allow_httpd_sys_script_anon_writeEste Booleano define si los scripts HTTP tienen o no permitido acceso de escritura sobrearchivos etiquetados con el tipo public_content_rw_t, como los utilizados en un servicio detransferencia de archivos público.

httpd_builtin_scriptingEste Booleano define el acceso a la creación de scripts httpd. A menudo es necesario tener esteBooleano habilitado para contenidos PHP.

httpd_can_network_connectEstando deshabilitado, este Booleano evita que los scripts y módulos HTTP puedan iniciar unaconexión a una red o a un puerto remoto. Encienda este Booleano para permitir este tipo deacceso.

Page 28: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

20

httpd_can_network_connect_dbCuando está deshabilitado, este Booleano evita que tanto scripts como módulos puedan iniciaruna conexión con bases de datos de servidores. Enciéndalo para permitir este tipo de acceso.

httpd_can_network_relayEncienda este Booleano cuando httpd esté siendo utilizado como un proxy de reenvío o dereverso.

httpd_can_sendmailCuando se encuentra deshabilitado, este Booleano evita que los módulos HTTP sean capacesde 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_avahiCuando se encuentra deshabilitado, este Booleano niega el acceso de httpd al servicio avahimediante D-Bus. Encienda este Booleano para permitir este acceso.

httpd_enable_cgiCuando se encuentre deshabilitado, este Booleano evita que httpd pueda ejecutar scriptsCGI. Enciéndalo para permitir que httpd los ejecute (recuerde que los scripts CGI deben estaretiquetados con el tipo httpd_sys_script_exec_t).

httpd_enable_ftp_serverEncender este Booleano permitirá que httpd pueda escuchar en el puerto FTP y comportarsecomo un servidor FTP.

httpd_enable_homedirsCuando se encuentre deshabilitado, este Booleano evita que httpd pueda acceder a losdirectorios personales del usuario. Enciéndalo para permitir que httpd pueda acceder a esosdirectorios. Por ejemplo, al contenido de /home/*/.

httpd_execmemCuando se encuentre habilitado, este Booleano permite que httpd pueda ejecutar programasque necesitan direcciones de memoria que son tanto ejecutables como de escritura. Tomando encuenta un criterio relacionado con la seguridad, no se recomienda habilitar a este Booleano yaque reduce la protección contra desbordamientos del búfer. Sin embargo, determinados módulosy aplicaciones (como aquellas relacionadas con Java y Mono), necesitan estos privilegios.

httpd_ssi_execEste Booleano define cuándo ejecutar elementos SSI (Server Side Include) en una página web, ycuando no hacerlo.

httpd_tmp_execHabilitar este Booleano permite que httpd ejecute archivos de directorios temporales.

httpd_tty_commEste Booleano define si httpd tiene o no permitido acceder a la terminal de control. Por logeneral este acceso no es necesario, pero sin embargo, en algunos casos como ser por ejemploel de la configuración de un certificado SSL, el acceso a la terminal es requerido para presentar yprocesar peticiones de contraseñas.

Page 29: Administración de Servicios Confinados · 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

Ejemplos de configuración

21

httpd_unifiedCuando se encuentre habilitado, este Booleano le otorga a httpd_t un acceso total a todoslos tipos de httpd (es decir, para ejecutar, leer o escribir sys_content_t). Cuando se encuentredeshabilitado, hay una separación en curso entre contenidos web de solo lectura, ejecutable, ode escritura. Deshabilitar este Booleano asegura un nivel adicional de seguridad, pero agregala tarea administrativo de tener que etiquetar individualmente scripts y demás contenidos webbasados en el tipo de acceso a los archivos que cada uno debería tener.

httpd_use_cifsEncienda este Booleano para permitir que httpd pueda acceder a los archivos de sistemasde archivos CIFS que hayan sido etiquetados con el tipo cifs_t, como ser por ejemplo, lossistemas de archivos montados mediante Samba.

httpd_use_gpgHabilitar este Booleano permite que httpd utilice cifrados GPG.

httpd_use_nfsEncienda este Booleano para permitir que httpd pueda acceder a sistemas de archivos NFSque hayan sido etiquetados con el tipo nfs_t, como ser por ejemplo los sistemas de archivosmontados a través de NFS.

4.4. Ejemplos de configuraciónLos siguientes ejemplos ofrecen una demostración con casos reales de cómo SELinux complementael 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áticoPara crear un sitio web estático, etiquete los archivos .html de tal sitio con el tipohttpd_sys_content_t. Por defecto, el servidor HTTP Apache no puede escribir sobre archivosque hayan sido etiquetados con el tipo httpd_sys_content_t. El ejemplo que ofrecemos acontinuació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 nivelsuperior.

2. Como usuario root, cree un archivo denominado /mywebsite/index.html. Copie y pegue elsiguiente 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 usuarioroot para agregar la modificación del etiquetado en la configuración archivo-contexto.

# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"

Page 30: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

22

4. Ejecute el comando restorecon -R -v /mywebsite como usuario root para realizar lasmodificaciones del etiquetado:

# restorecon -R -v /mywebsiterestorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0restorecon 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. Comentela opción DocumentRoot. Agregue una opción DocumentRoot "/mywebsite". Luego deeditarlo, 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 delservidor HTTP Apache. Si este servidor se encuentra detenido, ejecute el comando servicehttpd start como usuario root para poder reiniciar el servicio (esto también hace que entre envigencia 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 CIFSPor defecto, NFS los montajes NFS en el cliente se encuentran etiquetados con un contextopredeterminado definido por las políticas para sistemas de archivos NFS. En políticas comunes, estecontexto predeterminado utiliza el tipo nfs_t. También, de manera predeterminada, los montajesSamba compartidos en el cliente se encuentran etiquetados con un contexto predeterminado definidopor 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 archivosetiquetados con los tipos nfs_t o cifs_t. Esto puede prevenir que sean montados los sistemasde archivos etiquetados con estos tipos, y por ende ser leídos o exportados por otros servicios. LosBooleanos pueden ser encendidos o apagados para controlar qué servicios tienen permitido el accesoa los tipos nfs_t y cifs_t.

Encienda el Booleano httpd_use_nfs para permitir que httpd tenga acceso a (y a la vez quepueda compartir) sistemas de archivos NFS etiquetados con el tipo nfs_t. Ejecute el comandosetsebool 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 puedacompratir) sistemas de archivos CIFS etiquetados con el tipo cifs_t. Ejecute el comandosetsebool como usuario root para encender este Booleano:

Page 31: Administración de Servicios Confinados · 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

Cómo compartir archivos entre los servicios

23

setsebool -P httpd_use_cifs on

NotaNo utilice la opción -P si no desea que las modificaciones de setsebool continúenaún luego de reiniciar el sistema.

4.4.3. Cómo compartir archivos entre los serviciosEl tipo Obligatorio ayuda a evitar que los procesos accedan a archivos destinados a ser utilizados porotros procesos diferentes. Por ejemplo, por defecto, Samba no puede leer archivos etiquetados conel 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 losarchivos 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 esedirectorio y esos archivos puedan ser compartidos (en modo de sólo lectura) por el servidor HTTPApache, FTP, rsync y Samba:

1. Ejecute el comando mkdir /shares como el usuario root para crear un nuevo directorio de nivelsuperior para compartir archivos entre diferentes servicios.

2. Los archivos y los directorios que no coincidan con un modelo de archivo-configuración decontexto, podrían ser etiquetados con el tipo default_t. Este tipo es inaccesible a los serviciosconfinados:

$ ls -dZ /sharesdrwxr-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 queofrecemos 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 lecturaal servidor HTTP Apache, FTP, rsync y Samba. ejecute el comando siguiente como usuario rootpara 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 lasmodificaciones en el etiquetado:

Page 32: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

24

# restorecon -R -v /shares/restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0restorecon 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 lospaquetes samba, samba-common, y samba-client se encuentren instalados (los números deversiones podrían diferir):

$ rpm -q samba samba-common samba-clientsamba-3.5.2-59.fc13.i386samba-common-3.5.2-59.fc13.i386samba-client-3.5.2-59.fc13.i386

Si alguno de estos paquetes no se encuentran instalados, instálelos ejecutando el comando yuminstall niombre-del- paquete como usuario root.

2. Edite el archivo /etc/samba/smb.conf como usuario root. Agregue la siguiente entrada al finalde este archivo para compartir el directorio /shares/ a través de Samba:

[shares]comment = Documents for Apache HTTP Server, FTP, rsync, and Sambapath = /sharespublic = yeswriteable = 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 unacuenta Samba, donde nombre-de-usuario es un usuario Linux existente del sistema. Porejemplo, smbpasswd -a testuser genera una cuenta Samba para el usuario Linux testuser:

# smbpasswd -a testuserNew SMB password: Enter a passwordRetype new SMB password: Enter the same password againAdded user testuser.

Ejecutar el comando smbpasswd -a nombre-de-usuario, donde nombre-de-usuariosea el nombre de usuario de una cuenta Linux que no exista en el sistema, provocará un errorCannot locate Unix account for 'username'!.

4. Ejecute el comando service smb start como usuario root para iniciar el servicio Samba:

service smb startStarting SMB services: [ OK ]

5. Ejecute el comando smbclient -U nombre-de-usuario -L localhost para conocer lalista de los elementos compartidos disponibles, donde nombre-de-usuario es la cuenta Samba

Page 33: Administración de Servicios Confinados · 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

Cómo compartir archivos entre los servicios

25

agregada en el paso 3. Cuando le sea pedida una contraseña, ingrese la que ha indicado para lacuenta Samba del paso 3 (los números de las versiones podrían diferir):

$ smbclient -U username -L localhostEnter 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 SambaIPC$ IPC IPC Service (Samba Server Version 3.5.2-59)username Disk Home DirectoriesDomain=[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. Estedirectorio será utilizado para montar los elementos compartidos shares de Samba.

7. Ejecute el siguiente comando como usuario root para montar los elementos compartidos sharesde 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é siendocompartido 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 (elnúmero de las versiones podría diferir):

$ rpm -q httpdhttpd-2.2.11-6.i386

Si este paquete no se encuentra instalado, ejecute el comando yum install httpd comousuario root para instalarlo.

2. Trasládese al directorio /var/www/html/. Ejecute el siguiente comando como usuario root paracrear un enlace (denominado shares) hacia el directorio /shares/:

Page 34: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

26

ln -s /shares/ shares

3. Ejecute el comando service httpd start como usuario root para iniciar el Servidor HTTPApache:

service httpd startStarting httpd: [ OK ]

4. Utilice un navegador web para navegar hasta http://localhost/shares. Observará elarchivo /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 archivoindex.html.

2. Ejecute el comando touch /shares/file{1,2,3} como usuario root para crear tres archivosen /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 delservidor HTTP Apache. Si el servidor se encuentra detenido, ejecute el comando servicehttpd start.

4. Utilice un navegador web para navegar hasta http://localhost/shares. Se presenta ellistado de un directorio:

Page 35: Administración de Servicios Confinados · 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

Cómo modificar los números de puertos

27

4.4.4. Cómo modificar los números de puertosDe acuerdo a la configuración de la política, los servicios podrían estar autorizados a ejecutarseexclusivamente 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 elcomando semanage port -l | grep -w "http_port_t" como usuario root para conocer lospuertos sobre los que SELinux permite escuchar a httpd:

# semanage port -l | grep -w http_port_thttp_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, o8443. Si /etc/httpd/conf/httpd.conf está configurado para que httpd pueda escuchar sobrecualquier 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ónListen ofrezca un puerto que no ha sido configurado en la política de SELinux para httpd. Enel ejemplo que ofrecemos a continuación configuramos a httpd para que pueda escuchar ladirecció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:80Listen 10.0.0.1:12345

2. Ejecute el comando semanage port -a -t http_port_t -p tcp 12345 como usuarioroot 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 paraconfirmar que el puerto haya sido agregado:

Page 36: Administración de Servicios Confinados · 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

Capítulo 4. El servidor HTTP Apache

28

# semanage port -l | grep -w http_port_thttp_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 -thttp_port_t -p tcp 12345 como usuario root para eliminarlo de la configuración de políticas.

Page 37: Administración de Servicios Confinados · 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

29

SambaDesde el sitio web de Samba1

"Samba es una suite de Fuente Abierta2/Software Libre3, que se desde 19924, provee servicios dearchivos e impresión a todo tipo de clientes SMB/CIFS, incluyendo las numerosas versiones delsistema operativo Microsoft Windows. Samba está disponible libremente bajo la GNU Licencia PúblicaGeneral5.".6

En Fedora, el paquete samba provee el servidor Samba. Ejecute rpm -q samba para ver si elpaquete samba está instalado. Si este no está instalado y quiere usar Samba, ejecute el siguientecomando como usuario root para instalarlo:

yum install samba

5.1. Samba y SELinuxCuando 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 serviciosconfinados. El siguiente ejemplo demuestra el proceso smbd ejecutándose en su propio dominio. Esteejemplo asume que el paquete samba está instalado:

1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:

$ getenforceEnforcing

El comando getenforce retorna Enforcing cuando SELinux está corriendo en modoobediente.

2. Ejecute service smbd start como usuario root para iniciar smbd:

service smb startIniciando servicios SMB: [ OK ]

3. Ejecute ps -eZ | grep smb para ver el proceso smbd:

$ ps -eZ | grep smbunconfined_u:system_r:smbd_t:s0 16420 ? 00:00:00 smbdunconfined_u:system_r:smbd_t:s0 16422 ? 00:00:00 smbd

1 http://samba.org/2 http://www.opensource.org/3 http://www.gnu.org/philosophy/free-sw.html4 http://us1.samba.org/samba/docs/10years.html5 http://us1.samba.org/samba/docs/GPL.htmlPrimer párrafo del sitio web de Samba: http://samba.org. Accedido el 20 Enero de 2009.

Page 38: Administración de Servicios Confinados · 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

Capítulo 5. Samba

30

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 ytipos 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ónde los mismos. Por ejemplo, smbd puede leer y escribir en archivos etiquetados con el tiposamba_share_t, pero por defecto, no puede acceder a los archivos etiquetados con el tipohttpd_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 permitirque directorios home y sistemas de archivos NFS puedan ser exportados a través de Samba, comotambién permitir a Samba actuar como controlador de dominio.

5.2. TiposEtiquete 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 tiposamba_share_t: Los Booleanos pueden estar activados para compartir ciertos archivos ydirectorios. 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. Noetiquete archivos manualmente con el tipo samba_etc_t. Si los archivos en /etc/samba/ no estánetiquetados correctamente, ejecute restorecon -R -v /etc/samba como usuario root pararestablecer los archivos a su contexto por defecto. Si /etc/samba/smb.conf no está etiquetadocon el tipo samba_etc_t, el comando service smb start puede fallar y SELinux puede registrarla denegación. El siguiente es un ejemplo de denegación registrado en /var/log/messagescuando /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-bb50-e4cd05ab18af

5.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando Samba:

allow_smbd_anon_writeTeniendo 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_dirsTeniendo este Booleano habilitado permite a Samba crear nuevos directorios home de formaindependiente. Esto se suele hacer por mecanismos tales como PAM.

samba_domain_controllerCuando 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 ypasswd.

Page 39: Administración de Servicios Confinados · 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

Ejemplos de configuración

31

samba_enable_home_dirsHabilitando este Booleano permite a Samba compartir directorios home de usuarios.

samba_export_all_roExportar cualquier archivo o directorio, permitiendo solo lectura. Esto permite que archivos ydirectorios que no están etiquetados con el tipo samba_share_t puedan ser compartidos através de Samba. Cuando el Booleano samba_export_all_ro esta activado, pero el Booleanosamba_export_all_rw esta desactivado, el acceso de escritura a recursos compartidoscon 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_rwExportar cualquier archivo o directorio, permitiendo lectura y escritura. Esto permite que archivosy directorios que no están etiquetados con el tipo samba_share_t puedan ser exportados através de Samba. Los permisos en /etc/samba/smb.conf y los permisos Linux deben estarconfigurados para permitir el acceso a escritura.

samba_run_unconfinedTeniendo este Booleano habilitado permite a Samba ejecutar scripts no confinados en el directorio/var/lib/samba/scripts.

samba_share_fusefsEste Booleano debe estar habilitado para que Samba pueda compartir sistemas de archivosfusefs.

samba_share_nfsDeshabilitando este Booleano previene que smbd tenga acceso completo a recursos compartidoscon NFS vía Samba. Habilitando este Booleano permitirá a Samba compartir sistemas dearchivos NFS.

use_samba_home_dirsHabilite este Booleano para usar un servidor remoto para directorios home de Samba.

virt_use_sambaPermite a virt manejar archivos CIFS.

5.4. Ejemplos de configuraciónLos siguientes ejemplos proveen demostraciones del mundo real de como SELinux complementa alservidor 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 paquetessamba, samba-common y samba-client están instalados. Si alguno de estos paquetes no estainstalado, instale el mismo usando el comando yum install nombre-paquete como usuarioroot.

2. Ejecute mkdir /micomparticion como usuario root para crear un directorio de nivel superiorpara compartir archivos usando Samba.

Page 40: Administración de Servicios Confinados · 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

Capítulo 5. Samba

32

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 montadocorrectamente.

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 laconfiguració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 deetiqueta:

# restorecon -R -v /micomparticionrestorecon reset /micomparticion context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0restorecon 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 paracompartir el directorio /micomparticion/ usando Samba:

[micomparticion]comment = Mi comparticionpath = /micomparticionpublic = yeswriteable = 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 nombreusuarioes un usuario Linux existente. Por ejemplo, smbpasswd -a usuariotest crear una cuentapara el usuario Linux usuariotest:

# smbpasswd -a usuariotestNew SMB password: Ingrese la contraseñaRetype new SMB password: Ingrese la misma contraseña de nuevoAdded user usuariotest.

Ejecutando smbpasswd -a nombreusuario, cuando nombreusuario es el nombre deusuario de una cuenta Linux que no existe en el sistema, causa el error Cannot locate Unixaccount for 'nombreusuario'!

8. Ejecute service smb start como usuario root para iniciar el servicio Samba:

service smb startIniciando servicios SMB: [ OK ]

Page 41: Administración de Servicios Confinados · 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

Compartiendo un sitio web

33

9. Ejecute smbclient -U nombreusuario -L localhost para listar los recursos compartidosdisponibles, donde nombreusuario es la cuenta Samba agregada en el paso 7. Cuando sesolicite la contraseña, ingrese la contraseña asignada para la cuenta Samba en el paso 7 (losnúmeros de versión pueden diferir):

$ smbclient -U nombreusuario -L localhostEnter nombreusuario's password:Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.5.2-59.fc13]

Sharename Type Comment--------- ---- -------micomparticion Disk Mi comparticionIPC$ IPC IPC Service (Samba Server Version 3.5.2-59.fc13)nombreusuario Disk Home DirectoriesDomain=[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 micomparticioncompartido con Samba en /test/, reemplazando nombreusuario con el nombre de usuariodel 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 webEsto 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 Booleanosamba_export_all_ro para compartir cualquier archivo o directorio (sin tener en cuenta la etiquetaactual), permitiendo solo lectura, o el Booleano samba_export_all_rw para compartir cualquierarchivo 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 compartirese 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 elsiguiente contenido en el archivo /var/www/html/archivo1.html:

Page 42: Administración de Servicios Confinados · 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

Capítulo 5. Samba

34

<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 archivoarchivo1.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 HTTPApache 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 startIniciando httpd: [ OK ]

4. Ingrese al directorio en que su usuario tiene acceso para escritura, y ejecute el comando wgethttp://localhost/archivo1.html. A menos que existan cambios en la configuración pordefecto, este comando es exitoso:

$ wget http://localhost/archivo1.html--2009-03-02 16:32:01-- http://localhost/archivo1.htmlResolviendo localhost... 127.0.0.1Connecting to localhost|127.0.0.1|:80... conectado.Petición HTTP enviada, esperando respuesta... 200 OKLongitud: 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 paracompartir el directorio /var/www/html/ usando Samba:

[sitioweb]comment = Sitio Web compartidopath = /var/www/html/public = nowriteable = 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 eltipo httpd_sys_content_t, incluso si los permisos Linux lo permiten. Para permitir aSamba el acceso, ejecute el siguiente comando como usuario root para activar el Booleanosamba_export_all_ro:

Page 43: Administración de Servicios Confinados · 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

Compartiendo un sitio web

35

setsebool -P samba_export_all_ro on

No utilice la opción -P si no quiere que los cambios persistan al siguiente reinicio. Nota: activandoel 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 startIniciando servicios SMB: [ OK ]

Page 44: Administración de Servicios Confinados · 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

36

Page 45: Administración de Servicios Confinados · 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

37

File Transfer Protocol (FTP)De la Guía de despliegue de Linux para empresas de Red Hat 5 (en inglés)1:

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 ellonecesitar que el usuario se registre directamente en el equipo remoto, o que tenga conocimientoacerca de cómo utilizar el sistema remoto. Permite que los usuarios accedan a los archivos en lossistemas remotos utilizando un conjunto estándar de comandos simples. 2

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 quetiene vsftpd para manipular numerosas conexiones de manera segura y eficiente, lo convierte en elúnico FTP autónomo ofrecido con Linux para empresas de Red Hat 3

En Fedora, el paquete vsftpd ofrece el Demonio FTP muy seguro. Ejecute el comando rpm -qvsftpd 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 comandocomo usuario root para instalarlo:

yum install vsftpd

6.1. SELinux y FTPCuando SELinux esté ejecutándose, el servidor FTP vsftpd, se ejecuta confinado de maneraprededeterminada. 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 registramediante FTP, no puede ni leer ni escribir sobre los archivos de sus directorios personales: Demanera predeterminada SELinux evita que vsftpd pueda acceder a los directorios personales delos usuarios. Además, también por defecto, vsftpd no tiene acceso a sistemas de archivos NFS oCIFS, y los usuarios anónimos no poseen acceso de escritura, ni siquiera cuando tal tipo de accesose encuentre configurado en /etc/vsftpd/vsftpd.conf. Los Booleanos pueden encenderse parapermitir el acceso mencionado recién.

El ejemplo que ofrecemos a continuación muestra a un usuario autenticado registrándose, y a unanegació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.htmlEl 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-servers-vsftpd. Copyright © 2007 Red Hat, Inc.

Page 46: Administración de Servicios Confinados · 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

Capítulo 6. File Transfer Protocol (FTP)

38

2. En Fedora, de manera predeterminada vsftpd solo permite registrarse a los usuariosanó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 elservicio estaba ejecutándose antes de editar el archivo vsftpd.conf, ejecute el comandoservice vsftpd restart como usuario root para que surtan efecto las modificaciones en laconfiguración :

service vsftpd startStarting vsftpd for vsftpd: [ OK ]

4. Ejecute el comando ftp localhost como el usuario con el que se encuentra registrado en estemomento. Cuando se le pida su nombre, asegúrese de poder observar su nombre de usuario. Siel nombre de usuario es el correcto, presione la tecla Enter, de lo contrario, ingrese el nombrede usuario correcto.

$ ftp localhostConnected to localhost (127.0.0.1).220 (vsFTPd 2.1.0)Name (localhost:username):331 Please specify the password.Password: Enter your password230 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 comandono pueda devolver un listado de directorios:

ftp> ls227 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-4c16-b73f-92f36a1730ce

6. Habilite el Booleano ftp_home_dir ejecutando el comando siguiente como usuario root:

Page 47: Administración de Servicios Confinados · 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

Tipos

39

# setsebool -P ftp_home_dir=1

NotaNo utilice la opción -P si no desea que las modificaciones continúan una vez queel sistema sea reiniciado.

Ejecute nuevamente el comando ls desde el intérprete ftp. ahora que SELinux está permitiendoacceso al directorio personal mediante el Booleano ftp_home_dir, dicho directorio puede serobservado:

ftp> ls227 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 file2226 Directory Send OK.ftp>

6.2. TiposPor defecto, los usuarios anónimos tienen acceso de solo lectura a los archivos contenidosen /var/ftp/ cuando se registren mediante FTP. Este directorio está etiquetado con el tipopublic_content_t, permitiendo acceso de solo lectura, aún cuando el acceso de escritura seencuentre configurado en /etc/vsftpd/vsftpd.conf. El tipo public_content_t es accesibleal 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_tEtiquete a los archivos y a los directorios que haya creado con el tipo public_content_tpara poder compartirlos en modo de solo lectura mediante vsftpd. Otros servicios, como elservidor HTTP Apache, Samba y NFS, también tienen acceso a los archivos etiquetados con estetipo. Los archivos etiquetados con el tipo public_content_t no pueden ser modificados, nisiquiera cuando los permisos Linux así lo permitan. Si necesita acceso de escritura, utilice el tipopublic_content_rw_t.

public_content_rw_tEtiquete a los archivos y a los directorios que haya creado con el tipo public_content_rw_tpara 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 etiquetadoscon este tipo. Sin embargo, deben encenderse los Booleanos correspondientes a cada servicioantes de que esos servicios puedan tener acceso de escritura a los archivos etiquetados con estetipo.

Page 48: Administración de Servicios Confinados · 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

Capítulo 6. File Transfer Protocol (FTP)

40

6.3. BooleanosSELinux 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 SELinuxde qué manera usted está ejecutando servicios. Los Booleanos que describimos a continuación lepermiten informarle a SELinux de qué manera está ejecutando vsftpd:

allow_ftpd_anon_writeCuando se encuentra deshabilitado, este Booleano evita que vsftpd modifique archivos ydirectorios etiquetados como el tipo public_content_rw_t. Encienda este Booleano parapermitir que los usuarios envíen archivos mediante FTP. El directorio al cual los archivos sonenviados debe estar etiquetado con el tipopublic_content_rw_t, y los permisos Linux debenser definidos de acuerdo a ello.

allow_ftpd_full_accessCuando este Booleano esté encendido, sólo los permisos Linux son utilizados para controlarel acceso, y los usuarios autenticados pueden leer y modificar archivos que no se encuentrenetiquetados con los tipos public_content_t o public_content_rw_t.

allow_ftpd_use_cifsTener este Booleano habilitado permite que vsftpd pueda acceder a los archivos y a losdirectorios etiquetados con el tipo cifs_t; por lo tanto, tenerlo habilitado le permite compartirsistemas de archivos montados con Samba a través de vsftpd.

allow_ftpd_use_nfsTener este Booleano habilitado permite que vsftpd tenga acceso a los archivos y directoriosetiquetados con el tipo nfs_t type; por lo tanto, tenerlo habilitado le permite compartir sistemasde archivos montados mediante NFS a través de vsftpd.

ftp_home_dirTener este Booleano habilitado permite que los usuarios autenticados puedan leer y modificararchivos en sus directorios personales. Cuando este Booleano esté apagado, intentar descargarun archivo desde un directorio personal provocará un error similar a 550 Failed to openfile. Una negación de SELinux será registrada en el archivo /var/log/messages.

ftpd_connect_dbPermite que los demonios FTP inicien una conexión con la base de datos.

httpd_enable_ftp_serverPermite que httpd escuche en el puerto FTP y que actúe como un servidor FTP

tftp_anon_writeTener este Booleano habilitado permite acceso TFTP a directorios públicod, como ser por ejemploun área reservada para archivos comunes que, de otra forma, no tendría restricciones de accesoespeciales.

Page 49: Administración de Servicios Confinados · 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

Ejemplos de configuración

41

6.4. Ejemplos de configuración

6.4.1. Cómo enviar datos a un sitio FTPEl ejemplo que ofrecemos a continuación genera un sitio FTP que permite recibir archivos de unusuario dedicado. Crea la estructura de directorio y las modificaciones necesarias en la configuraciónde SELinux:

1. Ejecute el comando mkdir -p /myftp/pub como usuario root para crear un nuevo directoriode nivel superior.

2. Defina los permisos Linux en el directorio /myftp/pub/ para permitir que un usuario Linux tengaacceso de escritura. Nuestro ejemplo modifica el dueño y el grupo (root), y los define como siendoel user1 el dueño, y root el grupo. Reemplace user1 con el nombre de usuarios al que deseeotorgarle 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 modificael modo, permitiendo que el user1 tenga permisos de lectura, escritura y ejecución, y que losmiembros del grupo root puedan leer, escribir y ejecutar permisos. El resto posee permisos delectura y de escritura: esto es necesario para permitir que el servidor HTTP Apache puede leerarchivos desde este directorio.

3. Cuando SELinux esté ejecutándose, los archivos y los directorios deben encontrarsecorrectamente etiquetados para permitir el acceso. No es suficiente definir los permisos deLinux. Los archivos etiquetados con el tipo public_content_t permiten que sean leídospor FTP, el servidor HTTP Apache, Samba y rsync. Los archivos etiquetados con el tipopublic_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 eltipo public_content_rw_t. Etiquete el directorio de nivel superior (/myftp/) con el tipopublic_content_t, para evitar que archivos copiados o recientemente creados del directorio /myftp/ sean sobrescritos o modificados por otros servicios. Ejecute el siguiente comando comousuario 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 deletiquetado:

# 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:

Page 50: Administración de Servicios Confinados · 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

Capítulo 6. File Transfer Protocol (FTP)

42

$ 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 puedanenviar archivos. SELinux permite a FTP escribir sobre directorios etiquetados con el tipopublic_content_rw_t. Nuestro ejemplo utiliza el directorio /myftp/pub/ como el directorioal que FTP tiene permitido escribir. Ejecute el siguiente comando como usuario root para agregarla 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 lamodificación del etiquetado:

# restorecon -R -v /myftp/pubrestorecon 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 vsftpdpueda modificar archivos etiquetados con el tipo public_content_rw_t. Ejecute el siguientecomando 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 elsistema.

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 deldirectorio /myftp/pub/:

1. Ejecute el comando cd ~/ para transladarse a su directorio personal. Entonces, ejecute elcomando mkdir myftp para crear un directorio en donde almacenar los archivos que luegoserá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 Booleanoallow_ftpd_anon_write se encuentre encendido:

$ getsebool allow_ftpd_anon_writeallow_ftpd_anon_write --> on

Page 51: Administración de Servicios Confinados · 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

Cómo enviar datos a un sitio FTP

43

Si este Booleano está apagado, ejecute el comando setsebool -Pallow_ftpd_anon_write on como usuario root para encenderlo. No utilice la opción -P si nodesea 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 startStarting vsftpd for vsftpd: [ OK ]

5. Ejecute el comando ftp localhost. Cuando se le pida un nombre de usuario, ingrese elnombre de usuario de aquel que tenga permisos de escritura, y luego ingrese la contraseñaadecuada para dicho usuario:

$ ftp localhostConnected to localhost (127.0.0.1).220 (vsFTPd 2.1.0)Name (localhost:username):331 Please specify the password.Password: Enter the correct password230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp>

Page 52: Administración de Servicios Confinados · 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

44

Page 53: Administración de Servicios Confinados · 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

45

Sistema de Archivos en Red (NFS)Fuente: Guía de Referencia de Red Hat Linux 1:

NFS (las iniciales en inglés de Network File System) permite a los equipos montar particionesen un sistema remoto y utilizarlas como si fueran sistemas de archivos locales. Esto permite quelos 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 comandorpm -q nfs-utils para saber si este paquete se encuentra instalado. Si no está instalado y deseautilizar NFS, ejecute el siguiente comando como usuario root para instalarlo:

yum install nfs-utils

7.1. NFS y SELinuxCuando SELinux esté ejecutándose, los demonios NFS se encuentran confinados de manerapredeterminada. La política de SELinux no permite que NFS comparta archivos por defecto. Si quierecompartir particiones NFS, esto puede configurarse mediante los Booleanos nfs_export_all_roy nfs_export_all_rw, como lo explicamos más abajo. Sin embargo, estos Booleanos noson necesarios cuando los archivos a ser compartidos se encuentran etiquetados con los tipospublic_content_t o public_content_rw_t. NFS puede compartir archivos etiquetados conestos tipos aún si los Booleanos nfs_export_all_ro y nfs_export_all_rw se encuentranapagados.

7.2. TiposPor defecto, los sistemas de archivos NFS montados en el lado del cliente son etiquetados con uncontexto predeterminado definido por la política establecida para sistemas de archivos NFS. Enpolíticas comunes, este contexto predeterminado utiliza el tipo nfs_t. Los siguientes tipos sonutilizados con NFS. Diferentes tipos le permiten configurar un acceso más flexible:

var_lib_nfs_tEste 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 lasmodificaciones a los valores predeterminados, ejecute el comando restorecon -R -v /var/lib/nfs como usuario root.

nfsd_exec_tEl archivo /usr/sbin/rpc.nfsd es etiquetado con el tipo nfsd_exec_t, al igual que otrasbibliotecas y archivos ejecutables del sistema que estén relacionados con NFS. Los usuarios nodeberían etiquetar ningún archivo con este tipo. nfsd_exec_t se modicaría a nfs_t.

7.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios 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

Page 54: Administración de Servicios Confinados · 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

Capítulo 7. Sistema de Archivos en Red (NFS)

46

esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando NFS:

allow_ftpd_use_nfsCuando se encuentre habilitado. este Booleano permite que ftpd tenga acceso a montajes NFS.

allow_nfsd_anon_writeCuando se encuentre habilitado, este Booleano permite que nfsd pueda modificar un directoriopúblico de forma anónima; como ser, por ejemplo, un área reservada para archivos comunes quede otra manera no tendrían restricciones de acceso particulares.

httpd_use_nfsCuando se encuentre habilitado, este Booleano permite que httpd pueda acceder a los archivosalmacenados en un sistema de archivos NFS.

nfs_export_all_roExporta cualquier archivo o directorio mediante NFS, otorgando permisos de solo lectura.

nfs_export_all_rwExporta cualquier archivo o directorio mediante NFS, otorgando permisos de lectura y escritura.

qemu_use_nfsPermite que qemu utilice sistemas de archivos NFS.

samba_share_nfsCuando se encuentre deshabilitado, este Booleano evita que smbd tenga acceso completo aelementos NFS compartidos mediante Samba. Habilitar este Booleano permitirá que Sambapueda compartir sistemas de archivos NFS.

use_nfs_home_dirsTener este Booleano habilitado añade soporte para directorios personales NFS.

virt_use_nfsPermite a virt usar archivos NFS.

xen_use_nfsPermite a xen manejar archivos NFS.

7.4. Ejemplos de configuración

7.4.1. Compartiendo directorios usando NFSEl ejemplo en esta sección crea un directorio y lo comparte utilizando NFS y SELinux. Son utilizadosdos equipos; un servidor NFS denominado nfs-srv, cuya dirección IP es 192.168.1.1, y uncliente denominado nfs-client cuya dirección IP es 192.168.1.100. Ambos equipos seencuentran en la misma subred (192.168.1.0/24). Este es solo un ejemplo, y presupone que elpaquete nfs-utils se encuentra instalado, que se está utilizando SELinux con una política elegida, yque se está ejecutando en modo obligatorio.

Este ejemplo enseñará que, aunque teniendo una disponibilidad de red total, y que los permisosde archivos Linux garanticen un acceso a todos los usuarios mediante NFS, SELinux es capaz de

Page 55: Administración de Servicios Confinados · 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

Compartiendo directorios usando NFS

47

bloquear montajes sobre sistemas de archivos NFS, a menos que sean otorgados los permisosadecuados mediante SELinux y Booleanos.

7.4.1.1. Configuración del ServidorLos pasos 1 a 10 que ofrecemos a continuación deberían ser ejecutados en el servidor NFS, nfs-srv.

1. Ejecute el comando setsebool para deshabilitar montajes de lectura y escritura sobre sistemasde archivos NFS:

setsebool -P nfs_export_all_rw off

NotaNo utilice la opción -P si no desea que las modificaciones en setseboolcontinúen vigentes luego de haber reiniciado el sistema.

2. Ejecute el comando rpm -q nfs-utils para verificar que el paquete nfs-utils se encuentreinstalado. Este paquete ofrece programas de soporte para utilizar NFS y debería ser instaladosobre cualquier cliente que esté en uso. Si este paquete no se encuentra instalado, hágaloejecutando el comando yum install nfs-utils como usuario root.

3. Ejecute mkdir /micomparticion como usuario root para crear un directorio de nivel superiorpara compartir archivos usando NFS.

4. Ejecute el comando touch /myshare/file1 como usuario root para crear un nuevo archivovací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 hayansido otorgados permisos de Linux, otorgue al directorio /myshare derechos de accesos totalespara todos los usuarios:

# chmod -R 777 /micomparticion

AvisoEste es solo un ejemplo y estos permisos no deberían ser usados en un sistemade 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, elequipo o rango de red que nfs-srv compartirá con (en este caso la dirección IP de un únicoequipo, nfs-client en 192.168.1.100), y por último, los permisos para poder hacerlo. Seotorgan permisos de lectura y escritura, como es indicado en por (rw).

Page 56: Administración de Servicios Confinados · 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

Capítulo 7. Sistema de Archivos en Red (NFS)

48

7. Los puertos TCP y UDP utilizados por NFS son asignados dinámicamente por rpcbind, lo quepuede generar problemas cuando se creen reglas de cortafuegos. Para simplificar el procesode 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 yLOCKD_UDPPORT. En este ejemplo, no es necesario modificar el número de los puertos delarchivo.

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 lautilización de la herramienta system-config-firewall.

8. Ejecute el comando service nfs start como usuario root para iniciar NFS y los serviciosrelacionados:

# service nfs startStarting 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 -rvexporting 192.168.1.100:/myshare

10. Ejecute el coamdno showmount -e como usuario root para conocer todos los sistemas dearchivos exportados:

# showmount -eExport list for nfs-srv:/myshare 192.168.1.100

En este momento, el servidor nfs-srv ha sido configurado para permitir comunicaciones NFS hacianfs-client en 192.168.1.100, y se encuentran activos todos los permisos Linux de sistemasde archivos. Si SELinux estuviera deshabilitado, el cliente debería ser capaz de montar la porcióncompartida y de tener acceso total sobre ella. Sin embargo, como el Booleano nfs_export_all_rwse encuentra deshabilitado, el cliente no es capaz de montar este sistema de archivos, como puedeobservarse 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 /mysharemount.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 realizadosobre el servidor NFS, nfs-srv:

Page 57: Administración de Servicios Confinados · 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

Compartiendo directorios usando NFS

49

[nfs-srv]# setsebool -P nfs_export_all_rw on

Ahora, intente montar nuevamente el sistema de archivos NFS. Este paso debería ser realizado sobreel cliente NFS, nfs-client:

[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare[nfs-client]#[nfs-client]# ls /mysharetotal 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 losusuarios

Page 58: Administración de Servicios Confinados · 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

50

Page 59: Administración de Servicios Confinados · 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

51

Dominio de Nombres de InternetBerkeley (BIND)BIND realiza la resolución de nombre usando el demonio named. BIND permite a los usuario localizarcomputadoras, 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 paquetebind está instalado. Si este no esta instalado y usted quiere usar BIND, ejecute el siguiente comandocomo usuario root para instarlo:

yum install bind

8.1. BIND y SELinuxLos 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 zonay una actualización dinámica de DNS. Los archivos en /var/named son etiquetados con el tiponame_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 paraun 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_zonesdebe estar habilitado para permitir transferencias de zona y actualización dinámica de DNS en elarchivo de zona. También, el modo de el directorio superior debe ser cambiado para permitir alusuario 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 elsistema de archivos, o ejecute restorecon -R /var/ que cambiara sus tipos a named_zone_t.

8.2. TiposLos siguientes tipos son usados con BIND. Los diferentes tipos le permiten configurar accesosflexibles:

named_zone_tUsado para los archivos maestros de zona. Otros servicios no pueden modificar archivoscon este tipo. El demonio named solo puede modificar archivos de este tipo si el Booleanonamed_write_master_zones esta habilitado.

Page 60: Administración de Servicios Confinados · 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

Capítulo 8. Dominio de Nombres de Internet Berkeley (BIND)

52

named_cache_tPor defecto, named puede escribir archivos etiquetados con este tipo, sin establecer Booleanosadicionales. Los archivos copiados o creados en los directorios /var/named/slaves,/var/named/dynamic y /var/named/data son automáticamente etiquetados con el tiponamed_cache_t.

8.3. BoolenanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando BIND:

named_write_master_zonesCuando esta deshabilitado, este Booleano previene que named escriba en archivos de zona odirectorios etiquetados con el tipo named_zone_t. named usualmente no necesita escribir losarchivos de zona; pero en algún casos lo necesite, o si un segundo servidor necesita escribir losarchivos de zona, habilite este Booleano para permitir esta acción.

8.4. Ejemplos de configuración

8.4.1. DNS DinámicoBIND 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 requieremodificación en tipo real.

Use el directorio /var/named/dynamic para archivos de zona que quiera actualizar usandoDNS dinámico. Los archivos creados o copiados en /var/named/dynamic heredan los permisosLinux que permiten a named escribir en ellos. Como estos los archivos son etiquetados con el tiponamed_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, lasactualizaciones DNS dinámicas pueden no ser exitosas en determinados periodos de tipo en que lasactualizaciones deben ser escritas en el diario primero, antes de empezar el mezclado. Si el archivode zona es etiquetado con el tipo named_zone_t cuando el diario intenta mezclarse, un error comoel 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.

Page 61: Administración de Servicios Confinados · 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

53

Sistema de Versionado Concurrentes(CVS)El Sistema de Versionado Concurrente (CVS) es un sistema libre de control de revisiones. Esutilizado para monitoreo y seguimiento de modificaciones de un conjunto central de archivosque es usualmente accedido por muchos usuarios diferentes. Esto es comúnmente usadopor programadores para administrar un repositorio de código y es extensamente usado porprogramadores 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 usuarioroot para instalarlo:

yum install cvs

9.1. CVS y SELinuxEl demonio cvs se ejecuta como cvs_t. Por defecto en Fedora, CVS solo tiene permisos de lecturay escritura sobre determinados directorios. La etiqueta cvs_data_t define que áreas el demoniocvs puede acceder para leer y escribir. Cuando se usa CVS con SELinux, asignar correctamente lasetiquetas es esencial para que los clientes tengan acceso completo al área reservada para los datosCVS.

9.2. TiposLos siguientes tipos son usados con CVS. Los diferentes tipos le permiten configurar accesosflexibles:

cvs_data_tEste tipo es usado para los datos en el repositorio CVS. CVS solo puede obtener acceso sobrelos datos si tiene este tipo.

cvs_exec_tEste tipo es usado por los binarios en /usr/bin/cvs

9.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando CVS:

allow_cvs_read_shadowEste Booleano permite al demonio cvs el acceso al archivo /etc/shadow para autenticarusuarios.

Page 62: Administración de Servicios Confinados · 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

Capítulo 9. Sistema de Versionado Concurrentes (CVS)

54

9.4. Ejemplos de configuración

9.4.1. Configuración de CVSEste ejemplo describe una configuración simple de CVS y la configuración de SELinux que permiteacceso remoto. Dos equipos son usados en este ejemplo, un servidor CVS con nombre de equipocvs-srv y dirección IP 192.168.1.1 y un cliente con nombre de equipo cvs-client y direcciónIP 192.168.1.100. Ambos equipos son de la misma sub-red (192.168.1.0/24). Este es solo unejemplo y asume que los paquetes cvs and xinetd están instalados, que SELinux usa la política porobjetivos (targeted), y que SELinux esta corriendo en modo obligado.

Este ejemplo muestra que incluso con todos los permisos DAC, SELinux pude todavía hacer cumplirlas reglas basadas en etiquetas de archivo y solo permitir acceso a determinadas áreas que seanespecíficamente etiquetadas para el acceso por CVS.

9.4.2. Configuración del Servidor

NotaPasos 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 elpaquete cvs está instalado. Si no esta instalado, ejecute yum install cvs como usuario rootpara instalarlo. Ejecute rpm -q xinetd para ver si el paquete xinetd esta instalado. Si no estainstalado, ejecute yum install xinetd como usuario root para instalarlo.

2. Cree un grupo llamado CVS. Este puede hacerlo usando el comando groupadd CVS comousuario 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 entradasque se ven similar a lo siguiente:

cvspserver 2401/tcp # CVS client/server operationscvspserver 2401/udp # 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 etiquetasrecursivas sin afectar cualquier otro subdirectorio. Por ejemplo, como usuario root, cree eldirectorio /cvs como hogar para su repositorio:

[root@cvs-srv]# mkdir /cvs

6. Otorgue permisos completos al directorio /cvs para todos los usuarios:

Page 63: Administración de Servicios Confinados · 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

Configuración del Servidor

55

[root@cvs-srv]# chmod -R 777 /cvs

AvisoEste es solo un ejemplo y estos permisos no deberían ser usados en un sistemade producción.

7. Edite el archivo /etc/xinetd.d/cvs y verifique que la sección CVS esta sin comentar yconfigurada 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 estoutilizando 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 accesoa archivos. Para demostrar esto, establezca la variable $CVSROOT en cvs-client e intenteingresar remotamente. El siguiente paso debería ser realizado en cvs-client:

[cvsuser@cvs-client]$ export CVSROOT=:pserver:[email protected]:/cvs[cvsuser@cvs-client]$[cvsuser@cvs-client]$ cvs loginLogging in to :pserver:[email protected]:2401/cvsCVS 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íarealizar el siguiente paso en cvs-srv:

12. Cambiar el contexto del directorio /cvs como usuario root para etiquetar de forma recursivacualquier archivo nuevo o existente de datos en el directorio /cvs, estableciendo el tipocvs_data_t:

Page 64: Administración de Servicios Confinados · 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

Capítulo 9. Sistema de Versionado Concurrentes (CVS)

56

[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 losrecursos CVS en este repositorio:

[cvsuser@cvs-client]$ export CVSROOT=:pserver:[email protected]:/cvs[cvsuser@cvs-client]$[cvsuser@cvs-client]$ cvs loginLogging in to :pserver:[email protected]:2401/cvsCVS password: ********[cvsuser@cvs-client]$

Page 65: Administración de Servicios Confinados · 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

57

Squid Caching ProxyFuente página del proyecto Squid Caching Proxy1:

"Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidthand improves response times by caching and reusing frequently-requested web pages. Squid hasextensive access controls and makes a great server accelerator."

En Fedora, el paquete squid provee Squid Caching Proxy. Ejecute rpm -q squid para ver si elpaquete squid está instalado. Si no esta instalado, ejecute el siguiente comando como usuario rootpara instarlo:

# yum install squid

10.1. Squid Caching Proxy y SELinuxCuando SELinux esta habilitado, squid se ejecuta confinado por defecto. Los procesos confinadosse ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un procesoconfinado es comprometido por un atacante, dependiendo de la configuración de políticas deSELinux, 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 ejemploasume que el paquete squid esta instalado:

1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:

$ getenforceEnforcing

El comando getenforce retorna Enforcing cuando SELinux está corriendo en modoobediente.

2. Ejecute service squid start como usuario root para iniciar squid:

# service squid startIniciando squid: [ OK ]

3. Ejecute ps -eZ | grep squid para ver el proceso squid:

$ ps -eZ | grep squidunconfined_u:system_r:squid_t:s0 2522 ? 00:00:00 squidunconfined_u:system_r:squid_t:s0 2524 ? 00:00:00 squidunconfined_u:system_r:squid_t:s0 2526 ? 00:00:00 ncsa_authunconfined_u:system_r:squid_t:s0 2527 ? 00:00:00 ncsa_authunconfined_u:system_r:squid_t:s0 2528 ? 00:00:00 ncsa_authunconfined_u:system_r:squid_t:s0 2529 ? 00:00:00 ncsa_authunconfined_u:system_r:squid_t:s0 2530 ? 00:00:00 ncsa_authunconfined_u:system_r:squid_t:s0 2531 ? 00:00:00 unlinkd

1 http://www.squid-cache.org/

Page 66: Administración de Servicios Confinados · 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

Capítulo 10. Squid Caching Proxy

58

El contexto SELinux asociado con el proceso squid esunconfined_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 ejemplosquid_t, interactua con archivos, otros procesos y el sistema en general. Los archivos deben seretiquetados correctamente para permitir a squid el acceso a ellos.

Cuando /etc/squid/squid.conf ha sido configurado de modo que squid escuche sobre unpuerto diferente que los TCP predeterminados (3128, 3401 o 4827), el comando semanage portdebe ser utilizado para agregar el número de puerto requerido a la política de configuración deSELinux. El ejemplo siguiente enseña cómo configurar a squid para que escuche sobre un puertoque no ha sido definido inicialmente en la configuración de políticas de SELinux para squid, ycomo consecuencia de esto, squid no puede iniciarse. Además, nuestro ejemplo demuestra comoconfigurar luego el sistema SELinux para permitir que squid pueda escuchar exitosamente sobre unpuerto no estándar que aún no haya sido definido en la política. Nuestro ejemplo presupone que elpaquete 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 statussquid está parado

Si la salida es diferente, ejecute service squid stop para detener el proceso:

# service squid stopParando squid: [ OK ]

2. Ejecute semanage port -l | grep -w squid_port_t para ver los puertos que SELinuxpermite a squid escuchar:

semanage port -l | grep -w -i squid_port_tsquid_port_t tcp 3128, 3401, 4827squid_port_t udp 3401, 4827

3. Edite el archivo /etc/squid/squid.conf como usuario root. Configure la opción http_portpara que liste un puerto que no esté configurado en la política de SELinux para la configuraciónde squid. En este ejemplo , squid es configurado para escuchar en el puerto 10000:

# Squid normally listens to port 3128http_port 10000

4. Ejecute service squid start para iniciar squid:

# service squid startInciando squid: .................... [FALLÓ]

Page 67: Administración de Servicios Confinados · 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

Tipos

59

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, esrequerido 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 enel nuevo puerto:

# service squid startIniciando squid: [ OK ]

7. Ahora que SELinux ha sido configurado para permitir que squid escuche sobre un puerto TCPno estándar (TCP 1000 en nuestro ejemplo), squid se inicia exitosamente en tal puerto.

10.2. TiposEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso 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_tEste tipo es utilizado con herramientas como cachemgr.cgi, que ofrecen una variedad deestadísticas acerca de squid y de su configuración.

squid_exec_tUtilice este tipo para los datos que hayan sido cacheados por squid, como se define en ladirectiva cache_dir en el archivo /etc/squid/squid.conf. Por defecto, los archivos creadoso copiados en /var/cache/squid y en /var/spool/squid son etiquetados con el tiposquid_cache_t. Los archivos para el complemento squidGuard2 de squid, creados o copiadosen /var/squidGuard también son etiquetados con el tipo squid_cache_t. Para sus datoscacheados, squid solo es capaz de utilizar archivos y directorios que hayan sido etiquetados coneste tipo.

squid_exec_tEste tipo es utilizado para archivos y directorios que squid utiliza para su configuración. Losarchivos 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/

Page 68: Administración de Servicios Confinados · 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

Capítulo 10. Squid Caching Proxy

60

squid_exec_tEste tipo es usado por los binarios en /usr/sbin/squid

squid_var_run_tEste tipo es utilizado para registros. Los archivos existentes, o aquellos que hayan sido creadoso copiados en /var/log/squid o en /var/log/squidGuard deben ser etiquetados con estetipo.

squid_var_run_tEste tipo es utilizado para el archivo de inicialización necesario para lanzar squid, que seencuentra ubicado en /etc/rc.d/init.d/squid.

squid_var_run_tEste 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 enejecución.

10.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando Squid:

squid_use_tproxyCuando se encuentra habilitado, este Booleano permite que squid inicie una conexión con unequipo remoto sobre cualquier puerto.

squid_use_tproxyCuando se encuentra habilitado. este Booleano permite que squid se ejecute como un proxytransparente.

10.4. Ejemplos de configuración

10.4.1. Squid Conectando a puertos no estándarEl siguiente ejemplo ofrece una demostración de un caso real acerca de cómo SELinux complementaa Squid al hacer cumplir el Booleano recién mencionado, y permitiendo acceso de manerapredeterminada solo a ciertos puertos. Este ejemplo demostrará entonces cómo modificar elBooleano, mostrando luego que el acceso es permitido.

Tenga en cuenta que este es solo un ejemplo y que demuestra cómo SELinux puede afectar unaconfiguración básica de Squid. Ofrecer una documentación más completa relacionada con Squid esalgo que se encuentra más allá de los propósitos de este documento. Consulte la Docuemntaciónoficial de Squid (en inglés)3 para obtener mayores detalles. Nuestro ejemplo presupone que elequipo Squid posee dos interfaces de red, acceso a internet, y que cualquier tipo de cortafuegos hasido configurado para permitir acceso a la interfaz interna, mediante la utilización del puerto TCOpredeterminado sobre el que Squid está escuchando (TCP 3128).

3 http://www.squid-cache.org/Doc/

Page 69: Administración de Servicios Confinados · 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

Squid Conectando a puertos no estándar

61

1. Como usuario root, instale el paquete squid. Ejecute el comando rpm -q squid para verificarque ya lo tenga en sus sistema. Si no ha sido instalado, ejecute el comando yum installsquid como usuario root para hacerlo.

2. Edite el archivo de configuración principal, /etc/squid/squid.conf, y confirme que ladirectiva 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 serutilizadas 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 discoen 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 allowlocalnet no se encuentre comentada. Esto permite el tráfico desde localnet ACL, quees 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ésdel 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 seencuentre comentada y que esté configurada con el nombre de equipo de la máquina. El valordebería ser el nombre del dominio totalmente calificado del equipo (FQDN, por las iniciales eninglé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 estaes 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 startinit_cache_dir /var/spool/squid... Inciando squid: . [ OK ]

6. Verifique que el proceso ID (PID) squid se haya iniciado como un servicio confinado, del mismomodo 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 anteriormenteconfigurada, podrá de manera exitosa ser capaz de utilizar la interfaz interba de este equipo comosu propio proxy. Esto puede ser configurado en las configuraciones de todos los navegadoresweb más utilizados, o en todo el sistema. Squid ahora está escuchando sobre el puertopredeterminado 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

Page 70: Administración de Servicios Confinados · 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

Capítulo 10. Squid Caching Proxy

62

política definida por SELinux. SELinux negará el acceso a puertos no estándar, como se muestraen 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ónsimilar 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, yaque se encuentra deshabilitado en forma predeterminada. Para encender el Booleanosquid_connect_any, ejecute el siguiente comando como usuario root:

# setsebool -P squid_connect_any on

NotaNo utilice la opción -P si no desea que las modificaciones de setseboolpermanezcan vigentes luego de reiniciar el equipo.

10. El cliente ahora será capaz de acceder a puertos no estándar de Internet, ya que ahora Squidtiene permitido iniciar conexiones sobre cualquier puerto, en nombre de sus clientes.

Page 71: Administración de Servicios Confinados · 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

63

MySQLFuente página del proyecto MySQL1:

"The MySQL® database has become the world's most popular open source database because ofits 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 fastest-growing organizations to save time and money powering their high-volume Web sites, business-criticalsystems 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 elpaquete mysql-server está instalado. Si no esta instalado, ejecute el siguiente comando como usuarioroot para instarlo:

yum install mysql-server

11.1. MySQL y SELinuxCuando MySQL esta habilitado, este se ejecuta confinado por defecto. Los procesos confinadosse ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un procesoconfinado es comprometido por un atacante, dependiendo de la configuración de políticas deSELinux, 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 ejemploasume que el paquete mysql esta instalado:

1. Ejecute getenforce para confirmar que SELinux esta ejecutándose en modo obediente:

$ getenforceEnforcing

El comando getenforce retorna Enforcing cuando SELinux esta ejecutándose en modoobediente.

2. Ejecute service mysqld start como usuario root para iniciar mysqld:

# service mysqld startIniciando base de datos MySQL: Installing MySQL system tables... [ OK ]Iniciando mysqld: [ OK ]

3. Ejecute ps -eZ | grep mysqld para ver el proceso mysqld:

$ ps -eZ | grep mysqldunconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safeunconfined_u:system_r:mysqld_t:s0 6123 pts/1 00:00:00 mysqld

1 http://www.mysql.com/why-mysql/

Page 72: Administración de Servicios Confinados · 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

Capítulo 11. MySQL

64

El contexto SELinux asociado con el proceso mysqld esunconfined_u:system_r:mysqld_t:s0. La segunda parte del contexto, mysqld_t es eltipo. Un tipo define el dominio para el proceso y el tipo de los archivos. En este caso, el procesomysqld esta ejecutándose en el dominio mysqld_t.

11.2. TiposEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso 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_tEste tipo es usado para la ubicación de la base de datos MySQL. En Fedora 13, la ubicación pordefecto de la base es /var/lib/mysql, de todas formas puede ser cambiada. Si la ubicaciónde 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 nuevasección apropiadamente.

mysqld_etc_tEste tipo es usado para el archivo de configuración principal /etc/my.cnf de MySQL ycualquier otro archivo de configuración en el directorio /etc/mysql.

mysqld_exec_tEste tipo es usado para la ubicación del binario mysqld en /usr/libexec/mysqld, que es laubicación por defecto para el binario de MySQL en Fedora 13. Otros sistemas pueden ubicar elbinario en /usr/sbin/mysqld que puede estar también etiquetado con este tipo.

mysqld_initrc_exec_tEste 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_tLos archivos de registro (Logs) para MySQL necesitan estar etiquetados con esta etiquetados coneste tipo para operar apropiadamente. Todos los archivos log en /var/log/ que coincidan conel patrón mysql.* deben ser etiquetados con este tipo.

mysqld_var_run_tEste 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 mysqldcuando esta corriendo. Este tipo también es usado para los archivos de relacionados con socketcomo son /var/lib/mysql/mysql.sock. Archivos como este deben estar etiquetadoscorrectamente para la operación adecuada como un servicio confinado.

11.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux como

Page 73: Administración de Servicios Confinados · 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

Ejemplos de configuración

65

esta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando MySQL:

exim_can_connect_dbCuando esta habilitado, este Booleano permite al demonio de correo exim iniciar conexiones alservidor de base de datos

ftpd_connect_dbCuando esta habilitado, este Booleano permite al demonio ftp iniciar conexiones al servidor debase de datos.

httpd_can_network_connect_dbHabilitar este Booleano es requerido para que un servidor web se comunique con el servidor debase de datos.

11.4. Ejemplos de configuración

11.4.1. Cambiando la ubicación de la Base de Datos MySQLCuando 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 yaestá debidamente etiquetados para usted usando el tipo mysqld_db_t.

El área donde esta ubicada la base de datos puede ser cambiada dependiendo los requerimientoso preferencias de entorno individuales, de todas formas es importante que SELinux esté consientede la nueva ubicación, para lo cual se usa el etiquetado. Este ejemplo explica como cambiar laubicación de la base de datos MySQL y luego como etiquetar la nueva ubicación para que SELinuxsiga 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 ladocumentación de MySQL2 oficial para más detalles. Este ejemplo asume que el paquete mysql-server 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 dela base de datos para mysql:

# ls -lZ /var/lib/mysqldrwx------. 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 delos archivos de base de datos. Este contexto tendrá que ser aplicado manualmente a la nuevaubicación de la base de datos que se utilizarán en este ejemplo con el fin de asegurar su buenfuncionamiento.

2. Ingrese mysqlshow -u root -p e ingrese la contraseña root de mysqld para ver las bases dedatos disponibles:

2 http://dev.mysql.com/doc/

Page 74: Administración de Servicios Confinados · 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

Capítulo 11. MySQL

66

# mysqlshow -u root -pEnter password: *******+--------------------+| Databases |+--------------------+| information_schema || mysql || test |+--------------------+

3. Detenga el demonio mysqld ejecutando service mysqld stop como usuario root:

# service mysqld stopParando 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 seestablece 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 /optdrwxr-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 paraSELinux como ubicación de archivos de base de datos MySQL. Una vez que el contexto hacambiado, 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 textosy modifique la opción datadir e indique la nueva ubicación. En este ejemplo el valor a seringresado 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 puntoaparecerá una negación registrada en /var/log/messages:

Page 75: Administración de Servicios Confinados · 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

Cambiando la ubicación de la Base de Datos MySQL

67

# 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 losarchivos de datos MySQL. SELinux esta deteniendo a MySQL a tener acceso al contenidoetiquetado 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 enejecución:

restorecon -R -v /opt/mysql

13. Ahora que la ubicación /opt/mysql ha sido etiquetada con el contexto correcto para MySQL, eldemonio mysqld inicia:

# service mysqld startIniciando mysqld: [ OK ]

14. Confirme que el contexto de /opt/mysql ha cambiado:

ls -lZ /optdrwxr-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 reiniciadosatisfactoriamente. A este punto todos los servicios ejecutándose deberían estar probadosconfirmando la operación normal.

Page 76: Administración de Servicios Confinados · 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

68

Page 77: Administración de Servicios Confinados · 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

69

PostgreSQLFuente página del proyecto PostgreSQL1:

"PostgreSQL is a powerful, open source object-relational database system. It has more than 15 yearsof 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 postgresql-server para ver si el paquete postgresql-server está instalado. Si no esta instalado, ejecute elsiguiente comando como usuario root para instarlo:

yum install postgresql-server

12.1. PostgreSQL y SELinuxCuando PostgreSQL esta habilitado, este se ejecuta confinado por defecto. Los procesos confinadosse ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un procesoconfinado es comprometido por un atacante, dependiendo de la configuración de políticas deSELinux, 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. Esteejemplo asume que el paquete postgresql-server esta instalado:

1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:

$ getenforceEnforcing

El comando getenforce retorna Enforcing cuando SELinux está corriendo en modoobediente.

2. Ejecute service postgresql start como usuario root para iniciar postgresql:

# service postgresql startIniciando postgresql: [ OK ]

3. Ejecute ps -eZ | grep postgresql para ver el proceso postgresql:

ps -eZ | grep postgresunconfined_u:system_r:postgresql_t:s0 395 ? 00:00:00 postmasterunconfined_u:system_r:postgresql_t:s0 397 ? 00:00:00 postmasterunconfined_u:system_r:postgresql_t:s0 399 ? 00:00:00 postmasterunconfined_u:system_r:postgresql_t:s0 400 ? 00:00:00 postmasterunconfined_u:system_r:postgresql_t:s0 401 ? 00:00:00 postmasterunconfined_u:system_r:postgresql_t:s0 402 ? 00:00:00 postmaster

El contexto SELinux asociado con el proceso postgresql esunconfined_u:system_r:postgresql_t:s0. La segunda parte del contexto,

1 http://www.postgresql.org/about/

Page 78: Administración de Servicios Confinados · 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

Capítulo 12. PostgreSQL

70

postgresql_t, es el tipo. El tipo define el dominio para el proceso y tipos de archivos. En estecaso, el proceso postgresql está corriendo en el dominio postgresql_t.

12.2. TiposEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso 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 accesosflexibles:

postgresql_db_tEste tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo sonusadas 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_tEste tipo es usado para el archivos de configuración en /etc/postgresql.

postgresql_exec_tEste tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo sonusadas 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_tEste tipo es usado para el archivo de inicialización de PostgreSQL ubicado en /etc/rc.d/init.d/postgresql.

postgresql_log_tEste tipo es usado para diversas ubicaciones. Las ubicaciones etiquetadas con este tipo sonusadas 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.*

Page 79: Administración de Servicios Confinados · 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

Booleanos

71

• /var/log/rhdb/rhdb

• /var/log/sepostgresql.log.*

postgresql_var_run_tEste 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. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando PostgreSQL:

allow_user_postgresql_connectTeniendo este Booleano habilitado permite a cualquier usuario del dominio (definido porPostgreSQL) 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 PostgreSQLCuando esta usando Fedora, la ubicación por defecto de PostgreSQL para almacenar sus basesde datos es /var/lib/pgsql/data. Aquí es donde SELinux espera que sea por defecto, y por lotanto, 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 opreferencias de entorno individuales, de todas formas es importante que SELinux esté consiente dela nueva ubicación, para lo cual se usa el etiquetado. Este ejemplo explica como cambiar la ubicaciónde la base de datos PostgreSQL y luego como etiquetar la nueva ubicación para que SELinux sigaproveyendo 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 ladocumentación de PostgreSQL2 oficial para más detalles.

1. Ejecute ls -lZ /var/lib/pgsql para ver el contexto SELinux de la ubicación por defecto dela base de datos para postgresql:

# ls -lZ /var/lib/pgsqldrwx------. 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 laubicación de los archivos de base de datos. Este contexto tendrá que ser aplicado manualmentea la nueva ubicación de la base de datos que se utilizarán en este ejemplo con el fin de asegurarsu buen funcionamiento.

2 http://www.postgresql.org/docs/

Page 80: Administración de Servicios Confinados · 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

Capítulo 12. PostgreSQL

72

2. Cree un nuevo directorio para la nueva ubicación de las bases de datos. En este ejemplo, seusa /opt/postgresql/data. Si usted usa una ubicación diferente, reemplace el texto en lossiguiente 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 nuevodirecto es usr_t. Este contexto no es suficiente para que SELinux ofrezca sus mecanismos deprotección para PostgreSQL. Una vez que el contexto ha cambiado, PostgreSQL será capaz defuncionar 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 seestablece 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 detexto y modifique todas las variables PGDATA y PGLOG para que apunten a la nueva ubicación:

# vi /etc/rc.d/init.d/postgresqlPGDATA=/opt/postgresql/dataPGLOG=/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 ycualquier 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 enejecución:

Page 81: Administración de Servicios Confinados · 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

Cambiando la ubicación de la Base de Datos PostgreSQL

73

restorecon -R -v /opt/postgresql

10. Ahora que la ubicación /opt/postgresql ha sido etiquetada con el contexto correcto paraPostgreSQL, el demonio postgresql inicia:

# service postgresql startIniciando postgreSQL: [ OK ]

11. Confirme que el contexto de /opt/postgresql ha cambiado:

ls -lZ /optdrwxr-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 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data

13. La ubicación ha sido cambiada y etiquetada, y el demonio postgresql se ha reiniciadosatisfactoriamente. A este punto todos los servicios ejecutándose deberían estar probadosconfirmando la operación normal.

Page 82: Administración de Servicios Confinados · 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

74

Page 83: Administración de Servicios Confinados · 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

75

rsyncFuente página del proyecto Rsync1:

"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 paquetersync está instalado. Si no esta instalado, ejecute el siguiente comando como usuario root parainstarlo:

yum install rsync

13.1. rsync y SELinuxSELinux requiere que los archivos tengan definido el atributo extendido del tipo de archivo. La políticagobierna el acceso que los demonios tiene sobre estos archivos. Si usted quiere compartir archivosusando 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 susmecanismos de protección sobre rsync.

13.2. TiposEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso 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_tEste es un tipo genérico usado para ubicación de archivos (y los archivos actuales) para sercompartidos usando rsync.Si un directorio especial es creado como hogar de los archivos aser compartidos con rsync, el directorio y su contenido necesitan también tener aplicada estaetiqueta.

rsync_exec_tEste tipo es usado para los archivos binarios de sistema en /usr/bin/rsync.

rsync_log_tEste 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_tEste 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/

Page 84: Administración de Servicios Confinados · 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

Capítulo 13. rsync

76

13.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando rsync:

rsync_export_all_roTeniendo 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 archivospúblicos usados para los servicios de transferencia de archivos públicos. Los archivos ydirectorios deben estar etiquetados con public_content_rw_t.

rsync_export_all_roTener este Booleano habilitado permite a rsync iniciar conexiones a puertos definidos pararsync_port_t, como también permite a rsync administrar archivos, enlaces y directorios quetengan el tipo rsync_data_t. Note que el demonio rsync debe estar en el dominio rsync_t a fin deque SELinux tenga control sobre rsync. El ejemplo de configuración en este capitulo muestra arsync ejecutando en el dominio rsync_t

rsync_export_all_roTeniendo este Booleano habilitado permite a rsync en el dominio rsync_t exportar sistemas dearchivos NFS y CIFS con acceso de solo lectura para los clientes.

13.4. Ejemplos de configuración

13.4.1. Rsync como demonioCuando usa Fedora, rsync puede ser usado como un demonio y entonces múltiples clientes puedencomunicarse directamente con él como un servidor central, a fin de centralizar el alojamiento dearchivos y mantener estos sincronizados. El siguiente ejemplo demostrará a rsync ejecutando comodemonio sobre un red por socket en el dominio correcto, y como SELinux espera que este demonioeste ejecutando en un puerto TCP predefinido (en la política SELinux) Este ejemplo le mostrará comomodificar la política SELinux para permitir al demonio rsync correr normalmente en un puerto noestándar.

Nuestro ejemplo estará realizado sobre un único sistema para mostrar la política de SELinux y elcontrol que ejerce sobre demonios y procesos locales. Tenga en cuenta que este es un ejemplo quesirve solo para demostrar como SELinux influye sobre rsync. Presentar documentación más completasobre rsync es algo que se encuentra más allá de los propósitos de este documento. Diríjase al sitiode documentación de rsync (en inglés)2 para obtener mayores detalles. Nuestro ejemplo presuponeque 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_t1. Ejecute getenforce para confirmar que SELinux esta corriente en modo obediente:

$ getenforce

2 http://www.samba.org/rsync/documentation.html

Page 85: Administración de Servicios Confinados · 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

Rsync como demonio

77

Enforcing

El comando getenforce retorna Enforcing cuando SELinux está corriendo en modoobediente.

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íaser utilizado y almacenado como /etc/rsyncd.conf. Tenga en cuenta que el archivo deconfiguración utilizado en este ejemplo es muy básico y no es una muestra de todas las opcionesposibles que se encuentran disponibles, pero que es suficiente para mostrar el funcionamiento deldemonio rsync:

log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock 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 elmodo de demonio, esta etapa demuestra que el simple hecho de ejecutar rsync --daemonno es suficiente para que SELinux pueda ofrecer una protección a rsync. Observe el siguienteresultado:

# rsync --daemon

# ps x | grep rsync 8231 ? Ss 0:00 rsync --daemon 8233 pts/3 S+ 0:00 grep rsync

# ps -eZ | grep rsyncunconfined_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 rsyncsiendo ejecutado en el dominio unconfined_t (no confinado). Esto indica que rsync no seha 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 lospasos siguientes, rsync se trasladará al dominio rsync_t al ser ejecutado desde un init scriptetiquetado 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 elsiguiente 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. Lospasos siguientes enseñan cómo etiquetar a este script como initrc_exec_t:

Page 86: Administración de Servicios Confinados · 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

Capítulo 13. rsync

78

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 enejecución:

restorecon -R -v /etc/rc.d/init.d/rsyncd

9. Ejecute el comando ls para verificar que el script haya sido etiquetado apropiadamente. Tengaen 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 scriptetiquetado adecuadamente, el proceso se iniciará comorsync_t:

# /etc/rc.d/init.d/rsync startStarting rsyncd: [ OK ]

ps -eZ | grep rsyncunconfined_u:system_r:rsync_t:s0 9794 ? 00:00:00 rsync

SELinux ahora puede hacer cumplir sus mecanismos de protección sobre el demonio rsync, yaque ahora se está ejecutando en el dominio rsync_t.

Este ejemplo mostró como hacer que rsyncd se ejecute en el dominio rsync_t. El siguienteejemplo mostrará como hacer que este demonio se ejecute exitosamente sobre un puerto diferente alos predeterminados. En el próximo ejemplo se utilizar el puerto TCP número 1000.

Ejecutando el demonio rsync en un puerto no predefinido1. 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 nuevaconfiguración debe verse similiar a:

log file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidlock file = /var/run/rsync.lockport = 10000

Page 87: Administración de Servicios Confinados · 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

Rsync como demonio

79

[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 SELinuxuna 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 enrsync_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 startInciando rsyncd: [ OK ]

# netstat -lnp | grep 10000tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsync

La política de SELinux ha sido modificada y ahora se permite a rsyncd operar en el puerto TCP10000.

Page 88: Administración de Servicios Confinados · 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

80

Page 89: Administración de Servicios Confinados · 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

81

PostfixFuente página del proyecto Postfix1:

"What is Postfix? It is Wietse Venema's mailer that started life at IBM research as an alternative tothe widely-used Sendmail program. Postfix attempts to be fast, easy to administer, and secure. Theoutside 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 postfixestá instalado. Si no esta instalado, ejecute el siguiente comando como usuario root para instarlo:

yum install postfix

14.1. Postfix y SELinuxCuando Postfix esta habilitado, este se ejecuta confinado por defecto. Los procesos confinadosse ejecutan en su propio dominio, y están separados de otros procesos confinados. Si un procesoconfinado es comprometido por un atacante, dependiendo de la configuración de políticas deSELinux, 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 ejemploasume 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:

$ getenforceEnforcing

El comando getenforce retorna Enforcing cuando SELinux está corriendo en modoobediente.

2. Ejecute service postfix start como usuario root para iniciar postfix:

service postfix startIniciando postfix: [ OK ]

3. Ejecute ps -eZ | grep postfix para ver el proceso postfix:

ps -eZ | grep postfixsystem_u:system_r:postfix_master_t:s0 1651 ? 00:00:00 mastersystem_u:system_r:postfix_pickup_t:s0 1662 ? 00:00:00 pickupsystem_u:system_r:postfix_qmgr_t:s0 1663 ? 00:00:00 qmgr

El contexto SELinux asociado con el proceso master de Postfix esunconfined_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 procesoy el tipo de los archivos. En este caso, el proceso master esta ejecutándose en el dominiopostfix_master_t.

1 http://www.postfix.org/

Page 90: Administración de Servicios Confinados · 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

Capítulo 14. Postfix

82

14.2. TiposEl 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 procesoy los tipos para archivos. Las reglas de política de SELinux definen que tipos tiene acceso unos conotros, se trate de un dominio accediendo a un tipo, o a un dominio accediendo a otro dominio. Elacceso 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_tEste tipo es usado para el archivo de configuración Postfix en /etc/postfix.

postfix_data_tEste tipo es usado por los archivos de datos Postfix en /var/lib/postfix.

NotaPara ver la lista completa de archivos y sus tipos para Postfix, ejecute el siguientecomando:

$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts

14.3. BooleanosSELinux se basa en el menor nivel de acceso requerido por un servicio para ser ejecutado. Losservicios pueden ejecutarse en una variedad de formas; por lo tanto, debe indicarle a SELinux comoesta corriendo usted los servicios. Los siguientes Booleanos le permiten a usted indicarle a SELinuxcomo está ejecutando Postfix:

allow_postfix_local_write_mail_spoolTeniendo 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 spoolslocales.

14.4. Ejemplos de configuración

14.4.1. SpamAssassin y PostfixFuente página del proyecto SpamAssassin2:

"Open Source mail filter, written in Perl, to identify spam using a wide range of heuristic tests on mailheaders and body text. Free software."

Cuando usa Fedora, el paquete spamassassin provee SpamAssassin. Ejecute rpm -qspamassassin para ver si el paquete spamassassin está instalado. Si no esta instalado, ejecute elsiguiente comando como usuario root para instarlo:

2 http://spamassassin.apache.org/

Page 91: Administración de Servicios Confinados · 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

SpamAssassin y Postfix

83

yum install spamassassin

SpamAssassin funciona en estrechamente con un programa de correo como ser Postfix paraproporcionar capacidades de filtrado de spam. Con el fin de que SpamAssassin sea eficienteinterceptando, 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 aSpamAssassin permitiendo sólo el acceso a un determinado puerto de forma predeterminada. Esteejemplo demostrará cómo cambiar el puerto y hacer que SpamAssassin opere en un puerto nopredeterminado.

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 ala documentación de SpamAssassin3 oficial para más detalles. Este ejemplo asume que el paquetespamassassin esta instalado, que cualquier cortafuegos ha sido configurado para permitir el acceso alos puertos en uso, que SELinux usa política por objetivo, y que SELinux se esta ejecutando en modoobediente:

Ejecutando SpamAssassin en un puerto no predeterminado1. Ejecute el comando semanage para mostrar los puertos que SELinux permite a spamd escuchar

por defecto:

# semanage port -l | grep spamdspamd_port_t tcp 783

Esta salida muestra el TCP/783 definido en spamd_port_t como el puerto para que opereSpamAssassin.

2. Edite el archivo /etc/sysconfig/spamassassin de configuración y modifique este para queSpamAssassin inicie en el puerto ejemplo TCP/10000:

# Options to spamdSPAMDOPTIONS="-d -p 10000 -c m5 -H"

Esta linea ahora especifica a SpamAssassin que opere en el puerto 10000. El resto de esteejemplo mostrará como modificar la política de SELinux para permitir que este socket esteabierto.

3. Inicie SpamAssassin y aparecerá un mensaje de error similar al siguiente:

/etc/init.d/spamassassin startIniciando 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 deniedspamd: could not create INET socket on 127.0.0.1:10000: Permission denied

3 http://spamassassin.apache.org/doc.html

Page 92: Administración de Servicios Confinados · 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

Capítulo 14. Postfix

84

[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 depermitir 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 startIniciando spamd: [ OK ]

# netstat -lnp | grep 10000tcp 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 elacceso este puerto en política SELinux.

Page 93: Administración de Servicios Confinados · 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

85

ReferenciasLas siguientes referencias son enlaces a información adicional que es relevante para SELinux peroexceden el alcance de esta guía. Note que por el rápido desarrollo de SELinux, algunos de estosmateriales puede solo aplicarse a lanzamientos específicos de Fedora.

LibrosSELinux by Example

Mayer, MacMillan, and Caplan

Prentice Hall, 2007

SELinux: NSA's Open Source Security Enhanced LinuxBill McCarty

O'Reilly Media Inc., 2004

Tutorials and HelpTutorials and talks from Russell Coker

http://www.coker.com.au/selinux/talks/ibmtu-2004/

Dan Walsh's Journalhttp://danwalsh.livejournal.com/

Base de Conocimiento Red Hathttp://kbase.redhat.com/

Información GeneralNSA 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 CorreoLista de correo NSA SELinux

http://www.nsa.gov/research/selinux/list.shtml

Lista de correo Fedora SELinuxhttp://www.redhat.com/mailman/listinfo/fedora-selinux-list

ComunidadGuía de Usuario SELinux de Fedora

http://docs.fedoraproject.org/es-ES/Fedora/13/html/Security-Enhanced_Linux/index.html/1

Wiki del Proyecto SELinuxhttp://selinuxproject.org/page/Main_Page

1 http://docs.fedoraproject.org/es-ES/Fedora/13/html/Security-Enhanced_Linux/index.html

Page 94: Administración de Servicios Confinados · 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

Capítulo 15. Referencias

86

Pagina de la comunidad SELinuxhttp://selinux.sourceforge.net/

IRCirc.freenode.net, #selinux and #fedora-selinux