Archivos Mensuales: febrero 2012

Consejos de seguridad para un servidor linux

Tras mi experiencia de 5 años como sysadmin Linux, he aprendido qué cosas evitar a la hora de tener un servidor Debian relativamente seguro.

Casi todas estos consejos parten de la paranoia y algunos simplemente se rigen por el sentido común, pero merece la pena listarlos y revisarlos de vez en cuando.

Allá vamos:

- Utilizar siempre que sea posible conexiones cifradas cuando vamos a trabajar con datos sensibles:
Protocolos como SSH, SCP y https fijan transmisiones de datos cifradas.
Con ello evitamos ademas de que nos snifen el tráfico, pudiendo acceder a datos sensibles y contraseñas, ataques tipo man in the middle.

- Password robustos y encriptados:
Utilizar siempre password robustos. “Churros” de mínimo ocho caracteres, con al menos un caracter en mayúsculas, uno en minúsculas y uno numérico.
Ejemplo: Ax84jMn4

Es de sentido común que el password de root de nuestro sistema no sea ’12345′.

- Mantener el servidor actualizado.
Debian especialmente y en general las distribuciones derivadas suelen tener un exhaustivo control de actualizaciones y reparaciones de bugs. Para ello, tenemos que tener entre nuestros repositorios, los repositorios oficiales de seguridad
Actualizar un sistema debian es tan facil como teclear:

apt-get update
apt-get upgrade

- Cuidado con el software de origen dudoso .
Vigilar qué tenemos en nuestro fichero sources.list. Intentar utilizar solo repositorios oficiales.

- Desinstalar o deshabilitar servicios innecesarios
Para ello podemos hacer uso del comando chkconfig (originario de distribuciones basadas en rpm, existe también para debian)
La idea es parar y deshabilitar el arranque de servicios que no vamos a necesitar.

- FIREWALL
Intentar filtrar todas las conexiones entrantes mediante un firewall, denegando el acceso a servicios cuya conexión desde el exterior no es necesaria. Si no disponemos de un firewall, más abajo hablo de IPTABLES.

- No instalar el entorno gráfico y mucho menos, ejecutarlo como root:
No tiene sentido tener las X en un servidor en producción. Si tenerlo arrancado de por sí ya es un agujero de seguridad y una fuente de inestabilidad del sistema, no hablemos de arrancarlo con el usuario root.

- Separación de particiones
Separar las particiones siempre es una buena idea. Tanto en lo que a seguridad se refiere, como a la hora de evitar que el disco se llene.

Lo ideal suele ser separar en particiones diferentes los directorios /var/, /home/, /usr/, /boot y /tmp.

- Fijar como Noexec las particiones que no vayan a necesitarlo, sobre todo /tmp

Una vez separadas las particiones, lo ideal es fijar (al menos) el directorio /tmp como noexec.

De esta forma, ante una posible intrusión, no se pueden ejecutar binarios desde /tmp, cosa bastante habitual cuando se intenta ejecutar código malicioso en un servidor.

- Revisar con frecuencia logs y gráficas de rendimiento.

Especialmente las gráficas de cpu y tráfico nos pueden ayudar a localizar comportamientos inapropiados, como un incremento de ancho de banda o de uso de cpu, que pudiera deberse a código malicioso, envíos de emails, shells, etc.

- cuidado con el comando Sudo, que lo carga el diablo:

Si puede ser, que no esté habilitado más que para lo estrictamente necesario.

Una entrada de este tipo en el fichero sudoers:

usuarioxx ALL=(ALL) ALL

puede suponer dar privilegios de root automaticamente al usuario que consiga el password de un usuario regular.

- Shell por defecto de usuarios que no necesiten loguearse:

Si existe un usuario en el sistema con el que vamos a ejecutar algún tipo de proceso, o que van a ser necesarios para conexiones via FTP, pero no van a necesitar loguearse en linea de comandos, podemos fijar su shell por defecto como /bin/false.

El usuario seguirá existiendo, podrá ser propietario de ficheros/directorios, podrá ingresar via FTP, pero jamás ejecutar una shell.

