Estoy trabajando en una máquina que necesita almacenar nombres de usuario y contraseñas para los distintos operadores, técnicos e ingenieros que pueden estar usando y configurando. Es importante que algunas funciones sean accesibles solo por ingenieros, otras accesibles por técnicos e ingenieros, y otras accesibles por todos. También debe haber una forma de agregar, eliminar y cambiar cuentas. Finalmente, los datos deben almacenarse en la misma computadora física que la aplicación.
Se ha sugerido que simplemente almacenemos el nombre de usuario, la contraseña y el nivel de privilegio en un archivo INI en el disco. Esto, obviamente, es malo. Me gustaría utilizar un sistema más seguro, con los objetivos que tiene un usuario con pocos privilegios:
- No se puede encontrar una copia de texto sin formato de la contraseña de nadie
- No se pueden realizar acciones fuera de su ámbito de privilegio
Creo que he logrado el objetivo n. ° 1 al añadir sal y hash a la contraseña, al almacenar la sal y el hash en el disco y a la autenticación con estos valores. Estoy utilizando .NET framework y System.Security.Cryptography.Rfc2898DeriveBytes esquema de hashing PBKDF2 para este propósito.
Sin embargo, 2 es más difícil, porque al almacenar las cuentas de usuario en el disco, es posible el siguiente ataque:
- El atacante hace una copia de seguridad del estado actual de la aplicación
- El atacante restablece la máquina al estado inicial / limpio al eliminar los archivos respaldados
- La máquina ahora debe proporcionar un mecanismo para agregar cuentas de usuario, como ofrecer una contraseña de administrador que se muestra solo en la primera ejecución
- El atacante se da a sí mismo los privilegios deseados y ejecuta acciones previamente restringidas
- El atacante restaura el estado de la máquina antigua
No puedo ver una forma de evitar este ataque. ¿Hay algo que pueda hacer? ¿Cómo se protegen los sistemas de autenticación completamente fuera de línea, como las cuentas de usuario de Windows o Linux, de este tipo de ataque?
Me doy cuenta de que un atacante con este tipo de acceso podría modificar o inspeccionar la propia aplicación y podría agregar un keylogger físico o de software, pero eso no es algo contra lo que pueda protegerme, por lo que quiero centrarme en hacer el mecanismo de autenticación. Lo más seguro posible.