jueves, 26 de septiembre de 2013

Cómo sortear el "bug" de Amazon basado en las AMIs de RHEL 6.4.

Las AMIs de Amazon para RHEL 6.4, traen consigo un bug, dicho bug pertenece a la aplicación cloud-init y una mala configuración del rc.local.

El bug se basa en lo siguiente, al iniciar una ami, basada en una que has creado, esta no se inicia correctamente, por que se han añadido en el fichero sshd_config, 2 líneas de forma errónea, estas líneas son:

UseDNS no
PermitRootLogin without-password

Que debido al error, aparecen almacenadas de la siguiente forma:

UseDNS no
PermitRootLogin without-passwordUseDNS no

Esto provoca que la máquina no se levante correctamente. Si te pasa esto y necesitas acceder a esa máquina, la solución es que conectes el volumen de la máquina que falla, como secundario en otra máquina que si se inicie, una vez conectado el volumen, accedes a él desde la máquina y modifica el sshd_config para eliminar las líneas extrañas.

#vi /etc/ssh/sshd_config

Una vez modificado, vuelves a adjuntar el volumen a tu máquina y se debería conectar correctamente.

Para solucionarlo definitivamente, has de eliminar las siguientes líneas del fichero /etc/rc.local :

cat <> /etc/ssh/sshd_config
UseDNS no
PermitRootLogin without-password

Por supuesto, cuando modifiquéis las líneas del sshd_config, reiniciar el servicio de ssh.

Vamos ahora al segundo bug, levantas tu ami, que sabes que tiene un usuario creado, intentas acceder a ella y te dice que “acceso denegado”, lo intentas con los certificados de Amazon y te deja perfectamente.

Tu estás completamente seguro, que antes de crear la ami, podías acceder con un usuario que has creado, ¿por qué ahora no puedes acceder?

Fácil y sencillo, simplemente por que el cloud-init” ha modificado por ti la variable PasswordAuthentication” y le ha puesto un no.

La solución rápida, entrar con el certificado, cambiar la opción a yes y reiniciar el servicio ssh.

La solución definitiva, editar el fichero /etc/cloud/cloud.cfg

y cambiar la variable ssh_pwauth:” 1, ya que por defecto está a 0.

Y esto es lo que provoca, que cuando levantas una ami basada en RHEL 6.4 no puedas acceder a ella.

Espero que os sirva chicos!!

jueves, 20 de junio de 2013

Premio Liebster, para miiiiiiiiiiiiiiiiiiiiii! :D






Con un poco de retraso, pero aquí estamos, como soy un poco egocéntrica voy a decir...

Siiiiiiiii!!!! me he llevado un premio por que me lo merezco, de L'oreal!!

Es el premio Liebster, de blogs pequeños para blogs pequeños, ojo, pequeños pero importantes para el que lo da.

A mi me lo ha dado Akil3s de http://www.1gbdeinformacion.com/, un blog muy valorado y muy importante para mí, que nos enseña sobre diferentes temas de la informática, para hacérnosla a todos mas fácil!! eh!! no solo temas sencillos, tiene para enseñarnos a todos los niveles! Así que Akil3s, muchas gracias!!! te debo unos zumitos con morcilla y patatas bravas! Te hace?

Bueno, ahora tengo que responder a unas preguntas, odio responder preguntas XD
Es que soy muy distraída y contestar preguntas “escritamente” hace que me concentre mucho.... XD

Venga, voy!!

¿Por qué decidiste crear un blog y cuándo empezaste?

Pues lo hice para contar mi superviaje a México... http://monimandarina.blogspot.com.es/2007/08/viajando-por-el-mundo.html al final eso, se quedó en el olvido y se quedó en un blog personal y esporádico! En el hablaba de moñadas de chicas, sobre mis piercings, mi escarificación...y poco a poco fui metiendo cosillas...me acabo de dar cuenta, que en breve va a cumplir 6 añitos! Que fuerte! En resumen, empecé en Agosto de 2007.

¿Qué significado tiene para ti la seguridad?

Mmmm......Como explicarlo, pues es a lo que me gustaría dedicarme, o por lo menos, tener la oportunidad y que parte de mi trabajo sea en este ámbito!!

¿Cuál ha sido el post de tu blog que más éxito ha tenido? ¿A qué lo atribuyes?

Un post que hablaba sobre el piercing industrial que llevaba en la oreja, 2 días antes de hacerme la escarificación, por qué, pues ni idea, pero tiene a día de hoy 7750, imagino que habrá 7750 personas que se quieren hacer un piercing XD

La segunda entrada es mas técnica:


Un total de 6678 :D


