Antonio Paulo Salgado Forster <forster@na-cp.rnp.br>
Rede Nacional de Ensino e Pesquisa (RNP)
Introdução
Compilação do Sendmail 8.8
Configuração
Configuração do Sendmail.CF
Execução
Cuidados com a segurança
Trouble-Shooting
Conclusão
Referências bibliográficas
Sites relacionados
Suponha que um certo usuário resolva fazer propaganda de seu novo produto na Web através de e-mail e, por acaso, escolha seu site para fazer a distribuição das mensagens. De repente, verificando os logs do sendmail, você percebe que seu mailserver enviou 50.000 e-mails aos quatro cantos do mundo, sendo que a origem dessas mensagens é algum endereço desconhecido ou inexistente.
O que fazer diante do ocorrido? Para dizer a verdade, praticamente nada. O que pode ser feito é prevenir-se para que isso não aconteça mais. Seu sistema foi usado como relay para distribuição de Unsolicited Commercial Email (UCE). As conseqüências deste fato podem ser várias: desde reclamações informais, até sites se recusando a receber mensagens de seu domínio.
Essa suposição, no entanto, é ou foi realidade para muitos administradores de rede ao redor do mundo.
Introdução
Como muitos sabem, o sendmail, devido às informações que ele pode fornecer e a sua complexidade - que conseqüentemente implica em problemas escondidos - sempre foi um pacote razoavelmente visado por crackers.
A grande maioria dos usuários da Internet, senão todos, já recebeu propagandas de produtos ou as chamadas correntes via e-mail. Os famosos bulk mail, Unsolicited Commercial E-mail (UCE) ou junk mail são motivos de preocupação para muitos, devido a seu caráter anti-ético, e devido aos recursos por eles disperdiçados.
O que fazer diante desses problemas? Existem algumas formas de combater o uso inadequado dos serviços de seu mailserver, e é nisto que se baseia este artigo. Apresentaremos o processo completo de instalação de um mailserver (sendmail V8), algumas alterações que tornarão seu servidor um pouco mais seguro, além de dicas de manutenção.
Compilação do Sendmail 8.8
Para explanação no artigo, escolhemos o sendmail 8.8.8, última versão disponível no momento. O pacote pode ser obtido em vários sites via ftp, sendo um deles o NetTools . Outro pacote que será utilizado será o Claus Aßmann's check_* routines , um pacote com regras adicionais ao sendmail.
Tendo descompactado o pacote do sendmail 8.8.8, a compilação e a instalação dão-se de forma bem simples, bastando um comando para cada:
# cd sendmail-8.8.8/src
# sh makesendmail
# sh makesendmail install
O script makesendmail, através do comando uname, seleciona o Makefile a ser usado de acordo com o sistema operacional da máquina. Caso haja algum problema durante a compilação, é interessante verificar o tipo de banco de dados que está sendo utilizado. O sendmail aceita trabalhar com dois tipos de bancos de dados: new DBM (NDBM) e o novo banco de dados de Berkeley (NEWDB); além de trabalhar, também, com bancos de dados remotos, como o NIS ou NIS+. Outro ponto que deve ser verificado é o formatador de textos para as páginas man, pois alguns sistemas utilizam o groff, enquanto outros utilizam nroff.
Configuração
O sendmail é um software que depende de vários arquivos de configuração para que seja executado perfeitamente. São eles:
-
/etc/sendmail.cf
Este é o arquivo de configuração do sendmail. Nele, estarão todas as regras, definições de cabeçalhos, ponteiros para outros arquivos, bancos de dados, binários, etc. Este arquivo, no nosso exemplo, será gerado pelo pré-processador m4 de acordo com regras pré-definidas.
Para gerar o sendmail.cf, siga os seguintes passos:
- Descompacte o pacote check.tar no diretório "sendmail-8.8.8/cf";
- No diretório "sendmail-8.8.8/cf/cf", identifique qual o arquivo que se adapta ao sistema operacional. Este arquivo terá a extensão ".mc". Nos casos dos sistemas operacionais que não tiverem um arquivo de configuração já incluído na distribuição, utilize o "generic-bsd4.4.mc", alterando a diretiva OSTYPE de forma que esta aponte para o tipo correto de S.O. (os tipos suportados podem ser encontrados no diretório "sendmail-8.8.8/cf/ostype").
- Edite este arquivo, acrescentando ao final do mesmo as seguintes diretivas:
HACK(spammers)
HACK(spamdoms)
HACK(check_mail)
HACK(use_ip)
HACK(use_names)
HACK(use_relayto)
HACK(check_rcpt4) - Com o pré-processador m4, gere o sendmail.cf com o seguinte comando:
# pwd
/../sendmail-8.8.8/cf/cf
# m4 ../m4/cf.m4 generic-XXXX.mc > sendmail.cf
-
/etc/aliases
Todos os aliases de e-mail do sistema devem ser armazenados neste arquivo. Um exemplo deste arquivo pode ser encontrado no diretório "lib" da distribuição. Nele, o administrador deve colocar qualquer outro alias do sistema.
Normalmente, o sendmail utiliza uma versão desse arquivo mantida pelas rotinas dbm ou db. Estas são armazenadas em "/etc/aliases.dir", "/etc/aliases.pag" ou "/etc/aliases.db", dependendo de qual banco de dados está sendo usado.
-
/etc/sendmail.cw
O arquivo sendmail.cw deve conter, discriminados um por linha, todos os domínios ou máquinas pelos quais esta máquina será servidora de e-mail.
-
/usr/lib/sendmail.hf
Este arquivo é utilizado pelo comando HELP do SMTP, e deve ser copiado de "lib/sendmail.hf" para "/usr/lib/sendmail.hf". O PATH para este arquivo é definido pela opção H (O HelpFile) no arquivo sendmail.cf.
-
/etc/sendmail.st
O arquivo sendmail.st é utilizado para geração de estatísticas sobre o uso do serviço. É um arquivo binário, e suas informações devem ser extraídas através do programa mailstats, que deve ser gerado à # pwd
/../sendmail-8.8.8
# cd mailstats
# gcc -o mailstats mailstats.c -I../src
Os arquivos descritos abaixo não fazem parte da distribuição normal do sendmail, mas serão utilizados pelas novas regras inseridas pelo pacote check_*. É importante frisar que, dependendo de como o administrador queira configurar seu servidor, nem todos os arquivos abaixo serão utilizados. Neste artigo, trataremos de uma configuração utilizando os recursos de Anti-Spam e Anti-Relay.
Existem também outras versões do check_* mais novas, mas decidimos não abordá-las por dependerem da instalação de bibliotecas do NDBM, o que deixaria o assunto um tanto longo para um único artigo.
-
/etc/mail/LocalIP
Neste arquivo, o administrador definirá, um por linha, os endereços que definem suas redes.
-
/etc/mail/LocalNames
Este arquivo deverá conter os nomes dos domínios pelos quais este servidor responderá como mailserver.
-
/etc/mail/RelayTo
Neste arquivo, deverão estar listados todos os domínios para os quais este servidor está autorizado a redirecionar mensagens.
-
/etc/mail/SpamDomains
Um arquivo importante em se tratando de proteção contra spamming; neste arquivo devem estar listados, um por linha, os domínios a serem bloqueados por ser fonte de spamming. Cuidado ao utilizar este arquivo, pois se um certo domínio estiver listado no mesmo, nenhuma mensagem proveniente desse domínio será aceita.
-
/etc/mail/Spammer
Outro arquivo importante com relação à proteção contra spamming. Nele devem ser listados os e-mails utilizados por spammers. É uma alternativa ao bloqueio do domínio inteiro.
Configuração do Sendmail.CF
O arquivo sendmail.cf, gerado da forma citada na seção anterior, é bastante genérico, e para que sua configuração possa ser considerada ideal, algumas alterações são necessárias para sua "customização". Estas mesmas alterações serão descritas nesta seção.
-
Configurações Anteriores
Antes da substituição do sendmail.cf antigo pelo novo, é bastante aconselhável que o administrador verifique possíveis "customizações" existentes no arquivo antigo. Estas podem ser necessárias no novo sendmail.cf.
Isto pode ser feito através do comando diff, como no exemplo abaixo:
# pwd
/../sendmail-8.8.8/cf/cf
# diff /etc/sendmail.cf ./sendmail.cf
63c96
< Cwhalley.na-cp.rnp.br
---
> Cwlocalhost
..
.
-
Masquerading
A macro M define o domínio que será colocado como origem em todos os e-mails que forem enviados pelo servidor.
Seria interessante, em domínios onde o recebimento de mensagens é centralizado, que essa macro fosse utilizada. Sua sintaxe é bem simples, bastando acrescentar o seu domínio à definição da macro, como no exemplo abaixo:DMna-cp.rnp.br
# (sem espaço entre o nome da macro e seu valor)Esta definição impedirá que o nome da máquina apareça no endereço de origem das mensagens, e fará com que somente o domínio seja colocado no mesmo.
O administrador tem, ainda, a opção de evitar o masquerading, no caso de alguns usuários, através da classe E. Isto pode ser interessante quando se trata de usuários como root. Esta operação pode ser feita adicionando-se usuários a esta classe, como abaixo:
CE root daemon postmaster
-
Privacy Options
A configuração default do sendmail permite que comandos como expn e vrfy sejam executados. Estes comandos costumam ser bastante úteis, mas, em compensação, também permitem que pessoas não autorizadas obtenham acesso a nomes dos usuários, programas executados pelo sendmail por meio de aliases, etc. Existe a opção de se bloquear esses comandos de duas formas, descritas a seguir:
- Antes da geração do sendmail.cf:
Edite o arquivo ".mc" a ser utilizado, acrescentando a seguinte linha após a diretiva DOMAIN:
define(`confPRIVACY_FLAGS', `goaway,restrictmailq,restrictqrun')
- No próprio sendmail.cf:
Na opção PrivacyOptions, coloque o seguinte o valor:
O PrivacyOptions=goaway,restrictmailq,restrictqrun
O resultado é o mesmo nas duas formas, a diferença é a forma de se alterar a configuração.
A intenção deste exemplo foi também mostrar que qualquer opção do sendmail.cf pode ser previamente configurada antes de sua geração, através de diretivas ao m4. Outras opções que podem ser configuradas através do m4 podem ser encontradas no arquivo "sendmail-8.8.8/cf/m4/cfhead.m4".
Uma observação quanto às opções utilizadas acima: "goaway" já é suficiente para bloquear os comandos expn e vrfy. As opções restrictmailq e restrictqrun são utilizadas para permitir que somente usuários autorizados vejam a queue, ou processem-na, respectivamente.
- Antes da geração do sendmail.cf:
Execução
A execução do sendmail é bastante simples, sendo necessário apenas uma linha de comando com poucos argumentos. Para o boot da máquina, um pequeno script colocado em /etc/rc (BSD), ou em /etc/rc2.d (System V *) cuida da inicialização do serviço, como veremos no exemplo a seguir. A linha destacada é a responsável pela inicialização do serviço, e pode ser executada em uma linha de comando como root.
if [ -f /usr/sbin/sendmail -a -f /etc/sendmail.cf]; then
(cd /var/spool/mqueue; rm -f [lnx]f*)
/usr/sbin/sendmail -bd -q30 &
echo -n 'sendmail' > /dev/console
* No caso do System V, todos os scripts a serem executados durante o boot devem, obrigatoriamente, ser iniciados pela letra "S".
Um cuidado especial deve ser dado aos PATHs pois, dependendo do sistema operacional, eles podem ser alterados. Como exemplo, podemos citar que, no Solaris, o PATH /usr/sbin/sendmail deveria ser alterado para /usr/lib/sendmail.
O sendmail também pode ser utilizado para o envio de mensagens, como um mailer comum do UNIX. Isto demonstra a versatilidade do software, que pode ter muitas de suas funções alteradas em sua chamada na linha de comando:
| -b: | Modo de operação | |||||||||||||||
|
||||||||||||||||
| -v: | Verbose | |||||||||||||||
| -d: | Mode de debug | |||||||||||||||
| -I: | O mesmo que -bi | |||||||||||||||
| -C: | Indica PATH para arquivo de configuração | |||||||||||||||
| -n: | Desabilita o uso de aliases | |||||||||||||||
| -o: | Ativa uma Option da configuração. Ex.: -oQ/tmp utilizará o diretório "/tmp" como o diretório da fila de mensagens | |||||||||||||||
| -q: | Processa a fila de mensagens. Ex.: -q30m processa a fila de 30 em 30 minutos |
Cuidados com a segurança
O sendmail pode ser uma porta aberta a invasões no caso de uma configuração inadequada. Por ser um processo que é executado com SUID root, trata-se de um alvo primário para ataques que podem render ao invasor um acesso privilegiado ao sistema.
Os maiores problemas, e aqueles que abrem espaço a outros, são relacionados às permissões. Várias das formas de um usuário local conseguir acesso privilegiado ao sistema são através de alterações no sendmail.cf ou outros arquivos de configuração do sendmail. Estes arquivos de configuração devem ter permissões 0644, inclusive arquivos "~/.forward" de usuários e os bancos de dados de aliases (aliases.pag, aliases.dir ou aliases.db). As exceções a essa regra são:
- Diretórios e arquivos apontados pelos comandos "F" do sendmail.cf
Esses diretórios devem ter root como dono, e permissões 0755, enquanto os arquivos apontados por "F" devem ter permissões 0444.
-
Fila de mensagens
O diretório que contém a fila de mensagens (mail queue), normalmente "/var/spool/mqueue", deve ter obrigatoriamente permissão 0700, e ter root como dono.
- Listas :include:
Os diretórios que contém arquivos de listas devem ter root como dono, e permissões 0755, enquanto os arquivos das listas devem ter 0644 como suas permissões.
- Arquivos executados pelo sendmail
Deve ser dada uma atenção especial a arquivos que sejam executados pelo sendmail. No momento em que eles são executados, eles têm as mesmas permissões do sendmail. Como exemplos, podemos citar todos os arquivos executados por meio de aliases (em alguns casos, eles são executados com permissões do usuário daemon, o que não deixa de ser motivo de preocupação), além de programas como "/usr/bin/mail", que são utilizados para distribuição de mensagens locais.
- Diretórios em geral
Atribuir as permissões corretas aos arquivos ligados ao sendmail não é suficiente, se os diretórios onde estão esses arquivos estiverem com a permissão errada. Diretórios como "/etc", "/usr", "/usr/lib", "/var" e "/var/spool", entre outros, devem sempre ter root como dono, e permissões 0755.
Deve-se tomar bastante cuidado no desenvolvimento de regras de reescritura (Rewriting Rules) que, se mal escritas, podem causar core dump (as regras não passam por nenhum tipo de teste de consistência) e devolver um rootshell ao usuário remoto.
Trouble-Shooting
A inclusão das regras anti-relay na configuração do sendmail pode acarretar em alguns problemas, principalmente em máquinas que são responsáveis por listas, ou máquinas que são regularmente utilizadas como relay. Discutiremos abaixo esses dois problemas, considerados os mais comuns.
-
Listproc
No caso de máquinas que rodam listproc, majordomo, ou outro servidor de listas, o administrador deve tomar o cuidado de incluir no arquivo /etc/mail/LocalIP o IP da máquina em questão, além do IP de loopback. Deve-se também incluir em /etc/mail/LocalNames o nome desse servidor, além também do nome "localhost". Caso essas configurações não sejam feitas, nenhuma mensagem de lista nenhuma sera enviada à subscribers fora do domínio dessa máquina.
-
Relay autorizado
No caso de máquinas que são regularmente utilizadas como relay por outras máquinas e domínios (clientes do POP, por exemplo), a providência a ser tomada é a inclusão dos IP's das máquinas clientes no arquivo /etc/mail/LocalIP, e a inclusão dos domínios desses clientes em /etc/mail/LocalNames.
Conclusão
Ao mesmo tempo em que é extremamente versátil, o sendmail pode ser uma ameaça a segurança do sistema se mal utilizado. A cada dia, descobrem-se novas formas de ataque e invasão de sistemas, o que demanda uma constante preocupação por parte dos administradores no sentido de se atualizarem.
Neste artigo, apresentamos alguns procedimentos e dicas para facilitar um pouco a montagem de um servidor de e-mail com um mínimo de segurança, mostrando métodos para combater spamming, além de como evitar que seu mailserver seja usado como relay.
Novas formas de exploração de problemas com e-mail certamente aparecerão e, para combatê-las, o administrador deverá estar ciente de novos métodos de controle e novas tecnologias.
Referências bibliográficas
Sendmail
by Bryan Costales with Eric Allman and Neil Rickert
1993, O'Really & Associates, Inc.
Sites relacionados
Nettools
Sendmail Home Page
Claus Aßmann's check_* routines
NewsGeneration, um serviço oferecido pela RNP – Rede Nacional de Ensino e Pesquisa
Copyright © RNP, 1997 – 2004
