IaaS: OpenStack – Basic Deploy

IaaS com Openstack

x0001 – Motivação
x0002 – Introdução aka Wtf this guy are talking about
x0003 – Instalação
Homologação
Requisitos Pré-Instalação
OpenStack Deploy
Verificando a Rede.
x0004 – Criando Servidores.
x0005 – Finalizando.

x0001 – Motivação

Em ordem para ter um laboratório descente, resolvi me introduzir à IaaS(Infrastructure as a Service), e como eu sou um cara cyberpunk voltado pra liberdade, irei preparar um ambiente utilizando o OpenStack, é isso ai, fodamse as soluções de virtualização/iaas corporativas.

O servidor que vou deixar rodando é relativamente parrudo(partindo de uma perspectiva pobre), 16Gb de ram com um processador de 8 núcleos da AMD e várias baias para discos ssd/HD, sim, só as baias estão livres pois como eu falei, sou cyberpunk e punks cyberneticos não tem tanto dinheiro assim, porém, tenho 3,5Tb em HD pra brincar, então acredito que vai ser divertido.

x0002 – Introdução

Antes de falar explicitamente sobre o OpenStack, eu vou explicar o que é uma IaaS. Bom, pra começo de conversa, isso não é exatamente apenas um sistema de virtualização, é algo além, é uma infraestrutura de servidores que pode ser utilizada como serviço, logo, você tem uma estrutura de servidores instântaneos que podem ser escaláveis a hora que você quiser atráves da Internet.

É engraçado lá no site da Microsoft Azure, ele fala “Escale ou reduza verticalmente com demanda e pague somente pelo que usar”. Acho que o jogo virou Microsoft, eu não vou pagar porque eu tenho uma IaaS na minha fucking casa. Porra, isso é muito maneiro.

Pra você ter uma ideia, vou dar um breve spoiler, acabei de configurar todo o bagulho e coloquei pra rodar 3 instâncias, segue abaixo uma demonstração pra te motivar a continuar lendo esse paper:

What is OpenStack?

OpenStack foi criado a partir de um núcleo de tecnologias (mais do que é mostrado aqui, mas estes representam os aspectos principais). À esquerda está o painel Horizon, que mostra a interface com o usuário para gerenciar serviços do OpenStack para ambos usuários e administradores. A Nova fornece uma plataforma de cálculo escalável, suportando o fornecimento e gerenciamento de grandes quantidades de servidores e máquinas virtuais (VMs, de maneira hypervisor-agnóstico). O Swift implementa um sistema de armazenamento de objetos escalável e massivo com redundância interna. Na parte inferior estão o Quantum e o Melange, que implementam a conectividade de rede como serviço. Finalmente, o projeto Glance implementa um repositório para imagens de disco virtuais (imagem como serviço).

O OpenStack é representado pelos três projetos principais de software livre (conforme mostrado na imagem anterior): Nova (cálculo), Swift (armazenamento de objeto) e Glance (repositório da VM). A Nova, ou o cálculo do OpenStack, permite o gerenciamento de instâncias da VM em uma rede de servidores. Suas Interfaces de programação de aplicativos (APIs) oferecem orquestração de cálculo para uma abordagem que tenta ser agnóstica, não apenas do hardware físico, mas também dos hypervisors. Observe que a Nova oferece não apenas uma API do OpenStack para gerenciamento, mas uma API compatível com o Amazon EC2 para aqueles que estão acostumados com essa interface. A Nova oferece suporte a hypervisors proprietários para organizações que os usam, mas, mais importante que isso, ela oferece suporte a hypervisors, como Xen e Kernel Virtual Machine (KVM), bem como à virtualização do sistema operacional, como Linux. ® Contêineres. Para fins de desenvolvimento, também é possível usar soluções de emulação, como QEMU.

O Swift, ou o armazenamento de objeto do OpenStack, é um projeto que oferece clusters de armazenamento redundantes e escaláveis usando servidores padrão com discos rígidos de mercadoria. O Swift não representa um sistema de arquivos, mas em vez disso, implementa um sistema de armazenamento de objetos mais tradicional para armazenamento de longo prazo de dados primariamente estáticos (uma modelo de uso de chave é imagem da VM estática). O Swift não possui controlador centralizado, o que melhora a escalabilidade geral. Ele gerencia a replicação internamente (sem Redundant Array of Independent Disks(RAID)) no cluster para melhorar a confiabilidade.

