Introdução:
Computação em nuvem é um modelo de computação baseado na internet que permite aos usuários acessar e utilizar recursos de computação (como servidores, armazenamento, bancos de dados, redes, software, aplicativos e serviços) de forma on-demand, flexível e escalável, sem a necessidade de conhecimento ou gerenciamento ativo por parte do usuário dos sistemas físicos que suportam esses recursos. Essencialmente, a computação em nuvem transforma a infraestrutura de TI tradicional, onde os recursos são adquiridos e gerenciados localmente, em um serviço acessível via internet que pode ser dimensionado para cima ou para baixo de acordo com as necessidades do usuário.
Existem três modelos principais de serviço na computação em nuvem:
- Infrastructure as a Service (IaaS): Fornece aos usuários acesso a recursos de computação como servidores virtuais, armazenamento e redes. Os usuários têm controle sobre os sistemas operacionais e as aplicações, mas não sobre a infraestrutura física.
- Platform as a Service (PaaS): Oferece um ambiente de desenvolvimento e implantação na nuvem, permitindo aos usuários criar e hospedar aplicações sem se preocupar com a infraestrutura subjacente, sistemas operacionais ou atualizações de hardware.
- Software as a Service (SaaS): Fornece aos usuários acesso a aplicativos de software e suas funcionalidades remotamente como um serviço. O fornecedor de SaaS gerencia a infraestrutura, as plataformas e os detalhes do software, permitindo aos usuários acessar o serviço através da internet, geralmente mediante uma assinatura.
Compartilhamento de responsabilidade
A computação em nuvem é fundamental para muitos aspectos da tecnologia moderna, incluindo o armazenamento e processamento de big data, hospedagem de sites e aplicações, inteligência artificial, aprendizado de máquina e muito mais, oferecendo vantagens como custo-benefício, escalabilidade, flexibilidade, eficiência e acesso a tecnologias avançadas.
O modelo de responsabilidade compartilhada na computação em nuvem é um conceito fundamental que define como a segurança e o gerenciamento das infraestruturas de computação em nuvem são divididos entre o provedor de serviços de nuvem (CSP) e o cliente (usuário da nuvem). Este modelo varia dependendo do tipo de serviço de nuvem utilizado (IaaS, PaaS, SaaS), mas o princípio central é que, embora o provedor de nuvem seja responsável pela segurança da nuvem em si, o cliente é responsável pela segurança do que ele coloca e opera na nuvem.
IaaS (Infrastructure as a Service)
Responsabilidade do Provedor: No modelo IaaS, o provedor de serviços de nuvem é responsável pela segurança da infraestrutura de hardware e software subjacente, incluindo data centers, rede, servidores físicos, e a camada de virtualização.
Responsabilidade do Cliente: O cliente é responsável pela gestão dos sistemas operacionais, middleware, aplicativos, e dados que opera na infraestrutura. Isso inclui responsabilidades como atualizações de segurança do sistema operacional, configuração de firewalls, controle de acesso e proteção de dados.
PaaS (Platform as a Service)
Responsabilidade do Provedor: No modelo PaaS, além da infraestrutura, o provedor de serviços de nuvem também é responsável pela segurança e manutenção da plataforma de desenvolvimento, incluindo sistemas operacionais, serviços de banco de dados, ferramentas de desenvolvimento e outros middleware.
Responsabilidade do Cliente: O cliente se concentra na construção, no deployment e na gestão de suas aplicações e dados que rodam sobre a plataforma. Isso inclui a segurança a nível de aplicação, como a gestão de identidades e acessos, a proteção dos dados da aplicação e a implementação de lógicas de negócio seguras.
SaaS (Software as a Service)
Responsabilidade do Provedor: No modelo SaaS, o provedor é responsável por quase todos os aspectos da infraestrutura, incluindo a segurança da aplicação, a infraestrutura de rede, e a persistência dos dados. Eles gerenciam a segurança da plataforma, as atualizações de software, a correção de vulnerabilidades e a segurança física dos data centers.
Responsabilidade do Cliente: O cliente é geralmente responsável pela gestão de suas contas e usuários, incluindo a configuração de políticas de acesso, a proteção da integridade de seus dados ao inseri-los no serviço e a segurança de suas credenciais de acesso.
Importância do Modelo de Responsabilidade Compartilhada
Este modelo é crucial para garantir a segurança e a conformidade em ambientes de nuvem, pois esclarece que, embora os provedores de nuvem tenham medidas robustas para proteger a infraestrutura, os clientes têm um papel ativo na proteção de seus próprios dados e aplicações. Isso significa que os clientes precisam entender suas responsabilidades e implementar práticas de segurança adequadas para seus componentes no ambiente de nuvem.
A compreensão clara do modelo de responsabilidade compartilhada ajuda as organizações a adotarem a computação em nuvem de forma segura, garantindo que medidas de segurança adequadas sejam aplicadas em todos os níveis da infraestrutura de TI.
Provedores de cloud
Atualmente existem dezenas (ou centenas) de provedores de serviços de computação em nuvem, dentre eles destacamos:
Vantagens do uso de Cloud Computing para Pentest
No modelo de computacional tradicional, o processamento de dados é feito em seu computador, através de suas máquinas virtuais que se conectam a uma VPN e a partir daí seus alvos são acessados. Neste modelo, é importante que seu computador tenha uma configuração razoável para que consiga processar todas as ferramentas e demandas.
No modelo de computação baseada em nuvem, não importa o equipamento ou a performance do seu host local, uma vez que o processamento ocorre nos hosts do provedor. Além disso, você pode acessar esses hosts de qualquer lugar, até mesmo do seu smartphone.
Construindo nosso lab
Escolhendo o Provedor de Cloud
Para nossa aula, utilizaremos os serviços em Cloud da Digital Ocean
Utilize o link abaixo para ter 60 dias de acesso gratuito:
https://m.do.co/c/dd62f5ff6b51
Crie sua conta de acesso
Responda ao questionário de uso da plataforma
Insira as informações de pagamento (Você terá 60 dias antes de receber a sua primeira fatura)
Para acessar a console, clique em Explore our control panel
Entendendo as informações do painel
Configurando a API
Clique no botão API para criarmos nossa API que utilizaremos para automatizar a criação de nossas máquinas.
Clique no botão Generate New Token
Preencha com o nome que desejar, altere a expiração para No Expire e deixe ativa a opção Write
Copie o token e salve em um local seguro:
Criando nosso Servidor
Agora criaremos nosso host manualmente, utilizando a Plataforma da Digital Ocean. Em seguida faremos a configuração automática, utilizando a API que salvamos.
- Clique no botão create e em seguida selecione a opção Droplet
- Selecione a Região para seu servidor. Quanto mais próximo do local de acesso, melhor a performance, portanto, recomendo selecionar New York ou San Fransisco
- Mantenha as configurações de rede e de OS como estão
- Selecione o Tipo Basic de Droplet e marque a CPU para Premium Intel.
- Em seguida marque o equipamento de menor valor: USD $8 mensais ou USD $0,012.
Após os 60 dias de teste, esse será o valor debitado mensalmente. Cerca de R$40,00 mensais
- Crie uma senha para o seu servidor, respeitando os critérios definidos abaixo:
- Defina o nome do computador ou pode deixar como sugerido pela Plataforma.
- Clique em Create Droplet e aguarde o carregamento do Servidor
- Em poucos segundos seu servidor estará disponível para uso.
- Acessando o Servidor
- Pronto! Você está conectado ao servidor.
Automatizando a criação das máquinas
Agora criaremos nosso servidor, utilizando SCRIPTS desenvolvidos para o curso. Estes scripts são bonus e você poderá utilize-los para qualquer conexão com seus hosts na Digital Ocean.
servidor.sh para Linux
Edite o arquivo servidor.sh e inclua o token da Digital Ocean que você criou e as configurações do host:
Código Fonte Servidor.sh
#!/bin/bash
DIGITALOCEAN_TOKEN=”COLOQUE SEU TOKEN AQUI”
HOSTNAME=”meuservidor”
REGION= “nyc1”
SIZE=”s-1vcpu-1gb-35gb-intel”
IMAGE=”debian-12-x64″
TEMPO=40
vermelho=”\e[31m”
verde=”\e[32m”
amarelo=”\e[33m”
azul=”\e[34m”
reset=”\e[0m” # Reseta a cor para o padrão
#valida se o jq está instalado
binario=”jq”
if ! which $binario &> /dev/null; then
echo -e “${vermelho}O binário ${reset} $binario ${vermelho} não está instalado. Por favor, instale-o com o comando ${amarelo}apt install jq -y ${vermelho}antes de prosseguir.${reset}”
exit 1
fi
# Função para criar a moldura
function criar_moldura() {
local largura=80 # Largura da moldura
local texto=”$1″ # Texto a ser exibido
local centralizar=$((($largura – ${#texto}) / 2))
for ((i = 0; i < $centralizar; i++)); do
echo -n “-“
done
echo -n ” $texto “
for ((i = $centralizar + ${#texto} + 2; i < $largura; i++)); do
echo -n “-“
done
echo “”
}
# Cabeçalho
while true; do
clear
criar_moldura “Conector Digital Ocean by Leonardo La Rosa aka RL34075”
# Exibe o menu de seleção
select option in “Iniciar $HOSTNAME” “Consultar $HOSTNAME” “Deletar $HOSTNAME” “Sair”; do
case $option in
“Iniciar $HOSTNAME”)
echo “”
echo -e “${amarelo}* Iniciando a criação do ${reset}$HOSTNAME ${reset}”
curl -X POST -H “Content-Type: application/json” -H “Authorization: Bearer $DIGITALOCEAN_TOKEN” -d ‘{“name”:”‘$HOSTNAME'”,”region”:”‘$REGION'”,”size”:”‘$SIZE'”,”image”:”‘$IMAGE'”,”backups”:false,”ipv6″:false,”user_data”:null,”private_networking”:null,”volumes”:null,”tags”:[“‘$HOSTNAME'”]}’ “https://api.digitalocean.com/v2/droplets” > /dev/null 2>&1
echo “”
while [ $TEMPO -ge 0 ]; do
echo -ne “${amarelo}\r* Aguarde: $TEMPO segundos para o ${reset}$HOSTNAME ${amarelo}ser iniciado ${reset}”
sleep 1 # Pausa por 1 segundo
TEMPO=$(($TEMPO – 1))
done
# Execute o comando curl e armazene a saída JSON em uma variável
hostx=$(curl -s -X GET -H “Content-Type: application/json” -H “Authorization: Bearer $DIGITALOCEAN_TOKEN” “https://api.digitalocean.com/v2/droplets?page=1&per_page=1&tag_name=$HOSTNAME” | jq -r ‘.droplets[0].networks.v4[0].ip_address’)
echo -e “\n${amarelo}* Para se conectar digite: ${reset}ssh root@$hostx\n ${reset}”
echo “”
select option in “Acessar $HOSTNAME” “Não acessar $HOSTNAME”; do
case $option in
“Acessar $HOSTNAME”)
echo -e “\n${amarelo}* Conectando a ${reset}$HOSTNAME\n ${reset}”
echo “”
ssh root@$hostx
;;
“Não acessar $HOSTNAME”)
break
;;
*)
echo “* ${vermelho}Opção inválida. Por favor, escolha uma opção válida.${reset}”
;;
esac
done
;;
“Consultar $HOSTNAME”)
hostx=$(curl -s -X GET -H “Content-Type: application/json” -H “Authorization: Bearer $DIGITALOCEAN_TOKEN” “https://api.digitalocean.com/v2/droplets?page=1&per_page=1&tag_name=$HOSTNAME” | jq -r ‘.droplets[0].networks.v4[0].ip_address’)
if [ -z “$hostx” ]; then
echo -e “* $HOSTNAME ${vermelho}não encontrado! ${reset}”
echo “”
break
else
echo -e “\n${amarelo}* Para se conectar digite: ${reset}ssh root@$hostx\n ${reset}”
echo “”
select option in “Acessar $HOSTNAME” “Não acessar $HOSTNAME”; do
case $option in
“Acessar $HOSTNAME”)
echo -e “\n${amarelo}* Conectando a ${reset}$HOSTNAME\n ${reset}”
echo “”
ssh root@$hostx
;;
“Não acessar $HOSTNAME”)
break
;;
*)
echo “* Opção inválida. Por favor, escolha uma opção válida.”
;;
esac
done
fi
;;
“Deletar $HOSTNAME”)
curl -X DELETE -H “Content-Type: application/json” -H “Authorization: Bearer $DIGITALOCEAN_TOKEN” “https://api.digitalocean.com/v2/droplets?tag_name=”$HOSTNAME
;;
“Sair”)
echo “Saindo…”
break
;;
*)
echo “Opção inválida. Por favor, escolha uma opção válida.”
;;
esac
done
break
sleep 1 # Intervalo de atualização do cabeçalho (1 segundo)
done
servidor.ps1 para Windows
Edite o arquivo servidor.ps1 e inclua o token da Digital Ocean que você criou e as configurações do host:
Código fonte Servidor.ps1
$OutputEncoding = [System.Text.Encoding]::UTF8
$DIGITALOCEAN_TOKEN = “COLOQUE SEU TOKEN AQUI”
$HOSTNAME = “meuservidor“
# Exibe o menu de seleção
do {
Clear-Host
$option = Read-Host @”
————- Conector Digital Ocean by Leonardo La Rosa aka RL34075 ———–
Escolha uma opção:
- Iniciar $HOSTNAME
- Consultar $HOSTNAME
- Deletar $HOSTNAME
- Sair
“@
switch ($option) {
“1” {
Write-Host “>>Iniciando a criacao do $HOSTNAME”
$body = @{
name = $HOSTNAME
region = “nyc1“
size = “s-1vcpu-1gb-35gb-intel“
image = “ubuntu-20-04-x64“
backups = $false
ipv6 = $false
user_data = $null
private_networking = $null
volumes = $null
tags = @($HOSTNAME)
} | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri “https://api.digitalocean.com/v2/droplets” -Headers @{
“Content-Type” = “application/json”
“Authorization” = “Bearer $DIGITALOCEAN_TOKEN”
} -Body $body > $null
$TempoTotalEmSegundos = 60
$TempoRestante = $TempoTotalEmSegundos
while ($TempoRestante -gt 0) {
Clear-Host # Limpa o console para exibir a contagem atualizada
Write-Host “Aguarde $TempoRestante segundos para iniciar o $HOSTNAME”
Start-Sleep -Seconds 1
$TempoRestante–
}
# Execute o comando Invoke-RestMethod e armazene a saída JSON em uma variável
$hostx = Invoke-RestMethod -Method Get -Uri “https://api.digitalocean.com/v2/droplets?page=1&per_page=1&tag_name=$HOSTNAME” -Headers @{
“Content-Type” = “application/json”
“Authorization” = “Bearer $DIGITALOCEAN_TOKEN”
} | Select-Object -ExpandProperty droplets | ForEach-Object {
$_.networks.v4 | Where-Object { $_.type -eq “public” } | Select-Object -ExpandProperty ip_address
}
Write-Host “Para se conectar via ssh digite: ssh root@$hostx”
do {
$subOption = Read-Host @”
Escolha uma opção:
- Acessar $HOSTNAME via SSH
- Nao acessar $HOSTNAME
“@
switch ($subOption) {
“1” {
ssh root@$hostx
return
}
“2” {
return
}
default {
Write-Host “Opcao invalida. Por favor, escolha uma opcao valida.”
}
}
} while ($subOption -ne “1” -and $subOption -ne “2”)
}
“2” {
# Execute o comando Invoke-RestMethod e armazene a saída JSON em uma variável
$hostx = Invoke-RestMethod -Method Get -Uri “https://api.digitalocean.com/v2/droplets?page=1&per_page=1&tag_name=$HOSTNAME” -Headers @{
“Content-Type” = “application/json”
“Authorization” = “Bearer $DIGITALOCEAN_TOKEN”
} | Select-Object -ExpandProperty droplets | ForEach-Object {
$_.networks.v4 | Where-Object { $_.type -eq “public” } | Select-Object -ExpandProperty ip_address
}
if ([string]::IsNullOrEmpty($hostx)) {
Write-Host “$HOSTNAME nao encontrado”
} else {
Write-Host “Para se conectar via ssh digite: ssh root@$hostx”
do {
$subOption = Read-Host @”
Escolha uma opcao:
- Acessar $HOSTNAME via SSH
- Nao acessar $HOSTNAME
“@
switch ($subOption) {
“1” {
ssh root@$hostx
return
}
“2” {
return
}
default {
Write-Host “Opcao invalida. Por favor, escolha uma opcao valida.”
}
}
} while ($subOption -ne “1” -and $subOption -ne “2”)
}
}
“3” {
Invoke-RestMethod -Method Delete -Uri “https://api.digitalocean.com/v2/droplets?tag_name=$HOSTNAME” -Headers @{
“Content-Type” = “application/json”
“Authorization” = “Bearer $DIGITALOCEAN_TOKEN”
}
}
“4” {
Write-Host “Saindo…”
return
}
default {
Write-Host “Opaoo invalida. Por favor, escolha uma opcao valida.”
}
}
} while ($true)