linux

Gerando certificados SSL gratuitos com Certbot

Vimos anteriormente como automatizar a geração de certificados SSL locais para ambientes de desenvolvimento, mas e quando precisamos de um certificado para um servidor de produção? Não podemos utilizar um certificado local auto-assinado nesse caso, e tradicionalmente para gerar um certificado SSL precisamos pagar por isso.

Entretanto, existe algumas alternativas para gerar um certificado SSL válido para seus ambientes fora do ambiente local. Uma dessas formas é com o Certbot. Vamos conhecer nesse artigo o Certbot, como ele funciona e como podemos configurá-lo em um dos nossos servidores.

O que o Certbot faz

Acessar um site que tenha HTTPS é quase um pré requisito hoje em dia. Além de ser recomendável pelos principais navegadores, acessar um site com HTTPS te dá mais segurança e até ajuda no rankeamento do seu site nos resultados de busca do Google. Para isso é preciso ter um certificado SSL emitido por uma Autoridade Certificadora (Certificate Authority) que reconhece a sua titularidade para determinado domínio. Para uma introdução sobre SSL, leia mais no artigo O que é certificado SSL.

Para gerar um certificado SSL válido é preciso vários passos, como entrar em contato com uma Autoridade Certificadora, gerar a chave privada que vai ser utilizada para assinar seu certificado e enviar seu certificado para a Autoridade Certificadora, validar que você é o responsável pelo domínio que deseja utilizar HTTPS, aguardar a resposta da Autoridade Certificadora e configurar seus servidores. Tudo isso precisa ser repetido anualmente ou a cada três anos, pois o certificado SSL tem um prazo de validade, e geralmente existe um custo envolvido para a emissão desse certificado.

Esse processo pode ser automatizado, e o melhor, realizado de forma gratuita, ao utilizar o Certbot. O Certbot é um utilitário em linha de comando mantida pela Eletronic Frontier Fountation (EFF), uma organização sem fins lucrativos que luta pela privacidade online e desenvolve tecnologias para melhorar a segurança na internet.

Junto com Let’s Encrypt, o Certbot faz parte de uma iniciativa da EFF que tem como objetivo encriptar a internet como um todo. Desde o lançamento do Let’s Encrypt e do Certbot (que chegou na sua versão 1.0 recentemente), o percentual do tráfego web que é encriptado saiu de 40% para 77%, segundo dados da EFF.

Com o Certbot é possível gerar certificados emitidos pelo Let’s Encrypt como Autoridade Certificadora, gerar e configurar esse certificado em seu servidor web e renovar automaticamente esse certificado, tudo isso de forma gratuita. Para isso você só precisa ter acesso SSH ao seu servidor e acesso ao sudo. Caso esteja utilizando uma hospedagem talvez você não tenha acesso ao SSH dos servidores, porém algumas hospedagens já suportam a geração de certificados através dos seus painéis.

Vamos acompanhar como gerar esse certificado utilizando um servidor Ubuntu 18.04 LTS com Ngnix.

Como instalar o Certbot no Ubuntu com Nginx

Para efetuar a instalação do Certbot, é preciso que nosso servidor Web já esteja configurado com nosso domínio e esteja rodando com HTTP. O Certbot se encarregará de configurar um desafio com HTTP para validar que você é responsável por aquele domínio. Caso isso não seja possível, existe a opção de efetuar um desafio incluindo um registro TXT no seu domínio, porém esse processo leva mais tempo.

Site sem HTTPS

Ao selecionar sua distribuição e servidor web, você pode consultar as instruções para instalação. No Ubuntu, vamos adicionar o repositório do apt-get do Cerbot e iniciar sua instalação:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

sudo apt install certbot python-certbot-nginx

No último comando, temos a variação de um script python com a variação de web server utilizado. Por exemplo, caso esteja utilizando o Apache, você instalaria python-certbot-apache

O próximo passo é executar o certbot com o argumento do servidor web que você irá configurar:

sudo certbot --nginx

