Necesito almacenar claves de API y otra información confidencial app.yaml
como variables de entorno para la implementación en GAE. El problema con esto es que si presiono app.yaml
a GitHub, esta información se vuelve pública (no es buena). No quiero almacenar la información en un almacén de datos, ya que no se adapta al proyecto. Más bien, me gustaría intercambiar los valores de un archivo que se enumera en .gitignore
cada implementación de la aplicación.
Aquí está mi archivo app.yaml:
application: myapp
version: 3
runtime: python27
api_version: 1
threadsafe: true
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.application
login: required
secure: always
# auth_fail_action: unauthorized
env_variables:
CLIENT_ID: ${CLIENT_ID}
CLIENT_SECRET: ${CLIENT_SECRET}
ORG: ${ORG}
ACCESS_TOKEN: ${ACCESS_TOKEN}
SESSION_SECRET: ${SESSION_SECRET}
¿Algunas ideas?
Respuestas:
Si se trata de datos confidenciales, no debe almacenarlos en el código fuente, ya que se registrarán en el control de fuentes. Las personas equivocadas (dentro o fuera de su organización) pueden encontrarlo allí. Además, su entorno de desarrollo probablemente use valores de configuración diferentes de su entorno de producción. Si estos valores se almacenan en código, tendrá que ejecutar código diferente en desarrollo y producción, lo cual es complicado y una mala práctica.
En mis proyectos, coloco datos de configuración en el almacén de datos usando esta clase:
Su aplicación haría esto para obtener un valor:
Si hay un valor para esa clave en el almacén de datos, lo obtendrá. Si no lo hay, se creará un registro de marcador de posición y se lanzará una excepción. La excepción le recordará que vaya a Developers Console y actualice el registro de marcador de posición.
Encuentro que esto elimina las conjeturas al establecer los valores de configuración. Si no está seguro de qué valores de configuración establecer, simplemente ejecute el código y se lo dirá.
El código anterior usa la biblioteca ndb que usa memcache y el almacén de datos debajo del capó, por lo que es rápido.
Actualizar:
jelder preguntó cómo encontrar los valores del almacén de datos en la consola de App Engine y configurarlos. Aquí es cómo:
Vaya a https://console.cloud.google.com/datastore/
Seleccione su proyecto en la parte superior de la página si aún no está seleccionado.
En el cuadro desplegable Tipo , seleccione Configuración .
Si ejecutó el código anterior, aparecerán sus claves. Todos tendrán el valor NO ESTABLECIDO . Haga clic en cada uno y establezca su valor.
¡Espero que esto ayude!
fuente
Esta solución es simple, pero puede que no sea adecuada para todos los equipos.
Primero, coloque las variables de entorno en un env_variables.yaml , por ejemplo,
Luego, incluya esto
env_variables.yaml
en elapp.yaml
Finalmente, agregue el
env_variables.yaml
a.gitignore
, para que las variables secretas no existan en el repositorio.En este caso, las
env_variables.yaml
necesidades deben compartirse entre los administradores de implementación.fuente
process.env.MY_SECRET_KEY
y si necesita estas variables de entorno en su entorno de desarrollo local, puede usar eldotenv
paquete de nodosenv_variables.yaml
llegar a todas las instancias es una pieza faltante del rompecabezas.gcloud app deploy
como lo hace normalmente para implementar en Google Cloud. 2. ¿Cómo establecer localmente variables de entorno secretas? Hay muchas maneras. Puede usarloexport
en el símbolo del sistema o usar cualquier herramienta como @DaveKiss sugirió.os.environ.get('SECRET')
.Mi enfoque es almacenar los secretos del cliente solo dentro de la propia aplicación de App Engine. Los secretos del cliente no están en el control de código fuente ni en ninguna computadora local. Esto tiene la ventaja de que cualquier colaborador de App Engine puede implementar cambios de código sin tener que preocuparse por los secretos del cliente.
Almaceno los secretos del cliente directamente en Datastore y uso Memcache para mejorar la latencia al acceder a los secretos. Las entidades de Datastore solo deben crearse una vez y persistirán en futuras implementaciones. por supuesto, la consola de App Engine se puede utilizar para actualizar estas entidades en cualquier momento.
Hay dos opciones para realizar la creación única de la entidad:
fuente
Esto no existía cuando publicaste, pero para cualquier otra persona que se tropiece aquí, Google ahora ofrece un servicio llamado Administrador secreto .
Es un servicio REST simple (con SDK que lo envuelven, por supuesto) para almacenar sus secretos en una ubicación segura en la plataforma en la nube de Google. Este es un enfoque mejor que Data Store, ya que requiere pasos adicionales para ver los secretos almacenados y tiene un modelo de permisos más detallado: puede proteger secretos individuales de manera diferente para diferentes aspectos de su proyecto, si es necesario.
Ofrece control de versiones, por lo que puede manejar los cambios de contraseña con relativa facilidad, así como una capa sólida de consulta y administración que le permite descubrir y crear secretos en tiempo de ejecución, si es necesario.
SDK de Python
Uso de ejemplo:
fuente
os.getenv('ENV_VAR')
s?SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))
. Configuración predeterminada para usaraccess_secret_version
La mejor manera de hacerlo es almacenar las claves en un archivo client_secrets.json y excluir que se carguen en git al incluirlas en su archivo .gitignore. Si tiene diferentes claves para diferentes entornos, puede usar app_identity api para determinar cuál es la identificación de la aplicación y cargarla de manera adecuada.
Hay un ejemplo bastante completo aquí:> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets .
Aquí hay un código de ejemplo:
fuente
app.yaml
implementación de la aplicación. ¿Alguna idea allí?app.yaml
) con claves secretas e información confidencial, y lo que realmente me gusta es que está utilizando el flujo de trabajo de Google para realizar la tarea. Gracias @GwynHowell. =)Esta solución se basa en el obsoleto appcfg.py
Puede usar la opción de línea de comando -E de appcfg.py para configurar las variables de entorno cuando implemente su aplicación en GAE (actualización de appcfg.py)
fuente
gcloud
utilidad?La mayoría de las respuestas están desactualizadas. El uso del almacén de datos en la nube de Google es un poco diferente en este momento. https://cloud.google.com/python/getting-started/using-cloud-datastore
He aquí un ejemplo:
Esto supone que el nombre de la entidad es 'TWITTER_APP_KEY', el tipo es 'configuración' y 'valor' es una propiedad de la entidad TWITTER_APP_KEY.
fuente
Parece que puedes hacer algunos enfoques. Tenemos un problema similar y hacemos lo siguiente (adaptado a su caso de uso):
La forma más sencilla de hacerlo es utilizar un servidor de integración continua como Hudson , Bamboo o Jenkins . Simplemente agregue algún complemento, paso de guión o flujo de trabajo que realice todos los elementos anteriores que mencioné. Puede pasar variables de entorno que están configuradas en el propio Bamboo, por ejemplo.
En resumen, simplemente introduzca los valores durante su proceso de compilación en un entorno al que solo tiene acceso. Si aún no está automatizando sus compilaciones, debería hacerlo.
Otra opción es lo que dijiste, ponlo en la base de datos. Si su razón para no hacerlo es que las cosas son demasiado lentas, simplemente inserte los valores en Memcache como una caché de segunda capa y fije los valores a las instancias como una caché de primera capa. Si los valores pueden cambiar y necesita actualizar las instancias sin reiniciarlas, simplemente mantenga un hash que pueda verificar para saber cuándo cambian o activarlo de alguna manera cuando algo que haga cambie los valores. Eso debería ser todo.
fuente
Debe cifrar las variables con google kms e incrustarlo en su código fuente. ( https://cloud.google.com/kms/ )
coloque el valor codificado (cifrado y codificado en base64) en su variable de entorno (en el archivo yaml).
Algún código pythonish para comenzar a descifrar.
fuente
La respuesta de @Jason F basada en el uso de Google Datastore es cercana, pero el código está un poco desactualizado según el uso de muestra en los documentos de la biblioteca . Aquí está el fragmento que funcionó para mí:
Inspirado en parte por esta publicación de Medium
fuente
Solo quería notar cómo resolví este problema en javascript / nodejs. Para el desarrollo local, utilicé el paquete npm 'dotenv' que carga variables de entorno desde un archivo .env a process.env. Cuando comencé a usar GAE, aprendí que las variables de entorno deben configurarse en un archivo 'app.yaml'. Bueno, no quería usar 'dotenv' para el desarrollo local y 'app.yaml' para GAE (y duplicar mis variables de entorno entre los dos archivos), así que escribí un pequeño script que carga las variables de entorno app.yaml en el proceso .env, para el desarrollo local. Espero que esto ayude a alguien:
yaml_env.js:
Ahora incluya este archivo lo antes posible en su código y listo:
fuente
.env
archivo con las variables secretas. No los estoy duplicando en miapp.yaml
archivo y mi código implementado todavía funciona. Sin.env
embargo, me preocupa lo que suceda con el archivo en la nube. ¿Se cifra o algo así? ¿Cómo puedo asegurarme de que nadie acceda a las.env
variables de archivo de gcloud una vez implementado?Ampliando la respuesta de Martin
fuente
Existe un paquete de pypi llamado gae_env que te permite guardar las variables de entorno de appengine en Cloud Datastore. Debajo del capó, también usa Memcache, por lo que es rápido
Uso:
Si hay un valor para esa clave en el almacén de datos, se devolverá. Si no lo hay, se
__NOT_SET__
creará un registro de marcador de posición y seValueNotSetError
lanzará un . La excepción le recordará que vaya a Developers Console y actualice el registro de marcador de posición.Similar a la respuesta de Martin, aquí se explica cómo actualizar el valor de la clave en Datastore:
Vaya a la sección Datastore en la consola de desarrolladores
Seleccione su proyecto en la parte superior de la página si aún no está seleccionado.
En el cuadro desplegable Tipo , seleccione
GaeEnvSettings
.Las claves para las que se generó una excepción tendrán valor
__NOT_SET__
.Vaya a la página de GitHub del paquete para obtener más información sobre el uso / configuración
fuente