CZ 
14.09.2024 Radka VÍTEJTE V MÉM SVĚTĚ

Protokol SSL/TLS - vypnutí slabých šifer a zabezpečení serverů

Upraveno 13.11.2014 10:06 | vytvořeno | Petr Bouška - Samuraj |
V minulém článku jsme se podívali jak detekovat, že náš webový/aplikační server není nastaven správně (je zranitelný) z pohledu SSL/TLS. Dnes se podíváme na konfiguraci rozšířených serverů, aby byl SSL/TLS protokol relativně zabezpečen. Věnovat se budeme serverům Apache HTTP Server, Apache Tomcat, Microsoft Windows a IIS (Internet Information Services) a nativní Javě (JSSE). Popíšeme jak vypnout slabé šifry (disable weak ciphers) a ochránit se proti některým zranitelnostem (vulnerability).
zobrazeno: 22 068x | Komentáře [0]

Pokud na webovém serveru zapneme využití šifrování SSL/TLS, tak můžeme konfigurovat různé parametry. Většinou máme možnost omezit použité šifry, tak můžeme zakázat slabé šifry, a nastavovat jejich pořadí, abychom preferovali Forward Secrecy. Ve výchozím nastavení jsou většinou povolené všechny. Podíváme se na nastavení nejrozšířenějších webových/aplikačních serverů.

Apache HTTP Server

Webový server Apache využívá pro SSL/TLS knihovnu OpenSSL. Z toho plynou výhody i nevýhody. Pokud je v této knihovně nějaká zranitelnost (jako v poslední době Heartbleed bug a další), tak je zranitelný i tento server. Obecně je dobré používat nejnovější verzi OpenSSL a také Apache serveru, protože například podpora eliptických křivek (a tedy ECDHE, který je doporučovaný kvůli vlastnosti Forward Secrecy) je až od verze Apache 2.3.3, v této verzi byla také přidána podpora OCSP Stapling (která se doporučuje využívat). Od verze Apache 2.4.7 se provádí automatické nastavení Diffie-Hellman parametrů (dříve se vždy použilo 1024 bitů). Pro využití protokolu TLSv1.1 a TLSv1.2 je potřeba OpenSSL minimálně verze 1.0.1.

Pozn.: V souvislosti s útokem POODLE byl do OpenSSL 1.0.1j zapracován automaticky podporovaný bezpečnostní prvek TLS_FALLBACK_SCSV.

OpenSSL také obsahuje nástroje pro práci s certifikáty, jako je vystavení žádosti (a privátního klíče), vytvoření self-signed certifikátu, převody formátů, kontroly či odstranění hesla (passphrase) z privátního klíče.

Konfigurace Apache

Apache využívá modul mod_ssl a konfigurace se provádí pomocí direktiv většinou v hlavním konfiguračním souboru (httpd-ssl.conf či httpd.conf). Direktivy se zadávají převážně do části server config nebo virtual host. Oficiální dokumentace Apache Module mod_ssl.

Některé z používaných direktiv:

  • SSLEngine - zapnutí SSL/TLS
  • SSLCompression - dovoluje zapnout kompresi, není doporučováno, protože umožňuje útok CRIME, příkaz je dostupný až od verze 2.2.24, ve verzích 2.2.24 a 2.2.25 byla default hodnota on a teprve poté off
  • SSLHonorCipherOrder - normálně se na výběr šifry používá preference klienta, takto můžeme použít preferenci serveru
  • SSLProtocol - povolené protokoly
  • SSLCipherSuite - povolené šifry, zadává se seznam oddělený dvojtečkou, využívají se předpony + pro přidání na dané místo seznamu, - odebrání, ! kompletní odebrání (nemůže se jiným způsobem přidat), bez předpony znamená přidání do seznamu
  • SSLRequireSSL - vynucení použití SSL
  • SSLVerifyClient - ověření klienta pomocí certifikátu
  • SSLCertificateFile - PEM-encoded (Base64) X.509 certifikát serveru (textový formát začínající -----BEGIN CERTIFICATE-----), přípona pem, cer, crt, certifikát může být včetně privátního klíče, pokud chceme využívat více šifer (autentizace), tak můžeme použít paralelně více certifikátů různých typů (RSA, DSA, eliptické křivky ECC - ECDSA)
  • SSLCertificateKeyFile - PEM-encoded privátní klíč k certifikátu serveru, přípona key
  • SSLCertificateChainFile - jeden soubor, který může obsahovat více PEM-encoded certifikátů autorit spojených dohromady (umístěných za sebe do souboru), první je certifikát autority, která vydala serverový certifikát, dále se může pokračovat v řetězu až ke kořenové autoritě, tyto certifikáty pak server posílá prohlížeči spolu se serverovým certifikátem, přípona pem, cer, crt
  • SSLCACertificateFile - certifikát CA (nebo více v jednom souboru) pro ověření klientských certifikátů

