Galera Cluster on Debian 8

5 May, 2017

In this stage you need two nodes with Debian OS for deploy Galera Cluster Maria DB. The next entry add other two nodes with HAProxy and VIP for load balancer to Cluster.

The first step is add the repository of mariadb to Debian (Node1 and node2):

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386] http://mariadb.kisiek.net/repo/10.0/debian jessie main'
sudo apt-get update
sudo apt-get upgrade

When is done, install the software for Galera cluster (Node1 and node2):

apt-get install -y rsync galera mariadb-galera-server

The next step is configure the file of configuration of Galera:

For node01:

echo '[mysqld]
# MySQL Configuration
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://192.168.30.11:4567,192.168.30.12:4567"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
wsrep_node_address="192.168.30.11"
wsrep_node_name="node01"' > /etc/mysql/conf.d/galera.cnf ; chmod 770 /etc/mysql/conf.d/galera.cnf

For node02:

echo '[mysqld]
# MySQL Configuration
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options="gcache.size=32G"

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://192.168.30.11:4567,192.168.30.12:4567"

# Galera Synchronization Congifuration
wsrep_sst_method=rsync
#wsrep_sst_auth=user:pass

# Galera Node Configuration
wsrep_node_address="192.168.30.12"
wsrep_node_name="node02"' > /etc/mysql/conf.d/galera.cnf ; chmod 770 /etc/mysql/conf.d/galera.cnf

BONUS configuration

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Configure the file /etc/hosts (Node1 and node2):

192.168.30.11 node01
192.168.30.12 node02

Copy file /etc/mysql/debian.cnf to the node01 to node02

Stop the service MySQL (Node1 and node2):

service mysql stop

Execute the next command for create new cluster (Node1):

service mysql start --wsrep-new-cluster

ERROR: WSREP: gcs connect failed: Connection timed out SOLUTION: Execute:

service mysql bootstrap

Restart all services of MySQL and Galera (Node1 and node2).

The next query response the number of nodes of cluster Galera:

mysql -u root -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"' -p

Finish the first part.

Creación, publicación y firma de claves PGP

5 Feb, 2017

En esta entrada vamos a ver los pasos básicos para construir un anillo de confianza con PGP, certificando la identidad y firmando claves.

Generar par de claves

Para comenzar generamos un par de claves propio, con nuestro nombre real y correo electronico:

~/.gnupg$ gpg --gen-key

  1. Seleccionamos la opción 4 solo RSA para firmar.
  2. Tamaño de 4096 bits.
  3. En mi caso la clave nunca caduca, opción 0.
  4. Introducimos nuestro nombre real, correo electrónico y un comentario.

Una vez introducido las siguientes opciones, nos saldrá el siguiente mensaje. Es necesario generar muchos bytes aleatorios. Es una buena idea realizar alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar la red y los discos) durante la generación de números primos. Esto da al generador de números aleatorios mayor oportunidad de recoger suficiente entropía. Lo que tendremos que hacer es ejecutar tareas pesadas, como ejecutar una maquina virtual, para generar bytes aleatorios.

Para terminar nos pasara la siguiente información con el ID de nuestra clave:

gpg: clave **E0000000** marcada como de confianza absoluta
claves pública y secreta creadas y firmadas.
gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesaria(s), 1 completa(s) necesaria(s),
modelo de confianza PGP
gpg: nivel: 0 validez: 1 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 1u
pub 40000/E0000000 2015-11-19
Huella de clave = 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
uid Nuestro_nombre (Comentario) nuestro_correo@gmail.com;

También nos informara que la clave como configuramos anteriormente solo sirve para firmar, para cifrar tendremos que crear una subclave:

Tenga en cuenta que esta clave no puede ser usada para cifrar. Puede usar la orden “–edit-key” para crear una subclave con este propósito.

Agregar una subclave para encriptación

~/.gnupg$ gpg --edit-key nuestro_correo@gmail.com

Ejecutamos:

gpg: addkey
  1. Introducimos nuestra contraseña de la clave anterior.
  2. Seleccionamos la opción 6 RSA solo para cifrar.
  3. Tamaño de 4096 bits.
  4. Introducimos la validez.
  5. De nuevo tendremos que generar bytes aleatorios con la actividad de nuestra maquina.

