Menu

Deshabilitando protocolos de encriptación obsoletos con DSC y Azure PowerShell

En este artículo explicaremos como podremos implementar una solución eficaz basada en la característica DSC (Desired State Configuration)  con Azure PowerShell para deshabilitar protocolos de encriptación obsoletos y forzar el uso de TLS 1.2 en aplicaciones .NET con el fin de que los distintos servidores y/o estaciones de trabajo realicen el mejor desempeño posible.

Ya comentábamos en post anteriores como funciona la técnica de administración de sistemas DSC mediante Azure PowerShell que permite administrar la infraestructura de IT y Desarrollo. Pero en este caso, se procederá a deshabilitar el uso de protocolos de encriptación obsoletos (desde SSL 1.0 hasta TLS 1.1), porque actualmente, su uso está desaconsejado al presentar fallas de seguridad. Al mismo tiempo, se forzará el uso del protocolo de encriptación más reciente, TLS 1.2, en las aplicaciones .NET.

 

*Nota: en subsiguientes artículos relacionados con DSC, se irá añadiendo código adicional que lidie con otras configuraciones para, progresivamente, disponer de una plantilla de configuración de seguridad deseable estándar para su uso en entornos de producción.

Creación de la plantilla de configuración DSC:

Con lo visto en el primer artículo sobre DSC, se procede a elaborar un fichero de configuración. Lo siguiente es la estructura que debe tener dicha configuración para realizar lo expuesto al principio de este artículo:

1.   Configuration DSC-GENERAL-CONFIGURATION
2.   {
3.     ######### BASELINES FOR SECURITY ON SERVERS AND WORKSTATIONS #########
4.    
5.     ### 1 - DISABLE INSECURE AND OBSOLETE PROTOCOLS ###
6.    
7.     # Protocol SSL1 on client side
8.     Registry DisableDeprecatedProtocolSSL1Client
9.     {
10.             Ensure    = "Present"
11.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 1.0\Client"
12.             ValueName = "DisabledByDefault"
13.             ValueType = "DWORD"
14.             ValueData = "1"
15.   }
16.  
17.   # Protocol SSL1 on server side
18.   Registry DisableDeprecatedProtocolSSL1Server
19.   {
20.             Ensure    = "Present"
21.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 1.0\Server"
22.             ValueName = "DisabledByDefault"
23.             ValueType = "DWORD"
24.             ValueData = "1"
25.   }
26.  
27.   # Protocol SSL2 on client side
28.   Registry DisableDeprecatedProtocolSSL2Client
29.   {
30.             Ensure = "Present"
31.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 2.0\Client"
32.             ValueName = "DisabledByDefault"
33.             ValueType = "DWORD"
34.             ValueData = "1"
35.   }
36.  
37.   # Protocol SSL2 on server side
38.   Registry DisableDeprecatedProtocolSSL2Server
39.   {
40.             Ensure    = "Present"
41.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 2.0\Server"
42.             ValueName = "DisabledByDefault"
43.             ValueType = "DWORD"
44.             ValueData = "1"
45.   }
46.  
47.   # Protocol SSL3 on client side
48.   Registry DisableDeprecatedProtocolSSL3Client
49.   {
50.             Ensure    = "Present"
51.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 3.0\Client"
52.             ValueName = "DisabledByDefault"
53.             ValueType = "DWORD"
54.             ValueData = "1"
55.   }
56.  
57.   # Protocol SSL3 on server side
58.   Registry DisableDeprecatedProtocolSSL3Server
59.   {
60.             Ensure    = "Present"
61.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\SSL 3.0\Server"
62.             ValueName = "DisabledByDefault"
63.             ValueType = "DWORD"
64.             ValueData = "1"
65.   }
66.  
67.   # Protocol TLS1.0 on client side
68.   Registry DisableDeprecatedProtocolTLS1Client
69.   {
70.             Ensure    = "Present"
71.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.0\Client"
72.             ValueName = "DisabledByDefault"
73.             ValueType = "DWORD"
74.             ValueData = "1"
75.   }
76.  
77.   # Protocol TLS1.0 on server side
78.   Registry DisableDeprecatedProtocolTLS1Server
79.   {
80.             Ensure    = "Present"
81.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.0\Server"
82.             ValueName = "DisabledByDefault"
83.             ValueType = "DWORD"
84.             ValueData = "1"
85.   }
86.  
87.   # Protocol TLS1.1 on client side
88.   Registry DisableDeprecatedProtocolTLS1.1Client
89.   {
90.             Ensure    = "Present"
91.             Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.1\Client"
92.             ValueName = "DisabledByDefault"
93.             ValueType = "DWORD"
94.             ValueData = "1"
95.   }
96.  
97.   # Protocol TLS1.1 on server side
98.   Registry DisableDeprecatedProtocolTLS1.1Server
99.   {
100.                       Ensure    = "Present"
101.                       Key       = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.1\Server"
102.                       ValueName = "DisabledByDefault"
103.                       ValueType = "DWORD"
104.                       ValueData = "1"
105.             }
106.             
107.             ### 2 - FORCE USE OF TLS 1.2 IN .NET APPLICATIONS ###
108.    
109.             # Force the use of TLS 1.2
110.             Registry ForceUseOfTLS1.2Protocol
111.             {
112.                       Ensure    = "Present"
113.                       Key       = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319"
114.                       ValueName = "SchUseStrongCrypto"
115.                       ValueType = "DWORD"
116.                       ValueData = "1"
117.             }
118.   }
119.    

