web-dev-qa-db-de.com

Unterstützung für bidirektionale TLS/HTTPS mit ELB

Ein Weg (oder serverseitig) TLS/HTTPS mit Amazon Elastic Load Balancing ist gut dokumentiert

Die Unterstützung für bidirektionale (oder clientseitige) TLS/HTTPS geht aus der Dokumentation nicht so hervor.

Angenommen, ELB beendet eine TLS/HTTPS-Verbindung:

  1. Unterstützt ELB Client authentifizierte HTTPS-Verbindungen?
  2. Wenn ja, erhält ein von ELB betriebener Server einen X-Forwarded- * - Header, um den von ELB authentifizierten Client zu identifizieren? 

ELB unterstützt die Weiterleitung von TCP, sodass ein EC2-Hosted-Server eine bidirektionale TLS/HTTPS-Verbindung herstellen kann. In diesem Fall bin ich jedoch daran interessiert, dass ELB die TLS/HTTPS-Verbindung beendet und den Client identifiziert. 

25
pd40

Ich sehe nicht, wie dies im beendeten HTTPS-Modus möglich wäre, weil die ELB eine zweite TCP - Verbindung zum Back-End-Server herstellt und intern die Entladung zum/vom Client und entschlüsselt/verschlüsselt Server ... damit der Server das Client-Zertifikat nicht direkt sehen kann und es keine dokumentierten X-Forwarded- * -Header außer -For, -Proto und -Port gibt.

Bei einem ELB, der im Modus TCP ausgeführt wird, erfolgt die SSL-Aushandlung jedoch direkt zwischen Client und Server, wobei ELB die Streams blind miteinander verknüpft. Wenn der Server das PROXY-Protokoll unterstützt, können Sie diese Funktionalität in der ELB aktivieren, damit Sie die Ursprungs-IP und den Port des Clients auf dem Server sowie das Client-Zertifikat direkt vom Client identifizieren können Sie würden direkt mit Ihnen verhandeln ... obwohl dies bedeutet, dass Sie SSL nicht mehr an die ELB abladen, was möglicherweise Teil des Ziels Ihrer Bemühungen ist.


Update: 

Es sieht nicht so aus, als gäbe es eine Möglichkeit, alles zu tun, was Sie tun möchten - SSL abladen und die Client-Zertifizierung identifizieren - nur mit ELB. Die nachstehenden Informationen werden "für das, was es wert ist" dargestellt.

Offenbar hat HAProxy Unterstützung für clientseitige Zertifikate in Version 1.5 und übergibt die Zertifikatsinformationen in X--Headern. Da HAProxy auch das PROXY-Protokoll über Konfiguration unterstützt (etwas in der Richtung von tcp-request connection expect-proxy ) ... so scheint es denkbar, dass Sie HAProxy hinter einem TCP-Modus-ELB verwenden könnten, wobei HAProxy die SSL-Verbindung abbricht und weiterleitet Sowohl die Client-IP-/Port-Informationen von ELB (über das PROXY-Protokoll) als auch die Client-Zertifizierungsinformationen an den Anwendungsserver ... Damit können Sie die SSL-Verschiebung weiterhin durchführen.

Ich erwähne dies, weil es sich um eine komplementäre Lösung zu handeln scheint, die möglicherweise vollständiger ist als jede der beiden Plattformen, und zumindest in 1.4 funktionieren die beiden Produkte einwandfrei zusammen - ich verwende HAProxy 1.4 hinter ELB erfolgreich für alle Anforderungen in meinem System größte Webplattform (in meinem Fall entlädt ELB das SSL - es gibt keine Client-Zertifikate) und scheint trotz der scheinbaren Redundanz kaskadierter Load-Balancer eine solide Kombination zu sein. Ich mag es, wenn ELB das Einzige ist, was es im großen, schlechten Internet gibt, obwohl ich keinen Grund zu der Annahme habe, dass direkt belichtetes HAProxy alleine problematisch wäre. In meiner Anwendung sind die ELBs dazu da, um zwischen den HAProxies in den A/Zs zu balancieren (die ich ursprünglich auch für die automatische Skalierung gedacht hatte), aber die CPU-Auslastung blieb selbst in unserer Hauptsaison so niedrig, dass ich nie mehr als einen pro hatte Availability Zone, und ich habe never noch keine verloren ...), die dann einige Filter, Weiterleitungen und Mungings von Kopfzeilen durchführen kann, bevor sie den Datenverkehr an die eigentliche Plattform weiterleiten, zusätzlich zur Protokollierung. Umschreiben und Steuerung der Verkehrsaufteilung, die ich mit ELB nicht alleine habe.