Guardamos y salimos: gpg: save

Para ver nuestra clave:

~/.gnupg$ gpg -k

Exportar e importar clave sin firmar

Exportar clave a archivo:

gpg --output TclavePublica.gpg --export E0000000

Exportar clave a http://pgp.mit.edu/

gpg --send-keys --keyserver pgp.mit.edu E0000000

Importar clave de archivo:

gpg --import clavePublica.gpg

Importar clave de http://pgp.mit.edu/

gpg --keyserver pgp.mit.edu --recv-keys A0000000F

Firma de claves PGP e importación

Después podemos firmar las claves de otras personas para ampliar nuestra zona de confianza, también ellos firmaran la nuestra. En primer lugar hacemos acto de notario y confirmamos la identidad de las personas con su clave y correo.

Una vez echo esto firmamos su clave subida al servidor:

~/.gnupg$ gpg --edit-key A0000000F

Firmamos con:

gpg: sign

Introducimos nuestra contraseña para firmar la clave ajena.

Guardamos y salimos:

gpg: save

Enviamos clave firmada al servidor pgp.mit.edu con:

gpg --keyserver pgp.mit.edu --send-keys A0000000F

Eliminar clave privada:

gpg --keyserver pgp.mit.edu --delete-secret-key E0000000

Eliminar clave publica:

gpg --keyserver pgp.mit.edu --delete-keys E0000000

Poblar LDAP desde fichero JSON [PAM y SSH con Clave publica]

3 Aug, 2016

En esta entrada podemos ver como introducir usuarios desde un fichero JSON a LDAP para utilizarlos para autenticación con clave publica para poder acceder por ssh a nuestra maquina, con creación automática del directorio home del usuario.

Scripts: (https://github.com/Tedezed/LDAP/tree/master/Poblar%20LDAP%20con%20JSON)

  • Poblar_LDAP.py Para añadir los usuarios del fichero humans.js.
  • Eliminar_LDAP.py Para eliminar los usuarios del fichero humans.js.
  • humans.js Usuarios que vamos a añadir a nuestro LDAP.
  • public_key.sh Script para consultar la clave publica del usuario.

Comenzamos añadiendo el esquema openssh-lpk, para poder incluir claves públicas ssh en un directorio LDAP:

nano openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-lpk.ldif

Creamos un virtualenv:

cd .virtualenv
virtualenv ldap
cd ldap

Activamos el virtualenv anterior:

source bin/activate

Instalamos python-ldap:

pip install python-ldap

Una vez echo esto podemos ejecutar Poblar_LDAP.py para introducir los usuarios del fichero humans.js.

Instalamos libnss-ldapd para la autenticación de usuario en LDAP:

apt-get install libnss-ldapd ldap-utils

Configuración durante la instalación:

Conexión:

ldap://localhost:389/

Base de nuestro árbol:

dc=example,dc=org

Configuración de NSS con LDAP:

passwd
group

Configuramos /etc/pam.d/common-session

session [success=ok default=ignore] pam_ldap.so minimum_uid=2000

Configuramos mkhomedir en pam-configs:

nano /usr/share/pam-configs/mkhomedir
Name: Create home directory during login
Default: yes
Priority: 900
Session-Type: Additional
Session:
        required        pam_mkhomedir.so umask=0022 skel=/etc/skel

Actualizamos pam con:

sudo pam-auth-update

Creamos nuestro script para obtener la clave publica del usuario del ldap:

nano /usr/bin/public_key.sh
#!/bin/sh
ip_ldap="localhost"
port=389
base="dc=example,dc=org"

ldapsearch -x -h $ip_ldap -p $port -b $base -s sub "(&(objectClass=posixAccount) (objectClass=ldapPublicKey) (cn=$1))" | \
sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

Comprobamos su funcionamiento de script:

(ldap)root@debian:/home/debian/ldap/python# sh /usr/bin/public_key.sh morrigan.rigan
ssh-rsa ssh-rsa Clave_RSA_Publica

Editamos y especificamos la ruta del script:

nano /etc/ssh/sshd_config
# LDAP SSH
AuthorizedKeysCommand /usr/bin/public_key.sh
AuthorizedKeysCommandUser root

Reiniciamos:

service sshd restart