Actualización de osTicket con errores

Desde versiones previas 1.10.X a 1.12.X o posteriores aparecen errores con tablas ya creadas (seguramente de actualizaciones fallidas previas) en las que se muestra el error en el registro de la aplicación:

* @signature 86707325fc571e56242fccc46fd24466 
* @version v1.11.0 
* @title Add ticket referral * 
* This patch adds a table for thread referral as well as thread event states of referred and deleted 
*/ CREATE TABLE `cli_thread_referral` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `thread_id` int(11) unsigned NOT NULL,  `object_id` int(11) unsigned NOT NULL,  `object_type` char(1) NOT NULL,  `created` datetime NOT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `ref` (`object_id`, `object_type`, `thread_id`),  KEY `thread_id` (`thread_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Table 'XXX_thread_referral' already exists

Deberemos volver a recuperar los archivos y la base de datos de nuestra copia de seguridad, además de eliminar la tabla indicada, deberemos suprimir dos más, donde "XXX" es el prefijo de las tablas de nuestra instalación:

DROP TABLE XXX_thread_referral;
DROP TABLE XXX_queue_export;
DROP TABLE XXX_event;

Es recomendable eliminar posibles idiomas adicionales y dejar como predeterminado el inglés nativo. En el caso de instalaciones antiguas, la versión de PHP mínima es la 5.6.40 tras la actualización podemos cambiar a 7.1.33 o posterior.

Si nos encontramos con errores durante la actualización pero sin dejar rastro en el log de PHP y de la BBDD de la aplicación, las reglas del firewall de aplicaciones Modsecurity bloquean el proceso de actualización, deberemos permitir temporalmente, utilizar Atomic Standard en lugar de OWASP o añadir excepciones para la ruta del panel de gestión (SCP).

NOTA: Es posible revisar los detalles de las reglas aplicadas en el registro de Plesk/cPanel via web o en los directorios de registro, por ejemplo: %Plesk_dir%\ModSecurity\vhosts\GUIDXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\logs sería necesario deshabilitar la regla 920480

 

Message: Access denied with code 403 (phase 1). Match of "rx ^%{tx.allowed_request_content_type_charset}$" against "TX:1" required. [file "/Plesk/ModSecurity/rules/modsecurity_crs-plesk/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "944"] [id "920480"] [msg "Request content type charset is not allowed by policy"] [data "utf-8"] [severity "CRITICAL"] [ver "OWASP_CRS/3.2.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/CONTENT_TYPE_CHARSET"] [tag "WASCTC/WASC-20"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/EE2"] [tag "PCI/12.1"]
Action: Intercepted (phase 1)
Apache-Handler: IIS
Stopwatch: 1590421305747749 0 (- - -)
Stopwatch2: 1590421305747749 0; combined=0, p1=0, p2=0, p3=0, p4=0, p5=0, sr=0, sw=0, l=0, gc=0
Producer: ModSecurity for IIS (STABLE)/2.9.2 (http://www.modsecurity.org/); OWASP_CRS/3.2.0.
Server: ModSecurity Standalone
Engine-Mode: "ENABLED"

 

 


Errores post-instalación con Intel Unite

La instalación del software del Intel Unite, para permitir compartir pantallas y entornos de trabajo colaborativos compatibles con Intel vPro, termina correctamente pero es necesaria una configuración posterior del entorno más detallada. Debemos asegurarnos que el equipo contiene certificados SSL válidos dentro de la organización, bien con nuestra propia AC o externos.

Para realizar la autoconfiguración de equipos cliente podemos añadir registros DNS en nuestro servidor, añadimos una etiqueta TXT:

SERVICEURL=https://unite.midominio.com/IntelUnite/api&orgId=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX&orgName=MI-ORGANIZACION

Nos facilitará algunos pasos de despliegue según la infraestructura de nuestra organización, en el caso del sevicio DNS de Windows Server:

En la primera instalación del cliente podemos obtener un error del tipo 0x00542 indicando que nos falta la versión de hub correspondiente:

Desde el panel de gestión https://unite.midominio.com/intelunite/admin/modules debemos cargar los archivos CAB descomprimidos de la versión utilizada en el servidor:

Con los archivos subidos debemos aprobar los nuevos paquetes:

Dependiendo de la configuración del servidor Web podemos obtener un error adicional, cuando IIS intenta bloquear las peticiones que contienen ciertos caracteres especiales, deberemos o bien permitir para estas direcciones los caracteres o cambiar la URL de acceso si es posible:

Si todo es correcto ya tendremos funcionando la solución Unite en nuestra red. Para investigar otro tipo de errores debemos acudir a los archivos de registro C:\Users\Usuario\AppData\Local\Temp\unite.SQL en los equipos cliente o C:\Users\IntelUniteWebApiPool\AppData\Local\Temp en el servidor, podremos abrirlos con con cualquier visor de SQLite

Sistemas legacy y ciclo de vida del software

Cada cierto tiempo aparecen ofertas de trabajo buscando experiencia en entornos COBOL (1959), FORTRAN (1954), LISP (1958), PASCAL (1970)... los lenguajes de programación no desaparecen, las aplicaciones desarrolladas en ellos tampoco... pero si pueden evolucionar.

Los mantras más repetidos "no se cae", "es estable", "es seguro", "si funciona no lo toques"...  lo vimos hace poco con el ejemplo de THEOS Corona, vamos a realizar la comparativa con algo más cotidiano, como resultado de una necesidad específica: el coche.

Existe gran cantidad de modelos, pero debemos conocer las necesidades para ajustarnos lo más posible, iremos a los extremos para intentar ilustrarlo mejor. Si realizamos 4.000 km al año, no desplazamos más de 200 kg de carga, su utilización no excede de 1 hora continuada, la temperatura media externa es de 26 grados, todo en ello en un ambiente urbano sin grandes desniveles podremos aproximar que casi cualquier coche podría servirnos.

Ahora bien, si queremos mostrar al vecino del cuarto nuestro poderío automovilístico cada vez que bajemos al garaje, sin problema de financiación, en lugar de tener un Honda Jazz podemos tener un Lexus LFA. Ambos son coches fiables con cuatro ruedas que nos llevaran del punto A al B sin mayor problema.

Por otro lado, deberemos prever durante cuánto tiempo estaremos utilizándolo, con el mismo o similar propósito, mantenimientos a realizar durante su periodo, posibles problemas derivados de un uso inadecuado, situaciones inesperadas...

Si bien el planteamiento inicial de un proyecto puede diferir del resultado final, el coste asociado al mismo dependerá de nuestra capacidad de evaluación, previsión y definición de objetivos claros. Que un sistema informático quede anticuado, pero siga siendo utilizado no quiere decir que sea mejor o peor que uno actual, pero es un punto limitante importante, de la misma forma que lo sería utilizar un coche con carburador o arranque con platinos.

Cuando una empresa decide realizar un proyecto personalizado, el resultado acaba plasmado en una o varias tecnologías dependiendo de los recursos que quiera destinar, si los plazos son importantes para el cliente final también debe ser contemplar su ciclo de vida.

Instalación de ICINGA Director

Continuando la instalación previa ya realizada sobre CentOS 8 de la versión ICINGA 2.7.3 comprobamos que tengamos instalados los requisitos para CentOS, deberían estar todos:

sudo dnf install php-pcntl php-process php-sockets

Debemos tener instalados los modulos: ipl, incubator y reactbundle, procedemos a descarar las versiones mínimas requeridas:

MODULE_NAME=ipl
MODULE_VERSION=v0.5.0
REPO="https://github.com/Icinga/icingaweb2-module-${MODULE_NAME}"
MODULES_PATH="/usr/share/icingaweb2/modules"
git clone ${REPO} "${MODULES_PATH}/${MODULE_NAME}" --branch "${MODULE_VERSION}"
icingacli module enable "${MODULE_NAME}"

NOTA: si al ejecutar el clonado desde git no tenemos instalado el módulo, nos pedirá instalarlo

MODULE_NAME=incubator
MODULE_VERSION=v0.5.0
REPO="https://github.com/Icinga/icingaweb2-module-${MODULE_NAME}"
MODULES_PATH="/usr/share/icingaweb2/modules"
git clone ${REPO} "${MODULES_PATH}/${MODULE_NAME}" --branch "${MODULE_VERSION}"
icingacli module enable "${MODULE_NAME}"

Y el último:

MODULE_NAME=reactbundle
MODULE_VERSION=v0.7.0
REPO="https://github.com/Icinga/icingaweb2-module-${MODULE_NAME}"
MODULES_PATH="/usr/share/icingaweb2/modules"
git clone ${REPO} "${MODULES_PATH}/${MODULE_NAME}" --branch "${MODULE_VERSION}"
icingacli module enable "${MODULE_NAME}"

Reiniciamos el servicio, los módulos estarán visibles en el panel de control

systemctl restart icinga2.service

 

Continuamos creando la base de datos para Director:

mysql -p -e "CREATE DATABASE director CHARACTER SET 'utf8';
CREATE USER director@localhost IDENTIFIED BY 'Direc89mon_';
GRANT ALL ON director.* TO director@localhost;"

Si utilizamos el mismo usuario que utilizamos anteriormente en la instalación previa, deberemos garantizar el acceso según nuestra configuración, por ejemplo:

GRANT ALL PRIVILEGES ON director.* TO 'icinga'@'localhost';
GRANT ALL PRIVILEGES ON icinga.* TO 'director'@'localhost';
quit

 

En el directorio /etc/incingaweb2/resources.ini debemos añadir la nueva BBDD.

Comenzamos con la instalación:

 

MODULE_VERSION="1.7.2"
ICINGAWEB_MODULEPATH="/usr/share/icingaweb2/modules"
REPO_URL="https://github.com/icinga/icingaweb2-module-director"
TARGET_DIR="${ICINGAWEB_MODULEPATH}/director"
git clone "${REPO_URL}" "${TARGET_DIR}" --branch v${MODULE_VERSION}

icingacli module enable director

Con esto ya podemos seguir el asistente de instalación desde la web.

 

Otras opciones y consejos útiles durante el proceso:

Si no recordamos el usuario y clave de la API:

vim /etc/icinga2/conf.d/api-users.conf

Si no recordamos el nombre del nodo:

vim /etc/icinga2/constants.conf

Para crear el demonio del servicio:

useradd -r -g icingaweb2 -d /var/lib/icingadirector -s /bin/false icingadirector
install -d -o icingadirector -g icingaweb2 -m 0750 /var/lib/icingadirector
MODULE_PATH=/usr/share/icingaweb2/modules/director
cp "${MODULE_PATH}/contrib/systemd/icinga-director.service" /etc/systemd/system/
systemctl daemon-reload
systemctl enable icinga-director.service --now

En el caso de tener algún modulo desactualizado, al reiniciar el servicio y en la consola web nos aparecerá el problema concreto:

Si es nuestro caso, debemos eliminar las versiones previas y volver a realizar el proceso con la requerida en cada caso.

Si aparece un mensaje de advertencia pero la BBDD si esta en UTF8, puedes comprobarlo desde mysql, es posible continuar pese al mensaje de advertencia:

mysql -p
USE director;
show variables like "character_set_database";



 

Monitorización de servicios con ICINGA

Existe una comunidad y popularidad grandes alrededor de Nagios, pero tenemos la alternativa gratuita de ICINGA con la que realizaremos esta instalación sobre CentOS 8

Comprobamos actualizaciones del sistema operativo para ver si estamos al día:

sudo dnf update

Instalamos desde el repositorio, más de 330 MB:

dnf install https://packages.icinga.com/epel/icinga-rpm-release-6-latest.noarch.rpm

Instalamos dependencias del repositorio EPEL:

dnf install 'dnf-command(config-manager)'
dnf config-manager --set-enabled PowerTools
dnf install epel-release

Empezamos con el paquete principal, y añadimos en el arranque del sistema:

dnf install icinga2
systemctl enable icinga2 --now

Instalamos todos los plugins compartidos/compatibles de nagios, serán casi 25 MB y comprobamos el estado:

dnf install nagios-plugins-all
systemctl status icinga2

Empezamos con la instalación de SELInux requerido para el control de acceso, para una instalación más sencilla en esta demo activaremos el modo permisivo:

dnf install icinga2-selinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
sestatus

 

Para el modulo web necesitaremos instalar la Base de Datos (también es posible en PostgreSQL)

dnf install mariadb-server mariadb
systemctl enable mariadb --now

Iniciamos la instalación y definimos las claves del usuario root con el asistente, además de instalar el modulo IDO:

mysql_secure_installation
dnf install icinga2-ido-mysql

Creamos la base de datos en blanco con el usuario y contraseña que queramos:

mysql -u root -p
CREATE DATABASE icinga;
GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'Pass4ever$$';
quit

Con la BBDD en blanco importamos el esquema:

mysql -u root -p icinga < /usr/share/icinga2-ido-mysql/schema/mysql.sql

Según los datos con los que creamos la BBDD indicamos la conexión el fichero

sudo vim /etc/icinga2/features-available/ido-mysql.conf

Habilitamos IDO y reiniciamos:

icinga2 feature enable ido-mysql
sudo systemctl restart icinga2

Ahora que ya tenemos la BBDD continuamos con el servidor web Apache, recomendando habilitar HTTPS en lugar de HTTP:

sudo dnf install httpd php-json php-ldap
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
sudo service iptables save

Si no tenemos instalado PHP-FPM para el servicio web, será necesario PHP >= 5.6.0
Ojo porque no todas las versiones de PHP son soportadas en estos momentos, optamos por la 7.2 ya que fuera de la RC no hay soporte para PHP 7.4 y los módulos cURL, gettext, intl, mbstring, OpenSSL y xml

Comprobamos las versiones disponibles en los repositorios:

sudo dnf module list | grep php

sudo dnf module install php:7.2
sudo dnf install php php-fpm
sudo dnf install php-intl php-gd php-mysqlnd

Ya debería estar instalador, pero comprobamos:

 

sudo dnf install php-curl php-gettext php-openssl php-mbstring php-xml php-zip php-gd php-dom php-ldap

sudo dnf install -y php php-devel php-pear make

No nos olvidemos de Image Magick como requisito:

sudo dnf install ImageMagick-devel
sudo dnf install ImageMagick

sudo pecl install imagick
echo "extension=imagick.so" > /etc/php.d/20-imagick.ini
systemctl restart httpd

Comprobamos que aparezca entre los modulos disponibles de PHP y activamos al inicio:

php -m
sudo systemctl enable php-fpm.service --now

Revisamos la versión de PHP activa, en nuestro caso 7.2.11 y configuramos el inicio automático y arrancamos el servidor web

php -v
systemctl enable httpd --now
sudo dnf install icingacli icingaweb2

Para habilitar REST API para el envío de comandos y comunicación:

icinga2 api setup
systemctl restart icinga2

Se generan usuario y claves aleatorios en:

vim /etc/icinga2/conf.d/api-users.conf

Llegados a este punto, comprobamos que no tengamos errores antes de continuar:

sudo tail /var/log/icinga2/icinga2.log

Continuamos con la configuración en el servicio web y reiniciamos:

sudo icingacli setup config webserver apache
sudo systemctl restart httpd

Necesitaremos un token de autenticación:

sudo icingacli setup token create

Ya podemos acceder via web al asistente de configuración:

http://IP_CENTOS8/icingaweb2/setup

Continuamos la instalación guiados por el asistente hasta finalizar el proceso según nuestras preferencias y requisitos:

Con este último paso ha finalizado por completo la instalación, podemos añadir nuestro primer host, descargamos el agente para el sistema operativo correspondiente (o cualquier dispositivo SNMP, router, switch...) la función básica de PING debemos permitirla a través del firewall del host:

Editamos y añadimos al final del fichero en el servidor:

vim /etc/icinga2/conf.d/hosts.conf

Por ejemplo:

object Host "MISERVIDOR" {
address = "10.0.0.200"
check_command = "hostalive"
}

Reiniciamos el servicio

systemctl restart icinga2.service

 

Otras opciones y consejos útiles durante el proceso:

Instalación opcional de la sintaxis y edición en Vim o en Nano para facilitar la edición de ficheros de configuración:

sudo dnf install vim-icinga2
sudo dnf install nano-icinga2

Si al intentar ejecutar el modulo setup nos indica que no existe, lo habilitamos:

icingacli module enable setup
sudo dnf install icingaweb2-module-setup

Si habíamos generado un token y no lo recordamos:

icingacli setup token show

Para monitorizar y enviar comandos necesitaremos abrir el puerto 5665 en nuestro servidor ICINGA:

firewall-cmd --zone=public --permanent --add-port 5665/tcp
iptables -A INPUT -p tcp -m tcp --dport 5665 -j ACCEPT
firewall-cmd --reload