Příklad konfigurace SSL s optimalizovanými šiframi (jsou vypnuty slabé a nebezpečné a určeno pořadí)

SSLEngine on
SSLCompression off
SSLHonorCipherOrder on

SSLProtocol All -SSLv2 -SSLv3
SSLCipherSuite EECDH+AES:EDH+AES:EDH+CAMELLIA:EECDH+3DES:EDH+3DES:RSA+AES:RSA+CAMELLIA:RSA+3DES

SSLCertificateFile /path/to/certificate
SSLCertificateKeyFile /path/to/private/key
SSLCertificateChainFile /path/to/CA_certificates

Pozn.: Zapnutí SSL a soubor s certifikátem bychom patrně umístili do části VirtualHost, ostatní do hlavní části. V novějších verzích Apache je již SSLv2 úplně nepodporováno a není součástí All. Změny se projeví po restartu serveru (nebo načtení konfigurace).

Volba protokolů a šifer

Důležité a složité je zvolit vhodný soubor šifer v direktivě SSLCipherSuite a použité protokoly v SSLProtocol. Možností je mnoho a asi žádná není ideální. Protokol SSL 2 určitě zapínat nebudeme a dobré je vypnout i SSL 3, to by mělo ovlivnit pouze Internet Explorer 6 v defaultním stavu (v konfiguraci můžeme podporu TLS 1.0 zapnout).

Pokud podporujeme TLS 1.0 (což asi ano), tak se musíme rozhodnout, jestli využít slabou šifru RC4 nebo ji zakázat a být zranitelní útokem BEAST (ten se dnes bere jako menší zlo). Podobně pro nejstarší klienty na Win XP (pokud je chceme podporovat), zda využijeme RC4 nebo 3DES.

Dále je dobré seřadit seznam tak, aby na začátku byly šifry podporující Perfect Forward Secrecy. Na internetu najdeme mnoho příkladů nastavení, většinou využívají RC4, ale nejnovější diskuze se kloní k jeho nepoužívání.

Pozn.: Pokud máme certifikát RSA, tak autentizace bude RSA a nebude se nabízet ECDSA nebo DSS, i když je máme nastavené.

Šifry můžeme zadávat přesným výčtem, výčtem skupin nebo třeba povolit vše a vyjmenovat zakázané typy. Zdálo by se mi vhodnější povolit soubor šifer a vyjmenovat zakázané, protože pokud by se v budoucnu doplnila nová šifra, tak bychom ji automaticky podporovali. Ale často je jednodušší vyjmenovat povolené, hlavně protože chceme určit jejich pořadí. Některé další příklady výčtu šifer jsou níže, první varianta je odolná proti BEAST a POODLE při použití SSL 3 (využívá RC4).

SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!SEED

SSLCipherSuite ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH

SSLCipherSuite TLSv1.2:RC4:HIGH:!aNULL:!eNULL:!MD5 

SSLCipherSuite ALL:!EXP:!NULL:!LOW:!SSLv2:!RC2:!RC4:!DES:!IDEA:!SEED:!aNULL:!ADH:!PSK:!MD5:+HIGH:+MEDIUM

Apache Tomcat

Aplikační server Tomcat využívá dvě různé implementace SSL. APR (Apache Portable Runtime) implementaci, která standardně využívá knihovny OpenSSL, nebo JSSE (Jave Secure Socket Extensions) implementaci, což je součást Java runtime. Jaké budeme mít k dispozici protokoly a šifry závisí na použitých knihovnách a jejich verzích. V současnosti je patrně APR s nejnovější verzí OpenSSL lepší volba.

