Proxy TLS dan layanan HTTP

Endpoint OpenStack adalah layanan HTTP yang menyediakan API kepada endpoint di jaringan publik dan layanan OpenStack lainnya di jaringan manajemen. Sangat disarankan agar semua permintaan ini, baik internal maupun eksternal, beroperasi di atas TLS. Untuk mencapai tujuan ini, layanan API harus ditempatkan di belakang proxy TLS yang dapat menetapkan dan menghentikan sesi TLS. Tabel berikut ini menawarkan daftar lengkap perangkat lunak open source yang dapat digunakan untuk tujuan ini:

Dalam kasus di mana penghentian perangkat lunak menawarkan kinerja yang tidak mencukupi, akselerator perangkat keras mungkin perlu ditelusuri sebagai opsi alternatif. Penting untuk memperhatikan ukuran permintaan yang akan diproses oleh proxy TLS yang dipilih.

Contoh

Di bawah ini kami menyediakan contoh pengaturan konfigurasi yang direkomendasikan untuk mengaktifkan TLS di beberapa web servers/TLS terminators yang lebih populer.

Sebelum kita mempelajari konfigurasi, kita membahas secara singkat elemen konfigurasi cipher dan formatnya. Perawatan yang lebih lengkap tentang cipher yang tersedia dan format daftar cipher OpenSSL dapat ditemukan di: ciphers.

ciphers = "HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"

atau

ciphers = "kEECDH:kEDH:kRSA:HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"

Pilihan string cipher dipisahkan oleh ":", while "!" memberikan penolakan dari elemen berikut ini. Urutan elemen menunjukkan preferensi kecuali diganti oleh kualifikasi seperti HIGH. Mari kita lihat lebih dekat unsur-unsur dalam contoh string di atas.

kEECDH:kEDH

Ephemeral Elliptic Curve Diffie-Hellman (disingkat EECDH dan ECDHE).

Ephemeral Diffie-Hellman (disingkat sebagai EDH ataupun DHE) menggunakan kelompok field utama

Kedua pendekatan itu memberikan Perfect Forward Secrecy (PFS). Lihat Kerahasiaan maju yang sempurna untuk diskusi tambahan tentang konfigurasi PFS dengan benar.

Ephemeral Elliptic Curves meminta server untuk dikonfigurasi dengan kurva bernama, dan memberikan keamanan yang lebih baik daripada kelompok lapangan utama dan dengan biaya komputasi yang lebih rendah. Namun, kelompok field utama lebih banyak diimplementasikan, dan dengan demikian biasanya keduanya termasuk dalam daftar.

kRSA

Cipher suite menggunakan RSA pertukaran, otentikasi atau masing-masing.

HIGH

Memilih sekuriti keamanan tertinggi dalam tahap negosiasi. Ini biasanya memiliki kunci dengan panjang 128 bit atau lebih.

!RC4

Tidak ada RC4. RC4 memiliki kekurangan dalam konteks TLS V3. Lihat On the Security of RC4 in TLS and WPA.

!MD5

Tidak ada MD5. MD5 tidak tahan benturan, dan karenanya tidak dapat diterima untuk Message Authentication Codes (MAC) atau signatures.

!aNULL:!eNULL

Tidak mengizinkan teks yang jelas.

!EXP

Tidak mengizinkan algoritma enkripsi ekspor, yang menurut desainnya cenderung lemah, biasanya menggunakan kunci 40 dan 56 bit.

Pembatasan US Export pada sistem kriptografi telah dicabut dan tidak perlu lagi didukung.

!LOW:!MEDIUM

Larang (56 or 64 bit long keys) rendah dan ciphers (128 bit long keys) menengah karena kerentanannya terhadap serangan brute force (contoh 2-DES). Aturan ini masih mengizinkan Triple Data Encryption Standard (Triple DES) yang juga dikenal sebagai Triple Data Encryption Algorithm (TDEA) dan Advanced Encryption Standard (AES), yang masing-masing memiliki kunci lebih besar dari pada 128 bit dan lebih aman.

Protocols

Protokol diaktifkan/dinonaktifkan melalui SSL_CTX_set_options. Sebaiknya nonaktifkan SSLv2/v3 dan aktifkan TLS.

Pound

Contoh Pound ini memungkinkan akselerasi AES-NI, yang membantu meningkatkan kinerja pada sistem dengan prosesor yang mendukung fitur ini. File konfigurasi defaultnya adalah /etc/pound/pound.cfg di Ubuntu, /etc/pound.cfg di RHEL, CentOS, openSUSE, dan SUSE Linux Enterprise.

## 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

Baris *ciphers * dapat di-tweak berdasarkan kebutuhan Anda, namun ini adalah tempat awal yang masuk akal. File konfigurasi default terletak di direktori /etc/stud. Namun, itu tidak disediakan secara default.

# 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

Contoh Nginx ini memerlukan TLS v1.1 atau v1.2 untuk keamanan maksimal. Baris ssl_ciphers dapat di-tweak berdasarkan kebutuhan Anda, namun ini adalah tempat awal yang masuk akal. File konfigurasi defaultnya adalah /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

File konfigurasi defaultnya adalah /etc/apache2/apache2.conf di Ubuntu, /etc/httpd/conf/httpd.conf di RHEL dan CentOS, /etc/apache2/httpd.conf di openSUSE dan SUSE Linux Enterprise.

<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>

Komputasi endpoint SSL API di Apache, yang harus Anda pasangkan dengan skrip WSGI singkat.

<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>

Keamanan transportasi ketat HTTP

Sebaiknya semua penerapan produksi menggunakan keamanan transportasi ketat HTTP (HSTS). Header ini mencegah browser membuat koneksi yang tidak aman setelah mereka membuat suatu single secure. Jika Anda telah menyebarkan layanan HTTP Anda di domain publik atau yang tidak tepercaya, HSTS sangat penting. Untuk mengaktifkan HSTS, konfigurasikan server web Anda untuk mengirim header seperti ini dengan semua permintaan:

Strict-Transport-Security: max-age=31536000; includeSubDomains

Mulailah dengan jangka waktu singkat (short timeout) 1 hari selama pengujian, dan naikkan ke satu tahun setelah pengujian telah menunjukkan bahwa Anda belum memperkenalkan masalah bagi pengguna. Perhatikan bahwa sekali header ini diatur ke batas waktu yang besar, (by design) itu menjadi sangat sulit untuk dinonaktifkan.

Kerahasiaan maju yang sempurna

Mengkonfigurasi server TLS untuk kerahasiaan baik yang sempurna memerlukan perencanaan yang hati-hati seputar ukuran kunci, ID sesi, dan tiket sesi. Selain itu, untuk penyebaran multi-server, shared state (keadaan berbagi) juga merupakan pertimbangan penting. Contoh konfigurasi untuk Apache dan Nginx di atas menonaktifkan pilihan tiket sesi untuk membantu mengurangi beberapa masalah ini. Penyebaran dunia nyata mungkin ingin mengaktifkan fitur ini untuk meningkatkan kinerja. Hal ini dapat dilakukan dengan aman, namun memerlukan pertimbangan khusus seputar manajemen kunci. Konfigurasi seperti itu berada di luar jangkauan panduan ini. Kami menyarankan untuk membaca How to botch TLS forward secrecy by ImperialViolet sebagai tempat awal untuk memahami masalah ruang.