Mateus Müller

O carinha do Linux

24 abr. 2023

Como configurar TLS para o Spinnaker no modo Local (Standalone)

Fala pessoal! Mais um artigo pra deixar registrado depois de passar um bom trabalho com o Spinnaker rsrs.

O Spinnaker tem uma arquitetura de microserviços como pode ser visto aqui. Ao instalar no modo Local, todos os microserviços rodam na mesma VM em portas diferentes, se comunicando via interface de loopback.

É claro que isso não é o ideal para um cenário de produção, mas para meu homelab estava mais do que bom. Porém, eu estava batendo no Spinnaker com https://<ip da vm>:9000 (feio pra caramba). Queria usar um nome bonitinho como spinnaker.mateusmuller.me e HTTPS com a minha CA privada.

E nada mais fácil do que adicionar um proxy na frente pra fazer o TLS termination. Escolhi o NGINX porque estou mais familiarizado, mas também poderia optar por um HAProxy da vida.

Bom, você pode configurar TLS diretamente na keystore do Java usada pelo Spinnaker como documentado aqui, mas eu optei pelo uso do NGINX porque tenho mais know-how e daria muito menos trabalho.

Sem mais delongas, vamos lá.

1. Instalar o NGINX

Primeiro passo é instalar o NGINX. Estou usando uma VM do Ubuntu para hostear o Spinnaker, então:

$ sudo apt install nginx -y

2. Gerar o certificado e chave privada.

O segundo passo é obviamente ter um certificado e uma chave privada (os famosos .crt e .key). Se você ainda não tem, tem vários artigos na Internet que explicam como criar certificados auto-assinados. Exemplo:

No meu caso, gerencio toda a estrutura de TLS do meu Homelab no Hashicorp Vault. Só tive que ir na interface e pedir um novo certificado para o nome spinnaker.mateusmuller.me.

É bem importante que o CN (Common Name) e SAN (Subject Alternative Names) batam com o nome (DNS) que será usado para acessar o Spinnaker.

3. Configurar o NGINX.

No meu caso, editei o seguinte arquivo:

$ sudo vim /etc/nginx/sites-available/default

Poderia, claro, ter criado uma configuração a parte. Porém, como esse NGINX só vai fazer o proxy pass pro Spinnaker, não vi motivos para isso.

Ao final do arquivo adicione o seguinte:

upstream deck {
    server 127.0.0.1:9000 fail_timeout=3;
}

upstream gate {
    server 127.0.0.1:8084 fail_timeout=3;
}

server {
    listen       80;
    listen       443 default ssl;

    ssl_certificate /etc/nginx/certs/spinnaker.crt;
    ssl_certificate_key /etc/nginx/certs/spinnaker.key;

    server_name  spinnaker.mateusmuller.me;

    location /login {
        add_header ServerHostname $hostname;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass_header Server;
        proxy_redirect off;

        # We match = "http" rather than != "https" because we don't want it
        # to redirect if you're running docker locally.  And '=', not '=='
        # because nginx.
        if ($http_x_forwarded_proto = "http") {
            rewrite ^(.*)$ https://$http_host$1 permanent;
        }

        proxy_pass http://gate/login;
    }

    location /auth/redirect {
         rewrite ^(.*)$ https://$http_host permanent;
    }

    location ~ /gate/(?<gate_path>.+) {
	set $allowspace $1;
        add_header ServerHostname $hostname;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass_header Server;
        proxy_redirect off;

        proxy_pass http://gate/$allowspace$is_args$args;
    }

    location / {
        add_header ServerHostname $hostname;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass_header Server;
        proxy_redirect off;

        # We match = "http" rather than != "https" because we don't want it
        # to redirect if you're running docker locally.  And '=', not '=='
        # because nginx.
        if ($http_x_forwarded_proto = "http") {
            rewrite ^(.*)$ https://$http_host$1 permanent;
        }

        proxy_pass http://deck;
    }
}

Eu extrai esse arquivo dessa issue aqui e só fiz algumas modificações.

Muito cuidado com esses parâmetros do arquivo de configuração:

  • ssl_certificate: Onde está localizado o arquivo .crt do certificado.
  • ssl_certificate_key: Onde está localizado a chave privada do certificado.
  • server_name: O nome DNS que esse NGINX vai responder.

E vamos restartar.

$ sudo systemctl restart nginx

4. Configurar o Spinnaker

Precisamos atualizar o Gate e a API para responder nesse novo domínio.

$ hal config security ui edit --override-base-url https://spinnaker.mateusmuller.me
$ hal config security api edit --override-base-url https://spinnaker.mateusmuller.me/gate
$ sudo hal config deploy

E é isso pessoal, espero que ajude! :)

Qualquer dúvida é só comentar. Grande abs!

Buy me a coffeeBuy me a coffee
Comentários Disqus