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:

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.