python - ejemplos - django
Mantener las claves secretas fuera (6)
Es posible que necesite utilizar os.environ. obtener ("SOME_SECRET_KEY")
Una de las causas del anti-patrón local_settings.py es que poner valores SECRET_KEY, claves AWS, etc. en los archivos de configuración tiene un problema:
- Los secretos a menudo deberían ser solo eso: ¡secreto! Mantenerlos en el control de versiones significa que todas las personas con acceso al repositorio tienen acceso a ellos.
Mi pregunta es ¿cómo mantener todas las llaves en secreto?
Escribí una función getcreds () que obtiene la clave secreta de un archivo. Guardo el archivo en un lugar accesible para www-data, de modo que siempre que necesite credenciales en settings.py, solo hago la llamada a getcreds () y le paso el nombre del archivo como argumento. Devuelve una lista de todas las líneas en el archivo y el bingo que tengo los secretos ocultos. Aquí está el código ...
from __future__ import unicode_literals, absolute_import
import os
def getcreds(fname, project, credsroot=''/var/www/creds'', credsdir=None):
""" return a list of userid and password and perhaps other data """
if credsdir is None:
credsdir = os.path.join(credsroot, project)
creds = list()
fname = os.path.join(credsdir, fname).replace("//", "/")
with open(fname, ''r'') as f:
for line in f:
# remove leading/trailing whitespace and append to list
creds.append(line.strip())
assert creds, "The list of credentials is empty"
return creds
Idealmente, local_settings.py
no debe registrarse en el servidor de producción / implementado. Puede mantener una copia de respaldo en otro lugar, pero no en el control de código fuente.
local_settings.py
se puede registrar con la configuración de desarrollo solo por conveniencia, por lo que cada desarrollador debe cambiarlo.
¿Eso resuelve tu problema?
La pregunta original era sobre cómo mantener secretos en las variables de entorno. Esto se discute ampliamente en el libro Two Scoops of Django . A continuación se muestra un resumen de lo que dijeron, seguido de una advertencia sobre el uso de esta técnica.
A partir de la página 48 (Sección 5.3) de la edición para 1.11:
Cada sistema operativo compatible con Django (y Python) proporciona la capacidad fácil de crear variables de entorno.
Aquí están los beneficios de usar variables de entorno para claves secretas:
- Mantener secretos fuera de la configuración le permite almacenar cada archivo de configuración en el control de versiones sin dudarlo. Todo su código de Python debería almacenarse en el control de versiones, incluida su configuración.
- En lugar de que cada desarrollador mantenga su propia versión copiada y pegada de local_settings.py.example para el desarrollo, todos comparten la misma configuración controlada por versión / local.py.
- Los administradores del sistema pueden implementar rápidamente el proyecto sin tener que modificar los archivos que contienen el código Python.
- La mayoría de las plataformas como servicio recomiendan el uso de variables de entorno para la configuración y tienen características integradas para configurarlas y administrarlas.
En la siguiente página, el libro continúa:
Antes de comenzar a configurar las variables de entorno, debe tener lo siguiente:
- Una forma de gestionar la información secreta que vas a almacenar.
- Una buena comprensión de cómo funcionan las configuraciones de bash en los servidores, o la disposición a que su proyecto sea alojado en una plataforma como servicio.
Describen cómo configurar las variables de entorno localmente y en producción (con Heroku como ejemplo, tendrá que comprobar si está utilizando un host diferente, esto es solo una posibilidad):
Cómo establecer variables de entorno localmente
exportar SOME_SECRET_KEY = 1c3-cr3am-15-yummyCómo establecer variables de entorno en la producción
heroku config: establece SOME_SECRET_KEY = 1c3-cr3am-15-yummy
Finalmente, en la página 52 dan instrucciones sobre cómo acceder a la clave. Por ejemplo, podría colocar las dos primeras líneas a continuación en su archivo de configuración para reemplazar la cadena de clave sin formato que se coloca allí de manera predeterminada:
>>> import os >>> os.environ[''SOME_SECRET_KEY''] ''1c3-cr3am-15-yummy''
Este fragmento simplemente obtiene el valor de la variable de entorno SOME_SECRET_KEY del sistema operativo y lo guarda en una variable de Python llamada SOME_SECRET_KEY.
Seguir este patrón significa que todo el código puede permanecer en el control de versiones, y todos los secretos permanecen seguros.
Tenga en cuenta que esto no funcionará en algunos casos, por ejemplo, si está utilizando un servidor Apache. Para lidiar con situaciones en las que este patrón no funcionará, debe ver la Sección 5.4 de su libro (''Cuando no puede usar variables de entorno''). En ese caso, recomiendan usar un archivo secreto.
A finales de 2017, esta técnica de almacenamiento de secretos en sus variables de entorno es la mejor práctica recomendada en Two Scoops y en el patrón de diseño de la aplicación Twelve Factor. También se recomienda en la documentación de Django. Sin embargo, existen algunos riesgos de seguridad: si algún desarrollador, o algún código, tiene acceso a su sistema, tendrá acceso a las variables de su entorno y puede hacerlos públicos de forma inadvertida (o publicitaria). Este punto fue hecho por Michael Reinsch aquí:
http://movingfast.io/articles/environment-variables-considered-harmful/
Realizo mis proyectos Django usando Windows 7 y Powershell, así que para mí fue ligeramente diferente configurar la variable de entorno. Sin embargo, una vez que se estableció, solo hice lo siguiente en mi archivo settings.py
:
import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]
Para configurar una variable de entorno en Windows usando PowerShell, siga las instrucciones en el siguiente enlace:
Almacene sus datos local_settings.py
en un archivo cifrado con GPG, preferiblemente como líneas estrictamente key=value
que usted analiza y asigna a un dict (el otro enfoque atractivo sería tenerlo como python ejecutable, pero el código ejecutable en los archivos de configuración me hace temblar).
Hay un módulo gpg en python, así que eso no es un problema. Obtenga sus llaves de su anillo de claves y use las herramientas de administración de anillos de GPG para que no tenga que seguir escribiendo su contraseña de llavero. Asegúrese de que está leyendo los datos directamente del archivo cifrado, y no solo de crear un archivo temporal descifrado que lea. Esa es una receta para el fracaso.
Eso es solo un esquema, tendrás que construirlo tú mismo.
De esta manera, los datos secretos permanecen únicamente en el espacio de la memoria del proceso, y no en un archivo o en las variables de entorno.