viernes, 21 de octubre de 2016

Dirty Cow en CentOS

Detectar el bug en CentOS



Esta vulnerabilidad está registrada conel código CVE-2016-5195, aunque se ha hecho popular como Dirty Cow (Copy On Write). Según el informe oficial de Linux, este fallo lleva presente en el sistema operativo desde el año 2007, aunque no había sido detectado hasta ahora por los expertos de seguridad de Red Hat.

Debido a que determinadas tareas se ejecutan en un orden incorrecto, el Kernel almacena una copia de las páginas de memoria con datos privados en vez de borrarlas una vez procesadas.
Básicamente se trata de un bug que permite la escalada de privilegios hasta el nivel superior.

A pesar de que este fallo no ha sido considerado como crítico por los investigadores ni por el Linus Torvalds, los expertos de seguridad que la han descubierto aseguran que debemos tomarla en serio ya que se trata de un fallo real.
La existencia de un exploit disponible en internet la hace más peligrosa.

Proceso de parcheado:



Descargamos el script oficial de Red hat:

# wget https://access.redhat.com/sites/default/files/rh-cve-2016-5195_1.sh



Lo ejecutamos:

# chmod 700 rh-cve-2016-5195_1.sh
# ./rh-cve-2016-5195_1.sh



Si la salida es la siguiente, significa que estamos afectados por el bug:
Your kernel is 2.6.32-573.3.1.el6.x86_64 which IS vulnerable.
Red Hat recommends that you update your kernel. Alternatively, you can apply partial
mitigation described at https://access.redhat.com/security/vulnerabilities/2706661 .



A la espera de la publicación por parte de Red Hat del parche oficial, se recomienda actualizar el kerrnel

CVE-2016-5195

# yum update kernel
# reboot



viernes, 22 de julio de 2016

CentOS-6 : Alta Disponibilidad activo/pasivo con Crosync-Pacemaker + DRBD (III)

Configuración del Cluster





    Observaciones


  • Desactivamos firewall y SELinux en ambos nodos.
  • El usuario administrador del cluster será hacluster.
  • Desactivaremos el Quorum, trabajando con dos nodos no tiene sentido.
  • El nombre elegido para el cluster es BP.
  • Daremos preferencia a node-1 para trabajar como Master.
  • Crearemos los siguientes recurosos para el DRBD.
    • Para los datos : BP_data.
    • Para la sincronización : BP_syncro.
    • Para el filesystem : BP_fs.


Instalamos paquetes en ambos nodos:

yum install corosync pcs pacemaker cman



Configuramos la contraseña para el usuario hacluster:

[node-1]# passwd hacluster
[node-2]# passwd hacluster



Configuramos servicios:

[node-1]# service pcsd start
[node-2]# service pcsd start


[node-1]# chkconfig pcsd on
[node-1]# chkconfig pacemaker on

[node-2]# chkconfig pcsd on
[node-2]# chkconfig pacemaker on



Autenticamos los nodos:

[node-1]# pcs cluster auth node-1 node-2

Username: hacluster
Password: 
node-1: Authorized
node-2: Authorized



Creamos el cluster:

[node-1] mkdir /etc/cluster
[node-2] mkdir /etc/cluster

[node-1]# pcs cluster setup --name BP node-1 node-2

node-1: Updated cluster.conf...
node-2: Updated cluster.conf...

Synchronizing pcsd certificates on nodes node-1, node-2...
node-1: Success
node-2: Success

Restarting pcsd on the nodes in order to reload the certificates...
node-1: Success
node-2: Success



Arrancamos el cluster:

[node-1]# pcs cluster start --all
node-1: Starting Cluster...
node-2: Starting Cluster...



Comprobamos el estado del cluster:

node-1]# pcs status cluster

Cluster Status:
 Last updated: Tue Mar  1 04:58:26 2016
 Last change: Tue Mar  1 04:57:52 2016
 Stack: cman
 Current DC: server2 - partition with quorum
 Version: 1.1.11-97629de
 2 Nodes configured
 0 Resources configured

