Tips para administradores de sitios web

¡¡¡Webmasters!!! Hay que saber todo, porque sino dependemos de la profesionalidad de terceros o de su buena voluntad de terceros

Redsys, error 403 usando Cloudflare

Introducción

Hoy me ha llamado la atención cuando un cliente me ha expuesto el problema, en el que su pasarela Redsys, le daba un error en el que tras un pogo, el retorno de Redsys, no se efectuaba, y por tanto el carrito quedaba pagado pero no figuraba como tal en la tienda. Sus pedidos quedaban pendientes de pago, pese a estar debidamente procesados en Redsys.

Al ir a buscar información me encuentro con post que dan mil vueltas, pero no llegan a la raíz y otros que dieron la apertura fácil (gracias, más abajo os enlazo)

Redsys como siempre, amables, pero poco operativos, le indicaron el que podía ser pero con escueta y difusa información. El cliente entendió un error de java y que tenía un error 403, que pudo ver en la intranet de cliente en redsys.

Error en pasarela intranet

Análisis

Lo primero que me vino a la cabeza fue ver los logs (lo primero que hay que hacer en cualquier análisis técnico) y allí descubrí que no había error 403. ¿Cómo es eso?

Viendo los logs de Apache, donde no había ningún error 403 asociado las path, algo extraño ocurría. Así que la siguiente prueba fue determinar su resolución DNS.

Todo quedó claro: el cliente usa CloudFlare como servicio de distribución, cacheado y seguridad de contenidos.

Y aquí estaba claro que la respuesta o callback que retorna la pasarela Redsys no llegaba al servidor y esto suele tener nombre proxy o firewall (tipo mod_security o desarrollo propio como el caso de Cloudflare)

Primera salida para solventarlo

Algunos lo primero y único que hacen es, desactivar el firewall, el camino más habitual en muchos técnicos (algunos intitulados como Especialista en CiberSeguridad) lo cual es un craso error.

Jamás debemos ir a lo fácil, por esto será difícil, tarde o temprano.

Análisis de logs de Cloudflare

En nuestro dashboard de Cloudflare, tenemos un área para el Firewall, y allí, tenemos un sistema de log de eventos llamado Información general donde podemos reviar el log, consultar por rangos de fechas.

Cloudflare > Firewall > Información General

Podemos crear una regla con esos datos, y tambien hacerlo directamente desde los botones que aparecen si ponemos el puntero del ratón encima de Servicio pero prefiero hacerlo desde el menú Firewall > Reglas de firewall

Añadir una regla en el firewall

Debemos pues añadir dos reglas con la condicional Y

ASN que es el número de Sistema Autónomo de la red que en este caso si es de apropiado ponerla porque es una red bancaria, y es confiable, y además es posible que nos cambien o modifiquen alguna vez la IP, que en este caso para la red de Redsys-Sermepa es el AS31627, pero solo usaremos la parte numérica. Y el identificador URI - Identificador de recursos uniforme del callback de nuestra aplicación de comercio electrónico.

Cloudflare > Firewall > Reglas de firewall

Por último nos queda añadir la acción a esta regla, que como vimos en el log, debería ser Omitir > Comprobación de integridad del navegador

Enlaces

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

exception 'DOMPDF_Exception' with message 'No block-level parent found. Not good.

Introducción

Algunas veces con cambios entre servidores o proveedores de hosting, las aplicaciones de nuestros clientes, sufren ciertos descalabros, como por ejemplo el mostrar una página en blanco en lugar de renderizar un documento PDF.

Como norma general pensaremos en que hay un problema de nuestro servidor o hosting, en el que falta tal o cual extensión.

Craso error. Lo primero es lo primero. Hay que ver los logs.

Análisis

Podemos acceder vía SSH a nuestra shell o en su defecto via cPanel Acceso shell via cPAnel

Como podemos ver el error es claro:

[14-Jul-2021 05:49:24 UTC] Error al generar certificado : exception 'DOMPDF_Exception' with message 'No block-level parent found.  Not good.' in /home/dentista/public_html/dompdf/include/inline_positioner.cls.php:38
Stack trace:
#0 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(546): Inline_Positioner->position()
#1 /home/dentista/public_html/dompdf/include/text_frame_reflower.cls.php(331): Frame_Decorator->position()
#2 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(556): Text_Frame_Reflower->reflow(NULL)
#3 /home/dentista/public_html/dompdf/include/page_frame_reflower.cls.php(138): Frame_Decorator->reflow()
#4 /home/dentista/public_html/dompdf/include/frame_decorator.cls.php(556): Page_Frame_Reflower->reflow(NULL)
#5 /home/dentista/public_html/dompdf/include/dompdf.cls.php(817): Frame_Decorator->reflow()
#6 /home/dentista/public_html/pdfCerMaster.php(125): DOMPDF->render()
#7 {main}
Si nuestro proveedor usa PHP-FPM, los logs estarán en la carpeta `~/logs` con el formato `dominio_tld.php.error.log` 
Otros escenarios como fcgi, suPHP, etc, variarán según la configuración que el administrador haya impuesto por defecto o de manera personalizada

Este error no tiene nada que ver con la existencia o no de determinada extensión, sino con un error de en el analizador (parsing) de HTML5.

Corrección

Debemos localizar el fichero de configuración que defina la variable DOMPDF_ENABLE_HTML5PARSER o en su defecto si nuestra app no la tiene acudiremos a la de la propia librería.

Buscamos el posible fichero

$ find . -type f -exec grep -il "DOMPDF_ENABLE_HTML5PARSER" {} \;
./dompdf/include/dompdf.cls.php
./dompdf/changelog.txt
./dompdf/dompdf_config.custom.inc.php
./dompdf/dompdf_config.inc.php
./lib/dompdf/include/dompdf.cls.php
./lib/dompdf/www/setup.php
./lib/dompdf/changelog.txt
./lib/dompdf/dompdf_config.custom.inc.php
./lib/dompdf/dompdf_config.inc.php

Por los nombres me acerco a pensar en ./dompdf/dompdf_config.inc.php el cual paso a editar:

define("DOMPDF_ENABLE_HTML5PARSER", true);

Esto puede que funcione o no, pero al menos, me mostrará los errores de las etiquetas de HTML de una forma más adecuada.

Enlaces

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Gmail Ips address ranges

Gmail

Si, gmail tambien tiene sus lios con fallos en los SPF, con algun problema como todos. Y a diferencia del resto de los ISP, a Google como Microsoft, les tenemos tanto miedo que tenemos que protegernos de que sus ip caigan en lista negra o que incumplan lo que a nosotros se nos exige.

Esto es asi. Es imposible lidiar con un cliente, o con un administrador de una empresa que no pueda enviarnos correos porque el servidor XXX de Gmail, no ha firmado correctamente el correo con DKIM, o porque hay una falla en el SPF.

Como obtener las IP de gMail

❯ dig +short gmail.com txt
gmail.com.              300     IN      TXT     "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
gmail.com.              300     IN      TXT     "v=spf1 redirect=_spf.google.com"

❯ dig +short _spf.google.com TXT
"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

❯ dig +short _netblocks.google.com TXT
"v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
❯ dig +short _netblocks2.google.com TXT
"v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"
❯ dig +short _netblocks3.google.com TXT
"v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"

Google public DNS

Pendiente hacer el trabajo con un scriot como lo tengo con los google dns, pero incluyendo los Google gmail.

Listado de IP de google y gmail (IPV4)