O Glance, ou serviço de imagem do OpenStack Image Service, oferece um repositório para imagens de disco virtual que a Nova pode usar (com a opção de estar armazenado com o Swift). O Glance oferece uma API para o registro de imagens de disco, além de suas descobertas e entregas, por meio de uma interface Representational State Transfer (REST). O Glance é altamente agnóstico no formato de imagem de disco virtual, suportando uma grande variedade de padrões, incluindo VDI (VirtualBox), VHD (Microsoft ® Hyper-V®), QCOW2 (QEMU/KVM), VMDK/OVF (VMware) e bruto. O Glance também oferece resumos de verificação da imagem de disco para integridade, controle da versão (e outros metadados), bem como verificação do disco virtual e logs de auditoria/depuração.

Os principais projetos do OpenStack (Nova, Swift e Glance) foram desenvolvidos no Python e estão todos disponíveis sob a Licença do Apache.

Apesar de ter esses nomes, todos esses serviços são basicamente manipulados pela suite de comandos openstack, porém os serviços estão com uns nomes completamente diferentes aqui, segue abaixo:

  • cinder: devstack@c-vol.service
  • Nova: devstack@n-novnc.service
  • neutron : devstack@q-agt.service
x0003 – Instalação
Homologação

Sistema Operacional
Entre os sistemas quais eu pensei em instalar estão o CentOS e o Ubuntu Server. Eu cheguei a instalar no CentOS depois de ter formatado umas 4x o sistema e ter encontrado vários bugs descobri que o OpenStack tinha descontinuado o Mitaka(Um pacote pseudo essencial do OpenStack), apesar de eu ter conseguido realizar a instalação sem o Mitaka, como eu utilizei o PackStack(Um utilitário para a instalação do OpenStack que instala tudo pra você ao invez do sysadmin ter que instalar byhand todos os serviços) eu ainda encontrei alguns problemas referentes ao Cinder que é o serviço responsável pelos blocos de disco e Storage se não me engano. Então depois de ter conversado com outro Sysadmin que apesar de não ter experiencia com o OpenStack me recomendou dar uma olhada no Ubuntu Server pois é o sistema (dizem) mais utilizado para propósitos de Cloud e IaaS. Então eu optei por Instalar no Ubuntu.

Um dos pontos que acredito ser a diferença entre utilizar um CentOS e o Ubuntu é que pelo Ubuntu você terá mais desempenho, sacrificando a segurança, que é o forte do CentOS. E acredite, eu achei que me u hardware era parrudo, pelo CentOS só para subir o serviço consumiu aproximadamente 6Gb de ram. Então como um upgrade de hardware no momento não é viável para um cyberpunk pobre como eu, irei dar uma chance para o Ubuntu que vacilou feio num primeiro momento (na instalação do sistema, formatei umas 6x mas foi).

No CentOS nós tinhamos o PackStack, no ubuntu nós temos o equivalente ao mesmo chamado de DevStack, não é exatamente a mesma coisa pois no Ubuntu ele ainda é mantido pelo desenvolvedor, então funciona. Então nós vamos utilizar o DevStack para concluir todos os passos da instalação. Nas muitas tentativas que eu tive para tentar instalar, uma delas eu pensei em fazer manual seguindo a documentação, mas eu fiquei tipo 4h configurando e instalando serviço e não tinha chegado nem em 40% do processo, estava funcionando até porém eu tava meio revoltado porque estava fazendo manual, eu encontrei outra solução rápido, até porque eu não ia conseguir ficar muito mais tempo acordado.


root@OpenStack:/# lsb_release -d
Description: Ubuntu 17.04

Na instalação do Ubuntu você precisa ter certeza de marcar a opção de virtualização, caso não marque, tem uma forma de resolver o problema e irei falar no tópico abaixo do abaixo.

