2016-03-23 17 views
12

Tôi đã có HTTPS để chấm dứt kết nối HTTPS bên ngoài tại AWS ELB của mình. Hiện tại tôi đang cố gắng bảo vệ các kết nối giữa ELB và các máy chủ NGINX phụ trợ của tôi trên EC2 bằng HTTPS với chứng chỉ tự ký. Tôi đã theo dõi the documentation, nhưng truy cập máy chủ qua kết quả HTTPS trong thời gian chờ 408 HTTP. Tôi dường như không nhận được bất kỳ thông tin gỡ lỗi nào để xác định nơi mọi thứ đang thất bại.AWS ELB -> Máy chủ phụ trợ qua HTTPS với chứng chỉ tự ký

  • Tôi đã xác nhận rằng nhóm bảo mật cho phép kết nối giữa ELB và NGINX trên EC2.
  • Tôi đã xác nhận rằng VPC cho phép lưu lượng truy cập được định tuyến giữa các nút ELB và EC2 (cũng HTTP hoạt động tốt).
  • Tôi đã xác nhận rằng trình nghe HTTPS trên nút EC2 đang hoạt động (tôi có thể truy cập trực tiếp vào ELB.
  • Tôi đã tạo chính sách ELB loại PublicKeyPolicyType và liên kết khóa công khai của tôi.
  • tôi đã tạo ra một chính sách ELB của tyep BackendServerAuthenticationPolicyType, và liên kết nó với PublicKeyPolicyType.
  • tôi đã gắn liền các BackendServerAuthenticationPolicyType với với ELB.
  • tôi đã đảm bảo rằng các SSLNegotiationPolicyType hỗ trợ các thuật toán và thuật toán mã hóa tôi đã xác định trong cấu hình NGINX của tôi.
  • Tôi thấy các yêu cầu HTTP trong nhật ký truy cập NGINX của tôi, nhưng không thấy yêu cầu HTTPS.

Có cách nào để tôi có thể nhận thêm bất kỳ thông tin chẩn đoán nào để kiểm tra điều này không?

Dưới đây là cấu hình ELB của tôi:

$ aws elb describe-load-balancers --load-balancer-name <MY-ELB-NAME> 

{ 
    "LoadBalancerDescriptions": [ 
     { 
      "Subnets": [ 
       "<REDACTED>", 
       "<REDACTED>", 
       "<REDACTED>" 
      ], 
      "CanonicalHostedZoneNameID": "<REDACTED>", 
      "VPCId": "<REDACTED>", 
      "ListenerDescriptions": [ 
       { 
        "Listener": { 
         "InstancePort": 80, 
         "LoadBalancerPort": 80, 
         "Protocol": "HTTP", 
         "InstanceProtocol": "HTTP" 
        }, 
        "PolicyNames": [] 
       }, 
       { 
        "Listener": { 
         "InstancePort": 443, 
         "SSLCertificateId": "<REDACTED>", 
         "LoadBalancerPort": 443, 
         "Protocol": "HTTPS", 
         "InstanceProtocol": "HTTPS" 
        }, 
        "PolicyNames": [ 
         "ELBSecurityPolicy-2015-05" 
        ] 
       } 
      ], 
      "HealthCheck": { 
       "HealthyThreshold": 2, 
       "Interval": 30, 
       "Target": "HTTP:80/health", 
       "Timeout": 10, 
       "UnhealthyThreshold": 2 
      }, 
      "BackendServerDescriptions": [ 
       { 
        "InstancePort": 443, 
        "PolicyNames": [ 
         "MyBackendServerAuthenticationPolicy" 
        ] 
       } 
      ], 
      "Instances": [ 
       { 
        "InstanceId": "<REDACTED>" 
       } 
      ], 
      "DNSName": "<REDACTED>.us-west-2.elb.amazonaws.com", 
      "SecurityGroups": [ 
       "<GROUP_ID>" 
      ], 
      "Policies": { 
       "LBCookieStickinessPolicies": [], 
       "AppCookieStickinessPolicies": [], 
       "OtherPolicies": [ 
        "ELBSecurityPolicy-2015-05", 
        "MyBackendServerAuthenticationPolicy", 
        "MyPublicKeyPolicy" 
       ] 
      }, 
      "LoadBalancerName": "<MY-ELB-NAME>", 
      "CreatedTime": "2016-03-23T20:58:49.490Z", 
      "AvailabilityZones": [ 
       "us-west-2a", 
       "us-west-2b", 
       "us-west-2c" 
      ], 
      "Scheme": "internal", 
      "SourceSecurityGroup": { 
       "OwnerAlias": "<REDACTED>", 
       "GroupName": "<GROUP_NAME>" 
      } 
     } 
    ] 
} 

Dưới đây là các chính sách ELB của tôi:

$ aws elb describe-load-balancer-policies --load-balancer-name <MY-ELB-NAME> 
{ 
    "PolicyDescriptions": [ 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "Reference-Security-Policy", 
        "AttributeValue": "ELBSecurityPolicy-2015-05" 
       }, 
       ... 
       { 
        "AttributeName": "Protocol-TLSv1.2", 
        "AttributeValue": "true" 
       }, 
       ... 
       { 
        "AttributeName": "ECDHE-RSA-AES128-GCM-SHA256", 
        "AttributeValue": "true" 
       }, 
       ... 
      ], 
      "PolicyName": "ELBSecurityPolicy-2015-05", 
      "PolicyTypeName": "SSLNegotiationPolicyType" 
     }, 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "PublicKeyPolicyName", 
        "AttributeValue": "MyPublicKeyPolicy" 
       } 
      ], 
      "PolicyName": "MyBackendServerAuthenticationPolicy", 
      "PolicyTypeName": "BackendServerAuthenticationPolicyType" 
     }, 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "PublicKey", 
        "AttributeValue": "<REDACTED>" 
       } 
      ], 
      "PolicyName": "MyPublicKeyPolicy", 
      "PolicyTypeName": "PublicKeyPolicyType" 
     } 
    ] 
} 

