MSMTP com OAuth2: mudanças entre as edições

De ISPUP!
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
Linha 129: Linha 129:
  # apt install msmtp msmtp-mta
  # apt install msmtp msmtp-mta
Após a instalação vamos precisar apenas criar o arquivo /root/.msmtprc com o conteúdo de exemplo abaixo, conforme mostrei no início do artigo:
Após a instalação vamos precisar apenas criar o arquivo /root/.msmtprc com o conteúdo de exemplo abaixo, conforme mostrei no início do artigo:
defaults
        host smtp.gmail.com
port 587
protocol smtp
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
account ISPUP
auth oauthbearer
passwordeval python3 /root/.config/msmtp/getmail-gmail-xoauth-tokens /root/.config/msmtp/ispup.json
 
account default : ISPUP
Altere os parâmetros '''from''', '''user''' e o nome do arquivo '''.json''' conforme você os tenha criado. O '''msmtp''' irá usar o '''getmail-gmail-xoauth-token''' que lerá o '''ispup.json''' onde estão as credenciais e tokens para autenticar.
Para testar se vai funcionar é bem simples, instale o pacote '''bsd-mailx''', copie e cole no terminal os comandos abaixo e veja se vai receber o e-mail

Edição das 00h20min de 18 de maio de 2024


Objetivo

O objetivo deste artigo é ajudar os administradores de sistemas que usam Debian, a configurar o programa msmtp para envio de mensagens utilizando a autenticação por OAuth2. Também pode ser configurado em outras distribuições GNU/Linux bastando seguir o mesmo raciocínio. Quem já visitou esse artigo para fazer a configuração básica de um servidor Debian, vai poder usar esse artigo aqui para modificar a forma de autenticação.

Para quem não sabe o msmtp é um programa que vem em diversas distribuições GNU/Linux e ela tem a função de ser um sender de e-mail, ou seja, você não precisa de ter um MTA server configurado em seu servidor para enviar alertas, logs, etc por e-mail, basta configurar por exemplo uma conta Gmail nele e quando algum programa seu no servidor enviar uma mensagem, este se conectará ao Gmail e irá enviar a mensagem por lá.

Motivação

O Google já vem de longa data fazendo mudanças para remover a velha autenticação de apps usando user e password tradicionais. Mas o que isso pode impactar para nós administradores de sistemas, que cuidamos de diversos servidores? Pois bem, se você é como eu e configura seus sistemas para enviar notificações com logs, relatórios, alertas, etc por e-mail usando a técnica de autenticação por usuário e senha de apps do Google. isso vai acabar conforme essa notícia oficial do Google aqui.

Exemplos da configuração antiga e nova

Antes de iniciarmos, apenas para termos uma ideia de como é a configuração legada e como será a nova:

Abaixo a configuração legada usando user e password:

defaults
        port 587
        tls on
        tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
account ISPUP
        protocol smtp
        host smtp.gmail.com
        from [email protected]
        auth login
        user [email protected]
        password xxctxxxxszxxxxzs
 
account default : ISPUP

Essa outra abaixo já está usando o OAuth2:

defaults
        host smtp.gmail.com
	port 587
	protocol smtp
	tls on
	tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
account ISPUP
	auth oauthbearer
	from [email protected]
	user [email protected]
	passwordeval python3 /root/.config/msmtp/getmail-gmail-xoauth-tokens /root/.config/msmtp/ispup.json
 
account default : ISPUP

Bem isso foi apenas para mostrar visualmente as diferenças. Seguiremos agora com a mão na massa. Para esse artigo estarei usando o Debian 12 (Bookworm) mas é bem simples de replicar em outras distribuições GNU/Linux.

Criando acesso API no Google Cloud

Para que possamos usar esse tipo de autenticação, vamos precisar criar um projeto no Google Cloud, uma aplicação e gerar as credenciais de acesso para essa aplicação. Se você já possui essas informações então só pular essa parte. Para essa tarefa acesse esse link e vamos seguir as telas abaixo:

Inicie fazendo a autenticação com a conta de e-mail que você irá administrar seu Google Cloud:

Precisa concordar com os termos para seguir em frente:

Nessa tela vamos criar nosso projeto, então siga a seta.

Vamos dar um nome ao projeto, no meu exemplo chamei de ISPUP e clicar em criar:

Após criar o projeto precisamos configurar as permissões em CONFIGURAR TELA DE CONSENTIMENTO:

Vamos selecionar para tipo de uso externo e clicar em criar:

Nessa tela vamos informar o app que vamos criar, dei o nome de msmtp mesmo, defini o e-mail de contato:

Ainda na mesma tela mais abaixo vamos adicionar um domínio autorizado que se chama oauth2.dance. Esse é o domínio usado pelo script do Google para nos gerar os tokens:

Na tela de escopo só clicar em salvar e continuar:

Não vamos adicionar um usuário de teste e clicamos em salvar e continuar:

Clique em voltar para o Painel:

