Despliegue de Componentes de JumpServer y Configuración de Nginx como Proxy Inverso

Instalación de Interfaces Lina y Luna

Para desplegar los componentes de interfaz de usuario y terminal web, utilizaremos variables de entorno para facilitar la gestión de versiones y directorios.

#!/bin/bash
JS_VERSION="v2.28.7"
BASE_DIR="/opt"

# Despliegue de Lina (Frontend)
cd ${BASE_DIR}
wget "https://github.com/jumpserver/lina/releases/download/${JS_VERSION}/lina-${JS_VERSION}.tar.gz"
tar -xzf "lina-${JS_VERSION}.tar.gz"

# Despliegue de Luna (Terminal Web)
wget "https://github.com/jumpserver/luna/releases/download/${JS_VERSION}/luna-${JS_VERSION}.tar.gz"
tar -xzf "luna-${JS_VERSION}.tar.gz"

Configuración del Conector SSH KoKo

KoKo es el componente encargado de las conexiones a activos Unix mediante SSH. Está desarrollado en Go, lo que le permite ofrecer un rendimiento superior y menor consumo de recursos en comparación con su predecesor basado en Python.

#!/bin/bash
JS_VERSION="v2.28.7"
KOKO_DIR="/opt/koko-${JS_VERSION}-linux-amd64"

# Instalación de herramientas auxiliares
cd /opt
wget https://download.jumpserver.org/public/kubectl-linux-amd64.tar.gz -O kubectl.tar.gz
tar -xf kubectl.tar.gz && mv kubectl /usr/local/bin/rawkubectl

wget https://download.jumpserver.org/public/helm-v3.9.0-linux-amd64.tar.gz
tar -xf helm-v3.9.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/rawhelm
rm -rf linux-amd64

# Ajuste de permisos
chmod 755 /usr/local/bin/raw{kubectl,helm}
chown root:root /usr/local/bin/raw{kubectl,helm}

# Descarga y extracción de KoKo
wget "https://github.com/jumpserver/koko/releases/download/${JS_VERSION}/koko-${JS_VERSION}-linux-amd64.tar.gz"
tar -xf "koko-${JS_VERSION}-linux-amd64.tar.gz" -C /opt
cd ${KOKO_DIR}
mv kubectl /usr/local/bin/kubectl

Ajustes de KoKo

Generamos el archivo de configuración a partir de la plantilla y ajustamos los parámetros de red y autenticación.

cp config_example.yml config.yml

# Identificador único del nodo
# NODE_NAME: {{ Hostname }}

# URL del servicio Core para registro y API
CORE_HOST: http://127.0.0.1:8080

# Token de inicialización (debe coincidir con el Core)
BOOTSTRAP_TOKEN: tu_token_secreto_aqui

# Configuración de red
BIND_HOST: 0.0.0.0
SSHD_PORT: 2222
HTTPD_PORT: 5000

# Nivel de detalle de los logs
LOG_LEVEL: ERROR

# Parámetros de conexión SSH
# SSH_TIMEOUT: 15
# CLIENT_ALIVE_INTERVAL: 30
# RETRY_ALIVE_COUNT_MAX: 3

# Configuración de SFTP
# SFTP_ROOT: /tmp
# SFTP_SHOW_HIDDEN_FILE: false

# Gestión de sesiones distribuidas (usar redis para múltiples nodos)
# SHARE_ROOM_TYPE: local
# REDIS_HOST: 127.0.0.1
# REDIS_PORT: 6379

Iniciamos el servicio en segundo plano:

./koko -d

Implementación del Conector RDP/VNC Lion

Lion gestiona los protocolos gráficos utilizando una implementación reconstruida de Apache Guacamole. Primero compilamos el servidor Guacd y luego desplegamos el binario de Lion.

Compilación de Guacd

#!/bin/bash
GUAC_DIR="/opt/guacamole-v2.28.7"
mkdir -p ${GUAC_DIR} && cd ${GUAC_DIR}

wget http://download.jumpserver.org/public/guacamole-server-1.4.0.tar.gz
tar -xzf guacamole-server-1.4.0.tar.gz
cd guacamole-server-1.4.0/

# Instalación de dependencias de compilación
yum install -y cairo-devel libjpeg-turbo-devel libpng-devel uuid-devel
yum install -y libavcodec-devel libavformat-devel libavutil-devel freerdp-devel libssh2-devel

# Configuración y compilación
./configure --with-init-dir=/etc/init.d
make -j$(nproc)
make install
ldconfig

Despliegue y Configuración de Lion

#!/bin/bash
JS_VERSION="v2.28.7"
cd /opt
wget "https://github.com/jumpserver/lion-release/releases/download/${JS_VERSION}/lion-${JS_VERSION}-linux-amd64.tar.gz"
tar -xf "lion-${JS_VERSION}-linux-amd64.tar.gz"
cd "lion-${JS_VERSION}-linux-amd64"
cp config_example.yml config.yml

Contenido del archivo config.yml de Lion:

# URL del núcleo de JumpServer
CORE_HOST: http://127.0.0.1:8080

# Token de registro
BOOTSTRAP_TOKEN: tu_token_secreto_aqui