¿Que crees que deberíamos cambiar en la educación a los menores?

Es complicado, tienen muchas facilidades para acceder a la tecnología sin ningún conocimiento y sin nadie que les guíe! Deberíamos acercarnos mas a ellos, para contarles (yo la primera) y debería dejarnos acercarnos para enseñarles. Este tipo de cosas, es “cosa de 2” :D

¿Has vivido algún hecho importante a través del blog?

Del blog en sí, no, gente que no he desvirtualizado aún que nos llevamos siguiendo varios años XD
Y a toda la gente que conozco del entorno de la seguridad, ha sido mas por twitter.
Y sacando mi vena gamer, que una persona me diera las gracias por escribir una guía sobre Arthas HC!!


¿De dónde te nace la inspiración para escribir y continuar con el blog?

Especialmente escribo chuletas, de cosas que me cuesta encontrar y que además están en inglés, intento explicarlo lo mejor posible para que otra persona con el mismo problema, pueda serle útil, también me pongo chuletas para mí XD aunque reconozco que a veces olvido que he escrito sobre algún tema y cuando me encuentro a mi misma, me hace gracia :D

¿Qué has aprendido a nivel personal o profesional en el último año?

Tantas cosas que no puedo ni contarlas, así que, respuesta corta!

¿Cuál es tu frase célebre favorita?

Perdona??!! (dicho con tonillo)
Es broma, esta es mía XD
Frase célebre que digo mucho es: “lo cortés no quita lo valiente”, jajajaja, es la mejor frase.


¿Qué consejo darías a las personas que empiezan en esto de la seguridad?

Que sigan, que a veces es complicado, son muchas cosas, pero que se apoyen en la gente que tienen cerca, por que seguro que les van a contar algo que les va a inspirar a seguir.


Casi todos los que tenemos un blog, escribimos sobre lo que realmente nos gusta o motiva, ¿Cómo le explicarías a alguien la importancia de la vocación por algo, de perseguir los sueños…?

Lo bien que sienta cuando ves que llegas a la gente, o simplemente, la sensación que tiene tu cuerpo cuando te mencionan un tema en concreto, solo por eso, merece la pena seguir.




Pues ale, se acabaron las preguntas, jope...que tostón!

Nuevamente darle las gracias a Akil3s por este supermegapremio!! si me haces algo bonito lo imprimo y lo cuelgo, cual marco XD

y....redoble de tambores.....

Mis nominados son........trrrrrrrrrrrrrrrrrrrrrr....


Un blog para administradores de sistemas, que me ha salvado el pellejo varias veces con Nagios y CentOS.

Se que no me conoces, pero te leo XD y ahora te sigo!! como molo! :D

Y un blog, que no tiene nada que ver con la informática, pero que me gusta mucho...aunque ahora lo tienen abandonado XD pero te voy a dar el premio por todos los años que me has dado:


Ya vas a tener que hacer un post! Te estoy obligando!

Voy a hacer 2 rondas de preguntas, que @dreamore85 no es del entorno :D, la primera ronda para @jordi_prats:



¿Por qué decidiste crear un blog y cuándo empezaste?
¿Qué significado tiene para ti los sistemas?
¿Cuál ha sido el post de tu blog que más éxito ha tenido? ¿A qué lo atribuyes?
¿Que crees que deberíamos cambiar en la educación a los menores?
¿Has vivido algún hecho importante a través del blog?
¿De dónde te nace la inspiración para escribir y continuar con el blog?
¿Qué has aprendido a nivel personal o profesional en el último año?
¿Cuál es tu frase célebre favorita?
¿Qué consejo darías a las personas que empiezan en esto de los sistemas?
Casi todos los que tenemos un blog, escribimos sobre lo que realmente nos gusta o motiva, ¿Cómo le explicarías a alguien la importancia de la vocación por algo, de perseguir los sueños…?
¿qué te gustaría ser de mayor?


La segunda ronda de preguntas, para @dreamore85:

¿Por qué decidiste crear un blog y cuándo empezaste?
¿Qué significado tiene para ti los cerditos?
¿Cuál ha sido el post de tu blog que más éxito ha tenido? ¿A qué lo atribuyes?
¿Que crees que deberíamos cambiar en la educación a los menores?
¿Has vivido algún hecho importante a través del blog?
¿De dónde te nace la inspiración para escribir y continuar con el blog?
¿Qué has aprendido a nivel personal o profesional en el último año?
¿Cuál es tu frase célebre favorita?
¿Qué consejo darías a las personas que empiezan en esto de los blogs?
Casi todos los que tenemos un blog, escribimos sobre lo que realmente nos gusta o motiva, ¿Cómo le explicarías a alguien la importancia de la vocación por algo, de perseguir los sueños…?
¿Qué te gustaría ser de mayor?


