HoneyDocker
Tags: docker, opensource, security
Published: 2020-05-12 01:41:00


##**Introdução**##


###Sobre o projeto##
  
Nosso projeto consiste em construir um servidor de arquivos junto a uma central de mídia pessoal (semelhante á Netflix) para reproduzir dentro e fora da rede nossas mídias através da web ou aplicações. Também, instalaremos um honeypot SSH e Telnet de interação média, projetado para registrar ataques de força bruta e interação de shell executada por um invasor. Temos por objetivo aplicar conceitos de virtualização, configuração de rede, uso do Docker e Docker compose e entre outros.



##**Recursos para o Projeto**##

* Servidor - Ubuntu server 18.04;
* Nextcloud server;
* Emby server;
* Docker e Docker compose;
* Portainer;
* Cowrie Honeypot;
* ELK Stack.


###Docker e Docker compose###

<p>O Docker é uma plataforma open source na linguagem de programação Go. O Docker agrupa partes de softwares de um sistema de arquivo completo e que abrange todos os recursos necessários para a sua execução. Cria, testa e implementa aplicações em um ambiente separado da máquina original, ou seja, nos contêineres. Em termos bem simples, ele cria e gerencia contêineres. O Compose é uma ferramenta para a criação e execução de múltiplos contêineres de aplicação. Com ele você pode definir como será o ambiente de sua aplicação e usando um único comando você criará e iniciará todos os serviços definidos.</p>

####Afinal o que são contêineres e para o que servem?####

   Hoje em dia é cada vez mais necessário agilidade e funcionalidade na área de T.I e com as novas tecnologias somos beneficiados pela praticidade, por exemplo, como o uso dos contêineres e é sobre eles que iremos apresentar. 

   Mas o que são contêineres? Quais são as vantagens de usá-los?
Primeiramente vamos entender o que são os contêineres. Todos aqui já viram um food truck, certo!? Todos já devem ter comido pelo menos uma vez em um desses, seja qual for seu tipo preferido de comida. Mas o que isso tem a ver com os contêineres? Usaremos esses "carros de comida" para fazer uma breve analogia. 
  Nós vemos em uma praça vários desses carrinhos, cada um com seu tipo especifico de comida. Dentro de cada food truck só tem os ingredientes necessários para fazer um tipo de comida. Por exemplo, em um carrinho de cachorro quente não vai nutella ou banana, por que esses ingredientes não servem para fazer o cachorro quente, seria desnecessário ter esses ingredientes guardados.E é ai que entra o contêiner! Os contêineres seriam como os food trucks e dentro de cada um teriam apenas os "ingredientes" necessários para executar e servir a aplicação necessária, dessa forma, a operação é otimizada. São capazes, também, de reduzir o tamanho dos dados consideravelmente. Assim, é possível movê-los para diferentes servidores e atingir a mesma funcionalidade. 

   Os contêineres são extremamente práticos, e uma "mão na roda" quando se precisa virtualizar aplicações. Vou mostrar porque  um contêiner pode ser melhor até mesmo que uma máquina virtual. Em um ambiente de trabalho há uma constante mudança e exigência de serviços, e principalmente para a equipe de T.I fazer essas mudanças pode ser um trabalho desgastante. Para facilitar esse trabalho, nas últimas décadas surgiram as máquinas virtuais. De fato, as VM's são práticas porque elas poderiam ser clonadas, copiadas, migradas e ativadas ou desativadas para atender à demanda ou economizar recursos (pois uma máquina física poderia portar um número x de máquinas virtuais dentro de si). Mas elas não trazem todos os benefícios necessários, já que as máquinas virtuais são grandes (gigabytes), cada uma contendo um sistema operacional completo. Apenas alguns aplicativos virtualizados podem ser estabilizados em um único sistema. Equipar uma VM ainda leva um bom tempo. É nesse ponto onde os contêineres se sobressaem. Eles isolam um único aplicativo e suas dependências - todas as bibliotecas externas de software que o aplicativo precisa executar - tanto do sistema operacional subjacente quanto de outros contêineres, assim, consumindo menos dados e memória que uma máquina virtual. Todos os aplicativos em contêiner compartilham um único sistema operacional comum (Linux ou Windows), mas eles podem ser compartilhados entre um e outro sistema sem perder a sua compatibilidade. Fim do:"Mas na minha máquina é compatível". Os contêineres são leves, portáteis e facilitam a construção de software em linhas de pensamento avançado, o que facilita o trabalho de técnico.