PCSD Status:
  node-1: Online
  node-2: Online



[node-2]# pcs status cluster

Cluster Status:
 Last updated: Tue Mar  1 05:00:33 2016
 Last change: Tue Mar  1 04:57:52 2016
 Stack: cman
 Current DC: server2 - partition with quorum
 Version: 1.1.11-97629de
 2 Nodes configured
 0 Resources configured

PCSD Status:
  node-1: Online
  node-2: Online




Comprobamos el status de los nodos:

[node-1]# pcs status nodes

Pacemaker Nodes:
 Online: node-1 node-2
 Standby:
 Maintenance:
 Offline:
Pacemaker Remote Nodes:
 Online:
 Standby:
 Maintenance:
 Offline:


[node-2]# pcs status nodes

Pacemaker Nodes:
 Online: node-1 node-2
 Standby:
 Maintenance:
 Offline:
Pacemaker Remote Nodes:
 Online:
 Standby:
 Maintenance:
 Offline:


[node-1]# pcs status corosync

Nodeid     Name
   1   node-1
   2   node-2


[node-2]# pcs status corosync

Nodeid     Name
   1   node-1
   2   node-2




Comprobamos el status general:

[node-1]# pcs status

Cluster name: BP
WARNING: no stonith devices and stonith-enabled is not false
Last updated: Thu Jul  7 13:16:43 2016  Last change: Thu Jul  7 13:14:47 2016 by root via crmd on node-2
Stack: cman
Current DC: node-2 (version 1.1.14-8.el6-70404b0) - partition with quorum
2 nodes and 0 resources configured

Online: [ node-1 node-2 ]

Full list of resources:


PCSD Status:
  node-1: Online
  node-2: Online



Desactivamos el fenced:

[node-1]# pcs property set stonith-enabled=false



Desactivamos el quorum:

[node-1]# pcs property set no-quorum-policy=ignore



Comprobamos las propiedades del clsuter:

[node-1]# pcs property

Cluster Properties:
 cluster-infrastructure: cman
 dc-version: 1.1.14-8.el6-70404b0
 have-watchdog: false
 no-quorum-policy: ignore
 stonith-enabled: false



Añadimos la IP Virtual:

[node-1]# pcs resource create IpVirt ocf:heartbeat:IPaddr2 ip=192.168.0.4 cidr_netmask=32 op monitor interval=30s



Añadimos los servicios MySQl y Tomcat:

[node-1]# pcs resource create MySQL ocf:heartbeat:mysql op monitor interval="20" timeout="60"

[node-1]# pcs resource create Tomcat lsb:tomcat



Vincularemos la Ip Virtual a los servicios para que trabajen siempre juntos:

[node-1]#pcs constraint colocation add Tomcat MySQL INFINITY



Forzamos a que inicie primero la IP Virtual y luego los servicios:

[node-1]# pcs constraint order IpVirt then Tomcat  

Adding IpVirt Tomcat (kind: Mandatory) (Options: first-action=start then-action=start)

[node-1]# pcs constraint order Tomcat then MySQL

Adding Tomcat MySQL (kind: Mandatory) (Options: first-action=start then-action=start)



Damos preferencia al nodo que hará de master:

[node-1]# pcs constraint location MySQL prefers node-1=50
[node-1]# pcs constraint location Tomcat prefers node-1=50



Comprobamos restricciones:

[node-1]# pcs constraint

Location Constraints:
  Resource: MySQL
    Enabled on: node-1 (score:50)
  Resource: Tomcat
    Enabled on: node-1 (score:50)
Ordering Constraints:
  start IpVirt then start Tomcat (kind:Mandatory)
  start Tomcat then start MySQL (kind:Mandatory)
Colocation Constraints:
  Tomcat with MySQL (score:INFINITY)



Gestión del DRBD



Creamos un nuevo CIB (Cluster Infromation Base):

[node-1]# pcs cluster cib add_drbd
[node-1]# ls -al add_drbd

-rw-r--r-- 1 root root 10665  7 jul 13:28 add_drbd

