PowerShell: cifre y almacene sus contraseñas y úselas para autenticación remota (Protect-CmsMessage)
Cuando se trata de certificados, mucha gente huye. El tema no es muy popular, pero no todo es tan malo como se temía. En este artículo, le mostraré cómo almacenar su contraseña o contraseñas de forma cifrada en su disco duro. Debido al proceso de clave pública/privada, el usuario que posee el certificado (específicamente la clave privada) es el único que puede abrir el archivo y leer las contraseñas. Luego voy a mostrar cómo usar esta contraseña para algunas acciones remotas.
¿Para qué sirve este artículo?
Cada vez que realice una comunicación remota, se le pedirán sus credenciales. Si eso te molesta, sigue leyendo. Vamos a guardar tu contraseña protegida mediante criptografía en nuestro disco duro. Nuestro objetivo es una nueva función avanzada llamada Enter-PSSessionPW que utiliza su contraseña cifrada para establecer una conexión remota.
Nota de seguridad
La solución mostrada no es 100% segura. Pero es posible hacerlo más seguro. Para obtener más información, consulte la última parte de este artículo.
Pero primero debemos echar un vistazo al proceso general.
Criptografía asimétrica
Primero permítanme brindarles una descripción general de la criptografía asimétrica para comprender completamente lo que vamos a hacer en este artículo. Considere el proceso de Protect-CmsMessage:
Eso significa que sólo podemos usar la clave privada para descifrar datos. Con la clave pública podemos cifrar datos.
Este proceso se puede comprobar proporcionando la clave pública al usuario Petra. Luego utiliza la clave pública para cifrar el contenido de un archivo. Sin embargo, no puede descifrar el archivo porque le falta la clave privada (solo pewa2303 la tiene). Para mostrar esto, exporté la clave pública y Petra la instaló en su almacén de certificados (Personal - Certificado). Ahora sucede lo siguiente:
Petra puede cifrar contenido con la clave pública del certificado de pewa2303. Como se esperaba.
Como era de esperar, Petra no puede descifrar el contenido porque le falta la clave privada.
Pero, por otro lado, pewa2303 es capaz de descifrar el mensaje, porque es el poseedor de la clave privada. No te confundas pewa2303=administrador ?
quod erat demonstrandum ?
¡Pongámonos a trabajar!
Crear un nuevo certificado para el cifrado de documentos
Para hacer lo que se muestra arriba, primero necesitamos un certificado. Hay exactamente dos formas de hacer esto: 1. tienes uno de una autoridad de certificación pública, o si no, compras uno, y 2. creas uno para ti. Como supongo que la mayoría de los lectores no tienen un certificado, ahora estamos trabajando juntos para crear uno.
Ok, vamos a por ello. Todo lo que tienes que hacer es copiar el siguiente comando en tu sesión de PowerShell. El nombre pewa2303 debe personalizarse. En 2018 ya no necesitamos herramientas de terceros como makecert. ¡Gracias a Dios o al equipo de PowerShell por esto!
New-SelfSignedCertificate -DnsName pewa2303 -CertStoreLocation "Cert:\CurrentUser\My" -KeyUsage KeyEncipherment,DataEncipherment,KeyAgreement -Type DocumentEncryptionCert
Tenga en cuenta la huella digital de arriba. Para lo siguiente necesitamos este número y una contraseña para el archivo pfx que incluye la clave privada.
Compruébalo con
certmgr.msc
Recomiendo encarecidamente hacer una copia de seguridad de este certificado AHORA. Después no. Más tarde significa nunca. ?
Export-PfxCertificate -Cert Cert:\CurrentUser\My\9209C2F587CC95B6F229279ACDB8B3765C1D054B -FilePath C:\Temp\cert.pfx -Password (ConvertTo-SecureString -AsPlainText '123' -Force)
Ahora tenemos una copia de seguridad del certificado. Lo mejor es que elijas una contraseña mejor que la mía y guardes el archivo en un medio que no sea el disco duro ?
Ahora podemos continuar con algunas acciones criptográficas.
Cifrando su contraseña
En resumen: tenemos un certificado. Hemos realizado una copia de seguridad de este certificado. Ahora podemos usar este certificado para cifrar un archivo. Primero, creamos un nuevo archivo.
New-Item -ItemType File -Path C:\Temp\pwd.txt
A continuación colocamos nuestra contraseña cifrada en este archivo. Aquí tenemos que proporcionar el nombre del certificado (cn=pewa2303) que definiste en el primer paso.
'password' | Protect-CmsMessage -To cn=pewa2303 -OutFile C:\Temp\pwd.txt
Una rápida comprobación muestra lo que pasó:
Bien, tenemos un archivo cifrado con nuestra contraseña. Y eres el único en este planeta que puede descifrarlo (¡recuerda la clave privada!):
Unprotect-CmsMessage -Path C:\Temp\pwd.txt
Usar ese método para conectarse a hosts remotos
El cmdlet Enter-PSSession ofrece un parámetro de credencial. Nuestro primer paso es almacenar la contraseña en una variable.
$password = ConvertTo-SecureString (Unprotect-CmsMessage -Path C:\Temp\pwd.txt) -AsPlainText -Force
Luego creamos un nuevo objeto PSCredential. Complete su nombre de usuario.
$cred= New-Object System.Management.Automation.PSCredential ('sid-500\administrator', $password )
De ahora en adelante podemos usar esta variable credencial $cred para conectarnos a hosts remotos.
Enter-PSSession -ComputerName dc01 -Credential $cred
Pero este enfoque es engorroso y aburrido. Entonces, automaticemos eso.
Una nueva función: Enter-PSSessionPW
Abra PowerShell ISE. Copie el siguiente código.
function Enter-PSSessionPW {
[CmdletBinding()]
param (
[Parameter(Position=0)]
$ComputerName='localhost'
)
$password = ConvertTo-SecureString (Unprotect-CmsMessage -Path C:\Temp\pwd.txt) -AsPlainText -Force
$cred= New-Object System.Management.Automation.PSCredential ("sid-500\administrator", $password)
Enter-PSSession -ComputerName $ComputerName -Credential $cred
}
Presione el botón verde. El comando ahora está disponible y utiliza su contraseña en el archivo cifrado. El valor predeterminado para el parámetro nombre de computadora es localhost.
Supongamos que otro usuario inicia sesión en la computadora. Este usuario no puede descifrar el archivo porque no tiene la clave privada. Por tanto, el comando no funcionará.
Hazlo permanente
Si le gusta mi enfoque, abra PowerShell ISE. Copie la función en su sesión ISE. Cree una carpeta en C:\Program Files\Windows PowerShell\Modules y guarde el código como archivo psm1. Asegúrese de que el nombre de su archivo y el nombre de la carpeta coincidan.
De ahora en adelante, PowerShell cargará el módulo personalizado cada vez que se inicie PowerShell.
Preocupaciones de seguridad
Siempre es mejor no anotar tu contraseña en ningún lado. En el escenario que se muestra arriba, la contraseña se almacena en forma cifrada. Recuerde que cualquiera que acceda a su certificado puede descifrar su contraseña. Tenga en cuenta que el certificado se almacena en una memoria separada, pero cualquier persona que pueda acceder a su PC desbloqueada también podrá acceder al certificado. Considere los siguientes escenarios.
Vulnerabilidades
- El administrador podría cambiar la contraseña del usuario e iniciar sesión con las credenciales del usuario. Entonces el administrador tiene acceso al certificado y a su clave privada.
- Alguien podría iniciar la computadora con un disco de arranque, como Hiren's Boot. Luego puede restablecer la contraseña de la cuenta del usuario, puede iniciar sesión como este usuario y robar el certificado.
Contramedidas
- Instale BitLocker Drive Encryption para asegurarse de que nadie pueda iniciar su computadora con un disco de arranque.
- Asegúrate de ser el único administrador del ordenador
- El certificado debe configurarse para que la clave privada no se pueda exportar y el certificado debe provenir de una autoridad certificadora oficial.


















