Cifrado de Python

La criptografía de clave pública simplificada

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

Una perspectiva de DevOps sobre la protección de los parámetros de implementación

Photo by Towfiqu barbhuiya on Unsplash

Una perspectiva de DevOps sobre la protección de los parámetros de implementación Public-key

La compilación de código y la automatización de la implementación han allanado el camino para muchas cosas grandiosas. Atrás quedaron los días de lanzamientos mensuales de códigos manuales; Las canalizaciones modernas de CI/CD ahora tienen la capacidad de liberar cada compromiso de código que pasa las pruebas automatizadas en los entornos de desarrollo y preparación para la producción.

Para que esta magia suceda, los equipos de DevOps deben crear un código que sea independiente del entorno. Se debe implementar exactamente el mismo código en DEV, TEST, STAGE y luego en PROD, pasando los parámetros adecuados en el momento de la implementación para que la solución se comporte correctamente. La arquitectura de microservicios y el desacoplamiento de subcomponentes independientes que deben descubrirse entre sí después de implementarse para trabajar juntos hacen que esta sea una tarea muy desafiante. Hacer un seguimiento de estos parámetros de implementación, el "pegamento" que hará que todos estos componentes ingenuos funcionen juntos en cualquier entorno, se ha convertido en un nuevo desafío en sí mismo.

Si bien es de conocimiento común, probablemente no esté de más repetirlo una vez más: nunca, bajo ninguna circunstancia, debe incrustar credenciales de ningún tipo, incluidas las claves de API, en su código o en una imagen de contenedor. Las credenciales cargadas en un repositorio de código o registro de imágenes deben considerarse comprometidas y modificadas de inmediato.

Pero puede preguntarse: si no puede realizar un seguimiento de estos preciosos parámetros de implementación en un repositorio de código fuente, ¿qué puede hacer? Mantener estos valores críticos en un repositorio con control de versiones es una buena idea, pero siempre que estén encriptados. La criptografía de clave pública/privada proporciona la mejor solución porque el secreto cifrado no se puede descifrar sin la clave privada, por lo que se pueden cargar de forma segura en un repositorio privado de GitHub siempre que la clave de descifrado no lo sea.

Los buenos archivos de configuración antiguos o archivos “.INI” son sorprendentemente adecuados para almacenar parámetros de implementación porque permiten almacenar el mismo nombre de clave con diferentes valores en varias secciones que representan los diversos entornos. Por ejemplo:

[DEFAULT]
db_user = dbuser
[DEV]
db_pwd = devpassword
[PROD]
db_pwd = prodpassword

El valor del nombre de usuario de mi base de datos db_user será el mismo para todas las secciones (DEFAULT), pero el valor de db_pwd puede ser diferente en DEV que en PROD.

La biblioteca de Python rsa_crypto y la utilidad de línea de comandos le permiten combinar la flexibilidad de almacenar valores en archivos de configuración con la seguridad del cifrado de clave pública/privada. Los archivos binarios autónomos para Windows, Mac y Linux también están disponibles para su comodidad.

El primer paso es generar nuevas claves:

rsa_crypto create
Enter key password:
Re-enter key password:
Creating key...
Created password-protected private/public keys file /Users/me/rsa_key.bin
Use the "extract" keyword to create public and private key files.

De manera predeterminada, la herramienta crea un nuevo par de claves RSA de 4096 bits (secreto) y lo guarda en un solo archivo, protegido por una contraseña que cumple con el estándar PKCS#8 y utiliza la función de derivación de clave scrypt para frustrar los ataques de diccionario de fuerza bruta. La clave está segura con una buena contraseña, pero aún así nunca debe almacenarse en un depósito de código.

Tener otra contraseña no se presta bien a la automatización de la implementación. La herramienta también proporciona una forma de extraer ese archivo protegido con contraseña en archivos separados de clave pública y privada que no requieren contraseña.

