
Estou executando o PostgreSQL em uma instância do Google Cloud Compute Engine e o PostgreSQL está atualmente configurado para aceitar conexões de qualquer lugar, a ideia é usar o firewall para controlar o acesso em vez de ter que fazer login no servidor todas as vezes.
Atualmente tenho uma regra de firewall chamada development-allow-psql
, para garantir que nada mais esteja configurado incorretamente, configurei-a para permitir de qualquer lugar:
Targets: All instances on network
Source Filter: IP Ranges
Source IP Ranges: 0.0.0.0/0
Second Source Filter: None
Specified protocols and ports: tcp:5432
Correndo
psql "dbname=mydb host=__.___.__.__ user=myuser password=mypassword port=5432"
Conecta-me instantaneamente, mas de qualquer lugar, em vez de apenas nas instâncias às quais desejo permitir o acesso.
Essas instâncias são criadas automaticamente por meio Instance Group
de um Instance Template
modelo configurado para criar instâncias com as seguintes configurações:
Network tags: myapp-api, http-server, https-server
Network: development
Subnetwork: development (with address range 10.154.0.0/20)
Quero limitar o acesso a esta instância de banco de dados a instâncias que possuem myapp-api
uma tag ou uma sub-rede 10.154.0.0/20
ou ambas. Então altero minhas configurações de firewall para o seguinte:
Targets: Specified target tags
Target tags: myapp-api
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432
Isso bloqueia o acesso ao psql
comando que executei anteriormente (o comando psql está sendo executado a partir de uma instância do docker à qual tenho acesso via docker exec -ti -u0 my-instance-api-dev-small bash
)
Se eu agora mudar para
Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432
Ainda bloqueia todo o acesso. Se eu remover agora o segundo filtro de origem e filtrar apenas na sub-rede, ainda não haverá acesso.
Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432
Se eu trocar o filtro de origem da sub-rede por um filtro de tags:
Targets: All instances on the network
Source Filter: Source tags
Source tags: myapp-api
Second Source Filter: None
Specified protocols and ports: tcp:5432
... ainda sem acesso.
O mesmo ao selecionar Filtro de origem de sub-redes e apenas selecionar todas as sub-redes.
Mudando para:
Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 0.0.0.0/0
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432
mais uma vez, permite que todos (mesmo fora do Google Cloud) se conectem, mesmo que eu tenha especificado uma tag de origem
Alterar o intervalo de endereços IP para 10.154.0.0/20 mais uma vez bloqueia todos
Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432
Substituir o intervalo de IP pelos endereços IP externos das instâncias, por exemplo, 35.189.124.141/32
funciona, mas como esses endereços IP são temporários, isso não é uma solução, pois exigirá a atualização das regras de firewall sempre que o escalonamento automático adicionar mais instâncias com novos endereços IP.
Como configuro o Firewall para permitir apenas instâncias de uma determinada sub-rede e/ou com determinadas tags? O que estou fazendo não parece estar funcionando.
Responder1
Ao mudar do endereço IP externo da instância do banco de dados para o endereço IP interno, de repente todas as combinações acima funcionam.
psql "dbname=mydb host=internal-ip-address-here user=myuser password=mypassword port=5432"
Acontece que quando você usa tags, o firewall analisa o endereço IP interno em vez do endereço IP externo.
Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432