Migração Mandic > Workmail com Screen/Imapsync + Lambda Access Control Rule + Backup + Automação

Migração Mandic > Workmail com Screen/Imapsync + Lambda Access Control Rule + Backup + Automação

SCRIPT DE MIGRAÇÃO DO MANDIC PARA O WORKMAIL

#!/bin/bash
# Lista de usuários e senhas
USERS1_FILE="users1.txt"
PASSWORDS1_FILE="passwords1.txt"
USERS2_FILE="users2.txt"
PASSWORDS2_FILE="passwords2.txt"
# Loop para executar o comando "imapsync" para cada combinação de usuários e senhas
while read user1 && read password1 <&3 && read user2 <&4 && read password2 <&5; do
   # Nome da sessão de screen
   SCREEN_NAME="${user1}_${user2}_$(date +%s)"

   # Comando a ser executado dentro do screen
   CMD="imapsync --host1 imap.mandic.com.br --user1 $user1 --password1 $password1 --host2 imap.mail.us-east-1.awsapps.com --user2 $user2 --password2 $password2 --ssl1 --ssl2 --authmech1 PLAIN --authmech2     PLAIN --noauthmd5 --exclude \"Junk\" --exclude \"Trash\" --nofoldersizes --skipsize --allowsizemismatch"

   # Inicia a sessão de screen e executa o comando
   screen -dmS "$SCREEN_NAME" bash -c "$CMD"

   # Aguarda um tempo antes de iniciar a próxima execução
sleep 3

done < "$USERS1_FILE" 3< "$PASSWORDS1_FILE" 4< "$USERS2_FILE" 5< "$PASSWORDS2_FILE"

Explicando o código:

  • Nas primeiras linhas, são definidos os arquivos de texto que contêm as listas de usuários e senhas;
  • Em seguida, é utilizado um loop que lê linha por linha de cada arquivo, atribuindo as variáveis "user1", "password1", "user2" e "password2" às variáveis correspondentes;
  • Dentro do loop, é definido o nome da sessão de screen, que é composto pelos nomes dos usuários e a data atual;
  • Em seguida, é definido o comando a ser executado dentro do screen, utilizando as variáveis "user1", "password1", "user2" e "password2";
  • Por fim, é iniciada uma sessão de screen com o nome definido anteriormente, executando o comando "imapsync";
  • O loop aguarda um tempo antes de iniciar a próxima execução, para evitar sobrecarga no sistema.

O loop que aguarda é apenas um tempo básico antes de iniciar a próxima execução. Esse tempo é definido pela função sleep, que aguarda por um número de segundos especificado como argumento. No exemplo que eu forneci, o tempo de espera é de 3 segundos (sleep 3).
Quando a execução do comando imapsync termina, a sessão de screen é finalizada automaticamente e o controle é retornado para o shell original. Portanto, não é necessário esperar a sincronização ser concluída antes de iniciar a próxima sessão de screen. O script cria uma nova sessão de screen para cada combinação de usuários e senhas e executa o comando imapsync dentro dela. Cada sessão de screen é independente e pode ser encerrada individualmente sem afetar as outras.

Observações sobre os grupos “Access Control Rule

    1.Percebi que sempre tem que ter 1 usuário na Access Control Rule, então é necessário criar um usuário com nome Disable e adicionar na regra

Usar o comando:

aws workmail put-access-control-rule \
--organization-id m-0075f9777d0xxxxxxxxa2ac154014b \
--name 8601b791-65xxxxxxxxf0c1e8b40c3 \
--effect DENY --description "Block" \
--user-ids 72ff0744-6xxxxxxxxxx-87d94fc61699 \
--region us-east-1

Adicionar no “--user-ids ” # assim ele vai limpar a lista e sempre ficara 1

   2. Para adicionar alguém na lista, só fazer o mesmo update adicionando o usuário disable + o user id que você precisa.

Usar o comando:

aws workmail put-access-control-rule \
--organization-id m-0075f9777d0xxxxxxxxa2ac154014b \
--name 8601b791-65xxxxxxxxf0c1e8b40c3 \
--effect DENY --description "Block" \
--user-ids ca7848ec-e3--user2--b5418293b473 d73e1a50-1c2c-497b--user3--8ef6-00688b4fb2ed \
--region us-east-1

   3. Adicionar um usuário a uma regra access control rule para bloquear o acesso completo a um usuário:

1- Crie a regra com nome Block e adicione o usuário que deseja bloquear (só para parâmetro)
2- Em uma ec2, execute o comando abaixo:

aws workmail list-access-control-rules \
--organization-id m-0075f9777d0xxxxxxxxa2ac154014b \
--region us-east-1

Este comando ira listar a descrição, nome e usuários da regra.

3- Para adicionar outro usuário adicione os user-id do usuário que você queira atualizar na regra no comando abaixo:

aws workmail put-access-control-rule \
--organization-id m-0075f9777d0xxxxxxxxa2ac154014b \
--name 8601b791-65xxxxxxxxf0c1e8b40c3 \
--effect DENY --description "Block" \
--user-ids ca7848ec-e3--user2--b5418293b473 d73e1a50-1c2c-497b--user3--8ef6-00688b4fb2ed \
--region us-east-1

