Habilitando API do Docker de Forma Segura

Fernando Silva
4 min readDec 17, 2019

Habilitando a API remota do Docker de forma segura, com autenticação de client TLS por meio de um container.

A adoção de containers Docker está crescendo rapidamente. Oitenta e três por cento das empresas de cloud computing, tanto pública quanto privada estão usando ou planejando usar o Docker de acordo com a última pesquisa da RightScale, o Gartner prevê que, até 2020, mais de 50% das organizações globais estarão executando aplicações em containers em produção. No entanto, as preocupações com segurança continuam sendo um dos principais desafios. No mais recente estudo da Cloud Native Computing Foundation (CNCF), 43% dos entrevistados identificaram a segurança como o maior obstáculo na adoção de containers.

Notícias recentes mostram que umas das principais vulnerabilidades nos ambientes containerizados são causadas por configuração incorreta dos ambientes.

Em uma consulta simples no shodan.io podemos ver que existem milhares de servidores com API do Docker exposta.

Docker APIs Expostas Global

Neste artigo, mostraremos como podemos usar SSL e TLS para proteger a API do Docker em um ambiente de produção.

Antes de começarmos a proteger a API do Docker, existem vários conceitos que você precisa entender. Estes são openSSL, TLS e x509. O OpenSSL é uma implementação do SSL, um protocolo usado na transmissão segura de informações pela Internet. O SSL torna a transmissão de informações segura, criptografando as informações para impedir que pessoas indesejadas as vejam. O SSL é usado principalmente pelo protocolo HTTP, como na navegação Web, mas outros protocolos, como FTP (File Transfer Protocol) e SMTP (Simple Mail Transfer Protocol), também podem usar SSL. A Netscape originalmente desenvolveu o SSL, que evoluiu para TLS. O X.509 foi especificado pela União Internacional de Telecomunicações como um padrão para certificados digitais. A especificação estabelece as características e informações necessárias na identificação de pessoas e sistemas de informação.

TLS/SSL tem vários benefícios

  • O TLS/SSL opera nos principais navegadores, sistemas operacionais e servidores da web. Pode ser usado em sistemas Windows e Unix.
  • O TLS/SSL pode ser utilizado para transmitir dados com segurança. Servidores e clients podem ser autenticados para prova de identidade. Além de oferecer proteção contra a revelação de dados, oferece proteção contra masquerade attacks, man in the middle e roll back attacks.
  • TLS/SSL é muito flexível. Oferece diferentes formas de autenticação, diferentes algoritmos de hash e criptografia.
  • A implantação e o uso do TLS/SSL são fáceis.

O TLS/SSL tem seus benefícios, mas também possui suas desvantagens das quais você precisa estar ciente. A carga de trabalho do processador aumenta devido ao processamento criptográfico, mas não é possível quantificar o uso de recursos. O esforço administrativo também aumenta devido à configuração do sistema e ao gerenciamento de certificados.

Uma CA fornece certificados digitais para autenticar pessoas, dispositivos e sites pela Internet. A CA conduz a devida diligência para verificar a identidade antes de emitir um certificado.

Protegento a API do Docker

Quando habilitamos a API do Docker, por padrão não exige nenhum tipo de autenticação, deixando-a acessível a qualquer usuário. Para proteger uma API do Docker, podemos seguir a documentação disponibilizada pela própria Docker, que mostra como usando TLS.

Como alternativa para facilitar esta configuração criamos neste repositório, uma forma de gerar um container disponibilizando a API do Docker com as devidas configurações de segurança.

Para utilizar, basta fazer clone do repositório:

git clone https://github.com/fernandodebrando/docker-remote-api-tls.git

Alterar o docker-compose informando uma senha, hostname e o local para armazenar os certificados.

version: "3.4"
services:
remote-api:
image: fernandosilva/docker-remote-api-tls
ports:
- 2376:443
environment:
- CREATE_CERTS_WITH_PW=supersenha
- CERT_HOSTNAME=remote-api.example.com
volumes:
- <local cert dir>:/data/certs
- /var/run/docker.sock:/var/run/docker.sock:ro

Agora, execute o container com o docker-compose up -d ou docker stack deploy --compose-file=docker-compose.yml remoteapidocker. Obs.: Para usar docker stack o docker swarm deve ser inciado, se o mesmo ainda não estiver, basta executar: docker swarm init --advertise-addr ip_da_instancia. Os certificados serão criados em <local cert dir>. Você encontrará os certificados de client em <local cert dir>/client. Os arquivos são ca.pem, cert.pem e key.pem.

Utilizando o client Docker com os certificados

Se você não tiver uma instalação local do Docker, precisará fazer o download do client Docker, que é um executável simples. Você encontra o client Docker para Linux, MacOS e Windows em download.docker.com.

Criar alias (para Linux)

Alias para conexão HTTPS com o host Docker: alias dockerhost="docker --tlsverify -H=myserver.example.com:2376 --tlscacert=/home/user/cert/ca.pem --tlscert=/home/user/cert/cert.pem --tlskey=/home/user/cert/key.pem"

Criar .bat (para Windows)

Crie um arquivo “dockerhost.bat”. Para conexão HTTPS com o host Docker: alias dockerhost="docker --tlsverify -H=myserver.example.com:2376 --tlscacert=/home/user/cert/ca.pem --tlscert=/home/user/cert/cert.pem --tlskey=/home/user/cert/key.pem"

Para entender o que este container faz pode ser verificado com detalhes no repositório no GitHub.

--

--

Fernando Silva

Application Security Engineer | OWASP Chapter Leader | AppSec | MSc CyberSecurity | Systems Development Analyst