Compare commits
7 commits
86a617c101
...
03848f76fd
Author | SHA1 | Date | |
---|---|---|---|
03848f76fd | |||
9e638c29be | |||
ff02bb9ad1 | |||
23809f79fa | |||
3f153b75b1 | |||
cc3864a342 | |||
82836ba642 |
5 changed files with 704 additions and 5 deletions
19
README.md
19
README.md
|
@ -37,10 +37,15 @@ git clone https://git.rosero.one/mrosero/devs.git
|
|||
cd $HOME/devs
|
||||
bin/bootstrap.sh
|
||||
|
||||
# Configurar SOPS para encriptación GPG (obligatorio)
|
||||
bin/sops_rules.sh
|
||||
|
||||
# Actualizar el entorno (opcional)
|
||||
bin/update.sh
|
||||
```
|
||||
|
||||
> **IMPORTANTE**: La configuración del arcivo de reglas de sops .sops.yaml es un paso obligatorio antes de poder utilizar la plataforma. bin/sops_rules.sh crea el archivo base de configguración sops para el proyecto. Las claves GPG del desarrollador principal debe existir en el repositorio de claves.
|
||||
|
||||
### Estructura de Directorios
|
||||
|
||||
MRDevs Tools utiliza una estructura organizada que separa el código (en ~/devs) y la configuración (en directorios ocultos):
|
||||
|
@ -66,6 +71,7 @@ MRDevs Tools utiliza una estructura organizada que separa el código (en ~/devs)
|
|||
| Comando | Descripción |
|
||||
|---------|-------------|
|
||||
| `bin/bootstrap.sh` | Instala herramientas básicas (incluyendo oathtool, zbar, redis-cli, gum y glow) y configura la gestión de contenedores |
|
||||
| `bin/sops_rules.sh` | Configura SOPS con clave GPG para encriptación segura de secretos (paso obligatorio tras la instalación) |
|
||||
| `bin/update.sh` | Actualiza el entorno de desarrollo y herramientas (incluyendo oathtool, zbar, redis-cli, gum y glow) |
|
||||
| `bin/npm_install.sh` | Instala NodeJS y npm de forma interactiva |
|
||||
| `bin/project_new.sh` | Crea un nuevo proyecto con estructura estandarizada según el tipo seleccionado |
|
||||
|
@ -138,7 +144,8 @@ MRDevs Tools integra herramientas modernas de Charm para mejorar la experiencia
|
|||
|
||||
| Comando | Descripción |
|
||||
|---------|-------------|
|
||||
| `bin/qr_secret.sh` | Extrae secretos de imágenes QR y los guarda encriptados con SOPS |
|
||||
| `bin/sops_rules.sh` | Configura SOPS con clave GPG para encriptación segura de secretos ([documentación](docs/sops_rules.md)) |
|
||||
| `bin/qr_secret.sh` | Extrae secretos de imágenes QR y los guarda encriptados con [SOPS](docs/sops.md) |
|
||||
| `bin/vpn_install.sh` | Instala el cliente Pritunl VPN |
|
||||
| `bin/vpn_install.sh --update` | Actualiza el cliente VPN a la última versión |
|
||||
| `bin/vpn_users.sh` | Gestiona usuarios de la VPN |
|
||||
|
@ -161,6 +168,8 @@ MRDevs Tools integra herramientas modernas de Charm para mejorar la experiencia
|
|||
|
||||
## 📚 Guía de Usuario
|
||||
|
||||
> **NOTA**: Consulta nuestra documentación detallada en: [SOPS](docs/sops.md), [SOPS Rules](docs/sops_rules.md) y [Gum Forms](docs/forms-gum.md).
|
||||
|
||||
### Herramientas de CLI Modernas
|
||||
|
||||
MRDevs Tools incluye soporte completo para herramientas modernas de CLI de [Charm](https://charm.sh/):
|
||||
|
@ -598,7 +607,8 @@ El script analizará el código fuente, contará las líneas efectivas, y calcul
|
|||
|
||||
MRDevs Tools está diseñado con la seguridad y privacidad en mente:
|
||||
|
||||
- **Almacenamiento seguro**: Todos los tokens y credenciales se almacenan encriptados usando SOPS
|
||||
- **Almacenamiento seguro**: Todos los tokens y credenciales se almacenan encriptados usando [SOPS](docs/sops.md) con PGP
|
||||
- **Configuración GPG obligatoria**: El script [`sops_rules.sh`](docs/sops_rules.md) configura la clave maestra para encriptación de secretos
|
||||
- **Directorios ocultos**: La configuración sensible se almacena en directorios ocultos (con prefijo `.`)
|
||||
- **Sin telemetría**: Las herramientas no recopilan ni envían datos de uso
|
||||
- **Podman como predeterminado**: Se usa Podman (sin privilegios) para mayor seguridad en contenedores
|
||||
|
@ -638,13 +648,14 @@ $HOME/
|
|||
└── .developer/ # Tokens y configuraciones de desarrollo
|
||||
├── github.sops.yaml # Token de GitHub encriptado
|
||||
└── forgejo.sops.yaml # Token de Forgejo encriptado
|
||||
└── .sops.yaml # Configuración de SOPS para PGP
|
||||
```
|
||||
|
||||
### Componentes Principales
|
||||
|
||||
- **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, `developers.lib`, `console.lib`, etc.)
|
||||
- **Sistema de Mensajes**: Soporte multilingüe para internacionalización con prefijos específicos por herramienta
|
||||
- **Gestión de Configuración**: Archivos de configuración centralizados, plantillas .gitignore por tipo de proyecto
|
||||
- **Gestión de Configuración**: Archivos de configuración centralizados, plantillas .gitignore por tipo de proyecto, configuración SOPS para cifrado GPG
|
||||
- **Herramientas de Automatización**: Scripts y playbooks de Ansible
|
||||
- **Gestión de Servicios**: Administración de servicios locales como Node-RED, Ollama y más
|
||||
- **Creación de Proyectos**: Sistema estandarizado de plantillas para diversos tipos de proyectos
|
||||
|
@ -715,7 +726,7 @@ El texto completo de la licencia está disponible en el archivo [LICENSE.md](LIC
|
|||
|
||||
Para dudas o problemas, contacte con:
|
||||
- Email: mauro@rosero.one
|
||||
- Web: https://rosero.one
|
||||
- Web: https://mauro.rosero.one
|
||||
|
||||
---
|
||||
|
||||
|
|
|
@ -34,7 +34,12 @@ DEVELOPER_DIR=${HOME}/.developer
|
|||
DATENOW="$(date +"%Y-%m-%d %H:%M:%S")"
|
||||
DATEBAK="$(date +"%Y%m%d%H%M%S")"
|
||||
|
||||
FREEKV_URL=$(cat < "${BIN_PATH:=${BIN_HOME}}/${CONFPATH}/freekeyval.dat")
|
||||
# Configuración del servicio de almacenamiento clave-valor
|
||||
if [ -f "${BIN_PATH:=${BIN_HOME}}/${CONFPATH}/freekeyval.dat" ]; then
|
||||
FREEKV_URL=$(cat < "${BIN_PATH}/${CONFPATH}/freekeyval.dat")
|
||||
else
|
||||
FREEKV_URL="https://keyvalue.immanuel.co"
|
||||
fi
|
||||
FREEKV_SOPS_FILE=freekv-sops.devs.yaml
|
||||
|
||||
DOCKER_LOCAL=dockerfile.local
|
||||
|
|
244
bin/sops_rules.sh
Executable file
244
bin/sops_rules.sh
Executable file
|
@ -0,0 +1,244 @@
|
|||
#!/bin/bash
|
||||
#Script : sops_rules.sh
|
||||
#Apps : MRDEVS TOOLS
|
||||
#Description : Genera archivo .sops.yaml para encriptación con GPG
|
||||
#Author : Cortana Rosero One <cortana@rosero.one>
|
||||
#Generated : Created by Claude Code (claude-3-7-sonnet-20250219)
|
||||
#Created : 2025/04/06 21:45:00
|
||||
#Modified : 2025/04/06 21:45:00
|
||||
#Version : 1.0.0
|
||||
#Use Notes : ./sops_rules.sh
|
||||
#==============================================================================
|
||||
# Derechos de Autor 2025 Mauro Rosero P. <mauro@rosero.one>
|
||||
#==============================================================================
|
||||
# Este programa es software libre: usted puede redistribuirlo y/o modificarlo
|
||||
# bajo los términos de la Licencia Pública Affero General de GNU tal como
|
||||
# lo publica la Free Software Foundation, ya sea la versión 3 de la licencia,
|
||||
# o (a su elección) cualquier versión posterior.
|
||||
#
|
||||
# Este programa se distribuye con la esperanza de que sea útil,
|
||||
# pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de
|
||||
# COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
# Licencia Pública Affero General de GNU para obtener más detalles.
|
||||
#
|
||||
# Debería haber recibido una copia de la Licencia Pública Affero General
|
||||
# junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>.
|
||||
|
||||
# Configuración inicial
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BIN_BASE="bin"
|
||||
BIN_LIBS="lib"
|
||||
BIN_MESG="msg"
|
||||
BIN_CFGS="config"
|
||||
|
||||
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
|
||||
if [ -f "$SCRIPT_DIR/$BIN_CFGS/devspath.dat" ]; then
|
||||
DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat")
|
||||
else
|
||||
DEVSPATH="devs"
|
||||
fi
|
||||
BIN_HOME="$HOME/$DEVSPATH"
|
||||
VERSION=$(cat "$SCRIPT_DIR/$BIN_CFGS/version")
|
||||
|
||||
# CHECK SHELL LANGUAGE
|
||||
BIN_LANG=${LANG:0:2}
|
||||
|
||||
# Importar bibliotecas necesarias
|
||||
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
|
||||
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/console.lib"
|
||||
|
||||
# Cargar mensajes en el idioma del sistema o español por defecto
|
||||
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
|
||||
title="${head_000} ${head_002}"
|
||||
|
||||
# Verificar que gum esté instalado
|
||||
command_installed gum
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: gum no está instalado. Ejecutando bootstrap.sh..."
|
||||
"${BIN_HOME}/${BIN_BASE}/bootstrap.sh"
|
||||
|
||||
# Verificar nuevamente
|
||||
command_installed gum
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: No se pudo instalar gum. Abortando."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Verificar que GPG esté instalado
|
||||
command_installed gpg
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: gpg no está instalado. Instalando GPG..."
|
||||
os_pkgs_install gnupg
|
||||
|
||||
# Verificar nuevamente
|
||||
command_installed gpg
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: No se pudo instalar GPG. Abortando."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Verificar que SOPS esté instalado
|
||||
command_installed sops
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: sops no está instalado. Instalando SOPS..."
|
||||
"${BIN_HOME}/${BIN_BASE}/bootstrap.sh"
|
||||
|
||||
# Verificar nuevamente
|
||||
command_installed sops
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: No se pudo instalar SOPS. Abortando."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Función para validar fingerprint GPG
|
||||
validate_fingerprint() {
|
||||
local fp=$1
|
||||
|
||||
# Verificar que no esté vacío
|
||||
if [ -z "$fp" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Verificar longitud (40 caracteres para fingerprint completo)
|
||||
if [ ${#fp} -ne 40 ]; then
|
||||
return 2
|
||||
fi
|
||||
|
||||
# Verificar formato (hexadecimal)
|
||||
if ! [[ $fp =~ ^[A-Fa-f0-9]+$ ]]; then
|
||||
return 3
|
||||
fi
|
||||
|
||||
# Verificar si existe en el keyring
|
||||
if ! gpg --list-keys "$fp" &>/dev/null; then
|
||||
return 4
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Función para obtener las claves GPG disponibles con sus huellas digitales
|
||||
get_available_keys() {
|
||||
gpg --list-keys --with-colons | grep -E "^fpr" | awk -F: '{print $10}'
|
||||
}
|
||||
|
||||
# Función para mostrar un error y esperar confirmación
|
||||
show_error() {
|
||||
gum style --foreground "#FF0000" --bold "$1"
|
||||
gum input --placeholder "Presiona Enter para continuar..."
|
||||
}
|
||||
|
||||
# Función para obtener información de la clave a partir del fingerprint
|
||||
get_key_info() {
|
||||
local fingerprint=$1
|
||||
local key_info=$(gpg --list-keys --with-colons "$fingerprint")
|
||||
local user_id=$(echo "$key_info" | grep -E "^uid" | head -n 1 | awk -F: '{print $10}')
|
||||
|
||||
# Si no hay información de usuario, mostrar solo el fingerprint
|
||||
if [ -z "$user_id" ]; then
|
||||
echo "Sin información de usuario"
|
||||
else
|
||||
echo "$user_id"
|
||||
fi
|
||||
}
|
||||
|
||||
# Ruta donde se creará el archivo .sops.yaml
|
||||
SOPS_CONFIG="$BIN_HOME/.sops.yaml"
|
||||
|
||||
# Verificar si el archivo ya existe
|
||||
if [ -f "$SOPS_CONFIG" ]; then
|
||||
if ! gum confirm "El archivo $SOPS_CONFIG ya existe. ¿Desea sobrescribirlo?"; then
|
||||
echo "Operación cancelada por el usuario."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Mostrar título
|
||||
echo
|
||||
gum style --foreground 212 --bold --align center "Configuración de SOPS PGP para Encriptación"
|
||||
echo
|
||||
|
||||
# Buscar claves disponibles
|
||||
echo "Buscando claves GPG disponibles..."
|
||||
AVAILABLE_KEYS=($(get_available_keys))
|
||||
|
||||
if [ ${#AVAILABLE_KEYS[@]} -eq 0 ]; then
|
||||
show_error "No se encontraron claves GPG. Por favor, genere o importe una clave GPG primero."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Mostrar información y permitir selección
|
||||
echo
|
||||
gum style --foreground "#00AAFF" "Claves GPG disponibles (Fingerprints):"
|
||||
echo
|
||||
|
||||
# Formatear opciones para mostrar información clara
|
||||
KEY_OPTIONS=()
|
||||
for key in "${AVAILABLE_KEYS[@]}"; do
|
||||
key_info=$(get_key_info "$key")
|
||||
# Formatear la clave para mostrar solo los últimos 8 caracteres y la información de usuario
|
||||
key_short="${key:(-8)}"
|
||||
KEY_OPTIONS+=("$key - $key_short ($key_info)")
|
||||
done
|
||||
|
||||
# Seleccionar la clave
|
||||
SELECTED_KEY_FULL=$(gum choose "${KEY_OPTIONS[@]}")
|
||||
# Extraer el fingerprint completo (la primera palabra antes del guion)
|
||||
SELECTED_KEY=$(echo "$SELECTED_KEY_FULL" | cut -d ' ' -f 1)
|
||||
|
||||
# Validar la selección
|
||||
if [ -z "$SELECTED_KEY" ]; then
|
||||
echo "No se seleccionó ninguna clave. Operación cancelada."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
validate_fingerprint "$SELECTED_KEY"
|
||||
VALIDATION_RESULT=$?
|
||||
|
||||
if [ $VALIDATION_RESULT -ne 0 ]; then
|
||||
case $VALIDATION_RESULT in
|
||||
1) show_error "Error: El fingerprint está vacío." ;;
|
||||
2) show_error "Error: El fingerprint debe tener 40 caracteres de longitud." ;;
|
||||
3) show_error "Error: El fingerprint debe contener solo caracteres hexadecimales (A-F, 0-9)." ;;
|
||||
4) show_error "Error: La clave con fingerprint $SELECTED_KEY no se encuentra en el keyring GPG." ;;
|
||||
*) show_error "Error de validación desconocido." ;;
|
||||
esac
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Confirmar la selección
|
||||
echo
|
||||
gum style --foreground "#00FF00" "Se utilizará la siguiente clave para encriptación SOPS:"
|
||||
gum style "Fingerprint completo: $SELECTED_KEY"
|
||||
gum style "ID corto: ${SELECTED_KEY:(-8)}"
|
||||
gum style "Usuario: $(get_key_info "$SELECTED_KEY")"
|
||||
echo
|
||||
|
||||
if ! gum confirm "¿Confirma esta selección?"; then
|
||||
echo "Operación cancelada por el usuario."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Crear el archivo .sops.yaml
|
||||
echo "Generando archivo de configuración SOPS..."
|
||||
cat > "$SOPS_CONFIG" << EOF
|
||||
creation_rules:
|
||||
- pgp: '$SELECTED_KEY'
|
||||
EOF
|
||||
|
||||
# Verificar que el archivo se haya creado correctamente
|
||||
if [ $? -eq 0 ] && [ -f "$SOPS_CONFIG" ]; then
|
||||
gum style --foreground "#00FF00" --bold "✅ Archivo .sops.yaml creado exitosamente en $SOPS_CONFIG"
|
||||
gum style "Esta configuración se utilizará para encriptar/desencriptar archivos con SOPS"
|
||||
gum style "utilizando la clave GPG seleccionada."
|
||||
echo
|
||||
gum style --foreground "#FFAA00" "Ejemplo de uso:"
|
||||
gum style "sops --encrypt archivo.json > archivo.sops.json"
|
||||
gum style "sops --decrypt archivo.sops.json > archivo.json"
|
||||
else
|
||||
show_error "❌ Error al crear el archivo de configuración SOPS."
|
||||
exit 1
|
||||
fi
|
185
docs/sops.md
Normal file
185
docs/sops.md
Normal file
|
@ -0,0 +1,185 @@
|
|||
# SOPS: Gestión Segura de Secretos
|
||||
|
||||
## Introducción
|
||||
|
||||
[SOPS (Secrets OPerationS)](https://github.com/getsops/sops) es una herramienta de código abierto diseñada para la gestión segura de secretos. Desarrollada originalmente por Mozilla y posteriormente mantenida por la comunidad, SOPS permite encriptar y desencriptar archivos de configuración que contienen secretos como contraseñas, tokens API, claves de acceso y otros datos sensibles.
|
||||
|
||||
En el entorno de MRDevs Tools, SOPS es un componente fundamental para la seguridad general de la plataforma, proporcionando una forma estandarizada y segura de manejar información confidencial.
|
||||
|
||||

|
||||
|
||||
## Características Principales
|
||||
|
||||
- **Encriptación de archivos de configuración**: Permite almacenar secretos de forma segura en repositorios Git.
|
||||
- **Soporte para múltiples formatos**: Funciona con YAML, JSON, ENV, INI y BINARY.
|
||||
- **Encriptación selectiva**: Puede encriptar solo valores específicos dentro de un archivo, manteniendo las claves y la estructura visibles.
|
||||
- **Múltiples métodos de encriptación**: Soporta KMS de AWS, GCP KMS, Azure Key Vault, PGP, age y HashiCorp Vault.
|
||||
- **Integración con Git**: Funciona perfectamente con flujos de trabajo de control de versiones.
|
||||
- **Rotación de claves**: Permite actualizar las claves de encriptación sin necesidad de desencriptar y reencriptar los secretos.
|
||||
|
||||
## Instalación
|
||||
|
||||
En MRDevs Tools, SOPS se instala automáticamente como parte del proceso de bootstrap:
|
||||
|
||||
```bash
|
||||
bin/bootstrap.sh
|
||||
```
|
||||
|
||||
Para verificar que SOPS está instalado correctamente:
|
||||
|
||||
```bash
|
||||
sops --version
|
||||
```
|
||||
|
||||
## Funcionamiento Básico
|
||||
|
||||
SOPS utiliza claves GPG para encriptar y desencriptar secretos. La ventaja principal es que permite almacenar archivos de configuración encriptados en sistemas de control de versiones mientras se mantiene la seguridad de los datos sensibles.
|
||||
|
||||
### Conceptos Clave
|
||||
|
||||
1. **Encriptación a nivel de valor**: A diferencia de otras herramientas que encriptan archivos completos, SOPS encripta solo los valores individuales, manteniendo la estructura del archivo visible.
|
||||
|
||||
2. **Transparencia y auditabilidad**: Cada archivo encriptado contiene metadatos sobre quién lo encriptó, cuándo, y con qué clave.
|
||||
|
||||
3. **Archivos de configuración**: SOPS puede ser configurado utilizando un archivo `.sops.yaml`, que define reglas de creación y reglas de descifrado.
|
||||
|
||||
## Uso Básico
|
||||
|
||||
### Encriptar un Archivo
|
||||
|
||||
```bash
|
||||
# Usando archivo .sops.yaml para la configuración
|
||||
sops --encrypt config.yaml > config.enc.yaml
|
||||
|
||||
# Especificando la clave PGP directamente
|
||||
sops --encrypt --pgp=FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4 config.yaml > config.enc.yaml
|
||||
|
||||
# Usando variable de entorno para especificar claves
|
||||
export SOPS_PGP_FP="85D77543B3D624B63CEA9E6DBC17301B491B3F21,FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4"
|
||||
sops --encrypt config.yaml > config.enc.yaml
|
||||
```
|
||||
|
||||
### Desencriptar un Archivo
|
||||
|
||||
```bash
|
||||
# Desencriptar a stdout
|
||||
sops --decrypt config.enc.yaml
|
||||
|
||||
# Desencriptar a un archivo
|
||||
sops --decrypt config.enc.yaml > config.yaml
|
||||
|
||||
# Desencriptar sección específica de un archivo YAML
|
||||
sops --decrypt --extract '["database"]["password"]' config.enc.yaml
|
||||
```
|
||||
|
||||
### Editar un Archivo Encriptado
|
||||
|
||||
SOPS incluye un editor integrado que facilita la edición de archivos encriptados:
|
||||
|
||||
```bash
|
||||
# Editar utilizando el editor predeterminado
|
||||
sops config.enc.yaml
|
||||
|
||||
# Especificar editor usando variable de entorno
|
||||
EDITOR=nano sops config.enc.yaml
|
||||
```
|
||||
|
||||
Este comando abrirá el archivo desencriptado en tu editor. Al guardar y salir, SOPS reencriptará automáticamente el archivo.
|
||||
|
||||
### Rotar Claves
|
||||
|
||||
Si necesitas actualizar o añadir claves a un archivo ya encriptado:
|
||||
|
||||
```bash
|
||||
# Actualizar usando el nuevo .sops.yaml
|
||||
sops updatekeys config.enc.yaml
|
||||
|
||||
# Especificar nuevas claves explícitamente
|
||||
sops updatekeys --pgp=NUEVA_FINGERPRINT config.enc.yaml
|
||||
```
|
||||
|
||||
## Integración con MRDevs Tools
|
||||
|
||||
MRDevs Tools utiliza SOPS para encriptar varios tipos de información sensible:
|
||||
|
||||
1. **Tokens de API**: Para servicios como GitHub, GitLab, Forgejo, y APIs de IA.
|
||||
2. **Credenciales de acceso**: Para servicios internos y externos.
|
||||
3. **Configuraciones VPN**: Datos de configuración para conexiones VPN seguras.
|
||||
4. **Secretos TOTP/HOTP**: Extraídos de códigos QR y almacenados de forma segura.
|
||||
|
||||
Todos estos secretos se almacenan en archivos YAML encriptados en la estructura de directorios de MRDevs Tools:
|
||||
|
||||
```
|
||||
$HOME/
|
||||
└── .developer/ # Tokens para desarrollo
|
||||
├── github.sops.yaml # Token GitHub encriptado
|
||||
└── forgejo.sops.yaml # Token Forgejo encriptado
|
||||
└── .cortana/ # Configuración para IA
|
||||
└── cortana.sops.yaml # Token Claude Code encriptado
|
||||
└── .sops.yaml # Configuración SOPS global
|
||||
```
|
||||
|
||||
## Flujo de Trabajo con SOPS en MRDevs Tools
|
||||
|
||||
1. **Configuración inicial**: Durante la instalación de MRDevs Tools, se establece una clave GPG maestra para encriptación mediante el script `bin/sops_rules.sh`.
|
||||
|
||||
2. **Creación de secretos**: Cuando se añade un nuevo secreto (por ejemplo, un token de API), se encripta automáticamente con SOPS utilizando la clave GPG configurada.
|
||||
|
||||
3. **Acceso a secretos**: Las herramientas de MRDevs Tools acceden a estos secretos desencriptándolos en memoria cuando es necesario, sin exponerlos en texto plano.
|
||||
|
||||
4. **Rotación de claves**: Si es necesario cambiar la clave GPG, el script `bin/sops_rules.sh` puede ser ejecutado nuevamente para actualizar la configuración.
|
||||
|
||||
## Seguridad y Mejores Prácticas
|
||||
|
||||
Para garantizar la máxima seguridad al utilizar SOPS en MRDevs Tools:
|
||||
|
||||
1. **Proteger la clave GPG**: La seguridad de tus secretos depende de la seguridad de tu clave GPG.
|
||||
* Utiliza contraseñas fuertes para proteger tu clave privada.
|
||||
* Considera utilizar una tarjeta YubiKey u otro token de hardware para almacenar claves GPG.
|
||||
|
||||
2. **Hacer copias de seguridad**: Utilizar `bin/profile_backup.sh` para hacer copias de seguridad de tu configuración GPG.
|
||||
* Almacena las copias de seguridad en un lugar seguro, fuera de línea si es posible.
|
||||
* Documenta el procedimiento de recuperación de claves.
|
||||
|
||||
3. **Usar múltiples claves cuando sea apropiado**:
|
||||
* Para equipos, configura SOPS con múltiples claves GPG para que varios miembros puedan acceder a los secretos.
|
||||
* Considera utilizar subclaves GPG específicas para cada propósito (encriptación vs. firma).
|
||||
|
||||
4. **Establecer políticas de permisos estrictas**:
|
||||
* Verificar los permisos de archivo para los archivos SOPS encriptados (permisos 600 recomendados).
|
||||
* Limitar el acceso al archivo `.sops.yaml` solo a usuarios autorizados.
|
||||
|
||||
5. **Implementar rotación de claves periódica**:
|
||||
* Actualiza tus claves GPG periódicamente y utiliza `sops updatekeys` para actualizar los archivos encriptados.
|
||||
* Establece un procedimiento para la revocación de claves en caso de compromiso.
|
||||
|
||||
6. **Mantener el software actualizado**:
|
||||
* Actualizar regularmente SOPS para obtener mejoras de seguridad.
|
||||
* Mantener también actualizado GPG y las bibliotecas relacionadas.
|
||||
|
||||
## Resolución de Problemas
|
||||
|
||||
### Error: "Failed to decrypt"
|
||||
|
||||
Este error sucede cuando no tienes la clave privada correcta para desencriptar el archivo. Posibles soluciones:
|
||||
|
||||
1. Asegurarte de que tienes la clave GPG correcta importada.
|
||||
2. Verificar que el archivo `.sops.yaml` está correctamente configurado.
|
||||
3. Comprobar que el archivo no está corrupto.
|
||||
|
||||
### Error: "No matching encryption keys found"
|
||||
|
||||
Este error ocurre cuando SOPS no puede encontrar una clave que coincida con las reglas de creación. Soluciones:
|
||||
|
||||
1. Ejecutar `bin/sops_rules.sh` para configurar correctamente el archivo `.sops.yaml`.
|
||||
2. Verificar que tu clave GPG está disponible para el sistema.
|
||||
|
||||
## Recursos Adicionales
|
||||
|
||||
- [Documentación oficial de SOPS](https://github.com/getsops/sops)
|
||||
- [Tutorial en profundidad de Mozilla](https://blog.mozilla.org/security/2017/10/17/managing-secrets-mozilla-sops/)
|
||||
- [Mejores prácticas para gestión de secretos](https://cloud.google.com/secret-manager/docs/best-practices)
|
||||
|
||||
---
|
||||
|
||||
Si necesitas ayuda adicional con SOPS, contacta con el equipo de desarrollo mediante `mauro@rosero.one`.
|
254
docs/sops_rules.md
Normal file
254
docs/sops_rules.md
Normal file
|
@ -0,0 +1,254 @@
|
|||
# Configuración de SOPS Rules en MRDevs Tools
|
||||
|
||||
## Introducción
|
||||
|
||||
El script `sops_rules.sh` es una herramienta fundamental en MRDevs Tools que configura la encriptación PGP para SOPS (Secrets OPerationS). Este script genera el archivo `.sops.yaml` que define las reglas de creación y encriptación para todos los secretos gestionados por la plataforma.
|
||||
|
||||
La ejecución de `sops_rules.sh` es un paso **obligatorio** durante la instalación de MRDevs Tools, ya que establece la base para la gestión segura de secretos en todo el sistema.
|
||||
|
||||

|
||||
|
||||
## Objetivo y Funcionamiento
|
||||
|
||||
El objetivo principal de `sops_rules.sh` es simplificar la configuración de SOPS mediante una interfaz interactiva que:
|
||||
|
||||
1. Detecta todas las claves GPG disponibles en el sistema
|
||||
2. Permite seleccionar la clave maestra que se utilizará para encriptar/desencriptar secretos
|
||||
3. Genera el archivo de configuración `.sops.yaml` con las reglas adecuadas
|
||||
4. Valida la configuración para asegurar su correcto funcionamiento
|
||||
|
||||
Este proceso garantiza que todos los secretos de la plataforma (tokens API, credenciales, configuraciones) sean encriptados de manera consistente con la misma clave GPG, facilitando su gestión y manteniendo la seguridad.
|
||||
|
||||
## Requisitos Previos
|
||||
|
||||
Antes de ejecutar `sops_rules.sh`, debes tener:
|
||||
|
||||
1. **GPG instalado y configurado**: Al menos una clave GPG debe estar disponible en tu keyring.
|
||||
2. **Bootstrap completado**: El script `bootstrap.sh` debe haberse ejecutado previamente para instalar las dependencias necesarias.
|
||||
|
||||
Si no tienes una clave GPG configurada, puedes crear una ejecutando:
|
||||
|
||||
```bash
|
||||
bin/gpg_init.sh
|
||||
```
|
||||
|
||||
## Uso del Script
|
||||
|
||||
Ejecutar el script es sencillo:
|
||||
|
||||
```bash
|
||||
bin/sops_rules.sh
|
||||
```
|
||||
|
||||
### Proceso Paso a Paso
|
||||
|
||||
El script sigue estos pasos:
|
||||
|
||||
1. **Verificación de requisitos**: Comprueba que GPG, SOPS y Gum (para la interfaz) estén instalados.
|
||||
|
||||
2. **Detección de claves GPG**: Busca todas las claves GPG disponibles en tu sistema.
|
||||
|
||||
3. **Selección de clave**: Muestra una lista interactiva de las claves disponibles con sus fingerprints y nombres de usuario.
|
||||
|
||||

|
||||
|
||||
4. **Validación**: Verifica que la clave seleccionada es válida (longitud correcta, formato hexadecimal, presente en el keyring).
|
||||
|
||||
5. **Confirmación**: Muestra un resumen de la clave seleccionada y solicita confirmación antes de continuar.
|
||||
|
||||
6. **Generación de configuración**: Crea el archivo `.sops.yaml` en el directorio raíz de MRDevs Tools (`$HOME/devs/.sops.yaml`).
|
||||
|
||||
7. **Verificación final**: Confirma que el archivo se ha creado correctamente y muestra ejemplos de uso.
|
||||
|
||||
## Estructura del Archivo .sops.yaml
|
||||
|
||||
El archivo generado por `sops_rules.sh` tiene la siguiente estructura básica:
|
||||
|
||||
```yaml
|
||||
creation_rules:
|
||||
- pgp: 'FINGERPRINT_COMPLETO_DE_TU_CLAVE_GPG'
|
||||
```
|
||||
|
||||
Donde `FINGERPRINT_COMPLETO_DE_TU_CLAVE_GPG` es el fingerprint de 40 caracteres de la clave seleccionada (por ejemplo: `ACB17A9DB7A680D0FED714E2A17ADF8EA1E9DB07`).
|
||||
|
||||
### Explicación de las Reglas de Creación
|
||||
|
||||
Las "creation_rules" definidas en el archivo `.sops.yaml` determinan cómo SOPS encriptará nuevos archivos. Este archivo de configuración permite a SOPS saber automáticamente qué claves usar cuando no se especifican explícitamente en la línea de comandos.
|
||||
|
||||
Con esta configuración, cualquier comando SOPS ejecutado dentro del directorio de MRDevs Tools utilizará automáticamente esta clave GPG para la encriptación sin necesidad de especificarla cada vez.
|
||||
|
||||
### Configuraciones Avanzadas
|
||||
|
||||
El archivo `.sops.yaml` puede ser mucho más sofisticado, permitiendo configuraciones avanzadas:
|
||||
|
||||
#### Múltiples Claves PGP
|
||||
|
||||
Si deseas que varios miembros del equipo puedan desencriptar los secretos, puedes especificar múltiples fingerprints GPG:
|
||||
|
||||
```yaml
|
||||
creation_rules:
|
||||
- pgp: >-
|
||||
85D77543B3D624B63CEA9E6DBC17301B491B3F21,
|
||||
FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4
|
||||
```
|
||||
|
||||
#### Reglas Basadas en Patrones de Archivos
|
||||
|
||||
Puedes definir diferentes reglas de encriptación según el patrón de nombre de archivo:
|
||||
|
||||
```yaml
|
||||
creation_rules:
|
||||
- path_regex: \.dev\.yaml$
|
||||
pgp: 'DEV_ENVIRONMENT_GPG_FINGERPRINT'
|
||||
- path_regex: \.prod\.yaml$
|
||||
pgp: 'PRODUCTION_ENVIRONMENT_GPG_FINGERPRINT'
|
||||
```
|
||||
|
||||
Con esta configuración, los archivos que terminen en `.dev.yaml` usarán una clave, mientras que los que terminen en `.prod.yaml` usarán otra.
|
||||
|
||||
#### Soporte para Otros Métodos de Encriptación
|
||||
|
||||
Aunque en MRDevs Tools utilizamos principalmente PGP, SOPS soporta otros métodos de encriptación como AWS KMS, GCP KMS, Azure Key Vault, age, y HashiCorp Vault:
|
||||
|
||||
```yaml
|
||||
creation_rules:
|
||||
- path_regex: \.dev\.yaml$
|
||||
kms: 'arn:aws:kms:us-west-2:927034868273:key/fe86dd69-4132-404c-ab86-4269956b4500'
|
||||
- path_regex: \.prod\.yaml$
|
||||
gcp_kms: 'projects/my-project/locations/global/keyRings/my-keyring/cryptoKeys/my-key'
|
||||
```
|
||||
|
||||
## Casos de Uso Comunes
|
||||
|
||||
### 1. Encriptar un Nuevo Archivo de Configuración
|
||||
|
||||
Una vez configurado SOPS con `sops_rules.sh`, puedes encriptar fácilmente archivos:
|
||||
|
||||
```bash
|
||||
cd $HOME/devs
|
||||
sops --encrypt config_secrets.yaml > config_secrets.sops.yaml
|
||||
```
|
||||
|
||||
### 2. Desencriptar un Archivo Existente
|
||||
|
||||
```bash
|
||||
sops --decrypt .cortana/cortana.sops.yaml
|
||||
```
|
||||
|
||||
### 3. Editar un Archivo Encriptado In-Situ
|
||||
|
||||
```bash
|
||||
sops .developer/github.sops.yaml
|
||||
```
|
||||
|
||||
### 4. Verificar la Configuración Actual
|
||||
|
||||
Para verificar qué clave se está utilizando actualmente:
|
||||
|
||||
```bash
|
||||
cat $HOME/devs/.sops.yaml
|
||||
```
|
||||
|
||||
## Reconfiguración y Actualización
|
||||
|
||||
Si necesitas cambiar la clave GPG utilizada para encriptar secretos (por ejemplo, porque has generado una nueva o porque la anterior ha caducado), simplemente vuelve a ejecutar el script:
|
||||
|
||||
```bash
|
||||
bin/sops_rules.sh
|
||||
```
|
||||
|
||||
**Nota importante**: Cambiar la clave de encriptación no reencripta automáticamente los archivos existentes. Deberás desencriptar y reencriptar manualmente los archivos que ya estaban encriptados con la clave anterior.
|
||||
|
||||
## Integración con Otras Herramientas
|
||||
|
||||
El archivo `.sops.yaml` generado por `sops_rules.sh` es utilizado por varias herramientas en MRDevs Tools:
|
||||
|
||||
- **`bin/ai_token.sh`**: Para encriptar tokens de proveedores de IA
|
||||
- **`bin/cortana_token.sh`**: Para gestionar de forma segura el token de Claude Code
|
||||
- **`bin/cversion_token.sh`**: Para encriptar tokens de plataformas de control de versiones
|
||||
- **`bin/qr_secret.sh`**: Para almacenar de forma segura los secretos extraídos de códigos QR
|
||||
|
||||
## Resolución de Problemas
|
||||
|
||||
### No se detectan claves GPG
|
||||
|
||||
Si el script no muestra ninguna clave GPG disponible:
|
||||
|
||||
1. Verifica que tienes al menos una clave GPG generada:
|
||||
```bash
|
||||
gpg --list-keys
|
||||
```
|
||||
|
||||
2. Si no tienes ninguna clave, genera una:
|
||||
```bash
|
||||
bin/gpg_init.sh
|
||||
```
|
||||
|
||||
### Error al generar el archivo .sops.yaml
|
||||
|
||||
Si encuentras errores al generar el archivo de configuración:
|
||||
|
||||
1. Verifica que tienes permisos de escritura en el directorio:
|
||||
```bash
|
||||
ls -la $HOME/devs
|
||||
```
|
||||
|
||||
2. Asegúrate de que SOPS está instalado correctamente:
|
||||
```bash
|
||||
sops --version
|
||||
```
|
||||
|
||||
3. Prueba a ejecutar el script con modo verbose (ejecuta el script con comando bash en modo verbose):
|
||||
```bash
|
||||
bash -x bin/sops_rules.sh
|
||||
```
|
||||
|
||||
### Problemas al encriptar/desencriptar archivos después de la configuración
|
||||
|
||||
Si experimentas problemas al usar SOPS después de configurarlo:
|
||||
|
||||
1. Verifica que la clave privada GPG está disponible y desbloqueada.
|
||||
2. Comprueba que el archivo `.sops.yaml` contiene el fingerprint correcto.
|
||||
3. Asegúrate de estar en el directorio correcto al ejecutar comandos SOPS.
|
||||
|
||||
## Mejores Prácticas
|
||||
|
||||
### Gestión de Claves
|
||||
|
||||
1. **Hacer copia de seguridad de tus claves GPG**:
|
||||
* Utiliza `bin/profile_backup.sh` para respaldar toda tu configuración GPG.
|
||||
* Considera exportar las claves manualmente con `gpg --export-secret-keys --armor > my-private-key.asc`
|
||||
|
||||
2. **Proteger tus claves adecuadamente**:
|
||||
* Usar una contraseña robusta para proteger tu clave GPG.
|
||||
* Considerar el uso de tokens físicos como YubiKey para mayor seguridad.
|
||||
* Evitar compartir o exponer la clave privada.
|
||||
|
||||
3. **Almacenar de forma segura los fingerprints**:
|
||||
* Documentar el fingerprint completo (40 caracteres) en un lugar seguro para referencia futura.
|
||||
* Mantener un registro de qué clave se usa para cada entorno o proyecto.
|
||||
|
||||
### Configuración y Mantenimiento
|
||||
|
||||
1. **Estructura de permisos óptima**:
|
||||
* Limitar el acceso al archivo `.sops.yaml` solo a usuarios autorizados (permisos 600 recomendados).
|
||||
* Asegurar que el directorio que contiene los secretos encriptados tenga permisos adecuados.
|
||||
|
||||
2. **Rotación de claves programada**:
|
||||
* Establecer un proceso de rotación de claves periódico según las políticas de seguridad de tu organización.
|
||||
* Documentar el procedimiento completo para actualizar claves en archivos ya encriptados.
|
||||
|
||||
3. **Configuración para equipos**:
|
||||
* Para entornos con múltiples desarrolladores, configurar reglas con múltiples claves PGP.
|
||||
* Considerar el uso de estructuras de claves jerárquicas para equipos grandes.
|
||||
* Implementar políticas claras sobre quién puede añadir/eliminar claves del archivo de configuración.
|
||||
|
||||
## Recursos Adicionales
|
||||
|
||||
- [Documentación de SOPS](docs/sops.md): Guía completa sobre el uso de SOPS en MRDevs Tools.
|
||||
- [Configuración de GPG](https://www.gnupg.org/documentation/): Documentación oficial de GPG.
|
||||
- [Guía de Seguridad](https://cloud.google.com/security/encryption-at-rest/default-encryption): Mejores prácticas para la encriptación de datos en reposo.
|
||||
|
||||
---
|
||||
|
||||
Si necesitas ayuda adicional con la configuración de SOPS Rules, contacta con el equipo de desarrollo mediante `mauro@rosero.one`.
|
Loading…
Reference in a new issue