rsa_crypto extract
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
Created private key file /Users/me/rsa_private.pem (File can decrypt data and is not password-protected, keep it safe!)
Created public key file /Users/me/rsa_public.pem (distribute this one to anyone who needs to encrypt data, it cannot be used for decryption!)

El archivo de clave pública se puede distribuir de forma segura a cualquier persona que necesite poder cifrar valores, no se puede utilizar para descifrar. Esta es una excelente opción, ya que las credenciales generalmente las administra un grupo separado en la mayoría de las organizaciones.

Por el contrario, la clave privada debe protegerse con extrema precaución, ya que puede usarse para descifrar cualquier valor sin ninguna contraseña. La herramienta buscará estos archivos clave en el directorio actual (desde el que está ejecutando el comando), el directorio donde se encuentra el script, así como en el directorio de inicio del usuario. También buscará los archivos clave como variables de entorno, lo que podría ser una mejor opción en muchas situaciones.

export rsa_private=$(cat /Users/me/rsa_private.pem)

El archivo de clave privada se puede eliminar de forma segura, siempre se puede volver a generar a partir del archivo de clave cifrada con contraseña:

rsa_crypto clear 
Using key: /Users/me/rsa_private.pem
Private key deleted: /Users/me/rsa_private.pem

La herramienta también se puede usar con la opción -k para especificar un prefijo de nombre de clave diferente, lo que permite a los usuarios tener varias claves para diferentes entornos o propósitos o credenciales administradas por diferentes equipos:

rsa_crypto create -k dev
Enter key password:
Re-enter key password:
Creating key...
Created password-protected private/public keys file /Users/me/dev_key.bin
Use the "extract" keyword to create public and private key files.

Estos parámetros get y set del script también se pueden usar para almacenar y recuperar valores cifrados en un archivo de configuración. El archivo de configuración ya debe existir:

touch ~/.rsa_values.conf

La estructura del archivo es bastante simple, contiene secciones delimitadas por corchetes [MI_SECCIÓN]. Tenga en cuenta que el nombre de la sección puede distinguir entre mayúsculas y minúsculas. La sección [DEFAULT] se utiliza de forma predeterminada.

Cada sección contendrá varias "opciones" y valores (pares clave/valor). Solo se cifrará el valor, el nombre de la opción permanecerá en texto no cifrado.

Esta estructura es muy adecuada para realizar un seguimiento de los valores que deben ser diferentes según el entorno, como para realizar un seguimiento de las contraseñas de la base de datos en entornos DEV, TEST y PRODUCTION.

Para guardar un valor de una opción denominada database_password en la sección DEV utilizando la clave de cifrado predeterminada:

rsa_crypto set -s DEV -o database_password
Using key: /Users/me/Documents/rsa_public.pem
Enter value:
DEV my_password
set
Updated /Users/me/.rsa_values.conf

Si no especifica un valor, la secuencia de comandos le pedirá el valor para que no esté visible en el historial de la línea de comandos. Opcionalmente, si lo prefiere, también puede especificar el valor como un parámetro de línea de comando usando el parámetro -v.

rsa_crypto set -s DEV -o database_password -v my_secret_password
Using key: /Users/me/Documents/rsa_public.pem
DEV my_secret_password
set
Updated /Users/me/.rsa_values.conf

Para descifrar el valor:

rsa_crypto get -s DEV -o database_password
Using key: /Users/me/rsa_private.pem
get
Reading from /Users/me/.rsa_values.conf
DEV database_password my_secret_password
my_secret_password

Tenga en cuenta que en el ejemplo anterior, la clave privada rsa_private.pem nos permitió descifrar los datos sin solicitar una contraseña. Una vez más, tenga mucho cuidado porque cualquier persona con ese archivo puede descifrar los datos . Si la clave privada no está presente, el script solicitará una contraseña para abrir el archivo de par de claves protegido rsa_key.bin.

