Redirect para HTTPS e proxy reverso
Tudo criptografado, Sem desculpas
Antigamente era caro e inconveniente exigir criptografia para servidores HTTP, você teria que no mínimo gastar alguns trocados com uma entidade certificadora. De um tempo para cá isso não é mais verdade, qualquer um pode usar os certificados da letsencrypt.org, é free, fácil de usar e as ferramentas são de código aberto, então não existe mais desculpa para não usar HTTPS nos seus servidores.
Além de poder usar os certificados diretamente várias ferramentas e serviços estão atualmente gerando o certificado do Let’s Encrypt para você, é o caso do Caddy que basta você fornecer um nome de domínio no seu arquivo de configuração e ele vai solicitar o certificado e usar tudo de forma transparente.
Redirecionando para HTTPS
Para redirecionar tudo os navegadores para a porta HTTPS eu escrevi um pequeno serviço em Golang que simplesmente retorna o código 301 Moved Permanently para o navegador do usuário e indico o novo local apenas substituindo o URL Scheme de HTTP para HTTPS, e deixo o resto do trabalho para o navegador.
Veja o código Go
package main
import (
"log"
"net/http"
)
func redirectToHTTPS(w http.ResponseWriter, r *http.Request) {
redirect := "https://" + r.Host + r.RequestURI
http.Redirect(w, r, redirect, http.StatusMovedPermanently)
log.Print("redirect to : " + redirect)
}
func main() {
log.Print("start redirect http->https")
if err := http.ListenAndServe(":80", http.HandlerFunc(redirectToHTTPS)); err != nil {
log.Fatalf("ListenAndServe error: %v", err)
}
}
Usando o Caddy
Durante bastante tempo essa foi a forma como eu redirecionava minhas chamadas para HTTPS mas isso não é mais necessário. Com o Caddy como servidor e proxy ao mesmo tempo é que você não precisa fazer nada, se ele conseguir gerar o certificado para você automaticamente ele vai redirecionar as requisições HTTP para HTTPS.
E o Caddy também é escrito em Golang, tornando a instalação tão fácil como de qualquer outro aplicativo bem escrito, ou seja é só compilar o binário para o PATH e executar como você preferir.
Eu também escrevi um post falando sobre como criar um servidor HTTPS com Golang que não é mais necessário porque é muito mais simples usar o Caddy e criar um servidor simples, subir em uma porta alta.
Subir o servidor em uma porta alta permite que meu usuário carregue ele e não preciso me preocupar com permissões o que ajuda muito na hora de testar o sistema. Claro que se eu pretendo deixar um sistema rodando por mais tempo eu faço isso via um usuário especifico para a tarefa e não com o meu usuário. Outra coisa importante é que o firewall das minhas maquinas não permite nenhum trafego que não seja nas portas SSH, HTTP e HTTPS então ninguém vai conseguir acessar diretamente nenhum serviço.
Configurando
A configuração do Caddy é bem simples. Crie um arquivo com nome Caddyfile no diretório que vai rodar o executável do Caddy.
Aqui esta um exemplo de arquivo de configuração:
example.com {
gzip
proxy /api localhost:8000 {
websocket
transparent
}
proxy /code localhost:8080 {
websocket
transparent
without /code
}
root ./root
# basicauth / user password
}
Nesse arquivo estamos configurando o domínio example.com e dizendo para o Caddy compactar a saída do protocolo usando gzip, em seguida estamos configurando dois redirecionamentos para o nosso proxy interno, um vai redirecionar o trafego que chegar em /api
vai manter a string /api
quando chamar o servidor rodando na maquina local na porta 8000, essa é a forma como eu prefiro fazer hoje em dia. Já o segundo exemplo vai redirecionar o trafego para a maquina legal na porta 8080 mas vai omitir o /code
quando repassar a requisição.
Em seguida estamos avisando o Caddy que o root do nosso site é em ./root
que no meu caso é muito útil para servir algumas poucas páginas estáticas e até um arquivo ou outro.
Daí temos uma linha iniciando com # indicando que essa linha esta comentada e será ignorada. Entretanto se desconectar a linha vamos ter basicauth fornecido pelo Caddy, outro recurso muito interessante para que nem tudo fique exposto. Da para usar métodos muito mais sofisticados de autenticação de usuários mas para muita coisa o basicauth é suficiente.
Conclusão
Não existem mais desculpas para não criptografar o trafego para seu servidor, é fácil reforçar para que todos os acessos vão ser via HTTPS e também do nosso lado existem ferramentas para facilitar e muito a tarefa de subir e manter um servidor seguro.