Descrição de situação que talvez seja bug do Mastodon (sistema de microblogging federado por ActivityPub) da comunidade Ayom ao tentar desabilitar o duplo fator de autenticação (2FA) de uma conta e de como foi possível contornar o erro, considerando que a necessidade pode vir a se repetir ou, também, eventualmente ajudar a administração de outros servidores.

Pela Web

Por algum motivo desconhecido, não foi possível à própria pessoa detentora da conta desativar o duplo fator de autenticação em https://ayom.media/settings/two_factor_authentication_methods

Tampouco houve sucesso na interface de administração na Web, https://ayom.media/admin/accounts — Nesse caso, após pesquisar pela conta e carregá-la, quando ela tem 2FA ativo, aparece botão com a opção de desativar. Porém, ao acioná-lo, ocorria erro, sem explicação.

Por linha de comando

Tentamos, então, fazer isso pela interface de linha de comando. Nossa estrutura utiliza Docker em modo Swarm. Alinhando o necessário nesse cenário com a documentação do comando de administração do Mastodon, executamos o seguinte, também sem sucesso. Considerando ayom_mastodon-web o nome do contêiner e nome.da.conta autoexplicativo:

docker exec -it "$(docker ps -q --filter name=ayom_mastodon-web)" tootctl accounts modify nome.da.conta --disable-2fa

Ocorreu erro, provavelmente o mesmo, porém visível agora, de quando a operação foi tentada pela Web.

Banco de dados

Fomos, então, pesquisar sobre o esquema do banco de dados do Mastodon, em PostgreSQL. No ambiente Docker Swarm da Ayom, ele está em execução como outro serviço, denominado mastodon-db, da pilha ayom, sendo mastodon o nome de usuário e mastodon_production o nome do banco de dados. O nome do contêiner é ayom_mastodon_db.

Cópia de salvaguarda

Elementar. Executamos, para isso, nosso script backup_mastodon-db.sh, que salva o arquivo, por padrão, em ~/bkp

Determinar a conta e zerar campos do 2FA

Abrir o programa psql já com a base em questão:

docker exec -it "$(docker ps -q --filter name=ayom_mastodon-db)" psql -U mastodon -d mastodon_production

Segue exemplo de como procurar pela conta que deseja alterar, para descobrir o id do registro de usuário relacionado. Observar que há tanto uma tabela accounts quanto uma tabela users. O domain nulo significa que a conta é local, algo importante de ter ciência pois pode haver o mesmo username de outro domain.

select u.id, username, domain, a.id account_id
from accounts a
join users u on u.account_id = a.id
where a.username = 'nome.da.conta' and domain is null;

Após muito pesquisar, constatamos que os dados de 2FA ficam nos campos otp_required_for_login, otp_secret e otp_backup_codes da tabela users. Basta zerá-los, considerando o id descoberto na consulta acima:

begin;
update users set
  otp_required_for_login = false,
  otp_secret = NULL,
  otp_backup_codes = NULL
where id = 10;
commit;

⚠️ Aviso de segurança da informação

Recomenda-se ter certo nível de certeza sobre quem solicitou a desativação de 2FA ser realmente a pessoa titular da conta, pois a “engenharia social” é a maneira mais esperada de atacantes tentarem contornar tal proteção.