14

Wenn Ihr Back-End Client-authentifizierte HTTPS-Verbindungen selbst unterstützen kann, können Sie ELB als TCP an Port 443 bis TCP an einem Port verwenden, den Ihr Back-End überwacht. Dies führt dazu, dass ELB die unverschlüsselte Anforderung direkt an Ihr Backend erneut sendet. Diese Konfiguration erfordert auch nicht die Installation eines SSL-Zertifikats auf einem Load Balancer.

Update: Bei dieser Lösung werden keine x-forwarded- * -Header gesetzt.

3
scrutari

Sie können bei Elastic Beanstalk zur Einzelinstanz wechseln und ebextensions verwenden, um die Zertifikate hochzuladen und nginx für gegenseitige TLS zu konfigurieren.

Beispiel

.ebextensions/setup.config

files:
  "/etc/nginx/conf.d/00_elastic_beanstalk_ssl.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      server {
        listen 443;
        server_name example.com;

        ssl on;
        ssl_certificate /etc/nginx/conf.d/server.crt;
        ssl_certificate_key /etc/nginx/conf.d/server.key;
        ssl_client_certificate /etc/nginx/conf.d/ca.crt;
        ssl_verify_client on;

        gzip on;

        send_timeout            300s;
        client_body_timeout     300s;
        client_header_timeout   300s;
        keepalive_timeout       300s;

        location / {
          proxy_pass  http://nodejs;
          proxy_http_version  1.1;
          proxy_set_header  Connection "";
          proxy_set_header  Upgrade $http_upgrade;
          proxy_set_header  Host  $Host;
          proxy_set_header  X-Real-IP $remote_addr;
          proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

          proxy_set_header X-SSL-client-serial $ssl_client_serial;
          proxy_set_header X-SSL-client-s-dn $ssl_client_s_dn;
          proxy_set_header X-SSL-client-i-dn $ssl_client_i_dn;
          proxy_set_header X-SSL-client-session-id $ssl_session_id;
          proxy_set_header X-SSL-client-verify $ssl_client_verify;

          proxy_connect_timeout   300s;
          proxy_send_timeout      300s;
          proxy_read_timeout      300s;
        }
      }
  "/etc/nginx/conf.d/server.crt":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      MIJDkzCCAvygAwIBAgIJALrlDwddAmnYMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD
      ...
      LqGyLiCzbVtg97mcvqAmVcJ9TtUoabtzsRJt3fhbZ0KKIlzqkeZr+kmn8TqtMpGn
      r6oVDizulA==
      -----END CERTIFICATE-----
  "/etc/nginx/conf.d/server.key":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      MIJCXQIBAAKBgQCvnu08hroXwnbgsBOYOt+ipinBWNDZRtJHrH1Cbzu/j5KxyTWF
      ...
      f92RjCvuqdc17CYbjo9pmanaLGNSKf0rLx77WXu+BNCZ
      -----END RSA PRIVATE KEY-----
  "/etc/nginx/conf.d/ca.crt":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      MIJCizCCAfQCCQChmTtNzd2fhDANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMC
      ...
      4nCavUiq9CxhCzLmT6o/74t4uCDHjB+2+sIxo2zbfQ==
      -----END CERTIFICATE-----
0
Miguel Mota