Oficiální dokumentaci (pro Tomcat 7) nalezneme v článcích Apache Tomcat 7 - SSL Configuration HOW-TO, Apache Tomcat 7 - The HTTP Connector.

Pozn.: Úvahy nad protokoly a šiframi jsme si popsali v minulém článku a také u Apache HTTP Server.

Konfigurace SSL/TLS pro Tomcat se provádí v souboru server.xml. Co se týká SSL/TLS tak jde převážně o element Connector, kam zadáváme různé atributy. Zda se použije implementace APR nebo JSSE se volí automaticky podle instalace Tomcatu (pro APR musíme mít speciální) nebo můžeme definovat ručně atributem protocol.

  • HTTP/1.1 - použije automatickou volbu
  • org.apache.coyote.http11.Http11Protocol - blocking Java connector (BIO JSSE)
  • org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector (NIO JSSE)
  • org.apache.coyote.http11.Http11AprProtocol - APR connector (knihovna musí být dostupná)

Několik dalších atributů je společných pro obě implementace, ty hlavní jsou:

  • port - TCP port, kde se vytvoří server socket pro příchozí spojení
  • protocol - použitý protokol, viz. výše
  • SSLEnabled - zapnutí SSL/TLS na konektoru
  • scheme - jméno protokolu pro aplikaci
  • secure - informace o SSL pro aplikaci

Další atributy pro konfiguraci SSL jsou rozdílné pro JSSE nebo APR, také se liší formát certifikátů. Po úpravě konfigurace je třeba restartovat server.

JSSE SSL - nativní Java BIO, NIO

V tomto případě záleží na tom, jakou Javu používáme, například OpenJDK je na tom s podporou šifer hůře, než Oracle JDK. Navíc můžeme použít jinou krypto implementaci (umístěním JAR souboru do složky ext a nastavením provider seznamu v souboru java.security), například Bouncy Castle, která je lepší. Oracle Java podporuje TLS 1.2 až od verze 7.

