Docker Bench for Security

Eai pessoal!

Os engenheiros do Docker disponibilizaram uma ferramenta para testes básicos de segurança para o ambiente Docker. Essa ferramenta nada mais é do que um container que executa um script e verifica se as melhores práticas e recomendações de segurança foram seguidas na instalação e configuração do serviço do Docker. Para executar rode o comando:

docker run -it --net host --pid host --cap-add audit_control -v /var/lib:/var/lib -v /var/run/docker.sock:/var/run/docker.sock -v /usr/lib/systemd:/usr/lib/systemd -v /etc:/etc --label docker_bench_security docker/docker-bench-security

Este comando retornará algo parecido com:

BenchDocker

Que é um report sobre como está seu ambiente, a cada procedimento para correção das falhas indicadas por este relatório, você deverá executar novamente o comando, pois ele analisará se a correção surtiu efeito ou não.

Lembrando que é recomendado que você execute esse container na versão 1.6 em diante do Docker.

Todos os testes realizados por esse script foram criados baseados em um estudo realizado pelo CISecurity (Center Of Internet Security), que indicam quais seriam as melhores formas de se proteger e aumentar a segurança de seu ambiente Docker.

Espero que tenha sido útil, tendo dúvidas ou precisando de ajuda para resolver algum ponto nos avise, e ajude divulgando o mundodocker.com.br!

 

Referências:

https://benchmarks.cisecurity.org/tools2/docker/CIS_Docker_1.6_Benchmark_v1.0.0.pdf

https://github.com/docker/docker-bench-security

Understanding Docker Security and Best Practices

Montando Volumes no Docker

Olá!

Hoje, nós do mundodocker.com.br, vamos ver como podemos utilizar a funcionalidade de volumes no Docker. Um volume pode ser apenas o mapeamento de pasta entre o host e container, bem como o mapeamento de uma pasta entre containers.

Gerenciando volumes

Host – Container

Na imagem abaixo podemos visualizar como fica o mapeamento entre host e container:

host_containerPodemos analisar os pontos positivos e negativos dessa abordagem em:

Prós:

– Menor overhead para acesso disco, pois não há analise pela libcontainer das chamadas para esse volume mapeado;

– É possível mapear o mesmo volume para múltiplos containers, forma primitiva de replicação de dados entre containers (lembrando que neste caso não há controle de arquivos lidos e escritos ao mesmo tempo, quem deve ser responsável por isso é o filesystem do volume, não o volume em si);

– Persistência de dados, não há risco do container cair ou ser removido e os dados desaparecerem;

Contras:

– Sucessível possíveis brechas de segurança a nível de filesystem, escalonamento de privilégios, pois neste ambiente não há controle pela libcontainer.

– Não escalável, pois  atrela-se o container ao host ou pelo menos ao mapeamento.

– Dificulta administração, pois há mais uma camada de gerenciamento que deve ser muito bem estruturada.

Container – Container

Na imagem abaixo podemos visualizar como fica o mapeamento entre containers:

container_containerPodemos analisar os pontos positivos e negativos dessa abordagem em:

Prós:

– Portável, pois o volume não está mais atrelado ao host;

– É possível mapear o mesmo volume para múltiplos containers, forma primitiva de replicação de dados entre containers (lembrando que neste caso não há controle de arquivos lidos e escritos ao mesmo tempo, quem deve ser responsável por isso é o filesystem do volume, não o volume em si);

– Persistência de dados, não há risco do container cair ou ser removido e os dados desaparecerem;

Contras:

– Maior overhead para acesso disco, pois há analise pela libcontainer das chamadas para esse volume mapeado;

– Maior complexidade, pois há mais passos a serem seguidos para criação e remoção de containers;

Criando e montando volumes

Adicionando um volume de dados

Para mapear o volume do container a uma pasta no host basta executar o comando:

docker run -d --name meucontainer -v /var/app imagem

Será criado um novo diretório dentro do container chamado /var/app, caso o mesmo já exista, será sobrescrito por este novo.

Verificando volume

Você pode verificar quais volumes um container possui executando o comando:

docker inspect meucontainer

O resultado do comando será parecido com isso:

...
Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/var/app",
        "Driver": "local",
        "Mode": "",
        "RW": true
    }
]
...

Por padrão todos os volumes são montandos como leitura e escrita, você pode montar o volume como apenas leitura, basta executar:

docker run -d --name meucontainer -v /var/app:ro imagem

Note o :ro no final do /var/app, isso quer dizer que este volume é apenas leitura.

Montando um diretório do host como um volume de dados

Para mapear o volume do container a uma pasta no host basta executar o comando:

docker run -d --name meucontainer -v /var/app:/var/www/html imagem

Será criado um novo diretório dentro do container chamado /var/app, caso o mesmo já exista, será sobrescrito por este novo.

Criando e montando um container como um volume de dados

É possível você criar um container com um volume que pode ser compartilhado com demais containers, isso é uma prática comum quando deseja-se ter alguma persistência de dados e que não esteja atrelado ao host onde o container está. Para isso, crie o container conforme abaixo:

docker create -v /dados --name meucontainer imagem /bin/true

Agora, no próximo container basta você utilizar o parametro –volumes-from para que o volume criado no container acima seja mapeado para o novo container, algo como isso:

docker run -d --volumes-from dados--name meucontainer1 imagem

Você pode criar quantos containers desejar mapeando este volume, inclusive pode mapear o volume de um container, por exemplo:

docker run -d --volumes-from container1 --name meucontainer2 imagem

Com isso não é necessário mapear obrigatoriamente o container de volume, e sim algum container que já utiliza ele. Outro ponto importante a se observar nessa caso é que:

  • Quando removido o container de volume os demais containers não perdem os dados, pois continuará existindo neste container a pasta montada;
  • Para remover o volume nesse caso é necessário remover todos os containers que foram criando mapeando este container e em seguida executar o comando: docker em -v

 

Bom pessoal, espero que tenham gostado, esse assunto é muito importante dentro do Docker, espero fazer um vídeo e disponibilizar para vocês um prática usando volumes.

Não fique com dúvida, mande e-mail para: [email protected] e vamos conversando, ajude a divulgar o blog e disseminar conhecimento, abraço!

Docker e Weave

Olá pessoal,

Hoje vou demonstrar através de um vídeo, como podemos utilizar uma aplicação do ecossistema Docker para que se possa trabalhar de uma maneira mais fácil com a parte de rede, Essa ferramenta se chama Weave e você pode fazer download dela a partir do endereço: https://github.com/weaveworks/weave.

 

Ficou dúvida? Curiosidade? Deixe sua dúvida e vamos conversando, divulgue o mundodocker.com.br e nos ajude disseminando conhecimento!

Docker no Windows Server 2016

Olá Pessoal!

A Microsoft acaba de lançar o Windows Server 2016 Preview, que trará consigo o Docker Engine nativo, isso mesmo, a mesma engine utilizada dentro de distribuições Linux estará disponível no Windows Server. Quais benefícios isso trás?

 Flexibilização da infraestrutura, da mesma forma que no Linux, não será necessário instanciar uma VM ou máquina física para realizar deploy de uma aplicação.

Mais ferramentas para desenvolvedores, já existe um plugin para o Visual Studio, onde você poderá desenvolver sua aplicação e publica-la automaticamente dentro de um container, deu build foi pro ar!

Claro, isso não foi um trabalho fácil, houve um grande esforço por parte da Microsoft para que fosse possível integrar o Docker Engine ao Kernel do Windows e mesmo assim há algumas limitações, como por exemplo:  Não será possível, pelo menos não na versão preview, o uso de container Linux dentro Windows Server 2016, isso claro por motivos óbvios, pois o Kernel do host é bastante diferente do Kernel do container. Claro para testes ele pode ser utilizado sem problema.

OK, mas como ficou a arquitetura?

Bem parecido com o Docker no Linux, a Microsoft adicionou ao Kernel do Windows alguns recursos que possibilitam criar um ambiente isolado a nível de userspace, e uso limitado de recursos, na imagem abaixo podemos ter uma ideia de como ficou:

windows_docker

Fiquem atentos, nos próximos posts vamos colocar na prática o Docker no Windows Server 2016, continuem nos acompanhando aqui no blog, facebook ou nosso canal no youtube.

Referência:

Introducing the Technical Preview of Docker Engine for Windows Server 2016

Medindo Recursos com o cAdvisor

Oi Pessoal!
Hoje o post será um pouco mais curto, no vídeo abaixo explicamos como funciona e como o cAdvisor pode te ajudar a mensurar o uso de recursos de cada container, bem como o uso de recursos pelo host.

Ficou dúvida? Curiosidade? Deixe sua dúvida e vamos conversando, divulgue o mundodocker.com.br e nos ajude disseminando conhecimento!

Criando um servidor web

Olá!

