Acessando suas instâncias Cloud SQL com SQL Auth Proxy

Esse serviço oferece um meio seguro de acessar suas instâncias do Cloud SQL sem precisar de redes autorizadas ou mesmo configurar SSL para fazer conexão ao banco de dados. Ele oferece algumas vantagens:

  • Conexões seguras: o Auth Proxy automaticamente encripta todo o tráfego de dados de ponta a ponta utilizando TLS 1.3 com 256-bit AES cipher. Em toda a comunicação é utilizado certificados SSL para verificar a identidade do client e do server, independente do protocolo do banco de dados, fora que não precisa gerenciá-los.
  • Autorização de conexão facilitada: é utilizado as permissões IAM para controlar quem e quando conectar na sua instância. Além disso o Auth Proxy lida com a autenticação com o Cloud SQL, de forma que remove a necessidade de prover um endereço de IP estático.
  • Autenticação do banco via IAM: opcionalmente o Auth Proxy suporta a opção de atualização automática de tokens OAuth 2.0

O Auth Proxy não fornece um novo caminho de conectividade, então ele depende da conectividade existente. Para conectar utilizando o IP privado, é preciso estar em um recurso com acesso à mesma rede VPC da instância.

Requisitos de utilização

Para fazer uso dela precisa seguir algumas premissas:

  • Precisa ter o Cloud SQL Admin API habilitado
  • Prover para o Auth Proxy credenciais de autenticação do GCP
  • Prover para o Auth Proxy as contas de usuário e senhas do banco válidos
  • A instância deve ter um IP público IPv4 ou ser configurado para utilizar o IP privado

Para fazer a instalação, siga as instruções da documentação.

Como o Cloud SQL Auth Proxy funciona?

O serviço segue alguns passos para chegar no objetivo que é disponibilizar uma conexão disponível no banco:

  1. Começando por um client local executando no mesmo ambiente da aplicação, por exemplo. Ela comunica com o Auth Proxy através do protocolo do banco de dados, como seria comunicado diretamente com a base de dados.
  2. Em seguida, o Auth Proxy usa um túnel seguro para comunicar com o processo semelhante sendo executado no servidor. Cada conexão estabelecida através do Auth Proxy cria uma conexão para a instância Cloud SQL.
  3. Quando essa aplicação conecta através do Auth Proxy, o client local verifica se já possui uma conexão disponível entre ela, e a instância Cloud SQL. Caso contrário, é solicitado uma nova, gerando inclusive certificados SSL efêmeros e assim utilizados nessa comunicação

Abaixo a imagem traz uma visão geral de tudo isso:

Pasted image 20220322125514.png

Observação: Esse certificados efêmeros expiram em aproximadamente 1 hora, mas o Auth Proxy tem a inteligência de solicitar uma renovação antes disso acontecer.

Autenticação via Service Account

O Cloud SQL Auth Proxy se utiliza dos Service Accounts para autorizar a conexão entre o client e a instância. Dessa forma, tenha disponível essa chave e passe via parâmetro para o cloud_sql_proxy. Quando for utilizar esse meio, se certifique que sua chave tenha a role que gerencia as ações necessárias no Cloud SQL, portanto, dentre sua lista de permissões adicione cloudsql.instance.connect entre elas para que tenha disponível ações relacionados a:

  • Cloud SQL Client
  • Cloud SQL Editor
  • Cloud SQL Admin

Criando conexão para acesso ao banco de dados

Abaixo temos um exemplo de execução do comando cloud_sql_proxy para criar uma nova conexão com uma instância, a partir do seu Connection Name, que é o mais recomendado porque ele atua como um “DNS” do recurso, sem recorrer a IP estáticos:

cloud_sql_proxy -instance=projecttest-1235:us-central1:my-cloudsql-instance=tcp:5432

Com o comando acima é disponibilizado um acesso a instância a partir do protocolo TCP, utilizando o host localhost e a porta 5432. Quando é executado esse comando, aparece algumas informações interessantes que traz relação ao que falamos anteriormente:

2022/03/22 14:56:54 Rlimits for file descriptors set to {Current = 8500, Max = 524288}
2022/03/22 14:56:55 Listening on 127.0.0.1:5432 for projecttest-1235:us-central1:my-cloudsql-instance
2022/03/22 14:56:55 Ready for new connections
2022/03/22 14:56:55 Generated RSA key in 86.817487ms

Isso significa que a instância está disponível. Agora se tentarmos uma conexão ao banco de dados, utilizando o cliente da mesma ferramenta, que no nosso caso seria o psql, e passasse os dados necessários como o nome do banco, host, porta e credenciais, ele vai gerar o certificado efêmero e finalizar a comunicação para finalmente acessar a base:

psql -U postgres -h 0.0.0.0 -p 5432 -d my-database
2022/03/22 14:57:06 New connection for "projecttest-1235:us-central1:my-cloudsql-instance"
2022/03/22 14:57:06 refreshing ephemeral certificate for instance projecttest-1235:us-central1:my-cloudsql-instance
2022/03/22 14:57:07 Scheduling refresh of ephemeral certificate in 54m59.591751748s