bookmark_borderComo instalar mariadb 10.05 en Ubuntu 20.04 para producción

Con este procedimiento vamos a instalar una versión anterior de MariaDB server en Ubuntu 20.04, ya que en los sistemas legados es posible que se requieran versiones especificas, ya sea por las caracteristicas o que no hayan sido testeadas con las versiones nuevas.

Prerequisitos

  • Servidor Ubuntu Server 20.04 LTS
  • El servidor de producción ya esta protegido siguiendo el procedimiento descrito en el articulo.

Procedimiento

  • Agrega el repositorio de MariaDB en la lista de origenes autorizados, en el archivo /etc/apt/sources.list.d, e impora la llave publica PGP para verificar la descarga de los paquetes
  • Actualiza la información de tu sistema de paquetes
$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10./ubuntu focal main'
$ sudo apt update
  • Ejecuta la instalación con el servidor de paquetes del ubuntu, y comprueba la versión instalada
$ sudo apt install mariadb-server
$ mysql --version
  • Ejecuta la secuencia de comandos de seguridad. Revisa y confirma las opciones de seguridad dependiendo de tu caso.
$ sudo mysql_secure_installation
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
haven't set the root password yet, you should just press enter here.

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

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

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the 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!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
  • Crea un usuario administrativo para conexión remota (solo si la administración es remota). Conectate al servidor con el usuario de root, y ejecuta los siguientes comandos
$ sudo mariadb
MariaDB [(none)]> GRANT ALL ON *.* TO 'admin'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit
  • Por default, mariadb solo permite conexiones locales, si vas a conectarte desde un equipo diferente, debes de cambiar en el archivo de configuración /etc/mysql/my.cnf,
$ sudo nano /etc/mysql/my.cnf
$ more /etc/mysql/my.cnf | grep bind
#bind-address		= 127.0.0.1
bind-address		= 0.0.0.0
  • Para hacer las pruebas puedes conectarte con el usuario administrador, y crear una base de datos.
mysql -h <ip-server> -u admin -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 38
Server version: 10.4.24-MariaDB-1:10.4.24+maria~focal-log mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.075 sec)

MariaDB [(none)]> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.073 sec)

bookmark_borderInstala un servidor keycloak en producción con docker

En esta entrada vamos a instalar un servidor keycloak en producción, utilizando docker, mariadb y certbot

Los pasos que vamos a seguir son

  • Genera un certificado para producción utilizando certbot
  • Configura la red de docker y configura los contenedores.
  • Instala el reverse proxy para tu servidor.

Genera un certificado para producción utilizando certbot

$ sudo certbot certonly -d tu.dominio.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Nginx Web Server plugin (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for tu.dominio.com
Input the webroot for tu.dominio.com: (Enter 'c' to cancel): /var/www/html
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: pruebas@dominio.com).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/tu.dominio.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/tu.dominio.com/privkey.pem
   Your cert will expire on 2021-11-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Si no quieres utilizar certbot, puedes ocupara para crear el certificado openssl, solo que como no es emitido por una entidad certificadora, seguramente lo va a detectar como aprocrifo.

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/tudominio-selfsigned.key -out /etc/ssl/certs/tudominio-selfsigned.crt
   Country Name (2 letter code) [AU]:
   State or Province Name (full name) [Some-State]:
   Locality Name (eg, city) []:
   Organization Name (eg, company) [Internet Widgits Pty Ltd]:
   Organizational Unit Name (eg, section) []:
   Common Name (e.g. server FQDN or YOUR name) []:
   Email Address []:

Para que podamos leer la llave privada desde el servidor docker debemos de cambiarle los permisos para que se pueda leer.

Si lo hicimios con certbot

$ sudo chmod 644 /etc/letsencrypt/live/tu.dominio.com/privkey.pem

Si lo hicimos con openssl

$ sudo chmod 644 /etc/ssl/private/tudominio-selfsigned.key

Configura la red de docker

Esto lo vamos a ocupar para que sea vea el contenedor de keycloak y el de la base de datos.

$ docker network create keycloak-network

