[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