David Bohm

Hay dos frases que definen mi manera de pensar:
Realmente no hemos prestado mucha atención al pensamiento como un proceso; hemos participado en pensamientos, pero sólo hemos prestado atención al contenido, no al proceso.
La capacidad de percibir o pensar de manera diferente es más importante que el conocimiento adquirido.
Ambas son de David Bohm.

domingo, 28 de febrero de 2021

Instalar GitLab con docker

GitLab además de su versión en la nube puede ser instalado en un servidor o máquina virtual. Pero otra opción muy interesante es la de desplegarlo en un contenedor.

El docker que vamos a utilizar es el oficial de GitLab y en concreto la versión CE (Community Edition):

    https://hub.docker.com/r/gitlab/gitlab-ce/

La documentación oficial la podemos encontrar en:

   https://docs.gitlab.com/omnibus/docker/

Verás que trata sobre la versión Enterprise, pero como indican mas abajo, solo tienes que sustituir gitlab-ee por  gitlab-ce en todos los comando propuestos.

Para correr el docker de GitLab, tendremos que especificar los siguientes parámetros:

   -d --> Para ponerlo en segundo plano (dettach)

   -p 443:443 --> Puerto 443 en el docker y el correspondiente en nuestro equipo

   -p 80:80

   -p 22:22

   --name gitlab --> Nombre del docker

   --restart always --> reiniciará ante errores

   -v /srv/gitlab/config:/etc/gitlab 

   -v /srv/gitlab/logs:/var/log/gitlab

   -v /srv/gitlab/data:/var/opt/gitlab

Para desplegar este docker solo debemos lanzar este comando:

   # docker run -d -p 443:443 -p 80:80 -p 22:22 --name gitlab --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

Es posible que cuando vayamos a acceder a http://localhost obtengamos una respuesta similar a: 502 - Whoops, GitLab is taking too much time to respond. Debemos dejar pasar un rato, hasta que GitLab arranque completamente.

Vamos a ver como cambiar la contraseña de root, son pocos pasos y nos permite repetir la operación siempre que queramos. Lo primero nos conectamos al docker de forma interactiva:

   # docker exec -it gitlab bash

Una vez dentro del contenedor, ejecutamos:

   # gitlab-rails console -e production

Tendremos que esperar a que vuelva a aparecer el prompt y ejecutamos:

   > user = User.where(id: 1).first

   > user.password = 'ContraseñaNueva'

   > user.password_confirmation = 'ContraseñaNueva'

   > user.save

   > exit

Salimos de la consola del docker:

   # exit

Y ya podemos entrar a http://localhost de nuevo e iniciar sesión con el usuario root y la nueva contraseña que hemos especificado anteriormente. A partir de ahí pura esencia GitLab!!!

DOCKER-COMPOSE

El fichero docker-compose.yml deberá contener:

   version: '3.3' 

      services: 

         gitlab-ce: 

            ports: 

               - '443:443' 

               - '80:80' 

               - '22:22' 

            container_name: gitlab 

            restart: always 

            volumes: 

               - '/srv/gitlab/config:/etc/gitlab' 

               - '/srv/gitlab/logs:/var/log/gitlab' 

               - '/srv/gitlab/data:/var/opt/gitlab' 

            image: gitlab/gitlab-ce

SaluDOS

domingo, 21 de febrero de 2021

Sentencias útiles en MySQL

Vamos a ver varios ejemplos útiles para trabajar con MySQL, son cosas sencillas y muy básicas pero creo que interesantes y del día a día.

Empezaremos conectándonos al servidor de base de datos con usuario root:

   # mysql -u root -p 

CREAR USUARIOS, PRIVILEGIOS Y BASES DE DATOS

Para no utilizar el usuario root en labores de administración, lo ideal es crear un usuario diferente como por ejemplo adminUSER:

   > GRANT ALL PRIVILEGES ON *.* TO 'adminUSER'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

Generar una base de datos es tan sencillo como lanzar la siguiente sentencia SQL especificando el nombre de la base de datos:

    CREATE DATABASE testDB;

Si vamos a crear un usuario específico para que sea administrador solo de esa base de datos podemos crear el usuario adminTEST:

   > GRANT ALL PRIVILEGES ON testDB.* TO 'adminTEST'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

La próxima vez que nos conectemos al servidor de base de datos podremos iniciar sesión con este usuario, así solo tendremos privilegios sobre la nueva base de datos:

   # mysql -u adminTEST -p 

