Las pautas de devops en https://12factor.net/config sugieren poner los secretos del sitio web (contraseñas de bases de datos, claves de API, etc.) en variables de entorno. ¿Qué ventajas tiene eso en lugar de usar archivos de texto (JSON, XML, YAML, INI o similares) ignorados por el control de versiones?
Me resulta mucho más fácil copiar un archivo de configuración con secretos que manejar variables de entorno en .bash_profile y la configuración del servidor web. ¿Echo de menos algo?
web-server
configuration
website
environment-variables
Aidas Bendoraitis
fuente
fuente
Respuestas:
El autor enumera su razonamiento, aunque es un poco disjunto. Su argumento principal es que es fácil registrar accidentalmente un archivo de configuración, y que los archivos de configuración tienen diferentes formatos y pueden estar dispersos por el sistema (los tres son, en el mejor de los casos, argumentos mediocres para la configuración relacionada con la seguridad, como tokens de autenticación y credenciales).
Dada mi propia experiencia, esencialmente tiene las siguientes tres opciones, con las ventajas y desventajas asociadas:
Almacene los datos en archivos de configuración.
Al adoptar este enfoque, lo ideal es aislarlos del repositorio y asegurarse de que estén fuera del área en la que la aplicación almacena su contenido.
Ventajas:
Desventajas
Almacene los datos en variables de entorno.
Por lo general, esto se realiza al obtener una lista de variables de entorno y valores del script de inicio, pero en algunos casos puede simplemente indicarlos en la línea de comandos antes del nombre del programa.
Ventajas:
Desventajas
hidepid
opción de montaje/proc
en LInux, por ejemplo), pero no están habilitados de forma predeterminada y no protegen contra los ataques del usuario propietario del proceso.Use argumentos de línea de comandos para pasar los datos.
En serio, evite esto a toda costa, no es seguro y es muy difícil de mantener.
Ventajas:
Desventajas
fuente
Las variables de entorno serán heredadas por cada proceso hijo del servidor web. Esa es cada sesión que se conecta al servidor, y cada programa generado por ellos. Los secretos se revelarán automáticamente a todos esos procesos.
Si mantiene secretos en los archivos de texto, deben ser legibles por el proceso del servidor, y potencialmente también por todos los procesos secundarios. Pero al menos los programas tienen que ir a buscarlos; No se proporcionan automáticamente. También puede hacer que algunos procesos secundarios se ejecuten en diferentes cuentas y hacer que los secretos sean legibles solo por esas cuentas. Por ejemplo, suEXEC hace esto en Apache.
fuente
MYVAR=foo /path/to/some/executable
) por proceso limita la propagación a un proceso y es solo para niños, y donde sea necesario, los daemons maestros pueden eliminar / restablecer / modificar El entorno de los procesos secundarios.Incluso si hay algunas compensaciones relacionadas con la seguridad que se deben hacer cuando se trata de variables de entorno o archivos, no creo que la seguridad sea la principal fuerza impulsora de esta recomendación. Recuerde que los autores de 12factor.net también son (¿o también lo fueron?) Desarrolladores de Heroku PaaS. Hacer que todos usen variables de entorno probablemente simplificó bastante su desarrollo. Hay tanta variedad en diferentes formatos y ubicaciones de archivos de configuración y les habría resultado difícil admitirlos a todos. Las variables de entorno son fáciles en comparación.
No se necesita mucha imaginación para adivinar algunas de las conversaciones que se tuvieron.
1 : fuente: inventado.
fuente
TL; DR
Existen varias razones para usar variables de entorno en lugar de archivos de configuración, pero dos de las más comunes que se deben pasar por alto es el valor de utilidad de la configuración fuera de banda y la separación mejorada entre servidores, aplicaciones o roles organizacionales. En lugar de presentar una lista exhaustiva de todas las razones posibles, solo abordo estos dos temas en mi respuesta, y toco ligeramente sus implicaciones de seguridad.
Configuración fuera de banda: separación de secretos del código fuente
Si almacena todos sus secretos en un archivo de configuración, debe distribuir esos secretos a cada servidor. Eso significa verificar los secretos en el control de revisión junto con su código, o tener un repositorio o mecanismo de distribución completamente separado para los secretos.
Cifrar tus secretos realmente no ayuda a resolver esto. ¡Todo lo que hace es empujar el problema a una eliminación, porque ahora también debe preocuparse por la administración y distribución de claves!
En resumen, las variables de entorno son un enfoque para mover los datos por servidor o por aplicación fuera del código fuente cuando desea separar el desarrollo de las operaciones. ¡Esto es especialmente importante si ha publicado el código fuente!
Mejorar la separación: servidores, aplicaciones y roles
Si bien ciertamente podría tener un archivo de configuración para guardar sus secretos, si almacena los secretos en el código fuente tiene un problema de especificidad. ¿Tiene una rama o repositorio separado para cada conjunto de secretos? ¿Cómo se asegura de que el conjunto correcto de secretos llegue a los servidores correctos? ¿O reduce la seguridad al tener "secretos" que son los mismos en todas partes (o legibles en todas partes, si los tiene todos en un archivo) y, por lo tanto, constituyen un riesgo mayor si fallan los controles de seguridad de cualquier sistema?
Si desea tener secretos únicos en cada servidor, o para cada aplicación, las variables de entorno eliminan el problema de tener que administrar una multitud de archivos. Si agrega un nuevo servidor, aplicación o rol, no tiene que crear archivos nuevos o actualizar los antiguos: simplemente actualiza el entorno del sistema en cuestión.
Pensamientos de despedida sobre seguridad
Si bien una exploración exhaustiva de la seguridad del núcleo / memoria / archivo está fuera del alcance de esta respuesta, vale la pena señalar que las variables de entorno implementadas adecuadamente por sistema no son menos seguras que los secretos "encriptados". En cualquier caso, el sistema de destino todavía tiene que mantener el secreto descifrado en la memoria en algún momento para poder usarlo.
También vale la pena señalar que cuando los valores se almacenan en la memoria volátil en un nodo determinado, no hay ningún archivo en el disco que se pueda copiar y atacar sin conexión. Esto generalmente se considera una ventaja para los secretos en memoria, pero ciertamente no es concluyente.
La cuestión de las variables de entorno frente a otras técnicas de gestión de secretos es realmente más sobre las compensaciones de seguridad y usabilidad que sobre los absolutos. Su experiencia puede ser diferente.
fuente
Personalmente, no recomendaría establecer variables ambientales
.bashrc
ya que estas se vuelven visibles para todos los procesos iniciados por el shell, sino establecerlas en el nivel de demonio / supervisor (script init / rc, configuración systemd) para que su alcance se limite a donde sea necesario .Cuando los equipos separados administran las operaciones, las variables de entorno proporcionan una interfaz fácil para que las operaciones establezcan el entorno para la aplicación sin tener que conocer los archivos / formatos de configuración y / o recurrir a la manipulación de su contenido. Esto es especialmente cierto en configuraciones multi-idioma / multi-framework donde los equipos de operaciones pueden elegir el sistema de implementación (SO, procesos de supervisión) en función de las necesidades operativas (facilidad de implementación, escalabilidad, seguridad, etc.).
Otra consideración son las canalizaciones de CI / CD, ya que el código pasa por diferentes entornos(es decir, desarrollo, prueba / qa, puesta en escena, producción) los detalles ambientales (zonas de implementación, detalles de conexión de base de datos, credenciales, direcciones IP, nombres de dominio, etc.) se configuran mejor mediante herramientas / marcos de administración de configuración dedicados y consumidos por la aplicación procesos desde el entorno (en SECO, escribir una vez, ejecutar en cualquier lugar de manera) Tradicionalmente, cuando los desarrolladores tienden a gestionar estas preocupaciones operativas, tienden a registrar archivos de configuración o plantillas además del código, y luego terminan agregando soluciones y otra complejidad cuando cambian los requisitos operativos (por ejemplo, nuevos entornos / implementación / sitios, escalabilidad / seguridad) pesarse,
Para la producción, estoy a favor de configurar los entornos de la aplicación en un archivo de entorno como el
/etc/default/myapplication.conf
que se implementa mediante la administración de la configuración y que solo sea legible deroot
tal manera quesystemd
(o cualquier otra cosa) pueda generar la aplicación bajo un usuario del sistema privilegiado dedicado en un privado grupo . Respaldado con grupos de usuarios dedicados paraops
ysudo
: estos archivos no se pueden leer de forma predeterminada en todo el mundo. Esto es compatible con 12factor y admite todas las bondades de Dev + Ops plus, tiene todos los beneficios de una seguridad decente y al mismo tiempo permite que los desarrolladores / evaluadores ingresen sus propios archivos Environment en los entornos dev / qa / test.fuente
Desde la perspectiva del desarrollador, el almacenamiento de datos de configuración en variables de entorno simplifica las implementaciones entre diferentes entornos (desarrollo, control de calidad y producción) y libera a los desarrolladores de tener que preocuparse por implementar el archivo de configuración incorrecto.
Las aplicaciones web de Azure ofrecen la opción de usar este patrón y funciona muy bien.
Además de eso, mantiene esos datos potencialmente confidenciales fuera del control de origen. Ignorar esos archivos del control de código fuente no es realmente factible (al menos en .NET) porque también hay una gran cantidad de configuraciones necesarias en esos archivos.
fuente