9.- Secure Development Environment con “pass”

Secure Development Environment

--

En este laboratorio, aprenderás cómo hacer que tu entorno de desarrollo sea más seguro mediante la encriptación de secretos como credenciales y claves de API para que no se almacenen de forma visible.

¿Qué es un Entorno de Desarrollo Seguro?
Como desarrollador, debes asegurarte de que la seguridad no sea una idea secundaria en el proceso de desarrollo de tu aplicación. La seguridad debe incluirse a lo largo del ciclo de vida del desarrollo de software (SDLC), pero esto no es suficiente.
Si el entorno de desarrollo no es seguro, es difícil aceptar que el código desarrollado allí también lo sea. Existen varios pasos simples que puedes seguir para asegurar tu entorno de desarrollo contra riesgos:
- Almacenar de forma segura los secretos necesarios para tu aplicación de producción.
- Asegurar la conexión a Internet. Utilizar una VPN, si es necesario.
- Implementar un firewall con políticas fuertes de entrada/salida.
- Verificar regularmente los puertos abiertos y cerrar los puertos que no sean necesarios.
- Utilizar contenedores Docker para el desarrollo, si es posible, y usar computadoras separadas para tareas de desarrollo y tareas comerciales.
- Registrar los comportamientos en los entornos de desarrollo.
- Utilizar la autenticación multifactor para prevenir el robo de identidad.
- Agregar seguridad adicional para los desarrolladores que necesitan acceder al entorno de producción desde sus computadoras de desarrollo.
- Registrar todos los commits y cambios realizados por los desarrolladores, para futuras referencias en caso de que surjan problemas.

Requisitos Previos
Los desarrolladores necesitan secretos como credenciales para claves de API en la nube y otras contraseñas para trabajar con las computadoras que utilizan a diario. Sin embargo, no todos los desarrolladores comprenden cómo proteger y mantener seguros estos secretos.
Supongamos que fueras un desarrollador que sigue prácticas de código inseguras. Tienes un archivo llamado “contraseñas” en texto plano.

insecure.txt

Vamos a descargar el archivo de secretos inseguros necesario para este laboratorio. Ejecuta el siguiente comando para obtener el archivo necesario para el laboratorio:

cp insecure.txt ~/insecure.txt

Ejecuta el siguiente comando “cat” para ver el contenido del fichero:

cat ~/insecure.txt

Resultado:

cat ~/insecure.txt
AZURE_CLOUD_API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
AZURE_ADMIN_PASS="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Como puedes ver, el archivo está almacenando secretos importantes en texto plano. Esta situación ciertamente no es deseable. En la próxima sección, aprenderás cómo almacenar estos secretos de forma segura utilizando `pass`.

Paso 1: Asegurar los secretos usando `pass`
En este paso, descargaremos e instalaremos un administrador de contraseñas basado en Linux llamado `pass`.
Utilizaremos `pass` para generar una clave secreta de Gnu Privacy Guard (GPG) y la utilizaremos para crear un almacén de credenciales local en tu computadora.
`pass` te permitirá almacenar tus secretos de forma segura.
Primero, instala `pass` en tu entorno ejecutando los siguientes comandos de Linux en la terminal:

sudo apt update
sudo apt install -y pass

A continuación, utiliza el comando gpg para generar una clave secreta GPG en tu máquina local.

gpg — full-generate-key

Sigue todas las indicaciones de instalación hasta que el proceso de instalación y configuración esté completo. Presiona opciones para el tipo de clave y las demás configuraciones restantes. Luego, presiona ‘y’ para confirmar.

Además, ingresa tu nombre real, dirección de correo electrónico y cualquier comentario. Luego, presiona ‘O’ [enter] para aceptar el valor predeterminado (para “Aceptar”).

Luego, ingresa una contraseña, se recomienda que tenga al menos 8 caracteres y contenga al menos 1 dígito o carácter especial. Con esto, se generará tu clave GPG.

Nota: Recuerda la contraseña que proporcionaste, ya que será tu contraseña maestra.

Paso 2: Inicializar Pass
Ahora que hemos generado una clave GPG, podemos inicializar `pass` con el ID de GPG.

Este paso solo necesita realizarse una vez. Después, puedes guardar tantos secretos como necesites.
Utiliza el ID de la clave GPG que creaste en el Paso 1.

gpg — list-secret-keys — keyid-format LONG | grep sec

Esta es la línea que contiene el ID de tu clave GPG. En este ejemplo, el ID de la clave GPG es 2. Usa el comando `pass init` para inicializar `pass` con el ID de tu clave ABCDEFGH01234567. Copia el ID de tu clave al portapapeles.

pass init {paste your gpg key here}

Nota: Debes pegar tu ID de GPG donde dice “your GPG ID”. {pega tu clave GPG aquí} pero no necesitas incluir las llaves curvas alrededor.

Resultados
Deberías ver una salida similar a la que se muestra a continuación (pero con tu clave GPG).

pass init ABCDEFGH01234567
mkdir: created directory '/home/fernando/.password-store/'
Password store initialized for ABCDEFGH01234567

