Enviar de forma segura la contraseña al script como parámetro

1

Tengo un script expect en mi servidor que abre una conexión WebDAV a otro servidor, espera un nombre de usuario y contraseña, y luego envía $ arg1 y $ arg2 como nombre de usuario y contraseña respectivamente.

Ejemplo: Ejecutando el script:

# ./script.exp username password

Esto ejecuta el script con nombre de usuario y contraseña como argumentos. Específicamente, este script se ejecuta con php, que toma las variables de una base de datos:

<?php
    exec("expect script.exp $username $password");

El principal problema con esto es que esos parámetros se pueden ver con una llamada ps aux.

P) Suponiendo que solo tengo acceso al servidor y al sistema de archivos, ¿seguiría siendo seguro a pesar de que la contraseña se puede ver enumerando ps aux?

Un pseudo ejemplo de mi script expect:

    //Webdav connection established, target server prompts me for username
    expect "Enter Username" 
    send "$arg1\r" 
    //Target server accepts username, now prompts me for password
    expect "Enter Password"
    send "$arg2\r"

Si esto no es seguro, o si php exec () no es seguro, ¿cuál es la mejor manera de ejecutar mi script y pasarle el nombre de usuario y la contraseña?

    
pregunta suhdo 06.09.2014 - 13:51
fuente

1 respuesta

0

Si alguien tuviera acceso al sistema de archivos del servidor, también podría leer la contraseña. Si ejecuta un comando ls -al /proc/<pid-of-another-users-process>/cmdline , puede ver que todos pueden leerlo.

Hay varias formas de resolver esto.

El primer enfoque estándar

Primero, inicias un proceso en php y luego te comunicas con él a través de stdin / stdout pipe: tutorial , manual .

El script de expectativa lee desde el stin y almacena el nombre de usuario y la contraseña en variables:

#!/usr/bin/expect
# Read input to stdin
expect_user -re "(.*)\n"
set username $expect_out(1,string)
expect_user -re "(.*)\n"
set password $expect_out(1,string)
#only for testing purposes:
puts "got $username!"
puts "got $password!"

El segundo enfoque estándar

Si ejecuta expect en la consola, puede ver que acepta su programa desde la entrada estándar. Puede invocar un nuevo proceso expect y asignarle un script de expectativa creado en su script php, con la contraseña codificada, a través de la entrada estándar. Es posible que necesite cerrar la secuencia para ejecutar el código. Asegúrese de hacer los escapes correctos para no convertir esto en una vulnerabilidad de inyección de código esperada.

El enfoque del archivo temporal

Puede escribir el nombre de usuario y la contraseña en un archivo temporal (¡nombre de archivo exclusivo de la invocación actual!) y leerlo desde la secuencia de comandos de expectativa más adelante. O incluso puede generar un script de espera temporal con la contraseña codificada, pero lo recomendaría, ya que es demasiado intrépido. El usuario solo debe poder acceder al archivo.

    
respondido por el user10008 06.09.2014 - 16:28
fuente

Lea otras preguntas en las etiquetas