Storagesis-Manual técnico

De Wiket
Salta a la navegació Salta a la cerca

Instalaciones

En esta sección se explicará que servicios son necesarios para llevar acabo nuestro proyecto

Raspbian

Raspbian es la versión de Debian adaptada para la Raspberry.

Requisitos previos:

  1. Tarjeta SD (mínimo 8GB)
  2. Win32DiskImage
  3. Raspbian Strech Lite

Instalación:
Primero de todo, debe descargar la imagen ISO de Raspbian y Win32DiskImage que encontramos en el enlace anterior. Una vez descargadas, procede a instalar Win32DiskImage. Cuando ya este instalado, se abrirá la siguiente interfaz:

Esquema de nuestra infraestructura

Lo único que debe hacer es conectar la tarjeta SD al equipo, seleccionar la imagen ISO descargada anteriormente y pulsar encima de Write.

Esquema de nuestra infraestructura

Al acabar este proceso, deberá conectar la tarjeta de memoria SD a la Raspberry. Las credenciales para entrar dentro del sistema son las siguientes:

Usuario por defecto: pi
Contraseña por defecto: raspbian

Habilitando SSH

En la Raspberry se puede trabajar de dos formas, o bien conectados por HDMI a una pantalla y un teclado o bien remotamente por SSH. En el siguiente caso se trabajará remotamente, desde las 3 Raspberrys, para habilitarlo deberemos introducir los siguientes comandos:

$ sudo systemctl enable ssh
$ sudo service ssh start

Por seguridad se recomienda cambiar la contraseña por defecto y crear un usuario nuevo con una contraseña segura.

Servidor LAMP

Primero actualizar repositorios y paquetes:

$ sudo apt update && sudo apt upgrade -y

Instalación del sistema de gestión de base de datos MariaDB:

$ sudo apt install apache2 mariadb-server php7.0 phpmyadmin

Configurando usuario root MariaDB

Por defecto el usuario root de MariaDB viene des-habilitado para habilitarlo y darle una contraseña haremos lo siguiente:

$ sudp mysql_secure_installation

Y en el asistente que nos aparece seguir las instrucciones. Aquí mi ejemplo de como lo he configurado

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

HAproxy

Este software se utilizará para el balanceo de carga y alta disponibilidad, se deberá de instalar en el Servidor3

$ sudo apt install haproxy

Owncloud

Owncloud es un servicio de alojamiento en la nube.

Descargamos la ultima versión actual dentro de los servidores

$ wget https://download.owncloud.org/community/owncloud-10.0.8.zip 

Cuando este descargado se debe descomprimir con el siguiente comando

$ unzip owncloud-10.0.8.zip

Se procederá a mover el directorio descomprimido a donde se quiere alojar la carpeta, en mi caso será la ruta /var/www/html/

$ sudo mv owncloud/ /var/www/html/

Y se cambiará el propietario de la siguiente forma

$ sudo chown -R www-data:www-data /var/www/html/owncloud

Instalamos todas las dependencias de php para el correcto funcionamiento de owncloud

$ sudo apt install libapache2-mod-php-apcu php-redis redis-server php7.0-ldap php7.0 php-imagick php7.0-common php7.0-curl php7.0-gd php7.0-imap php7.0-intl php7.0-json php7.0-ldap php7.0-mbstring php7.0-mcrypt php7.0-mysql php7.0-pgsql php-smbclient php-ssh2 php7.0-sqlite3 php7.0-xml php7.0-zip

Procedemos a crear un usuario con privilegios adecuados para que pueda ser administrado por owncloud y la base de datos para owncloud

$ sudo mysql -u root -p
MariaDB [(none)]> CREATE DATABASE owncloud;
MariaDB [(none)]> CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY '@tu_contraseña';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'localhost' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

Una vez hecho estos pasos para acabar la instalación, deberemos ir al apartado 2 de esta sección para realizar una correcta instalación

Servidor de correo

Configurar un servidor de correo es una tarea compleja debido a que se compone de varios procesos: MTA (Mail Transfer Agent), MDA (Mail Delivery Agent), anti-spam, antivirus, etc.

El sistema contenedores Docker nos facilita este proceso, ya que Docker permite crear máquinas con la configuración deseada y subirlas para que la comunidad las aproveche. Nosotros utilizaremos una máquina dockeritzada con un servidor de correo.

Para hacerlo utilizaremos una máquina virtual de Amazon AWS EC2. La elección no es trivial, ya que esta máquina amazon nos proporciona una IP fija, la cual es necesaria debido a que las IP's dinámicas estan en una lista negra y los grandes servidores como gmail o hotmail no nos permiten enviarles correos.


Lo primero que tendremos que hacer es abrir los puertos de nuesta máquina amazon para poder recibir y enviar correos. Los puertos que debemos abrir son:

  • 25
  • 465
  • 993
  • 587

Una vez abiertos los puertos podremos hacer una comprobación instalando el paquete nmap en nuestra máquina amazon:

$ sudo apt install nmap