Agora vamos colocar em produção clicando em PUBLICAR APLICATIVO:

Na sequência clique em confirmar para que seja publicado:

Agora que já publicamos nosso app msmtp, vamos criar as credenciais de acesso dele:

Em credenciais vamos clicar em criar credenciais e escolher a opção ID do cliente OAuth:

Nessa tela vamos selecionar Aplicativo da Web:

Vamos dar um nome para ele, deixei como msmtp mesmo e precisamos adicionar na URI de redirecionamento autorizados o endereço https://oauth2.dance/ e em seguida clicar em criar:

Na próxima tela será exibido o ID do cliente e a Chave secreta do cliente. Copie esses 2 dados porque vamos precisar lá na frente e tome cuidado com eles, para que não sejam usados por pessoas não autorizadas:

Terminamos aqui a configuração do nosso Google Cloud. Agora seguimos com a instalação do que precisaremos no Debian que será monitorado.

Instalação e configuração

Agora que já temos nossas credenciais vamos precisar gerar nossos tokens de acesso e para isso vamos precisar do script em python do Google chamado oauth2.py que pode ser baixado do Github aqui.

Vamos jogar esse script em /root/.config/msmtp e setar a permissão de execução para ele:

# mkdir -p /root/.config/msmtp
# chmod +x /root/.config/msmtp/oauth2.py

Para pegarmos nossos tokens de acesso, vamos executar esse comando abaixo passando como parâmetros o client-id e o client-secret que salvamos lá do Google Cloud. Vamos executar esse comando assim:

# /root/.config/msmtp/oauth2.py --user=seu_email@dominio --client_id=XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com --client_secret=XXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXX --generate_oauth2_token

Assim que você rodar esse comando o script vai te devolver um link para que você acesse pelo seu navegador e ficará aguardando um código. Siga os passos via web e no final você receberá um código.

To authorize token, visit this url and follow the directions:
  https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=328XXXXXXXX-afmXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com&prompt=consent&redirect_uri=https%3A%2F%2Foauth2.dance%2F&response_type=code&scope=https%3A%2F%2Fmail.google.com%2F
Enter verification code:

Como pode ver acima ele aguarda um código de verificação. Após acessar o link no final aparecerá algo assim abaixo. Basta clicar para copiar o código e colar acima:

Após passar o código de verificação e dar enter, o script vai devolver duas informações importantes o Access Token e o Refresh Token. Anote eles também porque vamos utilizar na configuração final do msmtp. Sim eles são gigantescos:

Refresh Token: 1//XXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_Pqg8
Access Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Access Token Expiration Seconds: 3599

Agora que temos as 5 informações importantes vamos construir nosso arquivo .json contendo os dados de acesso pro msmtp:

  • E-mail usado como user.
  • Client-id.
  • Client-secret.
  • Access Token.
  • Refresh Token.

Vamos criar o seguinte arquivo como exemplo /root/.config/msmtp/ispup.json e nele adicionaremos nossos dados. Altere apenas os 5 dados acima conforme a sua instalação:

{"scope": "https://mail.google.com/",
 "user": "[email protected]",
 "client_id": "seu_client-id",
 "client_secret": "seu_client-secret",
 "token_uri": "https://accounts.google.com/o/oauth2/token",
 "auth_uri": "https://accounts.google.com/o/oauth2/auth",
 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
 "access_token": "seu_access_token",
 "expires_at": 3600,
 "refresh_token": "seu_refresh_token"}
# chown root: /root/.config/msmtp/ispup.json
# chmod 640 /root/.config/msmtp/ispup.json

Coloque os dados dentro das aspas.

Vamos precisar de mais um script em python chamado getmail-gmail-xoauth-tokens que pode ser baixado daqui. Vamos colocá-lo junto com os outros arquivos e setar a permissão de execução nele:

# chmod +x /root/.config/msmtp/getmail-gmail-xoauth-tokens

Agora que temos todos os arquivos que precisamos faremos a instalação do msmtp e configuração deste:

# apt install msmtp msmtp-mta

Após a instalação vamos precisar apenas criar o arquivo /root/.msmtprc com o conteúdo de exemplo abaixo, conforme mostrei no início do artigo:

defaults
        host smtp.gmail.com
	port 587
	protocol smtp
	tls on
	tls_trust_file /etc/ssl/certs/ca-certificates.crt
 
account ISPUP
	auth oauthbearer
	from [email protected]
	user [email protected]
	passwordeval python3 /root/.config/msmtp/getmail-gmail-xoauth-tokens /root/.config/msmtp/ispup.json
 
account default : ISPUP

Altere os parâmetros from, user e o nome do arquivo .json conforme você os tenha criado. O msmtp irá usar o getmail-gmail-xoauth-token que lerá o ispup.json onde estão as credenciais e tokens para autenticar.

Para testar se vai funcionar é bem simples, instale o pacote bsd-mailx, copie e cole no terminal os comandos abaixo e veja se vai receber o e-mail