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.