Tomcat (Java) využívá soubor keystore, kam se ukládají certifikáty a privátní klíče pro server. Pro práci s tímto souborem můžeme použít nástroje OpenSSL, ale spíše se využívá keytool, který je součástí JRE (Java Runtime Environment). Keystore může být ve formátu JKS (Java KeyStore), tedy standardní Java formát obsluhovaný nástrojem keytool, PKCS11 a PKCS12 (Public-Key Cryptography Standards #12). PKCS12 je internetový standard, standardně používá přípony p12 nebo pfx, je využíván ve Windows a pracovat s ním umí třeba OpenSSL. Pokud použijeme jiný formát než JKS, tak musíme určit v konfiguraci keystoreType="PKCS12".

Používané atributy

  • sslProtocol - jedna hodnota určující povolené protokoly
  • sslEnabledProtocols - seznam povolených protokolů oddělených čárkou (používá se od Tomcat 6.0.38, ve starších verzích slouží stejně sslProtocols)
  • ciphers - seznam povolených šifer oddělených čárkou (hodnota ALL povolí všechny)
  • keystoreFile - keystore soubor
  • keystoreType - typ keystoru
  • keystorePass - heslo ke keystoru
  • clientAuth - klientská autentizace certifikátem

Názvy šifer a protokolů, jak je využívá Java, nalezneme v dokumentaci Java Cryptography Architecture Standard Algorithm Name Documentation. Pravidla jsou podobná, jako jsme popsali dříve. Navíc Java (patrně do verze 8) používá pro DHE klíče o velikosti 768 bitů, které nejsou bezpečné (Java 8 by toto měla řešit), takže se doporučuje použít pouze ECDHE. Nemůžeme určit pořadí šifer, takže nemůžeme preferovat Forward Secrecy, toto je podporováno od Tomcat 8Java 8.

Java má standardně omezení na silné šifry, pokud chceme využít 256 bit AES (a ne pouze 128 bit), tak musíme stáhnout a nainstalovat (zkopírovat dva malé soubory do složky JDK/JRE) JCE Unlimited Strength Jurisdiction Policy Files.

Příklad konfigurace

<Connector protocol="org.apache.coyote.http11.Http11Protocol" 
    port="8443" SSLEnabled="true" scheme="https" secure="true" 
    sslProtocol="TLS" sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"
    ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"
    clientAuth="false"
    keystoreFile="/path/to/PKCS12certificate"
    keystoreType="PKCS12"
    keystorePass="passw"
    maxThreads="200" acceptCount="100" />

APR - OpenSSL

Když používáme knihovnu OpenSSL, tak je vše podobné, jak jsme si popsali pro Apache HTTP Server (potřebná verze 1.0.1, aby podporovala TLSv1.1 a TLSv1.2, způsob konfigurace, atd.). V současnosti je využití OpenSSL lepší než JSSE, protože podporuje novější šifry. Zde si uvádíme pouze hlavní atributy.

  • SSLProtocol - povolené protokoly, v současnosti můžeme použít pouze klíčová slova ALL, SSLv2, SSLv3 a TLSv1 a jejich kombinaci se znakem plus, zápis ALL je stejný jako SSLv3+TLSv1 a povolí SSL 3, TLS 1.0, TLS 1.1, TLS 1.2, pokud použijeme TLSv1, tak dostaneme pouze TLS 1.0, v současnosti není možné blokovat SSL 3 a povolit všechny tři TLS (podle changelogu má být toto možné v připravované verzi Tomcat 7.0.57)
  • SSLCipherSuite - povolené šifry
  • SSLHonorCipherOrder - server určuje pořadí šifer
  • SSLVerifyClient - klientská autentizace certifikátem
  • SSLDisableCompression - vypnutí SSL komprese, dostupné od verze 7.0.36

Příklad konfigurace

<Connector protocol="org.apache.coyote.http11.Http11AprProtocol" 
   port="8443" SSLEnabled="true" secure="true" scheme="https" 
   SSLProtocol="ALL" 
   SSLCipherSuite="EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!SEED"
   SSLHonorCipherOrder="true" SSLDisableCompression="true" 
   SSLCertificateFile="/path/to/certificate"
   SSLCertificateChainFile="/path/to/CA_certificates"
   SSLCertificateKeyFile="/path/to/private/key"
   SSLPassword="passw"
   maxThreads="200" acceptCount="100" />

V příkladu je seznam šifer s využitím RC4, kvůli útoku POODLE a BEAST. Pokud bychom vypnuli SSL 3, tak můžeme použít stejný seznam, jak u Apache.

   SSLCipherSuite="EECDH+AES:EDH+AES:EDH+CAMELLIA:EECDH+3DES:EDH+3DES:RSA+AES:RSA+CAMELLIA:RSA+3DES"

Microsoft Windows a IIS (Internet Information Services)

Microsoft používá pro SSL/TLS systémovou knihovnu schannel.dll, takže tato je využívána i v IIS. Záleží na verzi operačního systému jaké protokoly a šifry jsou defaultně povoleny a jaké podporovány.

Windows Server 2003 nepodporuje TLS 1.1 a TLS 1.2, eliptické křivky, standardně nepodporuje šifrování AES, to ale můžeme dodat pomocí hotfixu KB948963, popis je v článku An update is available to add support for the TLS_RSA_WITH_AES_128_CBC_SHA AES128-SHA and TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA AES cipher suites in Windows Server 2003. Také nemůžeme určit preferované pořadí šifer.

Ještě na Windows Server 2008 R2 (a tedy IIS 7.5) je defaultně povolen nebezpečný protokol SSLv2. Jde o první systém, který podporuje TLSv1.1 a TLSv1.2, ale tyto nejsou zapnuté. Windows Server 2012 je na tom o dost lépe, ale pořád můžeme nastavení vylepšit. Protokol SSL 2 je vypnutý a všechny tři verze TLS jsou povolené. Používají se šifrovací algoritmy RC4, 3DES a AES a hashe MD5 a SHA.

Pozn.: Při úpravě nastavení pro Windows si musíme dát pozor a vše důkladně otestovat. Protože nastavení ovlivní vše, kde Windows používají SSL/TLS, tedy třeba i RDP protokol. Tato systémová nastavení ovlivňují i takovou aplikaci jako je Forefront Threat Management Gateway.

Celá konfigurace SSL/TLS (tedy nastavení schannel.dll) se provádí pomocí úpravy registrů a nachází se v cestě HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL. Oficiální popis má Microsoft v KB How to restrict the use of certain cryptographic algorithms and protocols in Schannel.dll. Nějaký (určitě ne ideální) seznam podporovaných šifer je v dokumentu Cipher Suites in Schannel.

Pozn.: Seznam šifer je omezený (třeba oproti OpenSSL), takže třeba není podporováno DHE-RSA, ale pouze DHE-DSS. Pokud nebudeme mít daný typ certifikátu, tak nám tuto šifru nebude server nabízet.

Pořadí šifer můžeme navíc definovat pomocí skupinových politik (GPO). V Group Policy jde o Computer Configuration/Policies/Administrative Templates/Network/SSL Configuration Settings/SSL Cipher Suite Order, malý popis je v článku Prioritizing Schannel Cipher Suites.

Nastavení pomocí PowerShellu

Úpravu nastavení můžeme provést přímou změnou registrů nebo k tomu samému využít PowerShell. Takový hezký skript i s komentáři napsal Alexander Hass a je uveden v článku Setup your IIS for SSL Perfect Forward Secrecy and TLS 1.2. Já bych oproti použitým nastavením zablokoval i RC4 a MD5. Níže uvádím takto lehce upravený skript (doporučuji se podívat na originál).

Skript v PowerShellu provede změnu registrů. Jde o zakázání SSL 2.0 a PCT 1.0 (pro jistotu, je již od Windows Server 2003 defaultně vypnutý, jde o starý MS protokol), povolení (nastavení) TLS 1.0, TLS 1.1, TLS 1.2. Dále vypnutí slabých šifer NULL, RC2, RC4, DES a povolení 3DES a AES (některé hodnoty jsou již defaultně nastaveny stejně), zakázání MD5 a povolení SHA, povolení KeyExchange algoritmů DH a PKCS (součástí je RSA). A nakonec nastavení pořadí šifer. Je třeba jej spustit s právy administrátora. Některé změny nastavení se projeví rovnou, některé až po restartu serveru. Skript jsem zkoušel na Windows Server 2008 R2.

Pozn.: Než začneme měnit registry, tak je dobré si udělat zálohu. Pomocí regedit nebo třeba příkazem reg export HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL zaloha-schannel.reg

# vypnutí SSL 2.0, PCT 1.0, zapnutí/nastavení TLS 1.0, TLS 1.1, TLS 1.2
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server' -name Enabled -value 0 -PropertyType 'DWord' –Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server' -name Enabled -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value 1 -PropertyType 'DWord' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force

# vypnutí a zapnutí šifer
$insecureCiphers = 'NULL','RC2 40/128','RC2 56/128','RC2 128/128','RC4 40/128','RC4 56/128','RC4 64/128', 'RC4 128/128','DES 56/56'
Foreach ($insecureCipher in $insecureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($insecureCipher)
  $key.SetValue('Enabled', 0, 'DWord')
  $key.close()
}
$secureCiphers = 'Triple DES 168/168','AES 128/128','AES 256/256'
Foreach ($secureCipher in $secureCiphers) {
  $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher)
  $key.SetValue('Enabled', 0xffffffff, 'DWord')
  $key.close()
}