# google
34.64.0.0/24 
34.64.1.0/24 
34.64.2.0/24 
34.101.0.0/24 
34.101.1.0/24 
34.101.2.0/24 
74.125.16.128/26 
74.125.16.192/26 
74.125.17.128/26 
74.125.17.192/26 
74.125.18.0/25 
74.125.18.128/26 
74.125.18.192/26 
74.125.19.0/25 
74.125.19.128/25 
74.125.40.0/25 
74.125.40.128/26 
74.125.40.192/26 
74.125.41.0/24 
74.125.42.0/24 
74.125.43.0/25 
74.125.43.128/25 
74.125.44.0/24 
74.125.45.0/24 
74.125.46.0/24 
74.125.47.0/24 
74.125.72.0/24 
74.125.73.0/24 
74.125.74.0/24 
74.125.75.0/24 
74.125.76.0/24 
74.125.77.0/24 
74.125.78.0/24 
74.125.79.0/24 
74.125.80.0/24 
74.125.81.0/24 
74.125.92.0/24 
74.125.112.0/24 
74.125.113.0/24 
74.125.114.128/26 
74.125.114.192/26 
74.125.115.0/24 
74.125.177.0/24 
74.125.178.0/25 
74.125.178.128/25 
74.125.179.0/25 
74.125.179.128/26 
74.125.179.192/26 
74.125.180.0/24 
74.125.181.0/25 
74.125.181.128/26 
74.125.181.192/26 
74.125.182.0/24 
74.125.183.0/24 
74.125.184.0/24 
74.125.185.0/25 
74.125.185.128/26 
74.125.185.192/26 
74.125.186.0/25 
74.125.186.128/26 
74.125.186.192/26 
74.125.187.0/25 
74.125.187.128/26 
74.125.187.192/26 
74.125.189.0/24 
74.125.190.0/24 
74.125.191.0/24 
172.217.32.0/25 
172.217.32.128/26 
172.217.32.192/26 
172.217.33.0/25 
172.217.33.128/25 
172.217.34.0/26 
172.217.34.64/26 
172.217.34.128/26 
172.217.34.192/26 
172.217.35.0/26 
172.217.35.64/26 
172.217.35.128/26 
172.217.35.192/26 
172.217.36.0/24 
172.217.37.0/25 
172.217.37.128/26 
172.217.37.192/26 
172.217.38.0/25 
172.217.38.128/26 
172.217.38.192/26 
172.217.39.0/25 
172.217.39.128/26 
172.217.39.192/26 
172.217.40.0/25 
172.217.40.128/26 
172.217.40.192/26 
172.217.41.0/25 
172.217.41.128/26 
172.217.41.192/26 
172.217.42.0/25 
172.217.42.128/26 
172.217.42.192/26 
172.217.43.0/25 
172.217.43.128/26 
172.217.43.192/26 
172.217.44.0/25 
172.217.44.128/26 
172.217.44.192/26 
172.217.45.0/25 
172.217.45.128/25 
172.217.46.0/24 
172.217.47.0/25 
172.217.47.128/25 
172.253.0.0/25 
172.253.0.128/25 
172.253.1.0/25 
172.253.1.128/26 
172.253.1.192/26 
172.253.2.0/25 
172.253.2.128/26 
172.253.2.192/26 
172.253.3.0/25 
172.253.3.128/25 
172.253.4.0/25 
172.253.4.128/25 
172.253.5.0/25 
172.253.5.128/25 
172.253.6.0/25 
172.253.6.128/25 
172.253.7.0/25 
172.253.7.128/26 
172.253.7.192/26 
172.253.8.0/25 
172.253.8.128/26 
172.253.8.192/26 
172.253.9.0/25 
172.253.9.128/26 
172.253.9.192/26 
172.253.10.0/25 
172.253.10.128/25 
172.253.11.0/25 
172.253.11.128/26 
172.253.11.192/26 
172.253.12.0/25 
172.253.12.128/25 
172.253.13.0/25 
172.253.13.128/26 
172.253.13.192/26 
172.253.14.0/25 
172.253.14.128/26 
172.253.14.192/26 
172.253.15.0/25 
172.253.15.128/26 
172.253.15.192/26 
172.253.192.0/24 
172.253.193.0/25 
172.253.193.128/26 
172.253.193.192/26 
172.253.194.0/25 
172.253.194.128/26 
172.253.194.192/26 
172.253.195.0/25 
172.253.195.128/26 
172.253.195.192/26 
172.253.196.0/25 
172.253.196.128/26 
172.253.196.192/26 
172.253.197.0/25 
172.253.197.128/26 
172.253.197.192/26 
172.253.198.0/25 
172.253.198.128/26 
172.253.198.192/26 
172.253.199.0/25 
172.253.199.128/26 
172.253.199.192/26 
172.253.200.0/25 
172.253.200.128/26 
172.253.200.192/26 
172.253.201.0/25 
172.253.201.128/25 
172.253.202.0/24 
172.253.204.0/25 
172.253.204.128/26 
172.253.204.192/26 
172.253.205.0/24 
172.253.206.0/24 
172.253.209.0/25 
172.253.209.128/26 
172.253.209.192/26 
172.253.210.0/25 
172.253.210.128/25 
172.253.211.0/25 
172.253.211.128/26 
172.253.211.192/26 
172.253.212.0/25 
172.253.212.128/26 
172.253.212.192/26 
172.253.213.0/25 
172.253.213.128/25 
172.253.214.0/25 
172.253.214.128/26 
172.253.214.192/26 
172.253.215.0/25 
172.253.215.128/26 
172.253.215.192/26 
172.253.216.0/25 
172.253.216.128/26 
172.253.216.192/26 
172.253.217.0/25 
172.253.217.128/25 
172.253.218.0/25 
172.253.218.128/26 
172.253.218.192/26 
172.253.219.0/25 
172.253.219.128/26 
172.253.219.192/26 
172.253.220.0/25 
172.253.220.128/26 
172.253.220.192/26 
172.253.221.0/25 
172.253.221.128/26 
172.253.221.192/26 
172.253.222.0/25 
172.253.222.128/26 
172.253.222.192/26 
172.253.223.0/25 
172.253.223.128/26 
172.253.223.192/26 
172.253.224.0/24 
172.253.225.0/24 
172.253.226.0/24 
172.253.227.0/24 
172.253.228.0/24 
172.253.229.0/24 
172.253.230.0/24 
172.253.231.0/24 
172.253.232.0/24 
172.253.233.0/24 
172.253.234.0/24 
172.253.235.0/24 
172.253.236.0/24 
172.253.237.0/24 
172.253.238.0/24 
172.253.239.0/24 
172.253.240.0/24 
172.253.241.0/24 
172.253.242.0/24 
172.253.243.0/24 
172.253.244.0/24 
172.253.245.0/24 
172.253.246.0/24 
172.253.247.0/24 
172.253.248.0/24 
172.253.249.0/24 
172.253.250.0/24 
172.253.251.0/24 
172.253.252.0/24 
172.253.253.0/24 
172.253.254.0/24 
172.253.255.0/24 
173.194.90.0/24 
173.194.91.0/24 
173.194.93.0/24 
173.194.94.0/24 
173.194.95.0/24 
173.194.96.0/25 
173.194.96.128/25 
173.194.97.0/24 
173.194.98.0/24 
173.194.99.0/24 
173.194.100.0/24 
173.194.101.0/24 
173.194.102.0/24 
173.194.103.0/24 
173.194.168.0/25 
173.194.168.128/26 
173.194.168.192/26 
173.194.169.0/24 
173.194.170.0/24 
173.194.171.0/24 
108.177.16.0/24
108.177.17.0/24
142.250.220.0/24
142.250.221.0/24
64.18.0.0/20
64.233.160.0/19
66.102.0.0/20
66.249.80.0/20
72.14.192.0/18
74.125.0.0/16
108.177.8.0/21
108.177.96.0/19
172.217.0.0/19
173.194.0.0/16
207.126.144.0/20
209.85.128.0/17
216.58.192.0/19
216.239.32.0/19
# end google ipv4

