[Jderobot-admin] Ca�da del servidor del finde pasado

Oscar Garcia oscar.robotica en linaresdigital.com
Lun Nov 5 14:20:31 CET 2012


El 05/11/2012 12:06, Borja Mon Serrano escribi�:
> Puede ser que solo fuese un hijo, aunque con estas dos l�neas:
> Oct 27 22:54:42 jderobot kernel: Out of Memory: Kill process 6758
> (apache2) score 41572 and children.
> Oct 27 22:54:42 jderobot kernel: Out of memory: Killed process 6758
> (apache2).
>
> Yo entiendo que lo que se carg� es apache y a todos sus procesos hijos.
> Tampoco es algo que pueda afirmar rotundamente, ya que hasta el jueves
> pasado no me hab�a parado a analizar un syslog.


Precisamente loguea el motivo de la decisi�n y fue que ten�a una 
puntuaci�n de 41572 (basada en tiempo de ejecuci�n) _Y_ que era un hijo, 
no que matara ese y sus hijos (de hecho en la siguiente l�nea explica 
que s�lo ha matado ese proceso).

>     El problema es que hay que dimensionar el servidor (o los procesos
>     servidor) para la RAM que se tiene. Por ejemplo, limitar el n�mero de
>     procesos hijos que puede levantar apache (con zabbix ser�a bueno
>     monitorizar el n�mero) o usar un acelerador web como squid para
>     aligerarle el trabajo.
>
> He estado ech�ndole un ojo a squid y parece un buen servicio. �Se
> asemejar�a al mod_pagespeed de Google [1] o es un servicio complementario?


Nunca he usado mod_pagespeed, pero ese es un m�dulo de apache que 
_MODIFICA_ la p�gina web, hojas de estilos, javascripts e im�genes para 
mejorar el rendimiento de carga de la web. Es decir, pone "inline" 
scripts y hojas de estilo dentro de la p�gina, limpia campos de la misma 
innecesarios para evitar abrir una conexi�n para la p�gina y luego ir 
abriendo nuevas conexiones para dichos scripts u hojas de estilo, 
mejorando la latencia.

Por otro lado modifica las im�genes haci�ndolas coincidir en tama�o con 
el espacio reservado en la p�gina, recomprimi�ndolas optimizando la 
calidad para reducir el tiempo de carga. Esto es �til para gente que no 
tiene nociones de dise�o web y mete una imagen de 5 MP de 2 MB de peso 
en un hueco de 300x200 pixeles, por ejemplo, cuando lo normal es usar 
una aplicaci�n para reducir la imagen original al tama�o deseado y 
ajustar la calidad para conseguir el mejor compromiso calidad/tama�o.

Squid no modifica en nada la p�gina, simplemente almacena en RAM los 
recursos m�s solicitados (p�ginas HTML est�ticas, im�genes, javascripts, 
hojas de estilo, documentos PDF, DOC, etc) y los sirve directamente de 
ella sin ped�rselas de nuevo al servidor web.

Con eso reduces el n�mero de procesos apache2 levantados y tambi�n el 
n�mero de accesos a disco y centras al servidor web en producci�n de 
p�ginas din�micas.


>      Tambi�n se puede limitar el n�mero de sesiones activas de un usuario
>     en /etc/security/limits.conf (maxlogins) para evitar acumulaciones de
>     intentos de entrada svn, rsync, ssh, etc.
>
>
> Ahora mismo el control de acceso de usuarios al svn y a la wiki se hacen
> a trav�s de ldap. �Valdr�a tambi�n en este caso?


Creo que en el caso particular de svn todo va por https (usando el 
servidor web con un m�dulo webdav), en ese caso no est� influido por 
limits, si no por mpm_prefork_module de apache:

<IfModule mpm_prefork_module>
     StartServers          5
     MinSpareServers       5
     MaxSpareServers      10
     MaxClients          150
     MaxRequestsPerChild   0
</IfModule>

Esa es la configuraci�n por defecto, pero hay que "tunearla" para 
maximizar el n�mero de usuarios simult�neos que es capaz de atender el 
servidor web (ser�a ayudado por el acelerador si existiera) y, al mismo 
tiempo, conservar los recursos de memoria al m�ximo minimizando el 
n�mero de procesos levantados.