Como se puede ver, consiste en incluir varias entradas en el registro de Windows, de tal manera que DSC lo que hará es asegurarse de que siempre figuren en aquel. En principio, se deshabilitan los protocolos SSL 1.0 a 3.0 y TLS 1.0 a TLS 1.1, tanto en modo cliente (es decir, cuando el servidor/estación de trabajo se conecta a un servicio que usa alguno de estos protocolos, cerrando inmediatamente la conexión) como en modo servidor (impidiendo el uso de dichos protocolos cuando se implementa algún servicio en la máquina).

Ejecución del DSC

Al haber guardado la configuración anterior en un fichero (por ejemplo, con nombre DSC-GENERAL-CONFIG.ps1), se procede a iniciar una consola de PowerShell y se ejecuta lo siguiente:

1.   PS> . .\DSC-GENERAL-CONFIG.ps1

Ello cargará en memoria la configuración como si fuera una función, procediendo a ejecutarla así:

1.   PS> DSC-GENERAL-CONFIGURATION

Si todo ha ido bien, debería haberse generado una carpeta denominada “DSC-GENERAL-CONFIGURATION” y con un fichero en su interior con extensión .MOF:

Se puede comprobar si los ajustes de la máquina cumplen con lo que se ha configurado si se ejecuta el cmdlet “Test-DscConfiguration”:

Como el resultado no es el correcto, se procede a iniciar los trabajos de DSC con la ejecución del cmdlet “Start-DscConfiguration”, de esta forma:

El resultado de la comprobación indicaba que se han realizado los trabajos y el estado de la configuración es el deseado, pudiéndolo comprobar acudiendo al registro y observando las entradas pertinentes:

Asimismo, también se puede comprobar que la entrada adicional para las aplicaciones .NET también fue incluida:

Programar tarea para PowerShell

Por último, y una vez que está comprobado que el estado de la configuración es el deseado, se puede implementar una tarea programada que ejecute el siguiente código en PowerShell, el cual comprobará periódicamente que la configuración se cumple; en caso contrario, volverá a incluir las entradas correspondientes en el registro de Windows:

1.   # Some useful variables
2.   $WORKING_DIRECTORY = '/'
3.   $DSC_CONFIG_FOLDER_NAME = 'DSC-GENERAL-CONFIGURATION'
4.    
5.   # Change to our working directory
6.   cd $WORKING_DIRECTORY
7.    
8.   # Check the DSC configuration status
9.   $STATUS = Test-DscConfiguration ('.\'+$DSC_CONFIG_FOLDER_NAME+'\') | Select-Object -ExpandProperty InDesiredState
10.  
11. # If the status does not match the value True, proceed to reapply
12. # the configuration, otherwise does nothing
13. if ($STATUS -notmatch $true)
14. {
15.   Start-DscConfiguration ('.\'+$DSC_CONFIG_FOLDER_NAME+'\')
16. }
17.  
18.  

 

Dado que se trata simplemente de una comprobación (y que el registro será raramente modificado), la programación de la tarea podría funcionar para periodos más o menos largos, por ejemplo, de 24 horas a 1 semana.

 

Fuentes consultadas