Muchas veces necesitamos un usuario que tenga privilegios de solo lectura sobre una base de datos, por ejemplo un usuario de servicio con el que vamos a monitorizar. Empecemos viendo como crear un usuario que tendrá acceso desde el mismo servidor de base de datos solo a la base de datos especificada:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'localhost' IDENTIFIED BY 'Pa$$w0rd';

Si lo que deseamos es que se conecte desde cualquier equipo remoto:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'%' IDENTIFIED BY 'Pa$$w0rd';

O podemos ser mas restrictivos especificando el nombre DNS o la dirección IP desde la que se conectará el usuario con acceso de lectura:

   > GRANT SELECT ON testDB.* TO 'readTEST'@'NombreServidorRemoto' IDENTIFIED BY 'Pa$$w0rd';

Siempre que cambiemos los privilegios de un usuario o lo creemos, hay que ejecutar:

   > FLUSH PRIVILEGES;

CREAR TABLAS

Cuando estamos conectados a un servidor con varias bases de datos, primero tendremos que ejecutar la sentencia para utilizar una base de datos concreta:

   > USE testDB;

Una forma rápida de generar tablas en MySQL es a través de un pequeño script, aunque siempre podemos utilizar un editor gráfico como podría ser DBeaver. Debemos especificar el nombre de la tabla, los campos que la componen y sus características. Veamos algunos ejemplos:

Creación de una tabla de usuarios: Crearemos UserID, un campo que será clave principal, autoincremental y no podrá ser null. Además crearemos una serie de campos de texto de tamaño variable para especificar los datos del usuario, alias, nombre, etcétera. Por último un campo de tipo booleano para establecer si el usuario está activo o no.

   > CREATE TABLE DBUsers (
         UserID int NOT NULL AUTO_INCREMENT,
         Alias varchar (50) NOT NULL,
         FirstName varchar(100),
         LastName varchar(100),
         Email varchar(150),
         Enabled boolean DEFAULT 1,
         PRIMARY KEY (UserID)
         );

Creación de una tabla de grupos de usuarios o roles: Crearemos GroupID, un campo que será clave principal, autoincremental y no podrá ser null. Además estableceremos el campo con el nombre del grupo y un campo booleano para establecer si el usuario está activo o no.


   > CREATE TABLE DBGroupsList (
         GroupID int NOT NULL AUTO_INCREMENT,
         GroupName varchar (50) NOT NULL,
         Enabled boolean DEFAULT 1,
         PRIMARY KEY (GroupID)
         );

Creación de una tabla en la que asignaremos usuarios a grupos especificando los identificadores de usuario y grupo. Además añadimos un campo que establezca si esa asignación está activa o no. Además estos campos tienen que estar conectados a las tablas que definen la lista de usuarios y la lista de grupos, para eso son las claves foráneas.


    > CREATE TABLE DBGroupsAssign (
         UserID int NOT NULL
         GroupID int NOT NULL,
         Enabled boolean DEFAULT 1,
         FOREIGN KEY (UserID) REFERENCES DBUsers(UserID),
         FOREIGN KEY (GroupID) REFERENCES DBGroupsList(GroupID)
         );

MODIFICAR TABLAS

Una labor muy común es modificar una tabla, vamos a ver el caso mas frecuente, por ejemplo que tenemos que añadir un campo.

En este ejemplo vamos a añadir la fecha de alta en la tabla de usuarios. Además como lo queremos en un sitio concreto, podemos especificar FIRST para ser el primer campo de la tabla o AFTER para especificar el campo detrás del que queremos insertar el nuevo.

   > ALTER TABLE DBUsers ADD StartDate DATETIME AFTER Alias;

Otro caso muy frecuente es modificar alguna característica de un campo ya existente. Por ejemplo vamos a modificar la longitud de un campo, imaginemos que el Email se nos ha quedado corto en la tabla de usuarios. Además vamos a hacer que sea un campo obligatorio, que no pueda estar vacio.

   > ALTER TABLE DBUsers MODIFY Email varchar(255) NOT NULL;

SaluDOS

Montar un docker mysql y conectarse desde dbeaver

VERSIÓN

Antes de montar el docker de mysql, es mejor revisar este enlace y decidir la versión que queremos utilizar:

https://hub.docker.com/_/mysql

