# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

SSLCertificateFile: file certificado.crt does not exist or empty


En caso de recibir este error tras realizar una instalación de un certificado SSL en un servidor web Apache debemos revisar (en RHEL, CentOS, Scientific Linux, Fedora…) el estado de SElinux. Si está activado, probablemente sea el origen del problema:

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

En el log de auditoría veremos los siguientes errores:

# tail -200 /var/log/audit/audit.log  | grep crt
type=AVC msg=audit(1330769968.611:22): avc:  denied  { getattr } for  pid=1657 comm="httpd" path="/etc/ssl/cert.crt" dev=dm-0 ino=22027 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
type=AVC msg=audit(1330770107.699:23): avc:  denied  { getattr } for  pid=1676 comm="httpd" path="/etc/ssl/cert.crt" dev=dm-0 ino=22034 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
type=AVC msg=audit(1330770206.289:24): avc:  denied  { getattr } for  pid=1697 comm="httpd" path="/etc/ssl/cert.crt" dev=dm-0 ino=22034 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file

Se presupone además que hemos revisado que el path al certificado es correcto y no está vacío. Para solucionar el problema debemos aplicar (etiquetar) los atributos de SElinux correctos a los ficheros del certificado (certificado, private key, CA). Una forma sencilla es “copiar” estos atributos de un fichero de configuración Apache, que ya los tendrá asignados:

# chcon --reference=/etc/httpd/conf.d/ssl.conf cert.*

O aplicándolo especificando todos los atributos:

# chcon -u system_u -r object_r -t httpd_config_t cert.*

Si listamos ya tenemos etiquetados los ficheros y podemos reiniciar Apache sin recibir el error:

# ls -Z
-rw-r--r--. apache apache system_u:object_r:httpd_config_t:s0 cert.crt
-rw-r--r--. apache apache system_u:object_r:httpd_config_t:s0 cert.csr
-rw-r--r--. apache apache system_u:object_r:httpd_config_t:s0 cert.key

star: empaquetar preservando ACL y atributos extendidos (SElinux)


El comando star permite comprimir y descomprimir y/o empaquetar múltiples ficheros con la posibilidad de mantener tanto los atributos extendidos de SElinux como las ACL que puedan tener configurados los ficheros/directorios.

# yum info star.i686
...
Name        : star
Arch        : i686
Summary     : An archiving tool with ACL support
URL         : http://cdrecord.berlios.de/old/private/star.html
Description : Star saves many files together into a single tape or disk archive,
            : and can restore individual files from the archive. Star supports ACL.
...

No es un comando que venga por defecto, así que lo instalamos con yum:

# yum info star.i686

La utilización no es igual que el comando tar, es más, es bastante compleja. Sólo hay que mirar la página man, que es muy extensa para darse cuenta de las posibilidades que ofrece. Nosotros vamos a ver unos ejemplos básicos, luego cada uno que haga las pruebas e investigaciones oportunas.

Mantener los atributos extendidos de SElinux y ACL

Para incluir en el fichero empaquetado/comprimido cualquier atributo extendido de ficheros así como las ACL utilizamos los parámetros -xattr (podemos recordarlo por extended attributes) y -H=exustar. Para preservar las ACL es más sencillo (-acl). Vamos a empaquetar los siguientes ficheros, que tienen atributos extendidos de SElinux:

# ls -Z
-rw-------. root root system_u:object_r:etc_t:s0       ftpusers
-rw-------. root root system_u:object_r:etc_t:s0       user_list
-rw-------. root root system_u:object_r:etc_t:s0       vsftpd.conf
-rwxr--r--. root root system_u:object_r:etc_t:s0       vsftpd_conf_migrate.sh

Probamos también a meter una ACL para ver que la mantiene. Podéis revisar esta entrada sobre ACLs: ACL (Access Control List) en sistemas de ficheros GNU/Linux.

# setfacl -m u:prueba:r-- ftpusers
# getfacl ftpusers
# file: ftpusers
# owner: root
# group: root
user::rw-
user:prueba:r--
group::---
mask::r--
other::---

El comando sería el siguiente. Podéis ver que especificamos la creación de un nuevo fichero (-c) y su nombre (-f=):

# star -xattr -H=exustar -acl -c -f=ejemplo.star *
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).

Desempaquetar el fichero es más sencillo, usamos el parámetro -x (desempaquetar) y especificamos el fichero de la misma forma que antes (-f=nombre). Si queremos mantener las ACL hay que especificarlo de la misma forma que al empaquetar (-acl):

# star -x -acl -f=ejemplo.star
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).

Y revisamos los atributos de SElinux:

# ls -Z
-rw-r-----. root root system_u:object_r:etc_t:s0       ftpusers
-rw-r--r--. root root unconfined_u:object_r:etc_t:s0   test.star
-rw-------. root root system_u:object_r:etc_t:s0       user_list
-rw-------. root root system_u:object_r:etc_t:s0       vsftpd.conf
-rwxr--r--. root root system_u:object_r:etc_t:s0       vsftpd_conf_migrate.sh

Y las ACL:

# getfacl ftpusers
# file: ftpusers
# owner: root
# group: root
user::rw-
user:prueba:r--
group::---
mask::r--
other::---

De esta forma veréis que únicamente hemos empaquetado, no hemos comprimido. Con el parámetro -compress-program= podemos especificar el compresor a utilizar (gzip, bzip2,etc)