Neste caso acima, eu passei o id da organização, --name é o Nome da Access Control Rule que peguei com o comando anterior e user ids são os ids dos usuários.

Lambdas para automação da explicação acima para grupos de “Access Control Rule

VIA LAMBDA (Adicionar usuários na regra de Access Control Rule)

import boto3
workmail = boto3.client('workmail', region_name='us-east-1')

# Define as informações da Access Control Rule que será atualizada
organization_id = 'm-0075f9777d0xxxxxxxxa2ac154014b'
access_control_rule_name = '8601b791-65xxxxxxxxf0c1e8b40c3'
effect = 'DENY'
description = 'Block'
user_ids = ['d73e1a50-1c2c-497b--user3--8ef6-00688b4fb2ed']

# Busca a Access Control Rule existente
response = workmail.list_access_control_rules(OrganizationId=organization_id)
existing_rule = None
for rule in response['Rules']:
if rule['Name'] == access_control_rule_name:
existing_rule = rule
break

# Verifica se a Access Control Rule existe
if existing_rule is None:
print(f"A Access Control Rule '{access_control_rule_name}' não foi encontrada.")
else:
# Atualiza a Access Control Rule com o novo User ID
user_ids += existing_rule['UserIds']
response = workmail.put_access_control_rule(
OrganizationId=organization_id,
Name=access_control_rule_name,
Effect=effect,
Description=description,
UserIds=user_ids
)
print(f"A Access Control Rule '{access_control_rule_name}' foi atualizada com sucesso.")

VIA LAMBDA (VOLTAR AO USUÁRIO DISABLE na regra de Access Control Rule)

import boto3
def lambda_handler(event, context):
# Cria uma instância do cliente do WorkMail
workmail = boto3.client('workmail', region_name='us-east-1')

# Define as informações da Access Control Rule que será adicionada
organization_id = 'm-0075f9777d0xxxxxxxxa2ac154014b'
access_control_rule_name = '8601b791-65xxxxxxxxf0c1e8b40c3'
effect = 'DENY'
description = 'Block'
user_ids = ['72ff0744-6xxxxxxxxxx-87d94fc61699'] # disable user

# Adiciona a Access Control Rule
response = workmail.put_access_control_rule(
OrganizationId=organization_id,
Name=access_control_rule_name,
Effect=effect,
Description=description,
UserIds=user_ids
)
# Retorna a resposta da API do WorkMail
return response

Conclusão: A ideia é criar vários grupos de Access Control Rule, cada um com uma rotina de suspensão de emails, um grupo não pode acessar final de semana o email, outro somente de 8 as 18 e por ai vai, para cada grupo, tem que existir um usuário para manter a access control rule ativa, é preciso de 2 lambdas para cada grupo, 1 para colocar todos na lista, e outra para atualizar e deixar somente o usuário que vai desabilita-la.


SCRIPT DE AUTOMAÇÃO PARA CRIAÇÃO DE CAIXAS DE EMAIL NO WORKMAIL


#!/bin/bash
# Defina o ID da organização WorkMail
ORG_ID="m-0075f9777d0xxxxxxxxa2ac154014b"
# Defina a senha para todas as caixas de correio
PASSWORD="sua_senha"
# Defina o caminho para o arquivo com os nomes das caixas de correio e dos nomes de exibição
EMAIL_FILE="mailbox-names.txt"
DISPLAY_NAME_FILE="display-names.txt"
# Verifica se os arquivos existem
if [[ ! -f $EMAIL_FILE ]]; then
echo "O arquivo $EMAIL_FILE não existe."
exit 1
fi
if [[ ! -f $DISPLAY_NAME_FILE ]]; then
echo "O arquivo $DISPLAY_NAME_FILE não existe."
exit 1
fi
# Loop para ler os arquivos e criar as caixas de correio
while read -r EMAIL && read -r DISPLAY_NAME <&3; do
# Nome do arquivo de log para esta sessão
LOG_FILE="create_$EMAIL.log"
# Executar o comando aws workmail create-user e redirecionar a saída para o arquivo de log
aws workmail create-user --organization-id "$ORG_ID" --name "$EMAIL" --display-name "$DISPLAY_NAME" --password "$PASSWORD" > "$LOG_FILE" 2>&1
# Verifica o código de saída do comando aws workmail create-user
if [[ $? -eq 0 ]]; then
echo "Criada a caixa de correio: $EMAIL, log: $LOG_FILE"
else
echo "Erro ao criar a caixa de correio: $EMAIL, log: $LOG_FILE"
fi
done < "$EMAIL_FILE" 3< "$DISPLAY_NAME_FILE"


Explicação do Script:

1. O script começa definindo algumas informações importantes, como o ID da organização WorkMail e a senha que será usada para todas as novas caixas de correio.
2. Ele espera que haja dois arquivos: "mailbox-names.txt" (nomes de e-mail) e "display-names.txt" (nomes de exibição).
3. O script verifica se ambos os arquivos existem. Se algum deles não existir, ele mostra uma mensagem de erro e para.
4. O script entra em um loop, onde lê uma linha do arquivo "mailbox-names.txt" e também lê uma linha correspondente do arquivo "display-names.txt". Essa linha de "display-names.txt" é associada ao nome de e-mail lido do "mailbox-names.txt".
5. Ele cria um arquivo de log personalizado para cada caixa de correio que será criada, usando o nome do e-mail.
6. Usando a ferramenta aws, o script cria uma caixa de correio usando o ID da organização, o nome de e-mail, o nome de exibição e a senha definida anteriormente. Ele também redireciona a saída (informações) desse processo para o arquivo de log personalizado.
7. Depois de criar a caixa de correio, o script verifica se a operação foi bem-sucedida verificando o código de saída. Se tudo correu bem (código de saída igual a 0), ele mostra uma mensagem dizendo que a caixa de correio foi criada. Caso contrário, mostra uma mensagem de erro.
8. O loop continua até que todas as linhas do arquivo "mailbox-names.txt" tenham sido processadas.
9. O script termina, e todas as caixas de correio foram criadas de acordo com as informações nos arquivos "mailbox-names.txt" e "display-names.txt".

Basicamente, esse script automatiza a criação de várias caixas de correio no Amazon WorkMail. Ele usa os nomes de e-mail do arquivo "mailbox-names.txt" e associa os nomes de exibição correspondentes do arquivo "display-names.txt". O script faz todo o trabalho para você, criando as caixas de correio e registrando os resultados em arquivos de log separados.


Você pode habilitar varias caixas de email de uma vez após a criação com o domínio temporário da AWS, colocando o domínio principal o temporário. Caso você queira virar para produção, altere o domínio principal para seu domínio, selecione todas as caixas disable e ative, o domínio principal vai estar selecionado.

BACKUP WORKMAIL PARA S3


Oficial: https://docs.aws.amazon.com/workmail/latest/adminguide/mail-export.html
Oficial txt/ptbr: https://docs.aws.amazon.com/pt_br/workmail/latest/adminguide/mail-export.html


Comando executado apos configuração acima:

Verificação dos jobs:



Fiz download do .zip para checagem:

O backup dos emails contem a extensão .eml, possivel abrir diretamente do cliente de email.

Considerações

  • Você pode executar até 10 trabalhos simultâneos de exportação de caixas de correio para uma determinada WorkMail organização da Amazon.
  • Você pode executar um trabalho de exportação de caixa de correio para uma determinada caixa de correio até uma vez a cada 24 horas.
  • Todos os seguintes recursos devem estar na mesmaAWS região:
    - WorkMail Organização Amazon
    - AWS KMSCMK
    - Bucket do Amazon S3


AUTOMAÇÃO DE BACKUP VIA LAMBDA (Código no Final)


  • Usar Python 3.9
  • So pode executar 10 backups por vez (Limite do Workmail)
  • So pode fazer 1 backup de cada conta a cada 24 horas
  • Precisa criar dentro da pasta prefix, uma pasta para cada usuário para receber o backup
  • Alterar timeout para 15 minutos na lambda e aumentar os MB (se necessario)

Permissões que usei para conseguir (recomendo usar menos privilégios seguindo a doc acima da AWS)

Necessário adicionar relação de confiança, usei esta no caso do teste (alterar conta AWS e ID da organização)

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "export.workmail.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "767xxxxxxx782"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:workmail:us-east-1:7678xxxxxxx7782:organization/m-0075f977xxxxxxxxxb44a2ac154014b"
        }
   }
},
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
        }
   ]
}

Código da lambda para automação do Backup (Lembrar de colocar pausa de 1 segundo para cada execução)

import boto3
import time

def start_mailbox_export_job(organization_id, entity_id, kms_key_arn, role_arn, s3_bucket_name, s3_prefix):
client = boto3.client('workmail')

response = client.start_mailbox_export_job(
OrganizationId=organization_id,
EntityId=entity_id,
KmsKeyArn=kms_key_arn,
RoleArn=role_arn,
S3BucketName=s3_bucket_name,
S3Prefix=s3_prefix
)

return response

def lambda_handler(event, context):
organization_id = 'm-0075f9777xxxxxxxxxac154014b'
kms_key_arn = 'arn:aws:kms:us-east-1:7xxxxxxxxx157782:key/13c2296xxxxxxxxx4-462be5887d0a'
role_arn = 'arn:aws:iam::7xxxxxxxxx157782:role/service-role/BackupWorkmail-role-k5200tgh'
s3_bucket_name = 'xxxxxxxxx.workmail'

entity_ids = [
'c8965641-862b-47d0-9864-104dca227294',
'72ff0744-6a48-45a3-89f3-87d94fc61699'
]
s3_prefixes = [
'workmail_dump/email1.xxxxxxxxx.awsapps.com',
'workmail_dump/email2.xxxxxxxxx.awsapps.com'
]
for entity_id, s3_prefix in zip(entity_ids, s3_prefixes):
response = start_mailbox_export_job(organization_id, entity_id, kms_key_arn, role_arn, s3_bucket_name, s3_prefix)
print(response)

# Pausa de 1 segundo
time.sleep(1)

Compartilhar: