Deploy automatizado do Bastion
- fernando freitas do vale
- 14 de jul.
- 4 min de leitura

1 - O que é o Bastion
2 - Vantagens e desvantagens da automação
3 - Pré requisitos para deploy automatizado do bastion
4 - Logic App
5 - Testes
6 - Automation Account
1 - O que é o Bastion
O Azure Bastion é um serviço de PaaS totalmente gerenciado que você provisiona para se conectar com segurança às máquinas virtuais por meio de um endereço IP privado. Ele fornece conectividade RDP/SSH segura e contínua para suas máquinas virtuais diretamente pelo TLS no portal do Azure ou por meio do cliente SSH ou RDP nativo já instalado no computador local. Ao se conectar por meio do Azure Bastion, suas máquinas virtuais não precisarão de um endereço IP público, nem de um agente e tampouco de um software cliente especial.
O Bastion fornece conectividade RDP e SSH segura a todas as VMs da rede virtual na qual ele é provisionado. O uso do Azure Bastion protege suas máquinas virtuais contra a exposição das portas RDP/SSH ao mundo externo, fornecendo acesso seguro usando o RDP/o SSH.
2 - Vantagens e desvantagens da automação
Custo: O Custo cai significativamente uma vez que o Bastion não tem como ser desligado, ele consome todas as horas enquanto ele existir, com a automação o custo cai significativamente, em alguns cenários tem um saving de 85%.
Deploy: O deploy automatizado com um comando ou um clique reduz o débito técnico a implantação do Bastion, fazendo que toda equipe esteja apta a utilizá-la
Prazo de deploy: O prazo do deploy em determinados cenários pode entrar como ponto negativo, uma vez que leva em torno de 10 minutos (no nosso ambiente), em cenários extremamente críticos isso pode ser um fator a ser levado em consideração.
3 - Pré requisitos para deploy automatizado do bastion
AZ CLI
Nesse tutorial utilizaremos como referência o Az CLI, todos os comandos utilizados podem ser realizados via Powershell ou via Portal.
Virtual Network
Primeiramente precisamos realizar o deploy de um Virtual Network, se vc já tem uma Virtual Network a mesma pode ser reaproveitada basta criar a subnet do Bastion.
Além disso o Bastion conecta em todas as Virtual Networks que possui peering na sua arquitetura.
Criando VNET e Subnet no mesmo comando, lembrando que a subnet tem que ser pelo menos /26:
az network vnet create --name MinhaVNetBastion --resource-group MeuGrupoDeRecursos --location brazilsouth --address-prefix 10.0.0.0/16 --subnet-name AzureBastionSubnet --subnet-prefix 10.0.0.0/26
Criando somente a subnet do bastion em uma Vnet Existente:
az network vnet subnet create --resource-group RGdaVnetExistente --vnet-name VnetExistente --name AzureBastionSubnet --address-prefixes 10.0.2.0/26
Essa configuração pode ser realizada pelo portal e pelo powershell, basta respeitar as configurações do "AzureBastionSubnet"
IP Público:
Um dos pré requisitos é o IP Público Standard, então segue o comando:
az network public-ip create --resource-group MeuGrupoDeRecursos --name PIP-Bastion
4 - Logic App
O deploy é realizado via Logic App então vamos para a criação:
Na primeira tela escolha a opção Multi-tenant, as primeiras 4000 ações do Logic App são free, para esse deploy é mais do que o suficiente para o Logic App não tenha custos.

Crie o LogicApp de acordo com seu ambiente:

Com o Logic App criado vamos configurar a identidade, mudar para "On".


Em seguida dar permissão de Contributor no RG onde será criado o Bastion e também na Vnet, como o ambiente é de Lab a vnet ta no mesmo RG onde será criado o Bastion,
Clicar em Azure Role Assignments da imagem acima:

Vamos criar o Design do Logic App


{
"properties": {
"Action": {
"type": "string"
}
},
"type": "object"
}
Em Request Body JSON Schema preencher com o código acima:

Em seguida Salve e volte para a tela de Parameters,

No futuro usaremos o HTTP URL

Na janela que abrir clique em "Control"

Em Seguida em "Switch"

Ao lado de "On" clique no raio.

Escolha a opção "Action"


Selecione a opção "+" a esquerda

Digite "Deploy" (vai ser o comando no post http) e em seguida clique no adicionar

Procure por Create or Update a template deployment

Logue com sua conta

Preencha com suas informações:

Em seguida vamos preencher os Parâmetros e os Conteúdos:
PARÂMETROS (PARAMETERS)
{
"bastionHosts_name": {
"value": "BAS-TESTE-DEV
},
"publicIPAddresses_externalid": {
"value": "/subscriptions/*{$SubID}*/resourceGroups/*{SEURGAQUI}*/providers/Microsoft.Network/publicIPAddresses/*{SEUPUBLICIPAQUI}*"
},
"virtualNetworks__externalid": {
"value": "/subscriptions/*{$SubID}*/resourceGroups/*{SEURGAQUI}*/providers/Microsoft.Network/virtualNetworks/*{SUAVNETAQUI}*"
},
"bastion_location": {
"value": "canadacentral"
}
}
Em seguida o conteúdo (Content)
Basta alterar os valores, ou copiar o ResourceID da Vnet e do PublicIP e substituir.
Agora vamos começar a definir no app



Clique no Add entre Case e Default

Coloque Delete (vai ser a palavra para deletar o ambiente) nos parâmetros e vá em add

Digite HTTP e escolha conforme a imagem:

Edite a url conforme seu ambiente:
Cole conforme a imagem:

5 - Testes
Para realizar os testes podemos utilizar o Curl no Bash (ou cmd porém com adaptações) ou Invoke no powershell.
Bash
curl --location --request POST "https://prod-28.brazilsouth.logic.azure.com:443/workflows/1e91071791ca46f8bb69204a5b9b6e66/triggers/When_a_HTTP_request_is_received/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=QzXKlvrgl1h7i126_GIxcXXk24pv9-ERQm6OqT2titE" --header 'Content-Type: application/json' --data-raw '{"Action":"Deploy"}'
CMD
curl -X POST "https://prod-24.brazilsouth.logic.azure.com:443/workflows/33dfc9f259bc4ce6a637ae9b6e0edc8a/triggers/When_a_HTTP_request_is_received/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=MoAvnisgNGnOjlSQyXmzVizaL3pJztZU0lIXniFSd4w" -H "Content-Type: application/json" -d "{\"Action\":\"Delete\"}"
Powershell
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/json")
$body = "{`"Action`":`"Deploy`"}"
$response = Invoke-RestMethod $RequestURL -Method 'POST' -Headers $headers -Body $body


Agora para o remover o bastion basta usar o mesmo comando trocando a action Deploy por Delete.
O tempo do run de Deploy e Delete são diferentes no Logic App, no Deploy ele da como sucesso somente o ato de mandar criar o Bastion, já no delete ele da sucesso somente quando remove o recurso.

6 - Automation Account
A automation account serve para criar recorrência do Delete e para ter uma tela de Deploy sem precisar utilizar Curl ou Invoke.
Deploy
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/json")
$body = "{`"Action`":`"Deploy`"}"
$RequestURL = "url do seu logicapp"
$response = Invoke-RestMethod $RequestURL -Method 'POST' -Headers $headers -Body $body
Delete
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/json")
$body = "{`"Action`":`"Delete`"}"
$RequestURL = "url do seu logicapp"
$response = Invoke-RestMethod $RequestURL -Method 'POST' -Headers $headers -Body $body
É bacana também fazer um schedule para o delete caso esqueça de remover depois do deploy.
Enjoy!!!!
Comments