Corrupción de las claves RSA y la importancia de hacer backup

Recientemente he trabajado en un caso en el que tras reiniciar un servidor Windows Server 2003, el servicio IIS Admin Service fallaba en el arranque con el siguiente mensaje de error:

  

Windows could not start the IIS Admin Service on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code -2146893813.

 
Adicionalmente, en el log de eventos de sistema se registraba el siguiente error:

  

Manuel: Event Type: Error
Event Source: Service Control Manager
Event Category: None
Event ID: 7024
Date: 23/05/2012
Time: 11:40:35
User: N/A
Computer: IIS6-Server
Description:
The IIS Admin Service service terminated with service-specific error 2148073483 (0x8009000B).

 

El código de error 0x8009000B se corresponde a NTE_BAD_KEY_STATE (“Key not valid for use in specified state”o “Clave no válida para utilizar en el estado especificado” en castellano) e indica un error al utilizar unas claves de encriptación.

IIS 6.0 cifra algunos campos del fichero XML de configuración (metabase.xml) con información sensible como contraseñas de cuentas de servicio. Para esto, IIS 6.0 crea un contenedor de claves criptográficas durante la instalación del servicio llamado “Microsoft Internet Information Server”. Este contenedor de claves está almacenado físicamente en el fichero %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys\c2319c42033a5ca7f44e731bfd3fa2b5_<MachineGuid>. El valor de MachineGuid se puede obtener de la siguiente clave del registro y será distinto en cada servidor: 
  

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography]

"MachineGuid"="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

 
Con la herramienta certutil podemos volcar cierta información de este contenedor de claves, y entre otras cosas podemos ver que las claves privadas no son exportables, por lo que el fichero metabase.xml cifrado con estas claves únicamente podrá ser descifrado en el mismo servidor donde fue creado.
  

C:\WINDOWS\system32>certutil -v -key "Microsoft Internet Information Server"

Microsoft Strong Cryptographic Provider:

Microsoft Internet Information Server

c2319c42033a5ca7f44e731bfd3fa2b5_809cf898-e06e-4673-83e2-6200ef0291cc

AT_SIGNATURE:

Key Id Hash(sha1): d0 31 ed 58 81 bf 61 b9 a3 76 99 cb 17 ad ce 88 ff b7 b8 cd

Container Public Key:

000030 48 02 41 00 cd c2 bab5 47 a7 2b 2f 57 4b ae

0010a7 fe 26 9c a2 ed f3 f958 36 df 8f 35 31 1c c0

002032 2c 35 8c 42 68 84 0dc2 4d dd 9a fd 5d 87 0f

0030b2 b9 33 d4 1b bc 62 647c bd d7 6c 59 6e c1 85

0040b3 46 73 2c 59 02 03 0100 01

Private key is NOT exportable

AT_KEYEXCHANGE:

Key Id Hash(sha1): 4f 50 e1 14 9f 63 73 0b ef ae 7c 34 e5 1d 6b d2 eb 1b 59 27

Container Public Key:

000030 48 02 41 00 a3 aa e0ee 9f 45 e9 b4 6c 4d 11

001044 96 39 f8 f6 51 ec 9014 60 1f 57 6e 10 d2 f4

002069 4c c1 1f 09 f5 69 e0fd 75 67 40 00 0d a0 4a

00307d c3 b5 a1 40 b9 20 a65a 3e 1e e9 28 bd aa 2c

00406e 62 64 c9 61 02 03 0100 01

Private key is NOT exportable

CertUtil: -key command completed successfully.

 
IIS 6.0 permite generar backups de la metabase exportables/importables a cualquier servidor, para lo que se utiliza una contraseña en lugar de las claves RSA de máquina para cifrar la metabase. Tener un backup de la configuración de IIS protegido con contraseña puede resultar muy útil como veremos más adelante.
  

clip_image001_thumb

 
Volviendo al problema original, el error 0x8009000B al arrancar el servicio IIS Admin Service típicamente se debe a una corrupción del contenedor de claves de IIS, por lo que el servicio no es capaz de descifrar los campos relevantes al leer el fichero de configuración y por consecuencia fallan en el arranque.

Llegados a esta situación, básicamente tenemos tres opciones, que por orden de preferencia son:  

 
1) Restaurar un backup de system state en el que se restauraría una copia intacta del fichero contenedor de claves c2319c42033a5ca7f44e731bfd3fa2b5_<MachineGuid> lo que permitiría volver a arrancar el servicio de IIS Admin Service.
2) Reinstalar IIS y reconfigurarlo desde un backup de la metabase protegido por contraseña que podamos importar después de la reinstalación.   

3) Reinstalar IIS y reconfigurarlo manualmente desde cero.

      

PROCESO DE REINSTALACIÓN Y RESTAURACIÓN DEL CONTENEDOR DE CLAVES
En caso que fuera necesaria la reinstalación de IIS, los pasos a seguir son los siguientes:

1) Desinstalar el servicio de IIS desde los componentes de Windows.   

2) Eliminar el fichero contenedor de claves de “Microsoft Internet Information Server” en la ruta“%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys\c2319c42033a5ca7f44e731bfd3fa2b5_<MachineGuid>”.

3) Reinstalar IIS.

4) Importar el backup de la metabase protegido por contraseña.

5) Añadir las cuentas configuradas como identidad de los application pool al grupo de seguridad IIS_WPG (IIS Worker Process Group) de nuevo, dado que el grupo de seguridad se vuelve a crear tras la reinstalación.

 
Si tenemos varios servidores configurados idénticamente, técnicamente es posible importar un backup de la metabase que ha sido exportado desde otro servidor distinto. No obstante, esto implica tener que modificar manualmente algunas cosas adicionales como sincronizar las cuentas IUSR_<serverName> e IWAM_<serverName> y sus contraseñas, o modificar los bindings de los sitios web en caso de que escuchen por IPs distintas en los distintos servidores de la granja.

En definitiva, haced backup del system state y de la metabase regularmente, y espero que nunca tengáis que hacer uso de este post.   

 
- Daniel Mossberg