# star -xattr -H=exustar -compress-program=gzip -c -f=test.star *
star: 2 blocks + 0 bytes (total of 20480 bytes = 20.00k).

Vemos que efectivamente el peso es mínimo:

-rw-r--r--. 1 root root 2997 feb 27 20:41 test.star

Para descomprimir es igual, el propio comando detectará la compresión y actuará en consecuencia:

# star -x -acl -f=test.star
star: WARNING: Archive is 'gzip' compressed, trying to use the -z option.

vsftpd y SELinux: cambiar el directorio para accesos anónimos


Tanto para cambiar el directorio por defecto al que acceden usuarios anónimos en un servidor FTP como usuarios autenticados, en el caso de que el sistema esté configurado con SELinux en modo Enforcing hay que tener en cuenta la necesidad de reconfigurar los permisos de forma correcta y que el servicio funcione.

# getenforce
Enforcing

En el servidor vsftpd para modificar el directorio por defecto al que acceden los usuarios anónimos (/var/ftp) es necesario añadir la siguiente directiva en el fichero /etc/vsftpd/vsftpd.conf:

anon_root=/publico

Esto sería suficiente en un servidor normal, bueno, podría ser necesario cambio de propietario/grupo del directorio o de los permisos pero no siempre. En cambio, si tenemos SELinux activado hay que configurar los permisos SELinux igual que los tiene la carpeta original /var/ftp. Si no lo hacemos, veremos bloqueos en el log /var/log/audit/audit.log:

"/usr/sbin/vsftpd" subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1325536433.909:63): avc: denied { read } for  pid=3159 comm="vsftpd" name="testt" dev=dm-0 ino=22445 scontext=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1325536433.909:63): arch=40000003 syscall=5 success=no exit=-13 a0=2523228 a1=98800 a2=adc33c a3=bfd18cb4 items=0 ppid=3157 pid=3159 auid=0 uid=14 gid=50 euid=14 suid=14 fsuid=14 egid=50 sgid=50 fsgid=50 tty=(none) ses=1 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)

Lo más sencillo es usar el comando chcon con el parámetro –reference, de modo que le especificamos el origen del cual copia los permisos contra la nueva ubicación:

# ls -Z /var/ | grep ftp
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 ftp

# ls -Z | grep publico
drwxr-xr-x. root root system_u:object_r:root_t:s0      ftp
# chcon --reference=/var/ftp /publico -R
# ls -Z | grep publico
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 ftp

Reiniciamos el servicio y el acceso a toda la información del nuevo directorio ya debería ser correcta:

# /etc/init.d/vsftpd start

Hemos puesto el caso de un servidor FTP, pero esto es válido para cualquier servicio (Apache, MySQL, Exim, Postfix…)

SELinux ‘semanage: command not found’


semanage (SELinux Policy Management tool) es un comando que permite configurar políticas de SELinux en RHEL, CentOS, etc. Lo más probable es que en un sistema Red Hat 6 instalado por defecto (base) el comando no se encuentre disponible:

# semanage login -l
semanage: command not found

Si visteis el artículo que hice hace un tiempo sobre trucos de yum recordaréis que con “whatprovides” podemos encontrar rápidamente el paquete que contiene un determinado binario/fichero:

# yum whatprovides */semanage
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: sunsite.rediris.es
 * extras: sunsite.rediris.es
 * updates: sunsite.rediris.es
libsemanage-devel-2.0.43-4.el6.i686 : Header files and libraries used to build
                                    : policy manipulation tools
Repo        : base
Matched from:
Filename    : /usr/include/semanage

policycoreutils-python-2.0.83-19.1.el6.i686 : SELinux policy core python
                                            : utilities
Repo        : base
Matched from:
Filename    : /usr/sbin/semanage

policycoreutils-python-2.0.83-19.8.el6_0.i686 : SELinux policy core python
                                              : utilities
Repo        : updates
Matched from:
Filename    : /usr/sbin/semanage

Así que instalamos el paquete (y sus dependencias) y listo:

# yum install policycoreutils-python-2.0.83-19.1.el6.i686
# semanage login -l

Login Name         SELinux User           MLS/MCS Range            

__default__               unconfined_u              s0-s0:c0.c1023
root                      unconfined_u              s0-s0:c0.c1023
system_u                  system_u                  s0-s0:c0.c1023

kernel: post_create: setxattr failed


kernel: post_create: setxattr failed …

En caso de encontrar dicho error en vuestro log messages (/var/log/messages), revisad si tenéis seLinux activado, podéis averiguarlo revisando el fichero de configuración /etc/selinux/config:

$ vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted

Para deshabilitar seLinux en este caso, dejamos el fichero así:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUXTYPE=disabled

Reiniciamos el sistema y el error no debería volver a aparecer.

Deshabilitar SElinux e Iptables en CentOS 5.1


Es probable que en algún momento necesitemos deshabilitar en nuestro sistema operativo CentOS 5 SElinux o el propio firewall IPtables, para ello, simplemente deberemos ejecutar el siguiente comando en nuestra línea de comandos:

system-config-securitylevel-tui

Y una vez dentro elegimos habilitar/deshabilitar SElinux o Iptables:

Deshabilitando Selinux e IPtables