Para ello, editamos el fichero /etc/password, y en la linea donde están definidas las opciones de usuario, al final, definimos su shell como /bin/false:

usuarioFtp:x:3000:3000:,,,:/home/usuarioFtp:/bin/false

Permisos:
- chmod 777 está prohibido:
Nunca nunca nunca, hacer cambios de permiso a lo loco. hacer un chmod 777 sobre un fichero o un directorio está prohibido. Y más aun si se hace para solucionar algún problema de permisos que no sabemos como atajar.

Recomendaciones concretas en diferentes tipos de servicios:

SSh
- prohibir loguearse como root :

en el fichero de configuración (/etc/ssh/sshd_config), podemos deshabilitar la opción PermitRootLogin, fijandola en No:

PermitRootLogin no

De esta forma siempre tendremos que loguearnos como un usuario regular y escalar a root.

- Permitir el acceso sólo a los usuarios indicados

Al igual que para deshabilitar el login con el usuario root, podemos indicar qué usuarios podrán conectarse con la siguiente directiva en /etc/ssh/sshd_config:

AllowUsers mijack operador

De esta forma, permitimos solo al usuario mijack y al usuario operador ingresar en el sistema. Si hubiera más usuarios no podrían acceder via ssh.

Apache:
Uso de mod_secure:
- Para evitar inyecciones de código en nuestros sitios web, podemos activar el módulo mod_secure, que dispone de unas directivas por defecto muy completas que bloquearan URLS sospechosas. En ocasiones es demasiado restrictivo.

proteger con htpasswd
- Todo directorio o ruta sensible a ingresos de usuario no deseados o con contenido sensible, puede ser protegido mediante htpasswd. De esta forma al intentar acceder a una url concreta, nos pedirá user y password.

MySQL:
- Fijar siempre un password de root:
De no fijar un password de root para MySQL (por defecto vacio en muchas distribuciones de linux), cualquier usuario regular podrá loguearse en el sistema tecleando:
$ mysql -u root
- Cada bases de datos con su usuario y password:
Si existen varias bases de datos en nuestro sistema, es recomendable que cada una tenga un usuario y password de acceso. De forma que el usuario de una base de datos no pueda escribir en todas.
- Evitar conexiones externas.
Por defecto MySQL no admite conexiones externas puesto que solo escucha las peticiones desde localhost. Es preferible no cambiar esa configuración si no es necesario cien por cien.

Modo ultraparanoia:

- iptables:
iptables (antiguamente ipchains) es un framework inlcuido en el nucleo de linux que permite filtrar los paquetes de red, denegando o aceptando trafico dependiendo de multiples factores.

Si tenemos un nivel majo de paranoia, podemos configurar iptables para rechazar todo el tráfico que no se adapte al puramente necesario.

El funcionamiento de iptables es complejo puesto que también se puede usar para el enrutado de tráfico y nateo de puertos.

Ejemplo:
Rechazamos todo el tráfico por el puerto 22, y luego establecemos que solo aceptaremos el de una ip en concreto, xxx.xxx.xxx.xxx:
iptables -t filter -I INPUT -p tcp –dport 22 -j DROP
iptables -t filter -I INPUT -p tcp -s xxx.xxx.xxx.xxx –dport 22 -j ACCEPT

- SELinux (del inglés Security-Enhanced Linux, Seguridad Mejorada de Linux):
Creado a imagen y semejanza del control de acceso utilizado por el departamento de defensa de los Estados Unidos, SELinux implementa unas políticas de seguridad y controles de acceso extremadamente flexibles, con la posibilidad de ser a su vez, extemadamente paranoicas.

Algunas distribuciones, como CentOS, lo traen activado por defecto.

SELinux Permite el control total de usuarios, procesos archivos y sockets, de forma que según lo restrictivos que seamos al configurarlo, podemos impedir la ejecucion de servicios o binarios, el login de usuarios que no estén en la lista de permitidos o incluso la escritura en determinados directorios.

Seguiremos añadiendo cosas

Saludos.

