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
 
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
====== Objetivo ======
{{DISPLAYTITLE:MSMTP com OAuth2 no Debian 12}}
__TOC__
[[Arquivo:Msmtp.jpg|nenhum|miniaturadaimagem]]
 
== 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 [[Template Servidor Debian|'''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.
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 [[Template Servidor Debian|'''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á.
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 ======
== 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 '''[https://workspaceupdates.googleblog.com/2023/09/winding-down-google-sync-and-less-secure-apps-support.html 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''':<pre>
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
</pre>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 '''[https://console.cloud.google.com/apis/credentials 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:
[[Arquivo:Google1.png|nenhum|commoldura]]
Precisa concordar com os termos para seguir em frente:
[[Arquivo:Google2.png|nenhum|commoldura]]
Nessa tela vamos criar nosso projeto, então siga a seta.
[[Arquivo:Google3.png|nenhum|miniaturadaimagem|1631x1631px]]
Vamos dar um nome ao projeto, no meu exemplo chamei de ISPUP e clicar em criar:
[[Arquivo:Google4.png|nenhum|miniaturadaimagem|1633x1633px]]
Após criar o projeto precisamos configurar as permissões em '''CONFIGURAR TELA DE CONSENTIMENTO''':
[[Arquivo:Google5.png|nenhum|miniaturadaimagem|1632x1632px]]Vamos selecionar para tipo de uso externo e clicar em criar:
[[Arquivo:Google6.png|nenhum|miniaturadaimagem|1632x1632px]]
Nessa tela vamos informar o app que vamos criar, dei o nome de '''msmtp''' mesmo, defini o e-mail de contato:
[[Arquivo:Google7.png|nenhum|miniaturadaimagem|1631x1631px]]
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:
[[Arquivo:Google8.png|nenhum|miniaturadaimagem|1160x1160px]]
Na tela de escopo só clicar em salvar e continuar:
[[Arquivo:Google9.png|nenhum|miniaturadaimagem|1588x1588px]]Não vamos adicionar um usuário de teste e clicamos em salvar e continuar:
[[Arquivo:Google10.png|nenhum|miniaturadaimagem|1589x1589px]]
Clique em voltar para o Painel:
[[Arquivo:Google11.png|nenhum|miniaturadaimagem|1592x1592px]]
Agora vamos colocar em produção clicando em '''PUBLICAR APLICATIVO''':
[[Arquivo:Google12.png|nenhum|miniaturadaimagem|1591x1591px]]
Na sequência clique em confirmar para que seja publicado:
[[Arquivo:Google13.png|nenhum|commoldura]]
Agora que já publicamos nosso app '''msmtp''', vamos criar as credenciais de acesso dele:
[[Arquivo:Google14.png|nenhum|miniaturadaimagem|1576x1576px]]
Em credenciais vamos clicar em criar credenciais e escolher a opção '''ID do cliente OAuth''':
[[Arquivo:Google15.png|nenhum|miniaturadaimagem|1578x1578px]]
Nessa tela vamos selecionar '''Aplicativo da Web''':
[[Arquivo:Google16.png|nenhum|miniaturadaimagem|1580x1580px]]
Vamos dar um nome para ele, deixei como '''msmtp''' mesmo e precisamos adicionar na '''URI de redirecionamento autorizados''' o endereço '''<nowiki>https://oauth2.dance/</nowiki>''' e em seguida clicar em criar:
[[Arquivo:Google17.png|nenhum|miniaturadaimagem|1583x1583px]]
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:
[[Arquivo:Google18.png|nenhum|commoldura]]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''' '''[https://github.com/google/gmail-oauth2-tools/blob/master/python/oauth2.py aqui]'''.
 
Vamos jogar esse script em '''/root/.config/msmtp''' e setar a permissão de execução para ele:<pre>
# mkdir -p /root/.config/msmtp
# chmod +x /root/.config/msmtp/oauth2.py
</pre>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:
  <nowiki>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</nowiki>
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:
[[Arquivo:Dance.png|nenhum|commoldura]]
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": "<nowiki>https://mail.google.com/</nowiki>",
  "user": "[email protected]",
  "client_id": "seu_client-id",
  "client_secret": "seu_client-secret",
  "token_uri": "<nowiki>https://accounts.google.com/o/oauth2/token</nowiki>",
  "auth_uri": "<nowiki>https://accounts.google.com/o/oauth2/auth</nowiki>",
  "auth_provider_x509_cert_url": "<nowiki>https://www.googleapis.com/oauth2/v1/certs</nowiki>",
  "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 '''[https://github.com/getmail6/getmail6/blob/master/getmail-gmail-xoauth-tokens 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
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.
# apt install bsd-mailx
# mailx -s TESTE_ENVIO email@dominio <<EOF
Teste de envio de e-mail pelo msmtp com oauth2
EOF
Para replicar em outros servidores basta instalar o '''msmtp''' e '''msmtp-mta''' e copiar a estrutura abaixo que já vai estar com as credenciais e tokens:
 
* /root/.config/msmtp/*
* /root/.msmtprc
 
Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos [[Sobre mim|aqui]].
[[Categoria:Artigos Técnicos]]

Edição atual tal como às 01h14min 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.

# apt install bsd-mailx

# mailx -s TESTE_ENVIO email@dominio <<EOF
Teste de envio de e-mail pelo msmtp com oauth2
EOF

Para replicar em outros servidores basta instalar o msmtp e msmtp-mta e copiar a estrutura abaixo que já vai estar com as credenciais e tokens:

  • /root/.config/msmtp/*
  • /root/.msmtprc

Essa documentação foi útil? Compartilhe, divulgue e ajude outras pessoas. Meus contatos podem ser vistos aqui.