Caso se sinta mais confortável, você pode escolher fazer a configuração do seu servidor web manualmente, e somente gerar o certificado com a opção certonly:

sudo certbot certonly  --nginx

Será feita algumas perguntas, como qual o domínio a ser configurado, se você deseja redirecionar todo o tráfego para HTTPS automaticamente, entre outros. Será gerado então sua chave privada para esse certificado e o Nginx será configurado de acordo:

Execução do certbot

Com isso temos nosso servidor configurado e respondendo em HTTPS!

Site com HTTPS

O Certbot irá gerar um certificado com validade de apenas três meses, ao contrário dos certificados de um ou três anos geralmente emitidos por outras Autoridades Certificadoras. Entretanto, o certificado do Certbot é gratuito e se renova automaticamente. É possível testar o processo de renovação automática com o comando:

sudo certbot renew --dry-run

Caso você esteja utilizando outra distribuição Linux, na página inicial do Certbot você pode consultar instruções detalhadas de como instalar em diferentes distribuições e servidores web:

Opções de servidores e distribuições suportadas

O que mais o Certbot pode fazer?

Vimos aqui o processo de geração de certificados no caso que temos acesso ao servidor via SSH. Em uma hospedagem compartilhada isso pode não ser possível, porém caso a mesma forneça suporte para utilizar um certificado SSL gerado por você, é possível gerar o certificado somente na sua máquina local e fazer o upload dos certificados necessários pela sua hospedagem.

É possível até gerar um certificado wildcard, que é válido para todos os subdomínios, caso seu domínio esteja em um DNS suportado. O processo para gerar um certificado wildcard é bem próximo ao mostrado anteriormente, alterando somente os plugins utilizados na hora da instalação.

Para outras variações de configuração, confira a documentação do Certbot para instruções mais detalhadas para seu cenário. Muito provavelmente você encontrará o que precisa.

Docker Desktop no Windows rodando com WSL 2

Com a inclusão de um kernel Linux completo dentro do Windows graças ao Windows Subsystem for Linux (WSL) 2, ferramentas que antes não podiam ser utilizadas no WSL por questões de compatibilidade agora podem ser executadas sem problemas. Uma dessas ferramentas muito utilizadas pelos desenvolvedores é o Docker.

No Windows 10 é possível utilizar o Docker Desktop para ter uma experiência integrada com o Docker, se aproximando muito de um sistema Linux. Entretanto, existem algumas limitações que com a atual versão que serão tratadas com a nova integração entre o Docker Desktop com o WSL 2.

Docker Desktop

O Docker Desktop é uma solução para executar containers Linux nos sistemas Windows e macOS. Ele permite que você tenha uma experiência semelhante a uma distribuição Linux, integrando o sistema de arquivos do sistemas e a rede com a máquina virtual que executa o Docker.

Essa máquina virtual é gerenciada pelo Docker Desktop através do hypervisor de virtualização do sistema, no caso do Windows o Hyper-V e do macOS o hyperkit. A execução dos containers em si acontece nessa máquina virtual, como podemos ver no diagrama abaixo:

Arquitetura do Docker Desktop

O Docker Desktop está disponível faz alguns anos, sendo a forma recomendada de executar Docker nos sistemas Windows e macOS, sendo possível com ele até executar um cluster de Kubernetes na sua máquina local.

Restrições do Docker Desktop

Apesar de ser a forma recomendada de executar o Docker nesses sistemas, um grande fator que impacta no seu uso é a performance em operações de leitura e escrita. Por executar dentro de uma máquina virtual, existe um delay para sincronizar os arquivos que estão no sistema operacional com a máquina virtual.

Isso pode ser um problema para aplicações que exigem constante leitura em disco, como é o caso de linguagens interpretadas, como o PHP. Além disso, mais especificamente com o Docker Desktop for Windows, é preciso ter o Hyper-V habilitado, que só é incluído com o Windows 10 Pro.

Então se você utiliza o Windows 10 Home ou trabalha com uma linguagem interpretada, sua experiência com o Docker no Windows pode não ser a melhor possível. Felizmente, isso vai mudar com o Docker com WSL 2.

Docker com WSL 2

O WSL 2 traz para o Windows o kernel completo do Linux através de uma máquina virtual moderna e com uma performance de disco próxima a uma máquina rodando Linux. Você pode ler mais sobre o WSL 2 nesse artigo aqui.

Com esse anúncio, o WSL 2 se tornou uma opção mais interessante para executar o Docker nos sistemas Windows. Além do ganho de performance, o WSL 2 será compatível com o Windows 10 Home, tornando o Docker Desktop disponível para um maior número de usuários.

O suporte do Docker Desktop utilizando o WSL 2 ainda está em preview, mas você já pode testá-lo se tiver executando o Windows 10 Insider. A previsão de lançamento do WSL 2 será no release 2003, e se espera que o suporte na versão estável do Docker chegue nessa época também.

O Docker Desktop irá incluir o suporte ao WSL 2 e utilizá-lo sempre que possível, mantendo o comportamento atual de usar uma máquina virtual no Hyper-V como um fallback para versões do Windows 10 que ainda não suportam WSL 2. Com isso, teremos todas as vantagens presentes no Docker Desktop, mas com uma melhor performance e suporte para o Windows 10 Home (o que hoje não é possível por requerer o Hyper-V).

Internamente, o Docker Desktop provisiona duas distribuições Linux na sua máquina, uma contendo o daemon do Docker e outra é utilizada para armazenar dados como os containers e as imagens que você utilizará. A comunicação entre essas distribuições acontece através de sockets, tanto entre o Windows como com a distribuição que você utiliza com o WSL 2 no seu dia-a-dia. Mais detalhes dessa implementação podem ser encontrados nesse post do blog de engenharia do Docker.

Arquitetura do Docker com WSL 2

Mas será que tudo isso vale a pena? Além do tempo de carregamento para iniciar o Docker Desktop, que reduziu para poucos segundos, a performance com o disco melhorou bastante. Podemos comparar esses números com o benchmark abaixo.

Teste de performance com disco

Para esse teste, vamos comparar a diferença entre o Docker Desktop utilizando Hyper-V e o WSL 2. Ambos os testes foram executados no mesmo ambiente, com a mesma máquina e quantidade de recursos disponíveis.

Para esse teste utilizei a aplicação de demonstração do Symfony junto com uma configuração de containers para Symfony mantida por um de seus core contributor. O código desses dois projetos juntos se encontra no GitHub da TreinaWeb também.

Depois de clonar o projeto e ter instalado o Docker, basta executar o comando docker-compose up para iniciar o projeto. O tempo a ser medido como comparação é para o primeiro carregamento da página inicial do projeto. Graças ao Symfony Profiler temos diretamente no navegador utilitários que auxiliam o desenvolvimento da nossa aplicação, incluindo o tempo de carregamento da mesma.

No primeiro teste, abri a página inicial do projeto utilizando o Docker Desktop com Hyper-V e essa página levou 2681ms para ser carregada:

Tempo de carregamento Docker Hyper-V

Com Docker Desktop usando WSL 2, a mesma página levou apenas 249ms!

Tempo de carregamento Docker WSL 2

Tudo isso considerando o primeiro carregamento do projeto. Foi preciso baixar todas as dependências do Composer, o container do PHP não tinha nenhum OpCache, o Symfony não chegou a fazer nenhum tipo de otimização, como compilar as views do Twig, ler as rotas da aplicação presentes nas anotations. Se considerarmos essas otimizações que farão efeito nas requests subsequentes, esse tempo cai para 20ms, comparado com um Linux rodando nativamente:

Tempo de carregamento Docker WSL 2 - carregamento subsequente

Como começar a utilizar

O Docker Desktop com WSL 2 está disponível na versão edge do Docker Desktop e pode ser baixada aqui. Por enquanto é preciso utilizar a versão insider do Windows 10 para habilitar o acesso ao WSL 2 caso você queira testar hoje mesmo.

Como vimos na comparação, o Docker Desktop com WSL 2 vai trazer um grande salto na performance para aplicações que usam muito processamento em disco. Para mim, que de vez em quando trabalho com projetos em PHP vai ser uma mão na roda! 😀

E para você? Pretende testar o Docker com WSL 2 no seu projeto? Conte pra gente o que você achou!

O que esperar do Windows Subsystem for Linux (WSL) 2

O Windows Subsystem Linux (WSL) é uma alternativa para desenvolvedores que procuram utilizar ferramentas de linha de comando compatíveis somente com Linux no Windows. Disponível para Windows 10, com ele é possível executar nativamente binários Linux na sua máquina Windows, escolhendo sua distribuição Linux preferida, como Debian, Ubuntu, Suse, até mesmo Kali Linux. Entretanto, tudo na vida pode ser aprimorado.

Vamos conhecer nesse artigo quais são as limitações do WSL e como será a evolução para o WSL 2.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Limitações do WSL

O WSL permite você executar qualquer binário compilado para Linux diretamente no Windows, através de um subsistema que é responsável pro traduzir as chamadas de sistema (do inglês system calls) do Linux para uma chamada equivalente para o Windows. Você pode ver com mais detalhes como o WSL funciona e como instalá-lo na sua máquina nesse artigo.

Duas grandes limitações do WSL são a sua performance envolvendo operações de disco e a sua compatibilidade com algumas system calls específicas.

Sobre a performance em disco, atividades que envolvem operações intensivas com o disco, com comandos como git clone, npm install, apt upgrade, entre outros acabam demorando mais do que deveriam. Isso acontece pois esses dados são salvos diretamente no disco do seu sistema, e toda a operação que precisa interagir com esses arquivos precisa de alguns passos extras para a tradução dos comandos enviados pela system call do Linux até a persistência do dado em si.

Outra limitação é a compatibilidade com system calls. Embora grande parte das system calls funcione graças a implementação e melhorias adicionadas pela equipe do WSL, elas não correspondem 100% de todas as system calls disponíveis para o Linux, fazendo que aplicações específicas que façam uso de chamadas mais avançadas do Linux não seja compatíveis com o WSL. Um exemplo desse tipo de aplicação é o Docker, ferramenta presente no dia a dia de muitos desenvolvedores atualmente.

Tendo em vista esses problemas, o time responsável pelo desenvolvimento anunciou o WLS 2, com o foco em melhorar a performance em disco e fornecer total compatibilidade com system calls em Linux, não mais traduzindo essas chamadas, mas fornecendo um kernel Linux dentro do Windows!

Como funciona o WSL 2

O WSL 2 utiliza uma arquitetura completamente diferente do WSL 1. Ao invés de traduzir as system calls, ele utiliza diretamente um kernel do Linux atualizado através de uma máquina virtual. Mas não estamos tratando de uma máquina virtual qualquer!

O WSL 2 utiliza as mais recentes tecnologias de virtualização fornecidas pelo Hyper-V para fornecer uma máquina virtual leve, rápida e altamente integrada com o Windows. Com isso é possível utilizar de todas as vantagens que o WSL 1 trouxe, mas agora com total compatibilidade do sistema, até para rodar Docker.

Graças ao uso dessa máquina virtual, a performance com operações em disco aumentaram drasticamente. Antes, seus arquivos eram armazenados diretamente no disco do sistema, agora todos os arquivos utilizados pelo WSL 2 estão dentro de uma disco virtual do formato VHD, conseguindo entregar uma performance até 5 vezes mais em operações como npm install nessa nova arquitetura.

É possível notar essa diferença a partir do vídeo abaixo encontrado no anuncio do WSL 2. Ele mostra o tempo necessário para iniciar o WSL e executar um container Docker. Tudo isso leva menos que 30 segundos!

Performace do WSL 2