Prestashop: Expected response code 354 but got code 530, with message 530 Relaying not allowed

Introducción

No hemos tocado nada, ¿o sí?

Bueno, es probable que simplemente hayamos cambiado la dirección de correo electrónico que usábamos antes para enviar correos, y poco más.

La realidad es que si ponemos la tienda en debug poco más que lo que nos indica el panel de control de Prestahsop, obtendremos, pero es suficiente.

Expected response code 354 but got code “530”, with message “530 Relaying not allowed ”

530 Relaying not allowed

Análisis

El mensaje es claro, el servidor de correo nos prohíbe el envío del correo por que la necesaria paridad entre el emisor o usuario SMTP usado “xxxxx@dominio.tld” no corresponde. Son distintos.

Por supuesto, indica también que el servidor tiene configurado un sistema que no permite el relay de correo, como debe ser en un servidor de correo que se precie de ser cuando menos respetuosos con las más elementales normas de seguridad.

Prestashop te ilumina sobre su capacidad de tener distintos contactos, pero olvida que su sistema no es válido cuando un servidor o cuando la tienda se configura con SMTP AUTENTIFICADO. Para ello, Prestashop debería estar preparado para configurar cada una de las cuentas emisoras, y actualmente no lo esta (versión 1.7.8.3) cosa fácil de hacer si se lo propusieran.

Prestahop :: Gestión de contactos

En la versión 1.7 he visto que es posible hacer una vuelta a la cuestión, pero no apta para no programadores, ni para “expertos informáticos”. En ella se detalla una solución patatera (debería estar en el tablero de mandos y no en un manual del Core)

Bueno, si ya hemos llegado hasta aquí, y hemos sumado dos y dos son cuatro, la solución está vista.

'{email}' => Configuration::get('PS_SHOP_EMAIL'), // sender email address

Así que viendo la variable, ya tenemos claro por dónde van las cosas.

Prestashop permite la creación de distinto contactos para el envío de correos, pero estos no son usados en esa variable, lo cual no lleva al su inutilidad, pues spolo funcionará cuando usemos /usr/bin/sendmail o correo no autenticado o en su defecto el servidor donde nos encontremos, no tiene activas las protecciones de relay.

