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.