Para fazermos uso dos contêineres são necessários alguns passos para fazer sua instalação e sua configuração. Vamos ver o que é o Docker, Docker Compose e o Portainer.


####Instalando o Docker e Docker compose####

1- Abra o terminal com o atalho Ctrl + Alt + T. Baixe as últimas atualizações do sistema.

>$sudo apt update && sudo apt upgrade

2- Instale utilizando o repositório do Ubuntu 18.04

>$ sudo apt install docker.io

3- Inicie o Docker

>$ sudo systemctl start docker

4- Entretanto, garanta que ele seja iniciado após a reinicialização

>$ sudo systemctl enable docker

5- Caso queira verificar a versão instalada

>$ sudo docker -v

6- Teste o Docker criando um contêiner

>$ sudo docker run hello-world

7- Instale o Docker Compose

>$ sudo apt install docker-compose

8- Caso queira checar a versão instalada do compose

>$ sudo docker-composer -v



###Portainer###

 O portainer é uma interface Web onde roda localmente (dentro do seu Docker) e é possível gerenciar as imagens, entre diversas outras opções.Em termos bem simples e de entendimento, ele é a versão gráfica do Docker rodando dentro do próprio Docker. O Portainer é open source e facilmente instalável. 
  
####Instalando o Portainer####

A instalação do Portainer é extremamente simples. Por ele ser uma imagem  é necessário que você já tenha instalado o Docker, depois da instalação, ainda com o terminal aberto, rode o comando abaixo para criar um volume persistente para os dados do Portainer:

>$ sudo docker volume create portainer_data

E o comando a seguir para instalar o Portainer em si:

>$ sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