rsa_crypto clear
Using key: /Users/me/rsa_private.pem
Private key deleted: /Users/me/rsa_private.pem
rsa_crypto get -s DEV -o database_password
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
get
Reading from /Users/me/.rsa_values.conf
DEV database_password my_secret_password
my_secret_password

Ahora configuremos y obtengamos la contraseña PROD:

rsa_crypto set -s PROD -o database_password -v super-secret
Using key: /Users/me/Documents/workspaces/rsa_public.pem
PROD super-secret
set
Updated /Users/me/.rsa_values.conf
rsa_crypto get -s PROD -o database_password
Using key: /Users/me/rsa_key.bin
Opening encrypted key.
Enter key password:
get
Reading from /Users/me/.rsa_values.conf
PROD database_password super-secret
super-secret

El contenido del archivo de configuración .rsa_values.conf se verá así:

cat ~/.rsa_values.conf
[DEFAULT]
test = VvXy8NcqL94lBDYS56EnQm03vq9Kvg17VNU1Tu0T1j_hn-OxOTmXv_NoQHWcvWZuJto4awbq1Y_yvi_MKYE5uXOv15iVBZAuHO_xlUmujrL9pdUfxnBe8SAzH7sy2GTx42tLkb2MB9E-49GmKYqbx9dBzTNRDJj8D8LDZku6CJeSDPGy9l6UzG2vl53V3GY97an4Gb4UJ7XYEeEqMsZFRqaxgdWd_IMA_L5FtAlEaU3j4SYvqq-9QDxuab0vv8ZgzP6KuR05jXcLTrEZdrfmy_zRHuLiThu5_-ofsUNoXGNByGWAdBuuMONQj1s2QiI7qsqbFw66RBh0zUMzF2XFtSHY4AklF6uiDkieAhjBldbIjGEhrt3eMVBRBtRIDQ-LlYMcP8HnMPjBe-FBn8rYNscDrOWJIcqyTXwspfnyI6iSjEfTNQilMG6V17NXaJNipbJpoFm0aiKokZXawgav9yWWXAjRitMBtCGbqeEXVw704uY2s2K0m8XQhBLuwtCSS2Q616e4CgBxhEZOHNC0FPDpLWgvUwSFJ9vLphYSEQXeak3GRPDUfzxnjIUi8uLtifJGVEUycyRf8PV_Zf-0i8SAxFbB9OYawAKBpwwTGt4B8Pir351AcID4-s-9TG7LwrOxDvDiGxTH6Kho0SnMubXdpfDESFlwb61KzD3Yap0=
[dev]
test = Nfe5yc-FegHyEODNAX-ndIs8kf6Tjn1V3fjy7PSZ4J4NuOq7bOHCfooVb2mK4KS7Q0U8MSIIo_JmAZVqY__CvWR4zaczr4Es1d64YNX8CyVKvfIK7sPVSfv-v54-edcdtKHEj6dJRo1Pdbvc8ESgMxEUK9J64lS0FloZoXJGE1NVdkgf19IX4ZlHm2XjhyQ1pgfEg0cJPqDukM6cHfXwqexVjWGGF9-eYw6jeUFm59O3_D5Z44ull9HCdEtG85Hv99R4lpQJWYRLF1b7-HPPnyAoXwnCuR-mKi7KdiZw4q_bTruuKYltTKIYbMxXzW5m-kjNUcHSaYdOxSGVbOYdhMiBOnvTRZS5KVVpJCfS5fkQG2HLRlkRhW2PWwaG8ieP-bXvK7jvImKqRbGryPNHtdNBSv3yIXhQKqHfs6JxVXg_pBJywv7q-oymxw4hk3jf11CyZaDmAS-XQQU0KxnnkJ7Cm1h1KYVSfFMZWw9teEd3fRsiBktqPaIOnw0U5liK5WG52uBN_hdoAM73aOpsuDLPy1fYEL5Wuw3nuSZt48Gf7q6AFWS8WRCwIXa0oJJjudObfkeCw7jA0-ufIEHa4wBk2X93D2Mjr-nLOSayLM71UOdT94B4-2oVV-44Djuo-iY3iKQQkllFvuQmZr2Ozs68knOA70qbIYewVBcO4fY=
[DEV]
database_password = YrUidTfrK3w-y2KneYUSWugR0IVjmPvBpjqlBZ_5Oic5td0rO2aeWOuyeiujSe7G9YoBnKLxtIkGGzeOs0EQ6kEJCmLCq2MVNOECj4__majFlmp3De_ypebwq0SbRn4UGRzrGSV6oO93jnoHpH8Rky2L5yeJMAqjwsMAgOQBrfdpdcgqLRATUumoaRkvfMafdTYKjhJj5m6EUB9-la8YPK9kxMKu2-l9GlEnqug5S91xAOXb2laX2b3T5KCeQxxAZ2L9KtUG0NJulmaEtUFoRNWSVyBLsAvDdRkXoYXuHLSIhD-8x1RwxOjPyJ-t4cc7uNJF8ZfCsLHuesQj4jauXSmiVe5wI718rC4PS9kYH5Z5IKgl19d7jRaUI2jx-lPs4Rues1SZpHQKpH8GG3Id7z5RAtJ3OdlCrx7b3uOPL5GinlG4QdyiF7ROIsShAZPTdrQybRDDCU8ju-6R0RkMO8Qds7VNRANSwXYQAn2D62IQx3cAr40TMOHy697QgklomfT-k52GCQsfyJqFASYJ4DDhnjZB8uXzx1eHLhmVTikVt1yYXjoPOD0HPX0uYTd8L-TNwU9OnU36Q8m9dTez9rUHrX2xKapkYf0SIRPeSiLRbey_h9tnynoQYXtKsca-jxdBUDZvw2t_KbU__z_zuRWv65CrJpkcBGMvYkqeXj4=
[PROD]
database_password = g1G_zRij0D6nerTHn1bJ7fr_HiWLFv4Qi-a2Y9QfjeWy5lRCO4L_9ENuiG4hbqyJj2NtbLJ7-NCpN3wd_i8djTGcY2yTcgsFZQEceco-n1bK9yX3Fq8Go1r2D82ccdlNSASeFwA5XDEiBbjpDmsgeawYQNJJUC84oAdv52cFIqTVHecYXGp8cr93eUI3Cpj8Q67zoMH3bJNXkF1KIcFCdrlFfwOQA3RsVuoYdw_JXztVAGaUBWfnBKWjDuTcM9WJyB2-Zfw8Pv0W4Dd2YkJvjvMcCJakxoVEz1OGFBlLyBwleTXBQVKLxGBkK7Xfr7s0FArM6yBAe5BFOfd-vfNeoR38X-Rc00ojUTpbsforLKTWuvHGx1tXi8F5b7TAhNKsICptmBn52ZZmYQjCyIktgL_v0Trngk0Y3uYiaAZpFJyvNHcebjSJ445c_knbcFdn158tud9WX8dHOcXcx5LXFrfh-hU1Vc0U6MUVXgja7T_-O5N59Hob4DIyb4sHF8x-FGFiBvZK-dvIY_FDt82Z0Bk-AETPCykdkmtTx4eg-_o2eEb9ewKHlgLpnBjUs1FajMcfGYiQnaRQNfubBRHY34nmdJtfqQVqVIcQkD0N19qI-8Mg0RSwLaxKSDPlK06JdZew1Nrli-l7U5wYZV4zLdIzXG4tqy6qIb_8Y5yMXm0=

La herramienta también se puede usar para cifrar archivos completos, como un archivo de configuración .yaml del almacén de parámetros de Kubernetes, mediante la opción -f.

Comentarios publicados: 0