# Parámetros de escucha
BIND_HOST: 0.0.0.0
HTTPD_PORT: 8081

# Nivel de logging
LOG_LEVEL: ERROR

# Conexión al servidor Guacamole local
# GUA_HOST: 127.0.0.1
# GUA_PORT: 4822

Iniciamos ambos servicios:

/etc/init.d/guacd start
./lion

Despliegue del Proxy de Bases de Datos Magnus

Magnus actúa como proxy para bases de datos relacionales, mientras que Wisp gestiona la comunicación gRPC con el núcleo.

#!/bin/bash
JS_VERSION="v2.28.7"
WISP_VERSION="v0.0.10"
MAGNUS_DIR="/opt/magnus-${JS_VERSION}-linux-amd64"

cd /opt
# Descarga de Magnus
wget "https://github.com/jumpserver/magnus-release/releases/download/${JS_VERSION}/magnus-${JS_VERSION}-linux-amd64.tar.gz"
tar -xf "magnus-${JS_VERSION}-linux-amd64.tar.gz"

# Descarga e instalación de Wisp
wget "https://github.com/jumpserver/wisp/releases/download/${WISP_VERSION}/wisp-${WISP_VERSION}-linux-amd64.tar.gz"
tar -xf "wisp-${WISP_VERSION}-linux-amd64.tar.gz"
mv "wisp-${WISP_VERSION}-linux-amd64/wisp" /usr/local/bin/

# Permisos
chown root:root /usr/local/bin/wisp ${MAGNUS_DIR}/magnus
chmod 755 /usr/local/bin/wisp ${MAGNUS_DIR}/magnus

cd ${MAGNUS_DIR}
cp config_example.yml config.yml

Configuración de Magnus (config.yml):

CORE_HOST: http://127.0.0.1:8080
BOOTSTRAP_TOKEN: tu_token_secreto_aqui
BIND_HOST: "0.0.0.0"

# Puertos de escucha para distintos motores de base de datos
MYSQL_PORT: 33060
MARIA_DB_PORT: 33061
POSTGRESQL_PORT: 54320

LOG_LEVEL: "info"

# Configuración del componente gRPC
WISP_HOST: "localhost"
WISP_PORT: 9090

Ejecución de Wisp con variables de entorno:

export CORE_HOST="http://127.0.0.1:8080"
export BOOTSTRAP_TOKEN="tu_token_secreto_aqui"
export WORK_DIR="/opt/magnus-v2.28.7-linux-amd64"
export COMPONENT_NAME="magnus"
export EXECUTE_PROGRAM="/opt/magnus-v2.28.7-linux-amd64/magnus"
wisp

Configuración de Nginx como Proxy Inverso

Para centralizar el acceso y gestionar el enurtamiento hacia los distintos microservicios, configuramos Nginx. Se utilizarán bloques upstream para mejorar la mantenibilidad de la configuración.

upstream backend_core {
    server 127.0.0.1:8080;
}
upstream backend_koko {
    server 127.0.0.1:5000;
}
upstream backend_lion {
    server 127.0.0.1:8081;
}
upstream backend_ws {
    server 127.0.0.1:8070;
}

server {
    listen 80;
    client_max_body_size 5000m;

    # Interfaz Lina
    location /ui/ {
        alias /opt/lina-v2.28.7/;
        try_files $uri $uri/ /ui/index.html;
        expires 24h;
    }

    # Interfaz Luna
    location /luna/ {
        alias /opt/luna-v2.28.7/;
        try_files $uri $uri/ /luna/index.html;
        expires 24h;
    }

    # Recursos estáticos y grabaciones
    location /media/replay/ {
        add_header Content-Encoding gzip;
        root /opt/jumpserver-v2.28.7/data/;
    }
    location ~ ^/(media|static)/ {
        root /opt/jumpserver-v2.28.7/data/;
        expires 24h;
    }

    # Proxy para KoKo (WebSocket y HTTP)
    location /koko/ {
        proxy_pass http://backend_koko;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
    }

    # Proxy para Lion (RDP/VNC)
    location /lion/ {
        proxy_pass http://backend_lion;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_ignore_client_abort on;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
    }

    # WebSocket del Core
    location /ws/ {
        proxy_pass http://backend_ws;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # API y rutas del Core
    location ~ ^/(api|core)/ {
        proxy_pass http://backend_core;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Redirección raíz
    location / {
        rewrite ^/(.*)$ /ui/$1 last;
    }
}

Resolución de Nombres Locales

Si los componentes se ejecutan en la misma máquina pero la configuración original requería resolución de nombres, actualizamos el archivo /etc/hosts:

127.0.0.1   localhost lina luna koko core lion magnus wisp
::1         localhost lina luna koko core lion magnus wisp

Validamos y recargamos la configuración de Nginx:

nginx -t && nginx -s reload

Acceso Inicial

Una vez que todos los servicios están operativos y el proxy inverso está activo, acceda a la inetrfaz web a través del puerto 80. Las credenciales por defecto son admin para el usuario y admin para la cnotraseña. El sistema solicitará un cambio de contraseña inmediato tras el primer inicio de sesión.

Etiquetas: JumpServer Nginx Guacamole ProxyInverso linux

Publicado el 6-8 02:26