Actualmente los dockers soportados son las siguientes versiones de mysql:

   8.0.23   8.0.8   latest

   5.7.33   5.7   5

   5.6.51   5.6

Además vamos a tener la precaución de que los datos sean persistentes. Una vez que se elimine el docker, podremos volver a levantarlo y tendremos nuestras bases de datos intactas.

CREACIÓN DEL DOCKER

Veamos que parámetros vamos a utilizar para levantar el docker, algunos los especificaremos pero son opcionales.

   -d --> Modo en segundo plano (detached)

   --rm --> Cuando paremos el contenedor automáticamente se eliminará

   --name mysql --> Nombre del docker

   -e --> Sirve para pasar al docker una variable de entorno, en este contenedor le vamos a especificar la contraseña del usuario root. seguido de este parámetro especificamos la variable y su valor:

   MYSQL_ROOT_PASSWORD=Pa$$w0rD

   -p 3306:3306 --> Puerto 3306 en el equipo y el correspondiente en el docker

   -v mysql_data:/var/mysql --> Ruta local del equipo y la correspondiente en el docker, esto hará que los datos se guarden en el equipo local y sean persistentes siempre  que especifiquemos la misma configuración del volumen.

   mysql:latest --> última versión del docker de mysql en el repositorio oficial Docker Hub. Si quisieramos una versión concreta, podriamos especificarla:

      mysql:5.7.33

El comando completo sería:

   # docker run -d --rm --name mysql -e MYSQL_ROOT_PASSWORD=Pa$$w0rD -p 3306:3306 -v mysql_data:/var/mysql mysql

Comprobamos que el docker está funcionando:

   # docker ps -a

DOCKER-COMPOSE 

El fichero docker-compose.yml tendría el siguiente contenido:

   version: '3.3' 

   services: 

      mysql: 

         container_name: mysql 

         environment: 

            - MYSQL_ROOT_PASSWORD=Pa$$w0rD 

         ports: 

            - '3306:3306' 

         volumes: 

            - 'mysql_data:/var/mysql' 

         image: mysql

CONEXIÓN DESDE DBEAVER

Para conectarnos a la base de datos que tenemos en un contenedor en nuestro propio equipo, creamos una nueva conexión, seleccionamos mysql y especificamos los datos básicos:

   - Server Host: localhost

   - Port: 3306

   - Nombre de usuario: root

   - Contraseña: Pa$$w0rD

Al finalizar podremos realizar la conexión. Es posible que aparezca algún error en la conexión debido a un parámetro mal configurado. Tanto al crear la conexión como al editarla, en la pestaña Driver Properties podremos reconfigurar una infinidad de parámetros y su valor en la conexión.

Si la conexión no la realizamos desde el mismo equipo que tiene el docker, hay que tener en cuenta que para conexiones remotas tendremos que abrir correctamente los puertos en el firewall del equipo que contiene el contenedor de mysql.

SaluDOS

jueves, 4 de febrero de 2021

DBeaver, el castor que te conecta a cualquier base de datos desde cualquier sistema operativo

Hay muchos programas para poder conectarnos y administrar bases de datos. Algunos son específicos y otros genéricos con compatibilidad con las principales bases de datos como mySQL, Ms SQL, PostgreSQL, Oracle, etc...

DBeaver es un proyecto libre y de código abierto.

DBeaver tiene dos versiones, la community que es la que instalaremos y una enterprise 'tope de gama' que cuesta unos 20$/mes o 200$/año aproximadamente. Se puede consultar en la web de la versión enterprise:

   https://dbeaver.com/

Es multiplataforma, por lo que algo muy atractivo es que se puede instalar en Linux, Windows y MacOS. Podemos encontrar el software y mucha mas información sobre como instalarlo o la documentación asociada en la web oficial del proyecto Community:

   https://dbeaver.io/download/

Tal y como nos indican en su web, para realizar la instalación en una distribución linux tenemos varias opciones para instalarlo, descargando el paquete de la web, paquete snap, flatpak o clonar el repositorio de github. El repositorio en github lo encontramos en: 

   https://github.com/dbeaver/dbeaver/releases

Veamos por ejemplo la instalación del paquete. Aunque podemos hacer la descarga desde la web, veamos como sería desde la consola tal y como lo indica la documentación oficial:

   # wget -O - https://dbeaver.io/debs/dbeaver.gpg.key | sudo apt-key add - 

   # echo "deb https://dbeaver.io/debs/dbeaver-ce /" | sudo tee /etc/apt/sources.list.d/dbeaver.list 

   # apt-get update && sudo apt-get install dbeaver-ce

