[ English | 한국어 (대한민국) | English (United Kingdom) | Indonesia | français | русский | Deutsch ]

Mengamankan layanan dengan sertifikat SSL

OpenStack Security Guide merekomendasikan untuk menyediakan komunikasi yang aman antara berbagai layanan dalam penyebaran OpenStack. Proyek OpenStack-Ansible saat ini menawarkan kemampuan untuk mengonfigurasi sertifikat SSL untuk komunikasi aman antara layanan:

Semua endpoint publik berada di belakang haproxy, sehingga satu-satunya manajemen sertifikat yang paling dibutuhkan lingkungan adalah haproxy.

Saat menggunakan dengan OpenStack-Ansible, Anda bisa menggunakan sertifikat yang ditandatangani sendiri yang dihasilkan selama proses penyebaran atau memberikan sertifikat SSL, kunci, dan sertifikat CA dari otoritas sertifikat tepercaya Anda sendiri. Lingkungan yang sangat aman menggunakan sertifikat terpercaya, user-provided (disediakan pengguna) untuk sebanyak mungkin layanan.

Catatan

Lakukan semua konfigurasi sertifikat SSL dalam file /etc/openstack_deploy/user_variables.yml. Jangan mengedit playbook atau role itu sendiri.

Sertifikat yang ditandatangani sendiri (self-signed certificate)

Sertifikat yang ditandatangani sendiri memungkinkan Anda untuk memulai dengan cepat dan mengenkripsi data dalam perjalanan. Namun, mereka tidak memberikan tingkat kepercayaan yang tinggi untuk lingkungan yang sangat aman. Secara default, sertifikat yang ditandatangani sendiri digunakan di OpenStack-Ansible. Ketika sertifikat yang ditandatangani sendiri digunakan, verifikasi sertifikat dinonaktifkan secara otomatis.

Menyetel data subjek untuk sertifikat yang ditandatangani sendiri

Ubah data subjek dari sertifikat yang ditandatangani sendiri dengan menggunakan variabel konfigurasi. Variabel konfigurasi untuk setiap layanan diformat sebagai <servicename>_ssl_self_signed_subject. Misalnya, untuk mengubah data subjek sertifikat SSL untuk HAProxy, sesuaikan file /etc/openstack_deploy/user_variables.yml sebagai berikut:

haproxy_ssl_self_signed_subject: "/C=US/ST=Texas/L=San Antonio/O=IT/CN=haproxy.example.com"

Untuk informasi lebih lanjut tentang bidang yang tersedia dalam subjek sertifikat, lihat dokumentasi OpenSSL untuk req subcommand.

Membuat dan membuat ulang sertifikat yang ditandatangani sendiri (self-signed certificate)

Sertifikat yang ditandatangani sendiri dibuat untuk setiap layanan selama menjalankan pertama dari playbook.

Untuk menghasilkan sertifikat yang ditandatangani sendiri untuk layanan, Anda harus mengatur variabel <servicename>_ssl_self_signed_regen menjadi true dengan salah satu cara berikut:

  • Untuk memaksa sertifikat yang ditandatangani sendiri untuk dibuat ulang, Anda bisa meneruskan variabel ke openstack-ansible pada baris perintah:

    # openstack-ansible -e "horizon_ssl_self_signed_regen=true" os-horizon-install.yml
    
  • Untuk memaksa sertifikat yang ditandatangani sendiri untuk dibuat ulang dengan setiap kali playbook dijalankan, setel opsi regenerasi yang sesuai ke true. Misalnya, jika Anda sudah menjalankan playbook haproxy, tetapi Anda ingin membuat ulang sertifikat yang ditandatangani sendiri, setel variabel haproxy_ssl_self_signed_regen ke true di file /etc/openstack_deploy/user_variables.yml:

    haproxy_ssl_self_signed_regen: true
    

Catatan

Regenerasi sertifikat yang ditandatangani sendiri menggantikan sertifikat yang ada apakah ditandatangani sendiri atau disediakan oleh pengguna.

User-provided certificate (sertifikat yang disediakan pengguna)

Untuk kepercayaan tambahan di lingkungan yang sangat aman, Anda dapat memberikan sertifikat SSL, kunci, dan sertifikat CA Anda sendiri. Memperoleh sertifikat dari otoritas sertifikat tepercaya berada di luar ruang lingkup dokumen ini, tetapi bagian Certificate Management dari Linux Documentation Project menjelaskan cara membuat otoritas sertifikat Anda sendiri dan menandatangani sertifikat.

Gunakan proses berikut untuk menggunakan sertifikat SSL yang disediakan pengguna di OpenStack-Ansible:

  1. Salin file sertifikat SSL, kunci, dan CA Anda ke host penyebaran.

  2. Tentukan path ke sertifikat SSL, kunci, dan sertifikat CA Anda di file /etc/openstack_deploy/user_variables.yml.

  3. Jalankan playbook untuk layanan itu.