Uma desvantagem dessa abordagem é que não temos acesso direto aos arquivos armazenados dentro do WSL 2, mas temos outras formas de acessar esses arquivos, através da rede ou com extensões especialidades nas nossas IDE, como a extensão Remote WSL do Visual Studio Code. Assim podemos utilizar da melhoria de performance em disco trazido pelo WSL 2.

Instalação

O processo de instalação do WSL 2 é muito próximo WSL 1. No momento ele está disponível na versão Insider do Windows 10. Sua previsão de lançamento está para o release 2003 do Windows 10 que deve ser lançado por volta de Abril de 2020.

Para use o WSL 2, precisamos habilitar a feature do Windows Subsystem for Linux e também o Virtual Machine Platform. Isso pode ser feito executando os comandos abaixo a partir de uma janela do PowerShell com permissão de Administrador:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Feito isso, caso você já tenha uma distribuição Linux instalada a partir do Microsoft Store, você pode migrar essa distribuição para executar dentro do WSL 2 e poder assim utilizar de todas as suas melhorias. Por exemplo, se você tem o Ubuntu 18.04 instalado, execute o comando abaixo:

wsl --set-version Ubuntu-18.04 2

Altere o nome de acordo com a distribuição que você utiliza. Para descobrir quais distribuições estão instaladas, execute o comando:

wsl --list --verbose

Lista com distribuições WSL

Isso vai te mostrar quais distribuições estão instaladas, juntamente com a versão do WSL em uso.

Caso esteja utilizando uma instalação limpa do Windows, você pode definir a versão padrão do WSL para sua segunda versão:

wsl --set-default-version 2

O restante do processo é semelhante com o WSL 1. Você vai até a Microsoft Store e escolhe a distribuição desejada. Você pode acompanhar com mais detalhes no artigo sobre WSL como é feito esse processo.

O que esperar do WSL 2

Pelo motivo do WSL 2 ainda estar em desenvolvimento, podemos esperar que muitas melhorias sejam implementadas até seu lançamento final. Com a melhoria de performance e compatibilidade total com Linux, temos um ambiente de desenvolvimento com performance comparável o Linux instalado de forma nativa, o que é uma grande conquista.

Muitas pessoas se sentem mais confortáveis utilizando Windows, ou precisam desenvolver aplicações legadas que só funcionam no Windows, mas ao mesmo tempo trabalham com projetos que são hospedados em servidores Linux, requerendo que você tenha um ambiente mais próximo de produção. Para esses casos o WSL 2 é uma ótima solução.

Combinado com ferramentas como o Visual Studio Code com Remote extension podemos trabalhar com o WSL 2 como se estivéssemos trabalhando no sistema local, sem perceber que estamos utilizando uma máquina virtual por baixo.

Até mesmo o Docker para Windows irá se aproveitar do WSL 2, estando disponível na versão Edge do mesmo integração com o WSL 2, aproveitando também dos ganhos de performance com disco, um dos problemas que temos atualmente com o Docker ao usá-lo no Windows com aplicações que precisam de um grande volume de leitura e escrita em disco.

Docker - Fundamentos
Curso de Docker - Fundamentos
CONHEÇA O CURSO

O que é Windows Subsystem for Linux (WSL)?

Durante nosso dia a dia como desenvolvedores usamos diversas ferramentas pela linha de comando. Podemos utilizar git para versionar nossos projetos, instalar dependências com npm ou executar scripts para automatizar tarefas. Algumas dessas ferramentas são compatíveis com diversos sistemas operacionais, porém algumas delas são criadas levando em consideração somente o sistema Linux, não levando em conta as particularidades para serem executadas no Windows.

Como não é viável tornar todas as ferramentas compatíveis tanto com Windows como Linux, por que não tornar o Windows compatível com essas ferramentas? O Windows Subsystem for Linux (WSL) vem para resolver esse problema.

Windows - Fundamentos para desenvolvedores
Curso de Windows - Fundamentos para desenvolvedores
CONHEÇA O CURSO

Como o WSL funciona?

O WSL é um recurso opcional disponível no Windows 10 (a partir da versão 1607) que te permite executar binários e scripts em Linux diretamente no Windows, traduzindo as instruções enviadas para o sistema (as chamadas de sistema ou system calls) para uma instrução válida para o kernel do Windows. Com ele é possível ter um ambiente idêntico a de uma distribuição Linux que você já esteja acostumado sem precisar usar uma máquina virtual ou algo do tipo para isso.

O WSL permite que você instale múltiplas distribuições Linux na sua máquina, cada qual com uma estrutura de arquivos isolada e independente do sistema e de outras distribuições, similar com o que ocorre com uma máquina virtual.

Instalação

É possível habilitar o WSL executando o comando abaixo a partir de uma janela do PowerShell com permissão de Administrador:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Após reiniciar sua máquina você pode instalar uma versão da sua distribuição preferida a partir da Microsoft Store. Digite Linux na barra de busca e você encontrará várias distribuições como Ubuntu, Debian, Suse e até o Kali Linux.

Distribuições disponíveis na Microsoft Store

Após instalar e executar o aplicativo da distribuição desejada, é solicitado que você crie um usuário e senha para usar como o sudo da sua distribuição. Como exemplo, escolhi o Ubuntu 18.04 como a distribuição na minha máquina e criei um usuário chamado treinaweb:

Configuração do Ubuntu 18.04

Você pode encontrar no menu iniciar a distribuição instalada para usá-la posteriormente, digitando na barra de busca o nome da distribuição. Você pode fixar esse atalho na barra de tarefas, no iniciar ou na área de trabalho se desejar.

Ubuntu 18.04 no menu iniciar

Funcionalidades

Ao contrário de uma máquina virtual, o WSL é integrado com o sistema, permitindo o acesso dos arquivos tanto do sistema como os arquivos da distribuição. Dentro da distribuição os discos da sua máquina estão mapeados dentro do diretório /mnt/ e no Windows os arquivos da distribuição estão no caminho de rede \\\\wsl$

Arquivos do Windows dentro do WSL

Arquivos da distribuição como caminho de rede

Com o utilitário wslpath é possível converter os caminhos de diretório entre o WSL e Windows e vice-versa.

Exemplo wslpath

É possível também utilizar executáveis do Linux dentro do PowerShell ou Prompt de comando diretamente com wsl e até mesmo rodar executáveis do Windows dentro do WSL.

Executáveis do Windows junto com binários Linux

Outro uso comum é utilizar o WSL como ambiente de desenvolvimento web. Tanto o sistema como o WSL compartilham o mesmo IP de rede, logo para acessar o servidor web do seu ambiente basta utilizar localhost e informar a porta que você deseja acessar.

Servidor interno do PHP rodando no WSL

Vale lembrar que o WSL não substitui completamente uma máquina virtual. O público alvo do WSL são desenvolvedores que precisam executar ferramentas em linha de comando. Aplicações que usam a interface gráfica não são compatíveis com o WSL.

Aplicativos que invocam funções nativas do kernel do Linux também não são compatíveis com o WSL, como por exemplo, o Docker. Nesses casos uma máquina virtual ou o Docker for Desktop podem ser melhores soluções.

O que vem por aí

O WSL se mostrou até agora uma alternativa interessante para quem precisa executar ferramentas e aplicações Linux dentro do Windows de forma leve e integrada. Entretanto, na sua versão atual o WSL não tem compatibilidade total com as funções do kernel do Linux e com aplicações que fazem uso intenso de disco existe um gargalo no desempenho de leitura de disco se comparado com outras soluções.

Tendo isso em vista a Microsoft anunciou o WSL 2, uma nova versão que promete compatibilidade total com o kernel do Linux e performance de disco mais rápida. Para que isso seja possível o WSL 2 contará com o próprio kernel do Linux distribuído dentro do Windows ao invés de uma camada de tradução de system calls! O código do kernel utilizado é baseado na versão 4.19 e pode ser encontrado aqui.

O WSL 2 ainda está em desenvolvimento, disponível somente a partir do build 18917 do Windows Insider.