68
.env.example
Archivo normal
68
.env.example
Archivo normal
@@ -0,0 +1,68 @@
|
||||
# Archivo de variables de entorno para CSF Web Admin Panel
|
||||
# Copie este archivo a .env y modifique los valores según sea necesario
|
||||
|
||||
# ====== SEGURIDAD ======
|
||||
# Clave secreta para JWT (CAMBIAR EN PRODUCCIÓN)
|
||||
JWT_SECRET=csf-web-super-secret-key-change-this-in-production
|
||||
|
||||
# Credenciales de administrador por defecto
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=admin123
|
||||
|
||||
# ====== CONFIGURACIÓN WEB ======
|
||||
# Puerto para la interfaz web
|
||||
WEB_PORT=3000
|
||||
|
||||
# Dominio/hostname para la aplicación
|
||||
WEB_HOSTNAME=localhost
|
||||
|
||||
# Modo de entorno
|
||||
NODE_ENV=production
|
||||
|
||||
# ====== CONFIGURACIÓN CSF ======
|
||||
# Rutas de configuración CSF
|
||||
CSF_CONFIG_PATH=/etc/csf
|
||||
CSF_LOG_PATH=/var/log/lfd
|
||||
CSF_BIN_PATH=/usr/local/csf/bin
|
||||
|
||||
# Configuración de red CSF
|
||||
CSF_TCP_IN=22,80,443,3000
|
||||
CSF_TCP_OUT=22,25,53,80,113,443,587,993,995
|
||||
CSF_UDP_IN=53
|
||||
CSF_UDP_OUT=53,113,123
|
||||
|
||||
# ====== DOCKER ======
|
||||
# Red Docker personalizada
|
||||
DOCKER_NETWORK=172.20.0.0/24
|
||||
|
||||
# Timezone
|
||||
TZ=America/Mexico_City
|
||||
|
||||
# ====== LOGGING ======
|
||||
# Nivel de logging
|
||||
LOG_LEVEL=info
|
||||
|
||||
# Rotación de logs
|
||||
LOG_MAX_SIZE=100M
|
||||
LOG_MAX_FILES=5
|
||||
|
||||
# ====== MONITOREO ======
|
||||
# Interval de actualización de estadísticas (segundos)
|
||||
STATS_UPDATE_INTERVAL=30
|
||||
|
||||
# Interval de actualización de logs (segundos)
|
||||
LOGS_UPDATE_INTERVAL=10
|
||||
|
||||
# ====== ALERTAS ======
|
||||
# Email para notificaciones (opcional)
|
||||
ALERT_EMAIL=admin@example.com
|
||||
|
||||
# Webhook URL para notificaciones (opcional)
|
||||
ALERT_WEBHOOK_URL=
|
||||
|
||||
# ====== BACKUP ======
|
||||
# Directorio para backups automáticos
|
||||
BACKUP_DIR=/backups
|
||||
|
||||
# Retención de backups (días)
|
||||
BACKUP_RETENTION_DAYS=30
|
||||
48
.gitignore
vendido
Archivo normal
48
.gitignore
vendido
Archivo normal
@@ -0,0 +1,48 @@
|
||||
# Ignorar archivos de dependencias
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Next.js
|
||||
.next/
|
||||
out/
|
||||
build/
|
||||
|
||||
# Variables de entorno
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Docker
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Archivos temporales
|
||||
.tmp/
|
||||
temp/
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Backups
|
||||
backups/
|
||||
*.backup
|
||||
|
||||
# Sistema
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Archivos de construcción
|
||||
dist/
|
||||
.cache/
|
||||
6
.gitmodules
vendido
Archivo normal
6
.gitmodules
vendido
Archivo normal
@@ -0,0 +1,6 @@
|
||||
[submodule "csf-web"]
|
||||
path = csf-web
|
||||
url = https://git.manalejandro.com/ale/csf-web.git
|
||||
[submodule "scripts"]
|
||||
path = scripts
|
||||
url = https://github.com/waytotheweb/scripts
|
||||
91
CHANGELOG.md
Archivo normal
91
CHANGELOG.md
Archivo normal
@@ -0,0 +1,91 @@
|
||||
# Changelog
|
||||
|
||||
Todos los cambios notables de este proyecto serán documentados en este archivo.
|
||||
|
||||
El formato está basado en [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [1.0.0] - 2025-09-20
|
||||
|
||||
### Agregado
|
||||
- Panel de administración web completo para CSF
|
||||
- Autenticación segura con JWT
|
||||
- Dashboard en tiempo real con WebSockets
|
||||
- Gestión completa de reglas de firewall (allow/deny/temporal)
|
||||
- Visualización de logs del sistema y firewall
|
||||
- Estadísticas del servidor en tiempo real
|
||||
- Dockerfiles para CSF y aplicación web
|
||||
- Docker Compose para orquestación
|
||||
- Script de despliegue automatizado
|
||||
- API REST completa para interactuar con CSF
|
||||
- Interfaz responsive con Tailwind CSS
|
||||
- Sistema de notificaciones y alertas
|
||||
- Monitoreo de conexiones activas
|
||||
- Backup y restauración de configuraciones
|
||||
|
||||
### Características Principales
|
||||
- **Framework**: Next.js 15 con App Router
|
||||
- **UI**: React 19 + Tailwind CSS
|
||||
- **Backend**: API Routes con Node.js
|
||||
- **Base de Datos**: Archivos de configuración CSF nativos
|
||||
- **Tiempo Real**: Socket.IO para actualizaciones en vivo
|
||||
- **Autenticación**: JWT con cookies httpOnly
|
||||
- **Containerización**: Docker + Docker Compose
|
||||
- **Monitoreo**: Logs, métricas y estadísticas del sistema
|
||||
|
||||
### Seguridad
|
||||
- Autenticación por defecto (admin/admin123)
|
||||
- Headers de seguridad configurados
|
||||
- Validación de entrada en todas las APIs
|
||||
- Acceso restringido a comandos del sistema
|
||||
- Logs de auditoría completos
|
||||
|
||||
### Docker
|
||||
- Contenedor CSF optimizado para producción
|
||||
- Contenedor web con Next.js standalone
|
||||
- Networking seguro entre contenedores
|
||||
- Volúmenes persistentes para configuraciones
|
||||
- Healthchecks para ambos servicios
|
||||
|
||||
### APIs Implementadas
|
||||
- `/api/auth` - Autenticación de usuarios
|
||||
- `/api/csf` - Control del firewall CSF
|
||||
- `/api/rules` - Gestión de reglas
|
||||
- `/api/logs` - Acceso a logs del sistema
|
||||
- `/api/stats` - Estadísticas del servidor
|
||||
- `/api/config` - Configuración de CSF
|
||||
- `/api/socket` - WebSocket para tiempo real
|
||||
|
||||
### Componentes UI
|
||||
- Dashboard principal con navegación por pestañas
|
||||
- Tarjeta de estado del firewall con controles
|
||||
- Tabla de reglas con búsqueda y filtros
|
||||
- Visor de logs con expansión de detalles
|
||||
- Gráficos de estadísticas del sistema
|
||||
- Formularios de login y gestión de reglas
|
||||
- Indicadores de conexión en tiempo real
|
||||
|
||||
### Notas de Seguridad
|
||||
⚠️ **IMPORTANTE**:
|
||||
- Cambiar credenciales por defecto antes de usar en producción
|
||||
- Configurar HTTPS para acceso externo
|
||||
- Revisar configuraciones de firewall antes del despliegue
|
||||
- Hacer backup de configuraciones existentes
|
||||
|
||||
### Instalación
|
||||
```bash
|
||||
# Clonar proyecto
|
||||
git clone [repository-url]
|
||||
cd csf-web-admin
|
||||
|
||||
# Configurar entorno
|
||||
cp .env.example .env
|
||||
|
||||
# Desplegar
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
### Acceso
|
||||
- URL: http://localhost:3000
|
||||
- Usuario: admin
|
||||
- Contraseña: admin123
|
||||
99
Dockerfile.csf
Archivo normal
99
Dockerfile.csf
Archivo normal
@@ -0,0 +1,99 @@
|
||||
# Dockerfile para CSF (ConfigServer Security & Firewall)
|
||||
FROM ubuntu:22.04
|
||||
|
||||
# Evitar prompts interactivos durante la instalación
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Instalar dependencias del sistema
|
||||
RUN apt-get update && apt-get install -y \
|
||||
perl \
|
||||
wget \
|
||||
curl \
|
||||
unzip \
|
||||
iptables \
|
||||
ip6tables \
|
||||
ipset \
|
||||
fail2ban \
|
||||
logrotate \
|
||||
rsyslog \
|
||||
cron \
|
||||
nano \
|
||||
net-tools \
|
||||
procps \
|
||||
iproute2 \
|
||||
dnsutils \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Crear directorios necesarios
|
||||
RUN mkdir -p /usr/local/csf \
|
||||
&& mkdir -p /etc/csf \
|
||||
&& mkdir -p /var/lib/csf \
|
||||
&& mkdir -p /var/log/lfd
|
||||
|
||||
# Copiar archivos CSF desde el directorio local
|
||||
COPY scripts/csf/ /tmp/csf/
|
||||
|
||||
# Instalar CSF
|
||||
RUN cd /tmp/csf && \
|
||||
cp -r * /usr/local/csf/ && \
|
||||
chmod +x /usr/local/csf/bin/csf && \
|
||||
chmod +x /usr/local/csf/bin/lfd && \
|
||||
ln -sf /usr/local/csf/bin/csf /usr/local/bin/csf && \
|
||||
ln -sf /usr/local/csf/bin/lfd /usr/local/bin/lfd
|
||||
|
||||
# Copiar archivos de configuración
|
||||
RUN cp /usr/local/csf/csf.conf /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.allow /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.deny /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.ignore /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.pignore /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.fignore /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.blocklists /etc/csf/ && \
|
||||
cp /usr/local/csf/csf.logfiles /etc/csf/
|
||||
|
||||
# Configurar CSF para producción en contenedor
|
||||
RUN sed -i 's/TESTING = "1"/TESTING = "0"/' /etc/csf/csf.conf && \
|
||||
sed -i 's/RESTRICT_SYSLOG = "0"/RESTRICT_SYSLOG = "3"/' /etc/csf/csf.conf && \
|
||||
sed -i 's/AUTO_UPDATES = "1"/AUTO_UPDATES = "0"/' /etc/csf/csf.conf && \
|
||||
sed -i 's/LF_DAEMON = "1"/LF_DAEMON = "0"/' /etc/csf/csf.conf
|
||||
|
||||
# Configurar puertos básicos
|
||||
RUN echo 'TCP_IN = "22,80,443,3000"' >> /etc/csf/csf.conf && \
|
||||
echo 'TCP_OUT = "22,25,53,80,113,443,587,993,995"' >> /etc/csf/csf.conf && \
|
||||
echo 'UDP_IN = "53"' >> /etc/csf/csf.conf && \
|
||||
echo 'UDP_OUT = "53,113,123"' >> /etc/csf/csf.conf
|
||||
|
||||
# Permitir acceso desde la red de Docker
|
||||
RUN echo '172.16.0.0/12 # Docker network' >> /etc/csf/csf.allow && \
|
||||
echo '192.168.0.0/16 # Private network' >> /etc/csf/csf.allow && \
|
||||
echo '10.0.0.0/8 # Private network' >> /etc/csf/csf.allow
|
||||
|
||||
# Configurar rsyslog para contenedor
|
||||
RUN sed -i 's/#module(load="imudp")/module(load="imudp")/' /etc/rsyslog.conf && \
|
||||
sed -i 's/#input(type="imudp" port="514")/input(type="imudp" port="514")/' /etc/rsyslog.conf
|
||||
|
||||
# Crear script de inicio
|
||||
COPY docker/csf-start.sh /usr/local/bin/csf-start.sh
|
||||
RUN chmod +x /usr/local/bin/csf-start.sh
|
||||
|
||||
# Script de entrypoint
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
# Exponer puertos
|
||||
EXPOSE 22 80 443 3000
|
||||
|
||||
# Variables de entorno
|
||||
ENV CSF_CONFIG_PATH=/etc/csf
|
||||
ENV CSF_LOG_PATH=/var/log/lfd
|
||||
|
||||
# Volúmenes para persistencia
|
||||
VOLUME ["/etc/csf", "/var/log/lfd", "/var/lib/csf"]
|
||||
|
||||
# Healthcheck
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD /usr/local/csf/bin/csf --status > /dev/null 2>&1 || exit 1
|
||||
|
||||
# Punto de entrada
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
CMD ["csf"]
|
||||
55
Dockerfile.web
Archivo normal
55
Dockerfile.web
Archivo normal
@@ -0,0 +1,55 @@
|
||||
# Dockerfile para CSF Web Interface (Next.js)
|
||||
FROM node:18-alpine AS base
|
||||
|
||||
# Instalar dependencias necesarias
|
||||
RUN apk add --no-cache libc6-compat
|
||||
|
||||
# Establecer directorio de trabajo
|
||||
WORKDIR /app
|
||||
|
||||
# Instalar dependencias
|
||||
FROM base AS deps
|
||||
COPY csf-web/package.json csf-web/package-lock.json* ./
|
||||
RUN npm ci --legacy-peer-deps
|
||||
|
||||
# Construir la aplicación
|
||||
FROM base AS builder
|
||||
WORKDIR /app
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY csf-web/ .
|
||||
|
||||
# Generar build de producción
|
||||
RUN npm run build
|
||||
|
||||
# Imagen de producción
|
||||
FROM base AS runner
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV=production
|
||||
|
||||
# Crear usuario no-root
|
||||
RUN addgroup --system --gid 1001 nodejs
|
||||
RUN adduser --system --uid 1001 nextjs
|
||||
|
||||
# Copiar archivos necesarios
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
# Variables de entorno
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME="0.0.0.0"
|
||||
ENV JWT_SECRET="csf-web-jwt-secret-change-in-production"
|
||||
|
||||
# Exponer puerto
|
||||
EXPOSE 3000
|
||||
|
||||
# Cambiar a usuario no-root
|
||||
USER nextjs
|
||||
|
||||
# Healthcheck
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:3000/api/health || exit 1
|
||||
|
||||
# Comando de inicio
|
||||
CMD ["node", "server.js"]
|
||||
43
LICENSE
Archivo normal
43
LICENSE
Archivo normal
@@ -0,0 +1,43 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We use the GNU General Public License for
|
||||
most of our software; it applies also to any other work released this way
|
||||
by its authors. You can apply it to your programs, too.
|
||||
|
||||
[Full GPL v3 license text would continue here...]
|
||||
|
||||
---
|
||||
|
||||
CSF Web Admin Panel
|
||||
Copyright (C) 2025
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
ConfigServer Security & Firewall (CSF) is copyright © ConfigServer Services
|
||||
and is licensed under their own terms. This project provides a web interface
|
||||
for CSF and does not modify or redistribute CSF itself.
|
||||
295
README.md
Archivo normal
295
README.md
Archivo normal
@@ -0,0 +1,295 @@
|
||||
# CSF Web Admin Panel
|
||||
|
||||
Panel de administración web moderno para **ConfigServer Security & Firewall (CSF)** construido con Next.js 15 y Docker.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## 🚀 Características
|
||||
|
||||
- **Panel de Control Moderno**: Interfaz web responsive y moderna
|
||||
- **Gestión Completa de CSF**: Control total del firewall desde el navegador
|
||||
- **Monitoreo en Tiempo Real**: WebSockets para estadísticas y logs en vivo
|
||||
- **Autenticación Segura**: Sistema de login con JWT
|
||||
- **Gestión de Reglas**: Agregar, eliminar y gestionar reglas de firewall
|
||||
- **Visualización de Logs**: Monitoreo de actividad del firewall
|
||||
- **Estadísticas del Sistema**: CPU, memoria, disco y red
|
||||
- **Dockerizado**: Despliegue fácil con Docker y Docker Compose
|
||||
|
||||
## 📋 Requisitos Previos
|
||||
|
||||
- Docker 20.10 o superior
|
||||
- Docker Compose 2.0 o superior
|
||||
- 2GB RAM mínimo
|
||||
- Acceso root/privilegiado para iptables
|
||||
|
||||
## 🛠️ Instalación Rápida
|
||||
|
||||
1. **Clonar el repositorio**:
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd csf-web-admin
|
||||
```
|
||||
|
||||
2. **Configurar variables de entorno**:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Editar .env con sus configuraciones
|
||||
```
|
||||
|
||||
3. **Desplegar con un comando**:
|
||||
```bash
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
4. **Acceder al panel**:
|
||||
- URL: http://localhost:3000
|
||||
- Usuario: `admin`
|
||||
- Contraseña: `admin123`
|
||||
|
||||
## 🐳 Despliegue Manual con Docker
|
||||
|
||||
### Construcción de Imágenes
|
||||
|
||||
```bash
|
||||
# Construir imagen CSF
|
||||
docker build -f Dockerfile.csf -t csf-firewall .
|
||||
|
||||
# Construir imagen Web
|
||||
docker build -f Dockerfile.web -t csf-web .
|
||||
```
|
||||
|
||||
### Ejecutar con Docker Compose
|
||||
|
||||
```bash
|
||||
# Iniciar servicios
|
||||
docker-compose up -d
|
||||
|
||||
# Ver logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Detener servicios
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
## 📁 Estructura del Proyecto
|
||||
|
||||
```
|
||||
csf-web-admin/
|
||||
├── 📁 csf-web/ # Aplicación Next.js
|
||||
│ ├── 📁 src/
|
||||
│ │ ├── 📁 app/ # App Router (Next.js 15)
|
||||
│ │ ├── 📁 components/ # Componentes React
|
||||
│ │ ├── 📁 hooks/ # Hooks personalizados
|
||||
│ │ ├── 📁 lib/ # Utilidades
|
||||
│ │ ├── 📁 store/ # Estado global (Zustand)
|
||||
│ │ └── 📁 types/ # Tipos TypeScript
|
||||
│ ├── 📄 package.json
|
||||
│ └── 📄 next.config.mjs
|
||||
├── 📁 scripts/ # Scripts CSF originales
|
||||
│ └── 📁 csf/ # Código fuente CSF
|
||||
├── 📁 docker/ # Scripts Docker
|
||||
│ ├── 📄 entrypoint.sh
|
||||
│ └── 📄 csf-start.sh
|
||||
├── 📄 Dockerfile.csf # Dockerfile para CSF
|
||||
├── 📄 Dockerfile.web # Dockerfile para Web
|
||||
├── 📄 docker-compose.yml # Orquestación
|
||||
├── 📄 deploy.sh # Script de despliegue
|
||||
├── 📄 .env.example # Variables de entorno
|
||||
└── 📄 README.md
|
||||
```
|
||||
|
||||
## 🎛️ Características del Panel
|
||||
|
||||
### Dashboard Principal
|
||||
- Estado del firewall en tiempo real
|
||||
- Estadísticas del sistema (CPU, RAM, Disco)
|
||||
- Conexiones activas
|
||||
- Resumen de reglas
|
||||
|
||||
### Gestión de Reglas
|
||||
- Agregar/eliminar reglas allow/deny
|
||||
- Búsqueda y filtrado de reglas
|
||||
- Gestión de bloqueos temporales
|
||||
- Validación de direcciones IP
|
||||
|
||||
### Monitoreo de Logs
|
||||
- Logs en tiempo real
|
||||
- Filtrado por tipo y nivel
|
||||
- Exportación de logs
|
||||
- Análisis de patrones de ataque
|
||||
|
||||
### Configuración
|
||||
- Modificación de configuraciones CSF
|
||||
- Gestión de puertos TCP/UDP
|
||||
- Configuración de alertas
|
||||
- Backup y restauración
|
||||
|
||||
## 🔧 Configuración
|
||||
|
||||
### Variables de Entorno Principales
|
||||
|
||||
```bash
|
||||
# Seguridad
|
||||
JWT_SECRET=tu-clave-secreta-aqui
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=contraseña-segura
|
||||
|
||||
# Red
|
||||
WEB_PORT=3000
|
||||
CSF_TCP_IN=22,80,443,3000
|
||||
CSF_TCP_OUT=22,25,53,80,113,443,587,993,995
|
||||
|
||||
# Paths
|
||||
CSF_CONFIG_PATH=/etc/csf
|
||||
CSF_LOG_PATH=/var/log/lfd
|
||||
```
|
||||
|
||||
### Configuración de CSF
|
||||
|
||||
El contenedor CSF se configura automáticamente con:
|
||||
- Modo de prueba deshabilitado
|
||||
- Acceso permitido desde redes Docker
|
||||
- Logs habilitados
|
||||
- Auto-updates deshabilitado
|
||||
|
||||
## 📊 API Endpoints
|
||||
|
||||
### Autenticación
|
||||
- `POST /api/auth` - Login
|
||||
- `GET /api/auth` - Verificar sesión
|
||||
- `DELETE /api/auth` - Logout
|
||||
|
||||
### Control CSF
|
||||
- `GET /api/csf?action=status` - Estado del firewall
|
||||
- `POST /api/csf` - Ejecutar comandos (start, stop, restart)
|
||||
|
||||
### Reglas
|
||||
- `GET /api/rules?type=all` - Obtener reglas
|
||||
- `POST /api/rules` - Agregar regla
|
||||
- `DELETE /api/rules` - Eliminar regla
|
||||
|
||||
### Logs y Estadísticas
|
||||
- `GET /api/logs?type=firewall` - Logs del firewall
|
||||
- `GET /api/stats` - Estadísticas del sistema
|
||||
|
||||
### WebSocket
|
||||
- `/api/socket` - Datos en tiempo real
|
||||
|
||||
## 🔒 Seguridad
|
||||
|
||||
### Autenticación
|
||||
- JWT con cookies httpOnly
|
||||
- Protección CSRF
|
||||
- Validación de permisos
|
||||
|
||||
### Red
|
||||
- Comunicación interna entre contenedores
|
||||
- Headers de seguridad configurados
|
||||
- Acceso restringido a APIs
|
||||
|
||||
### Firewall
|
||||
- Configuración segura por defecto
|
||||
- Backup automático de configuraciones
|
||||
- Logs de auditoría completos
|
||||
|
||||
## 🚨 Resolución de Problemas
|
||||
|
||||
### Contenedor CSF no inicia
|
||||
```bash
|
||||
# Verificar privilegios
|
||||
docker-compose logs csf
|
||||
|
||||
# Verificar capacidades
|
||||
docker run --rm --privileged csf-firewall csf --check
|
||||
```
|
||||
|
||||
### Web interface no conecta
|
||||
```bash
|
||||
# Verificar logs
|
||||
docker-compose logs csf-web
|
||||
|
||||
# Verificar conectividad
|
||||
curl http://localhost:3000/api/health
|
||||
```
|
||||
|
||||
### Problemas de iptables
|
||||
```bash
|
||||
# Verificar módulos del kernel
|
||||
lsmod | grep ip_tables
|
||||
|
||||
# Verificar capacidades del contenedor
|
||||
docker inspect csf-firewall | grep -i cap
|
||||
```
|
||||
|
||||
## 📈 Monitoreo y Logs
|
||||
|
||||
### Logs del Sistema
|
||||
```bash
|
||||
# Logs de CSF
|
||||
docker-compose exec csf tail -f /var/log/lfd/lfd.log
|
||||
|
||||
# Logs de la web
|
||||
docker-compose logs -f csf-web
|
||||
|
||||
# Logs combinados
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### Métricas
|
||||
- CPU y memoria en tiempo real
|
||||
- Conexiones de red activas
|
||||
- Estadísticas de reglas de firewall
|
||||
- Actividad de bloqueos
|
||||
|
||||
## 🔄 Backup y Restauración
|
||||
|
||||
### Crear Backup
|
||||
```bash
|
||||
./deploy.sh backup
|
||||
```
|
||||
|
||||
### Restaurar Configuración
|
||||
```bash
|
||||
# Restaurar volúmenes desde backup
|
||||
docker run --rm -v csf_config:/target -v $(pwd)/backups/latest:/source alpine cp -a /source/. /target/
|
||||
```
|
||||
|
||||
## 🛡️ Mejores Prácticas
|
||||
|
||||
1. **Cambiar credenciales por defecto**
|
||||
2. **Usar HTTPS en producción**
|
||||
3. **Configurar backup automático**
|
||||
4. **Monitorear logs regularmente**
|
||||
5. **Actualizar contenedores periódicamente**
|
||||
6. **Restringir acceso de red**
|
||||
|
||||
## 🤝 Contribuir
|
||||
|
||||
1. Fork el proyecto
|
||||
2. Crear rama feature (`git checkout -b feature/AmazingFeature`)
|
||||
3. Commit cambios (`git commit -m 'Add AmazingFeature'`)
|
||||
4. Push a la rama (`git push origin feature/AmazingFeature`)
|
||||
5. Abrir Pull Request
|
||||
|
||||
## 📝 Licencia
|
||||
|
||||
Este proyecto está bajo la Licencia GPL v3. Ver `LICENSE` para más detalles.
|
||||
|
||||
## 🙏 Reconocimientos
|
||||
|
||||
- [ConfigServer Services](https://configserver.com/) por CSF
|
||||
- [Next.js](https://nextjs.org/) por el framework web
|
||||
- [Docker](https://docker.com/) por la containerización
|
||||
|
||||
## 📞 Soporte
|
||||
|
||||
- 🐛 [Reportar Bug](../../issues)
|
||||
- 💡 [Solicitar Feature](../../issues)
|
||||
- 📧 Email: support@example.com
|
||||
|
||||
---
|
||||
|
||||
**⚠️ IMPORTANTE**: Este es un sistema de seguridad crítico. Siempre pruebe en un entorno de desarrollo antes de desplegar en producción.
|
||||
1
csf-web
Submódulo
1
csf-web
Submódulo
Submodule csf-web added at b1ff5c9cde
225
deploy.sh
Archivo ejecutable
225
deploy.sh
Archivo ejecutable
@@ -0,0 +1,225 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de despliegue para CSF Web Admin Panel
|
||||
|
||||
set -e
|
||||
|
||||
# Colores para output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Función para logs
|
||||
log() {
|
||||
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
|
||||
}
|
||||
|
||||
info() {
|
||||
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')] INFO: $1${NC}"
|
||||
}
|
||||
|
||||
# Banner
|
||||
echo "=================================================="
|
||||
echo " CSF Web Admin Panel - Deployment Script"
|
||||
echo " ConfigServer Security & Firewall Management"
|
||||
echo "=================================================="
|
||||
echo
|
||||
|
||||
# Verificar requisitos previos
|
||||
log "Verificando requisitos previos..."
|
||||
|
||||
# Verificar Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
error "Docker no está instalado. Por favor instale Docker primero."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verificar Docker Compose
|
||||
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
|
||||
error "Docker Compose no está instalado. Por favor instale Docker Compose primero."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verificar que estamos en el directorio correcto
|
||||
if [ ! -f "docker-compose.yml" ]; then
|
||||
error "docker-compose.yml no encontrado. Ejecute este script desde el directorio raíz del proyecto."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verificar archivos CSF
|
||||
if [ ! -d "scripts/csf" ]; then
|
||||
error "Directorio scripts/csf no encontrado. Asegúrese de que los archivos CSF estén presentes."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "Requisitos previos verificados ✓"
|
||||
|
||||
# Configurar variables de entorno
|
||||
if [ ! -f ".env" ]; then
|
||||
warn "Archivo .env no encontrado. Creando desde .env.example..."
|
||||
if [ -f ".env.example" ]; then
|
||||
cp .env.example .env
|
||||
warn "Por favor edite el archivo .env con sus configuraciones antes de continuar."
|
||||
read -p "¿Desea continuar con la configuración por defecto? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
info "Edite el archivo .env y ejecute el script nuevamente."
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
error "Archivo .env.example no encontrado."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Cargar variables de entorno
|
||||
source .env
|
||||
|
||||
log "Variables de entorno cargadas ✓"
|
||||
|
||||
# Función para construir e iniciar servicios
|
||||
deploy() {
|
||||
log "Iniciando despliegue de CSF Web Admin Panel..."
|
||||
|
||||
# Detener servicios existentes
|
||||
info "Deteniendo servicios existentes..."
|
||||
docker-compose down --remove-orphans || true
|
||||
|
||||
# Construir imágenes
|
||||
log "Construyendo imágenes Docker..."
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Iniciar servicios
|
||||
log "Iniciando servicios..."
|
||||
docker-compose up -d
|
||||
|
||||
# Esperar a que los servicios estén listos
|
||||
log "Esperando a que los servicios estén listos..."
|
||||
sleep 30
|
||||
|
||||
# Verificar estado de los servicios
|
||||
info "Verificando estado de los servicios..."
|
||||
docker-compose ps
|
||||
|
||||
# Verificar salud de los servicios
|
||||
log "Verificando salud de los servicios..."
|
||||
|
||||
# Verificar CSF
|
||||
if docker-compose exec -T csf /usr/local/csf/bin/csf --status > /dev/null 2>&1; then
|
||||
log "CSF Firewall: SALUDABLE ✓"
|
||||
else
|
||||
warn "CSF Firewall: Posibles problemas"
|
||||
fi
|
||||
|
||||
# Verificar Web Interface
|
||||
if curl -f http://localhost:${WEB_PORT:-3000}/api/health > /dev/null 2>&1; then
|
||||
log "Web Interface: SALUDABLE ✓"
|
||||
else
|
||||
warn "Web Interface: Posibles problemas"
|
||||
fi
|
||||
|
||||
log "Despliegue completado!"
|
||||
echo
|
||||
info "Acceda al panel de administración en: http://localhost:${WEB_PORT:-3000}"
|
||||
info "Usuario por defecto: ${ADMIN_USERNAME:-admin}"
|
||||
info "Contraseña por defecto: ${ADMIN_PASSWORD:-admin123}"
|
||||
echo
|
||||
warn "IMPORTANTE: Cambie las credenciales por defecto antes de usar en producción."
|
||||
}
|
||||
|
||||
# Función para mostrar logs
|
||||
show_logs() {
|
||||
echo "Mostrando logs de los servicios..."
|
||||
docker-compose logs -f
|
||||
}
|
||||
|
||||
# Función para detener servicios
|
||||
stop() {
|
||||
log "Deteniendo servicios..."
|
||||
docker-compose down
|
||||
log "Servicios detenidos ✓"
|
||||
}
|
||||
|
||||
# Función para limpiar todo
|
||||
clean() {
|
||||
warn "Esta operación eliminará todos los contenedores, imágenes y volúmenes relacionados."
|
||||
read -p "¿Está seguro? (y/N): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
log "Limpiando sistema..."
|
||||
docker-compose down -v --remove-orphans
|
||||
docker system prune -f
|
||||
docker volume prune -f
|
||||
log "Limpieza completada ✓"
|
||||
else
|
||||
info "Operación cancelada."
|
||||
fi
|
||||
}
|
||||
|
||||
# Función para backup
|
||||
backup() {
|
||||
log "Creando backup de configuraciones..."
|
||||
BACKUP_DIR="${BACKUP_DIR:-./backups}/$(date +%Y%m%d_%H%M%S)"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# Backup de volúmenes Docker
|
||||
docker run --rm -v csf_config:/source -v "$PWD/$BACKUP_DIR":/backup alpine tar czf /backup/csf_config.tar.gz -C /source .
|
||||
docker run --rm -v csf_logs:/source -v "$PWD/$BACKUP_DIR":/backup alpine tar czf /backup/csf_logs.tar.gz -C /source .
|
||||
|
||||
# Backup de archivo .env
|
||||
cp .env "$BACKUP_DIR/"
|
||||
|
||||
log "Backup creado en: $BACKUP_DIR ✓"
|
||||
}
|
||||
|
||||
# Función de ayuda
|
||||
show_help() {
|
||||
echo "Uso: $0 [COMANDO]"
|
||||
echo
|
||||
echo "Comandos disponibles:"
|
||||
echo " deploy - Desplegar CSF Web Admin Panel"
|
||||
echo " logs - Mostrar logs de los servicios"
|
||||
echo " stop - Detener servicios"
|
||||
echo " clean - Limpiar contenedores y volúmenes"
|
||||
echo " backup - Crear backup de configuraciones"
|
||||
echo " help - Mostrar esta ayuda"
|
||||
echo
|
||||
echo "Si no se especifica comando, se ejecutará 'deploy'"
|
||||
}
|
||||
|
||||
# Procesar argumentos
|
||||
case "${1:-deploy}" in
|
||||
deploy)
|
||||
deploy
|
||||
;;
|
||||
logs)
|
||||
show_logs
|
||||
;;
|
||||
stop)
|
||||
stop
|
||||
;;
|
||||
clean)
|
||||
clean
|
||||
;;
|
||||
backup)
|
||||
backup
|
||||
;;
|
||||
help|--help|-h)
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
error "Comando desconocido: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
102
docker-compose.yml
Archivo normal
102
docker-compose.yml
Archivo normal
@@ -0,0 +1,102 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Contenedor CSF Firewall
|
||||
csf:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.csf
|
||||
container_name: csf-firewall
|
||||
privileged: true
|
||||
network_mode: host
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
# Configuración persistente
|
||||
- csf_config:/etc/csf
|
||||
- csf_logs:/var/log/lfd
|
||||
- csf_lib:/var/lib/csf
|
||||
# Acceso a logs del sistema host (opcional)
|
||||
- /var/log:/var/log/host:ro
|
||||
environment:
|
||||
- CSF_CONFIG_PATH=/etc/csf
|
||||
- CSF_LOG_PATH=/var/log/lfd
|
||||
- DEBIAN_FRONTEND=noninteractive
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
- SYS_MODULE
|
||||
- SYS_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun
|
||||
healthcheck:
|
||||
test: ["CMD", "/usr/local/csf/bin/csf", "--status"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
# Contenedor Web Interface
|
||||
csf-web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.web
|
||||
container_name: csf-web-interface
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3000:3000"
|
||||
volumes:
|
||||
# Acceso a archivos de configuración CSF
|
||||
- csf_config:/etc/csf:ro
|
||||
- csf_logs:/var/log/lfd:ro
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- PORT=3000
|
||||
- HOSTNAME=0.0.0.0
|
||||
- JWT_SECRET=${JWT_SECRET:-csf-web-secret-change-this}
|
||||
- CSF_CONFIG_PATH=/etc/csf
|
||||
- CSF_LOG_PATH=/var/log/lfd
|
||||
depends_on:
|
||||
csf:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- csf-network
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
# Servicio de monitoreo de logs (opcional)
|
||||
log-monitor:
|
||||
image: busybox
|
||||
container_name: csf-log-monitor
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- csf_logs:/logs:ro
|
||||
command: tail -f /logs/lfd.log
|
||||
depends_on:
|
||||
- csf
|
||||
networks:
|
||||
- csf-network
|
||||
|
||||
# Redes
|
||||
networks:
|
||||
csf-network:
|
||||
driver: bridge
|
||||
name: csf-network
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.20.0.0/24
|
||||
|
||||
# Volúmenes persistentes
|
||||
volumes:
|
||||
csf_config:
|
||||
name: csf_config
|
||||
driver: local
|
||||
csf_logs:
|
||||
name: csf_logs
|
||||
driver: local
|
||||
csf_lib:
|
||||
name: csf_lib
|
||||
driver: local
|
||||
56
docker/csf-start.sh
Archivo normal
56
docker/csf-start.sh
Archivo normal
@@ -0,0 +1,56 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de inicio para CSF en contenedor Docker
|
||||
|
||||
set -e
|
||||
|
||||
echo "Iniciando ConfigServer Security & Firewall (CSF)..."
|
||||
|
||||
# Verificar que los archivos de configuración existen
|
||||
if [ ! -f /etc/csf/csf.conf ]; then
|
||||
echo "Error: Archivo de configuración CSF no encontrado"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Crear directorios de log si no existen
|
||||
mkdir -p /var/log/lfd
|
||||
mkdir -p /var/lib/csf
|
||||
|
||||
# Verificar y corregir permisos
|
||||
chmod 600 /etc/csf/csf.conf
|
||||
chmod 600 /etc/csf/csf.allow
|
||||
chmod 600 /etc/csf/csf.deny
|
||||
chmod 755 /usr/local/csf/bin/csf
|
||||
chmod 755 /usr/local/csf/bin/lfd
|
||||
|
||||
# Inicializar iptables si es necesario
|
||||
if ! iptables -L > /dev/null 2>&1; then
|
||||
echo "Inicializando iptables..."
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -Z
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
iptables -t mangle -F
|
||||
iptables -t mangle -X
|
||||
fi
|
||||
|
||||
# Verificar configuración CSF
|
||||
echo "Verificando configuración CSF..."
|
||||
if ! /usr/local/csf/bin/csf --check; then
|
||||
echo "Advertencia: Verificación de CSF falló, continuando de todos modos..."
|
||||
fi
|
||||
|
||||
# Iniciar CSF
|
||||
echo "Iniciando CSF..."
|
||||
/usr/local/csf/bin/csf --start
|
||||
|
||||
# Verificar estado
|
||||
if /usr/local/csf/bin/csf --status > /dev/null 2>&1; then
|
||||
echo "CSF iniciado correctamente"
|
||||
else
|
||||
echo "Error: CSF no pudo iniciarse correctamente"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "CSF está ejecutándose"
|
||||
83
docker/entrypoint.sh
Archivo normal
83
docker/entrypoint.sh
Archivo normal
@@ -0,0 +1,83 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Entrypoint para el contenedor CSF
|
||||
|
||||
set -e
|
||||
|
||||
# Función para manejo de señales
|
||||
cleanup() {
|
||||
echo "Recibida señal de terminación..."
|
||||
|
||||
# Detener CSF de forma controlada
|
||||
if [ -x /usr/local/csf/bin/csf ]; then
|
||||
echo "Deteniendo CSF..."
|
||||
/usr/local/csf/bin/csf --stop || true
|
||||
fi
|
||||
|
||||
# Detener LFD si está ejecutándose
|
||||
if pidof lfd > /dev/null; then
|
||||
echo "Deteniendo LFD..."
|
||||
killall lfd || true
|
||||
fi
|
||||
|
||||
# Detener rsyslog
|
||||
if pidof rsyslogd > /dev/null; then
|
||||
echo "Deteniendo rsyslog..."
|
||||
killall rsyslogd || true
|
||||
fi
|
||||
|
||||
echo "Limpieza completada"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Configurar manejo de señales
|
||||
trap cleanup SIGTERM SIGINT
|
||||
|
||||
# Iniciar rsyslog en background
|
||||
echo "Iniciando rsyslog..."
|
||||
rsyslogd &
|
||||
|
||||
# Esperar un momento para que rsyslog se inicie
|
||||
sleep 2
|
||||
|
||||
# Verificar capacidades necesarias
|
||||
if [ ! -w /proc/sys/net/ipv4/ip_forward ]; then
|
||||
echo "Advertencia: No se pueden modificar configuraciones de red del kernel"
|
||||
echo "Asegúrese de ejecutar el contenedor con --privileged o las capacidades necesarias"
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
csf)
|
||||
echo "Iniciando CSF en modo contenedor..."
|
||||
|
||||
# Ejecutar script de inicio de CSF
|
||||
/usr/local/bin/csf-start.sh
|
||||
|
||||
# Mantener el contenedor ejecutándose
|
||||
echo "CSF iniciado. Manteniendo contenedor activo..."
|
||||
|
||||
# Loop infinito para mantener el contenedor vivo
|
||||
while true; do
|
||||
# Verificar cada 30 segundos que CSF sigue ejecutándose
|
||||
if ! /usr/local/csf/bin/csf --status > /dev/null 2>&1; then
|
||||
echo "CSF no está ejecutándose. Reintentando inicio..."
|
||||
/usr/local/bin/csf-start.sh || {
|
||||
echo "Error: No se pudo reiniciar CSF"
|
||||
cleanup
|
||||
exit 1
|
||||
}
|
||||
fi
|
||||
sleep 30
|
||||
done
|
||||
;;
|
||||
|
||||
bash|sh)
|
||||
echo "Iniciando shell interactivo..."
|
||||
exec /bin/bash
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Ejecutando comando personalizado: $@"
|
||||
exec "$@"
|
||||
;;
|
||||
esac
|
||||
1
scripts
Submódulo
1
scripts
Submódulo
Submodule scripts added at 2923c43f8f
Referencia en una nueva incidencia
Block a user