Tras descargarlo de la web oficial, solo tenemos que posicionarnos en el directorio de descarga y ejecutar el comando correspondiente.

   Para distribuciones derivadas de Debian:

   # dpkg -i dbeaver_ce-x.x.x_amd64.deb

   Para distribuciones derivadas de Red Hat el equivalente es:

   #  rpm -ivh dbeaver_ce-x.x.x_amd64.rpm

La verdad es que se instala casi de forma instantánea y es un programa muy ligero. No te defrauda ni su logo oficial.

SaluDOS

miércoles, 3 de febrero de 2021

Instalar openVAS con docker

OpenVAS es una suite que permite realizar el escaneado y la gestión vulnerabilidades.

Está claro que podemos tenerlo integrado en una distribución tipo Kali Linux para realizar trabajos de auditorias de seguridad o utilizarlo desde un gestor de eventos de seguridad (SIEM) como OSSIM.

Pero... ¿Qué tal si lo instalamos y utilizamos desde un docker?

Parece una idea atractiva, podemos desplegarlo, utilizarlo, eliminarlo en cualquier momento sin entrar a instalaciones o parametrizaciones complicadas.

El docker que vamos a utilizar y que yo he probado está en:

    https://hub.docker.com/r/atomicorp/openvas

Para correr el docker de openVAS, tendremos que especificar los siguientes parámetros:

   -d --> Para ponerlo en segundo plano (dettach)

   -p 443:443 --> Puerto 443 en el docker y el correspondiente en nuestro equipo

   --name openvas --> Nombre del docker

Desplegar este docker es así de sencillo, solo con este comando:

   # docker run -d -p 443:443 --name openvas atomicorp/openvas

Si queremos actualizar las Network Vulnerability Tests (NVT), es decir, las pruebas de vulnerabilidades de red, podríamos lanzar:

   # docker run -d -p 443:443 -e OV_UPDATE=yes --name openvas atomicorp/openvas

Una vez que lo tengamos corriendo, solo hay que ir a un navegador e introducir la dirección web que nos conectaría a este servicio:

   https://localhost

Obviamente hay que asegurarse de que el puerto 443 está libre, si no siempre podemos elegir otro.

DOCKER-COMPOSE

El fichero docker-compose.yml deberá contener:

   version: '3.3' 

   services: 

      openvas: 

         ports: 

            - '443:443' 

         environment: 

            - OV_UPDATE=yes 

         container_name: openvas 

         image: atomicorp/openvas

SaluDOS

Análisis de los errores y logs de un sistema Linux

Cuando hay un problema en un servidor tenemos que tener un procedimiento que nos permita realizar un análisis exhaustivo de forma ordenada y sencilla.

Como ya vimos en una entrada anterior los logs se almacenan en: /var/log

Está claro que ahí tendremos que realizar un recorrido según el problema del que se trate, pero quizás sea interesante empezar por otro lado para coger perspectiva. Veamos algunos comandos que son útiles cuando analizas un sistema y comencemos por analizar a los usuarios, quien está conectado, su historial de conexión, etcétera. Dependiendo de la distribución, quizás sea necesario instalar algún paquete. Si la idea te gusta dejatelo ya instalado previamente por si un día tienes que analizar el sistema.

USUARIOS E INICIO DE SESIÓN

Obtengamos un listado de todos los usuarios del sistema:

   # cat /etc/passwd

Para saber quien está conectado actualmente:

   # who -a

Si queremos ver el historial de los inicios de sesión podemos ejecutar el comando:

   # last -a


Para ver el último inicio de sesión de los usuarios en el sistema:

   # lastlog

Para ver el último reinicio del sistema:

   # last reboot


CPU, MEMORIA, PROCESOS Y RED

Veamos un listado de los procesos del sistema, par ver uso de CPU, memoria, tamaños de cache, procesos con PID, usuarios, etcétera:

   # top

Si este comando te gusta, prueba a instalar htop, tiene caracteristicas y un interfaz mas trabajado.

   # htop

Listado de ficheros abiertos actualmente:

   # lsof

Sobre la red, puertos y paquetes de entrada y salida:

   # netstat -a

En cuanto a los procesos de entrada y salida en disco, podemos ejecutar:

   # iotop

Si quieres obtener estadisticas de utilización del ancho de banda de la red:

   # iftop

