Evitar que las contraseñas de texto sin formato mediante una secuencia de comandos sean accesibles en el futuro

2

Digamos que tengo una secuencia de comandos Bash que genera una contraseña, crea un nuevo usuario con esa contraseña y luego me dice cuál es la contraseña:

# Generate a password and set it to $PASSWORD
PASSWORD=$(tr -dc '[:graph:]' < /dev/urandom | head -c $(shuf -i 24-32 -n 1))

# Create a new user and set its password to $PASSWORD
useradd --home-dir /home/tom --create-home tom
echo "tom:$PASSWORD" | chpasswd

# Output the $PASSWORD
echo "The password is: $PASSWORD"

Ejecutaré este script, como root , solo una vez.

Después de que la secuencia de comandos me muestre la contraseña, la anotaré manualmente en mi sistema de administración de contraseña segura.

No quiero que la contraseña de texto sin formato vuelva a estar visible en el sistema, incluso para el usuario root (en la mayor medida posible).

1. ¿Será posible que alguien vea la salida (contraseña de texto sin formato) de este script en el futuro y, de ser así, cómo puedo eliminarlo del sistema?

2. ¿Qué puedo hacer (si es que hago algo) para asegurarme de que los contenidos de $PASSWORD nunca sean accesibles después de que el script haya terminado?

    
pregunta 18.10.2015 - 02:30
fuente

2 respuestas

1

El script que escribió no coloca la contraseña en ningún almacenamiento a largo plazo de fácil acceso (como un archivo). Incluso si se habilitara la auditoría típica de Linux (que escribiría todas las invocaciones de programas de Unix en un archivo de registro, incluidos los argumentos), la contraseña no es visible, ya que solo se pasa a través de secuencias. La única excepción es el comando "echo", que es un shell incorporado en bash, por lo que no es una "invocación de programa de Unix".

Si la secuencia de comandos finalizó, la memoria asignada a $PASSWORD se libera, y si ocurre otro proceso para asignar esa memoria, se borrará antes. Pero la memoria utilizada para "$ PASSWORD" (o las copias realizadas dentro de chpasswd, el echo integrado, la biblioteca de gráficos para mostrar la contraseña) no se limpia necesariamente después de la terminación de ese script. Si por casualidad utiliza una GUI con una ventana de consola, obviamente la contraseña está en la memoria siempre que pueda volver a ella. Dependiendo de la configuración de seguridad en el kernel, los procesos de raíz podrían buscar en la memoria física completa o intercambiar espacio por copias de la contraseña, pero cualquier programa que asigne memoria a través del kernel no encontrará la contraseña allí, porque la memoria se borrará antes de que se entregue para otro proceso.

Si su computadora tiene suficiente memoria, o si la contraseña terminó en el espacio de intercambio, puede que esté disponible durante mucho tiempo después de que finalice el script. Al no tener intercambio (o deshabilitar el intercambio y borrar toda la partición / archivo de intercambio) se evita que la contraseña termine en el archivo de intercambio. Asignar y sobrescribir un montón de memoria puede borrar la contraseña de la memoria, pero es algo peligroso de hacer en Linux, ya que el asesino OOM que se activará al igual que usted puede estar seguro de haber sobrescrito toda la memoria que pueda contener la contraseña podría matar a algunos no relacionados proceso.

Si necesita seguridad contra el raspado de la memoria, la generación de la contraseña tendría que asegurarse de que la contraseña nunca se copie en la memoria no controlada y que la memoria controlada se borre antes de que el programa salga. No hay manera de hacer eso en shell. Creo que ni siquiera es una forma de mostrar una contraseña (aparte de escribirla en la memoria de video) que está 100% garantizada de no copiar la contraseña en una memoria aleatoria.

    
respondido por el Michael Karcher 18.10.2015 - 11:02
fuente
0

Su script está bien escrito para la generación de contraseñas. Lo más importante es que mantenga la contraseña en la RAM y no la almacene en el disco. La desactivación del intercambio durante la creación evitará que la contraseña se almacene accidentalmente en el disco.

Cuando piensas que el usuario root puede volcar la memoria RAM, no tienes oportunidad de evitar la extracción de la contraseña por completo. Para protegerse aún más contra las escuchas ilegales, puede crear las contraseñas fuera de línea desde un Live-CD y simplemente copiar los hashes de contraseña generados en / etc / shadow (o LDAP, o lo que sea).

    
respondido por el fr00tyl00p 18.10.2015 - 13:54
fuente

Lea otras preguntas en las etiquetas