Instala una instancia de mariadb para almacenar la información

$ docker run -d --name mariadb \
--net keycloak-network \
-e MYSQL_ROOT_PASSWORD=root_p@assword \
-e MYSQL_DATABASE=keycloak \
-e MYSQL_USER=keycloak \
-e MYSQL_PASSWORD=p@ssword \
mariadb

Si ya tienes una instancia de mariadb en un contenedor docker solo debes de poner ponerla en la misma red de keycloak, con la sentencia

$ docker network connect mariadb

Donde mariadb es el nombre del contenedor de mariadb.

Descarga e instala la imagen de keycloak para producción.

$ docker run -it -d --name keycloak \
--net keycloak-network \
-p8080:8080 -p 8443:8443s \
-v /etc/ssl/certs/keycloak-selfsigned.crt:/etc/x509/https/tls.crt \
-v /etc/ssl/private/keycloak-selfsigned.key:/etc/x509/https/tls.key \
-e KEYCLOAK_USER=administrador \
-e KEYCLOAK_PASSWORD=p@ssword \
-e DB_VENDOR=mariadb \
-e DB_DATABASE=keycloak \
-e DB_USER=keycloak \
-e DB_PASSWORD=p@assworddb \
jboss/keycloak

donde

-v se indican el certificado y la llave privada para el keycloak.

Por último, si necesitamos reiniciar el servidor, debemos detener el contenedor, borrarlo y volverlo a construir

$ docker stop keycloak
$ docker rm keycloak

bookmark_borderComandos comunes de linux

Esta es una lista de los comando de linux que mas utilizo.

  • ssh. Este comando te permite abrir una terminal remota en el servidor que indiques utilizando las credenciales y el puerto que desees.
~$ ssh usuario@servidor -p puerto

Donde

Usuario. Nombre del usuario con el cual te vas a conectar.

Servidor. IP o nombre del servidor con el cual te vas a conectar.

Puerto. es el numero de puerto donde se escucha el ssh, por default es el 22 pero para producción es recomendable que el administrador lo cambie a otro puerto.

  • scp. Este es el comando realiza copias de archivos entre servidores a los cuales tengas acceso. Obviamente debo de tener credenciales en el servidor origen y en el destino, y ademas debo de tener ver el servidor al cual quiero conectarme (no estar atras de un firewall)
~$ scp -P 36 usuario@192.168.1.80:/home/usuario/archivo ruta_local

Donde

-P es el numero de puerto donde se escucha el ssh, por default es el 22 pero para producción es recomendable que el administrador lo cambie a otro puerto.

El origen y el destino se especifica con el formato Usuario@Servidor:Archivo

Usuario. El nombre con el cual te vas a conectar,

servidor. Puede ser por IP o por nombre

  • curl. Obtiene los recursos de un servidor utilizando alguno de los protocolos http, https, ftp, etc. Ver mas con man curl.
~$ curl -o archivo url

Donde

archivo es el nombre del archivo en el cual se va a guardar la información obtenida desde la url

url es la pagina o archivo que esta publicado en internet

bookmark_borderInstalacion de Node JS 10 en Ubuntu Server 20.04

Para este articulo vamos a instalar nodejs 10 en Ubuntu Server, aunque la fecha de termino de soporte de Node termina en mayo del 2021, lo voy a instalar debido a que la aplicación se desarrollo con esta versión y no se han hecho las pruebas para migrar a la versión mas reciente LTS. Recuerda siempre programar con versiones LTS si es que vas a implementarlo en produccion.

Procedimiento

  • Actualiza el gestor de paquetes
$ sudo apt update
  • Verifica que tengas instalado curl
$ sudo apt install curl
Reading package lists... Done
Building dependency tree       
Reading state information... Done
curl is already the newest version (7.68.0-1ubuntu2.5).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
  • Descarga el paquete desde nodesource, te va a marcar que esta desactualizado y que debes de actualizar tu aplicación.
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -

================================================================================
================================================================================

                              DEPRECATION WARNING                            

  Node.js 10.x is no longer actively supported!

  You will not receive security or critical stability updates for this version.

  You should migrate to a supported version of Node.js as soon as possible.
  Use the installation script that corresponds to the version of Node.js you
  wish to install. e.g.

   * https://deb.nodesource.com/setup_12.x — Node.js 12 LTS "Erbium"
   * https://deb.nodesource.com/setup_14.x — Node.js 14 LTS "Fermium" (recommended)
   * https://deb.nodesource.com/setup_15.x — Node.js 15 "Fifteen"
   * https://deb.nodesource.com/setup_16.x — Node.js 16 "Gallium"

  Please see https://github.com/nodejs/Release for details about which
  version may be appropriate for you.

  The NodeSource Node.js distributions repository contains
  information both about supported versions of Node.js and supported Linux
  distributions. To learn more about usage, see the repository:
    https://github.com/nodesource/distributions

================================================================================
================================================================================
  • Una vez descargado el instalador, puedes instalarlo con el gestor de paquete apt.
$ sudo apt install nodejs
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  nodejs
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
  • Verifica que se haya instalado correctamente
$ node --version
v10.24.1

Referencias

https://joshtronic.com/2018/05/08/how-to-install-nodejs-10-on-ubuntu-1804-lts/

bookmark_borderInstalar Open Jdk 8 en Ubuntu Server 20.04

No obstante que la versión de Java 8 ya a perdido soporte, en algunas ocasiones es necesario la instalación de Java 8 porque el software ha sido desarrollada con esta versión y aun no se ha hecho la migración a una plataforma mas reciente.

  • Actualiza los paquetes
$ sudo apt update
  • Verifica si tienes instalada una versión de java
$ java -version
  • Instala la versión apropiada
$ sudo apt install openjdk-8-jdk
  • Selecciona la alternativa por default de java que se vaya a utilizar
$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode
  • Verifica que se haya seleccionado correctamente
$ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~20.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

$ javac -version
javac 1.8.0_292

Referencias.

https://www.digitalocean.com/community/tutorials/como-instalar-java-con-apt-en-ubuntu-18-04-es

bookmark_borderPreparar un servidor Ubuntu Server 20.04 para producción

  • Actualice el sistema
$ sudo apt update
$ sudo apt upgrade
  • Cambiar el puerto de escucha del ssh
$ sudo nano /etc/ssh/sshd_config
  • Cambie el puerto en las primeras lineas, y reinicie el servicio
Port 26
  • Desactive el usuario de root por ssh, cambiano la configuración en el mismo archivo
# Authentication: 
LoginGraceTime 120
PermitRootLogin No 
StrictModes yes
  • Instalar y configurar fail2Ban (bloquea las ips que constantemente estan tratando de entrar y fallan)
$ sudo apt install fail2ban
$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup
$ sudo nano /etc/fail2ban/jail.conf
$ sudo /etc/init.d/fail2ban restart
  • Configurar el firewall interno ufw.
  • Configurar las politicas predeterminadas
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing
  • Habilitar el puerto ssh de entrada (recuerda poner el puerto que pusiste)
$ sudo ufw allow 26
  • Habilite los puertos que se van a utilizar de entrada, por ejemplo, si va a comunicarse por los puertos estandar de http, y https, debera de ejecutar el siguiente comando
$ sudo ufw allow http
$ sudo ufw allow https
  • Habilite ufw
$ sudo ufw enable
  • Habilite un usuario administrador.
$ sudo adduser sammy
$ sudo usermod -aG sudo sammy
  • Cambia la zona horaria de tu servidor.
$ timedatectl list-timezones | grep Mexico
$ sudo timedatectl set-timezone America/Mexico_City
$ sudo timedatectl set-ntp true

Bibliografia.

https://docs.ovh.com/us/es/dedicated/seguridad-de-un-servidor-dedicado/#objetivo

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04

https://www.digitalocean.com/community/tutorials/como-configurar-un-firewall-con-ufw-en-ubuntu-18-04-es#:~:text=UFW%20o%20Uncomplicated%20Firewall%20es,para%20configurar%20correctamente%20un%20firewall.