NetworkMix
VPNs Site-to-Site em algumas situações são estabelecidas na correria ou com documentação deficiente e uma das informações principais que é a Pre-Shared-Key, muitas vezes é perdida com o tempo. Nesse artigo vamos abordar como colher essa informação via API.
Para buscarmos essa informação, utilizaremos um API Token, que é a nossa identificação que apresentaremos ao firewall para então ele permitir (ou não) colhermos a informação desejada.
O artigo abaixo demonstra como criar o nosso Token:
Assim que temos o nosso Token, podemos seguir com a criação do nosso script.
Em nosso exemplo temos um firewall (192.168.88.192), estabelecendo túneis com 3 diferentes peers:
O código pronto, pode ser colhido no seguinte caminho:
https://github.com/ikky-ba/restore-psk-fortigate/blob/main/main.py
Para evitar a execução de algo em seu ambiente sem total entendimento, segue uma breve descrição do que cada linha do código faz (a documentação também está inclusa no arquivo):
# Importar modulos
## Importar modulo requests
import requests
## Importar modulo urllib
import urllib3
## Desabilitar alertas de certificados não confiáveis
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
## Importar modulo json
import json
# Inicializacao de variaveis e dicionarios
## Inicialização do dicionário 'keys', utilizaremos ele para armazenar o resultado bruto recebido pelo firewall
keys = {}
## Inicialização do dicionário 'tunnel_info' que utilizaremos para armazenar apenas os dados que queremos (IP e PSK)
tunnel_info = {}
## Inicialização da variável 'count_tunnel' é ela que usaremos para garantir que buscaremos a informação de todos os túneis, independente da quantidade
count_tunnel = 0
# Criação da funcao 'retrieve_keys', note que ela espera um valor para ser inicializada, no caso é o IP do firewall que buscaremos a informação
def retrieve_keys(ip):
## Definição da varíavel 'url', note que ela está juntando 'https://' com o IP que fornecemos a função
url = 'https://' + ip
## Definição da chamada que faremos ao firewall. Usuários que fazem uso de vdom, coloquem o VDOM no final, logo após o '='
command = '//api/v2/cmdb/vpn.ipsec/phase1-interface?plain-text-password=1?vdom='
## Definição de como nos autenticaremos com o destino, no nosso caso, estamos usando um Token API
headers = {'Authorization': 'Bearer ' + 'SEU_TOKEN_API_VAI_AQUI'}
## Busca dos dados no firewall utilizando os valores anteriores
r = requests.get(url + command, headers=headers, verify=False)
## Retornar os dados em formato de texto
return(r.text)
## Chamada da função 'retrieve_keys) utilizando como destino o IP do firewall
keys = json.loads(retrieve_keys('O_IP_DO_SEU_FIREWALL_VAI_AQUI'))
## Contar a quantidade de túneis o firewall possui
number_of_tunnels = (len(keys['results']))
## Manter em loop a execução da tarefa enquanto não navegarmos em todos os túneis
while count_tunnel < number_of_tunnels:
## Adicionar as informações que estamos buscando (IP e PSK) ao dicionário que iniciamos anteriormente 'tunnel_info'
tunnel_info[(keys['results'][count_tunnel]['remote-gw'])] = (keys['results'][count_tunnel]['psksecret'])
## Adicionar '1' a variável 'count_tunnel'
count_tunnel = count_tunnel + 1
# Printar no console o resultado
print(tunnel_info)
Ao rodarmos o script (fornecendo as informações necessárias, como Token e IP), é esperado que receba o seguinte output:
Como podemos ver, temos como o resultado o IP do peer remoto e a PSK, o script poderia seguir e salvar isso em um txt, ou por exemplo, fazer interface com um sistema interno e inserir essa informação de forma automática sempre que ele detectar que um novo túnel foi criado, ou que teve a chave alterada, as possibilidades são muitas. Além das informações que colhemos, poderíamos ter buscado mais dados, como nome do túnel, quais são as fase2 configuradas, criptografia, etc...