>     Por otro lado hay que ver qu� m�s procesos se levantan y si hay tareas
>     programadas o bots que hagan algo de manera autom�tica que se puedan ir
>     acumulando si no terminan el trabajo en el tiempo que se supon�a que
>     deb�an hacerlo.
>
> Hay varias tareas en cron que se ejecutan diaria o semanalmente.
> Tambi�n, cada hora, se hace un log del blog y de la wiki con webalizer.
> Tambi�n hay un proceso que se ejecuta cada media hora, aunque no s�
> qui�n lo est� lanzando (porque cron no es), que fue el �ltimo en
> ejecutar antes de la cat�strofe.
>
> Oct 27 22:44:51 jderobot /USR/SBIN/CRON[29129]: (root) CMD (  [ -d
> /var/lib/php4 ] && find /var/lib/php4/ -type f -cmin
> +$(/usr/lib/php4/maxlifetime) -print0 | xargs -r -0 rm)
> Oct 27 22:44:51 jderobot /USR/SBIN/CRON[29055]: (CRON) error (grandchild
> #29129 failed with exit status 1)


Ummm, depende de la versi�n que teng�is del sistema operativo no os 
hab�is percatado de un bug que existe en el script de limpieza de 
sesiones QUE DEBE SER SUBSANADO CON URGENCIA. Parece que tenemos un 
presunto culpable de la ca�da del servidor (aunque puede ser que no lo 
sea, me ha recordado un problema que tuve en mi primer ubuntu 12.04 
server :)

En /etc/cron.d/php5 hay que comentar la l�nea existente y dejar esta m�s 
sencilla:

09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d 
/var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 
-type f -cmin +$(/usr/lib/php5/maxlifetime) -delete

La l�nea del log de cron no es exactamente la que usa "fuser" que es la 
que origina el problema, pero deber�amos tener en cuenta que podr�a ser 
una fuente del problema:

https://bugs.launchpad.net/ubuntu/+source/php5/+bug/876387


>     �Has restado a esa cantidad la cach� de disco usada?
>     �Tuviste en cuenta esos datos para tomar la medida de uso de memoria? �O
>     usaste el valor que te pon�a alg�n comando como top o free?
>
> No, no lo tuve en cuenta, cog� los datos que te ofrece free directamente
> sin tener en cuenta la cach�. Por ejemplo, ahora mismo:
>
> jderobot:~# free -m
>               total       used       free     shared    buffers     cached
> Mem:          2020       1856        163          0        466        780
> -/+ buffers/cache:        609       1410
> Swap:         1608          0       1607
>
> Querr�a decir que tenemos 163MB (aproximadamente) libres, pero que si
> hiciese falta un poco m�s se liberar�a parte (o toda, seg�n se
> requiriese) de la cacheada, que son ~780MB, �no?


S�, en ese caso sobra casi un giga de memoria RAM (incluso algo m�s si 
tenemos en cuenta que una parte de los buffers tambi�n podr�a ser 
liberada en caso de necesidad).

�Coment� que suelo tener el swappiness a 2? Eso minimiza el movimiento 
entre RAM y disco (swap) si �sta no se agota realmente.

# echo "vm.swappiness = 2" >> /etc/sysctl.conf
# sysctl -p

O bien, m�s elegante, pero no actualiza al hacer "sysctl -p":

# echo "vm.swappiness = 2" > /etc/sysctl.d/swappiness.conf
# sysctl -w vm.swappiness=2


>     �Pod�is comprobarlo? Cuando se instalan programas en paralelo que son
>     usados por los gestores de paquetes para ejecutar scripts de instalaci�n
>     o configuraci�n... �puf! es cuando te la juegas.
>
> /usr/local es el directorio por defecto, s�, pero, por ejemplo, perl
> est� instalado en /root/perl5. Despu�s de haber reinstalado perl he
> visto que este es el directorio que �l mismo escoge por defecto. Al
> menos, con la instalaci�n manual.


�Hab�is probado a reinstalar perl en dicho directorio?

Por cierto, �cu�l es el motivo que os ha llevado a instalar una versi�n 
de perl diferente a la que vienen en los repositorios?

La ventaja de tener todo de los repositorios es que al meter una m�quina 
nueva basta con un dpkg --get-selections en la m�quina vieja y luego un 
dpkg --set-selections en la nueva para clonar los paquetes necesarios 
para que ambas se queden igual (se puede filtrar para que s�lo lo haga 
con los php5-*, libapache2-mod-*, etc).

Como mucho habr�a que hacer algo similar con cpan (m�dulos de perl) y 
pecl (m�dulos de php).


>     Por cierto, �no hab�is pensado en redundar la instalaci�n?
>
> Es decir, �tener varios servidores?


S�, por ejemplo. Si se dise�a correctamente permite escalar f�cilmente 
la infraestructura agregando nuevas m�quinas y, sobre todo, ofrece 
tolerancia a ca�das.

Otra soluci�n es usar virtualizaci�n para redundar servicios usando 
menos m�quinas f�sicas (openvz permite eso).


>     Por otro lado, podr�ais meter ciertos servicios dentro de un contenedor
>     virtual dentro de la misma m�quina para limitar los recursos usados. Yo
>     soy un usuario compulsivo de openvz.
>
> �Qu� ventajas proporcionar�a esto? �Ser�a realmente necesario?


La m�s importante es separar m�quinas virtuales entre s�, aisl�ndolas y 
protegi�ndolas ante problemas de memoria, etc.

Ya me he acostumbrado a separar base de datos (y/o almacenamiento) de 
m�quinas de proceso, por lo que �stas son "m�quinas virtuales ligeras" 
(como las de EC2) que requieren poca RAM y que en caso de caer la 
m�quina f�sica posee un balanceador que deja de usar dicha m�quina para 
el trabajo.

En mi ejemplo particular tengo una m�quina f�sica en la que corro dos 
instancias openvz de debian 6 con �nicamente el servidor web y todo lo 
necesario para ejecutar PHP, el servidor de bases de datos est� en la 
m�quina f�sica y las instancias se conectan con ella a trav�s de TCP 
(que es un poco m�s lento que los sockets UNIX, pero en este caso 
prefiero robustez a latencia).

En la m�quina f�sica tambi�n ejecuto un squid que hace de 
acelerador/balanceador web que detecta cuando una de las m�quinas 
virtuales tarda m�s de 2 segundos en responder (o rechaza conexi�n) para 
dejar de usarla.

Es poco frecuente que se caiga un servidor web (aunque ocurre muy de vez 
en cuando) pero nos permite reiniciar el servidor apache de un nodo tras 
instalar las actualizaciones de seguridad sin que exista p�rdida de 
servicio y, en caso de ataque al servidor web, s�lo tendr�an acceso al 
sistema de archivos "virtual" que "ve" el contenedor, no el sistema de 
archivos completo de la m�quina host.

De los ataques (fruct�feros) que hemos sufrido casi todos han sido a 
trav�s del servidor web, accediendo al directorio de usuario de un 
servicio cuya contrase�a no era segura o no estaba la cuenta 
deshabilitada, subiendo al servidor ftp un PHP que permite ejecutar 
comandos de consola. A partir de ah� instalar aplicaciones, bots, 
compilar exploits que te permitan "ascender" a root (como el que se 
puede hacer en las aulas de inform�tica, no recuerdo a qu� profesor le 
advert� que eran n�cleos de linux inseguros).

En ese caso el servidor ftp correr�a de nuevo en un contenedor openvz 
que no contiene servicios innecesarios (y potencialmente con usuarios 
inseguros) y que en caso de ser infectado un usuario de sistema (adm, 
fuse, etc) no ser�a el de la m�quina f�sica, por lo que no se podr�a 
proseguir con el ataque ejecutando esos scripts inyectados desde el 
servidor web.


>     PD: Hablando de ataques, tambi�n recomendar�a usar fail2ban para tener
>     una m�nima defensa contra ataques de fuerza bruta en el servidor ssh (y
>     otros que se configuren) y tener watchlog enviando informes diarios de
>     actividad del servidor.
>
> Vuelvo a lo de antes, primero hay que eliminar el error de las
> dependencias de libc, aunque es cierto que es algo que habr�a que hacer.


Lo entiendo, probad con el tema de dejar funcionando correctamente perl 
en el directorio root (o averiguar el motivo por el que crea conflictos 
en los scripts de instalaci�n de apt).

Otra ventaja de correr contenedores virtuales es poder hacer snapshots 
de estados en los que la m�quina funciona correctamente y volver a ellos 
en caso de meter la pata y borrar algo importante que impida que �sta 
siga funcionando correctamente.

Si se redundan en m�quinas f�sicas en vez de contenedores virtuales 
entonces se puede reinstalar la m�quina sin perder servicio.

Aunque es un mensaje muy largo espero que al menos haya explicado bien 
las ventajas que tiene (al menos para m�) usar contenedores openvz 
dentro de una misma m�quina f�sica.

Un saludo.


More information about the Jderobot-admin mailing list