Pues ya he terminado, joer...que post mas tocho!!

Pues nada coleguis!! os dejo! Espero no haberos aburrido mucho!!

Un saludo a todos!!

martes, 28 de mayo de 2013

Problemas de bloqueo en Drupal con Load Balancer de Amazon

La versión 7 de Drupal, trae como característica el bloqueo de ataques de fuerza bruta, es decir, cuando una IP falla el login, Drupal mete la IP en la tabla ‘flood’ de MySQL; cuando se llega a X intentos, Drupal bloquea el acceso a dicha IP y no podrá volver a hacer login en X tiempo (todo esto es configurable en settings.php).


Dicha característica está muy bien cuando el frontal web está de cara al público y no se encuentra tras un Proxy o Balanceador, en este último caso, dicha “feature” se puede convertir en un infierno, ya que los intentos fallidos para Drupal, se muestran con la IP interna del Proxy o Balanceador y esto puede provocar, que si hay un bloqueo por intentos fallidos, absolutamente tooooodos los usuarios de Drupal, estén donde estén, sean bloqueados y no puedan hacer login en la aplicación.


La ñapa de esto, es hacer un ‘TRUNCATE’ de la tabla flood, al vaciarla, se volverá a acceder.


La solución a esto, es utilizar la variable X-FORWARDED-FOR para que Drupal vea exactamente la ip origen del cliente y bloquee correctamente las IPs (toda la info de esta variable se encuentra en el settings.php).


Ahora demos una vuelta de tuerca más, si la web está tras un Proxy o un Balanceador, tendremos todas sus IPs y será fácil de configurar, pero que pasa, si nuestro Drupal está en una instancia tras un Load Balancer de Amazon.


Pues que tenemos un problema.


Amazon es muy divertido y bonito para muchas cosas, pero como esas cosas son suyas, hay elementos a los que les cambia la IP como le apetece y cuando le apetece.


Por otro lado, todos podemos conocer la IP pública de un Balanceador de Amazon, sin embargo, no podemos saber realmente la IP interna de dicho Balanceador, eso si, nos aparecerá en todos los logs de acceso de las aplicaciones que tengamos y en la tabla ‘flood’ de Drupal, también. XD


Si echáis un vistazo a la configuración de X-FORWARDED-FOR en el settings.php, veréis que nos pide una IP fija, pero no la tenemos.


Gracias al IRC de #drupal-es y a NITEMAN en especial que me atendió y me dio muchísima información, pude sacar la solución.


Esta solución se basa en este link:




Y un poco modificado, hizo que las IPs de origen, fueran realmente las de los clientes, provocando así un bloqueo real de las IPs.


Mi configuración final en el settings.php de Drupal, ha sido la siguiente:


*/Hay que descomentar esta línea y marcarla como TRUE para que active este modo.


$conf['reverse_proxy'] = TRUE;


/**
* Specify every reverse proxy IP address in your environment.
* This setting is required if $conf['reverse_proxy'] is TRUE.
*/
#Se agregan estas líneas para que Drupal no bloquee todos los accesos, ya que solo verificaba la IP interna del balanceador
#Esta línea captura la IP interna del balanceador.


$conf['reverse_proxy_addresses'] = array_map('gethostbyname', array_map('gethostbyaddr', gethostbynamel($_SERVER['REMOTE_ADDR'])));


/**
* Set this value if your proxy server sends the client IP in a header
* other than X-Forwarded-For.
*/
#Esta línea, cambia la IP interna del balanceador por la IP origen del cliente.


$conf['reverse_proxy_header'] = 'HTTP_X_FORWARDED_FOR';


#Información adicional sobre las variables utilizadas:
#Tanto REMOTE_ADDR como HTTP_X_FORWARDED_FOR se ha sacado del acceso a Drupal, en la siguiente ruta
#Informes -> Informe de estado -> PHP ** clikar en "mas información"
#se abrirá el PHPINFO de Drupal y en Apache Environment, tendremos estas variables.
#REMOTE_ADDR tendrá que indicarnos la IP interna del Balanceador
#HTTP_X_FORWARDED_FOR tiene que darnos la IP origen del cliente.


Con estos cambios que hemos realizado, al hacer un login fallido, en la tabla ‘flood’ de Drupal, deberían aparecer las IP origen del cliente.

Espero que os sirva a esos que estáis empezando a implementar Drupal en Amazon con Balanceadores!!

Un saludo a todos.


