Su servicio no debería ejecutarse como root
generalmente . Usar un usuario separado para almacenar el secreto es una sabia precaución, pero almacenar archivos con root
de propiedad no es mejor para el secreto que usar otro usuario dedicado para esto. Siempre que su archivo secreto tenga permisos 600
o menos, estará a salvo de otros usuarios que no sean root
. Cualquier cosa que se ejecute root
tiene acceso completo de todos modos. (a menos que esté ejecutando alguna configuración compleja de SELinux)
Puede ser útil utilizar dos usuarios para esta aplicación única para aislar la administración secreta de la operación normal. Tiene dos demonios ejecutándose con comunicaciones en tiempo real, o tiene comandos de utilidad para operar en el secreto, obteniendo el privilegio necesario (basado en usuarios o grupos) a través de sudo
.
Debes considerar posibles vectores de ataque.
-
SQLi si está configurado correctamente no otorga acceso al sistema de archivos, pero los ataques de Trayectoria de Ruta podrían. Hay otros tipos de ataques en su aplicación contra los que debe protegerse.
Explotaciones en bibliotecas de C (es decir, OpenSSL que ejecuta su encriptación HTTPS, procesamiento de imágenes, etc.) puede ser posible. El uso de un usuario separado en procesos expuestos a la red puede ayudar a limitar el alcance o agregar dificultad a un ataque.
-
Los robos de otros vectores de ataque podrían ser un problema. (SSH, otros servicios en la máquina) Asegúrese de que cualquier cosa con el potencial de acceso root
esté bien asegurada.
Todas estas consideraciones deberían ayudarlo a proteger el secreto. Ahora la pregunta es, ¿el secreto realmente debe almacenarse en un plano?
En el nivel más básico, sí, el secreto debe almacenarse en algún lugar para que pueda ser utilizado. Al menos tiene que almacenarse en la memoria, pero también es necesario el almacenamiento permanente de algún tipo.
Más allá de la separación de usuarios que hemos discutido, podría ser útil descargar los secretos a un Módulo de seguridad de hardware , o incluso a una mini computadora por separado. (es decir, Raspberry Pi) Hay alguna discusión sobre la separación física aquí .
Hay muy pocos casos en los que el secreto se puede cifrar en un almacenamiento permanente.
Si su preocupación es el robo de disco duro (dejando el resto de la máquina), podría tener una secuencia de comandos de arranque que solicita a algunos de los otros hardware identificadores únicos , y obtiene un clave de cifrado mediante una buena función de derivación de clave basada en contraseña; para descifrar el secreto.
Si el cliente puede proporcionar una parte del secreto, sería útil. He descrito una forma de derive claves de descifrado de contraseñas de usuario y tokens de sesión aquí . Este es un sistema elaborado pero efectivo que se centra en limitar la cantidad de tiempo que se almacena un secreto, incluso en la memoria. (suponiendo que no necesite un restablecimiento automático de la contraseña)