Closes https://github.com/spantaleev/matrix-docker-ansible-deploy/pull/755pull/778/head
| @@ -1,3 +1,25 @@ | |||||
| # 2021-01-08 | |||||
| ## (Breaking Change) New SSL configuration | |||||
| SSL configuration (protocols, ciphers) can now be more easily controlled thanks to us making use of configuration presets. | |||||
| We define a few presets (old, intermediate, modern), following the [Mozilla SSL Configuration Generator](https://ssl-config.mozilla.org/#server=nginx). | |||||
| A new variable `matrix_nginx_proxy_ssl_preset` controls which preset is used (defaults to `"intermediate"`). | |||||
| Compared to before, this changes nginx's `ssl_prefer_server_ciphers` to `off` (used to default to `on`). It also add some more ciphers to the list, giving better performance on mobile devices, and removes some weak ciphers. More information in the [documentation](docs/configuring-playbook-nginx.md). | |||||
| To revert to the old behaviour, set the following variables: | |||||
| ```yaml | |||||
| matrix_nginx_proxy_ssl_ciphers: "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH" | |||||
| matrix_nginx_proxy_ssl_prefer_server_ciphers: "on" | |||||
| ``` | |||||
| Just like before, you can still use your own custom protocols by specifying them in `matrix_nginx_proxy_ssl_protocols`. Doing so overrides the values coming from the preset. | |||||
| # 2021-01-03 | # 2021-01-03 | ||||
| ## Signal bridging support via mautrix-signal | ## Signal bridging support via mautrix-signal | ||||
| @@ -48,7 +70,6 @@ If you went with the Postgres migration and it went badly for you (some bridge n | |||||
| - re-run the playbook (`ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start`) | - re-run the playbook (`ansible-playbook -i inventory/hosts setup.yml --tags=setup-all,start`) | ||||
| - [get in touch](README.md#support) with us | - [get in touch](README.md#support) with us | ||||
| # 2020-12-11 | # 2020-12-11 | ||||
| ## synapse-janitor support removed | ## synapse-janitor support removed | ||||
| @@ -24,6 +24,27 @@ matrix_nginx_proxy_proxy_matrix_nginx_status_allowed_addresses: | |||||
| - 1.1.1.1 | - 1.1.1.1 | ||||
| ``` | ``` | ||||
| ## Adjusting SSL in your server | |||||
| You can adjust how the SSL is served by the nginx server using the `matrix_nginx_proxy_ssl_preset` variable. We support a few presets, based on the Mozilla Server Side TLS | |||||
| Recommended configurations. These presets influence the TLS Protocol, the SSL Cipher Suites and the `ssl_prefer_server_ciphers` variable of nginx. | |||||
| Possible values are: | |||||
| - `"modern"` - For Modern clients that support TLS 1.3, with no need for backwards compatibility | |||||
| - `"intermediate"` (**default**) - Recommended configuration for a general-purpose server | |||||
| - `"old"` - Services accessed by very old clients or libraries, such as Internet Explorer 8 (Windows XP), Java 6, or OpenSSL 0.9.8 | |||||
| **Be really carefull when setting it to `"modern"`**. This could break comunication with other Matrix servers, limiting your federation posibilities. The | |||||
| [Federarion tester](https://federationtester.matrix.org/) also won't work. | |||||
| Besides changing the preset (`matrix_nginx_proxy_ssl_preset`), you can also directly override these 3 variables: | |||||
| - `matrix_nginx_proxy_ssl_protocols`: for specifying the supported TLS protocols. | |||||
| - `matrix_nginx_proxy_ssl_prefer_server_ciphers`: for specifying if the server or the client choice when negotiating the cipher. It can set to `on` or `off`. | |||||
| - `matrix_nginx_proxy_ssl_ciphers`: for specifying the SSL Cipher suites used by nginx. | |||||
| For more information about these variables, check the `roles/matrix-nginx-proxy/defaults/main.yml` file. | |||||
| ## Synapse + OpenID Connect for Single-Sign-On | ## Synapse + OpenID Connect for Single-Sign-On | ||||
| If you want to use OpenID Connect as an SSO provider (as per the [Synapse OpenID docs](https://github.com/matrix-org/synapse/blob/develop/docs/openid.md)), you need to use the following configuration (in your `vars.yml` file) to instruct nginx to forward `/_synapse/oidc` to Synapse: | If you want to use OpenID Connect as an SSO provider (as per the [Synapse OpenID docs](https://github.com/matrix-org/synapse/blob/develop/docs/openid.md)), you need to use the following configuration (in your `vars.yml` file) to instruct nginx to forward `/_synapse/oidc` to Synapse: | ||||
| @@ -219,8 +219,46 @@ matrix_nginx_proxy_proxy_domain_additional_server_configuration_blocks: [] | |||||
| # a new SSL certificate could go into effect. | # a new SSL certificate could go into effect. | ||||
| matrix_nginx_proxy_reload_cron_time_definition: "20 4 */5 * *" | matrix_nginx_proxy_reload_cron_time_definition: "20 4 */5 * *" | ||||
| # Specifies which SSL protocols to use when serving all the various vhosts | |||||
| matrix_nginx_proxy_ssl_protocols: "TLSv1.2 TLSv1.3" | |||||
| # Specifies the SSL configuration that should be used for the SSL protocols and ciphers | |||||
| # This is based on the Mozilla Server Side TLS Recommended configurations. | |||||
| # | |||||
| # The posible values are: | |||||
| # - "modern" - For Modern clients that support TLS 1.3, with no need for backwards compatibility | |||||
| # - "intermediate" - Recommended configuration for a general-purpose server | |||||
| # - "old" - Services accessed by very old clients or libraries, such as Internet Explorer 8 (Windows XP), Java 6, or OpenSSL 0.9.8 | |||||
| # | |||||
| # For more information visit: | |||||
| # - https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations | |||||
| # - https://ssl-config.mozilla.org/#server=nginx | |||||
| matrix_nginx_proxy_ssl_preset: "intermediate" | |||||
| # Presets are taken from Mozilla's Server Side TLS Recommended configurations | |||||
| # DO NOT modify these values and use `matrix_nginx_proxy_ssl_protocols`, `matrix_nginx_proxy_ssl_ciphers` and `matrix_nginx_proxy_ssl_ciphers` | |||||
| # if you wish to use something more custom. | |||||
| matrix_nginx_proxy_ssl_presets: | |||||
| modern: | |||||
| protocols: TLSv1.3 | |||||
| ciphers: "" | |||||
| prefer_server_ciphers: "off" | |||||
| intermediate: | |||||
| protocols: TLSv1.2 TLSv1.3 | |||||
| ciphers: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 | |||||
| prefer_server_ciphers: "off" | |||||
| old: | |||||
| protocols: TLSv1 TLSv1.1 TLSv1.2 TLSv1.3 | |||||
| ciphers: ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA | |||||
| prefer_server_ciphers: "on" | |||||
| # Specifies which *SSL protocols* to use when serving all the various vhosts. | |||||
| matrix_nginx_proxy_ssl_protocols: "{{ matrix_nginx_proxy_ssl_presets[matrix_nginx_proxy_ssl_preset]['protocols'] }}" | |||||
| # Specifies whether to prefer *the client’s choice or the server’s choice* when negotiating ciphers. | |||||
| matrix_nginx_proxy_ssl_prefer_server_ciphers: "{{ matrix_nginx_proxy_ssl_presets[matrix_nginx_proxy_ssl_preset]['prefer_server_ciphers'] }}" | |||||
| # Specifies which *SSL Cipher suites* to use when serving all the various vhosts. | |||||
| # To see the full list for suportes ciphers run `openssl ciphers` on your server | |||||
| matrix_nginx_proxy_ssl_ciphers: "{{ matrix_nginx_proxy_ssl_presets[matrix_nginx_proxy_ssl_preset]['ciphers'] }}" | |||||
| # Controls whether the self-check feature should validate SSL certificates. | # Controls whether the self-check feature should validate SSL certificates. | ||||
| matrix_nginx_proxy_self_check_validate_certificates: true | matrix_nginx_proxy_self_check_validate_certificates: true | ||||
| @@ -18,3 +18,9 @@ | |||||
| msg: >- | msg: >- | ||||
| `matrix_ssl_retrieval_method` needs to be set to a known value. | `matrix_ssl_retrieval_method` needs to be set to a known value. | ||||
| when: "matrix_ssl_retrieval_method not in ['lets-encrypt', 'self-signed', 'manually-managed', 'none']" | when: "matrix_ssl_retrieval_method not in ['lets-encrypt', 'self-signed', 'manually-managed', 'none']" | ||||
| - name: Fail on unknown matrix_nginx_proxy_ssl_config | |||||
| fail: | |||||
| msg: >- | |||||
| `matrix_nginx_proxy_ssl_preset` needs to be set to a known value. | |||||
| when: "matrix_nginx_proxy_ssl_preset not in ['modern', 'intermediate', 'old']" | |||||
| @@ -5,7 +5,7 @@ | |||||
| gzip_types text/plain application/json application/javascript text/css image/x-icon font/ttf image/gif; | gzip_types text/plain application/json application/javascript text/css image/x-icon font/ttf image/gif; | ||||
| add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; | add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; | ||||
| add_header X-Content-Type-Options nosniff; | add_header X-Content-Type-Options nosniff; | ||||
| add_header X-Frame-Options SAMEORIGIN; | |||||
| add_header X-Frame-Options SAMEORIGIN; | |||||
| {% for configuration_block in matrix_nginx_proxy_proxy_element_additional_server_configuration_blocks %} | {% for configuration_block in matrix_nginx_proxy_proxy_element_additional_server_configuration_blocks %} | ||||
| {{- configuration_block }} | {{- configuration_block }} | ||||
| {% endfor %} | {% endfor %} | ||||
| @@ -67,9 +67,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_element_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_element_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_element_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_element_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != "" %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -65,9 +65,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_dimension_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_dimension_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_dimension_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_dimension_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -58,9 +58,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_base_domain_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_base_domain_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_base_domain_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_base_domain_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -86,9 +86,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_jitsi_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_jitsi_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_jitsi_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_jitsi_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -51,9 +51,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_riot_compat_redirect_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_riot_compat_redirect_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_riot_compat_redirect_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_riot_compat_redirect_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -203,9 +203,12 @@ server { | |||||
| ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_matrix_hostname }}/fullchain.pem; | ssl_certificate {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_matrix_hostname }}/fullchain.pem; | ||||
| ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_matrix_hostname }}/privkey.pem; | ssl_certificate_key {{ matrix_ssl_config_dir_path }}/live/{{ matrix_nginx_proxy_proxy_matrix_hostname }}/privkey.pem; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | ||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {{ render_vhost_directives() }} | {{ render_vhost_directives() }} | ||||
| } | } | ||||
| @@ -235,9 +238,13 @@ server { | |||||
| {% if matrix_nginx_proxy_https_enabled %} | {% if matrix_nginx_proxy_https_enabled %} | ||||
| ssl_certificate {{ matrix_nginx_proxy_proxy_matrix_federation_api_ssl_certificate }}; | ssl_certificate {{ matrix_nginx_proxy_proxy_matrix_federation_api_ssl_certificate }}; | ||||
| ssl_certificate_key {{ matrix_nginx_proxy_proxy_matrix_federation_api_ssl_certificate_key }}; | ssl_certificate_key {{ matrix_nginx_proxy_proxy_matrix_federation_api_ssl_certificate_key }}; | ||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | |||||
| ssl_prefer_server_ciphers on; | |||||
| ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; | |||||
| ssl_protocols {{ matrix_nginx_proxy_ssl_protocols }}; | |||||
| {% if matrix_nginx_proxy_ssl_ciphers != '' %} | |||||
| ssl_ciphers {{ matrix_nginx_proxy_ssl_ciphers }}; | |||||
| {% endif %} | |||||
| ssl_prefer_server_ciphers {{ matrix_nginx_proxy_ssl_prefer_server_ciphers }}; | |||||
| {% endif %} | {% endif %} | ||||
| location / { | location / { | ||||