Seguidamente ejecutaremos este comando:

$ nmap localhost 

La salida debe ser similar a esta:

ubuntu@ip-172-31-17-185:~$ nmap localhost

Starting Nmap 7.01 ( https://nmap.org ) at 2018-05-10 17:09 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00012s latency).
Not shown: 995 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
143/tcp open  imap
587/tcp open  submission
993/tcp open  imaps

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

Como podemos comprobar ya tenemos los puertos necesarios habilitados.

A continuación deberemos de crear registros en nuestra servidor DNS, ja que el correo electrónico utiliza registros MX.

Configuración de servicios

En este apartado se explicará como configurar cada servicio instalado para el correcto funcionamiento de estos.

Apache2

Se habilitarán los siguientes módulos de apache2 para el correcto funcionamiento

a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime

En caso de que no se tenga des-habilitado el sitio 000-default.conf procedremos a des-habilitarlo con el siguiente comando

$ a2dissite 000-default.conf

Creamos un nuevo archivo .conf, se le podrá llamar de cualquier forma en mi caso será de la siguiente forma

$ sudo nano /etc/apache2/sites-available/owncloud.conf

Y dentro de este, añadimos la siguiente configuración

<VirtualHost *:80>
        ServerAdmin tu_correo@dominio
        ServerName tudominio.com
        ServerAlias www.tudominio.com

        DocumentRoot ruta_de_owncloud
        Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
        # Logfiles
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory ruta_de_owncloud>
            Options FollowSymLinks
            DirectoryIndex index.php
            Options Indexes FollowSymLinks Includes ExecCGI
            AllowOverride None
            Order deny,allow
            Allow from all
            Require all granted
        </Directory>
</VirtualHost>

HAproxy - Instalando SSL

En este apartado se explicará como configurar ssl con el programa Certbot.

Primero de todo, se debe descargar el software

$ sudo apt install certbot

En caso de no tenerlo en los repositorios se agregará de la siguiente forma

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt update
$ sudo apt install certbot

Comprobar que el puerto 80 no tiene ningún tipo de servicio ejecutando, en nuestro caso HAproxy, para ello se debe parar el servicio

$ sudo /etc/init.d/haproxy stop

Se verificará que el puerto 80 no haya nada:

$ netstat -na | grep ':80.*LISTEN'

Ahora se crea el certificado

$ sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d example.com -d www.example.com

Servidor de correo - SSL

Configuración de Replicación Maestro-Maestro con MariaDB

Objetivo

El objetivo es crear una replicación Maestro - Maestro en el sistema de gestión de base de datos MariaDB. Se implementará en nuestros dos servidores Raspberry que incorporan el SO Raspbian sin escritorio y el servicio web Apache2.

Todo esto con el propósito de agregar velocidad y redundancia a nuestro servicio para que actúen como un clúster. El clúster de base de datos, será especialmente útil debido a que disponemos de alta disponibilidad en cuanto a servidores.

Esquema

Esquema de nuestra infraestructura

En el esquema mostrado en la imagen utilizamos el protocolo IPV4 en el cual el servidor Raspberry 1 tiene la IP 192.168.1.12/24 y el servidor Raspberry 2 la 192.168.1.14/24.

Configuración Maestro Servidor Raspberry 1

Tendremos que añadir estas líneas en el archivo my.cnf ubicado en la ruta /etc/mysql/:


[mysqld]
log-bin
server_id=1
log-basename=master1
bind-address= 0.0.0.0
binlog_do_db= owncloud

A continuación guardamos la configuración y reiniciamos el servicio MariaDB:

$ sudo systemctl restart mariadb 

Una vez reiniciado el servicio, nos conectamos a la consola de mariaDB con un usuario con todos los permisos en mi caso el usuario Anderson:

$ sudo mysql -u Anderson -p

Nos pedirá la contreseña de usuario y ya estaremos dentro. A continuación crearemos el usuario replicator:

MariaDB [(none)]> GRANT REPLICATOR SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'192.168.1.14' IDENTIFIED BY 'password';

Sintaxis:

MariaDB [(none)]> GRANT [permiso] ON [nombre de bases de datos].[nombre de tabla] TO '[usuario]'@'[tipo_de_conexión]' IDENTIFIED BY '[contraseña]';

Explicación de comando ejecutado:

Con este comando le estamos dando permisos de REPLICATOR SLAVE y REPLICATION CLIENT al usuario replicator con contraseña storagesis sobre todas las bases de datos y todas las tablas, le indicamos que la conexión solo será permitida desde la IP 192.168.1.14, és decir, desde el servidor Raspberry 2.


REPLICATOR SLAVE:Permite al usuario esclavo conectarse al otro servidor como si fuera su maestro.

REPLICATION CLIENT: Permite el uso de los comandos SHOW MASTER STATUS, SHOW SLAVE STATUS y SHOW BINARY LOGS.

A continuación ejecutamos este comando y nos guardamos la información saliente:

MariaDB [(none)]> SHOW MASTER STATUS; 

Nos saldrá algo parecido a esta imagen:

Master1.png

Configuración Maestro Servidor Raspberry 2

Al igual que en el servidor Raspberry 1 tendremos que añadir estas líneas al final del fichero my.cnf:

[mysqld]
log-bin
server_id=2
log-basename=master2
bind-address= 0.0.0.0
binlog_do_db= owncloud 

Como vemos el valor de los parámetros server_id y log_basename cambia. El valor de server_id debe ser único en cada servidor y el nombre del archivo log cambia para poder diferenciarlos facilmente.

A continuación guardamos la configuración y reiniciamos el servicio de MariaDB:

$ sudo systemctl restart mariadb 

Una vez reiniciado el servicio, nos conectamos a la consola de mariaDB con un usuario con todos los permisos en mi caso el usuario Anderson:

$ sudo mysql -u Anderson -p


Nos pedirá la contreseña de usuario y ya estaremos dentro. A continuación crearemos el usuario replicator:

MariaDB [(none)]> GRANT REPLICATOR SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'192.168.1.12' IDENTIFIED BY 'password';

Como vemos lo único que varia respecto al servidor Raspberry 1 es la dirección desde la cual se puede conectar: 192.168.1.12.

Seguidamente deberemos ejecutar este comando para parar el servicio esclavo:

MariaDB [(none)]> STOP SLAVE; 

El siguiente paso consiste en en utilizar la información obtenida del servidor Raspberry 1 y aplicarla a nuestro comando:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST = '192.168.1.12', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_PORT = 3306, MASTER_LOG_FILE = 'master1-bin.000004', MASTER_LOG_POS = 329, MASTER_CONNECT_RETRY = 10;

Explicación de comando ejecutado:

Con este comando cambiamos el host master por la dirección IP del servidor Raspberry 1. Asignamos el usuario que hará la replicación indicando su contraseña, el puerto, el archivo log, la posición del archivo log y el número máximo de intentos de conexión.

Como podemos observar parte de está información la obtuvimos con el comando "SHOW MASTER" ejecutado en el servidor Raspberry 1 anteriormente.

Iniciaremos el servicio esclavo:

MariaDB [(none)]>  START SLAVE;

A continuación como hicimos anteriormente con el servidor Raspberry 1, ejecutamos este comando:

MariaDB [(none)]> SHOW MASTER STATUS; 

La salida será algo similar a esto:

Master2.png

Explicación de parámetros del archivo my.cnf

  • log-bin: Instrucción que activa los logs.
  • server_id: Identificador del servidor. Debe ser único y no estar definido en otro grupo de replicación.
  • log-basename: Le damos nombre al log-file.
  • bind-address: Nos permite la conexión remota desde la dirección IP indicada. En este caso desde cualquiera.
  • binlog_do_db: Nombre de la base de datos que queremos replicar. En caso de no añadir este parámetro se replicarán todas las bases de datos.

Completar proceso en Servidor Raspberry 1

Nos conectamos a la consola de MariaDB:

$ sudo mysql -u Anderson -p 

Detenemos el servicio esclavo:

MariaDB [(none)]> STOP SLAVE; 

Ejecutamos el comando con la información obtenida del servidor Raspberry 2:

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST = '192.168.1.14', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_PORT = 3306, MASTER_LOG_FILE = 'master2-bin.000005', MASTER_LOG_POS = 329, MASTER_CONNECT_RETRY = 10; 

Como podemos observar, lo que cambia es la dirección IP, en este caso la del servidor Raspberry 2 y el nombre del archivo log. Esta vez la posición del archivo log es la misma en ambos servidores, pero no tiene porque ser siempre así.

Por último iniciamos el servicio esclavo:

MariaDB [(none)]> START SLAVE; 

Comprobar replicación Maestro-Maestro

Ahora que ya hemos configurado correctamente ambos servidores, es hora de probarlo. Para ello vamos a crear una tabla en la base de datos owncloud en el servidor Raspberry 1 y comprobar en el servidor Raspberry 2 a ver si se ha creado.

Lo primero que haremos es crear la base de datos owncloud:

MariaDB [(none)]> CREATE DATABASE owncloud;

Una vez creada añadiremos la tabla prueba:

MariaDB [(none)]> CREATE TABLE owncloud.prueba(`id` varchar(10)); 

A continuación nos vamos al servidor Raspberry 2 para comprobar que existe la tabla. Si está todo correcto veremos algo similar a esto:

Prueba1.png

Por último para verificar por completo el maestro-maestro, desde el servidor Raspberry 2 ejecutamos estos dos comandos:

MariaDB [(none)]> USE DATABASE owncloud; 
MariaDB [(none)]> DROP TABLE prueba; 

Deberemos hacer la comprobación de que la tabla no existe en el servidor Raspberry 1. Nos conectamos a la consola de MariDB y ejecutamos este comando:

MariaDB [(none)]> SHOW TABLES IN owncloud;

El resultado debería ser este:

Prueba2.png

Storagesis x