(Explicando o comando acima, o Docker roda apenas em modo privilegiado, sendo assim necessário o comando "sudo" antes de qualquer comando Docker. O "docker run" indica que estamos criando um contêiner, "-d" em modo daemon (roda em segundo plano), "-p 9000:9000" rodando na porta 9000, "-v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data" estamos indicando o local em nossa máquina host para o contêiner e por fim "portainer/portainer" é a imagem que estaremos subindo como contêiner.

Verifique se foi instalado e qual a sua localização

>$ sudo docker container ps        --> lista os contêineres em funcionamento
ou
>$ sudo docker container ps -a     --> lista todos os contêineres 

Deve aparecer algo semelhante a isso:
<a data-flickr-embed="true" href="https://www.flickr.com/photos/188432015@N06/49888885662/in/dateposted-public/" title="portainer docker"><img src="https://live.staticflickr.com/65535/49888885662_48b0f4690a_h.jpg" width="1359" height="588" alt="portainer docker"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

Para que o Portainer inicie junto com o sistema digite o seguinte comando:

>$ sudo docker update --restart=always #      --> substitua o # pela ID do contêiner

Para acessar o Portainer basta abrir navegador e digitar 

> localhost:9000

Após isso é só configurar usuário e senha.


###Segurança###

Assim como em qualquer outro lugar, a área da T.I exige uma base sólida de segurança. Para que o nosso trabalho com contêineres seja seguro, vamos falar de uma ferramenta que vai nos auxiliar, o Cowrie Honeypot.

####Honeypot####

Um honeypot é um recurso computacional de segurança dedicado a ser sondado, atacado ou comprometido. Ele foi projetado para pesquisa e obtenção de informações dos invasores. Em termos simples, o Honeypot simula ataques para que possamos ver com antecedência onde nossa rede teria um ponto fraco. Ele serve para simulações e não necessariamente atua como proteção. Para o Honeypot usaremos o Cowrie. Documentação e posts relacionados no site oficial: [Cowrie.org](https://www.cowrie.org/)
 

1- Acesse o site do Dockerhub e encontre a parte referente ao cowrie
<https://hub.docker.com/r/cowrie/cowrie>

2- Abra o terminal Ctrl + Alt + T e cole o seguinte comando no terminal (Ctrl + Shift + V)

>$ sudo docker run -p 2222:2222/tcp cowrie/cowrie

3- Para testar execute um cliente SSH na porta 2222

>$ ssh -p 2222 root@localhost

Você estará acessando um ambiente de testes, vulnerável. Para acessar os logs do Cowrie (onde se registra todas as informações colhidas)em tempo real você deve acessar de sua máquina real o seguinte comando pelo terminal:

>$ sudo tail -f /var/lib/docker/volumes/cowrie_cowrie-var/_data/log/cowrie/cowrie.json

####ELK####

"ELK" é a junção de três projetos open source: Elasticsearch, Logstash e Kibana. Sendo o Elasticsearch é um mecanismo de busca e análise. O Logstash é um pipeline de processamento de dados do lado do servidor que faz a ingestão de dados a partir de inúmeras fontes simultaneamente, transforma-os e envia-os para um "esconderijo" como o Elasticsearch. O Kibana permite que os usuários visualizem dados com diagramas e gráficos no Elasticsearch. O último serviço é o Filebeat. Filebeat é responsável  por ler os arquivos de log e enviar para o logstash.  Vamos usá-lo para fazer a leitura de logs do Cowrie, assim podendo vizualizar melhor o nível de interação com nosso honeypot e outras informações. Há muito a se dizer e a explorar em algo como ELK e para poupar seu tempo de leitura vamos pegar um modelo pré-configurado para Docker-compose, se quiser conferir o passo a passo detalhado [clique aqui](https://walde.co/2016/07/11/configurando-elk-com-docker-e-filebeat/). Vocês podem encontrar mais informações sobre o tema no site [ELK STACK](https://www.elastic.co/pt/what-is/elk-stack). Vamos para instalação:

1- Baixe o repositório com o arquivos através do link [clique aqui](https://github.com/waldemarnt/elk-compose/archive/master.zip). Caso você esteja executando via terminal utilize os comandos abaixo

>$ wget https://github.com/waldemarnt/elk-compose/archive/master.zip
no diretório onde foi feito o download descompacte-o 
>$ unzip elk-compose-master.zip 

2- Entre dentro do diretório descompactado e altere o volume “../fake-logs:/var/log” no arquivo "docker-compose.yml". Utilizamos o editor nano, case uso outro apenas substitua o comando.

>$ nano docker-compose.yml

e edite o trecho em

> filebeat:
    image: prima/filebeat
    volumes:
      - ./filebeat/filebeat.yml:/filebeat.yml
      ***- ../fake-logs:/var/log***
    depends_on:
      - logstash

salve o arquivo (Ctrl + O), enter. Para sair (Ctrl + X).

3- Ainda dentro do diretório descompactado, acesse o diretório Filebeat no arquivo "filebeat.yml"

>$ nano filebeat.yml

e adicione o trecho do Log no nosso caso ficará assim

> <p>paths:</p>
  <p>- /var/log/cowrie.json*</p>
  <p>input_type: log</p>
  <p>document_type: cowrie</p>

salve o arquivo (Ctrl + O), enter. Para sair (Ctrl + X).

4- Voltando ao diretório do arquivo "docker-compose.yml" execute o Docker Compose

>$ sudo docker-compose up

5- Acesse seu navegar para configurar a interface gráfica Kibana

>localhost:5601

6- Ao abrir o navegador já teremos o logstash* sugerido para gerar os gráficos.

<a data-flickr-embed="true" href="https://www.flickr.com/photos/188432015@N06/49888698841/in/dateposted-public/" title="kibana"><img src="https://live.staticflickr.com/65535/49888698841_86288eba45_h.jpg" width="1359" height="588" alt="kibana"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


###Media###

####Nextcloud####

Nextcloud é um conjunto de software cliente-servidor para criar e usar serviços de hospedagem de arquivos. É gratuito e de código aberto, o que significa que qualquer pessoa pode instalá-lo e operá-lo em seus próprios dispositivos de servidor privado. Conta com diversas ferramentas de uso pessoal como também empresarial como mapas mentais, chat's, atribuições de projetos e entre outras muitas funções. Com o Nextcloud você pode acessar os seus arquivos de qualquer lugar e em diversas plataformas. 

####Instalando e configurando o Nextcloud Server####

1- Abra o terminal com o atalho Ctrl + Alt + T. Baixe as últimas atualizações do sistema.

>$ sudo apt update && sudo apt upgrade

2- Instale o snap (caso já tenha ignore este passo) utilizando o repositório do Ubuntu 18.04

>$ sudo apt install snap

3- Instale o Nextcloud

>$ sudo snap install nextcloud

4- Certifique-se de ter suas portas HTTP (80) e HTTPS (443) abertas

5- Digite o seguinte comando

>$ sudo nextcloud.enable-https lets-encrypt
#confirme com (y)
#Digite um e-mail para o administrador e dê enter
#Digite o endereço de seu DNS estático

6- Abra o endereço DNS no seu navegar Web

> exemplo.brazilsouth.cloudapp.azure.com

7- Crie um usuário e senha administradora e configure seu novo servidor de arquivos!

<a data-flickr-embed="true" href="https://www.flickr.com/photos/188432015@N06/49888639311/in/dateposted-public/" title="nextcloud"><img src="https://live.staticflickr.com/65535/49888639311_47a4710953_h.jpg" width="1362" height="645" alt="nextcloud"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


###Instalação e configuração Emby Server

Este é o aplicativo do Emby que distribuirá sua mídia para outros dispositivos. 

1- Abra o terminal (Ctrl + Alt + T) e baixe a imagem do Emby para Docker. Você pode também baixar para  outras plataformas logo abaixo, nesse tutorial usaremos o Docker. [Emby Download](https://emby.media/download.html)

>$ docker pull emby/embyserver:latest

2- Inicie o contêiner e configure os volumes. Retire os # explicativos antes de excutar

>$ docker run -d \
    --volume /path/to/programdata:/config \ # Comando obrigatório
    --volume /path/to/share1:/mnt/share1 \ # Substitua pelo local dos seus arquivos
    --volume /path/to/share2:/mnt/share2 \ # Substitua pelo local dos seus arquivos caso tenha outro
    --device /dev/dri:/dev/dri \
    --runtime=nvidia \ 
    --publish 8096:8096 \ # Expõe a porta em que ele será executado
    --publish 8920:8920 \ # Porta secundária
    --env UID=1000 \ 
    --env GID=100 \ 
    --env GIDLIST=100 \
    emby/embyserver:latest

3 -Abra seus navegador e digite
>localhost:8096


4-No navegador configure usuário, idioma, idioma dos metadatas (o Emby recolhe de fontes online a informação sobre suas músicas, filmes e séries e adiciona estas informações a seus arquivos. Com esta opção você escolhe em que língua quer estas informações) e entre outros. Depois você pode adicionar a fonte de suas mídias para o Emby.

5-Logo depois estão as configurações de acesso remoto. É recomendável que selecione as duas opções caso deseje ter acesso remoto a seu servidor. A opção de UPnP (Universal Plug and Play) facilita a conexão, mas pode não funcionar como esperado, pois alguns roteadores ou provedores bloqueiam essa funcionalidade.

7-Depois é só assinar os termos de serviço e pronto, o Emby está instalado!

<a data-flickr-embed="true" href="https://www.flickr.com/photos/188432015@N06/49888102928/in/dateposted-public/" title="emby"><img src="https://live.staticflickr.com/65535/49888102928_0c2ebfe4d3_h.jpg" width="1335" height="617" alt="emby"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>


##**Conclusão**##

Nos nossos dias em que o trabalho é grande e o tempo é curto, é de grande importância que usemos a tecnologia a nosso favor. Vimos como o uso dos contêineres é prático e como podemos aplica-lo no nosso trabalho, seja em uso pessoal ou no uso empresarial.
Já que temos essas ferramentas, use-as e descubra como podem ser versáteis!


***Obrigado!***