2010-10-12 35 views
20

Tengo un script de Powershell que se ejecutará a través de una herramienta de automatización contra varios servidores. Funciona bien en máquinas con Windows, ya que las llamadas remotas utilizan la cuenta de servicio de la herramienta sin necesidad de solicitar ni exponer ninguna credencial en el código. Esta secuencia de comandos también se ejecuta contra máquinas Linux a través de SSH utilizando el paquete SharpSSH. SharpSSH no utiliza automáticamente las credenciales del usuario de Powershell, pero requiere un nombre de usuario y contraseña, un archivo de clave RSA o un objeto PSCredential. No puedo solicitar credenciales con Get-Credential porque se está ejecutando a través de la herramienta de automatización. No quiero exponer el nombre de usuario y la contraseña en el código o tener una clave RSA ahí. Me gustaría construir un objeto PSCredential del usuario actual de Powershell (la cuenta de servicio). Probar [System.Net.CredentialCache] :: DefaultNetworkCredentials muestra un espacio en blanco, y [System.Security.Principal.WindowsIdentity] :: GetCurrent() no proporciona el objeto o la información que necesito.Obtiene el objeto de credenciales de usuario actual en Powershell sin preguntar

¿Alguien tiene un método para crear un objeto PSCredential del usuario actual? ¿O tal vez una alternativa completamente diferente para este problema?

¡Muchas gracias!

Respuesta

14

La API de Windows no expone la información que necesita, por lo que Powershell no puede acceder a ellos. Es una característica intencional del subsistema de seguridad. La única forma de que esto funcione es que las máquinas Linux confíen en la máquina que llama, como unirlas a un Directorio Activo (o cualquier configuración de Kerberos en realidad).

Aparte de eso, necesitaría almacenar y pasar esta información de alguna manera.

Puede almacenar la clave RSA en el almacén de claves del usuario y extraerla en tiempo de ejecución (utilizando .NET Crypto/Keystore libs), por lo que no está almacenando la clave con el código. De esta forma, la clave en sí misma estaría protegida por el sistema operativo y disponible solo cuando el usuario llamante fuera autenticado. Tendrías que instalar una cosa más, pero puede ser la única forma de lograr lo que estás buscando.

+1

Ahh, eso es desafortunado. Después de algunas discusiones e investigaciones, vamos a ir con la clave RSA. En cualquier caso, terminará habilitando más en el futuro. Gracias, Taylor! – Beege

+0

Usted dice que si el usuario es parte de AD, puede obtener un objeto de credencial; ¿Es eso correcto? Estoy tratando de hacer esto (el título de la pregunta), en Windows. – ryanwebjackson

3

Dado que puede obtener la contraseña en texto plano desde un objeto de credencial, dudo que pueda obtenerla sin preguntar.

3

¿Qué hay de cifrar la contraseña utilizando la clave de cifrado de la cuenta de servicio?

Un ejemplo rápido:

Run PowerShell como cuenta de servicio, ejecute el siguiente y guardar el resultado en un archivo de texto (o incrustarla en la llamada tarea programada):

$String = '<PASSWORD>' 
ConvertFrom-SecureString -SecureString (ConvertTo-SecureString -String $String -AsPlainText -Force) 

uso del siguiendo en su tarea programada para descifrar y utilizar la contraseña:

$EncryptedString = '<ENCRYPTED PASSWORD FROM ABOVE>' 
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $EncryptedString))) 

Eso debería hacer el truco. No puede reutilizar la contraseña encriptada en una computadora diferente, o si por alguna razón destruir su tienda de claves local :)

+0

El método secureString es reversible, por lo que la contraseña no es técnicamente segura. Sin la opción -force obtendrás: "ConvertTo-SecureString: el sistema no puede proteger la entrada de texto sin formato". – cmcginty

Cuestiones relacionadas