Sembla que el procediment habitual per renovar un certificat per HTTPS a l'IIS es iniciar una petició de renovació, enviar-la a l'entitat certificadora (Verisign, per exemple), esperar l'arxiu de resposta i importar-ho dintre del teu IIS.
Però, què fer si ens envien la renovacio amb un CSR antic? Reps un email amb un tros del tipus:
-----BEGIN CERTIFICATE-----
AoGBAOv4w3UeEEarsyIXsBL1zdBi67fC7jFiqhbs0f7/tDRuvnQvj5V7NF7Awhah
9K3J9fPkOPMfTBMmQCFVTLAlUxioh1jLEZOWDPvrB8h7msO5gM1MpufOh4NRS79J
LvyOKdDtXGfYdVRj/TNpNTFu10wLO2y9o8HAkRUlkCDb/xS3AgMBAAGjggF6MIIB
djAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDBGBgNVHR8EPzA9MDugOaA3hjVodHRw
Oi8vY3JsLnZlcmlzaWduLmNvbS9DbGFzczNJbnRlcm5hdGlvbmFsU2VydmVyLmNy
f4&dBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBz
(...)
-----END CERTIFICATE-----Com importar això dintre del nostre IIS? S'han de seguir aquestes passes:
Primer exportem el certificat actual. Per fer-ho hem d'anar a les propietats del site, a l'apartat "Directory Security":
Iniciem l'assistent fent click a "Server Certificate" i anem a la següent pantalla:
Fem click a "Next" i anem a la següent pantalla:
On escollirem "Export the current certificate to a .pfx file". Despres ens demanara on ho volem guardar:
I una contrassenya per l'export. D'aquesta forma ja tenim el certificat exportat.
Si mirem el contingut de l'arxiu, veurem que es binari. Per convertir-ho al mateix format que el que hem rebut per email, podem fer servir openssl, amb aquesta comanda:
openssl pkcs12 -in cert.pfx -out cert.pemEns demanarà la contrassenya que hem posat abans al .pfx, i ens demanarà una contrassenya per posar-li a l'arixu .pem resultant.
Si editem aquest fitxer amb qualsevol editor de text, veurem que conté un "certificate" delimitat per les clausules "BEGIN CERTIFICATE" y "END CERTIFICATE", exactament igual que el que ens han enviat per correu. Només hem de substituir el text de l'anterior certificat pel nou. Un cop ho tinguem, ho hem de tornar a la forma binaria que "enten" l'IIS. Per fer-ho, un altre cop amb openssl:
openssl pkcs12 -export -in cert.pem -out cert-new.pfxEns demanarà la contrassenya que li hem posat al .pem, i una altra per posar-li al .pfx resultant.
Ara per posar-ho a l'IIS, primer hem de treure el que hi havia. A la plana de "Directory Security" d'abans hem d'iniciar l'assistent una altra vegada, però aquesta vegada escollir "Remove the current certificate":
Seguint "next next" acabarem treien el certificat antic:
I ara hem d'importar el certificat nou. En l'assistent veurem que ens ha aparegut una opció que abans no estava: "Import certificate from a .pfx file":
Ens demanarà quin fitxer volem importar, i haurem d'escollir el cert-new.pfx. Ens demanarà la contrassenya que hem posat, el port on volem que escolti (normalment deixarem el 443) i finalment haurem importat el certificat
Si mirem les propietats, veurem que ha canviat la data d'expiració. Ja tenim el certificat renovat!
Acabo de descobrir que a partir de debian lenny, i a Ubuntu/KUbuntu (no sé si a la 8.04 hi era, pero a la 8.10 segur que hi és), l'aplicacio winexe, de la que vam parlar aqui i feiem servir, per exemple, en els nostres scripts per matar processos o aconseguir una shell remota, s'instal·la amb el paquet wmi-client. És a dir, que per instal·lar-ho només haurem de fer:
apt-get install wmi-clientI llestos! Suposo que per SuSE i RedHat tambe deu estar empaquetada... algú m'ho pot confirmar?
Si volem comprovar des de la nostra consola linux el registre d'un servidor windows (sense haver de connectar-nos-hi per terminal server, podent fer un grep dels resultats, etc, etc, etc), aqui tenim la eina!
Els paràmetres que passem al psloglist son:
-d 1 perquè només tregui els logs de l'últim dia (no volem que ens matxaqui a logs)
-f we perquè només apareguin warnings i errors (normalment son els únics que interessen)
$2 aquest es el segon parametre que li passem. Si volem veure nomes el registre "application", o "system" (que son habitualment els que interessen) només ho has d'indicar
#!/bin/bash
[ $# -lt 1 ] && echo "Error, I need at least one argument" && echo "Use: $0 server [system|security|application]" && exit 1
PROGPATH=`echo $0 | /bin/sed -e 's,[\\/][^\\/][^\\/]*$,,'`
$PROGPATH/winpsexec.sh $1 "pstools\\psloglist -d 1 -f we $2"En la linia en la que estavem en posts anteriors , si hem plantat la llavor amb el psexec, ara fer utilitats es senzillissim. Tres exemples:
winshell.sh
Amb aquesta utilitat aconseguim un shell al servidor windows que volguem. No fa servir el psexec perque no li cal, el cmd esta al path.
#!/bin/bash
[ $# -ne 1 ] && echo "Error, I need one argument" && echo "Use: $0 server" && exit 1
PROGPATH=`echo $0 | /bin/sed -e 's,[\\/][^\\/][^\\/]*$,,'`
. $PROGPATH/winvars.sh
winexe //$1 "cmd" $PSCREDENTIALSwininfo.sh
Amb aquesta utilitat podem aconseguir informació sobre el servidor. Memòria RAM física, versio de SO, uptime, numero de processadors, freqüència dels mateixos, i el driver de la tarja de video. Aquest últim detall sembla de poca importància, serveix per saber si una màquina es virtual o física. Si el driver es quelcom com "VMware SVGA II", aleshores es una màquina virtual. Si el driver es quelcom com "ATI Technologies Inc. 3D RAGE IIC PCI", aleshores es una màquina física.
#!/bin/bash
[ $# -ne 1 ] && echo "Error, I need one and only one argument" && exit 1
PROGPATH=`echo $0 | /bin/sed -e 's,[\\/][^\\/][^\\/]*$,,'`
$PROGPATH/winpsexec.sh $1 pstools\\psinfowinkill.sh
Com el seu nom indica, serveix per matar algun procés de windows (prèviament podem haver sabut el pid fent servir el winps.sh).
#!/bin/bash
[ $# -ne 2 ] && echo "Error, I need two arguments" && echo "Use: $0 server pid" && exit 1
PROGPATH=`echo $0 | /bin/sed -e 's,[\\/][^\\/][^\\/]*$,,'`
$PROGPATH/winpsexec.sh $1 "pstools\\pskill $2"La següent missió era fer scripts que executessin les diferents pstools remotament. Vaig començar fent-ne un per cada, pero vaig trobar que tots compartien molta part de codi, així que vaig decidir crear un script generic, psexec.sh (en "honor" al psexec de les pstools), al que li poguessim passar el nom del servidor i la eina que voliem executar, amb els seus parametres. I després l'unic que ens quedaria seria crear un wrapper per cada comanda que ens fes la feina mes còmoda.
El script ha de comprovar si les credencials del fitxer són bones, i demanar-ne d'altres si no ho són. Un cop autenticat, ha de comprovar si existeixen les pstools o no, i copiar-les en cas que no.
En la historia completa podreu veure el codi del psexec.sh i d'un wrapper d'exemple, el winps.sh. Recordeu que per funcionar, necessiten dels fitxers winvars.sh i cp_pstools.sh, que apareixien en l'entrada anterior.
En la línia en la que anàvem... Què passa si volem fer servir les pstools en 50 servidors? Una idea és crear una unitat compartida i que tots les executin des d'allà. Pero si tenim alguns en unes xarxes, unes en unes altres (fins i tot en DMZ), amb dominis i sense... No podria haver alguna forma còmoda de copiar-los?
Doncs per aquest motiu he creat aquest petit script, que fa exactament això: copiar les pstools al servidor que volguem. Primer munta la unitat cifs (amb smbmount), després copia els fitxers i després la desmunta.
Està pensat per ser cridat des d'altres scripts. Per exemple, si fem un "winps", primer que comprovi si estan les pstools instal·lades, i si no ho estan, que les copii. Per això, posarem un fitxer de variables que puguin fer servir tots els scripts, de forma que si volem canviar algun parametre no haguem de modificar-los tots. A aquest fitxer li direm "winvars.sh".
En l'article complet podeu mirar el codi i descarregar el fitxer.
Intentes connectar-te via remote desktop (terminal server) al servidor, però et trobes que ja hi ha gent connectada. El maleït missatge:
Què fer en aquest cas? Doncs molt senzill. Donat que tenim la nostra flamant eina winexe , podem fer un petit script que ens faciliti la vida:
#!/bin/bash
[ $# -lt 1 ] && echo "Error: Missing argument" && echo "Use: $0 server [disc #session]" && exit
[ ! -z "$2" ] && [ $2 != disc ] && echo "Error: Can't understand second argument" && echo "Use: $0 server [disc #session]" && exit
[ "$2" == "disc" ] && echo "Disconnecting session $3 from server $1..." && winexe //$1 "logoff $3" -A secretfile && exit
echo "Listing server $1 sessions:"
winexe //$1 "query session" -A secretfileL'arxiu "secretfile" és opcional, és per no haver de posar usuari i contrassenya. El seu contingut és aquest:
domain=YOURDOMAIN
username=user
password=passEs un script sense gaire control d'errors, pero et permet veure qui hi ha connectat:
user@server:~/$ ts.sh server2
Listing server server2 sessions:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
> user1 0 Disc rdpwd
rdp-tcp 65536 Listen rdpwd
Administrator 3 Disc rdpwd
user2 1 Disc rdpwd
console 5 Conn wdcon
user@server:~/$En aquest servidor ja no s'hi pot entrar. Veiem que tothom esta en estat "disconnected", amb la qual cosa no hi ha ningú treballant. Escollim l'usuari que ens caigui pitjor, i el fem fora:
user@server:~/$ ts.sh server2 disc 1
Disconnecting session 1 from server server2...
user@server:~/$ ts.sh server2
Listing server server2 sessions:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
> user1 0 Disc rdpwd
rdp-tcp 65536 Listen rdpwd
Administrator 3 Disc rdpwd
console 5 Conn wdconEt voilà! ja tenim una sessió lliure per connectar-nos a administrar aquest servidor.
Evidentment és molt millor que tothom tanqui el terminal server quan acabi de treballar. Però si has de compartir servidors amb despistats, t'has de buscar la vida...
M'he trobat que executant les pstools directament des de consola, sense entorn gràfic (en el meu cas, fent servir winexe ), es quedava aturat, com penjat. Fent la prova, i connectant-me via remote desktop al servidor, i executant-les a mà, apareix una finestreta amb una EULA (llicencia d'ús) que s'ha d'acceptar. És a dir, que només s'ha de fer click en "Ok, I agree".
En el post anterior en el que parlàvem del winexe, explicàvem com executar comandes del shell de windows mitjançant la nostra consola linux. La intenció original era engegar i aturar serveis ( net start; net stop), però un cop tenim el shell a windows podem anar més enllà i fer moltes més coses. Per això podem fer servir les pstools .
Quan detectes a la teva consola de nagios que un dels serveis de windows està aturat, moltes vegades voldries afegir un event_handler que, en detectar que està aturat, intentés engegar-lo automàticament.
Amb samba fa temps que està previst que incloguin alguna forma de controlar els serveis (un net stop o un net start ), pero no he trobat enlloc que hagi funcionat mai.
Hi ha una eina molt útil: winexe. Amb ella no només es poden engegar i aturar els serveis de windows, sinò que es pot executar qualsevol comanda, fins i tot tenir un shell de windows dintre del teu linux, tan senzill com:
winexe -U HOME/Administrator%Pass123 //host cmd