# vypnutí a zapnutí hash algoritmů
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5' -name Enabled -value '0' -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

# zapnutí KeyExchange algoritmů
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force
md 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -Force
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS' -name Enabled -value '0xffffffff' -PropertyType 'DWord' -Force

# nastavení pořadí šifer
New-ItemProperty -path 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002' -name 'Functions' -value 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA' -PropertyType 'String' -Force

Na Windows Server 2003 hůře spustíme PowerShell, tak níže je ukázka reg souboru pomocí kterého můžeme upravit registry. Neobsahuje zbytečně nastavení nepodporovaných TLS 1.1, TLS 1.2 a pořadí šifer.

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL]
"EventLogging"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 128/128]
"Enabled"=dword:ffffffff
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 256/256]
"Enabled"=dword:ffffffff
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\NULL]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 128/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 40/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC2 56/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 128/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 40/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 56/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\RC4 64/128]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168/168]
"Enabled"=dword:ffffffff
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\MD5]
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA]
"Enabled"=dword:ffffffff
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman]
"Enabled"=dword:ffffffff
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS]
"Enabled"=dword:ffffffff

Nastavení pomocí aplikace IIS Crypto

PowerShell skript můžeme využít pro nastavení celé skupiny serverů. Pokud nastavujeme pouze jeden server, tak se může hodit malá a pěkná aplikace v .NETu IIS Crypto od Nartac Software. Podporuje Windows Server 2003, 2008, 2008 R2, 2012, 2012 R2. Můžeme pomocí ní nastavit povolené protokoly, šifry, hash i algoritmy pro výměnu klíčů, také můžeme sestavit pořadí šifer. Navíc jsou zde tlačítka pro doporučené nastavení. Jediná vada na kráse je, že třeba i na Windows Server 2003 ukazuje protokol TLS 1.2, který zde ale podporovaný není.