Dưới đây là cấu hình nginx tôi:

worker_processes 10; 
worker_rlimit_nofile 8192; 
events { 
    worker_connections 4096; 
} 

error_log syslog:server=unix:/dev/log error; 
pid  logs/nginx.pid; 

http { 
    default_type application/octet-stream; 

    log_subrequest on; 
    access_log syslog:server=unix:/dev/log,severity=debug extended; 

    tcp_nodelay on; 
    tcp_nopush  on; 

    server_tokens off; 

    upstream api { 
    server localhost:8080; 
    } 

    server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    location/{ 
     # Redirect all other HTTP requests to HTTPS with a 301 Moved Permanently response. 
     return 301 https://$host$request_uri; 
    } 
    } 

    server { 
    listen 443 ssl; 
    listen [::]:443 ssl; 

    ssl_certificate /path/to/ssl.crt; 
    ssl_certificate_key /path/to/ssl.key; 
    ssl_session_timeout 1d; 
    ssl_session_cache shared:SSL:50m; 
    ssl_session_tickets off;ECDHE 

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits 
    ssl_dhparam /path/to/dhparam.pem; 

    # modern configuration. tweak to your needs. 
    # See: https://mozilla.github.io/server-side-tls/ssl-config-generator/ 
    ssl_protocols TLSv1.2; 
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; 
    ssl_prefer_server_ciphers on; 

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains;"; 

    # Our main location to proxy everything else to the upstream 
    # server, but with the added logic for enforcing HTTPS. 
    location/{ 
     proxy_http_version 1.1; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_next_upstream error; 

     proxy_pass http://api; 
    } 
    } 
} 

tôi là tạo ra các phím/chứng chỉ sử dụng các lệnh sau:

$ openssl genrsa \ 
    -out /path/to/ssl.key 2048 
$ openssl req \ 
    -sha256 \ 
    -new \ 
    -key /path/to/ssl.key \ 
    -out /path/to/ssl.csr 
$ openssl x509 \ 
    -req \ 
    -days 365 \ 
    -in /path/to/ssl.csr \ 
    -signkey /path/to/ssl.key \ 
    -out /path/to/ssl.crt 
$ openssl dhparam -out /path/to/dhparam.pem 2048 
+1

Bạn có thực hiện điều này vì lý do tuân thủ (PCI/HIPAA/etc) hay chỉ vì bạn nghĩ rằng bạn cần nó? Lưu lượng mạng giữa ELB và các máy chủ web sẽ được chứa trong VPC của bạn, do đó, nó sẽ chỉ bị xâm phạm nếu kẻ tấn công có được quyền truy cập vào máy chủ trong VPC của bạn. SSL cho ELB thường được coi là đủ tốt trừ khi bạn có các yêu cầu pháp lý cho "mã hóa chuyển động". –

+0

Có, chúng tôi có các yêu cầu pháp lý để mã hóa lưu lượng truy cập đi qua dây, đó là một phương pháp hay. – jsears

+0

Cài đặt 'Giao thức thể hiện' cho người nghe có được đặt thành 'HTTPS' (trong bảng điều khiển) không? HTTPS và 443 cần phải được đặt ở phía bên trái và bên phải trên màn hình đó, và mặc định bên phải là HTTP ... Tôi đang ở một mất mát như những gì sẽ gây ra một 408 nếu không này. –

Trả lời

5

Thêm một số mật mã DHE phi EC vào cấu hình NGINX đã giải quyết vấn đề này cho tôi. Tôi đã chuyển sang cấu hình sau trong trình nghe HTTPS trong nginx.conf:

# intermediate configuration. tweak to your needs. 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; 

Tôi muốn bỏ tất cả mật mã DHE không phải EC và chỉ hỗ trợ ECDHE. Tôi nghi ngờ điều này khắc phục sự cố vì tôi đang tạo khóa RSA/cert thay vì khóa/chứng chỉ EC. Nếu có ai biết cách tôi có thể tạo khóa/chứng chỉ EC đúng cách và sau đó trích xuất chính xác khóa công cộng EC để tải lên AWS, vui lòng cải thiện câu trả lời của tôi. Tôi đã cố gắng tạo khóa/chứng chỉ EC, nhưng khi tôi cố gắng tạo chính sách khóa công khai ELB, AWS báo cáo đó là khóa công khai không hợp lệ.

+1

Bạn có thể cập nhật bài đăng của mình để bao gồm các hướng dẫn/lệnh bạn đã sử dụng để tạo và tải lên khóa/chứng chỉ EC và lỗi/phản hồi chính xác mà bạn nhận được từ AWS khi cố tải lên khóa/chứng chỉ EC đó không? – Castaglia

+1

Điều này làm việc cho tôi. Trước đây tôi đã sử dụng cấu hình SSL "Mozilla hiện đại" cho nginx và sau khi chuyển sang "Trung cấp", mọi thứ chỉ hoạt động. Tất cả các thuật toán mã hóa hiện đại bắt đầu bằng "ECDHE-" trong khi trung gian bao gồm một số "DHE-", "AES128-", "AES256-" và "EDH-". Tôi chưa đào sâu hơn để xem những ELB AWS nào đang sử dụng. – notpeter

+0

Cảm ơn - đã có cùng một vấn đề, cần mật mã. – Brett

Các vấn đề liên quan