ACTUALIZACIÓN: Es muy importante, que si utilizáis esto verifiquéis, que el acceso a esta web, solamente se puede hacer a través del balanceador. Si un usuario malintencionado averigua la IP real de la máquina y tiene acceso vía web, puede enviar cabeceras modificadas y hacer cositas con nuestra web.


viernes, 17 de mayo de 2013

Configurar Apache como "proxy" de Tomcat.



Actualmente, cuando instalamos un tomcat, queremos ponerle un apache como “proxy”, el apache recibe las peticiones en el puerto 80 y las redirige a tomcat.

Para ello, instalaremos un apache y un tomcat, y haremos sus configuraciones independientes para que funcionen * y como siempre utilizar las guías básicas de bastionado para que sean seguras.

Una vez hecho eso, habilitaremos los siguientes módulos en apache:

proxy_ajp.load
proxy.conf
proxy.load

Para ello, primero revisaremos que no están ya habilitados.
En la ruta /etc/apache2/ tenemos 2 directorios llamados:

mods-available
mods-enabled

En mods-enabled se encuentran los módulos ya habilitados, si no están los nuestros, iremos al directorio mods-available y los habilitaremos, el comando a utilizar es:

a2enmod [nombre_módulo]

Cada vez que lo habilitemos, nos pedirá reiniciar el apache para activarlos, por lo que cuando finalicemos con todos los módulos, reiniciaremos el apache.

Una vez reiniciado, verificamos en mods-enabled que están nuestros módulos.

Ahora pasaremos a la configuración de la “conexión” entre apache y tomcat, para ello, simplemente en el directorio /etc/apache2/sites-available crearemos el fichero del proyecto que necesitemos y le añadiremos la siguiente información:

       ServerName moni.mandarina.com
       ProxyPass /  ajp://localhost:8009/
       ProxyPassReverse / ajp://localhost:8009/
       ErrorLog ${APACHE_LOG_DIR}/monimandarina_error.log
       LogLevel warn
       CustomLog ${APACHE_LOG_DIR}/monimandarina_access.log combined

Hemos creado un vhost con la url a la que debe responder el servicio, con las líneas ProxyPass y ProxyPassReverse, le estamos indicando que “dirija” la información a tomcat.
Haremos un link simbolico desde sites-enabled hacía el vhost que acabamos de crear.

Ahora recargaremos la información del apache

#/etc/init.d/apache2 reload

Si todo está OK y tenemos nuestras configuraciones bien hechas, deberían funcionar correctamente las aplicaciones de tomcat sobre el puerto 80 y a través de Apache.


PD: Estoy aprendiendo a usar Apache, es posible que me falte algo en la configuración, pero juraría que no.

jueves, 16 de mayo de 2013

Chuleta: Al reiniciar Mysql se queda pensando...


Tenemos que reiniciar el mysql y se queda "cuajado" (como yo digo), vamos al log, y nos encontramos este "error"/"warning":

kernel: [23231693.108005] type=1400 audit(1368692432.585:69): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=3703 comm="apparmor_parser"
init: mysql main process (3707) terminated with status 1
init: mysql main process ended, respawning
init: mysql post-start process (3708) terminated with status 1

y sueltas un....mecagoentu****madre la que me has liado!

Que nooo...que no es culpa de MySQL, que es culpa tuya!!

Revisa el fichero /etc/mysql/my.cnf y comprueba que el apartado bind-address no tiene ninguna ip extraña.

Debería tener o 0.0.0.0, localhost, 127.0.0.1, su ip.

Si no es así, pon lo que mas te convenga.

En caso de que esta, no sea tu solución, revisa otros posts como https://www.google.es/search?q=init%3A+mysql+post-start+process+(3708)+terminated+with+status+1&aq=f&oq=init%3A+mysql+post-start+process+(3708)+terminated+with+status+1&aqs=chrome.0.57j58.257j0&sourceid=chrome&ie=UTF-8

miércoles, 15 de mayo de 2013

Configurar Sudo con LDAP y PHPLdapAdmin.


Necesitamos permitir, que los usuarios que accedan por LDAP a los clientes, puedan hacer sudo su en las máquinas.


Para ello, hay 2 formas, o agregamos el usuario al fichero /etc/sudoers de cada máquina cliente o lo hacemos a través del LDAP.


Nosotros lo haremos vía LDAP para tenerlo centralizado.


En primer lugar, accederemos al servidor de LDAP y crearemos el “schema” SUDOers para LDAP en la siguiente ruta:


cd /etc/openldap/schema/
#vi sudo.schema


Agregaremos la siguiente información:


######################################################
###Se crea sudo.schema para que sea el LDAP el que ###
###permita hacer sudo en los hosts del LDAP.        ###
######################################################