[node-1]# pcs -f add_drbd resource create BP_data ocf:linbit:drbd drbd_resource=data op monitor interval=60
[node-1]# pcs -f add_drbd resource master BP_data_sync BP_data master-max=1 master-node-max=1 clone-max=2\
 clone-node-max=1 notify=true



Consultamos la configuración del CIB:

[node1]# pcs -f add_drbd resource show

IpVirt (ocf::heartbeat:IPaddr2): Started node-1
 MySQL (ocf::heartbeat:mysql): Started node-1
 Tomcat (lsb:tomcat): Started node-1
 Master/Slave Set: BP_data_sync [BP_data]
     Stopped: [ node-1 node-2 ]



Activamos la configuración del CIB :

[node1]# pcs cluster cib-push add_drbd

CIB updated

[node-1]# pcs cluster cib add_fs
[node-1]# pcs -f add_fs resource create BP_fs Filesystem device="/dev/drbd1" directory="/data" fstype="ext3"



El filesystem debe estar disponible en el Master :

[node1]# pcs -f add_fs constraint colocation add BP_fs BP_data_sync INFINITY with-rsc-role=Master



Debe arrancar antes DRBD para que el filesystem este disponible :

[node-1]# pcs -f add_fs constraint order promote BP_data_sync then start BP_fs Adding BP_data_sync BP_fs
Adding BP_data_sync BP_fs (kind: Mandatory) (Options: first-action=promote then-action=start)



El filesystem debe estar montado antes de que arranque los servicios :

[node-1]# pcs -f add_fs  constraint order BP_fs then MySQL
Adding BP_fs MySQL (kind: Mandatory) (Options: first-action=start then-action=start)

[node-1]# pcs -f add_fs constraint order BP_fs then Tomcat
Adding BP_fs Tomcat (kind: Mandatory) (Options: first-action=start then-action=start)




Forzamso a todos los recursos a trabajar juntos :

[node-1]# pcs -f add_fs constraint colocation add BP_fs Tomcat IpVirt MySQL INFINITY with-rsc-role=Master 



Aplicamos cambios :

[node1]# pcs cluster cib-push add_fs
CIB updated



Comprobamos restricciones :

[node-1]# pcs constraint

Location Constraints:
  Resource: MySQL
    Enabled on: node-1 (score:50)
  Resource: Tomcat
    Enabled on: node-1 (score:50)
Ordering Constraints:
  start IpVirt then start Tomcat (kind:Mandatory)
  start Tomcat then start MySQL (kind:Mandatory)
  promote BP_data_sync then start BP_fs (kind:Mandatory)
  start BP_fs then start MySQL (kind:Mandatory)
  start BP_fs then start Tomcat (kind:Mandatory)
Colocation Constraints:
  Tomcat with MySQL (score:INFINITY)
  BP_fs with BP_data_sync (score:INFINITY) (with-rsc-role:Master)
  BP_fs with MySQL (score:INFINITY) (rsc-role:Started) (with-rsc-role:Master)




jueves, 21 de julio de 2016

CentOS-6 : Alta Disponibilidad activo/pasivo con Crosync-Pacemaker + DRBD (II)

Configuración DRBD



    Observaciones


  • En este ejemplo trabajaremos con una sola tarjeta de red, pero es aconsejable utilizar dos. Una de ellas en exclusiva para la sincronización DRBD y siempre que sea físicamente posible directa, sin pasar por switch.
  • Partimos de la base que tenemos en ambos nodos un partición reservada para el DRBD. Esta será exactamente del mismo tamaño y la identificaremos como /dev/sdb1
  • Identificaremos la partición del DRBD como /dev/drbd1
  • El nombre del recurso compartido será data
  • En ambos nodos el recuros se montará en el punto de montaje que creamos en el primer capítulo: /data


Editaremos correctamente el fichero "/etc/hosts" en ambos nodos :

192.168.0.2     node-1
191.168.0.3     node-2


Configuración del fichero "/etc/drbd.conf"