Nartac IIS Crypto

Zranitelnost TLS/SSL Renegotiation

V knihovně SChannel je známa zranitelnost SSL 3.0 a TLS 1.0 protokolu CVE-2009-3555 Insecure Client-Initiated Renegotiation, která tím pádem ovlivňuje IIS, ale také třeba ISA / TMG. Řešením je konfigurace Renegotiation pomocí registrů, můžeme zapnout bezpečné vyjednávání (dle RFC 5746) nebo jej úplně vypnout. Microsoft upozorňuje, že změna může způsobit nějaké problémy (určitým aplikacím při autentizaci certifikátem), takže je dobré důkladně otestovat.

Tato vlastnost se do starších Windows doplní pomocí instalace patche KB980436 a případně KB977377 (dostupný na Windows Update) od Windows Server 2008 R2 je součástí systému. Popis v článcích Microsoft Security Advisory 977377, Microsoft Security Bulletin MS10-049 - Critical, ISA 2006 / TMG 2010: DISABLE CLIENT-INITIATED SSL RENEGOTIATION, PROTECTING AGAINST DOS ATTACKS AND MALICIOUS DATA INJECTION.

Nastavení se provádí v registrech v cestě HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL, kde vytvoříme požadované DWORD hodnoty.

  • AllowInsecureRenegoClients - 1 kompatibilní mód, klient se připojí ke všem serverům, 0 striktní mód, klient použije renegotiation pouze se servery s bezpečnou metodou
  • AllowInsecureRenegoServers - 1 kompatibilní mód, server povolí všechny klienty, 0 striktní mód, server vyžaduje klienty s bezpčeným vyjednáváním
  • DisableRenegoOnClient - 1 vypnuto, klient nepoužívá renegotiation, 0 nebo neexistuje klíč zapnuto
  • DisableRenegoOnServer - 1 vypnuto, server nepoužívá renegotiation, 0 nebo neexistuje klíč zapnuto

Pozn.: Nastavení v registrech nevyžaduje restart, ale projeví se hned.

Java aplikace a JSSE

Java aplikace a webové servery často využívají nativní implementaci SSL/TLS zvanou Jave Secure Socket Extensions (JSSE). To jsme již zmiňovali u Tomcatu. Pokud nemáme možnost konfigurace SSL na straně aplikace/serveru, tak můžeme konfigurovat přímo Javu a omezit/nastavit používané šifry. Příkladem webového serveru je Jetty, ten využívá například rozšířený XMPP server OpenFire, ten navíc používá knihovnu Bouncy Castle.

Konfigurace (je dostupná až pro Java 7) se provádí v souboru java.security, který se nachází v Install_Home\jre\lib\security\ (třeba /usr/lib/jvm/java-1.7.0/jre/lib/security či c:\Program Files (x86)\Java\jre7\lib\security\java.security). Zde můžeme specifikovat zakázané algoritmy pro certifikáty.

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

A hlavně zakázané šifry pro SSL/TLS.

jdk.tls.disabledAlgorithms=MD2, MD5, RC4, DES, NULL, RSA keySize < 2048

Problém je zablokovat nějaký protokol, třeba protokol SSL 3, základní info je v článku Instructions to disable SSL v3.0 in Oracle JDK and JRE. Na mnoha místech zmiňovaný parametr -Dhttps.protocols="TLSv1" mi nikde nezafungoval (Jetty, OpenFire, Tomcat).

Další odkazy

Související články:

Protokol SSL/TLS

Protokol Secure Sockets Layer a jeho nástupce Transport Layer Security se hojně využívají na internetu pro zabezpečení komunikace jiného protokolu (třeba HTTPS, SMTPS, XMPP) pomocí šifrování.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže.

Komentáře

Zatím zde nejsou žádné komentáře.

Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách