TLS-Proxies und HTTP-Dienste¶
OpenStack-Endpunkte sind HTTP-Dienste, die sowohl Endnutzern in öffentlichen Netzwerken als auch anderen OpenStack-Diensten im Management-Netzwerk APIs bereitstellen. Es wird dringend empfohlen, dass alle diese Anfragen, sowohl intern als auch extern, über TLS operieren. Um dieses Ziel zu erreichen, müssen API-Dienste hinter einem TLS-Proxy bereitgestellt werden, der TLS-Sitzungen einrichten und beenden kann. Die folgende Tabelle bietet eine nicht erschöpfende Liste von Open-Source-Software, die zu diesem Zweck verwendet werden kann:
Pound <http://www.apsis.ch/pound>`_
In Fällen, in denen Software-Terminierung unzureichende Leistung bietet, können Hardware-Beschleuniger sich als eine alternative Option erweisen. Es ist wichtig, auf die Größe der Anfragen geachtet werden muss, die von einem ausgewählten TLS-Proxy verarbeitet werden.
Beispiele¶
Im Folgenden stellen wir Ihnen die empfohlenen Konfigurationseinstellungen zur Verfügung, um TLS in einigen der beliebtesten Webserver/TLS-Terminatoren zu aktivieren.
Bevor wir uns in die Konfigurationen einlassen, diskutieren wir kurz das Konfigurations-Element der Ziffern und deren Format. Eine ausführlichere Behandlung der verfügbaren Ziffern und das OpenSSL-Chiffrierlistenformat finden Sie unter: `Ciphers <https://www.openssl.org/docs/manmaster/man1/ciphers.html> `_.
ciphers = "HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
oder
ciphers = "kEECDH:kEDH:kRSA:HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
Cipher-String-Optionen werden durch „:“ getrennt, während „!“ eine Negation des unmittelbar folgenden Elements bedeutet. Element-Reihenfolge zeigt Präferenz an, wenn sie nicht durch Qualifikationen wie HIGH überschrieben wird. Schauen wir uns die Elemente in den obigen Sample-Strings genauer an.
KEECDH: KEDH
Ephemeral Elliptische Kurve Diffie-Hellman (abgekürzt als EECDH und ECDHE).
Ephemeral Diffie-Hellman (abgekürzt entweder als EDH oder DHE) verwendet primäre Feldgruppen.
Beide Ansätze bieten Perfect Forward Secrecy (PFS). Siehe Perfect forward secrecy für zusätzliche Diskussion über die ordnungsgemäße Konfiguration von PFS.
Ephemeral Elliptic Curves erfordert, dass der Server mit einer benannten Kurve konfiguriert wird und eine bessere Sicherheit bietet als primäre Feldgruppen und zu niedrigeren Rechenkosten. Allerdings sind primäre Feldgruppen weit verbreitet, und daher sind in der Regel beide in der Liste enthalten.
kRSA
Cipher Suiten mit dem `RSA <https://en.wikipedia.org/wiki/RSA_%28cryptosystem%29>``Austausch, Authentifizierung oder entweder.
HIGH
Wählt in der Verhandlungsphase die höchstmögliche Sicherheitskurve aus. Diese haben typischerweise Schlüssel mit einer Länge von 128 Bits oder länger.
!RC4
Kein RC4. RC4 hat Fehler im Zusammenhang mit TLS V3. Siehe Mit der Sicherheit von RC4 in TLS und WPA.
!MD5
Kein MD5. MD5 ist nicht kollisionsresistent und daher für Message Authentication Codes (MAC) oder Signaturen nicht akzeptabel.
!aNULL:!eNULL
Löscht Klartext.
!EXP
Enthält Export-Verschlüsselungsalgorithmen, die durch Design tendenziell schwach sind, in der Regel mit 40 und 56 Bit-Schlüssel.
US Exportbeschränkungen für Kryptographie-Systeme wurden aufgehoben und müssen nicht mehr unterstützt werden.
!LOW:!MEDIUM
Erlaubt niedrige (56 oder 64 Bit lange Schlüssel) und mittlere (128 Bit lange Schlüssel) Cipher wegen ihrer Anfälligkeit für Brute-Force-Attacken (Beispiel 2-DES). Diese Regel erlaubt immer noch den Triple Data Encryption Standard (Triple DES), der auch als Triple Data Encryption Algorithm (TDEA) und der Advanced Encryption Standard (AES) bekannt ist, von denen jeder Schlüssel größer als 128 Bits hat und damit sicherer ist.
Protokolle
Protokolle werden durch SSL_CTX_set_options aktiviert/deaktiviert. Wir empfehlen, SSLv2/v3 zu deaktivieren und TLS zu aktivieren.
Pound¶
Dieses Pound-Beispiel ermöglicht ``AES-NI``Beschleunigung, die dazu beiträgt, die Leistung auf Systemen mit Prozessoren zu verbessern, die diese
## see pound(8) for details
daemon 1
######################################################################
## global options:
User "swift"
Group "swift"
#RootJail "/chroot/pound"
## Logging: (goes to syslog by default)
## 0 no logging
## 1 normal
## 2 extended
## 3 Apache-style (common log format)
LogLevel 0
## turn on dynamic scaling (off by default)
# Dyn Scale 1
## check backend every X secs:
Alive 30
## client timeout
#Client 10
## allow 10 second proxy connect time
ConnTO 10
## use hardware-acceleration card supported by openssl(1):
SSLEngine "aesni"
# poundctl control socket
Control "/var/run/pound/poundctl.socket"
######################################################################
## listen, redirect and ... to:
## redirect all swift requests on port 443 to local swift proxy
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/pound/cert.pem"
## Certs to accept from clients
## CAlist "CA_file"
## Certs to use for client verification
## VerifyList "Verify_file"
## Request client cert - don't verify
## Ciphers "AES256-SHA"
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
NoHTTPS11 0
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
xHTTP 1
Service
BackEnd
Address 127.0.0.1
Port 80
End
End
End
Stud¶
Die ciphers Linie kann auf Ihre Bedürfnisse angepasst werden, aber das ist ein vernünftiger Ausgangspunkt. Die Standardkonfigurationsdatei befindet
# SSL x509 certificate file.
pem-file = "
# SSL protocol.
tls = on
ssl = off
# List of allowed SSL ciphers.
# OpenSSL's high-strength ciphers which require authentication
# NOTE: forbids clear text, use of RC4 or MD5 or LOW and MEDIUM strength ciphers
ciphers = "HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
# Enforce server cipher list order
prefer-server-ciphers = on
# Number of worker processes
workers = 4
# Listen backlog size
backlog = 1000
# TCP socket keepalive interval in seconds
keepalive = 3600
# Chroot directory
chroot = ""
# Set uid after binding a socket
user = "www-data"
# Set gid after binding a socket
group = "www-data"
# Quiet execution, report only error messages
quiet = off
# Use syslog for logging
syslog = on
# Syslog facility to use
syslog-facility = "daemon"
# Run as daemon
daemon = off
# Report client address using SENDPROXY protocol for haproxy
# Disabling this until we upgrade to HAProxy 1.5
write-proxy = off
Nginx¶
Dieses Nginx Beispiel erfordert TLS v1.1 oder v1.2 für maximale
Sicherheit. Die ssl_ciphers``Linie kann nach Ihren Bedürfnissen
angepasst werden, aber das ist ein vernünftiger Ausgangspunkt. Die
Standardkonfigurationsdatei lautet ``/etc/nginx/nginx.conf
.
server {
listen : ssl;
ssl_certificate ;
ssl_certificate_key ;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
ssl_session_tickets off;
server_name _;
keepalive_timeout 5;
location / {
}
}
Apache¶
Die Standardkonfigurationsdatei lautet /etc/apache2/apache2.conf
auf Ubuntu, ``/etc/httpd/conf/httpd.conf``auf RHEL und CentOS, ``/
<VirtualHost <ip address>:80>
ServerName <site FQDN>
RedirectPermanent / https://<site FQDN>/
</VirtualHost>
<VirtualHost <ip address>:443>
ServerName <site FQDN>
SSLEngine On
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
SSLCertificateFile /path/<site FQDN>.crt
SSLCACertificateFile /path/<site FQDN>.crt
SSLCertificateKeyFile /path/<site FQDN>.key
WSGIScriptAlias / <WSGI script location>
WSGIDaemonProcess horizon user=<user> group=<group> processes=3 threads=10
Alias /static <static files location>
<Directory <WSGI dir>>
# For http server 2.2 and earlier:
Order allow,deny
Allow from all
# Or, in Apache http server 2.4 and later:
# Require all granted
</Directory>
</VirtualHost>
Compute API-SSL-Endpunkt in Apache, den Sie mit einem kurzen WSGI-Skript paaren müssen.
<VirtualHost <ip address>:8447>
ServerName <site FQDN>
SSLEngine On
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
SSLCertificateFile /path/<site FQDN>.crt
SSLCACertificateFile /path/<site FQDN>.crt
SSLCertificateKeyFile /path/<site FQDN>.key
SSLSessionTickets Off
WSGIScriptAlias / <WSGI script location>
WSGIDaemonProcess osapi user=<user> group=<group> processes=3 threads=10
<Directory <WSGI dir>>
# For http server 2.2 and earlier:
Order allow,deny
Allow from all
# Or, in Apache http server 2.4 and later:
# Require all granted
</Directory>
</VirtualHost>
HTTP strict transport security¶
Wir empfehlen, dass alle Produktions-Deployments HTTP strict transport security (HSTS) verwenden. Dieser Header verhindert, dass Browser unsichere Verbindungen herstellen, nachdem sie eine einzige sichere gemacht haben. Wenn Sie Ihre HTTP-Dienste auf einer öffentlichen oder einer nicht vertrauenswürdigen Domain bereitgestellt haben, ist HSTS besonders wichtig. Um HSTS zu aktivieren, konfigurieren Sie Ihren Webserver, um einen Header wie folgt mit allen Anfragen zu senden:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Beginnen Sie mit einem kurzen Timeout von 1 Tag während der Prüfung, und erhöhen Sie es auf ein Jahr nach dem Testen, wenn sich keine Probleme für Benutzer eingestellt haben. Beachten Sie, dass, sobald dieser Header auf ein großes Timeout gesetzt ist, es (durch Design) sehr schwer zu deaktivieren ist.
Perfect forward secrecy¶
Das Konfigurieren von TLS-Servern für eine perfect forward secrecy erfordert eine sorgfältige Planung um Schlüsselgröße, Sitzungs-IDs und Session-Tickets. Darüber hinaus ist für Share-Server-Implementierungen der Shared State auch eine wichtige Überlegung. Die Beispielkonfigurationen für Apache und Nginx oben deaktivieren die Session-Ticket-Optionen, um dazu beizutragen, einige dieser Bedenken zu mildern. Real-world-Implementierungen können diese Funktion für eine verbesserte Leistung ermöglichen. Dies kann sicher erfolgen, würde aber eine besondere Berücksichtigung der Schlüsselverwaltung erfordern. Solche Konfigurationen gehen über den Rahmen dieses Leitfadens hinaus. Wir schlagen vor, wie man das TLS-Geheimnis von ImperialViolet verletzen kann <https://www.imperialviolet.org/2013/06/27/botchingpfs.html>`_ als Ausgangspunkt für das Verständnis des Problemraums.