bookmark_borderConfigurar https en TOMCAT con CertBot

En esta ocasion vamos a configurar el https en TOMCAT webserver utilizando Certbot para la generación de los certificados.

Software

  • Ubuntu Server 20.04
  • Certbot 1.29.0
  • Tomcat 9

Procedimiento

  • Ejecuta los siguientes comandos
sudo certbot certonly --standalone -d tomcat.luidasa.com
cd /etc/letsencrypt/live/tomcat.luidasa.com
sudo cp {cert,chain,privkey}.pem /opt/tomcat/conf/ 
sudo nano /opt/tomcat/conf/server.xml and modify
  • Localiza en el archivo y modificalo.
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
  <SSLHostConfig>
    <Certificate certificateFile="conf/cert.pem"
                 certificateKeyFile="conf/privkey.pem"
                 certificateChainFile="conf/chain.pem" />
  </SSLHostConfig>
</Connector>

....
<Connector port="8080" protocol="HTTP/1.1"
  connectionTimeout="20000"
  redirectPort="8443" />
  • Agrega la siguiente sentencia en el archivo web.xml, para forzar a siempre use https.
<security-constraint>
 <web-resource-collection>
   <web-resource-name>Protected Context</web-resource-name>
   <url-pattern>/*</url-pattern>
 </web-resource-collection>
 <user-data-constraint>
   <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
</security-constraint>
  • Por ultimo reinicia el servicio de TOMCAT
sudo systemctl restart tomcat

bookmark_borderMicroservicio de Spring Boot en un contenedor Docker

Conceptos clave.

  • Microservicio. Un microservicio es una pequeño programa que se encarga de entregar algun servicio s
  • Contenedor. Es una tecnología que permite empaquetar y aislar las aplicaciones junto con todo el entorno de tiempo de ejecución, es decir, con todos los archivos que requieren para ejecutarse. Esto permite mover la aplicación que se encuentra dentro de un contenedor entre los diferentes entornos (de desarrollo, de prueba,de producción, etc.), sin perder ninguna de sus funciones.
  • Imagen
  • Docker. Docker se diseño a partir de la tecnología LXC de contenedores de Linux. La tecnologíoa LXC funcionaba como una virtualización ligera. Sin embargo, la mejoran al dividir las aplicaciones en sus procesos individuales y ofrecer herramientas para hacerlo.
  • Docker Hub. El docker hub es una libreria de registro de contenedores y una comunidad.
  • Spring boot. Es una tecnlogiía para la creación de aplicaciones independientes, y de grado de producción que puede simplemente ejecutarse con un mínimo esfuerzo.
  • Caracteristicas
    • Crear aplicaciones aisladas
    • Incrustar Tomcat o Jetty o Undertow directamente, no se necesita un WAR para deplegar el programa en producción.
    • Proporciona configuraciones inciales para simpliciar su compilación y ejecución.
    • Proporciona una configuración inicial de spring y de librerias de terceros donde sea posible.
    • Proporciona caracteristicas para producción como metricas de salud y configuración exterior
    • No requiere de archivos XML de configuración.

Procedimiento

  • Crea tu aplicación de spring boot y compila
  • Crea a nivel de raiz del proyecto el archivo Dockerfile
  • Ejecuta la siguiente sentencia.
    • docker build

Referencias

bookmark_borderInstalar Keycloak en Ubuntu 20.04 LTS

En este articulo vamos a describir como se debe de configurar un servidor Keycloak Server 18 en Ubuntu Server 20.04 LTS.

Requisitos

  • Instala Unzip
  • Instala
  • OpenJdk 11.
sudo apt update
sudo apt install openjdk-11-jdk
sudo update-alternatives --config java
sudo update-alternatives --config javac
  • Apache
sudo apt update
sudo apt install apache2
sudo systemctl start apache2
sudo systemctl status apache2
  • CertBot
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): dominio.com
Requesting a certificate for dominio.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/dominio.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/dominio.com/privkey.pem
This certificate expires on 2022-08-31.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for dominio.com to /etc/apache2/sites-available/000-default-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://dominio.com
We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sudo certbot renew --dry-run
  • Postegresql 14
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql
sudo -u postgres psql
postgres# \du
postgres# CREATE ROLE keycloak LOGIN PASSWORD 'securePass1';
postgres# GRANT postgres TO keycloak;
postgres# \q
  • Instalación de keycloak
wget https://github.com/keycloak/keycloak/releases/download/18.0.0/keycloak-18.0.0.zip
unzip keycloak-18.0.0.zip
cd keycloak-18.0.0
mkdir certs

bookmark_borderComo configurar un microservicio para que utilice Spring Cloud Config Server

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: file:~/config-server-properties
server:
  port: 8888
Lo mas importante, porque se van a utilizar para 
- nombre de la aplicación.
- lugar donde estan los archivos de configuración
- puerto.

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_borderComo empaquetar un microservicio hecho en spring con docker

Prerequisitos

  • Aplicación Spring
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.4</version>
  • Docker version 2.10.12, build e91ed57
  • Apache Maven 3.8.5

Pasos

  • Asegurate de que tu aplicacon de spring se ejecute con maven
./mvnw package && java -jar target/gs-spring-boot-docker-0.1.0.jar
  • Crea el Dockerfile en el proyecto de spring con las siguientes caracteristicas. No olvides renombrar al app.jar para que los guar
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • Compila con maven y que genera el componente jar.
mvn install
  • Construye la imagen con el comando de maven. No olvides sustituir myorg/myapp por un identificador para el hub de docker (compañia, y aplicacion)
docker build --build-arg JAR_FILE=target/*.jar -t myorg/myapp .
  • una vez que se haya creado por primera vez la imagen, puedes ahora reconstruirla solo utilizando la sentencia
docker build -t myorg/myapp .
  • Comprueba que se haya construido la imagen
docker image list --all
REPOSITORY                                         TAG             IMAGE ID       CREATED          SIZE
bcee/eureka                                        latest          2782caf7a46e   28 minutes ago   372MB
  • Crea un contenedor con la imagen creada.
docker run -p 8080:8080 myorg/myapp
  • Recuerda que los otros parametros de run (ver comandos de docker)

bookmark_borderComandos de docker

Los comandos y sus parametros que mas he usado, supongo que no son todos pero me dan una vision de lo que debo de hacer.

  • docker run <imagen>:[tag]
    • Descarga una imagen para crear un contenedor si la imagen no se encuentra en la lista, y adicionalmente ejecuta el contenedor con los parametros que has hayan indicado, por ejemplo,
    • –name nombre que se le va a dar al contenedor, en caso de no indicarse, se genera uno aleatorio.
    • -i. Modo interactivo al arrancar el contenedor.
    • –reset. on Se reinicia cuando caiga.
    • -t. Abre una terminal tty (TELEFONO DE TEXTO)
    • -d. Indica que se va a arrancar el contenedor y va a estar desatendido.
    • -e Declara una variable de sesión que va a estar definida en el contenedor.
    • –network Nombre de la red a la cual pertenece. Previamente debe de existir la red.
    • -p. Expone los puertos del contenedor al host del contendor.
    • -P. Expone todos los puertos que estan abiertos en el contedor. Es util cuando se levantan los servicios en random.
    • -v. Volumenes registrados en el contenedor y su mapeo en la maquina que hospeda.
  • docker build. construye una imagen
  • docker image
  • docker container
  • docker start [nombre del contenedor | id del contenedor ]
    • Inicia un contenedor.
  • docker stop [nombre del contenedor | id del contenedor ]
  • docker rm [nombre del contenedor | id del contenedor ]*
  • docker ps. Muestra todos los contenedores que se encuentran activos.
    • -a muestra todos los contenedores incluso los que no se encuentran ejecutandose.
  • docker push
  • docker inspect
  • docker network create
  • docker network rm
  • docker network attach

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/