Utilitários
Instalando alguns utilitários:
[root@openstack opt]# apt-get update -y && apt-get install lsof tcpdump vim screen ntpdate wget git curl

Observação: Wget deve ser removido pós implementação por questões de segurança.

Requisitos Pré-Instalação

Seu kernel tem que ter módulos que permitem o que chamam de Virtualização Aninhada(Nested virtualization), não só o kernel do host porém seu hardware, no meu caso, estou utilizando um AMD e certos processadores AMD oferecem uma maneira eficiente de suportar a virtualização aninhada, eu arriscaria dizer que melhor que a Intel, mas seria só pra provocar um derramamento de sangue.

O link linkado no parágrafo anterior tem alguns requisitos mínimos para poder rodar o “Nested Virtualization”, então vou seguir os passos de lá.

Em primeiro lugar, deve-se verificar na bios se a sua MOBO(Motherboard aka placa mãe) está com a virtualização habilitada.

Vamos verificar se seu kernel deve possui os dois módulos necessários, kvm e o kvm_amd.

Realizando uma verificação no meu sistema para verificar os módulos já estão carregados:

[root@openstack operador]# lsmod | grep kvm
kvm_amd 69849 0
kvm 566340 1 kvm_amd
irqbypass 13503 1 kvm

Então ok até agora, vamos continuar:

Verificando se o Nested Hardware-Assisted Virtualization está habilitado:

[root@openstack operador]# cat /sys/module/kvm_amd/parameters/nested
0

0 Significa que está desabilitado, vamos então habilitar:

echo "options kvm-amd nested=1" > /etc/modprobe.d/kvm-amd.conf

Agora é necessário um reboot ou o recarregamento do módulo, irei pela segunda opção pois ficar dando reboot é coisa de windows:


[root@openstack operador]# modprobe -r kvm_amd && modprobe kvm_amd

Agora é necessário confirmar se o Nested foi habilitado:


[root@openstack operador]# cat /sys/module/kvm_amd/parameters/nested
1
Network

Você já deve saber que todo servidor tem que ter IP estático definido, por vários motivos, então vamos definir um IP estático no nosso servidor do OpenStack que vamos começar a chamar apenas de host.


root@OpenStack:/# vim /etc/network/interfaces

E deixe o arquivo de configuração mais ou menos com essa cara:


# The primary network interface
auto enp2s0
iface enp2s0 inet static
address 192.168.50.101
netmask 255.255.255.0
gateway 192.168.50.254
dns-nameservers 8.8.8.8

Caso você esteja com o Ubuntu 17.10, ele utiliza algo novo chamado de netplan, siga os passos abaixo para realizar a configuração.

Vá até o arquivo: /etc/netplan/ e com seu editor de texto favorito, edite o arquivo, deixe-o com o aspecto abaixo:


network:
  version: 2
  renderer: networkd
  ethernets:
    enp2s0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.25/24]
      gateway4: 192.168.1.2
      nameservers:
               addresses: [8.8.8.8, 8.8.4.4]
OpenStack Deploy

No host, iremos utilizar o DevStack conforme já foi mencionado anteriormente, vamos criar então o usuário que irá rodar toda a coisa:


root@OpenStack:/# useradd -s /bin/bash -m -d /opt/stack stack
root@OpenStack:/# passwd stack
root@OpenStack:/# usermod -aG sudo stack
root@OpenStack:/# su - stack

Com o usuário criado e diretório, precisamos realizar o download do DevStack a partir do git.


stack@OpenStack:~$ git clone https://github.com/openstack-dev/devstack

Posteriormente ao Download, o script vai preparar toda uma configuração de demonstração que vai servir para brincar, basta executar o script:
# Parece simples né, “basta executar o script”, é porque eu resumi tudo, você não precisa saber os pontos frustrantes do projeto inteiro.

// Eu já formatei esse server umas 4194 vezes, puta merda, altos bug alien. Uma dica é você tentar definir o FLOATING IP a partir dos conf antes de dar o deploy, na boa, to longe de dominar o OpenStack. Preciso de um clone com um cérebro centralizado, ai eu coloco ele pra resolver as merda do dia a dia e eu fico pesquisando, ai sim! Não vou demonstrar como eu to configurando a rede porquê nem sei se vai funcionar nesse momento, acabei de formatar e to a um enter de dar o deploy e ver a merda q dá.
Link que to usando -> https://docs.openstack.org/devstack/latest/guides/neutron.html
Depois de alterar o local.conf mova um diretório acima do que ele se encontra