Solución

La solución pasa por editar la tabla configuration de nuestra tienda y modificar la variable PS_SHOP_EMAIL para que coincida con la dirección que hemos configurado como dirección autenticada.

Como norma general, esta variable tendrá la dirección de correo electrónico que se usó al instalar la tienda, y que no es modificable (o al menos yo no lo vi claro en su documentación) desde el panel de control.

En la imagen de abajo, como hacerlo con Mysql Workbench (no soy amigo de phpMyAdmin)

Prestahop :: Modificar la tabla configuration de prestahsop

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Actualizando Kimai Timetracker

Kimai Timetracker

Es un buen software como timetracker, y aunque podría mejorar mucho lo estoy usando desde hace tiempo, y no puedo ponerme a hacerme uno a medida.

Pero, yo suelo tener mi máquina actualizada a la última versión de PHP, y eso en el software, ya sea OpenSource o Comercial, muchas veces no es lo mejor.

En este caso, Kimai no está preparado para usar la PHP 8.1

Actualización.

Como siempre importante tener un backup rápido de los ficheros y de mysql. (mysqldump y rsync a nuestro servicio)

rsync -avv --progress --delete-after . ~/backups/home
mysqludmp –opt -u <user> -p database_kmai > database_kimai.sql

Leer la documentación

Importante leer la documentación de upgrades ya que en el caso de este software deberemos ir paso a paso, tag a tag.

Error por PHP Version

Use the `composer fund` command to find out more!

Synchronizing package.json with PHP packages
Don't forget to run npm install --force or yarn install --force to refresh your JavaScript dependencies!
Run composer recipes at any time to see the status of your Symfony recipes.

Executing script cache:clear [KO]
 [KO]
Script cache:clear returned with error code 255
!!  PHP Warning:  include_once(/home/kimai/web/timetracker.midominio.tld/src/Command/CreateReleaseCommand.php): Failed to open stream: No such file or directory in /home/kimai/web/timetracker.midominio.tld/var/cache/prod/ContainerGZoxyYu/getCreateReleaseCommandService.php on line 10
!!  PHP Warning:  include_once(): Failed opening '/home/kimai/web/timetracker.midominio.tld/src/Command/CreateReleaseCommand.php' for inclusion (include_path='.:/usr/share/php') in /home/kimai/web/timetracker.midominio.tld/var/cache/prod/ContainerGZoxyYu/getCreateReleaseCommandService.php on line 10
!!  PHP Warning:  include_once(/home/kimai/web/timetracker.midominio.tld/src/Command/ResetCommand.php): Failed to open stream: No such file or directory in /home/kimai/web/timetracker.midominio.tld/var/cache/prod/ContainerGZoxyYu/getResetCommandService.php on line 10
!!  PHP Warning:  include_once(): Failed opening '/home/kimai/web/timetracker.midominio.tld/src/Command/ResetCommand.php' for inclusion (include_path='.:/usr/share/php') in /home/kimai/web/timetracker.midominio.tld/var/cache/prod/ContainerGZoxyYu/getResetCommandService.php on line 10

Ni que mirar más, problema de uso de un PHP que no está soportado por kimai.

Cambiar la versión de PHP para el usuario

¿Por qué tener usuarios independientes para nuestro host virtuales? Por estas cosas. Imagínate que ahora por ahorrar un poco tienes todo en la misma cuenta de usuario. Uf, que problemon.

Si tienes multiples versiones de PHP en tu sistema (que deberías) puedes usar este tip [Cambiar la version php para nuestro shell y composer](] https://wiki.castris.com/books/tips-para-programadores/page/cambiar-la-version-php-para-el-shell-composer)

Tras hacerlo solo deberás usar el alias creado para usar la versión deseada, (en este caso php74)

c74 update
. . . 
136 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

What about running composer global require symfony/thanks && composer thanks now?
This will spread some   by sending a ★  to the GitHub repositories of your fellow package maintainers.

Run composer recipes at any time to see the status of your Symfony recipes.

Unpacking Symfony packs
 - Unpacked symfony/profiler-pack
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 0 updates, 1 removal
 - Removing symfony/profiler-pack (v1.0.6)