Paso 3: Crear secretos
Ahora estás listo para crear secretos y almacenarlos de forma segura. En este paso, utilizarás el almacén de claves del administrador.

Utiliza el comando `pass insert` para insertar secretos en los secretos.
Ejecuta el siguiente comando para obtener el valor de la clave `AZURE_CLOUD_API_KEY` del archivo `~/insecure.txt`:

cat ~/insecure.txt| grep AZURE_CLOUD_API_KEY | grep -o “\”.*” | grep -o “[a-z,A-Z,0–9]*”

Ejecutar el comando devolverá el valor que usarás para el próximo comando en el Paso 2.

Ejecuta el siguiente comando para crear un nuevo secreto llamado AZURE_CLOUD_API_KEY en pass:

pass insert AZURe_CLOUD_API_KEY

Copia y pega el valor para AZURE_CLOUD_API_KEY que obtuviste en el Paso 1.

Nota: Para este paso, pass no mostrará el secreto cuando lo pegues o escribas en la ventana de comandos. Se te pedirá que pegues el valor en la ventana de comandos dos veces para confirmar que ambos valores son iguales.

Creemos otro secreto para el almacén de contraseñas.
Ejecuta el comando para obtener el valor de la clave. (Este es el mismo procedimiento que seguiste en el Paso 1 en la página anterior). Esta vez, usarás PROD_ADMIN_PASS para el nuevo secreto. Ejecuta el siguiente comando en la ventana de comandos y copia la salida al portapapeles:

cat ~/insecure.txt| grep PROD_ADMIN_PASS | grep -o “\”.*” | grep -o “[a-z,A-Z,0–9]*”

Inserta un nuevo “secreto” PROD_ADMIN_PASS :

pass insert PROD_ADMIN_PASS

Pega el valor para PROD_ADMIN_PASS en la ventana de comandos.
Nota: Para este paso, pass no mostrará el secreto cuando lo pegues o escribas en la ventana de comandos. Se te pedirá que pegues el valor en la ventana de comandos dos veces para confirmar que ambos valores son iguales.
¡Ahora puedes utilizar las contraseñas siempre que las necesites!

En la siguiente parte del laboratorio, aprenderás cómo recuperar las contraseñas almacenadas.

Paso 4: Recuperar secretos
Ahora que has creado algunos secretos, es hora de aprender cómo recuperarlos cuando los necesites.

Tu tarea es verificar que los secretos estén almacenados.
Usa el comando show para mostrar el secreto AZURE_CLOUD_API_KEY con pass y verificar que el secreto fue insertado correctamente:

pass show AZURE_CLOUD_API_KEY

Es posible que se te pida que ingreses tu contraseña maestra (clave GPG). Si es así, ingrésala y continúa. Por supuesto, puedes seguir este mismo procedimiento para cualquier contraseña que hayas guardado con `pass`.

Vamos a mostrar el AZURE_CLOUD_API_KEY con `pass` para verificar que el secreto fue insertado correctamente:

pass show PROD_ADMIN_PASS

`pass` facilita la recuperación de secretos almacenados. Al ingresar tu contraseña GPG cuando se te solicite, `pass` puede mostrarlos para ti. Si un atacante u otras personas obtienen acceso a tu computadora, no podrán acceder a tus contraseñas o secretos almacenados, ya que no conocerán tu contraseña GPG.

Paso 5: Limpieza
Hay un paso final en este laboratorio para asegurar tu entorno de desarrollo.
Ahora que tus contraseñas están almacenadas de forma segura con `pass`, el último paso es eliminar el archivo `~/insecure.txt`.
Ejecuta el siguiente comando para eliminar el archivo que contiene las contraseñas guardadas en texto plano:

rm ~/insecure.txt

¡Ahora tus contraseñas están almacenadas de forma segura con `pass`!

Acceso a tus secretos
Cada vez que necesites acceder a un secreto importante para el desarrollo, simplemente ejecuta el siguiente comando:

pass show [SECRET_KEY_NAME]
pass rm PROD_ADMIN_PASS
pass rm AZURE_CLOUD_API_KEY
pass show AZURe_CLOUD_API_KEY

Segunda Parte: Tests de Seguridad y Estrategias de Mitigación

Lab 1: Usando Análisis Estático
Lab 2: Usando Análisis Dinámico
Lab 3: Evaluando el Análisis de Vulnerabilidades
Lab 4: Evaluando “Software Component Analysis (SCA)”

Tercera Parte: OWASP Top 10 vulnerabilidades

Lab 5: Comprendiendo SQL Injections
Lab 6: Cross Site Scripting XSS
Lab 7: Guardando Secretos de forma Segura

Cuarta Parte: Mejores Prácticas

Lab 8: Code Practices
Lab 9: Secure Development Environment

--

--

Fernando Muinos
Cibersecurity, Malware and Secure Development

Founder Hubots.ai. Innovative startup dedicated to providing advanced applications and services that help companies increase their productivity by AGI.