stack@OpenStack:~$ cd devstack/
stack@OpenStack:~/devstack$ ./stack.sh

Isso vai levar alguns longos minutos, provavelmente mais do que 60. Ele irá pedir senhas durante o processo, se quiser, anote as senhas caso não tenha uma memória boa. Quando a instalação for concluida, você poderá acessar pelo IPv4 privado do seu servidor.

Caso você se depare com o seguinte erro:

[ERROR] ./stack.sh:227 If you wish to run this script anyway run with FORCE=yes

Execute:

FORCE=yes ./stack.sh
Verificando a Rede

Posteriormente a instalação, verifique se temos uma interface chamada "br-ex" em up:

root@OpenStack:/# ifconfig br-ex
br-ex: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.24.4.1 netmask 255.255.255.0 broadcast 172.24.4.255
inet6 fe80::4ccc:79ff:fe1e:2541 prefixlen 64 scopeid 0x20
ether 4e:cc:79:1e:25:41 txqueuelen 1000 (Ethernet)
RX packets 1383 bytes 81012 (81.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 143 bytes 7166 (7.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Vamos precisar definir essa interface de rede no arquivo /etc/network/interfaces
Adicione ao arquivo o código abaixo:

auto br-ex
iface br-ex inet static
address 172.24.4.1
netmask 255.255.255.0

Essa Interface vai ser o nosso router "virtual" qual a LAN de dentro da rede do openstack vai utilizar de gateway pra sair pra rede local e assim por diante.

Esse paper tava puto extenso, comtemplava toda a minha pesquisa, issues, e altos registros de horas e horas gastas tentando implementar o OpenStack, agora que eu consegui uma forma, parece bem fácil. Porém, essa instalação é uma instalação de demonstração, eu me refiro ao devstack, não é o ideal para rodar ambientes de produção, porém eu só quero brincar, então é provavel que por hora eu não vá me aprofundar mais no assunto, vai ser sob demanda, tenho outras coisas pra focar agora.

Se estiver tudo OK, você poderá logar pela console web a partir do IPv4 que você definiu pro HOST pelo seu navegador. Então entre com as credenciais que ele solicitou durante a instalação.

Agora que está dentro da console, você irá precisar executar um teste de icmp request do host para a interface do roteador da rede do OpenStack, provavelmente será necessário que você adicione uma rota no seu sistema caso o teste não seja realizado do host. Se esse teste for bem sucedido, a probabilidade de sucesso é grande, caso contrário, bom, você se fodeo sério, um detalhe, o serviço do openstack não sobe instantaneamente, então espere alguns minutos depois de reiniciar o servidor. Se eu não estou enganado, as regras do firewall permitem que o ping alcançe apenas o roteador, a rede interna é bloqueada, então você precisaria alterar o security group lá.

x0004 - Criando Servidores

Bom, o OpenStack só trabalha com Imagens, você terá que criar a imagem por terceiros ou baixar de fontes confiáveis, e então jogar pro OpenStack.

Eu realizei uns deploys com o SecGen e algumas máquinas do VulnHub e os testes ocorreram OK, em poucos segundos sem contar o download da imagem eu já tinha uma VM pra brincar de hacker.

Abaixo segue alguns repositórios de fontes confiáveis de imagens:
CentOS_7
CentOS_6
Fedora23
Debian
Windows Server 2012 R2

Caso você opte por gerar a imagem no VirtualBox por exemplo, tenha em mente que é preciso instalar os pacotes básicos e integração com a funcionalidade de injeção de chaves do keypairs do OpenStack e outras coisas. A funcionalidade de injeção de keys se dá através do pacote cloud-init. Você pode conferir os procedimentos aqui.

Como eu não vou criar uma imagem usando software de terceiros, eu vou simplesmente baixar uma imagem de uma fonte confiável, vamos por outro caminho:

Primeiro, você precisar subir as variavéis de ambiente:


root@OpenStack:# source /opt/stack/devstack/openrc admin demo

Só por nota, o "admin demo" é referente á usuário e projeto, você pode dar um vim nesse arquivo openrc, ele tem todas as informações dos usuários que você pode utilizar.

Antes de nós realizarmos o Download da imagem, vou compartilhar mais uma informação que basicamente me ferrou, eu por algum motivo idiota baixei a imagem pra Azure, logo o sistema de injeção de chaves não funcionava, não tinha usuário pra logar. Depois de ter revisado o procedimento eu vi que no repositório do CentOS tem umas imagens mais ou menos assim CentOS-7-x86_64-GenericCloud-1710.qcow2.xz, escrito GENERICCLOUD, isso soou bem "é essa aqui que eu deveria estar utilizando", então eu realizei o download da mesma utilizando o wget.

Criei um repositório chamado images/centOS/*.qcow2 para organizar as coisas, e coloquei a imagem lá, isso tudo é no HOST, então agora é só utilizar a própria suite do openstack pra criar a imagem dentro da IaaS.

Agora que temos as credenciais do usuário demo no projeto demo, vamos criar a imagem:

root@OpenStack:/home/operador/images/CentOS# openstack image create --container-format bare --disk-format qcow2 --file CentOS-7-x86_64-GenericCloud.qcow2 CentOS-7-x86_64-GenericCloud

Pronto, imagem criada, agora você já é capaz de iniciar a Instância.
Observe que você precisa realizar alguns procedimentos antes de dar o launch.

  • Verificar as regras do firewall
  • Criar o par de chaves
  • Floating IP

O Firewall precisa ser verificado devido as restrições dele, eu basicamente liberei tudo, já que na verdade a rede do OpenStack ta mais fundo que a minha rede local, mas isso não é justificativa, a justificativa é que eu pretendo usar de laboratório de ataques de intrusão, não quero nenhum firewall no meio no momento, mas, como o openstack é flexivel, eu posso criar outra rede dentro dele e colocar um firewall naquela rede, cara, você tem que entender que eu praticamente tenho um datacenter agora.

Sobre a Keypair, essa keypair é uma chave ssh que vai permitir que você conecte na máquina a partir de um usuário default que já vem na imagem que você baixou, no nosso caso o usuário é o centos, no link que eu deixei fala sobre os usuários. Então você gera a chave, copia a chave privada pra sua máquina e cria o arquivo, então, você simplesmente conecta por ssh passando essa chave e não é necessário nenhuma senha ou configuração prévia na imagem.

E por ultimo, floating ip, esse cara é importante, a rede interna do Openstack, nas configurações que o devstack realizou utiliza nat e consegue acessar a rede externa que é a nossa lan que usa o gateway da nossa lan pra ir pra internet, é quase um kinderovo dentro de um kinderovo. O ponto é, pra você acessar a rede de dentro do kinderovo dentro do kinderovo? Então, existe algo mais lowlevel chamado MASQUERADE, esse floating IP basicamente cria uma regra no firewall, você não vai ver, eu não procurei mas é certeza que não dá pra ver. Na verdade são duas regras, a primeira delas vai direcionar todo o tráfego de um determinado IP externo para um IP interno, isso é um DNAT. E vai mandar todo o tráfego daquele servidor sair com o IP Externo.

Basicamente ele troca o cabeçalho IPv4 do pacote, simples, ele só fala que os pacotes daquela máquina devem sair com um determinado IP e os pacotes desse determinado IP devem ir para aquela máquina.

Então, é simples agora que eu e você entendemos isso tudo.

Vamos finalmente ao launch.

Verifique se você está no projeto do "demo", então na aba esquerda, vá em Compute->Images, selecione a imagem que você quer dar o Launch, então clique em launch.
Defina na primeira aba o nome, depois em Source, desmarque "Create New Volume", então vá em flavor e selecione m1.small. Verifique se em "Key Pair" se a chave antes criada está alocada pra esse servidor. Se estiver tudo ok, clique em Launch Instance.

Vá para a aba Instances e observe a criação.

Então, a partir de qualquer estação na sua rede local, se a estação estiver com a rota definida e estiver com a primarykey da keypair, você será capaz de logar na instancia do CentOS que acabamos de subir:
root@Hope:/tmp# ssh -i ~user/Downloads/keys/docker.pem centos@172.24.4.13
Last login: Sun Nov 19 05:56:57 2017 from 192.168.1.104
[centos@centos-generic-cloud ~]$

x0005 - Finalizando.

Bom, o OpenStack é realmente do caralho, ele é complexo, isso é inegável, porém, é algo que envolve vários conceitos realmente, não é para ser simples, engenheiros tiveram que trabalhar duro pra criar tudo isso, é no minimo nosso dever entender nem que seja de forma abstraida o funcionamento dos componentes.

Me falaram que o OpenStack não suportava Sistemas Windows, acredito que possa ter sido um equivoco, eu infelizmente não tenho como testar ainda pois a Microsoft não libera images de servidores simplesmente para fins cientificos assim. Porém eu tenho uma pesquisa em ambientes da Microsoft que pretendo realizar e em breve voltarei com mais noticias já que provavelmente estarei usando o meu IaaS pessoal. Só por nota, o unico windows que eu acredito que é possível instalar é o Server Core. Eu já realizei uma pesquisa sobre implementação de Server Core então vai ser pseudo tranquilo.

Eu estou, nessas configurações com um possível problema na criação de Volumes, eu não tenho certeza se eu corrigi, você precisa verificar se tem um LVM configurado, se não tiver, você provavelmente vai precisar de um, de qualquer forma, se você precisar abrir um arquivo de configuração, pode ter certeza que vai ter horas de debbug.

Agora falando de coisas interessantes, eu realizei testes com o SecGen, qual irei preparar um paper assim que eu ficar entediado, agora provavelmente vou ver quantas VM que meu server aguenta, descer a porrada nele. Mas voltando, eu fiz os testes com o SECGEN e funcionou muito bem, ele cria pseudo randomicas máquinas virtuais vulneraveis, é simplesmente executar o script e pronto, uma máquina inteira gerada aleatoriamente cheia de falhas pra você brincar.

Então é isso, como sempre, irei atualizando esse paper conforme a necessidade e aplicando correções técnicas e não técnicas conforme a necessidade e disponibilidade.

FONTES/RECURSOS/UTEIS:
POST 1.1: http://www.dasblinkenlichten.com/building-an-openstack-home-lab-the-lab/
POST 1.2: http://www.dasblinkenlichten.com/building-an-openstack-home-lab-prepping-the-vms/
POST 1.3: http://www.dasblinkenlichten.com/building-an-openstack-home-lab-installing-openstack/
Post 2.1 https://fabiosilva.com.br/tag/openstack-virtualizacao-linux/
PDF : http://events.linuxfoundation.org/sites/events/files/slides/NestedVirtualization.pdf
Post 3.0: https://www.tecmint.com/openstack-installation-guide-rhel-centos/
IS : https://www.if-not-true-then-false.com/2010/yum-remove-repo-repository-yum-disable-repo-repository/
IS : http://www.linuxreport.org/error-delta-rpms-disabled-because-usrbinapplydeltarpm-not-installed/
* : https://docs.openstack.org/install-guide/
* : https://docs.openstack.org/install-guide/environment-packages-rdo.html
https://vishmule.com/2016/05/26/openstack-mitaka-installation-using-devstack-on-ubuntu-16-04/
http://www.bogotobogo.com/DevOps/OpenStack-Install-On-Ubuntu-16-Server.php
https://www.theurbanpenguin.com/installing-devstack-on-ubuntu-16-04/
http://www.dasblinkenlichten.com/building-an-openstack-home-lab-installing-openstack/
http://tldp.org/HOWTO/LVM-HOWTO/
https://www.tecmint.com/create-deploy-and-launch-virtual-machines-in-openstack/
http://cloudify.co/2014/11/03/openstack-neutron-openstack-nova-network-architecture-automation.html

EOF

One thought on “IaaS: OpenStack – Basic Deploy

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.