Você está procurando uma forma de criar um ambiente web fácil e rápido? pois bem, hoje vamos mostrar como criar um ambiente web de maneira rápida e fácil. Nosso ambiente será constituído por 3 containers, sendo eles: Weave, HAProxy e Apache.

Com esse comando estamos criando o nosso container onde vamos colocar nosso apache

docker run -it --name apache centos /bin/bash

Agora já dentro do container vamos executar os seguintes comandos:


yum install wget -y
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm #Estamos utilizando a versão 7 do CentOS em nosso container.
rpm -ivh epel-release-7-5.noarch.rpm

yum install httpd -y
yum install php -y

/usr/sbin/httpd -DFOREGROUND -k start &

vi /var/www/html/index.html #Dentro do arquivo index.php vamos colocar o código abaixo:

<?php
 echo "Mundo Docker";
?>

Feito isso acima agora vamos pressionar CTRL + P + Q assim estamos saindo do container e voltando para o nosso Host. Vamos instalar agora o Weave para conseguir trabalhar com a parte de redes de uma maneira mais simples.


curl -L git.io/weave -o /usr/local/bin/weave
chmod a+x /usr/local/bin/weave

weave attach 192.168.0.2/24 apache #Estamos vinculando o ip 192.168.0.2/24 ao container apache através da rede Weave.

Agora vamos criar o container com o HAProxy.

docker run -it --name haproxy -p 80:80 centos /bin/bash

yum install wget -y
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm #Estamos utilizando a versão 7 do CentOS em nosso container.
rpm -ivh epel-release-7-5.noarch.rpm

yum install haproxy -y
echo "" > /etc/haproxy/haproxy.cfg
vi /etc/haproxy/haproxy.cfg 

Copiar e colar dentro desse arquivo



global
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon



defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend localnodes
    bind *:80
    mode http
    default_backend nodes

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    server web01 192.168.0.2:80 check

Agora vamos iniciar o HAProxy



/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg &

Feito isso acima agora vamos pressionar CTRL + P + Q para sair do container e vamos anexar um IP para esse container.


weave attach 192.168.0.1/24 haproxy

 

Após isso é só acessar http://seuip e você estará visualizando a sua página.

 

Por hoje era isso pessoal, em nossos próximos posts vamos mostrar como criar um ambiente web com alta disponibilidade, replicação de arquivos e muito mais. Então fique ligado e nos ajude a divulgar o mundodocker.com.br obrigado!.

Trabalhando com API parte I

Olá pessoal!

Hoje vamos mostrar como realizar as operações mais básicas do Docker através da API dele. Vamos ver como iniciar, parar, criar, excluir e coletar informações de containers através da API. Estarei utilizando a distribuição CentOS 7 em meu host onde vou criar os containers.

– Como habilito a API?

vim /etc/systemd/system/docker.service 

//Vamos alterar a linha que contém ExecStart=/usr/local/bin/docker -d -H fd:// por essa

ExecStart=/usr/local/bin/docker -d -H fd:// -H 0.0.0.0:4243

service docker restart

Agora estamos com nossa API habilitada e escutando na porta 4243.

– Iniciar

curl -X POST http://IPHost:4243/containers/IDContainer/start

– Parar

curl -X POST http://IPHost:4243/containers/IDContainer/stop

– Excluir

curl -X DELETE http://IPHost:4243/containers/IDContainer

– Criar

curl -X POST -H "Content-Type: application/json" http://IpHost:4243/containers/create -d '{
"Hostname":"",
   "User":"",
   "Memory":0,
   "MemorySwap":0,
   "AttachStdin":false,
   "AttachStdout":true,
   "AttachStderr":true,
   "PortSpecs":null,
   "Privileged":false,
   "Tty":false,
   "OpenStdin":false,
   "StdinOnce":false,
   "Env":null,
   "Dns":null,
   "Image":"busybox",
   "WorkingDir":""
}'

– Renomear

curl -X GET http://IPHost:4243/containers/IDContainer/rename?name=novo_nome

– Exibir containers que estão iniciado

curl -X GET http://IPHost:4243/containers/json

– Exibir todos os containers

curl -X GET http://IPHost:4243/containers/json?all=1

– Top

curl -X GET http://IPHost:4243/containers/IDContainer/top

– Stats

curl -X GET http://IPHost:4243/containers/IDContainer/stats

– Images

curl -X GET http://IPHost:4243/images/json?all=0

Por hoje era isso, fiquem atentos para as novidades e ajude divulgando o mundodocker.com.br!