Obviamente si necesitamos tener visibilidad y exactitud sobre todo lo que pasa a nivel de paquetes en la red...wireshark es tu aliado, pero eso es otro cantar.

HARDWARE, DISCO DURO Y ESPACIO

Tabla de particiones:

   # fdisk -l

Listado de puntos de montaje con el comando mount:

   # mount -l

Listado de puntos de montaje, sistemas de archivos y su uso:

   # df -aTh

Interesante echar un vistazo a fstab:

   # cat /etc/fstab

NAVEGADOR DE LOGS

Y por último, cuando acabas en el directorio de logs y te enfrentas a tanto archivo, la forma tradicional era hacer un cat o tail por ejemplo:

   # cat /var/log/syslog

Podemos añadir filtros con grep y ver por ejemplo todo lo que contenga la palabra Network:

   # cat /var/log/syslog | grep Network

Con Tail podemos ir mas allá y mantener el fichero abierto y ver en tiempo real que pasa en el log:

   # tail -f /var/log/syslog

Otra herramienta utilizada ultimamente era journalctl del systemd, una herramienta que podemos instalar y utilizar.

Pero un programa muy interesante para tener una perspectiva global de los logs del sistema es lnav. Y creo que combina muy bien todo lo que nos puede ofrecer tail

Dependiendo del sistema debemos instalarlo:

   En distribuciones derivadas de Debian:

      # apt install lnav

   En distribuciones derivadas de Red Hat:

      # yum install epel-release

      # yum install lnav

Al lanzarlo sin especificar el archivo log que quieres consultar, verás como ha navegado en todos los logs del sistema y te presenta un resumen exhaustivo de todo lo que ha pasado, y lo mas importante, de todo lo que está pasando en vivo y en directo.

   # lnav 

Siempre puedes analizar solo una parte de los logs, por ejemplo:

   # lnav /var/log/syslog

O podemos centrarnos en syslog pero para todos los archivos de la rotación de logs:

   # lnav /var/log/syslog*

Lo bueno es que realiza resaltado de sintaxis y esto ayuda mucho a un repaso visual rápido.

Otro punto fuerte es que permite realizar búsquedas como las que realizarías en un vim, por poner un ejemplo cercano en el mundo de la consola. En este ejemplo resaltaría todo lo que contenga la palabra especificada:

   /Network

Nada mas poner el cáracter / lnav muestra una pequeña ayuda en la sintaxis:

   Syntax Help  ::
       .   Any character     a|b  a or b         ^       Start of string
       \w  Word character    a?   0 or 1 a's     $       End of string
       \d  Digit             a*   0 or more a's  (...)   Capture
       \   Escape character  a+   1 or more a's  [ab-d]  Any of a, b, c, or d
   Examples
     abc* matches 'ab', 'abc', 'abccc'
     key=(\w+) matches key=123, key=abc and captures 123 and abc
     \[abc\] matches '[abc]'

Incluso realiza una previsualización en la que puedes ver algunos resultados y como quedaría la búsqueda.

Pero lnav va mucho mas allá, permite realizar búsquedas sql. En la página oficial podemos consultar como hacer esa extracción de datos aquí. Tenemos que comenzar con el carácter ; para entrar en el modo búsqueda. Cuando introducimos el cáracter ; directamente nos muestra una pequeña ayuda:

   Query Help   ::
       SELECT  Select rows from a table       DELETE  Delete rows from a table
       INSERT  Insert rows into a table       UPDATE  Update rows in a table
       CREATE  Create a table/index           DROP    Drop a table/index
       ATTACH  Attach a SQLite database file  DETACH  Detach a SQLite database
   Examples
       SELECT * FROM syslog_log WHERE log_level >= 'warning' LIMIT 10
       UPDATE syslog_log SET log_mark = 1 WHERE log_line = log_top_line()
       SELECT * FROM logline LIMIT 10

Para ver las tablas y campos que podemos consultar debemos lanzar el siguiente comando:

    ;.schema

Ahí veremos todas las tablas virtuales que se generan y los campos a los que podríamos acudir para filtrar la búsqueda.

Por poner algún ejemplo útil, podríamos hacer una consulta sencilla tal y como marca la documentación oficial para ver el resultado:

    ;select * from logline

Herramienta sencilla, fácil de implementar, utilizar y con muchas posibilidades para consultar los logs del sistema.

SaluDOS