Migrar listas de distribuição entre servidores Zimbra

Exportando listas de distribuição para arquivos no Zimbra origem:

zmprov gadl > /tmp/listas.txt
mkdir /tmp/listas;while read LIST;do zmprov gdl $LIST | grep zimbraMailForwardingAddress:| awk {'print $2'} > /tmp/listas/${LIST}.txt ;done < /tmp/listas.txt
Fonte: Antigo wiki do Sr Bastos https://github.com/coffnix 

Envie os arquivos para o Zimbra destino.

Neste caso não estava disponível o arquivo /tmp/listas.txt do servidor anterior, então o script trata os arquivos de exportação para criar e popular as listas no novo Zimbra:

#!/bin/bash
# Eduardo Marques
# 06/2019

# Lista os arquivos de exportação
for i in `ls /opt/migration/listas/`;do

# Cria a lista de distribuição tratando a saída removendo o ".TXT"
        echo "Criando lista ${i::-4}" >> /tmp/criarlista.log
        zmprov cdl ${i::-4}

        # Lista emails do txt e adiciona os emails na lista.    
        for LMAIL in $(cat /opt/migration/listas/${i} |grep -v ^#|tr 'r' ' ');do
                zmprov adlm ${i::-4} $LMAIL  >> /tmp/criarlista.log
        done
done

Trocar senhas de usuários LDAP

Pequeno script em Bash usando laço while recebendo entrada de um arquivo com uma lista de usuários para trocar senhas:

#!/bin/bash
#
# Eduardo 21/06/2019
# Descrição
# Muda senha de todos usuarios colocados no arquivo listas.txt. 
# As senhas sao geradas automaticamente e podem ser definidas se adicionados o parametro -s.

LISTA="listas.txt"

while read NAME;do
        ldappasswd  -h localhost -D "cn=Manager,dc=empresa,dc=int" -x "uid=${NAME},ou=People,dc=empresa,dc=int" -w secret 2>> erromudasenha.log
done < ${LISTA}

Script de Backup do fileserver para bucket S3 na AWS

O script a seguir foi usado para enviar backup de uma pasta do fileserver para o bucket no S3 da Amazon.

O pré requisito não abordado desde script é que você já tenha instalado e configurado o AWS cli no servidor e que também já configurado  o Mutt para envio de e-mails.

 #!/bin/bash  
 #  
 # Autor: Eduardo Marcial  
 # Data: 23-05-2019  
 # Backup aws  
 # v2  
 # Para restaurar backup pode ser usado:   
 # "aws s3 cp --recursive s3://backup-namebucket/dir/ /dest/dir"  
 ###############################################################  
 # Carrega variáveis  
 DATE=`date +%d%m%y%H%M`  
 proc=`ps aux | grep "aws s3" | grep -v grep | awk '{print $2}' | xargs | awk '{print $1}'`;  
 log='/var/log/bkp-aws.log';  
 # Checagem de processos de backup rodando.  
 if [ $proc ]; then  
      echo "O processo AWS S3 está rodando" -`date` >> $log;  
      echo " " >> $log;  
 else  
 #Rodando AWS cli s3  
      /usr/local/bin/aws s3 sync /home/arquivos/ s3://backup-bucketname/ 2>> /var/log/bkp-aws.log  
      if [ $? -ne 0 ]; then  
           cat /var/log/bkp-aws.log | mutt -s "Relatório de backup AWS com exceções" [email protected]            
      else  
           cat /var/log/bkp-aws.log | mutt -s "Sucesso no envio de backup para AWS" [email protected]  
      fi  
      echo "Done ! "-`date` >> $log;  
      echo " " >> $log;  
 fi  
 # Fim  

VPN PPTP Client rodando em Linux

Requisitos:
ppp
pptp-client

Configuração:
Configure a VPN PPTP Client:
pptpsetup –create cppronuvem –server scb-srv03.scbadvogados.adv.br –username vpnmatriz –password [email protected] –encrypt


cat /etc/ppp/options
lock
noauth
nobsdcomp
nodeflate
refuse-pap
refuse-eap
refuse-chap
refuse-mschap

cat /etc/ppp/options.pptp
lock
noauth
refuse-pap
refuse-eap
refuse-chap
refuse-mschap
nodefaultroute
nobsdcomp
nodeflate

Crie um script para iniciar a VPN automaticamente em caso de queda:
vi /etc/check-vpn.sh
#!/bin/bash

DEBUG=”0″
HOST=”192.168.199.199″
VPN_NAME=”cppronuvem”

DAY=$(date +’%d/%m/%Y’)
HOUR=$(date +’%H:%M:%S’)
DATE=”${DAY} ${HOUR}”
PINGRES=$(ping -c 3 ${HOST})
PLOSS=$(echo ${PINGRES} : | grep -oP ‘d+(?=% packet loss)’)

if [ “${DEBUG}” -eq “1” ];then
echo “[${DATE}] Loss Result: ${PLOSS}”
fi

if [ “100” -eq “${PLOSS}” ];then
{ ps auxw|grep pppd|grep ${VPN_NAME}|awk ‘{print $2}’|xargs kill; } 2> /dev/null
echo “[${DATE}] Iniciando PPTP Client : ${HOST}”
/usr/sbin/pppd call ${VPN_NAME}
echo “[${DATE}] PPTP iniciada: ${HOST}”
else
if [ “${DEBUG}” -eq “1” ];then
echo “[${DATE}] PPTP OK: ${HOST}”
fi
fi

Dê permissão de execução ao script:
chmod +x /etc/check-vpn.sh
Adicione ao /etc/crontab:
* * * * * root /etc/check-vpn.sh >> /var/log/vpncheck.log 2>&1

Caso seja necessário adicionar alguma rota após o início da VPN, adicione a mesma no script abaixo:
vi /etc/ppp/ip-up.local
route add -net 10.4.202.0 netmask 255.255.255.0 gw 192.168.199.199

Descobrir conta enviado SPAM no Zimbra – Discover SPAM account sent in Zimbra

Avaliação de fluxo de email para checagem da saúde do Zimbra, é um ótimo indicativo de roubo de conta para Spam.
Evaluation of e-mail flow for Zimbra’s health check, is a good indication of account theft for Spam.

Verificar quantidade de emails enviados por conta:
Check quantity of emails sent per account:

cat /var/log/zimbra.log | sed -n ‘s/.*sasl_username=//p’ | sort | uniq -c | sort -n

Contas disparando emails:
Accounts firing emails:
tail -f /var/log/zimbra.log | sed -n ‘s/.*sasl_username=//p’

English by translate.google.com 😛

Zimbra – Erro ao enviar email 530 5.7.0 Must issue a STARTTLS command first (in reply to MAIL FROM command)

Erro “530 5.7.0 Must issue a STARTTLS command first (in reply to MAIL FROM command)”

Retorno de email com o seguinte erro:

530 #5.7.0 Must issue a STARTTLS command first (in reply to MAIL FROM command)
Precisa habilitar postfix_smtp_tls_security_level na conf do postfix.

Verificar configuração.
$ zmlocalconfig -e postfix_smtp_tls_security_level=may

Segue os passos:
$ zmlocalconfig|grep postfix_smtp_tls_security_level
$ zmmtactl stop ; sleep 1 ; zmmtactl start

Como fazer rsync entre servidores sem senha

Isso faz com que não seja necessário rodar o rsync daemon no cliente.
Com a configuração do ssh também é possível efetuar o login direto por ssh sem senha.


Permitir ssh conectar sem senha:

Esses comandos abaixo devem ser executados no servidor que VAI conectar sem senha (ORIGEM):

Com essa configuração acima, o ssh já funciona sem senha quando se tenta conexão do servidor origem para o servidor destino.

Agora iremos melhorar a segurança deste acesso:

 No arquivo /root/.ssh/authorized_keys do servidor DESTINO, fica a chave criada. Deve-se então  adicionar na linha da chave o seguinte:

Ou seja, o comando from restringe somente para o ip de origem e o command permite que o comando especificado seja executado quando o servidor de origem fizer o ssh no servidor de destino. O resto da linha é o que já existe no arquivo authorized_keys.

Para aumentar ainda mais a segurança, podemos forçar que o Login de root seja efetuado somente para o comando indicado no arquivo acima, basta efetuar o procedimento abaixo, que seta a variavel PermitRootLogin como forced-commands-only:

OBS: Isso restringe totalmente o acesso de root diretamente, de qualquer máquina.

Load Average no Linux

Na administração de servidores Linux o load average é quase instintivamente consultado, essa preocupação se deve ao fato da carga do sistema ser uma métrica usada para medir e dimensionar  servidores e seus trabalhos, vale lembrar que muitas vezes lidamos com instâncias em nuvem e neste ambiente o load average pode significar economia ou prejuízo a depender das métricas utilizadas.

Embora seja um assunto muito bem documentado, vou  me aventurar um pouco nele também. Abaixo uma imagem de load average gerada pelo monitoramento do Zabbix ao longo de sete dias de um servidor Oracle.

É possível observar picos regulares causados devido a uma rotina de backup agendada no cron, embora não exista a informação da quantidade de CPUs este histórico nos indica um consumo padrão muito abaixo dos picos. Processos em espera devido ao atraso de IO de um HD externo faz o load average subir, mas não por um gargalo do processador mas sim pelas limitações da USB ou do disco.

No Linux podemos ver load average através de vários comandos, dois deles são o uptime e o top.

Os dois comandos fazem a mesma impressão da informação da carga do sistema, abaixo o primeiro deles o “uptime” mostra o load average. São apresentados 3 números representando a média de processos rodando ou em espera pelo processador  nos últimos 1, 5 e 15 minutos.

Nesta saída do uptime e podemos concluir que existem 0,97 processos em execução e/ou esperando no último minuto e que está havendo um crescimento em comparação com os últimos 5 e 15 minutos.

Na saída do top confirmamos que o load segue baixo agora em 0,47, com tendência de queda se observamos os últimos 5 e 15 minutos. Na mesma tela a linha CPU(s) um pouco abaixo podemos verificar que o wait está em 0.0%, bem alinhado com o resultado do load, assim como o idle bem alto 97,2% confirmam que o servidor está bem ocioso.
Mas olhando apenas o load average muitas vezes não podemos concluir muita coisa além da tendência de subida ou queda de carga, mas a partir do momento que se conhece o número de CPUs podemos ter uma visão mais clara.
lscpu – Mostra informações detalhadas de CPU.
Conhecendo o número de CPUs percebemos que o servidor está realmente muito ocioso, para 32 CPUs mesmo um load de 32 poderia não significar um problema, caso ele estivesse apenas esperando para gravar um subprocesso limitado à velocidade de um hd externo por exemplo.
Acredito que dentro da funcionalidade básica deste recurso para por aqui já é o suficiente, contudo não poderia deixar de falar sobre algumas curiosidades que achei numa pesquisa pelo Google .

Curiosidades

A primeira é sobre s RFC 546 de 1973 descrevendo uma análise de load average nos dinossauros BBN-TENEX e USC-ISI. 
Fonte: http://tenex.opost.com/kapix.html
O climax fica por conta do gráfico das cargas feito a mão.

Trecho da RFC interpretando o gráfico:

  Interpreting data such as this is tricky business.  However, it is   difficult to resist making the following observations:
   1. The shapes of the BBN and ISI curves are approximately the; furthermore, there is no skew between the curves.  This suggests      that the user populations for the two systems have similar working      habits and are acclimated to the same time zone.


   2. The significant features of both curves appear to be strongly correlated with “normal events” in the day of a user living on      East Coast time,suggesting that the load at both sites is      influenced most strongly by such users:
      a. the load begins to increase between 7-8 a.m. EDT as users begin their daily computing;
      b. it dips between 10-11 a.m. EDT (smoothed to a smaller rate of increase in the ISI curve) as users take their coffee break;
      c. the load peaks sharply between 1-2 p.m. EDT as users return from lunch to resume their computing;
      d. it decreases as the afternoon continues and as users go home from work;
      e. it reaches a local minimum between 6-7 p.m. EDT (minimum not present in ISI curve) when most people eat dinner;
      f. it increases to an evening peak between 9-10 p.m. EDT as some users come back from dinner and after dinner activities to         resume their computing.


   3. The curve for ISI is smoother than the one for BBN: the “coffee      break” dip appears only as a decrease in slope; the dinner break      and evening peak are completely smoothed  out.  This smoothing is      probably due to the influence of the West Coast users of the ISI      machine.


   4.  During July the BBN system was more heavily loaded than the ISI system.  Since the data collected did not include the number of      active jobs it is not possible to determine from the data whether      BBN had more users or just more demanding users.”


Liberar Skype em rede com Squid Proxy

Desde o dia 13 de março de 2018, foi removida do skype a opção de configuração manual de proxy. Segue:

https://support.skype.com/pt-br/faq/FA1017/posso-me-conectar-ao-skype-por-meio-de-um-servidor-proxy

Para corrigir este problema, crie um arquivo com os hosts do skype, e libere via masquerade.

1- Crie uma lista com os hosts do skype:

# for i in {0..20} ; do dig +short dsn$i.d.skype.net >> /home/firewall/lista-skype.txt; done | sort | uniq

2- Libere via MASQUERADE:

for host_skype in $(cat /home/firewall/lista-skype.txt);do
        iptables -t nat -A POSTROUTING -s $LAN -d ${host_skype} -o $INTF -j MASQUERADE
done

* Onde $LAN e  $INTF são as interfaces previamente declaradas.

Backup Incremental com rsync

O programa rsync é um utilitário de cópia muito utilizado para fazer backups, ele aceita diversos parâmetros como uso de chaves, manipulação de parâmetros, cópias diferenciais e incrementais.

Abaixo vou deixar um pequeno bashscripts de backup incremental.

Frisando que no backup incremental o local que recebe a cópia completa sempre fica atualizada e o que é mudado é adicionado na pasta de “incrementais”.

Exemplo:

ANTES DO RSYNC

Origem:
/DADOS/word.doc     13 kb


Destino:
/BKPFULL/DADOS/word.doc    13 kb

DEPOIS DO RSYNC COM MUDANÇA NA ORIGEM NO DIA 01/01/2022

Origem:
/DADOS/word.doc     124 kb


Destino:
/BKPFULL/DADOS/word.doc    124kb
/BKP_INCR/01-01-2022/DADOS/word.doc    13 kb

SCRIPT

#!/bin/bash
#
# valedolinux.com.br
# Autor: Eduardo Marcial
# Data: 2018
# Backup Incremental
#
##################################################################################


##################################################################################

# DECLARAÇÃO DE VARIÁVEIS




DATA=$(date +%F) #Carimbo de data aaaa-mm-dd

ORIGEM=”/home/setores”
COMPLETO=”/mnt_hdext/backup-incremental/FULL”
DESTINO=”/mnt_hdext/backup-incremental/$DATA”
PASTLOG=”/mnt_hdext/backup-incremental/log”
LOG=”$PASTLOG/log-$DATA” #Log do backup
UUID_HD_USB=””


##################################################################################

# CHECA MONTAGEM DO HD EXTERNO


CHECK_MOUNTED=$(mount |grep -w /mnt_hdext|tail -1|wc -l)

if [ “${CHECK_MOUNTED}” = “0” ]; then
mount /dev/sdb1 /mnt_hdext 2>> ${LOG}
        if [ $? -gt 0 ]; then
        echo -e “n ERRO AO MONTAR HD-EXTERNO USB UUID=”${UUID_HD_USB}”.” >> $LOG
                exit 1
        else
                echo -e “n OK – HD-EXTERNO USB MONTADO COM SUCESSO” >> $LOG;
        fi
        
fi
##################################################################################
# CRIA DIRETORIOS E ARQUIVOS


if [ ! -d ${DESTINO} ]; then

        mkdir -p ${DESTINO}
fi


if [ ! -d ${COMPLETO} ]; then

        mkdir -p ${COMPLETO}
fi


if [ ! -d ${PASTLOG} ]; then

        mkdir -p ${PASTLOG}
fi


touch $LOG



##################################################################################

# Inicio de bkp


echo “Inicio de backup $(date)” >> $LOG





##################################################################################

# REALIZAR BKP


sudo rsync -azbvP –exclude=’TEMP’ –delete –backup-dir=$DESTINO $ORIGEM $COMPLETO 2>> $LOG



##################################################################################

# SE NÃO HOUVE ERRO NO BACKUP FAZ LIMPEZA – 60 DIAS 


if [ “$?” -eq 0 ]; then

find $DESTINO -maxdepth 1 -mtime +60 -exec rm -rf {} ; 2>> $LOG
else
echo “Erro ao realizar backup incremental. $DATA” >> $LOG
fi


echo “Fim de backup $(date)”