resource data {
protocol C;

handlers {pri-on-incon-degr "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f"; }
startup { wfc-timeout 5; degr-wfc-timeout 120; }
disk { on-io-error detach; }

net {
        cram-hmac-alg sha1;
        shared-secret "afsa6eert7";
        after-sb-0pri discard-zero-changes;
        after-sb-1pri discard-secondary;

}


syncer { rate 100M; }

 on BBDD1-act {
   device    /dev/drbd1;
   disk      /dev/sdb1;
   address   192.168.0.2:7789;
   meta-disk internal;
 }
 on BBDD1-pas {
   device    /dev/drbd1;
   disk      /dev/sdb1;
   address   192.168.0.3:7789;
   meta-disk internal;
 }
}



Creamos el recurso :


nodo-1# drbdadm create-md data                
nodo-2# drbdadm create-md data                


node-1# service drbd start               
node-2# service drbd start                


Convertimos node-1 en el nodo primario :

node-1# drbdadm — --overwrite-data-of-peer primary data



Formateamos la partición :
En este caso se utiliza ext3, pero puede utilizarse el filesystem que mas convenga.

node-1# mkfs.ext3 /dev/drbd1       


Montamos la partición :

node-1# mount /dev/drbd1 /data    


Atomáticamente las particiones DRBD de ambos nodos emepezarán a sincronizarse.
Podemos seguir el proceso ejecutando :

#watch -n1 service drbd status 


Procederemos a linkar MySQL y Tomcat en el recurso compartido DRBD

Proceso de linkado en "node-1" :



-----------------MySQL--------------------------------------------------------------------------




cp -av /var/lib/mysql /data/
mv /var/lib/mysql /var/lib/mysql.org
ln -s /data/mysql /var/lib/
chown -h mysql:mysql /var/lib/mysql
cp -av /etc/my.cnf /data/etc/
mv /etc/my.cnf /etc/my.cnf.org
ln -s /data/etc/my.cnf /etc/

chkconfig mysqld off

service mysqld start
service mysqld stop


-----------------------Tomcat-------------------------------------------------------------------



cp -av /var/lib/tomcat /data
mv /varlib/tomcat /var/lib/tomcat.org
cp -av /usr/share/tomcat /usr/share/tomcat.org

mkdir -p /data/tomcat
cp -av /var/cache/tomcat /data/cache/
mv /var/cache/tomcat /var/cache/tomcat.org

mkdir -p /data/etc

cp -av /etc/tomcat /data/etc/
mv /etc/tomcat /etc/tomcat.org
ln -s /data/etc/tomcat /etc/
chgrp -h tomcat /etc/tomcat

unlink /usr/share/tomcat/conf
ln -s /data/etc/tomcat /usr/share/tomcat/conf
chgrp -h tomcat /usr/share/tomcat/conf

unlink /usr/share/tomcat/temp
ln -s /data/cache/tomcat/temp /usr/share/tomcat/temp
chgrp -h tomcat /usr/share/tomcat/temp

unlink /usr/share/tomcat/webapps
ln -s /data/tomcat/webapps /usr/share/tomcat/webapps


unlink /usr/share/tomcat/work
ln -s /data/cache/tomcat/work /usr/share/tomcat/work
chgrp -h tomcat /usr/share/tomcat/work

chkconfig tomcat off


Comprobamos servicios en "node-1" :


service tomcat start
service tomcat stop


Proceso de linkado en "node-2" :



----------------MySQL--------------------------------------------------------------------


mv /var/lib/mysql /var/lib/mysql.org
ln -s /data/mysql /var/lib/
chown -h mysql:mysql /var/lib/mysql
mv /etc/my.cnf /etc/my.cnf.org
ln -s /data/etc/my.cnf /etc/

chkconfig mysqld off




--------------Tomcat--------------------------------------------------------------------


mv /varlib/tomcat /var/lib/tomcat.org
cp -av /usr/share/tomcat /usr/share/tomcat.org

mv /var/cache/tomcat /var/cache/tomcat.org