MiJacK.

Instalando awstats en Debian Squeeze para obtener estadísticas de nuestros sitios web

AWStats es una herramienta open source de análisis de tráfico web. Saca los datos de los logs de apache y a partir de esos datos genera los informes.

Awstats puede ser un complemento perfecto a otras herramientas como Google Analytics. Además de las visitas, podremos consultar el tráfico real generado, tamaño de ficheros, tráfico por MIME Type, etc.

Vamos a instalar awstats en un servidor debian que ya tiene un apache funcionando desde hace algún tiempo y vamos a sacar las gráficas del dominio albumdata.com

Comenzamos instalando el paquete awstats


apt-get install awstats

Nos genera una configuración standard en /etc/awstats. Vamos a hacer una copia del fichero y a personalizarlo para nuestro dominio

  cd /etc/awstats
  
  cp awstats.conf awstats.albumdata.com.conf

Editamos el fichero awstats.albumdata.com.conf y modificamos solamente estos tres valores:

El fichero de log de apache para el sitio que queremos analizar


LogFile="/var/log/apache2/albumdata_access.log"

El nombre de dominio

SiteDomain="albumdata.com"

El/los posibles alias. en mi caso, las llamadas a www.

HostAliases="www.albumdata.com"

Por último vamos a configurar el acceso en el virtualhost que queramos. Yo añado al sitio por defecto (el que muestro cuando hago una peticion por ip http://xx.xx.xx.xx)

editamos /etc/apache2/sites-enabled/000-default

y añadimos:


Alias /awstats-icon/ /usr/share/awstats/icon/
        ScriptAlias /awstats/ /usr/lib/cgi-bin/

De esta forma, si llamamos al sitio http://xx.xx.xx.xx/awstats/awstats.pl?config=albumdata.com , veremos las gráficas.

La primera vez que visitemos el sitio las gráficas estarán vacias puesto que aun no hemos recopilado los datos de los logs.

El funcionamiento de awstats se basa en la ejecucion del comando /usr/lib/cgi-bin/awstats.pl, indicandole el dominio que del que queremos extraer las gráficas.

Para ello, lo más práctico es fijar un cron con la frecuencia que deseemos (en mi caso cada hora).

La primera ejecucion la haremos a mano:


# /usr/lib/cgi-bin/awstats.pl -config=albumdata.com -update
Create/Update database for config "/etc/awstats/awstats.albumdata.com.conf" by AWStats version 6.95 (build 1.943)
From data in log file "/var/log/apache2/albumdata_access.log"...
Phase 1 : First bypass old records, searching new record...
Direct access to last remembered record has fallen on another record.
So searching new records from beginning of log file...
Phase 2 : Now process new records (Flush history on disk after 20000 hosts)...
Flush history file on disk (unique url reach flush limit of 5000)
Flush history file on disk (unique url reach flush limit of 5000)
Flush history file on disk (unique url reach flush limit of 5000)
Flush history file on disk (unique url reach flush limit of 5000)
Jumped lines in file: 0
Parsed lines in file: 98320
 Found 0 dropped records,
 Found 16 corrupted records,
 Found 0 old records,
 Found 98304 new qualified records.

Por último, vamos a securizar un poco awstats, configurando un htaccess para que al ver las gráficas nos pida un user y password.

En el fichero del virtualhost de apache donde vayamos a colocar el acceso a awstats (en mi caso 000-default), justo debajo de las lineas que pusimos antes, ponemos estas

 
 <Directory /usr/lib/cgi-bin/>
        AuthName "Acceso restringido a Estadísticas"
        AuthType basic
        AuthUserFile /etc/awstats/.htpasswd
        require valid-user
    </Directory>

Ahora generamos el fichero .htpassword para el usuario “user”


htpasswd -c /etc/awstats/.htpasswd user

Reiniciamos apache, y ahora al acceder a las graficas nos pedira un user y password, que se correspondera con el que acabamos de crear.

Hecho todo esto, obtenemos unas estadísticas muy completas, algo parecido a esto.

Saludos.

MiJacK