attributetype ( 1.3.6.1.4.1.15953.9.1.1
 NAME 'sudoUser'
 DESC 'User(s) who may  run sudo'
 EQUALITY caseExactIA5Match
 SUBSTR caseExactIA5SubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.2
 NAME 'sudoHost'
 DESC 'Host(s) who may run sudo'
 EQUALITY caseExactIA5Match
 SUBSTR caseExactIA5SubstringsMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.3
 NAME 'sudoCommand'
 DESC 'Command(s) to be executed by sudo'
 EQUALITY caseExactIA5Match
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.4
 NAME 'sudoRunAs'
 DESC 'User(s) impersonated by sudo'
 EQUALITY caseExactIA5Match
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.5
 NAME 'sudoOption'
 DESC 'Options(s) followed by sudo'
 EQUALITY caseExactIA5Match
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.6
 NAME 'sudoRunAsUser'
 DESC 'User(s) impersonated by sudo'
 EQUALITY caseExactIA5Match
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.7
 NAME 'sudoRunAsGroup'
 DESC 'Group(s) impersonated by sudo'
 EQUALITY caseExactIA5Match
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.15953.9.1.8
 NAME 'sudoNotBefore'
 DESC 'Start of time interval for which the entry is valid'
 EQUALITY generalizedTimeMatch
 ORDERING generalizedTimeOrderingMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )

attributetype ( 1.3.6.1.4.1.15953.9.1.9
NAME 'sudoNotAfter'
 DESC 'End of time interval for which the entry is valid'
 EQUALITY generalizedTimeMatch
 ORDERING generalizedTimeOrderingMatch
 SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )

attributeTypes ( 1.3.6.1.4.1.15953.9.1.10
  NAME 'sudoOrder'
  DESC 'an integer to order the sudoRole entries'
  EQUALITY integerMatch
  ORDERING integerOrderingMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top AUXILIARY
 DESC 'Sudoer Entries'
 MUST ( cn )
 MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $ sudoOrder $ description )
      )



Esta información define el esquema del rol SUDOers, si comenzamos desde arriba, veremos todos los atributos de los que disponemos, las últimas líneas, pertenecen al Objeto SudoRole, si os fijáis he puesto AUXILIARY, si buscáis mas info sobre este esquema, encontraréis que pone ESTRUCTURAL, con ambos funciona, pero si usáis PHPLdapAdmin, os recomiendo que pongáis AUXILIARY, ya que si no, hay posibilidades de que el ROL no aparezca para elegirlo, pero si aparecerá en la estructura.


Una vez guardado el fichero, le indicaremos al LDAP su existencia:


#vi /etc/openldap/slapd.conf

include         /etc/openldap/schema/sudo.schema


Reiniciamos el servicio de LDAP:


#/etc/init.d/ldap restart


Aquí es donde si no tenéis PHPLdapAdmin, tendréis que pasaros a otra guía, ya sabéis que no me gusta subir cosas que no he probado.


Pero sólo podrán hacer “sudo su” los usuarios que se encuentren en el grupo SUDOers del LDAP.


Para ello, abriremos el PHPLdapAdmin y crearemos la OU “SUDOers”, una vez creado, agregaremos un nuevo ObjectClass, este será SudoRole, que con los cambios realizados anteriormente, debería aparecer.


Al agregarlo, nos obligará a identificar un CN, este CN sería el nombre del grupo, por decirlo de algún modo.


Ahora podremos agregar los atributos que necesitamos:


sudoCommand
sudoHost
sudoUser
sudoOption


En sudoCommand, pondremos ALL para poder ejecutar cualquier comando, se pueden poner comandos específicos o ![comando] para denegar la ejecución de un comando específico.


En sudoHost, podemos poner ALL para cualquier PC o la ip o nombre del host.


En sudoUser pondremos los nombres de los usuarios que puedan acceder.


En sudoOption podemos indicar que o hace falta password al hacer “sudo su” con un NOPASSWD.




Ya tenemos finalizada la configuración del servidor, ahora pasemos a la de los clientes.


En el cliente, editamos el siguiente fichero:


#vi /etc/ldap.conf


Y agregamos estas líneas al final:


sudoers_base ou=SUDOers,dc=dominio,dc=raíz
#sudoers_debug 2


Con esto, indicamos la ruta de búsqueda de los usuarios que pueden realizar un “sudo su”. La línea de sudoers, la descomentaremos, si tenemos algún problema al realizar el sudo y que nos muestre si la conexión se está realizando correctamente o donde puede estar el fallo.

Con esto se finaliza la configuración de Sudo desde LDAP.