mv /etc/tomcat /etc/tomcat.org
ln -s /data/etc/tomcat /etc/
chgrp -h tomcat /etc/tomcat

unlink /usr/share/tomcat/conf
ln -s /data/etc/tomcat /usr/share/tomcat/conf
chgrp -h tomcat /usr/share/tomcat/conf

unlink /usr/share/tomcat/temp
ln -s /data/cache/tomcat/temp /usr/share/tomcat/temp
chgrp -h tomcat /usr/share/tomcat/temp

unlink /usr/share/tomcat/webapps
ln -s /data/tomcat/webapps /usr/share/tomcat/webapps

unlink /usr/share/tomcat/work
ln -s /data/cache/tomcat/work /usr/share/tomcat/work
chgrp -h tomcat /usr/share/tomcat/work

chkconfig tomcat off


Comprobamos servicios en "node-2" :



node-1# umount /data
node-1# drbdadm secondary data

node-2# drbdadm primary data
node-2# mount /dev/drbd1 /data
node-2# service tomcat start
node-2# service mysqld start


Detenemos servicios y desmontamos filesystem del DRBD :



node-2# service tomcat stop
node-2# service mysqld stop
node-2# umount /data
node-2# drbdadm secondary data


miércoles, 20 de julio de 2016

CentOS-6 : Alta Disponibilidad activo/pasivo con Crosync-Pacemaker + DRBD (I)

Configuración de los servicios


    Observaciones:

  • Vamos a instalar Tomcat-7 con la versión Java 1.7 de Sun Microsystem, para MySQL y Tomcat utilizaremos la versión del repositorio oficial de CentOS. Los nodos van a tener los nombres de host y las IPS que se muestran en el gráfico.
  • Hasta ahora hemos trabajado con tomcat dentro del directorio "/opt/tomcat", para adaptarnos a la nueva HA y conservar lo máximo posible nuestra estructura deberemos modificar parte de la estructura de directorios original.

Tomcat

En ambos nodos:

yum install epel-release
yum install tomcat



Por defecto, CentOS nos instalará OpenJDK con Tomcat-7
Para ello deberemos localizarlos y desinstalarlos :


rpm -qa | grep java
java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64
java-1.8.0-openjdk-headless-1.8.0.91-1.b14.el6.x86_64
java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64
java_cup-0.10k-5.el6.x86_64
tzdata-java-2016e-1.el6.noarch

rpm -e --nodeps java-1.5.0-gcj java-1.8.0-openjdk-headless java-1.8.0-openjdk java_cup-0.10k tzdata-java


rpm -qa | grep jakarta
jakarta-commons-collections-3.2.1-3.5.el6_7.noarch
jakarta-commons-pool-1.3-12.7.el6.x86_64
jakarta-commons-daemon-1.0.1-8.9.el6.x86_64
jakarta-commons-dbcp-1.2.1-13.9.el6.noarch
jakarta-commons-logging-1.0.4-10.el6.noarch


rpm -e --nodeps jakarta-commons-collections jakarta-commons-pool jakarta-commons-daemon jakarta-commons-dbcp\ 
jakarta-commons-logging


Descargaremos e instalaremos el Java de Sun :

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F;\
 oraclelicense=accept-securebackup-cookie"\
 "http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm"

rpm -Uvh jdk-7u79-linux-x64.rpm 


Comprobamos versión :

#java -version

java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)


Iniciamos el servicio y comprobamos versión:
#service tomcat start

#tomcat version

Server version: Apache Tomcat/7.0.65
Server built:   Jan 6 2016 18:50:03 UTC
Server number:  7.0.65.0
OS Name:        Linux
OS Version:     2.6.32-573.el6.x86_64
Architecture:   amd64
JVM Version:    1.7.0_79-b15
JVM Vendor:     Oracle Corporation



MySQL

En ambos nodos:

yum install mysql-server
service mysqld start
service mysqld stop



DRBD

En ambos nodos:
yum install drbd83 kmod-drbd83    
yum install gnutls* ipvsadm*   


mkdir /data