Package doctrine/reflection is abandoned, you should avoid using it. Use roave/better-reflection instead.
Package symfony/inflector is abandoned, you should avoid using it. Use EnglishInflector from the String component instead.
Package zendframework/zend-escaper is abandoned, you should avoid using it. Use laminas/laminas-escaper instead.
Package fzaninotto/faker is abandoned, you should avoid using it. No replacement was suggested.
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Generating autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
135 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
Failed to download recipe: The "https://flex.symfony.com/p/zendframework,zend-eventmanager,r3.2.0;zendframework,zend-code,r3.3.0;symfony,profiler-pack,rv1.0.3;symfony,ldap,rv4.2.8;php,r7.2.
9;ocramius,proxy-manager,r2.1.1;ocramius,package-versions,r1.2.0;composer,package-versions-deprecated,i1.11.99.5,1642428864;composer,pcre,i1.0.1,1642796677;symfony,polyfill-php81,iv1.25.0,1
631541491" file could not be downloaded (HTTP/2 410 )                                                                                                                                         

Run composer recipes at any time to see the status of your Symfony recipes.

Info from https://repo.packagist.org: #StandWithUkraine
Executing script cache:clear [OK]
Executing script assets:install [OK]

Después continuar con los pasos exigidos por Kimai para actualizar.

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.

Certificado Let’s Encrypt para servidor sin servidor web (ElasticSearch)

Introducción

Trabajar con software que requiere o debería requerir el trabajo mediante protocolo seguro HTTPS, como es el caso de ElasticSearch 8.X y superiores, hace imprescindible el utilizar certificados SSL.

Caso ElasticSearch sin servidor web

Las nueva version 8.X vienen configurada por defecto con la seguridad activada, y desactivarla puede ser un dolor de cabeza además de una irresponsabilidad.

Como es un servicio que ya no necesita de un proxy como nginx para usar kibana, o porque ni siquiera hemos instalado kibana, necesitamos crear un certificado basado en host sin servidor web.

Bueno, pues certbot ya dispone de una método automatizado para obtener el certificado del hostname, sin tener servidor web. Solo con que la ip resuelva en nuestra máquina podremos hacerlo.

Cerbot

Debemos elegir la opcion Other y seguir sus instrucciones

Instalador de Cerbot

Elegiremos la opción 1 Spin up a temporary webserver

root@elk:~# certbot certonly  
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): elk.mydomain.ovh
Renewing an existing certificate for elk.mydomain.ovh

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

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

Ubicación de los certificados y sus permisos

Let’s Encrypt ubica sus ficheros en /etc/letsencrypt/live/mydomain.tld/ y teniendo como propietario root. Esto los hace no leibles por Elasticseacrh o Kibana.

Ademas va generando sobre numeros consecutivos las distintas versiones y usando un sistema de enlaces simbolicos

Esto nos obliga a darle una vuelta algo complicada si queremos usar los certificados de Let’s Encrypt ya que las renovaciones deberemos tenerlas controladas.

A veces merece la pena la compra de un certificado de bajo coste y tener al menos un año de vida como admin de sistemas.

Copiar y cambiar propietario y permisos de los certificados

Elasticsearch

2 es el número de versión actual del certificado y sus ficheros.

cp /etc/letsencrypt/archive/elk.mydomain.ovh/*2.* /etc/elasticsearch/certs/
chmod 660 /etc/elasticsearch/certs/*
chown root:elasticsearch /etc/elasticsearch/certs/*
Kibana
mkdir /etc/kibana/certs
cp /etc/letsencrypt/archive/elk.mydomain.ovh/*2.* /etc/kibana/certs/
chmod 660 /etc/kibana/certs/*
chown root:elasticsearch /etc/kibana/certs/*

Editar los ficheros de configuracion

Después de editarlos deberemos hacer un restart de ambos demonios.

Elasticsearch

En mi caso es una configuracion en preproducción sin cluster. Ojo a esto.

Editamos /etc/elasticsearch/elasticsearch.yml teniendo en cuenta que estamos apuntando al certificado correcto.

xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
 enabled: true
 keystore.path: certs/http.p12
xpack.http.ssl.key: certs/privkey2.pem
xpack.http.ssl.certificate: certs/fullchain2.pem
xpack.security.transport.ssl:
 enabled: true
 verification_mode: certificate
 keystore.path: certs/transport.p12
 truststore.path: certs/transport.p12
Kibana

Editamos /etc/kibana/kibana.yml

server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/fullchain2.pem
server.ssl.key: /etc/kibana/certs/privkey2.pem

Enlaces

Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.