ruby-on-rails - how - ruby on rails env variables
¿Es seguro almacenar contraseñas como variables de entorno(en lugar de como texto sin formato) en los archivos de configuración? (5)
Cada vez que tenga que almacenar una contraseña, es inseguro. Período. No hay forma de almacenar una contraseña no encriptada de forma segura. Ahora, ¿cuál de las variables de entorno vs. archivos de configuración es más "segura" es quizás discutible? En mi humilde opinión, si su sistema está en peligro, realmente no importa dónde está almacenado, un hacker diligente puede rastrearlo.
Trabajo en algunas aplicaciones en rieles, django (y un poco de php), y una de las cosas que comencé a hacer en algunos de ellos es almacenar bases de datos y otras contraseñas como variables de entorno en lugar de texto sin formato en ciertos archivos de configuración ( o en settings.py, para aplicaciones django).
Al discutir esto con uno de mis colaboradores, sugirió que esta es una práctica pobre, que tal vez esto no sea tan seguro como podría parecer al principio.
Entonces, me gustaría saber si esta es una práctica segura. ¿Es más seguro almacenar contraseñas como texto sin formato en estos archivos (asegurándose, por supuesto, de no dejar estos archivos en repositorios públicos o algo así)?
Como se mencionó anteriormente, ambos métodos no proporcionan ninguna capa de "seguridad" adicional una vez que el sistema se ve comprometido. Creo que una de las razones más fuertes para favorecer las variables de entorno es el control de versiones : he visto demasiadas configuraciones de bases de datos, etc. almacenadas de forma accidental en el sistema de control de versiones como GIT para que las vea cualquier otro desarrollador (y ¡vaya! yo también ...).
No almacenar sus contraseñas en archivos hace que sea imposible que se almacenen en el sistema de control de versiones.
Depende de tu modelo de amenaza.
¿Está tratando de evitar que sus usuarios rocien contraseñas en sus sistemas de archivos donde es probable que se olviden y se manejen mal? Si es así, entonces sí, porque las variables ambientales son menos persistentes que los archivos.
¿Estás tratando de protegerse contra algo malicioso que se dirige directamente a tu programa? Si es así, entonces no, porque las variables de entorno no tienen el mismo nivel de control de acceso que los archivos.
Personalmente, creo que los usuarios negligentes son más comunes que los adversarios motivados, por lo que optaría por el enfoque de variable de entorno.
En un nivel más teórico, tiendo a pensar en los niveles de seguridad de las siguientes maneras (en orden de aumentar la fuerza):
- Sin seguridad. Texto sin formato. Cualquiera que sepa dónde buscar, puede acceder a los datos.
- Seguridad por ofuscación. Usted almacena los datos (texto plano) en algún lugar complicado, como una variable de entorno, o en un archivo que debe parecerse a un archivo de configuración. Un atacante eventualmente descubrirá qué está pasando o tropezará con él.
- La seguridad proporcionada por el cifrado es trivial de romper (¡piense en el cifrado de César!).
- La seguridad proporcionada por el cifrado se puede romper con un poco de esfuerzo.
- La seguridad proporcionada por el cifrado no es práctico para romper el hardware actual dado.
- ¡El sistema más seguro es uno que nadie puede usar! :)
Las variables de entorno son más seguras que los archivos de texto simple, porque son volátiles / desechables, no guardadas; es decir, si establece solo una variable de entorno local, como "establecer pwd = lo que sea," y luego ejecuta el script, con algo que sale del shell de comandos al final del script, entonces la variable ya no existe. Su caso cae en los dos primeros, lo cual diría que es bastante inseguro. Si fuera a hacer esto, no recomendaría la implementación fuera de su red interna / intranet inmediata, y solo con fines de prueba.
Lamento no haber tenido suficiente representante para comentar, pero también quería agregar que, si no tienes cuidado, tu shell podría capturar esa contraseña en su historial de comandos también. Así que ejecutar algo como $ pwd=mypassword my_prog
manualmente no es tan efímero como podrías haber esperado.