Contoh HAProxy

Variabel yang akan ditetapkan yang menyediakan jalur pada deployment node ke sertifikat untuk konfigurasi HAProxy adalah:

haproxy_user_ssl_cert: /etc/openstack_deploy/ssl/example.com.crt
haproxy_user_ssl_key: /etc/openstack_deploy/ssl/example.com.key
haproxy_user_ssl_ca_cert: /etc/openstack_deploy/ssl/ExampleCA.crt

Contoh RabbitMQ

Untuk menggunakan sertifikat yang disediakan pengguna untuk RabbitMQ, salin sertifikat ke host penyebaran, edit file /etc/openstack_deploy/user_variables.yml dan tetapkan tiga variabel berikut:

rabbitmq_user_ssl_cert:    /etc/openstack_deploy/ssl/example.com.crt
rabbitmq_user_ssl_key:     /etc/openstack_deploy/ssl/example.com.key
rabbitmq_user_ssl_ca_cert: /etc/openstack_deploy/ssl/ExampleCA.crt

Kemudian, jalankan playbook untuk menerapkan sertifikat:

# openstack-ansible rabbitmq-install.yml

Playbook menyebarkan sertifikat SSL, kunci, dan sertifikat CA yang disediakan pengguna ke setiap container RabbitMQ.

Prosesnya identik untuk layanan lain. Ganti rabbitmq dalam variabel konfigurasi sebelumnya dengan horizon, haproxy, atau keystone, dan kemudian jalankan playbook untuk layanan itu untuk menggunakan sertifikat yang disediakan pengguna ke layanan tersebut.

LetsEncrypt certificates

The HAProxy ansible role supports using LetsEncrypt to automatically deploy trusted SSL certificates for the public endpoint. Each HAProxy server will individually request a LetsEncrypt certificate.

The http-01 type challenge is used by certbot to deploy certificates so it is required that the public endpoint is accessible directly on the internet.

Deployment of certificates using LetsEncrypt has been validated for openstack-ansible using Ubuntu Bionic. Other distributions should work but are not tested.

To deploy certificates with LetsEncrypt, add the following to /etc/openstack_deploy/user_variables.yml to enable the letsencrypt function in the haproxy ansible role, and to create a new backend service called letsencrypt to service http-01 challenge requests.

haproxy_ssl: true
haproxy_ssl_letsencrypt_enable: True
haproxy_ssl_letsencrypt_install_method: "distro"
haproxy_ssl_letsencrypt_setup_extra_params: "--http-01-address {{ ansible_host }} --http-01-port 8888"
haproxy_ssl_letsencrypt_email: "email.address@example.com"

haproxy_extra_services:
  # an internal only service for acme-challenge whose backend is certbot running on any haproxy instance
  - service:
      haproxy_service_name: letsencrypt
      haproxy_backend_nodes: "{{ groups['haproxy_all'] }}"
      backend_rise: 1                       #rise quickly to detect certbot running without delay
      backend_fall: 2
      haproxy_bind:
        - 127.0.0.1                         #bind to the localhost as the host internal IP will be used by certbot
      haproxy_port: 8888
      haproxy_balance_type: http

Copy the whole variable haproxy_default_services from /opt/openstack-ansible/inventory/group_vars/haproxy/haproxy.yml to /etc/openstack_deploy/group_vars/haproxy/haproxy_all.yml and update the section for horizon to include the ACL redirects http-01 challenges to the HAProxy letsencrypt backend as follows:

- service:
    haproxy_service_name: horizon
    haproxy_backend_nodes: "{{ groups['horizon_all'] | default([]) }}"
    haproxy_ssl: "{{ haproxy_ssl }}"
    haproxy_ssl_all_vips: true
    haproxy_port: "{{ haproxy_ssl | ternary(443,80) }}"
    haproxy_backend_port: 80
    haproxy_redirect_http_port: 80
    haproxy_balance_type: http
    haproxy_balance_alg: source
    haproxy_backend_options:
      - "httpchk HEAD / HTTP/1.0\\r\\nUser-agent:\\ osa-haproxy-healthcheck"
    haproxy_service_enabled: "{{ groups['horizon_all'] is defined and groups['horizon_all'] | length > 0 }}"
    haproxy_redirect_scheme: "https if !{ ssl_fc } !{ path_beg /.well-known/acme-challenge/ }"   #redirect all non-ssl traffic to ssl except acme-challenge
    haproxy_frontend_acls:                                 #use a frontend ACL specify the backend to use for acme-challenge
      letsencrypt-acl:
          rule: "path_beg /.well-known/acme-challenge/"
          backend_name: letsencrypt