95
Instalação e Configuração de Servidores FreeBSD Instalação e Configuração do Sistema Operacional Instalação do Sistema Operacional Configurações Iniciais Configurações Básicas de Rede Configurações Básicas de Segurança Tarefas Administrativas Atualização do Sistema Tarefas com Usuários e Grupos Recompilação e Instalação do Kernel Manutenção de Data/Hora Rotação de Arquivos de Log Inicialização e Finalização de Daemons Download, Descompactação e Extração de Arquivos Instalação e Configuração de Serviços Serviço de Acesso Remoto SSH (Secure Shell) - OpenSSH Gerenciamento via Web - Webmin Serviços de Correio Eletrônico MTA (Mail Transfer Agent) - Postfix POP3 (Post Office Protocol version 3) - Qpopper Webmail - OpenWebmail Proteção contra Vírus - AMaViS + ClamAV Gerenciador de Listas - Mailman Serviços Web Servidor Web - Apache HTTP Server Estatísticas de Uso do Servidor Web - Webalizer Serviços de Autenticação e Compartilhamento de Arquivos FTP (File Transfer Protocol) - ProFTPD Estatísticas de Uso do Servidor FTP - Webalizer Compartilhamento de Arquivos para clientes Unix - NFS (Network File System) Autenticação para clientes Unix - NIS (Network Information Services) Autenticação e Compartilhamento de Arquivos para clientes Windows - Samba Controle de Uso de Disco - Quota Antivírus - ClamAV Backup - rsync Autenticação RADIUS - FreeRADIUS Serviço de Rede, Controle e Segurança DNS - ISC BIND9 DHCP (Dynamic Host Configuration Protocol) - ISC DHCP Server Firewall - IPFW2 Controle de Tráfego - IPFW2 + Dummynet NAT (Network Address Translation) - IPFW2 + NATD Proxy e Cache HTTP - Squid Relatório de Uso do Squid - Sarg (Squid Analysis Report Generator) Gráfico de Consumo de Banda - MRTG (Multi Router Traffic Grapher) Artigos Diversos Adição de Espaço de Swap em Arquivo

Servidores FreeBSD

Embed Size (px)

Citation preview

Page 1: Servidores FreeBSD

Instalação e Configuração de Servidores FreeBSD Instalação e Configuração do Sistema Operacional

Instalação do Sistema OperacionalConfigurações IniciaisConfigurações Básicas de RedeConfigurações Básicas de Segurança

Tarefas Administrativas

Atualização do SistemaTarefas com Usuários e GruposRecompilação e Instalação do KernelManutenção de Data/HoraRotação de Arquivos de LogInicialização e Finalização de DaemonsDownload, Descompactação e Extração de Arquivos

Instalação e Configuração de Serviços

Serviço de Acesso Remoto

SSH (Secure Shell) - OpenSSHGerenciamento via Web - Webmin

Serviços de Correio Eletrônico

MTA (Mail Transfer Agent) - PostfixPOP3 (Post Office Protocol version 3) - QpopperWebmail - OpenWebmailProteção contra Vírus - AMaViS + ClamAVGerenciador de Listas - Mailman

Serviços Web

Servidor Web - Apache HTTP ServerEstatísticas de Uso do Servidor Web - Webalizer

Serviços de Autenticação e Compartilhamento de Arquivos

FTP (File Transfer Protocol) - ProFTPDEstatísticas de Uso do Servidor FTP - WebalizerCompartilhamento de Arquivos para clientes Unix - NFS (Network File System)Autenticação para clientes Unix - NIS (Network Information Services)Autenticação e Compartilhamento de Arquivos para clientes Windows - SambaControle de Uso de Disco - QuotaAntivírus - ClamAVBackup - rsyncAutenticação RADIUS - FreeRADIUS

Serviço de Rede, Controle e Segurança

DNS - ISC BIND9DHCP (Dynamic Host Configuration Protocol) - ISC DHCP ServerFirewall - IPFW2Controle de Tráfego - IPFW2 + DummynetNAT (Network Address Translation) - IPFW2 + NATDProxy e Cache HTTP - SquidRelatório de Uso do Squid - Sarg (Squid Analysis Report Generator)Gráfico de Consumo de Banda - MRTG (Multi Router Traffic Grapher)

Artigos Diversos

Adição de Espaço de Swap em Arquivo

Page 2: Servidores FreeBSD

IntroduçãoO presente material tem por objetivo estabelecer um conhecimento básico para a instalação e configuração de um

servidor de rede com o sistema operacional FreeBSD, da forma mais prática e simples possível, mas mantendo determinado nível de robustez e segurança. Visa também estender o conhecimento sobre a plataforma Unix em geral, de forma a propiciar o desenvolvimento de uma cultura de aprendizado e de busca de soluções. Outro ponto-chave é a

construção de uma estrutura de serviços de rede sem custos de software, utilizando apenas software livre.

Pretendo atualizar e complementar este material com o tempo. Quaisquer dúvidas, sugestões, correções ou críticas favor entrar em contato pelo endereço [email protected].

1 - Instalação e Configuração do Sistema Operacional

1.1 - Instalação do Sistema Operacional

A maneira mais fácil de fazer a instalação do FreeBSD é a partir do CD 1. Utilizaremos como exemplo o FreeBSD 4.9, que é a versão estável atual. Primeiramente, deve-se baixar a imagem (.ISO) do CD, a partir do site oficial do FreeBSD e/ou dos mirrors. A lista dos mirrors disponíveis pode ser encontrada em http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mirrors-ftp.html.

Para efetuar o download da imagem a partir de outra máquina com FreeBSD ou Linux, utilize o próprio cliente ftp ou um programa como o Wget. Se for utilizada uma máquina com Windows para fazer o download, é recomendado que se utilize um gerenciador de download do tipo Getright. Após o download é necessário verificar o MD5 Checksum da imagem, para saber se a mesma está perfeita. Isso é feito obtendo-se a seqüência MD5 a partir do arquivo CHECKSUM.MD5 que se encontra no mesmo diretório das imagens, no servidor FTP. Esta seqüência deverá ser comparada àquela obtida através da utilização do programa md5sum.exe contra a imagem recém-baixada. Exemplo:

Arquivo CHECKSUM.MD5:

MD5 (4.9-i386-disc1.iso) = 9195be15a4c8c54a6a6a23272ddacaaeMD5 (4.9-i386-disc2.iso) = 51d28c35308cc916b9a9bfcacb3146b8MD5 (4.9-i386-mini.iso) = 2635f02aebce8e1c2b83d1acdbbcb2ea

Verificação do MD5:

C:\>md5sum 4.9-i386-disc1.iso9195be15a4c8c54a6a6a23272ddacaae *4.9-i386-disc1.iso

Isso significa que a imagem foi obtida com sucesso, visto que a seqüência MD5 é igual. No FreeBSD ou Linux pode-se utilizar o programa "md5".

Essa imagem pode agora ser gravada em um CD, que será utilizado para a instalação.

Inicializamos a máquina através do CD (boot pelo CD) e seguimos com a instalação normalmente. Na primeira questão, sobre a configuração do kernel, selecionar a primeira opção (Skip), já que podemos configurar o kernel posteriormente. Após isso selecionar a opção Standard.

Como pretendemos instalar um servidor, será ocupado todo o disco com o FreeBSD, então no FDISK, apagar qualquer partição que houver, pressionar A (Use Entire Disk) e então Q (Finish).

Na seleção de Boot Manager selecionar a segunda opção, para que não seja instalado o gerenciador de boot, visto que esta máquina terá apenas um sistema operacional.

Após isso, chegamos ao Disklabel Editor, uma das partes mais importantes da instalação. É aí que definimos qual será o layout dos filesystems que teremos. Algumas considerações sobre os filesystems mais comuns:

/ -> é aí que fica o diretório home do root e qualquer outro arquivo ou diretório que não estiver em nenhum outro filesystem./var -> geralmente ficam no /var arquivos de log (que em determinados casos ocuparão muito espaço), caixas postais de servidores de e-mail (geralmente a inbox, o que também irá ocupar muito espaço caso a máquina seja servidor de e-mail)./tmp -> arquivos temporários/usr -> geralmente guarda quase todos os programas da máquina, fontes, bibliotecas, etc.swap -> destinada à swap, deve ser dimensionada de acordo com a memória RAM.

É natural que se crie outros filesystems, de acordo com as necessidades de cada servidor. Por exemplo, um servidor proxy Squid poderá ter criado o filesystem /squid, com o tamanho adequado ao cache que se deseja ter. Um servidor de arquivos pode ter um /home, onde ficarão os diretórios home dos usuários.Um servidor de e-mail deverá ter bem dimensionada a partição /var, para as caixas de entrada das contas de e-mail. Por

Page 3: Servidores FreeBSD

exemplo, no caso de 500 contas, com um limite de 5 MB para cada inbox, teremos 2500 MB. Somando-se espaço extra para os arquivos de log e demais, devemos criar uma partição com no mínimo 3500 MB.A partição swap é geralmente criada com o dobro do tamanho da memória RAM. Tendo 256 MB de RAM, criamos a swap com 512 MB, e assim por diante. Em máquinas com mais de 1 GB de RAM não convém criar tanta swap, que deve ser então melhor calculada. Se tivermos mais de um disco, é interessante dividir a swap entre estes discos, devido a melhoria na performance.

A ordem de criação dos filesystems tradicionalmente segue a ordem em que são criados pela opção Auto Defaults, que pode ser testada pressionando A.

Por exemplo, para uma máquina com disco de 20GB, que será o nosso servidor de testes, iremos criar os seguintes filesystems:

/ -> 256 MBswap -> 512 MB/squid -> 2048 MB/home -> 4096 MB/var -> 2048 MB/tmp -> 512 MB/usr -> resto (9620 MB)

Quando estivermos satisfeitos com o layout pressionamos Q (Finish) para prosseguir com a instalação.

A próxima etapa é selecionar qual "distribuição" instalar, ou seja, qual perfil de instalação queremos. Tendo em mente que pretendemos montar um servidor, selecionamos a opção Developer, para que sejam instalados os códigos-fonte, os binários e documentações, mas sem jogos e sem X Window System. Após isso, na próxima tela, selecionamos Yes, para instalar a coleção de ports. Voltamos automaticamente à tela anterior, então pressionamos Enter sobre a opção Exit.

Como estamos instalando a partir do CD, na tela Choose Installation Media selecionamos a primeira opção. Após confirmar a instalação, em Yes, o sistema começa a ser instalado.

Após a mensagem de "Congratulations!", há o questionamento sobre configurar algum dispositivo Ethernet agora. Selecionar Yes. Como temos atualmente apenas uma placa de rede, selecionamos o dispositivo relativo à placa de rede, geralmente o primeiro da lista. Sobre a configuração IPv6, selecione No. DHCP também No.

Host: insira o nome (hostname) da máquinaDomain: domínio DNSIPv4 Gateway: endereço IP do gateway ou roteadorName server: servidor DNSIPv4 Address: endereço IP da máquinaNetmask: máscara da rede

Após isso, o sistema nos pede se queremos "levantar" a interface de rede agora. Selecione Yes.Network Gateway, selecione No.Configure inetd, No.Anonymous FTP, No.NFS Server, No.NFS Client, No.Security Profile, No.Ok.Customize System Console Settings, Yes.

Keymap: no caso de teclado ABNT2, selecione Brazil CP850.Saver: selecione o seu preferido.Após terminado, selecione Exit.

Configure machine time zone, Yes.UTC Clock, No.America, Brazil, S & SE Brazil.BRST, Yes.

Linux binary compatibility, selecione Yes, isso irá possibilitar que aplicativos do Linux rodem sem problemas no FreeBSD. Será instalado o respectivo pacote.

Sobre configurar mouse ou não, tanto faz, não será utilizado mesmo.

FreeBSD package collection, selecione Yes, para instalar já agora um pacote: o shell Bash. Vá até shells e selecione o bash, dê Ok e então Install e Ok novamente.

O sistema nos pede se queremos adicionar alguma conta de usuário, selecione No, não precisamos disto agora.

Page 4: Servidores FreeBSD

Na próxima tela Ok, e então defina a senha do root.

Visitar novamente o menu, No.

De volta à tela incial do sysinstall, selecione Exit Install e então Yes. Remova o CD do drive.

O sistema irá reiniciar. Estamos prontos com a instalação do FreeBSD.

1.2 - Configurações Iniciais

Acesse o console, através do usuário e senha do root e digite o seguinte comando:

# uname -a

A saída do comando indicará exatamente qual a versão do sistema e qual o kernel está utilizando. Podemos ver a indicação do kernel GENERIC, que é o "padrão de fábrica", e a versão 4.9-RELEASE.

Através do comando

# df -h

podemos ver, de maneira simplificada, o espaço utilizado em cada filesystem que foi criado na instalação.

Se desejar, mude o shell padrão do usuário root de csh para bash. Para isso, digite:

# vipw

Edite, no final da linha do root, o caminho /bin/csh troque por /usr/local/bin/bash. Dessa forma, no próximo login abriremos com o shell bash. Pode-se utilizar também o comando "chsh -s /usr/local/bin/bash" para trocar o shell para o Bash.

Como não instalamos o ambiente gráfico, X, devemos fazer alguns ajustes nas variáveis PATH e MANPATH. Edite o arquivo /root/.profile e na linha iniciada por PATH, remova a seguinte string: ":/usr/X11R6/bin". Edite também o arquivo /etc/manpath.config e comente as seguintes linhas:

OPTIONAL_MANPATH /usr/X11R6/man

e

MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man

Crie o arquivo /root/.bash_logout, com o seguinte conteúdo:

clear

Isso fará com que a tela seja limpa cada vez que o root efetuar logout.

É importante ter em mente a utilidade do comando man, que exibe as "manual pages", ou seja, os manuais de todos os comandos. Em caso de dúvidas quanto a algum comando, devemos inicialmente tentar encontrar a resposta no seu manual, digitando por exemplo

man uname

Isso irá exibir o manual do comando "uname". Em caso de dúvidas sobre as próprias "man pages", digite "man man", será exibido o manual do comando "man".

1.3 - Configurações Básicas de Rede

* Interfaces de Rede

Podemos ver a configuração atual de rede através do comando ifconfig. O ifconfig mostra outras interfaces além da placa de rede, como ppp0, etc, que poderão ser desabilitadas posteriormente, na configuração do kernel.Para efetuar a configuração de qualquer placa de rede, por exemplo quando se instala uma nova, veja primeiramente se o FreeBSD a reconheceu, através do comando:

# dmesg

Verifique se consta a descrição da placa de rede nesta relação, e caso positivo, qual a identificação dela no sistema (no começo da linha, por exemplo xl0).

Com esta identificação podemos configurar a interface. Edite o arquivo /etc/rc.conf e insira a seguinte linha:

ifconfig_xl0="inet 192.168.0.1 netmask 255.255.0.0"

Page 5: Servidores FreeBSD

Dessa forma, no momento da inicialização será atribuído o endereço IP 192.168.0.1 e a máscara de rede 255.255.0.0 a esta interface. Esta atribuição também pode ser feita via linha de comando:

# ifconfig xl0 192.168.0.1 netmask 255.255.0.0

* Host Database

Edite o arquivo /etc/hosts e veja a seguinte linha:

127.0.0.1 localhost localhost.my.domain

Altere "my.domain" para o seu domínio DNS, por exemplo:

127.0.0.1 localhost localhost.exemplo.org

Adicione ainda uma linha no seguinte formato:

endereço_IP hostname FQDN

FQDN significa Fully Qualified Domain Name, é o nome completo da máquina (seu hostname mais o domínio DNS). Exemplo:

192.168.0.1 servteste servteste.exemplo.org

* Resolução DNS

O arquivo /etc/resolv.conf guarda a configuração do "resolver", que é um conjunto de rotinas utilizadas para consultas DNS. Edite o arquivo e insira uma ou mais linhas especificando o(s) servidor(es) DNS que serão utilizados pela máquina:

nameserver servidor_DNS

Por exemplo:

nameserver 192.168.0.5nameserver 192.168.0.6

Podem ser inseridos mais de uma linha, e isso inclusive é recomendado na montagem de um servidor. Os servidores DNS serão procurados na ordem em que estão no arquivo.

1.4 - Configurações Básicas de Segurança

Tendo em mente manter um certo nível de segurança em nosso sistema, mas sem prejudicar a funcionalidade, podemos fazer alguns pequenos ajustes que auxiliam em muito a evitar problemas.

* Usuário toor

O usuário toor vem por padrão na instalação do FreeBSD como uma conta alternativa ao root mas com os mesmos poderes, pois possui UID 0. Seu principal objetivo é ser usado com um interpretador de comandos fora do padrão, que seja instalado em um filesystem diferente do raiz - caso do bash, que fica em /usr/local/bin/bash. Então pode-se usar o toor com este shell e manter o root com um shell padrão, como por exemplo /bin/sh. No caso de algum problema, em que não puder ser montado o filesystem /usr, ficaríamos sem shell, e conseqüentemente sem acesso ao sistema. Contudo, ao entrar em modo single, o sistema nos pede o caminho completo de algum shell.Se houver interesse em manter essa conta toor como um "backup" ao root, deve-se alterar a sua senha através do comando passwd. Caso não houver interesse, ou houver alguma chance de essa conta cair no esquecimento, é recomendado que seja removida, visto o perigo que representa caso for utilizada indevidamente.

* Senha no console

Quanto estamos incializando o FreeBSD, podemos pressionar qualquer tecla (diferente de enter) durante a contagem regressiva para que esta seja parada. Se entrarmos o parâmetro "boot -s" e dermos enter, o sistema será inicializado em modo single (monousuário), da mesma forma que quando digitamos no shell o comando "shutdown now", mas com a diferença que no primeiro modo não será montado automaticamente nenhum filesystem além do raiz.Por padrão, quando entramos no modo single o sistema não nos pede uma senha, e fornece acesso a nível de root, ou seja, a tudo. Isto pode representar um grande risco caso alguém mal intencionado consiga acesso físico ao servidor, então poderá entrar no modo single e até mesmo alterar a senha do root. Para evitar isto, podemos instruir o sistema para que peça senha (do root) mesmo no modo single. No arquivo /etc/ttys, altere a linha

console none unknown off secure

para

console none unknown off insecure

Page 6: Servidores FreeBSD

* Filesystems

É importante atribuir flags que proibem determinados filesystems de possuir arquivos SUID, quando não forem necessários. Os arquivos SUID (setuid e setgid) são determinados por um bit que indica que devem ser executados como se estivessem sendo executados pelo dono.Para uma boa configuração, sem exageros, pode ser utilizado o exemplo abaixo, editando o arquivo /etc/fstab e alterando as linhas

/dev/ad0s1b none swap sw 0 0/dev/ad0s1a / ufs rw 1 1/dev/ad0s1f /home ufs rw 2 2/dev/ad0s1e /squid ufs rw 2 2/dev/ad0s1h /tmp ufs rw 2 2/dev/ad0s1d /usr ufs rw 2 2/dev/ad0s1g /var ufs rw 2 2/dev/acd0c /cdrom cd9660 ro,noauto 0 0proc /proc procfs rw 0 0

para

/dev/ad0s1b none swap sw 0 0/dev/ad0s1a / ufs rw 1 1/dev/ad0s1f /home ufs rw,nosuid 2 2/dev/ad0s1e /squid ufs rw,nosuid 2 2/dev/ad0s1h /tmp ufs rw,nosuid 2 2/dev/ad0s1d /usr ufs rw 2 2/dev/ad0s1g /var ufs rw,nosuid 2 2/dev/acd0c /cdrom cd9660 ro,noauto 0 0proc /proc procfs rw 0 0

Note que os devices (/dev/ad0s1a, etc) podem ser outros no seu sistema, assim como os filesystems, caso em que deve-se adaptar o exemplo a cada situação. Não deve ser usada a flag nosuid nos filesystem raiz e /usr. As alterações terão efeito após a reinicialização do sistema.

* Diretório Temporário

Para que o diretório /tmp seja limpado a cada vez que a máquina for reiniciada, insira a seguinte linha no arquivo /etc/rc.conf:

clear_tmp_enable="YES"

* Syslogd

O syslogd é o daemon responsável pela maioria dos logs do sistema, e pode também enviar ou receber logs de outras máquinas via rede. Para isso, ele ouve a porta UDP 514. Como não vamos utilizar tal função, podemos instruí-lo para trabalhar apenas localmente, sem abrir a porta mencionada. Para isso, edite o arquivo /etc/rc.conf e insira a seguinte linha:

syslogd_flags="-ss"

Após isso, reinicie a máquina.

* Portmap

O portmap é utilizado para RPC - Remote Procedure Call. Se não for necessário usar RPC devemos desabilitá-lo, inserindo a seguinte linha no arquivo /etc/rc.conf:

portmap_enable="NO"

Caso for usar NFS (Network File System) ou algo que utilize RPC devemos habilitar o portmap novamente, alterando o NO para YES.

* Inetd

O inetd é o chamado "Internet super-server". Funciona ouvindo determinados sockets e quando recebe uma conexão analisa qual programa corresponde àquele socket, invocando então tal programa para servir o pedido. Isto permite que rodando apenas um daemon (o inetd) pode-se invocar vários outros, sob demanda, reduzindo em certos casos a carga do sistema.Devemos prestar muita atenção ao arquivo de configuração do Inetd, que fica em /etc/inetd.conf, e ver se está habilitado apenas o que realmente iremos usar. Verifique se as linhas descomentadas (não iniciadas por #) indicam serviços que estão sendo realmente utilizados, e caso contrário, comente-as. Isto irá garantir que não sejam abertas portas desnecessárias e por vezes perigosas, como telnet e rlogin.

Page 7: Servidores FreeBSD

Caso o Inetd não seja usado para nada, deve ser desativado, inserindo a seguinte linha no arquivo /etc/rc.conf:

inetd_enable="NO"

* Crontab

O Cron é o daemon responsável por executar comandos agendados, e os arquivos que contém as tabelas que instruem o Cron são os crontabs. Os crontabs em geral ficam no diretório /var/cron/tabs, mas há um arquivo que agenda os comandos do root, e fica em /etc/crontab. Deve-se evitar que usuários leiam este arquivo, desta forma aplicamos a permissão 640 ao mesmo:

# chmod 640 /etc/crontab

* Diretório /root

O diretório home do root vem por padrão com a permissão 755, o que permite que outros usuários vejam e executem o seu conteúdo. É interessante alterar essa permissão para 700:

# chmod 700 /root

* Processos

Por padrão, o FreeBSD permite que qualquer usuário veja todos os processos em execução, inclusive os de outros usuários. Para que isto não ocorra, insira a seguinte linha no arquivo /etc/sysctl.conf:

kern.ps_showallprocs=0

Para efeito imediato, execute a linha de comando abaixo:

# sysctl kern.ps_showallprocs=0

* Conexões em portas fechadas

Caso seja de interesse identificar tentativas de conexões a portas que não estão habilitadas, podemos fazer com que o sistema gere um log disso. Serão identificados dessa forma scanners de portas e softwares ou usuários mal intencionados. Basta adicionar as seguintes linhas ao arquivo /etc/sysctl.conf:

net.inet.tcp.log_in_vain=1net.inet.udp.log_in_vain=1

As tentativas de conexões serão logadas no arquivo /var/log/messages. Note que isto pode abrir precedente para um ataque DoS, se alguém tentar abrir um número muito grande de conexões a muitas portas simultaneamente, o sistema poderá ficar sobrecarregado fazendo esse log.

* Securelevel

O Securelevel é o nível de segurança do kernel, e varia de -1 (menos seguro) a 3 (mais seguro). É recomendável manter o nível em no mínimo 1. Quanto menor o nível mais inseguro, mas devemos manter um equilíbrio entre segurança e funcionalidade. Uma explicação detalhada de todos nos níveis é encontrada no manual do Init, através do comando "man init". Verifique qual é o nível atual através do seguinte comando:

# sysctl -a | grep securelevel

Para alterar o nível padrão para 1, insira as seguintes linhas no arquivo /etc/rc.conf:

kern_securelevel_enable="YES"kern_securelevel=1

* Opções do kernel

Há opções simples que podemos colocar na configuração do kernel para reforçar em alguns aspectos a segurança da nossa máquina. Adicione a seguinte linha na configuração do kernel:

options SC_DISABLE_REBOOT

Isto fará com que a máquina não reinicie ao ser pressionado Ctrl+Alt+Del. Após modificada a configuração do kernel, o mesmo deve ser compilado e reinstalado.

* Atualização do sistema

Provavelmente uma das partes mais importantes para garantir a segurança do sistema seja mantê-lo atualizado. Deve-se manter tanto o sistema operacional quanto os programas que forem instalados.

* Manutenção de Data/Hora

Page 8: Servidores FreeBSD

É importante manter a hora certa, para que no evento de uma auditoria ou inspeção dos logs e do sistema, em caso de problemas ou ataques, possamos confiar nos horários ou timestamps dos logs.

2 - Tarefas Administrativas

2.1 - Atualização do Sistema Operacional

Uma das formas mais práticas de atualizar o sistema é utilizar-se do CVSup, que é na verdade um pacote de software utilizado para distribuir e atualizar coleções de arquivos através da rede, de forma muito rápida. Através do CVSup, baixamos e atualizamos todos os fontes do sistema. Após isso, devem ser compilados e instalados, assim como o kernel. Após um reboot o sistema estará atualizado.

Para instalar o CVSup através do ports, vá até /usr/ports/net/cvsup-without-gui e digite

# make install

O pacote do CVSup será baixado e instalado no seu sistema, assim como alguns outros pacotes dos quais ele depende. Após isso, precisamos configurar o CVSup, para que saiba como e o que deve ser baixado para a atualização do FreeBSD.

Copie o arquivo /usr/share/examples/cvsup/stable-supfile para /etc/supfile. Agora edite este arquivo (/etc/supfile) e faça as seguintes modificações:

Mudar a linha

*default host=CHANGE_THIS.FreeBSD.org

para

*default host=cvsup2.FreeBSD.org

Adicionar a linha

ports-all tag=.

no final do arquivo. Atenção ao ponto no final da linha.

Caso queira usar outro mirror, não há problema algum, confira os disponíveis em http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvsup.html. Leia com atenção os comentários do arquivo supfile, para entender os parâmetros. O arquivo que criamos irá baixar os fontes do último estável da série 4 (4-STABLE).

Agora basta executar o CVSup, fazemos isso através do seguinte comando:

# cvsup -g -L 2 /etc/supfile

Se for necessário deixar o comando rodando em background e/ou executar logoff da sua sessão, execute a seguinte linha:

# nohup cvsup -g -L 2 /etc/supfile &

Dessa forma, pode ser executado logoff da sessão e o processo irá continuar rodando. Confira o arquivo nohup.out para saber a situação do CVSup. Quando tiver terminado com sucesso, será indicado pela última linha, que apresenta a seguinte mensagem:

Finished successfully

Após finalizado o CVSup, vamos para a compilação dos fontes baixados. Esse processo pode ser feito com a máquina em produção. Vá até o diretório /usr/src e execute o seguinte comando:

# make buildworld

Se preferir executar através do nohup, pelos motivos indicados anteriormente, deve ser feito da seguinte forma:

# nohup make buildworld > /root/buildworld.log 2> /root/buildworld.err &

Essa linha irá fazer o make buildworld rodar através do nohup, mas jogando a saída padrão para o arquivo /root/buildworld.log e a saída de erro para o arquivo /root/buildworld.err. Confira estes arquivos para saber a situação do procedimento.

Em seguida deve-se compilar o kernel. Caso o mesmo ainda não tenha sido personalizado, está sendo utilizado o padrão (generic), então fazemos esta compilação através da seguinte linha de comando:

# make buildkernel KERNCONF=GENERIC

Caso o kernel tenha outro nome (personalizado) deverá ser especificado no lugar de GENERIC. Esta compilação (como

Page 9: Servidores FreeBSD

qualquer outro comando) também pode ser feita através do nohup, na mesma sintaxe mostrada anteriormente, apenas mudando os arquivos destino das saídas padrão e de erro.

Após o término da compilação, devemos instalar todos os arquivos nos seus devidos lugares. Primeiramente, caso o seu sistema esteja rodando em um securelevel maior que 0, edite o arquivo /etc/rc.conf e altere a configuração para

kern_securelevel=-1

Reinicie então a máquina, que estará rodando agora com o securelevel no nível "-1". O próximo passo é entrar no modo single, ou seja, monousuário, sem ninguém mais usando a máquina. Isso irá tirar a máquina de produção, ela não irá responder requisições de serviços de rede, então deve-se escolher um horário em que a máquina não necessita "estar no ar". É importante ressaltar que devemos estar operando no console, e não via rede. Para entrar no modo single usamos o seguinte comando:

# shutdown now

Com a máquina no modo single, vamos até o diretório /usr/src e digitamos os seguintes comandos:

# make installworld

# make installkernel KERNCONF=GENERIC

Novamente, caso o kernel tenha outro nome deverá ser especificado no lugar de GENERIC. Com isso, teremos instalado o sistema atualizado. Falta apenas um passo, o "mergemaster", que serve para atualizar alguns arquivos de configuração. Deve-se ter muita atenção neste procedimento, pois pode-se acidentalmente sobrescrever arquivos importantes. É recomendável que se faça um backup de todo o diretório /etc previamente. Uma forma bem simples de se obter isso é através da seguinte linha de comando:

# cp -Rpv /etc /etc.bak

Será feita uma cópia do /etc em /etc.bak. O parâmetro "-R" indica recursividade, ou seja copiar todos os diretórios. O "p", ou "-p", indica que quer-se manter as permissões e propriedade do arquivo. O "v", ou "-v", indica verbose, que irá mostrar na tela os nomes dos arquivos na medida em que vão sendo copiados.

Após isso, vamos ao mergemaster, para isso execute, a partir do diretório /usr/src, o comando

# mergemaster

O programa copiar os arquivos novos (atualizados) em uma pasta temporária, em /usr/src/etc. Então irá exibir as diferenças (diff) entre cada arquivo que pretende atualizar e o respectivo arquivo antigo, e pedirá o que deve ser feito. As opções são:

d -> Deletar o temporário (deixar como está)i -> Instalar o temporário (atualizar)m -> Fazer um "merge", ou seja, uma união dos dois arquivos (antigo e novo)v -> Visualizar novamente o "diff"

Deve-se ter atenção em cada arquivo, pois dependendo do que temos rodando no servidor irá mudar os arquivos importantes que devem ser mantidos. Por exemplo, a seqüência do mergemaster poderá será a seguinte:

/etc/defaults/rc.conf -> i/etc/defaults/make.conf -> i/etc/gnats/freefall -> i/etc/mail/freebsd.cf -> i/etc/mail/freebsd.submit.mc -> i/etc/mail/freebsd.submit.cf -> i/etc/mail/sendmail.cf -> i/etc/mail/submit.cf -> i/etc/mtree/BSD.local.dist -> i/etc/mtree/BSD.usr.dist -> i/etc/hosts -> i/etc/motd -> i/etc/rc.network -> i/etc/rc.sendmail -> i/etc/services -> i/etc/ttys -> i/etc/manpath.config -> i

Como pode ser visto, atualizamos todos os arquivos oferecidos pelo mergemaster neste momento. Não foi mexido em arquivos como /etc/master.passwd, /etc/group e outros, porque eles já estavam na última versão, ou seja, não há neste momento atualização para eles. Não será necessário nenhum comando adicional porque não atualizamos arquivos como

Page 10: Servidores FreeBSD

aliases ou similares.Feito isso, podemos voltar a configuração do securelevel para o nível anterior (caso seja utilizado) e dar um reboot. A máquina será inicializada com o sistema atualizado. Ao dar o comando "uname -a" podemos ver a versão 4.9-STABLE.

2.2 - Tarefas com Usuários e Grupos

* Comando PW

Para criar usuários e grupos utilizamos o comando "pw", cuja função básica é trabalhar nos arquivos /etc/passwd, /etc/master.passwd e /etc/group, criando, removendo, modificando ou exibindo usuários e grupos do sistema. Segue abaixo uma explanação geral de como utilizar tal comando, mas é importante lembrar que muitas opções foram omitidas devido a grande quantidade, sendo por isso importante a leitura do manual, através de "man pw".

Qualquer operação efetuada através do comando pw será registrada em um arquivo de log, localizado em /var/log/userlog.

Para trabalhar com grupos, utilizamos o comando "pw group", seguido de "add", "del", "mod", "show" ou "next". Segue uma explicação sobre essas opções:

add -> adicionar um novo grupodel -> remover um grupomod -> modificar algum dado do gruposhow -> exibir os dados de um gruponext -> mostra o próximo GID livre

O comando "pw group add" permite ainda outros parâmetros, listaremos os mais importantes:

-n "nome"-> nome do grupo (o -n pode ser omitido)-g 2000 -> GID (Group ID) do grupo

O comando "pw group mod" permite além dos já citados, o seguinte parâmetro:

-l "nome"-> novo nome do grupo, caso queiramos alterar o nome

Parâmetros do "pw group show":

-P -> saída em formato mais legível-a -> lista todos os grupos

Exemplos:

Simplesmente adicionar o grupo1:

# pw group add grupo1

Adicionar o grupo2, com gid=1500:

# pw group add -n "grupo2" -g 1500

Exibir os dados do grupo2:

# pw group show grupo2 -P

Remover o grupo1:

# pw group del grupo1

Para trabalhar no contexto de usuários, utilizamos "pw user", seguido de "add", "del", "mod", "show", "next", "lock" ou "unlock", e seguido de outros parâmetros, quando for necessário.

add -> adicionar um novo usuáriodel -> remover um usuáriomod -> modificar algum dado do usuárioshow -> exibir os dados de um usuárionext -> mostra os próximos UID e GID livreslock -> bloquear a conta do usuáriounlock -> desbloquear a conta do usuário

Os comandos "pw user add" (para adicionar um usuário) e "pw user mod" (para modificar os dados de um usuário) permitem os seguintes parâmetros (estão listados apenas os essenciais):

-n "username" -> nome (username) do usuário (o -n pode ser omitido)-c "comentário" -> comentário, que tradicionalmente contém quatro campos separados por vírgulas: nome completo, localização, fone comercial e fone residencial. Essa sintaxe não precisa ser desta forma, sendo a seu critério.

Page 11: Servidores FreeBSD

-u 1500 -> UID (User ID) do usuário-g "grupo" -> grupo ao qual o usuário irá pertencer, pode ser especificado o nome do grupo ou o GID.-d "/home/fulano" -> diretório home do usuário-m -> cria o diretório home do usuário automaticamente-s "/usr/local/bin/bash" -> define o shell do usuário

Os parâmetros do comando "pw user del" são:

-n "username"-> nome (username) do usuário (o -n pode ser omitido)-u 1500 -> UID do usuário-r -> Remove também o diretório home do usuário e o seu conteúdo

Os principais parâmetros adicionais do "pw user show" são:

-P -> saída em formato mais legível-a -> lista todos os usuários

O comando "pw user lock" funciona adicionando a string *LOCKED* na frente da senha do usuário, no arquivo master.passwd. Desta forma, o usuário não conseguirá autenticar-se e nem efetuar qualquer operação. Para desbloquear, basta usar o comando "pw user unlock", especificando o username ou o UID do usuário.

Exemplos:

Simplesmente adicionar um usuário com username fulano1:

# pw user add fulano1

Adicionar um usuário com username fulano2, comentário "Fulano 2", UID 1500, GID 2000, diretório home "/home/fulano2" e shell "/bin/sh":

# pw user add -n "fulano2" -c "Fulano 2" -u 1500 -g 2000 -d "/home/fulano2"-m -s "/bin/sh"

Modificar o shell do usuário fulano2 para "/usr/local/bin/bash":

# pw user mod fulano2 -s "/usr/local/bin/bash"

Exibir uma listagem de todos os usuários:

# pw user show -P -a

Bloquear a conta do usuário fulano2:

# pw user lock fulano2

Remover o usuário fulano1, juntamente com seu diretório home:

# pw user del fulano1 -r

Para efetuar a troca de senha de qualquer usuário, via linha de comando, deve ser utilizado o comando passwd. O usuário root pode trocar a senha de qualquer usuário, já os usuários comuns podem apenas trocar a própria senha. A sintaxe do comando é "passwd fulano".

2.3 - Recompilação e Instalação do Kernel

Existem determinadas tarefas que exigem que o kernel seja configurado com opções diferentes do padrão (GENERIC), para então ser recompilado e instalado no lugar do kernel antigo. Siga as etapas abaixo.

Verifique se existe o diretório /usr/src/sys. Caso não exista, então você não instalou os fontes do kernel, e precisará fazer isso. Basta executar /stand/sysinstall, escolher Configure, Distributions, src e então sys. Isso irá instalar os fontes.

Agora, vá para o diretório /usr/src/sys/i386/conf. É aí que fica o arquivo de configuração do kernel. Copie o GENERIC para o nome de sua preferência (geralmente o hostname da máquina).

Edite o arquivo de configuração que você acabou de copiar (não o GENERIC) e insira ou altere as opções que desejar. Podem ser removidas as referências a dispositivos de hardware que você não possui, e também interfaces ou opções que você não irá utilizar. Isto irá inclusive melhorar a performance do sistema, já que irá trabalhar com um kernel mais "leve" e sem drivers desnecessários. Para maiores informações consulte o arquivo LINT, no diretório /usr/src/sys/i386/conf.

Após isso, altere a configuração do Securelevel para -1, reinicie a máquina e então execute:

# cd /usr/src# make buildkernel KERNCONF=SEUKERNEL# make installkernel KERNCONF=SEUKERNEL

Com isso, o novo kernel será criado e copiado ao diretório raiz como /kernel, e o kernel antigo será movido para

Page 12: Servidores FreeBSD

/kernel.old. Para terminar, reinicie a máquina para carregar seu novo kernel.

Caso a sua máquina não bootar com o novo kernel, não se preocupe. Basta pressionar qualquer tecla (exceto enter) durante a contagem regressiva, na inicialização. Então digite os seguintes comandos:

unloadboot kernel.old

Isso fará com que seja inicializado o seu kernel antigo. Pode também ser entrado o comando "boot kernel.GENERIC", para incializar o kernel "padrão de fábrica".

Após tudo estar funcionando, deverá ser alterado o Securelevel para o nível desejado (caso seja utilizado) e reiniciar novamente.

Maiores informações no Handbook do FreeBSD, seção de configuração do kernel

2.4 - Manutenção de Data/Hora

É muito importante a manutenção da hora certa no sistema por diversos motivos, desde o funcionamento de alguns aplicativos até a auditoria de arquivos de log. Para a manutenção da hora devem ser observados dois pontos. O primeiro é utilizar o fuso horário correto, que deve ter sido selecionado já na instalação do sistema. Caso tenha que mudar o mesmo faça-o através do utilitário "tzsetup".O segundo ponto importante é acertar a hora em si, o que faremos através do protocolo NTP - Network Time Protocol, que utiliza a porta TCP/UDP 123. O comando utilizado é "ntpdate", seguido do nome de um servidor NTP. Por exemplo:

# ntpdate ntp.cert-rs.tche.br

Isso irá acertar a hora do sistema com uma precisão muito boa. O ideal é acertá-la periodicamente, por exemplo uma vez por dia. Isso pode ser feito através do Cron, mas iremos primeiramente criar um script para executar o comando, por motivos de organização. Crie o diretório /usr/local/script, com permissão 700, para armazenar os scripts que serão criados. Então crie o arquivo /usr/local/script/acerta_hora.sh, com a permissão 700 e o seguinte conteúdo:

-------------------- Arquivo acerta_hora.sh --------------------#!/bin/sh/usr/sbin/ntpdate ntp.cert-rs.tche.br >> /var/log/acerta_hora.log 2>&1--------------- Fim do arquivo acerta_hora.sh --------------------

A hora será acertada e as saídas padrão (stdout) e de erro (stderr) do comando serão jogadas no arquivo /var/log/acerta_hora.log, que será o arquivo de log deste script. Para maiores informações sobre o redirecionamento de saídas de comandos, há um resumo na página http://www.seekingfire.com/bitesized/redirection.html.Para rodar esse script todo dia às 2h (obviamente pode ser escolhido outro horário), edite o arquivo /etc/crontab e insira a seguinte linha:

0 2 * * * root /usr/local/script/acerta_hora.sh

O formato das entradas no arquivo /etc/crontab é o seguinte:

minuto hora dia_do_mes mês dia_da_semana quem comando

Segue abaixo uma lista de alguns servidores NTP que podem ser utilizados:

ntp.cert-rs.tche.br -> Centro de Emergência em Segurança da Rede Tchê200.20.186.75 -> Observatório Nacionalntp.cais.rnp.br -> Centro de Atendimento a Incidentes de Segurança da RNPntp.pop-rs.rnp.br -> Ponto de Presença da RNP no RSntp.nasa.gov -> NASA

2.5 - Rotação de Arquivos de Log

Para que não tenhamos arquivos de log muito grandes, geralmente se implementa alguma forma de rotacionar estes arquivos. Isto é feito normalmente através do newsyslog ou através de scripts. Iremos geralmente optar pelos scripts, devido à flexibilidade que proporciona. Segue abaixo um exemplo de script. Crie o arquivo /usr/local/script/rotate_log_programa.sh, com a permissão 700 e o seguinte conteúdo:

-------------------- Arquivo rotate_log_programa.sh --------------------#!/bin/sh

# finaliza o Programa/comando/para/finalizar/o/programa

# Define o nome para arquivamento

Page 13: Servidores FreeBSD

OLD_LOG=/caminho/para/o/arquivamento/programa.log.`date +%y%m%d-%H%M%S`

# move o arquivo para o diretorio de arquivamentomv /arquivo/de/log/programa.log `echo $OLD_LOG`

# inicializa o Programa/comando/para/inicializar/o/programa

# compacta o arquivado/usr/bin/gzip $OLD_LOG

# apaga os logs com mais de um anofind /caminho/para/o/arquivamento -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_programa.sh --------------------

Edite o arquivo /etc/crontab e adicione uma linha para executar o script na hora desejada, como por exemplo:

0 0 1 * * root /usr/local/script/rotate_log_programa.sh

Isto fará com que o script de rotação do log seja acionado à meia-noite do primeiro dia do mês, separando os logs de cada mês em arquivos diferentes. Cada arquivo guardado terá data e hora anexado ao nome. O comando find é opcional e pode ser configurado com outro período de tempo.

Pode-se também utilizar um script mais elaborado, como o que segue abaixo. O que irá determinar isso é a preferência do administrador, que tem a liberdade de criar e personalizar os scripts como desejar.

-------------------- Arquivo rotate_exemplo.sh --------------------#!/bin/sh# Script para fazer o rotate de logs.

# Comando para finalizar o servico.# Deve ser especificado entre '...'# Caso nao for necessario, deixar em branco.COMFIN=''

# Comando para inicializar o servico.# Deve ser especificado entre '...'# Caso nao for necessario, deixar em branco.COMINI=''

# Diretorio para o arquivamento dos logs antigos.DIRARQ=/diretorio/para/arquivamento

# Diretorio onde fica o arquivo de log atual.DIRLOG=/diretorio/do/log/atual

# Nome do arquivo de log.NOMELOG=nome_do_arquivo_de_log.log

# Dono do arquivo de log.USULOG=root

# Grupo do arquivo de log.GRPLOG=wheel

# Modo de permissao do arquivo de log.PERLOG=600

# Compactar o arquivado (S/N).COMPACTAR=S

# Apagar arquivos antigos (S/N).APAGA_ANTIGOS=N

# Tempo em dias que os antigos deverao ser mantidos.# Qualquer arquivo no diretorio dos antigos com idade# superior ao especificado sera apagado.TEMPO_ANTIGOS=180

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

$COMFIN > /dev/nullLOGARQ=$DIRARQ/$NOMELOG.`date +%y%m%d-%H%M%S`LOGATU=$DIRLOG/$NOMELOG

Page 14: Servidores FreeBSD

mv $LOGATU $LOGARQtouch $LOGATUchown $USULOG $LOGATUchgrp $GRPLOG $LOGATUchmod $PERLOG $LOGATU$COMINI > /dev/nullif [ $COMPACTAR = S ] ; then/usr/bin/gzip $LOGARQfiif [ $APAGA_ANTIGOS = S ] ; thenfind $DIRARQ -mtime +$TEMPO_ANTIGOS -exec rm -f {} \;fi-------------------- Fim do arquivo rotate_exemplo.sh --------------------

2.6 - Inicialização e Finalização de Daemons

Para inicializar e finalizar os daemons, nos momentos de boot e shutdown, respectivamente, o procedimento mais recomendado é colocar scripts no diretório /usr/local/etc/rc.d. Esses scripts devem possuir a extensão .sh (apenas .sh), devem ser executáveis (permissão 700) e precisam aceitar dois argumentos: start e stop.

Quem gerencia estes procedimentos no boot e no shutdown é o RC, é interessante sabermos como funciona, para isso pode ser consultado o seu manual, com o comando "man rc". Deste manual foi retirado e adaptado o exemplo de script abaixo, que deve ser copiado e customizado para cada novo serviço que for instalado. Crie um arquivo /usr/local/etc/rc.d/exemplo.sh.sample com o conteúdo abaixo, desta forma o teremos sempre disponível:

-------------------- Arquivo exemplo.sh.sample --------------------#!/bin/sh -## Script de Inicializacao e Shutdown# Nome_do_Programa

case "$1" instart)/comando/para/iniciar/o/programa && echo -n ' Nome_do_Programa';;stop)/comando/para/parar/o/programa && echo -n ' Nome_do_Programa';;*)echo "Opcao desconhecida: $1 - deve ser 'start' ou 'stop'" >&2;;esac-------------------- Fim do arquivo exemplo.sh.sample --------------------

O comando para inicializar o programa pode conter parâmetros, se necessário. Pode ser algo como

/usr/local/sbin/proftpd

ou

/usr/sbin/postfix start

O comando para terminar o programa também pode conter parâmetros, e pode ser um comando específico do daemon, um kill ou até mesmo um killall. Exemplos:

/usr/sbin/postfix stop

kill `cat /usr/local/var/proftpd.pid`

killall proftpd

Mantenha este arquivo de exemplo com a permissão 600 e a extensão .sample, desta forma ele não será executado acidentalmente e nem na inicialização ou shutdown do sistema.

A seqüência de execução dos scripts segue a ordem alfabética. Desta forma, se for necessário que algum script seja executado antes do outro, podemos colocar números na frente dos nomes, estabelecendo a ordem.

2.7 - Download, Descompactação e Extração de Arquivos

Não é objetivo deste material abranger tópicos básicos como download, descompactação e extração de arquivos, mas como é importante termos facilidade com estas tarefas para agilizar os processos de instalação de software, entre outros.

Page 15: Servidores FreeBSD

Vou abordar de forma concisa e prática os principais pontos.Para facilitar a organização, crie um diretório como por exemplo /usr/originais onde serão guardados todos os arquivos baixados, antes de qualquer descompactação. Assim, teremos sempre uma cópia do que for instalado, o que pode ser útil posteriormente. Crie também uma área para descompactar, extrair, configurar e compilar os programas, pode ser algo como /usr/instala ou então no próprio /tmp. Não esqueça de apagar o que foi colocado no /tmp, após a instalação do programa.Em caso de dúvidas ou para aprender mais sobre qualquer dos utilitários apresentados consulte a respectiva "man page", como por exemplo "man fetch".

* Download

O download de arquivos como aplicativos, códigos-fonte (sources) e outros pode ser feito de várias formas no FreeBSD. Caso o arquivo esteja em um servidor HTTP, podemos usar o programa Fetch. Se o arquivo estiver em um servidor FTP, podemos usar o cliente FTP ou também o Fetch. Qualquer deles pode ainda ser associado ao nohup, caso o download seja demorado e desejamos efetuar logoff da seção deixando o processo rodar em background. Seguem abaixo alguns exemplos:

Efetuar o download de arquivo via HTTP:

# fetch http://apache.usp.br/httpd/httpd-2.0.48.tar.gz

# nohup fetch http://apache.usp.br/httpd/httpd-2.0.48.tar.gz &O nohup irá deixar o comando rodando em background, mesmo que se efetue logoff da sessão. Deverá ser verificado posteriormente o arquivo nohup.out, que irá conter qualquer saída (stdout) do comando.

Efetuar o download de arquivo via FTP:

# fetch ftp://ftp.matrix.com.br/pub/postfix/official/postfix-2.0.16.tar.gz

# ftp ftp.matrix.com.br

# ftp -ai ftp://ftp.matrix.com.br/pub/postfix/official/postfix-2.0.16.tar.gzO parâmetro -a indica que deseja-se fazer login anônimo, e o -i indica que deseja-se uma sessão não interativa.

# nohup ftp -ai ftp://ftp.matrix.com.br/pub/postfix/official/postfix-2.0.16.tar.gz &

* Descompactação

Para efetuar a descompactação de um arquivo, devemos avaliar qual o formato de compactação do mesmo, através da extensão. Veja as mais comuns:

Extensão Compactador Descompactador

.gz gzip gunzip

.Z compress uncompress

.zip zip unzip

.bz bzip bunzip

.bz2 bzip2 bunzip2

Exemplos:

# gunzip postfix-2.0.16.tar.gz

# unzip httpd-2.0.48-win32-src.zip

# bunzip2 proftpd-1.2.9.tar.bz2

Caso algum dos utilitários não esteja presente no seu sistema, pode ser facilmente instalado através do Ports, encontram-se no diretório /usr/ports/archivers.

* Extração

Neste tópico iremos nos ater a arquivos "empacotados" com o formato Tar, que foi criado originalmente para trabalhar com arquivos em fitas magnéticas, daí o seu nome, Tape ARchiver. Para criar ou extrair arquivos com a extensão .tar é o utilizado o programa tar, que vem instalado por padrão no FreeBSD. Arquivos com a extensão .tgz são arquivos Tar que foram compactados, assim como .tar.gz, e também são chamados "tarball". Seguem abaixo alguns exemplos comuns:

Extrair arquivo .tar:

# tar xvf postfix-2.0.16.tar

Page 16: Servidores FreeBSD

Parâmetros usados neste caso:

x -> extract (extrai)v -> verbose (lista os arquivos extraídos)f -> file (indica qual o arquivo a ser processado)

O comando tar trabalha com recursividade, então neste caso será criado o diretório postfix-2.0.16 contendo os arquivos extraídos.

Descompactar e extrair arquivo .tar.gz:

# tar xvzf postfix-2.0.16.tar.gz

O parâmetro adicional usado foi o "z", que indica que o arquivo deve ser primeiramente descompactado, e após isso extraído ou "desempacotado".

Descompactar e extrair no diretório /tmp um arquivo que se encontra em /usr/originais:

# cd /tmp# tar xvzf /usr/originais/postfix-2.0.16.tar.gz

Neste caso, o tar irá ler o arquivo que se encontra em /usr/originais, mas extrairá o seu conteúdo no /tmp.

3 - Instalação e Configuração de Serviços

3.1 - Serviço de Acesso Remoto

3.1.1 - SSH (Secure Shell)

* OpenSSH

O ssh serve para acessar máquinas remotas, e é um substituto seguro para o rlogin, rsh, rcp e telnet. O sshd é o daemon do OpenSSH, e espera as conexões de clientes ssh, normalmente na porta 22. Ele "forka" um novo daemon para cada conexão. O daemon trabalha com troca de chaves, encriptação, autenticação, execução de comandos e troca de dados.

Não será preciso instalarmos o OpenSSH, já que o mesmo vem por padrão na instalação do FreeBSD. Também não será preciso criar um script de inicialização, pois pode ser inicializado a partir do arquivo /etc/rc.conf. Para que o sshd seja iniciado no momento do boot ele deverá conter a seguinte linha:

sshd_enable="YES"

Caso não possua, insira a linha e reinicie a máquina.

Não é recomendável acessar a máquina remotamente com a conta root, por precaução de segurança. Deve-se criar uma conta comum de usuário para este fim:

# pw user add fulano -c "Fulano" -d "/home/fulano" -g 0 -s "/usr/local/bin/bash"# passwd fulano

A conta foi criada com o GID 0 (grupo wheel) para que possa dar um "su" e acessar como root. Dessa forma, pode-se entrar com essa conta via SSH e então dar um

# su -

para trabalhar normalmente como root.

Adicione a seguinte linha no arquivo /etc/ssh/sshd_config:

AllowUsers fulano

Após isso, digite

# killall -HUP sshd

Desta forma reiniciamos o processo sshd, fazendo com que ele leia novamente o arquivo de configuração, que foi modificado. Com essa configuração, o usuário fulano poderá acessar a máquina remotamente, através do protocolo SSH. Um bom cliente para o Windows é o Putty. Para acessar a partir de outra máquina FreeBSD ou Linux deve ser usado o comando "ssh", no formato

# ssh [email protected]

ou então

# ssh -l fulano 192.168.0.10

Para uma configuração mais elaborada, seguem abaixo alguns parâmetros que podem ser utilizados no arquivo /etc/ssh/sshd_config:

Page 17: Servidores FreeBSD

AllowGroups grupo1 grupo2Permite que apenas os usuários que pertençam a algum dos grupos especificados efetuem o login. Deve ser usado o nome do grupo, não o GID.

AllowUsers usuario1 usuario2Permite que apenas os usuários especificados efetuem o login. Deve ser usado o username, não o UID.

Banner /etc/mensagemMostra a mensagem contida no arquivo especificado antes do usuário efetuar o login.

DenyGroups grupo3 grupo4Não permite que os usuários que pertençam a algum dos grupos especificados efetuem o login. Deve ser usado o nome do grupo, não o GID.

DenyUsers usuario3 usuario4Não permite que os usuários especificados efetuem o login. Deve ser usado o username, não o UID.

HostKey /etc/ssh/ssh_host_keyEspecifica o arquivo que contém a chave privada do host. É possível haver mais de uma chave privada. Chaves "rsa1" são usadas para a versão 1 e chaves "dsa" ou "rsa" são usadas para a versão 2 do protocolo SSH. Os arquivos que contém as chaves privadas devem ter permissão de leitura e escrita apenas para o dono (root).

IgnoreRhosts yesSe setado para yes, não le os arquivos ~/.rhosts e ~/.shosts. O padrão é yes.

KeepAlive yesSe setado para yes, envia mensagens keepalive para o cliente. Assim, caso o cliente cair isso será notado e a sessão ssh não ficará pendurada no servidor.

KerberosAuthentication yesEspecifica se a autenticação Kerberos será permitida.

KeyRegenerationInterval 3600Especifica o intervalo em segundos para a recriação da chave.

ListenAddress 192.168.0.1Endereço IP em que o daemon deve esperar as conexões, caso a máquina possuir mais de um endereço. Se não for especificado, o daemon permite a conexão por qualquer endereço da máquina.

LoginGraceTime 120Tempo para o usuário logar-se. Se após esse tempo de conexão o cliente não tiver efetuado o login, será desconectado.

LogLevel INFOEspecifica o nível de log que deve ser usado. Os valores são: QUIET, FATAL, ERROR, INFO, VERBOSE e DEBUG. O nível DEBUG viola a privacidade dos usuários e não é recomendado.

MaxStartups 10:30:60Após 10 conexões não autenticadas, recusa 30% das novas, e não permite mais que 60 conexões não autenticadas.

PermitRootLogin noPermite ou não que o root efetue login via SSH.

Port 22Especifica a porta em que o daemon deve esperar as conexões. Esse parâmetro pode ser usado mais de uma vez, caso sejam necessárias mais portas.

PrintMotd yesEspecifica se deve ser exibido o arquivo /etc/motd quando o usuário efetuar o login.

Protocol 2,1Especifica as versões do protocolo ssh que o daemon deve suportar. Deve ser "1", "2" ou "2,1".

ServerKeyBits 768Número de bits da chave do protocolo 1. O mínimo é 512, o padrão é 768.

StrictModes yesSe setado para yes, as permissões e dono dos arquivos do usuário são checados antes de aceitar o login. Isso evita por exemplo que alguém acidentalmente deixe seus arquivos com permissão de escrita para todos.

Alguns dos arquivos utilizados pelo sshd:

/etc/ssh/sshd_config - Arquivo de configuração do sshd, como visto acima. Deve ter permissão de escrita apenas para o root.

Page 18: Servidores FreeBSD

/etc/ssh/ssh_host_key, /etc/ssh/ssh_host_dsa_key, /etc/ssh/ssh_host_rsa_key - Estes três arquivos contém as partes privadas das chaves do host. O dono destes arquivos deve ser o root, e apenas o root deve ter permissão para leitura. O sshd não inicializa se estes arquivos estiverem com as permissões erradas.

/etc/ssh/ssh_host_key.pub, /etc/ssh/ssh_host_dsa_key.pub, /etc/ssh/ssh_host_rsa_key.pub - Estes três arquivos contém as partes públicas das chaves do host. Devem ter permissão de leitura para todos, mas escrita apenas para o root.

/etc/ssh/primes - Contém os grupos Diffie-Hellman usados para o "Diffie-Hellman Group Exchange".

/var/run/sshd.pid - Contém o PID do sshd.

3.1.2 - Gerenciamento via Web

* Webmin

O Webmin é uma interface Web, acessada a partir de um navegador, utilizada para administração de ambientes Unix. Possui um servidor web embutido e vários programas CGI que trabalham diretamente nos arquivos do sistema. É escrito em Perl, e sua página é www.webmin.com.

Para poder acessar o Webmin através de HTTPS (HTTP seguro, com encriptação) deverá ser instalado o módulo Net::SSLeay do Perl. Faça o download do arquivo http://search.cpan.org/CPAN/authors/id/S/SA/SAMPO/Net_SSLeay.pm-1.25.tar.gz, descompacte-o, acesse o diretório criado e execute os seguintes comandos:

# perl Makefile.PL# make# make install

Faça agora o download do source do Webmin a partir do seu site. A versão atual é 1.121, e o arquivo chama-se webmin-1.121.tar.gz. Descompacte e extraia o arquivo no /tmp, e acesse o diretório criado.

Execute o comando abaixo:

# ./setup.sh /usr/local/webmin

Responda as questões conforme abaixo:

Config file directory [/etc/webmin]: /usr/local/etc/webmin

Log file directory [/var/webmin]: /var/log/webmin

Full path to perl (default /usr/bin/perl):

Web server port (default 10000):Caso queira utilizar outra porta insira aqui.

Login name (default admin):Caso queira usar outro login para administração insira aqui.

Login password:Insira uma senha.

Password again:Insira novamente a senha.

Use SSL (y/n): y

Start Webmin at boot time (y/n): n

Após isso, o Webmin será instalado com as configurações efetuadas. Acesse-o através do endereço http://servidor:11000.

Crie um script de inicialização com os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/etc/webmin/start > /dev/null 2>&1

e

/usr/local/etc/webmin/stop > /dev/null 2>&1

3.2 - Serviços de Correio Eletrônico

3.2.1 - MTA (Mail Transfer Agent)

* Postfix

Primeiramente devemos desativar o Sendmail, MTA que vem por padrão rodando no FreeBSD. Para isso, edite o arquivo /etc/rc.conf e adicione/substitua as seguintes linhas:

Page 19: Servidores FreeBSD

sendmail_enable="NONE"sendmail_submit_enable="NO"sendmail_outbound_enable="NO"sendmail_msp_queue_enable="NO"

Após isso, reinicie a máquina ou então termine os processos do sendmail através do comando "killall sendmail".

O Postfix é um MTA criado por Wietse Venema, com o intuito de ser rápido, fácil de administrar e seguro, mantendo também a compatibilidade com o Sendmail. Sua página é www.postfix.org. Efetue o download do código fonte do Postfix, através de algum dos mirrors disponíveis na página. A verão atual é 2.0 Patchlevel 16 (2.0.16). O download pode ser feito a partir de um mirror brasileiro, ftp://ftp.matrix.com.br/pub/postfix/official/postfix-2.0.16.tar.gz.

Efetue o download e extraia o arquivo no diretório /tmp, será criado o diretório postfix-2.0.16 contendo os arquivos extraídos. Após isso, entre no diretório que foi criado.

Digite o comando "make", para compilar a distribuição.

Após compilado o Postfix, vamos instalar. Primeiramente, iremos "desativar" e também manter backup dos arquivos antigos do sendmail, através dos seguintes comandos:

# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF# mv /usr/bin/newaliases /usr/bin/newaliases.OFF# mv /usr/bin/mailq /usr/bin/mailq.OFF

Devem ser criados usuário, grupos e alias (de e-mail) para utilização do Postfix. O usuário e os grupos adicionamos com os seguintes comandos:

# pw group add postfix -g 100# pw group add postdrop -g 110# pw user add postfix -c "Postfix" -d "/nonexistent" -s "/sbin/nologin" -u 100 -g 100

O alias deve ser criado adicionando a seguinte linha ao arquivo /etc/mail/aliases:

postfix: root

Após isso, podemos proceder com a instalação. Vá até o diretório /tmp/postfix-2.0.16 e execute o comando "make install". Surgirão algumas questões, que deverão ser avaliadas e respondidas:

install_root: deixe padrão, apenas dê entertempdir: padrãoconfig_directory: padrãodaemon_directory: padrãocommand_directory: padrãoqueue_directory: padrãosendmail_path: padrãonewaliases_path: padrãomailq_path: padrãomail_owner: padrãosetgid_group: padrãomanpage_directory: padrãosample_directory: /etc/postfix/samplereadme_directory: padrão

Com isso, o Postfix está instalado. Falta agora fazer algumas configurações básicas para que possa funcionar.

Edite o arquivo /etc/postfix/main.cf e adicione os seguintes parâmetros(nos locais apropriados, para facilitar a organização do arquivo):

myorigin = servteste.exemplo.orgmydestination = servteste.exemplo.org, 192.168.0.10, localhost.exemplo.orgmynetworks = 192.168.0.0/16, 127.0.0.0/8

Substitua os hostnames e os endereços de exemplo acima para os valores apropriados ao seu servidor.

Execute o comando "postfix start", o Postfix deverá ser inicializado e ficar rodando, sem nenhum erro. Faça o seguinte teste:

# echo Teste | mail [email protected]

Agora verifique a sua caixa de entrada, digitando "mail". Deverá aparecer uma nova mensagem, recebida há pouco. Digite o nº de índice da mensagem (aparece antes do remetente) e enter para visualizá-la. O texto da mensagem deverá ser Teste. Digite q e enter para sair. Tente também enviar uma mensagem para um usuário comum, como o fulano que

Page 20: Servidores FreeBSD

foi criado anteriormente, então acesse com essa conta de usuário e verifique a caixa de entrada.Faça o teste também enviando uma mensagem para outro servidor, da forma como foi mostrada, com os comandos "echo" e "mail".

Verifique o arquivo /var/log/maillog, este é o arquivo de log do MTA. Ao nos depararmos com qualquer problema no sistema de e-mail a primeira coisa a fazer é verificar com cuidado as entradas deste arquivo.

Se tudo estiver funcionando normalmente, faça uma cópia de backup do arquivo main.cf e copie os arquivos abaixo para /etc/postfix. Estes arquivos implementam uma configuração melhor e estão comentados, ficando mais fácil adaptá-los a sua configuração. Não esqueça de alterar alguns valores como os hostnames e endereços IP para os apropriados ao seu servidor.

-------------------- Arquivo main.cf --------------------# main.cf

### PATHS

# Diretorio para a fila do Posfix.queue_directory = /var/spool/postfix

# Diretorio dos executaveis do Postfix.command_directory = /usr/sbin

# Diretorio dos daemons do Postfix.daemon_directory = /usr/libexec/postfix

### USUARIO

# Usuario sob o qual roda a maioria dos daemons. Tambem eh o dono da fila.mail_owner = postfix

### NOMES DE HOST E DOMINIO

# Hostname do servidor.myhostname = servteste.exemplo.org

# Dominio.mydomain = exemplo.org

### ENVIO

# Dominio das mensagens enviadas.myorigin = $myhostname

### RECEBIMENTO

# Interface(s) de rede que recebe(m) e-mails.inet_interfaces = all

# Dominios de recebimento de e-mails.mydestination = servteste.exemplo.org, 192.168.0.10, localhost.exemplo.org

### USUARIOS DESCONHECIDOS

# Codigo de erro retornado quando eh recebida um e-mail com destinatario desconhecido.# 450 = tente novamente mais tarde.# 550 = rejeitado.unknown_local_recipient_reject_code = 550

### RELAY

# Redes que podem fazer relay atraves deste servidor.mynetworks = 192.168.0.0/16, 127.0.0.0/8

Page 21: Servidores FreeBSD

### TAXA DE ENTRADA

# Pausa antes de aceitar uma nova mensagem quando a taxa de entrada# excede a taxa de entrega.# Para desabilitar especifique 0. Os valores validos sao 0 a 10.# O padrao eh 1s.#in_flow_delay = 1s

### ALIASES

# Arquivo(s) de aliases (apelidos, redirecionamento local).# Quando o arquivo for modificado deve-se executar "newaliases".alias_maps = hash:/etc/aliases

# Arquivo(s) de aliases no qual o programa newaliases trabalha.alias_database = hash:/etc/aliases

### DIVERSOS

# Contatar ou nao servidor Biff (que envia notificacoes de msg nova).biff = no

# Banner exibido quando se conexta ao servidor.# $myhostname deve constar.smtpd_banner = $myhostname ESMTP

### MAILBOX

# Parametro opcional que especifica o nome, relativo ao home do# usuario, de um arquivo Mailbox. O padrao eh /var/mail/usuario.#home_mailbox = Mailbox

# Diretorio onde ficam as caixas de entrada.#mail_spool_directory = /var/mail

# Programa externo opcional para fazer a entrega local.# Caso se queira usar o Procmail.#mailbox_command = /local/do/procmail

# Tamanho maximo em bytes para as caixas de entrada.# Deve ser maior que o message_size_limit.# O padrao eh 50MB.#mailbox_size_limit = 51200000

### LIMITES DE TAMANHO

# Quantia em bytes da mensagem original que eh retornada quando da# notificacao de erro na entrega.# O padrao eh 50000.#bounce_size_limit = 50000

# Tamanho maximo em bytes para o cabecalho das mensagens. A# quantidade excedente sera descartada.# O padrao eh 102400.#header_size_limit = 102400

# Tamanho maximo total de um e-mail, em bytes.# O padrao eh 10240000.#message_size_limit = 10240000

### CONTROLES ANTI-SPAM

# Limite de destinatarios por mensagem.# O padrao eh 1000.#smtpd_recipient_limit = 1000

Page 22: Servidores FreeBSD

# Controla se sera obrigatorio que os campos MAIL FROM e RCPT TO venham# dentro de <> e nao contenham comentarios no estilo da RFC822.# O padrao eh no, que nao faz a verificacao.strict_rfc821_envelopes = yes

# Restringe a conexao de determinados IPs.# Para maiores detalhes ver arquivo sample-smtpd.cfsmtpd_client_restrictions =reject_rbl_client relays.ordb.org,reject_rbl_client sbl-xbl.spamhaus.org,reject_rbl_client bl.spamcop.net,reject_rhsbl_client blackhole.securitysage.com,permit

# Restringe o envio por determinados remetentes.# Para maiores detalhes ver arquivo sample-smtpd.cfsmtpd_sender_restrictions = reject_unknown_sender_domain,reject_rhsbl_sender blackhole.securitysage.com,permit

# Restringe o envio para determinados destinatarios.# Para maiores detalhes ver arquivo sample-smtpd.cfsmtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination,permit

### CONFIGURACOES DE INSTALACAO

# Caminho completo do comando "sendmail" do Postfix, para compatibilidade.sendmail_path = /usr/sbin/sendmail

# Caminho completo do comando "newaliases" do Postfix.# Usado para compatibilidade com o Sendmail.newaliases_path = /usr/bin/newaliases

# Caminho completo do comando "mailq" do Postfix.# Para compatibilidade com o Sendmail.mailq_path = /usr/bin/mailq

# Grupo usado para submissao de e-mail e gerenciamento de filas.setgid_group = postdrop

# Diretorio das man pages.manpage_directory = /usr/local/man

# Diretorio dos exemplos de configuracao.sample_directory = /etc/postfix/sample

# Diretorio dos arquivos README.readme_directory = no-------------------- Fim do arquivo main.cf --------------------

Para que o Postfix seja inicializado no boot e terminado no shutdown de forma correta, devemos criar o script /usr/local/etc/rc.d/postfix.sh, conforme explicado anteriormente.

O comando para inicializar deverá ser:

/usr/sbin/postfix start > /dev/null 2>&1

O comando para finalizar deverá ser:

/usr/sbin/postfix stop > /dev/null 2>&1

A rotação do arquivo de log do Postfix é por padrão feita pelo Newsyslog, já que o Postfix joga seus logs no arquivo /var/log/maillog. Caso deseje alterar, edite o arquivo /etc/newsyslog.conf e comente a linha que especifica o arquivo maillog. Crie então um script para rotacionar este log, e insira uma linha no /etc/crontab para fazer a rotação na freqüência desejada.

Page 23: Servidores FreeBSD

3.2.2 - POP3 (Post Office Protocol version 3)

* Qpopper

O protocolo POP3 é usado para permitir que um usuário faça o download de e-mails que estão em um servidor, sendo após deletados do servidor ou não. O servidor ouve a porta TCP 110. Este protocolo é definido através da RFC1939.

O servidor que iremos instalar é o Qpopper, fornecido pela Qualcomm. Seu site é http://www.eudora.com/qpopper. Deverá ser feito o download de sua última versão, que atualmente é a 4.0.5 e encontra-se em ftp://ftp.qualcomm.com/eudora/servers/unix/popper/qpopper4.0.5.tar.gz.

Descompacte o arquivo qpopper4.0.5.tar.gz no diretório /tmp. Será criada a pasta /tmp/qpopper4.0.5, acesse-a. Nesta pasta está o arquivo GUIDE.PDF, trata-se do Qpopper Administrator's Guide, é interessante tê-lo como referência. Execute os seguintes comandos:

# ./configure# make# make install

Após isso a pasta /tmp/qpopper4.0.5 pode ser apagada. O Qpopper é instalado com o nome popper, em /usr/local/sbin/popper. Seu manual pode ser acessado através do comando "man popper".

Para rodar o Qpopper através do Inetd, abra o arquivo /etc/inetd.conf e adicione a seguinte linha:

pop3 stream tcp nowait root /usr/local/sbin/popper qpopper -s -R

Após isso, reinicie o serviço inetd, através do comando "killall -HUP inetd".

O log do Qpopper é feito por padrão no arquivo /var/log/messages.

Pode-se agora testar o servidor, para isso utilize um cliente como por exemplo MS Outlook, Eudora, etc. Configure como servidor POP3 o endereço IP do seu servidor e faça alguns testes recebendo e-mails através de POP3.

Verifique o arquivo de log, suas entradas possuem o seguinte formato:

fulano 0 0 1 8748 192.168.0.30 192.168.0.30

Username: fulanoMensagens deletadas: 0Bytes deletados: 0Mensagens deixadas no servidor: 1Bytes deixados no servidor: 8748Hostname / IP do cliente: 192.168.0.30IP do cliente: 192.168.0.30

3.2.3 - MUA (Mail User Agent) * OpenWebmail

Um Webmail é um Mail User Agent, conhecido popularmente como "cliente de e-mail", com interface Web, o que possibilita que os usuários trabalhem com seus e-mails através de um navegador. O OpenWebmail foi desenvolvido na linguagem Perl, a partir o Neomail em sua versão 1.14. Sua principal característica é trabalhar com pastas de e-mails grandes com uma utilização eficiente de memória. Além disso, possui funcionalidades como Disco Web, Calendário com agenda de compromissos etc. Sua página é www.openwebmail.com.

Para instalar o OpenWebmail é necessário que tenhamos um Servidor Web Apache com suporte a CGI e o Perl na versão 5.005 ou acima. Além disso, serão necessários vários outros pacotes.

O OpenWebmail necessita que o programa suidperl tenha o bit setuid habilitado, então para evitar futuros problemas descomente a seguinte linha no arquivo /etc/defaults/make.conf:

ENABLE_SUIDPERL= true

Procedemos agora a instalação do Perl, através do Ports. Vá até o diretório /usr/ports/lang/perl5 e digite "make install". Após instalada esta versão do Perl, precisamos dizer ao sistema que queremos usá-la ao invés da versão que vem instalada por padrão (que neste caso é a 5.005_03). Para isso, digite o seguinte comando:

# /usr/local/bin/use.perl port

Faça agora o download dos seguintes pacotes:

http://search.cpan.org/CPAN/authors/id/L/LD/LDS/CGI.pm-3.03.tar.gzhttp://search.cpan.org/CPAN/authors/id/G/GA/GAAS/MIME-Base64-3.00.tar.gzhttp://search.cpan.org/CPAN/authors/id/G/GB/GBARR/libnet-1.17.tar.gzhttp://search.cpan.org/CPAN/authors/id/M/MP/MPIOTR/Text-Iconv-1.2.tar.gz

Page 24: Servidores FreeBSD

http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/Compress-Zlib-1.32.tar.gz

Coloque-os no diretório /usr/originais, então execute os passos abaixo para instalar os mesmos:

Instalação do CGI.pm-3.03:

# cd /tmp# tar xzvf /usr/originais/CGI.pm-3.03.tar.gz# cd CGI.pm-3.03/# perl Makefile.PL# make# make install

Instalação do MIME-Base64:

# cd /tmp# tar xzvf /usr/originais/MIME-Base64-3.00.tar.gz# cd MIME-Base64-3.00/# perl Makefile.PL# make# make install

Instalação do libnet:

# cd /tmp# tar xzvf /usr/originais/libnet-1.17.tar.gz# cd libnet-1.17/# perl Makefile.PLNesta etapa, responda não quando questionado sobre atualizar (update).# make# make install

Instalação do Text-Iconv-1.2:

# cd /tmp# tar xzvf /usr/originais/Text-Iconv-1.2.tar.gz# cd Text-Iconv-1.2/

Edite o arquivo Makefile.PL e edite as linhas

'LIBS' => [''], # e.g., '-lm'

e

'INC' => '', # e.g., '-I/usr/include/other'

para ficarem como as seguintes:

'LIBS' => ['-L/usr/local/lib -liconv'], # e.g., '-lm'

e

'INC' => '-I/usr/local/include', # e.g., '-I/usr/include/other'

Após isso, seguimos a seqüência de comandos:

# perl Makefile.PL# make# make install

Instalação do Compress-Zlib-1.32:

# cd /tmp# tar xzvf /usr/originais/Compress-Zlib-1.32.tar.gz# cd Compress-Zlib-1.32/# perl Makefile.PL# make# make install

Deve ser instalado também o "ispell", programa para correção ortográfica. Faça a instalação do mesmo via Ports:

Page 25: Servidores FreeBSD

# cd /usr/ports/portuguese/ispell-pt_BR# make install# cd /usr/local/share/ispell# mv br.aff Portugues.aff# mv br.hash Portugues.hash# mv english.aff Ingles.aff# mv english.dict Ingles.dict# mv english.hash Ingles.hash

Deve ser instalado ainda o "Zip", programa compactador. Instale também via Ports:

# cd /usr/ports/archivers/zip# make install

Terminada a instalação dos pacotes, delete os diretórios criados no /tmp durante as etapas anteriores. Então faça o download da última versão do OpenWebmail. Atualmente é a 2.30, e pode ser encontrada em http://openwebmail.com/openwebmail/download/openwebmail-2.30.tgz. Após isso, execute os seguintes comandos:

# cd /usr/local/apache2# tar xvzBpf /usr/originais/openwebmail-2.30.tgz# mv data/openwebmail htdocs/ Preste atenção nas barras, é importante neste comando.# rmdir data# chmod 600 htdocs/openwebmail/openwebmail.html

Agora o OpenWebmail está instalado, o próximo passo é configurá-lo. O arquivo de configuração fica no diretório /usr/local/apache2/cgi-bin/openwebmail/etc e chama-se openwebmail.conf. Este arquivo deve conter apenas as configurações que forem diferentes das contidas em openwebmail.conf.default, que como o próprio nome diz é o padrão. É interessante ler e ter como referência o arquivo openwebmail.conf.help, o mesmo possui a descrição de cada opção.Segue abaixo o arquivo modelo para a configuração, copie-o no diretório mencionado acima e altere o que for necessário. Deverá ser criado o diretório /var/log/openwebmail:

-------------------- Arquivo openwebmail.conf --------------------# openwebmail.conf

name Webmail Exemplo

domainnames servteste.exemplo.org

ow_cgidir /usr/local/apache2/cgi-bin/openwebmailow_htmldir /usr/local/apache2/htdocs/openwebmail

logfile /var/log/openwebmail/openwebmail.logglobal_filterbook noneg2b_map noneb2g_map nonelunar_map none

spellcheck_dictionaries Portugues, Ingles

enable_domainselectmenu noenable_changepwd no

enable_about noxmailer_has_version no

enable_loadfrombook noenable_editfrombook noenable_stationery noenable_sshterm no

disallowed_pop3servers servteste, servteste.exemplo.org

maxbooksize 128

webdisk_lshidden nowebdisk_allow_symlinkcreate nowebdisk_allow_symlinkout nowebdisk_allow_thumbnail no

Page 26: Servidores FreeBSD

<page_footer></page_footer>

default_language pt_BRdefault_autoreplysubject Essa é uma resposta automática...[Re: $SUBJECT]

<default_autoreplytext>Olá,

Eu não estou lendo meus e-mails por enquanto.Seu e-mail sobre '$SUBJECT' será lido quando eu voltar.</default_autoreplytext>

<default_signature></default_signature>

default_iconset Cool3Ddefault_bgurl %ow_htmlurl%/images/backgrounds/Envelope.gifdefault_dateformat dd/mm/yyyy

default_msgsperpage 20default_useminisearchicon nodefault_defaultdestination mail-trashdefault_smartdestination no

default_usesmileicon no

default_sendbuttonposition bothdefault_replywithorigmsg at_end

default_newmailsound Nonedefault_newmailwindowtime 0default_dictionary Portugues

default_abook_width 500default_abook_height 400

default_calendar_starthour 0700default_calendar_endhour 2300default_calendar_reminderdays 2

default_webdisk_dirnumitems 20-------------------- Fim do arquivo openwebmail.conf --------------------

Após salvar o arquivo de configuração execute o seguinte comando:

# /usr/local/apache2/cgi-bin/openwebmail/openwebmail-tool.pl --init

Teste o Webmail, acessando o endereço http://servidor/cgi-bin/openwebmail/openwebmail.pl, deverá funcionar normalmente.

Para que seja efetuada a busca de mensagens POP3 e a filtragem de mensagens (caso o usuário tenha habilitado algum destes recursos) e também a verificação dos índices das pastas periodicamente, mesmo sem o usuário logar, adicionamos a seguinte linha ao arquivo /etc/crontab:

0 3 * * * root /usr/local/apache2/cgi-bin/openwebmail/openwebmail-tool.pl -q -a -p -i

Isto fará com que as tarefas sejam executadas todos os dias às 3 horas.

Para que o serviço de notificação via e-mail do calendário funcione corretamente, adicione ainda a seguinte linha ao /etc/crontab:

0 */2 * * * root /usr/local/apache2/cgi-bin/openwebmail/openwebmail-tool.pl -q -a -n

Normalmente se usa um endereço amigável para o Webmail, como por exemplo http://servidor/mail. Para isso, crie o diretório /usr/local/apache2/htdocs/mail e dentro dele um arquivo index.html, com o seguinte conteúdo:

-------------------- Arquivo index.html --------------------<html><head><meta http-equiv="Refresh" content="0;URL=http://servidor/cgi-bin/openwebmail/openwebmail.pl">

Page 27: Servidores FreeBSD

</head><body onload="window.open('http://servidor/cgi-bin/openwebmail/openwebmail.pl','_top')"></body></html>-------------------- Fim do arquivo index.html --------------------

Crie ainda um script para fazer a rotação do log do OpenWebmail, que fica em /var/log/openwebmail/openwebmail.log. Deverá ser criado o diretório /var/log/openwebmail/oldlog. O script pode ficar em /usr/local/script/:

-------------------- Arquivo rotate_log_openwebmail.sh --------------------#!/bin/sh

# Define o nome para arquivamentoOLD_LOG=/var/log/openwebmail/oldlog/openwebmail.log.`date +%y%m%d-%H%M%S`

# move o arquivo para o diretorio de arquivamentomv /var/log/openwebmail/openwebmail.log `echo $OLD_LOG`

# compacta o arquivado/usr/bin/gzip $OLD_LOG

# apaga os logs com mais de um anofind /var/log/openwebmail/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_openwebmail.sh --------------------

Edite o arquivo /etc/crontab e adicione as seguinte linha, para executar o script a cada mês:

0 0 1 * * root /usr/local/script/rotate_log_openwebmail.sh

3.2.4 - Proteção contra Vírus no Postfix

* AMaViS (A Mail Virus Scanner) + ClamAV (Clam AntiVirus)

O AMaViS é uma ferramenta utilizada para fazer a integração entre o MTA e o Antivírus. O AMaViS por si só não é um antivírus, ele faz esta interface, chamando o antivírus, previamente configurado, para fazer a varredura dos e-mails que chegam ao servidor. Outro recurso que pode ser utilizado é o bloqueio de mensagens com arquivos anexos de extensão .exe, .com etc. A versão que iremos instalar é o amavisd-new, que é desenvolvido em Perl. Seu site é http://www.ijs.si/software/amavisd.

O antivírus que será utilizado é o ClamAV - Clam AntiVirus. É escrito na linguagem C, e possui licensa GPL. O ClamAV não limpa os arquivos infectados, apenas detecta. Seu site é www.clamav.net.

* Instalação do ClamAV

Iremos instalar primeiramente o ClamAV. Para isso, adicione um grupo e um usuário chamados clamav, da seguintes forma:

# pw group add clamav -g 130# pw user add clamav -c "Clam AntiVirus" -d "/nonexistent" -s "/sbin/nologin" -u 130 -g 130

Efetue o download da última versão estável a partir de seu site. Atualmente é a 0.65, disponível em http://unc.dl.sourceforge.net/sourceforge/clamav/clamav-0.65.tar.gz. Descompacte este arquivo no diretório /tmp, será criado o diretório clamav-0.65, acesse-o. Digite os seguintes comandos:

# ./configure# make# make install

Os executáveis serão instalados em /usr/local/bin e /usr/local/sbin, e o arquivo de configuração fica em /usr/local/etc/clamav.conf. Crie ainda o diretório /var/clamav, com dono clamav e permissão 700, e também o diretório /var/log/clamav. Copie o arquivo de configuração abaixo para /usr/local/etc/clamav.conf. Para maiores detalhes, consulte "man clamav.conf".

-------------------- Arquivo clamav.conf --------------------# clamav.conf

# Arquivo de log.LogFile /var/log/clamav/clamd.log

# Para permitir multiplas instancias com o mesmo arquivo de log

Page 28: Servidores FreeBSD

# descomente a linha abaixo.#LogFileUnlock

# Tamanho maximo em bytes do arquivo de log. O valor 0 eh ilimitado.LogFileMaxSize 0

# Coloca data e hora em cada linha do log.LogTime

# Usar o Syslog.#LogSyslog

# Aumenta o detalhamento do log.#LogVerbose

# Caso desejado salvar o PID em arquivo.#PidFile /var/run/clamd.pid

# Diretorio contendo arquivos .db.DataDirectory /usr/local/share/clamav

# Caminho para o socket local.LocalSocket /var/clamav/clamd

# Remove sockets travados.FixStaleSocket

# Porta TCP.#TCPSocket 3310

# Endereco IP. A linha abaixo fornece alguma protecao, ja# que iremos trabalhar apenas localmente.TCPAddr 127.0.0.1

# Tamanho maximo da fila de conexoes pendentes.#MaxConnectionQueueLength 30

# Stream de entrada sera salvo no disco antes de ser scanneado.#StreamSaveToDisk

# Limite de tamanho do STREAM. Se excedido fecha a conexao.#StreamMaxLength 10M

# Numero maximo de threads simultaneas. O padrao eh 5.MaxThreads 20

# Tempo maximo em segs para cada thread. O padrao eh 180.#ThreadTimeout 500

# Profundidade maxima de varredura de diretorios.MaxDirectoryRecursion 50

# Segue links simbolicos de diretorios.#FollowDirectorySymlinks

# Segue links simbolicos de arquivos.#FollowFileSymlinks

# Intervalo em segs entre cada verificacao da integridade interna.# O padrao eh 3600.#SelfCheck 600

# Comando executado quando um virus eh encontrado.# Nao deve ser usado para deletar ou mover arquivos.# %v = nome do virus / %f = nome do arquivo#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %f: %v"

# Usuario sob o qual ira rodar.User clamav

# Habilita grupos adicionais se o usuario clamav participar de algum.#AllowSupplementaryGroups

# Nao roda em background. Util para debug.

Page 29: Servidores FreeBSD

#Foreground

# Habilita mensagens de debug.#Debug

# Descomentar a linha abaixo se for varrer arquivos de e-mail.#ScanMail

# Comentar a linha abaixo para desabilitar a varredura de arquivos.ScanArchive

# Suporte a arquivos compactados RAR.#ScanRAR

# Tamanho maximo de arquivo scanneado. O valor 0 eh ilimitado.ArchiveMaxFileSize 50M

# Recursao maxima em arquivos compactados (um dentro do outro).ArchiveMaxRecursion 10

# Numero maximo de arquivos dentro de algum compactado.ArchiveMaxFiles 1000

# Limita a memoria para descompressao bzip2.#ArchiveLimitMemoryUsage-------------------- Fim do arquivo clamav.conf --------------------

Após isso, teste o ClamAV através do scanner de linha de comando, executando o seguinte:

# clamascan -r /usr/originais/clamav-0.65.tar.gz

Deverá aparecer a seguinte linha:

/usr/originais/clamav-0.65.tar.gz: ClamAV-Test-Signature FOUND

Após isso, devemos configurar o sistema de atualização automática. Prepare o arquivo de log da atualização, através dos seguintes comandos:

# touch /var/log/clamav/clam-update.log# chown clamav /var/log/clamav/clam-update.log# chmod 600 /var/log/clamav/clam-update.log

Adicione a seguinte linha ao arquivo /etc/crontab:

0 */4 * * * root /usr/local/bin/freshclam --quiet -l /var/log/clamav/clam-update.log

Isto fará com que o ClamAV seja atualizado a cada quatro horas, de acordo com a documentação do mesmo este é o período mínimo sugerido.

* Instalação do AMaViS

Passamos agora à instalação do AMaViS. A maneira mais fácil de fazer essa instalação é através do Ports, já que o AMaVIS exige muitos outros pacotes, como por exemplo Archive::Tar, Archive::Zip, Compress::Zlib, Convert::TNEF, Convert::UUlib, MIME::Base64, MIME::Parser, Mail::Internet, Net::Server, Net::SMTP, Digest::MD5, IO::Stringy, Time::HiRes, Unix::Syslog, file, compress, gzip, bzip2, nomarch, arc, lha, unarj, arj, rar, unrar, zoo, cpio, lzop e freeze.

Adicione o usuário e grupo vscan, de acordo com o abaixo:

# pw group add vscan -g 140# pw user add vscan -c "AMaViS" -d "/var/amavis" -s "/bin/sh" -u 140 -g 140

Vá até o diretório /usr/ports/security/amavisd-new e digite "make install". Todos os pacotes necessários serão baixados e instalados.

Vá até o diretório /usr/local/etc e mova o arquivo amavisd.conf-dist para amavisd.conf, e aplique a permissão 600. Edite este arquivo, observe atentamente os comentários, e faça as alterações indicadas abaixo:

Edite a linha

$mydomain = 'example.com';

e substitua "example.org" pelo hostname do seu servidor, como

$mydomain = 'servteste.exemplo.org';

Page 30: Servidores FreeBSD

Descomente as seguintes linhas:

['Clam Antivirus-clamd',\&ask_daemon, ["CONTSCAN {}\n", '/var/amavis/clamd'],qr/\bOK$/, qr/\bFOUND$/,qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

$warnvirussender = 1;

$warnbannedsender = 1;

qr'.\.(ade|adp|bas|bat|chm|cmd|com|cpl|crt|exe|hlp|hta|inf|ins|isp|js|jse|lnk|mdb|mde|msc|msi|msp|mst|pcd|pif|reg|scr|sct|shs|shb|vb|vbe|vbs|wsc|wsf|wsh)$'ix,

Comente as seguintes linhas:

$DO_SYSLOG = 1;

$X_HEADER_TAG = 'X-Virus-Scanned';

Insira a seguinte linha, no local apropriado:

$hdrfrom_notify_sender = 'AntiVirus <[email protected]>';

* Ajustes

Agora deve-se fazer novamente uma configuração no ClamAV. Edite o arquivo /usr/local/etc/clamav.conf e troque as seguintes linhas, nos seus respectivos locais:

LocalSocket /var/clamav/clamd

User clamav

para

LocalSocket /var/amavis/clamd

User vscan

O usuário e o grupo clamav podem ser removidos agora, se desejado, assim como o diretório /var/clamav.

Crie um alias no arquivo /etc/aliases para o e-mail virusalert, direcionando-o para onde quiser. Neste endereço virão os avisos de mensagens com vírus ou anexos não permitidos que o servidor bloqueou:

virusalert: root

Para que a integração com o MTA seja feita, edite o arquivo /etc/postfix/master.cf e adicione as seguintes linhas:

smtp-amavis unix - - y - 2 smtp-o smtp_data_done_timeout=1200s-o smtp_never_send_ehlo=yes-o disable_dns_lookups=yes

127.0.0.1:10025 inet n - n - - smtpd-o content_filter=-o local_recipient_maps=-o smtpd_helo_restrictions=-o smtpd_client_restrictions=-o smtpd_sender_restrictions=-o smtpd_recipient_restrictions=permit_mynetworks,reject-o mynetworks=127.0.0.0/8

Salve o arquivo e então edite o main.cf e adicione a seguinte linha:

content_filter = smtp-amavis:[127.0.0.1]:10024

Após isso, inicialize os daemons do ClamAV e do AMaViS e reinicialize o Postfix:

# /usr/local/sbin/clamd# /usr/local/sbin/amavisd# postfix reload

A seqüência de inicialização deverá ser preferencialmente esta, visto que o Postfix dependerá do AMaViS, e este do

Page 31: Servidores FreeBSD

ClamAV, para fazer a verredura dos e-mails. Verifique os arquivos de log, para ver se todos os daemons estão funcionando corretamente. O arquivo de log do AMaViS fica em /var/amavis/amavisd.log. Teste o envio de e-mails normais e também veja se estão sendo barrados e-mails infectados, enviando como anexo o arquivo eicar.com (http://www.eicar.org/download/eicar.com) que é um padrão para testes de antivírus. Teste também enviando este arquivo compactado etc.

Os seguintes arquivos são instalados por padrão e não serão necessários, podem ser removidos:

/usr/local/etc/rc.subr/usr/local/etc/rc.d/amavis-milter.sh/usr/local/etc/rc.d/amavisd.sh/usr/local/etc/rc.d/spamd.sh-dist

Crie um script de inicialização e shutdown do ClamAV, em /usr/local/etc/rc.d/10.clamd.sh. Os comandos para inicialização e shutdown devem ser, respectivamente:

/usr/local/sbin/clamd

e

killall clamd

Crie também um script de inicialização para o AMaViS, com o nome 20.amavisd.sh e com os seguintes comandos, para inicialização e shutdown respectivamente:

/usr/local/sbin/amavisd start

e

/usr/local/sbin/amavisd stop

Os nomes iniciando em 10 e 20 irão garantir que a inicialização do ClamAV seja feita antes da inicialização do AMaViS, evitando problemas.

Segue abaixo um script para rotacionar os logs do ClamAV, coloque-o em /usr/local/script/rotate_log_clamav.sh. Crie também o diretório /var/log/clamav/oldlog:

-------------------- Arquivo rotate_log_clamav.sh --------------------#!/bin/sh

# finaliza o clamdkillall clamd

# Define os nomes para arquivamentoOLD_CLAMD_LOG=/var/log/clamav/oldlog/clamd.log.`date +%y%m%d-%H%M%S`OLD_UPDATE_LOG=/var/log/clamav/oldlog/clam-update.log.`date +%y%m%d-%H%M%S`

# move os arquivos para o diretorio de arquivamentomv /var/log/clamav/clamd.log `echo $OLD_CLAMD_LOG`mv /var/log/clamav/clam-update.log `echo $OLD_UPDATE_LOG`

# cria novamente o arquivo de log do updatetouch /var/log/clamav/clam-update.logchown clamav /var/log/clamav/clam-update.logchmod 600 /var/log/clamav/clam-update.log

# inicializa o clamd/usr/local/sbin/clamd

# compacta os arquivados/usr/bin/gzip $OLD_CLAMD_LOG/usr/bin/gzip $OLD_UPDATE_LOG

# apaga os logs com mais de um anofind /var/log/clamav/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_clamav.sh --------------------

Edite o arquivo /etc/crontab e adicione a seguinte linha:

20 0 1 * * root /usr/local/script/rotate_log_clamav.sh

Isto fará com que os logs sejam rotacionados à 0h20min do primeiro dia de cada mês.

Page 32: Servidores FreeBSD

Crie ainda um script para fazer o rotate do log do AMaViS:

-------------------- Arquivo rotate_log_amavis.sh --------------------#!/bin/sh

# finaliza o postfix e o amavis/usr/sbin/postfix stop/usr/local/sbin/amavisd stop

# Define o nome para arquivamentoOLD_LOG=/var/amavis/oldlog/amavis.log.`date +%y%m%d-%H%M%S`

# move o arquivo para o diretorio de arquivamentomv /var/amavis/amavis.log `echo $OLD_LOG`

# inicializa o amavis e o postfix/usr/local/sbin/amavisd start/usr/sbin/postfix start

# compacta o arquivado/usr/bin/gzip $OLD_LOG

# apaga os logs com mais de um anofind /var/amavis/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_amavis.sh --------------------

Não esqueça de criar o diretório /var/amavis/oldlog. Por fim, edite o arquivo /etc/crontab e adicione a seguinte linha:

20 0 1 * * root /usr/local/script/rotate_log_amavis.sh

3.2.5 - Gerenciador de Listas

* Mailman

O Mailman é um gerenciador de listas de discussão ou distribuição de e-mail. É desenvolvido na sua maior parte em Python. Uma das suas principais características é a interface Web, que facilita a administração das listas e a utilização por parte dos usuários. Seu site é www.list.org.Entre alguns dos seus muitos usuários estão Apple Computer, Dell Computers, The XFree86 Project, SourceForge.net, Massachusetts Institute of Technology, RedHat, Samba, KDE Project, Python.Org, Zope.org e GNOME.Org - uma lista mais completa se encontra em http://www.list.org/inthenews.html.

Antes do Mailman, iremos instalar o Python. Efetue o download da última versão estável, ou "production version", a partir do site do Python (www.python.org). A versão atual é 2.3.3, e se encontra em http://www.python.org/ftp/python/2.3.3/Python-2.3.3.tgz. Descompacte e extraia o arquivo em /tmp e acesse o diretório que será criado - Python-2.3.3. Digite os comandos abaixo:

# ./configure# make# make install

Faça o download da última versão do Mailman a partir do seu site ou algum mirror, ou a partir de http://ftp.gnu.org/gnu/mailman. A versão atual é 2.1.4, e o arquivo chama-se mailman-2.1.4.tgz.

Crie o usuário e o grupo mailman, da seguinte forma:

# pw group add mailman -g 150# pw user add mailman -c "Mailman" -d "/usr/local/mailman" -s "/bin/sh" -u 150 -g 150

O Mailman exige que se crie antecipadamente o diretório no qual irá instalar seus arquivos. Para isso, execute os seguintes comandos:

# mkdir /usr/local/mailman# chgrp mailman /usr/local/mailman# chmod 2775 /usr/local/mailman

Vá até o diretório /tmp e copie para lá o arquivo mailman-2.1.4.tgz. A instalação será feita pelo usuário mailman, para isso execute os seguintes comandos:

# su mailman$ cd /tmp$ tar xvzf mailman-2.1.4.tgz$ cd mailman-2.1.4

Page 33: Servidores FreeBSD

$ ./configure$ make$ make install

Após a instalação, continue com o usuário mailman. Vá até o diretório /usr/local/mailman e rode o comando abaixo, que irá ajustar as permissões que estiverem incorretas:

$ bin/check_perms -f

Após isso, rode novamente o comando sem o parâmetro "-f", para verificar se as permissões estão certas.

Como o Mailman possui uma interface Web, é necessário que seja feita uma integração com o servidor Web, que é o Apache. Para isso, volte ao usuário root (digitando exit), edite o arquivo de configuração do Apache (/usr/local/apache2/conf/httpd.conf) e adicione as seguintes linhas, nos locais apropriados:

ScriptAlias /mailman/ "/usr/local/mailman/cgi-bin/"

Alias /pipermail/ "/usr/local/mailman/archives/public/"

Após estas modificações, reinicie o Apache, através do comando "/usr/local/apache2/bin/apachectl restart". Devem ser ainda copiados os ícones e logotipos do Mailman para o diretório do Apache que guarda este tipo de arquivo:

# cp /usr/local/mailman/icons/* /usr/local/apache2/icons/

Além do Apache, deve-se configurar também o Postfix. Edite o arquivo /etc/postfix/main.cf e adicione as linhas abaixo:

owner_request_special = norecipient_delimiter = +

No mesmo arquivo, troque a linha

alias_maps = hash:/etc/aliases

por

alias_maps = hash:/etc/aliases, hash:/usr/local/mailman/data/aliases

Feito isso, reinicie o Postfix, através do comando "/usr/sbin/postfix reload". Precisamos ainda que o Mailman saiba qual MTA estamos usando. Para isso, edite o arquivo /usr/local/mailman/Mailman/mm_cfg.py e adicione, no final, a seguinte linha:

MTA = 'Postfix'

Para que os arquivos de aliases do Mailman sejam inicializados e seus donos corrigidos, execute os seguintes comandos:

# cd /usr/local/mailman# bin/genaliases# chown mailman:mailman data/aliases*

Deverá ser adicionada e configurada uma lista inicial, para tarefas administrativas do Mailman. Para isso, vá até o diretório /usr/local/mailman e execute os seguintes comandos:

# su mailman$ bin/newlist mailmanSurgirão as seguintes questões:Enter the email of the person running the list: entre o seu endereço de e-mail, ou algum utilizado para administração do servidor.Initial mailman password: insira uma senha para administração da lista.

$ bin/config_list -i data/sitelist.cfg mailmanEste comando fará com que seja atribuída a esta lista uma configuração inicial padrão (para este tipo de lista, e esta provavelmente será a única deste tipo).

Neste ponto, a interface de gerenciamento via web do Mailman deverá estar funcionando. Precisamos adicionar um usuário à lista de nome mailman recém criada. Acesse o endereço http://servidor/mailman/admin/mailman, e entre com a senha configurada anteriormente. Clique em "Membership Management" e então em "Mass Subscription". Na caixa de texto após a frase "Enter one address per line below..." insira o endereço de e-mail que foi configurado anteriormente, no momento de criação da lista. Para finalizar, clique no botão "Submit Your Changes".

O Mailman necessita que vários processos sejam agendados no Cron. Para isso, execute os seguintes comandos:

# su mailman$ cd /usr/local/mailman/cron$ crontab crontab.in

Page 34: Servidores FreeBSD

Isto fará com que seja criado o arquivo /var/cron/tabs/mailman, que é a tabela de cron do Mailman. Agora pode-se inicializar o daemon do Mailman, execute os comandos abaixo:

# su mailman$ cd /usr/local/mailman$ bin/mailmanctl start

Deve ser criada a senha geral de administração do Mailman. Ela será usada para adicionar listas e outras tarefas, e também pode ser usada no lugar das senhas individuais das listas. Execute o comando abaixo e insira a senha quando solicitado:

# /usr/local/mailman/bin/mmsitepass

Não será preciso criar um script de inicialização para o Mailman, apenas copie o arquivo /usr/local/mailman/scripts/mailman para /usr/local/etc/rc.d/mailman.sh, e altere sua permissão para 700.

Com isso, o Mailman está instalado, configurado e funcionando. Navegue pela interface web, mude o idioma das listas para Português e faça vários testes para conhecer bem o sistema antes de colocar alguma lista em produção.

3.3 - Serviços Web

3.3.1 - Servidor Web

* Apache HTTP Server

O Apache HTTP Server é um projeto da Apache Software Foundation (www.apache.org). Dispensa maiores apresentações, visto que é o servidor Web mais utilizado na Internet desde abril de 1996. Em outubro de 2003 mais de 64% dos servidores Web da Internet utilizavam o Apache.

Faça o download da última versão estável disponível, atualmente é a 2.0.48. O download pode ser feito a partir da página http://httpd.apache.org/download.cgi ou diretamente a partir de um mirror como http://apache.usp.br/httpd.

Descompacte o arquivo httpd-2.0.48.tar.gz em /tmp e acesse o diretório que será criado, /tmp/httpd-2.0.48. Digite os seguintes comandos:

# ./configure# make# make install

O servidor será instalado em /usr/local/apache2. O arquivo de configuração fica em /usr/local/apache2/conf/httpd.conf. Na instalação do Apache já é instalado um arquivo padrão, bastante comentado, sendo por isso recomendada a sua leitura. Podemos testar o servidor com este arquivo, para isso inicialize o Apache, com o seguinte comando:

# /usr/local/apache2/bin/apachectl start

A partir de um browser acesse o endereço http://ip_do_servidor. Deverá aparecer uma página teste, indicando que a instalação ocorreu com sucesso. Mesmo assim, o arquivo httpd.conf deve sofrer algumas modificações. Segue abaixo um modelo do arquivo, que pode ser tomado como base para a configuração. Neste arquivo foram omitidas algumas configurações, como por exemplo de VirtualHosts e SSL. Este arquivo deve ser colocado no diretório /usr/local/apache2/conf:

-------------------- Arquivo httpd.conf --------------------# httpd.conf

### Secao 1: Contexto Global

## Diretorio sob o qual esta instalado o servidor#ServerRoot "/usr/local/apache2"

# PidFile: arquivo no qual o servidor guarda o seu PID quando inicializado#PidFile logs/httpd.pid

## Timeout: tempo maximo em segundos para receives e sends#Timeout 300

#

Page 35: Servidores FreeBSD

# KeepAlive: permitir ou nao conexoes persistentes (mais de uma requisicao por conexao)#KeepAlive On

## MaxKeepAliveRequests: numero maximo de requisicoes durante uma conexao persistente#MaxKeepAliveRequests 100

## KeepAliveTimeout: tempo de espera por uma nova requisicao da mesma conexao#KeepAliveTimeout 15

#### Ajuste de Tamanho do Server-Pool## # prefork MPM# StartServers: numero de processos servidores inicializados# MinSpareServers: minimo de processos servidores separados# MaxSpareServers: maximo de processos servidores separados# MaxClients: numero maximo de processos servidores permitidos (maximo de clientes)# MaxRequestsPerChild: numero maximo de requisicoes que um processo servidor atende#(0=ilimitado)<IfModule prefork.c> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0</IfModule>

## Listen: endereço IP e porta na qual o servidor deve esperar requisicoes# Caso um IP nao seja especificado ira ouvir em todas as interfaces##Listen 12.34.56.78:80Listen 80

### Section 2: Configuracao do servidor 'principal'## The directives in this section set up the values used by the 'main'# server, which responds to any requests that aren't handled by a# <VirtualHost> definition. These values also provide defaults for# any <VirtualHost> containers you may define later in the file.## All of these directives may appear inside <VirtualHost> containers,# in which case these default settings will be overridden for the# virtual host being defined.#

## Usuario e grupo sob os quais o servidor ira rodar##User nobody#Group #-1User wwwGroup www

## ServerAdmin: endereco de e-mail do administrador do servidor# Aparece em alguns documentos gerados pelo servidor, como paginas de erro#

Page 36: Servidores FreeBSD

#ServerAdmin [email protected] [email protected]

## ServerName: endereco e porta que identificam o servidor# Caso nao houver um nome valido no DNS, deve-se especificar o IP##ServerName www.example.com:80ServerName 192.168.0.10:80

## UseCanonicalName: determina como o Apache se auto-referencia# Se setado em Off, será utilizado o hostname e porta fornecido pelo cliente# Se setado em On, será utilizado o valor da diretiva ServerName#UseCanonicalName Off

## DocumentRoot: diretório raiz dos documentos publicados#DocumentRoot "/usr/local/apache2/htdocs"

## Cada diretorio ao qual o Apache tem acesso pode ser configurado em relacao# a quais servicos e caracteristicas sao permitidos ou proibidos neste# diretorio (e seus subdiretorios)## Primeiramente, sera configurado o "default", bem restrito#<Directory /> Options FollowSymLinks AllowOverride None</Directory>

## Deste ponto em diante serao habilitadas caracteristicas especificas a cada contexto#

## Ajustar de acordo com o DocumentRoot#<Directory "/usr/local/apache2/htdocs">

# # Os valores possiveis para a diretiva Options sao "None", "All", # ou qualquer combinacao de: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # A opcao "MultiViews" nao esta inclusa em "All" # # Maiores informacoes em http://httpd.apache.org/docs-2.0/mod/core.html#options # Options Indexes FollowSymLinks

# # AllowOverride controla que diretivas podem ser colocadas em arquivos .htaccess # Pode ser "All", "None", ou qualquer combinacao de: # Options FileInfo AuthConfig Limit # AllowOverride AuthConfig

# # Controla quem poderá acessar. # Order allow,deny

Page 37: Servidores FreeBSD

Allow from all

</Directory>

## UserDir: nome do diretorio que sera procurado (dentro do diretorio# home) no caso de uma requisicao /~user#UserDir public_html

## Controle de acesso para diretorios UserDir.#<Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec <Limit GET POST OPTIONS PROPFIND> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS PROPFIND> Order deny,allow Deny from all </LimitExcept></Directory>

## DirectoryIndex: define qual arquivo sera oferecido quando for requisitado# um diretorio#DirectoryIndex index.html index.html.var index.htm

## AccessFileName: arquivo que sera verificado em cada diretorio em busca# de diretivas de configuracao adicionais (permitidas pelo AllowOverride)#AccessFileName .htaccess

## As seguintes linhas proibem os arquivos .htaccess e .htpasswd de serem# visualizados#<Files ~ "^\.ht"> Order allow,deny Deny from all</Files>

## TypesConfig: define onde fica o arquivo mime.types#TypesConfig conf/mime.types

## DefaultType: tipo MIME default utilizado#DefaultType text/plain

## Onde fica o arquivo magic#<IfModule mod_mime_magic.c> MIMEMagicFile conf/magic</IfModule>

## HostnameLookups: logar os hostnames dos clientes (On)# ou apenas os enderecos IP (Off)#

Page 38: Servidores FreeBSD

HostnameLookups Off

## ErrorLog: onde fica o arquivo de log de erros#ErrorLog logs/error_log

## LogLevel: controla o nivel do log de erro. Os valores podem ser:# debug, info, notice, warn, error, crit, alert, emerg.#LogLevel warn

## As diretivas abaixo definem alguns formatos de log#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agent

## Arquivo de log unico, com access, agent e referer# (Combined Logfile Format)#CustomLog logs/access_log combined

## ServerTokens: configura qual o nivel de informacoes sobre o servidor# eh passado no cabecalho 'Server HTTP response'# Valores possiveis: Full | OS | Minor | Minimal | Major | Prod# Full (default) apresenta mais informacoes, e Prod menos#ServerTokens Prod

## ServerSignature: apresenta ou nao informacoes sobre a versao do servidor# em documentos gerados dinamicamente, como paginas de erro. As opcoes sao# On (informa a versao), Off (nao informa) e EMail (informa a versao e um# link para o endereco de e-mail do ServerAdmin)#ServerSignature Off

## Aliases: adicionar aqui quantos aliases for necessario. O formato eh# Alias atalho caminhoreal#Alias /icons/ "/usr/local/apache2/icons/"

## Configuracoes do diretorio icons#<Directory "/usr/local/apache2/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all</Directory>

## Alias para o manual do Apache (pode ser removido se documentacao nao# for necessaria)#AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/usr/local/apache2/manual$1"

#

Page 39: Servidores FreeBSD

# Configuracoes do diretorio do manual#<Directory "/usr/local/apache2/manual"> Options Indexes AllowOverride None Order allow,deny Allow from all

<Files *.html> SetHandler type-map </Files>

SetEnvIf Request_URI ^/manual/de/ prefer-language=de SetEnvIf Request_URI ^/manual/en/ prefer-language=en SetEnvIf Request_URI ^/manual/fr/ prefer-language=fr SetEnvIf Request_URI ^/manual/ja/ prefer-language=ja SetEnvIf Request_URI ^/manual/ko/ prefer-language=ko SetEnvIf Request_URI ^/manual/ru/ prefer-language=ru RedirectMatch 301 ^/manual(?:/(de|en|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2</Directory>

## ScriptAlias: controla quais diretorios contem scripts server-side#ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

## Configuracoes do diretorio cgi-bin#<Directory "/usr/local/apache2/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all</Directory>

## Redirect: permite indicar aos clientes o novo endereco de documentos que# nao estao mais neste servidor# Exemplo:## Redirect permanent /foo http://www.example.com/bar

## IndexOptions: controla a aparencia das listagens de diretorios geradas pelo# servidor#IndexOptions FancyIndexing VersionSort

## AddIcon*: estas diretivas informam os icones adequados a cada tipo de arquivo# So funcionam com a opcao FancyIndexing ativada#AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*AddIconByType (IMG,/icons/image2.gif) image/*AddIconByType (SND,/icons/sound2.gif) audio/*AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exeAddIcon /icons/binhex.gif .hqxAddIcon /icons/tar.gif .tarAddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .ivAddIcon /icons/compressed.gif .Z .z .tgz .gz .zipAddIcon /icons/a.gif .ps .ai .epsAddIcon /icons/layout.gif .html .shtml .htm .pdfAddIcon /icons/text.gif .txt

Page 40: Servidores FreeBSD

AddIcon /icons/c.gif .cAddIcon /icons/p.gif .pl .pyAddIcon /icons/f.gif .forAddIcon /icons/dvi.gif .dviAddIcon /icons/uuencoded.gif .uuAddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tclAddIcon /icons/tex.gif .texAddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..AddIcon /icons/hand.right.gif READMEAddIcon /icons/folder.gif ^^DIRECTORY^^AddIcon /icons/blank.gif ^^BLANKICON^^

## DefaultIcon: icone padrao para arquivos desconhecidos nas listagens#DefaultIcon /icons/unknown.gif

## AddDescription: permite que seja colocada uma descricao para os tipos# de arquivos nas listagens# Exemplos:##AddDescription "GZIP compressed document" .gz#AddDescription "tar archive" .tar#AddDescription "GZIP compressed tar archive" .tgz

## ReadmeName: arquivos README padrao, que sera colocado apos a listagem# HeaderName: arquivo HEADER padrao, que sera colocado antes da listagem#ReadmeName README.htmlHeaderName HEADER.html

## IndexIgnore: conjunto de arquivos que nao devem ser incluidos nas listagens#IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

## AddLanguage: relacao entre os idiomas usados nas negociacoes de conteudo e as # extensoes#AddLanguage ca .caAddLanguage cs .cz .csAddLanguage da .dkAddLanguage de .deAddLanguage el .elAddLanguage en .enAddLanguage eo .eoAddLanguage es .esAddLanguage et .etAddLanguage fr .frAddLanguage he .heAddLanguage hr .hrAddLanguage it .itAddLanguage ja .jaAddLanguage ko .koAddLanguage ltz .ltzAddLanguage nl .nlAddLanguage nn .nnAddLanguage no .noAddLanguage pl .poAddLanguage pt .ptAddLanguage pt-BR .pt-brAddLanguage ru .ru

Page 41: Servidores FreeBSD

AddLanguage sv .svAddLanguage zh-CN .zh-cnAddLanguage zh-TW .zh-tw

## LanguagePriority: prioridade de idioma caso ocorra algum problema# na negociacao de conteudo#LanguagePriority pt-BR en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt ru sv zh-CN zh-TW

## ForceLanguagePriority: prioridade na negociacao de conteudo caso# nao haja o conteudo adequado#ForceLanguagePriority Prefer Fallback

## AddDefaultCharset: charset padrão para as paginas servidas##AddDefaultCharset ISO-8859-1AddDefaultCharset off

## AddCharset: relacao entre extensoes de arquivo e charsets#AddCharset ISO-8859-1 .iso8859-1 .latin1AddCharset ISO-8859-2 .iso8859-2 .latin2 .cenAddCharset ISO-8859-3 .iso8859-3 .latin3AddCharset ISO-8859-4 .iso8859-4 .latin4AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ruAddCharset ISO-8859-6 .iso8859-6 .latin6 .arbAddCharset ISO-8859-7 .iso8859-7 .latin7 .grkAddCharset ISO-8859-8 .iso8859-8 .latin8 .hebAddCharset ISO-8859-9 .iso8859-9 .latin9 .trkAddCharset ISO-2022-JP .iso2022-jp .jisAddCharset ISO-2022-KR .iso2022-kr .kisAddCharset ISO-2022-CN .iso2022-cn .cisAddCharset Big5 .Big5 .big5# Para russo, mais de um charset eh utilizado:AddCharset WINDOWS-1251 .cp-1251 .win-1251AddCharset CP866 .cp866AddCharset KOI8-r .koi8-r .koi8-ruAddCharset KOI8-ru .koi8-uk .uaAddCharset ISO-10646-UCS-2 .ucs2AddCharset ISO-10646-UCS-4 .ucs4AddCharset UTF-8 .utf8#AddCharset GB2312 .gb2312 .gb AddCharset utf-7 .utf7AddCharset utf-8 .utf8AddCharset big5 .big5 .b5AddCharset EUC-TW .euc-twAddCharset EUC-JP .euc-jpAddCharset EUC-KR .euc-krAddCharset shift_jis .sjis

## AddType: permite adicionar tipos MIME akem do arquivo mime.types##AddType application/x-tar .tgz

## AddEncoding: permite que certos browsers descompactem arquivos# 'on the fly'##AddEncoding x-compress .Z

Page 42: Servidores FreeBSD

#AddEncoding x-gzip .gz .tgz

## Se as diretivas AddEncoding acima estiverem comentadas, devem# ser indicados os tipos de arquivos:#AddType application/x-compress .ZAddType application/x-gzip .gz .tgz

## Para 'type maps' (negociacoes de conteudo):#AddHandler type-map var

## Mensagens de erro podem ser personalizadas de tres formas:# 1) texto 2) redirecionamento local 3) redirecionamento externo## Exemplos:#ErrorDocument 500 "Ocorreu um problema com o servidor."#ErrorDocument 404 /missing.html#ErrorDocument 404 "/cgi-bin/missing_handler.pl"#ErrorDocument 402 http://www.example.com/subscription_info.html#

## Diretivas para modificar as respostas HTTP normais devido a erros# conhecidos em alguns browsers#BrowserMatch "Mozilla/2" nokeepaliveBrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0BrowserMatch "RealPlayer 4\.0" force-response-1.0BrowserMatch "Java/1\.0" force-response-1.0BrowserMatch "JDK/1\.0" force-response-1.0

## As diretivas a seguir desativam redirecionamentos em requisicoes nao-GET# para um diretorio que nao contenha a barra final, para contornar# erros em alguns clientes#BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefullyBrowserMatch "^WebDrive" redirect-carefullyBrowserMatch "^WebDAVFS/1.[012]" redirect-carefullyBrowserMatch "^gnome-vfs" redirect-carefully

## Permite relatorios de status do servidor# Deve-se configurar o dominio em .example.com# Acessar http://servidor/server-status##<Location /server-status># SetHandler server-status# Order deny,allow# Deny from all# Allow from example.com#</Location>-------------------- Fim do arquivo httpd.conf --------------------

Feito isso, salve o arquivo httpd.conf e reinicie o Apache, através do seguinte comando:

# /usr/local/apache2/bin/apachectl restart

Deverá funcionar normalmente. Junto com a instalação do servidor, temos a documentação, que pode ser acessada no endereço http://ip_do_servidor/manual. É bom tê-la como referência para qualquer dúvida ou problema. Os arquivos que vêm por padrão no diretório /usr/local/apache2/htdocs podem ser removidos, e deve ser colocado neste diretório o conteúdo a ser publicado no raiz do servidor, ou seja, acessível através de http://servidor. Os usuários também podem publicar suas páginas, criando a pasta public_html em seus diretórios home e dando permissão de leitura e execução

Page 43: Servidores FreeBSD

para todos.

Faça agora o script de incialização do Apache, em /usr/local/etc/rc.d/httpd.sh. Os comandos para inicializar e finalizar são, respectivamente:

/usr/local/apache2/bin/apachectl start

e

/usr/local/apache2/bin/apachectl stop

O arquivo de log de acessos ao servidor fica em /usr/local/apache2/logs/access_log. O arquivo de log de erros é /usr/local/apache2/error_log, verifique-o para saber se está ocorrendo algum problema.

Há uma característica útil no servidor Web que é a restrição de acesso, via senha, a determinadas páginas. Uma forma de fazer isso é criar no diretório a ser protegido um arquivo chamado .htaccess, como no exemplo abaixo:

--------------- Arquivo .htaccess --------------------AuthType BasicAuthName "Acesso Restrito"AuthUserFile /home/fulano/public_html/restrito/.htpasswdRequire user fulano--------------- Fim do arquivo .htaccess --------------------

Após isso, criamos um arquivo com as senhas, chamado .htpasswd, no mesmo diretório. Isto deverá ser feito através do utilitário /usr/local/apache2/bin/htpasswd, da seguinte maneira:

# /usr/local/apache2/bin/htpasswd -c /home/fulano/public_html/restrito/.htpasswd fulano

Dessa forma, quando for acessada a página http://servidor/~fulano/restrito, será necessário o login fulano e a senha que foi configurada através do htpasswd. Deverá ser atribuído a estes arquivos (.htaccess e .htpasswd) o grupo www e a permissão 640, para que o Apache, que roda sob o grupo www, possa ler. Recomendo a leitura do HowTo "Authentication, Authorization and Access Control", encontrado em http://servidor/manual/howto/auth.html.

3.3.2 - Estatísticas de Uso do Servidor Web

* Webalizer

O Webalizer é um programa escrito em C, utilizado para gerar páginas HTML com estatísticas e gráficos de utilização do Servidor Web, a partir da análise de seu arquivo de log. O Webalizer também pode analisar arquivos de log de servidores FTP. Seu site é www.mrunix.net/webalizer.

Iremos instalar o Webalizer através do Ports. Vá até o diretório /usr/ports/portuguese/webalizer-pt_BR e execute o comando "make install". Será instalado o Webalizer e também alguns outros programas dos quais ele depende para funcionar. Após a instalação, teremos a documentação em /usr/local/share/doc/pt_BR-webalizer e um exemplo de configuração em /usr/local/share/examples/pt_BR-webalizer, que também é copiado para /usr/local/etc/pt_BR-webalizer.conf-dist. O executável ficará em /usr/local/bin/pt_BR-webalizer.

Mova o arquivo /usr/local/etc/pt_BR-webalizer.conf-dist para /usr/local/etc/pt_BR-webalizer.conf, e aplique a permissão 600. O arquivo é bastante comentado e descreve todas as opções contidas. Para maiores informações sobre os parâmetros de configuração leia o manual, através do comando "man pt_BR-webalizer". Adicione as seguintes linhas (nos devidos lugares, para manter a organização):

LogFile /usr/local/apache2/logs/access_log.webalizerOutputDir /usr/local/apache2/htdocs/webalizer-httpReportTitle Estatisticas de Uso paraHostName servteste.exemplo.orgDNSCache dns_cache.dbDNSChildren 5

Crie o diretório /usr/local/apache2/htdocs/webalizer-http, que é onde serão guardadas as análises, acessível através do endereço http://servidor/webalizer-http.

Falta ainda agendarmos no Cron para que o Webalizer seja rodado periodicamente, e para que os arquivos de log do Apache sejam rotacionados. Esta periodicidade será mensal, à meia-noite entre um mês e outro. Crie o diretório /usr/local/apache2/logs/oldlog e também crie o arquivo /usr/local/script/rotate_log_apache.sh, com a permissão 700 e o seguinte conteúdo:

-------------------- Arquivo rotate_log_apache.sh --------------------#!/bin/sh

# finaliza o Apache

Page 44: Servidores FreeBSD

/usr/local/apache2/bin/apachectl stop

# Define os nomes para arquivamentoOLD_ACCESS_LOG=/usr/local/apache2/logs/oldlog/access_log.`date +%y%m%d-%H%M%S`OLD_ERROR_LOG=/usr/local/apache2/logs/oldlog/error_log.`date +%y%m%d-%H%M%S`

# faz uma cópia para ser analisadacp /usr/local/apache2/logs/access_log /usr/local/apache2/logs/access_log.webalizer

# move os arquivos para o diretorio de arquivamentomv /usr/local/apache2/logs/access_log `echo $OLD_ACCESS_LOG`mv /usr/local/apache2/logs/error_log `echo $OLD_ERROR_LOG`

# inicializa o Apache/usr/local/apache2/bin/apachectl start

# compacta os arquivados/usr/bin/gzip $OLD_ACCESS_LOG/usr/bin/gzip $OLD_ERROR_LOG

# apaga os logs com mais de um anofind /usr/local/apache2/logs/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_apache.sh --------------------

Edite o arquivo /etc/crontab e adicione as seguintes linhas:

# Rotaciona os logs do Apache e roda o Webalizer0 0 1 * * root /usr/local/script/rotate_log_apache.sh30 0 1 * * root /usr/local/bin/pt_BR-webalizer -Q

Isto fará com que o script de rotação dos logs seja acionado à meia-noite do primeiro dia do mês, separando os logs de cada mês em arquivos diferentes. Após 30 minutos, será acionado o Webalizer, que irá fazer a análise e irá gerar as páginas com as estatísticas. Este tempo de 30 minutos é dado porque pode ocorrer de o servidor possuir mais tarefas importantes para a a meia-noite, então o Webalizer não irá prejudicá-las.

3.4 -Serviços de Autenticação e Compartilhamento de Arquivos

3.4.1 - FTP (File Transfer Protocol)

* ProFTPD

O ProFTP nasceu do desejo de seus criadores de um servidor FTP seguro e altamente configurável. Possui um bom desempenho e é utilizado em sites de grande tráfego, como ftp.kernel.org, ftp.samba.org e SourceForge. Sua página é www.proftpd.org.

Efetue o download do source da última versão do ProFTPD. Atualmente, é a 1.2.9, faremos o download do arquivo ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.9.tar.gz. Descompacte e extraia no diretório /tmp, será criado o diretório /tmp/proftpd-1.2.9 com os arquivos extraídos.

Crie um grupo chamado ftp com gid 120, e um usuário ftp com uid e gid 120:

# pw group add ftp -g 120# pw user add ftp -c "ProFTPD" -d "/nonexistent" -s "/sbin/nologin" -u 120 -g 120

Deverá ser definido e criado o diretório que irá abrigar os arquivos e diretórios do nosso FTP anônimo, no nosso caso criamos o diretório /usr/ftp. Deve-se atribuir o dono ftp e grupo ftp a este diretório, assim como a todos os arquivos que forem publicados abaixo dele posteriormente:

# mkdir /usr/ftp# chown ftp:ftp /usr/ftp

Vá até o diretório /tmp/proftpd-1.2.9. Leia os arquivos README e INSTALL. Execute a seguinte seqüência de comandos:

# ./configure# make# make install

Isto irá configurar os fontes para a compilação de acordo com o ambiente, compilar e então instalar.

O ProFTPD possui apenas um arquivo de configuração, que fica em /usr/local/etc/proftpd.conf. No momento da instalação, é instalada neste local uma cópia do basic.conf, que é um dos exemplos de configurações. Mesmo para um

Page 45: Servidores FreeBSD

funcionamento básico, temos que fazer algumas modificações.

Altere os parâmetros

<Anonymous ~ftp>User nobodyGroup nogroup

para

<Anonymous /usr/ftp>User ftpGroup ftp

Além disso, logo abaixo, insira a seguinte linha:

RequireValidShell off

Feitas essas alterações, o servidor FTP já pode ser inicializado e testado. Inicie-o digitando /usr/local/sbin/proftpd, e verifique se está rodando através do comando

# ps aux | grep proftpd

Teste o serviço, logando tanto com um usuário e senha comuns quanto anonimamente, através do login ftp ou anonymous. Deverá estar funcionando normalmente, mas ainda temos algumas configurações a fazer.

Uma boa documentação acerca da configuração do ProFTPD pode ser encontrada no seu site. Uma página muito útil é a descrição de todas as diretivas possíveis no arquivo proftpd.conf, e pode ser encontrada em http://www.proftpd.org/docs/directives/linked/by-name.html.

Para que o ProFTPD leia novamente seu arquivo de configuração, caso este seja modificado, é necessário enviar o sinal HUP, com o comando

# killall -HUP proftpd

Segue abaixo um arquivo de configuração comentado que pode ser utilizado como base para a sua configuração.

------------------- Arquivo proftpd.conf --------------------# proftpd.conf

# Arquivo exibido no momento da conexaoDisplayConnect /usr/local/etc/proftpd.banner

# Nao exibe informacoes sobre que tipo de servidor esta rodandoServerIdent off

# Modo no qual o servidor ira rodar (standalone ou inetd)ServerType standalone

# Como nao temos VirtualHosts, este servidor (principal) sera o padraoDefaultServer on

# Porta para o socket de controlePort 21

# Umask padrao para arquivos uploadedUmask 022

# Maximo de processos filho (cada conexao utiliza um processo)MaxInstances 30

# Maximo de usuarios autenticados (incluindo anonimos) e mensagemMaxClients 20 "Desculpe, o numero maximo de clientes foi atingido"

# Maximo de usuarios autenticados (incluindo anonimos) por IPMaxClientsPerHost 4 "Desculpe, maximo de 4 conexoes por cliente"

# Usuario sob o qual o servidor ira rodarUser ftp

# Grupo sob o qual o servidor ira rodarGroup ftp

# Os usuarios nao poderao sair de seu diretorio home (chrooted)DefaultRoot ~

# Nao permite o login do usuario root

Page 46: Servidores FreeBSD

RootLogin off

# Nao requer que os usuarios tenham um shell valido (definido# em /etc/shells)RequireValidShell off

# Nao bloqueia usuarios baseando-se no arquivo /etc/ftpusersUseFtpUsers off

# Tempo maximo em segundos para login TimeoutLogin 120

# Tempo maximo em segundos conectado mas sem qualquer comando ou# troca de dadosTimeoutIdle 600

# Tempo maximo em segundos sem transferencia de dados (arquivos,# listagens de diretorios)TimeoutNoTransfer 900

# Tempo maximo em segundos com uma transferencia parada, travadaTimeoutStalled 900

# Numero maximo de tentativas de loginMaxLoginAttempts 3

# Nao tenta descobrir o hostname do clienteUseReverseDNS off

# Nao tenta efetuar consulta do username remoto (ident - RFC1413)IdentLookups off

# Arquivo de log geralSystemLog /var/log/proftpd/system.log

# Arquivo de log das transferenciasTransferLog /var/log/proftpd/transfer.log

# Especifica o modo de transferencia padrao (ascii ou binary)DefaultTransferMode binary

# Permite que arquivos sejam sobrescritos (caso seja feito upload# de um arquivo ja existente)AllowOverwrite on

# Abre o contexto de usuarios anonimos, especificando a raiz do# FTP anonimo<Anonymous /usr/ftp>

# Usuario sob o qual cada instancia de FTP anonimo deve rodar User ftp

# Grupo sob o qual cada instancia de FTP anonimo deve rodar Group ftp

# Define o login anonymous como sinonimo (alias) do login ftp UserAlias anonymous ftp

# Numero maximo de usuarios anonimos MaxClients 10

# Limita qualquer gravacao neste contexto (por exemplo upload # de arquivo) <Limit WRITE> DenyAll </Limit>

# Fecha o contexto de usuarios anonimos</Anonymous>------------------- Fim do arquivo proftpd.conf --------------------

O conteúdo do arquivo proftpd.banner fica a seu critério, pode ser utilizada uma simples identificação como "Servidor FTP Exemplo". Crie o diretório /var/log/proftpd, para que sejam armazenados aí os arquivos de log.

Page 47: Servidores FreeBSD

Teste essa nova configuração, deverá funcionar normalmente. Verifique também regularmente os arquivos de log do ProFTPD, principalmente em caso de qualquer problema.

Temos ainda alguns utilitários que permitem verificar o que anda acontecendo com o servidor FTP, em tempo real. São eles:

ftpcount -> mostra o número atual de conexões ao servidor FTPftpwho -> mostra quais usuários estão conectados atualmenteftptop -> mostra informações sobre as conexões num estilo parecido ao do comando topftpshut -> tira o servidor FTP do ar, sem encerrar seu processo. Para retornar, deve-se executar "ftpshut -R"

Os comandos ftpcount, ftpwho e ftptop utilizam um arquivo chamado Scoreboard, que registra informações sobre as sessões atuais de FTP. Este arquivo fica por padrão em /usr/local/var/proftpd/proftpd.scoreboard. Caso este arquivo seja mudado de lugar (via proftpd.conf) deverá ser especificado na linha de comando dos utilitários qual o caminho do arquivo Scoreboard. Há ainda um arquivo que guarda o PID do processo principal, e fica por padrão em /usr/local/var/proftpd.pid.

Para que o ProFTPD seja inicializado no boot e terminado no shutdown corretamente, crie um script de inicialização e shutdown em /usr/local/etc/rc.d/proftpd.sh, conforme explicado anteriormente.

O comando para inicializar deverá ser:

/usr/local/sbin/proftpd

O comando para finalizar deverá ser:

kill `cat /usr/local/var/proftpd.pid`

3.4.2 - Estatísticas de Uso do Servidor FTP

* Webalizer

Caso ainda não tenha instalado e configurado o Webalizer, consulte a seção "Estatísticas de Uso do Servidor Web" para fazê-lo. Com o Webalizer instalado e configurado, vamos alterar apenas a linha de comando usada.

Crie o diretório /usr/local/apache2/webalizer-ftp, que é onde serão guardadas as análises, acessível através do endereço http://servidor/webalizer-ftp.

O que deve ser feito agora é agendar no Cron para que o Webalizer seja rodado periodicamente, com alguns parâmetros especiais para o FTP, e para que os arquivos de log do ProFTPD sejam rotacionados. Crie o diretório /var/log/proftpd/oldlog e também crie o arquivo /usr/local/script/rotate_log_proftpd.sh, com a permissão 700 e o seguinte conteúdo:

-------------------- Arquivo rotate_log_proftpd.sh --------------------#!/bin/sh

# finaliza o ProFTPDkill `cat /usr/local/var/proftpd.pid`

# Define os nomes para arquivamentoOLD_TRANSFER_LOG=/var/log/proftpd/oldlog/transfer.log.`date +%y%m%d-%H%M%S`OLD_SYSTEM_LOG=/var/log/proftpd/oldlog/system.log.`date +%y%m%d-%H%M%S`

# faz uma cópia para ser analisadacp /var/log/proftpd/transfer.log /var/log/proftpd/transfer.log.webalizer

# move os arquivos para o diretorio de arquivamentomv /var/log/proftpd/transfer.log `echo $OLD_TRANSFER_LOG`mv /var/log/proftpd/system.log `echo $OLD_SYSTEM_LOG`

# inicializa o ProFTPD/usr/local/sbin/proftpd

# compacta os arquivados/usr/bin/gzip $OLD_TRANSFER_LOG/usr/bin/gzip $OLD_SYSTEM_LOG

# apaga os logs com mais de um anofind /var/log/proftpd/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_proftpd.sh --------------------

Edite o arquivo /etc/crontab e adicione as duas linhas abaixo:

0 0 1 * * root /usr/local/script/rotate_log_proftpd.sh0 1 1 * * root /usr/local/bin/pt_BR-webalizer -Q -o

Page 48: Servidores FreeBSD

/usr/local/apache2/htdocs/webalizer-ftp -Ff /var/log/proftpd/transfer.log.webalizer

Isto fará com que o script de rotação dos logs seja acionado à meia-noite do primeiro dia do mês, separando os logs de cada mês em arquivos diferentes. Após uma hora, ou seja, à 1h do primeiro dia de cada mês, será acionado o Webalizer.

3.4.3 - Compartilhamento de Arquivos para clientes Unix

* NFS (Network File System)

O NFS ou Network File System - sistema de arquivos em rede - permite que clientes acessem arquivos compartilhados em um servidor como se fossem arquivos locais. Com isso, podemos por exemplo guardar arquivos de instalação de programas em um servidor e acessá-los pela rede, facilitando a operação e economizando espaço em disco nos clientes. Outra aplicação prática é guardar os diretórios home dos usuários em um único servidor, e em qualquer máquina que o usuário logar-se terá os mesmos arquivos. Também pode-se compartilhar drives de CDROM ou qualquer outro dispositivo de armazenamento. O NFS foi originalmente criado pela Sun Microsystems nos anos 80, e é definido pela RFC1094.

Daemons usados pelo NFS:

nfsd - Processa os pedidos dos clientes NFS.mountd - Faz a entrega dos pedidos que o nfsd passa a ele.portmap - É o daemon portmapper, que permite que os clientes descubram que porta o servidor NFS está usando.

Para que tais daemons sejam inicializados no servidor, é necessário inserir as seguintes linhas ao arquivo /etc/rc.conf:

portmap_enable="YES"nfs_server_enable="YES"mountd_flags="-r"

No cliente, deve ser adicionada a seguinte linha ao /etc/rc.conf:

nfs_client_enable="YES"

O arquivo /etc/exports, no servidor, especifica que arquivos devem ser compartilhados com os clientes. Cada linha especifica um diretório, quem pode acessá-lo e também pode ser especificado o tipo de acesso desejado.

Por exemplo, para compartilhar o drive de CDROM com todas as máquinas da rede 192.168.0.0/16, a seguinte linha deve ser inserida:

/cdrom -ro -network 192.168 -mask 255.255.0.0

O parâmetro -ro especifica a permissão read-only, ou somente leitura.

Para compartilhar o /home para as máquinas 192.168.0.2, 192.168.0.3 e 192.168.0.4, insira a seguinte linha:

/home 192.168.0.2 192.168.0.3 192.168.0.4

Para compartilhar o diretório /teste para a máquina 192.168.0.5 e deixar ela acessar esse diretório como root (se o root na máquina cliente montar o /teste do servidor poderá acessá-lo com todos os poderes de root), basta inserir a seguinte linha:

/teste -maproot=root 192.168.0.5

Para compartilhar os diretórios /usr/src e /usr/ports com a máquina teste.exemplo.org, insira a seguinte linha:

/usr/src /usr/ports teste.exemplo.org

Para compartilhar o diretório /teste2 com todo mundo e dar permissão de somente leitura, adicione a seguinte linha:

/teste2 -ro

Com esses exemplos, pode-se ter uma boa idéia de qual é o formato do arquivo /etc/exports. Para maiores detalhes, veja o manual com o comando "man exports".

Depois de configurar o NFS, é necessário reiniciar a máquina. Se apenas foi modificado o arquivo /etc/exports, basta reiniciar o mountd para que as alterações entrem em vigor:

# kill -HUP `cat /var/run/mountd.pid`

ou simplesmente

# killall -HUP mountd

Para montar um diretório compartilhado, utiliza-se no cliente o comando mount, no seguinte formato:

# mount servidor:/compartilhamento /mountpoint

Page 49: Servidores FreeBSD

Por exemplo, para montar o /home do servidor 192.168.0.1 no diretório /mnt local, basta digitar:

# mount 192.168.0.1:/home /mnt

Se for necessário que algum compartilhamento seja montado automaticamente no cliente, no momento da inicialização, basta adicioná-lo ao arquivo /etc/fstab. Seguindo o mesmo exemplo acima, deveríamos adicionar a seguinte linha ao /etc/fstab:

192.168.0.1:/home /mnt nfs rw 0 0

Para maiores detalhes do formato do arquivo, man fstab.

Há um utilitário para visualizar estatísticas sobre as atividades do servidor NFS, fica em /usr/bin/nfsstat. Ele mostra um relatório bem detalhado se invocado sem parâmetros. Se for utilizado o comando "nfsstat -w 2" teremos um relatório resumido, e será atualizado a cada 2 segundos, constatemente (obviamente o valor pode ser alterado).

3.4.4 - Autenticação para clientes Unix

* NIS (Network Information Services)

O NIS (Network Information Services), também conhecido como YP (Yellow Pages), foi desenvolvido pela Sun Microsystems para centralizar a administração de máquinas com o sistema operacional SunOS. Com o tempo, tornou-se um padrão entre os sistemas Unix Like, servindo geralmente para compartilhar entre várias máquinas informações como contas de usuários, grupos, nomes de máquinas etc.

* Configuração do Servidor

O FreeBSD possui suporte nativo ao NIS, bastando configurá-lo, sem ter que instalar nada adicional. Para isso, adicione as seguintes linhas ao arquivo /etc/rc.conf:

portmap_enable="YES"nisdomainname="teste-nis"nis_server_enable="YES"nis_yppasswd_enable="YES"

Com a primeira linha, confirmamos que o portmap estará rodando, pois o NIS utiliza RPC. O parâmetro "nisdomainname" especifica o nome do domínio NIS, que deve preferencialmente ser diferente do domínio do hostname. Pode-se configurar o nome que achar mais adequado, mas não deve ser confundido com o que chamamos simplesmente de domínio: o que tratamos agora é o "domínio NIS". O parâmetro "nis_yppasswd_enable" permite que os usuários troquem suas senhas a partir das máquinas clientes. Após isso, reinicie a máquina.

Passamos agora a configurar o NIS. Os arquivos dos quais ele busca as informações são chamados "NIS maps", e são guardados no diretório "/var/yp". Estes arquivos são gerados a partir de alguns arquivos de configuração que estão no diretório "/etc", exceto um, que deve ser ajustado manualmente, que é o "master.passwd".Vá até o diretório /var/yp e copie para lá o arquivo /etc/master.passwd. Após isso, edite o arquivo (/var/yp/master.passwd) e remova todas as contas administrativas, que não deverão ser propagadas aos clientes, como por exemplo root, bin, tty, games etc. O arquivo "/var/yp/master.passwd" deverá ter a permissão 600.Execute o seguinte comando:

# ypinit -m teste-nis

O "ypinit" é um utilitário que inicializa os "NIS maps". O parâmetro -m indica que estamos configurando um servidor mestre (master). Serão apresentadas algumas informações e então uma linha com o seguinte:

master server : servteste

Ao invés de servteste deverá constar o hostname do seu servidor. Pressione Ctrl+D e então enter. O ypinit irá criar o arquivo /var/yp/Makefile. Este arquivo possui toda a configuração do NIS, sendo que assume por padrão que os clientes serão apenas FreeBSD. Caso haja algum Linux, deve-se editar o arquivo e descomentar a seguinte linha:

UNSECURE = "True"

Crie agora o arquivo /var/yp/securenets, com o seguinte conteúdo:

127.0.0.1 255.255.255.255192.168.0.0 255.255.0.0

Este arquivo é uma lista de endereços de rede, espaço em branco, e a máscara de rede. As redes que forem especificadas

Page 50: Servidores FreeBSD

são as autorizadas a utilizar o serviço NIS, ou seja, ninguém com endereço IP fora das especificadas conseguirá fazer uso do serviço. Isto visa restringir o acesso ao servidor, e se o arquivo securenets não for criado o acesso ficará liberado para todos, o que pode gerar problemas de segurança.

Terminadas estas etapas, temos um servidor NIS funcionando e capaz de autenticar os clientes. Um detalhe importante: toda vez que for modificada ou adicionada uma nova conta no sistema, deve-se executar a seguinte linha de comando:

# cd /var/yp ; make teste-nis

Isto irá recriar os "NIS maps", e sem isso o usuário recém-criado não conseguirá logar nas máquinas clientes.

* Configuração dos Clientes (FreeBSD)

Edite o arquivo /etc/rc.conf e adicione as seguintes linhas:

portmap_enable="YES"nisdomainname="teste-nis"nis_client_enable="YES"

Edite o arquivo /etc/master.passwd, através do comando "vipw", e adicione a seguinte linha ao final do arquivo:

+:::::::::

Edite o arquivo /etc/group e adicione a seguinte linha ao final do arquivo:

+:*::

Edite o arquivo /etc/hosts e adicione um sinal de "+" em uma linha em branco no final do arquivo:

+

Após isso, reinicie a máquina e teste o login com uma conta de usuário, deverá funcionar normalmente.

É interessante também que os diretórios home guardados no servidor sejam compartilhados com os clientes. Para isso, pode ser utilizado o NFS, adicionando no arquivo /etc/exports do servidor uma linha que compartilha o /home e adicionando no arquivo /etc/fstabs, nos clientes, uma linha que monta o /home. Deverá ser criado o diretório /home nos clientes, para que nele seja montado o /home do servidor.Como as permissões e propriedade dos arquivos serão mantidas, e os UIDs e GIDs serão os mesmos, pois são resgatados via NIS, o usuário que logar em uma máquina cliente terá acesso de forma transparente a apenas seus arquivos, como se estivesse logando no servidor.

3.4.5 - Autenticação e Compartilhamento de Arquivos para clientes Windows

* Samba

O Samba (www.samba.org) é o serviço que promove a integração entre sistemas Unix e Windows em uma rede. Trabalha com o protocolo SMB, o qual o Windows utiliza nativamente, possibilitando desta forma que tenhamos um ambiente com ambas as plataformas interagindo. O Samba foi originalmente criado por Andrew Tridgell, em 1991. Nosso foco será utilizar o Samba como controlador de domínio, servidor de arquivos e autenticação de clientes Windows.SMB significa Server Message Block, e é o protocolo utilizado pelos sistemas Windows para comunicação e compartilhamento de recursos via rede. O Samba utiliza SMB sobre TCP para compartilhamento de arquivos e UDP para browsing. A Microsoft utiliza no Windows 2000 em diante uma versão melhorada do protocolo SMB, chamada CIFS - Common Internet File System, que também é suportada pelo Samba.

Faça o download do source da última versão estável do Samba, através de algum dos mirrors listados no site. O arquivo tem o nome samba-latest.tar.gz. Pode-se fazer o download a partir de http://us1.samba.org/samba/ftp/samba-latest.tar.gz. A versão atual é 3.0.1. Descompacte o arquivo no /tmp, será criado o diretório samba-3.0.1, acesse-o. Execute os seguintes comandos:

# cd source# ./configure# make# make install

O Samba será instalado em /usr/local/samba. Temos apenas dois daemons, o smbd e o nmbd, que ficam em /usr/local/samba/sbin. O smbd é o responsável por controlar os compartilhamentos de arquivos assim como autenticação e autorização dos clientes. O nmbd auxilia com o browsing da rede e trabalha com NetBIOS (Network Basic Input/Output System) e WINS.

Como os executáveis do Samba são instalados em um diretório diferente do padrão, deve ser ajustado o valor da variável PATH. Para isso, edite o arquivo /root/.profile ou /root/.bash_profile e insira no final da linha iniciada por "PATH" o seguinte valor:

Page 51: Servidores FreeBSD

:/usr/local/samba/bin:/usr/local/samba/sbin

Junto com o Samba é instalado o SWAT, que significa Samba Web Administration Tool. Como o próprio nome diz, é uma ferramenta para configurar o Samba a partir de qualquer navegador. Para habilitar esta ferramenta, basta inserir ou ajustar a seguinte linha no arquivo /etc/inetd.conf:

swat stream tcp nowait/400 root /usr/local/samba/sbin/swat swat

Após isso, reinicie o inetd, através do comando "killall -HUP inetd". O SWAT pode ser acessado a partir do endereço http://servidor:901, então entre com o login e senha do root. Se o SWAT não for utilizado é recomendado deixá-lo desativado, para evitar qualquer problema se segurança.

As portas utilizadas pelo Samba são:

netbios-ns 137/udp # NETBIOS Name Servicenetbios-dgm 138/udp # NETBIOS Datagram Servicenetbios-ssn 139/tcp # NETBIOS Session Servicemicrosoft-ds 445/tcp # Microsoft-DS

O arquivo de configuração do Samba chama-se smb.conf, e fica no diretório /usr/local/samba/lib. Possui muitas opções, possibilitando inúmeras configurações diferentes, cada uma atendendo ao propósito do servidor que está sendo configurado. Todas opções e variáveis são bem explicadas na sua man page, acessível pelo comando "man smb.conf". Segue abaixo um arquivo exemplo utilizado nesta instalação, adapte o que for necessário:

-------------------- Arquivo smb.conf --------------------# smb.conf

# Contexto geral.[global]

# Nome NetBIOS do servidor.netbios name = SERVTESTE

# Nome do domínio.workgroup = TESTE

# Descricao do servidor.server string = Servidor de Arquivos

# Interfaces de rede.interfaces = 192.168.0.10, 127.0.0.1

# Limita o Samba a utilizar somente as interfaces mencionadas# acima.bind interfaces only = yes

# Hosts permitidos a conectar.hosts allow = 192.168.0.0/255.255.0.0, 127.

# Opcoes de socket, para ajuste das conexoes em camada de rede.socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE

# Nivel de "auto-propaganda" na eleicao de controlador# de dominio.os level = 33

# O servidor eh o preferido na eleicao para controlador# de dominio.preferred master = Yes

# Permitir logon no domínio de maqs Win9x.domain logons = Yes

# Diretorio home que sera mapeado quando alguma maq. logar# no dominio. O valor da variavel %U sera o nome de usuario# da sessao.logon home = \\servteste\%U

# Unidade a qual mapear o diretorio home. Usado apenas em WinNT.logon drive = L:

# Local onde os perfis ambulantes sao armazenados. Se deixado# em branco ira desabilitar os perfis. Podem ser utilizadas# variaveis.

Page 52: Servidores FreeBSD

logon path =

# Script executado quando o usuario logar.logon script = %U.bat

# Usuario(s) administrador do dominio.admin users = root

# Local do arquivo de senhas do Samba.smb passwd file = /usr/local/samba/private/smbpasswd

# Quando trocar a senha do Samba trocar a do sistema tambem.unix password sync = Yes

# Programa utilizado para troca a senha do sistema.passwd program = /usr/bin/passwd %u

# Dialogo para a troca de senha do sistema. A variavel %n sera# a nova senha.passwd chat = *New*password* %n\n *Retype*password* %n\n *done*

# Utilizar senhas encriptadas no login.encrypt passwords = Yes

# Nivel de log (0-10). Quanto maior mais informacoes# serao logadas.log level = 1

# Tamanho maximo em KB de cada arquivo de log.max log size = 2048

# Arquivo de log. A variavel %m sera o nome da maq. cliente.log file = /var/log/samba/log.%m

# Funcionar como servidor de hora para clientes Windows.time server = Yes

# Mascara da permissoes dos arquivos criados pelos clientes.create mask = 0660

# Mascara das permissoes dos diretorios criados pelos clientes.directory mask = 0770

# Arquivos ou diretorios ignorados nos compartilhamentos.veto files = /mail/

# Pagina de codigos utilizada pelo servidor.unix charset = CP850

# Pagina de codigos utilizada nas mensagens do Samba.display charset = CP850

# Compartilhamento dos diretorios home.[homes]

# Comentario, descricao.comment = Diretorio Pessoal

# Ajuste "No" para permitir gravacao.read only = No

# Nao ira ser anunciado no dominio.browseable = No

# Compartilhamento Netlogon[netlogon]

# Caminho no servidor.path = /usr/local/samba/lib/netlogon

# Permite usuarios anonimos.guest ok = Yes

browseable = No

Page 53: Servidores FreeBSD

# Compartilhamento utilizado, caso habilitado acima,# para os perfis ambulantes.[profiles]

# A variavel %H sera o diretorio home do usuario.path = /%H/Perfil

read only = Noguest ok = Yesbrowseable = No

# Compartilhamento do CD-ROM do servidor.[cdrom]comment = Drive CD-ROMpath = /cdromguest ok = Yes-------------------- Fim do arquivo smb.conf --------------------

De acordo com esta configuração, os logs serão armazenados em /var/log/samba, então este diretório deverá ser criado manualmente. O arquivo de log do smbd será log.smbd, o do nmbd será log.nmbd e para cada máquina cliente será criado um arquivo no formato log.hostname. O tamanho máximo destes arquivos será 2 MB, quando este limite for excedido o arquivo atual será renomeado com a extensão ".old", e será criado um novo arquivo. Se já houver outro ".old", este será excluído.

Com esta configuração, o nosso servidor será o PDC (Primary Domain Controller) para o domínio TESTE. Para cada máquina ou usuário que irá participar deste domínio, deve ser cadastrada uma conta no sistema e também uma conta no Samba.

Adicione um grupo para as contas de máquinas no sistema, com o nome "maquinas", ou qualquer outro:

# pw group add maquinas -g 160

Para adicionar as contas de máquinas, utilize os seguintes comandos:

# pw user add maquina1$ -c "Conta de Maquina" -d "/nonexistent" -s "/sbin/nologin" -g 160# smbpasswd -a -m maquina1

Note que as contas de máquinas no sistema devem ser cadastradas com o hostname da máquina cliente seguido de cifrão ($). O parâmetro "-a", no smbpasswd, especifica que estamos fazendo um novo cadastro. Já o "-m" indica que estamos cadastrando uma conta de máquina.

Os cadastros de usuários são feitos da mesma forma como sempre, no sistema. Apenas deve-se cadastrar a senha de usuário do domínio com o comando smbpasswd, da seguinte forma:

# smbpasswd -a usuario1

Insira a senha do usuário, que será posteriormente utilizada para login nas máquinas clientes.

Para inserir as máquinas clientes no domínio, deve-se proceder da mesma forma como se fosse um PDC Windows. Quando solicitada uma conta de administração do domínio, deve-se inserir login e senha do root. Há apenas uma ressalva no Windows XP, deve-se editar o registro e alterar o valor de duas chaves, ou apenas executar o arquivo abaixo:

-------------------- Arquivo winxp.reg --------------------Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters] "requiresignorseal"=dword:00000000"signsecurechannel"=dword:00000000-------------------- Fim do arquivo winxp.reg --------------------

3.4.6 - Controle de Uso de Disco

* Quota

"Quotas" é uma característica do sistema que permite definir quotas para cada usuário, visando limitar o espaço ocupado em disco em um determinado filesystem. Isso é essencial visto que previne a má utilização dos recursos assim como o provável esgotamento antecipado do espaço em disco.Para configurar o sistema de quotas não é necessário instalar nada, é uma característica nativa do sistema. É preciso apenas habilitar no kernel, configurar para que os filesystems desejados suportem quotas e aplicá-las às contas de usuários.

Page 54: Servidores FreeBSD

Edite o arquivo de configuração do kernel e adicione a seguinte linha:

options QUOTA

Após isso, compile o kernel e reinstale-o. Esta tarefa está explicada na seção Recompilação e Instalação do Kernel.

Edite o arquivo /etc/rc.conf e adicione as linhas abaixo:

enable_quotas="YES"check_quotas="NO"

Iremos desabilitar o "check_quotas" pois se habilitado será executado o programa quotacheck no momento da inicialização do sistema. Este programa confere a integridade da base de dados de quotas em relação ao que está no disco, o que seria bom, mas o ponto negativo é que em sistemas com vários usuários e arquivos irá demorar bastante tempo para fazer a verificação.

Deverá ser definido em quais filesystems iremos habilitar o controle de quotas. Neste exemplo, iremos habilitar no filesystem que guarda os diretórios home dos usuários (por exemplo /home), para limitar o espaço ocupado por seus arquivos, assim como pelas pastas de e-mails guardados, enviados etc, e no filesystem que guarda a caixa de entrada de e-mails (por exemplo /var). Para isso, edite o arquivo /etc/fstab e adicione o parâmetro "userquota" nas entradas dos respectivos filesystems:

/dev/ad0s1f /home ufs rw,nosuid,userquota 2 2

/dev/ad0s1g /var ufs rw,nosuid,userquota 2 2

Agora reinicie a máquina. Execute o comando "quotacheck -a", para que seja criado o arquivo quotas.user, que armazena a base de dados de quotas, na raiz de cada filesystem com suporte a quotas. O controle de quotas estará ativado, mas ainda não foi definido nenhum limite para os usuários.

A quota de cada usuário pode ser verificada através do comando "quota -u username", e editada através do comando "edquota -u username". Pode-se limitar tanto o número de blocos utilizados (blocks) quanto o número de arquivos criados (inodes), no entanto geralmente a maior utilidade é limitar o número de blocos, o que se traduz por espaço ocupado. Lembre-se que cada bloco corresponde a 1 KB.

Temos dois tipos de limites: hard e soft. O limite hard não pode ser excedido, em nenhuma circunstância, ou seja, assim que o usuário atingir este limite não poderá alocar mais nenhum bloco no disco. Já o limite soft pode ser excedido, por determinado tempo. Este limite de tempo se chama "grace period", e é de uma semana por padrão. Se o usuário ultrapassar o limite soft, após o grace period este limite soft será transformado em um limite hard, e o usuário não poderá fazer mais nenhuma alocação. Assim que o usuário voltar abaixo do limite soft, a contagem do grace period é resetada.Para editar as quotas do usuário fulano, utilize o comando "edquota -u fulano". Para cada filesystem haverá duas linhas, uma com o limite de blocks e outra com o limite de inodes. Para mudar qualquer limite, simplesmente altere o valor, salve e saia do editor, o novo limite entrará em vigor imediatamente. Um limite com o valor 0 (zero) significa sem limite.

Exemplos:

Impor um limite hard de 10 MB no diretório home e 5 MB na caixa de entrada do e-mail para o usuário fulano:

# edquota -u fulano

Quotas for user fulano:/home: kbytes in use: 418, limits (soft = 0, hard = 0)inodes in use: 2, limits (soft = 0, hard = 0)/var: kbytes in use: 384, limits (soft = 0, hard = 0)inodes in use: 2, limits (soft = 0, hard = 0)

alterar para

Quotas for user fulano:/home: kbytes in use: 418, limits (soft = 0, hard = 10000)inodes in use: 2, limits (soft = 0, hard = 0)/var: kbytes in use: 384, limits (soft = 0, hard = 5000)inodes in use: 2, limits (soft = 0, hard = 0)

Verificar as quotas para o usuário fulano:

# quota -u fulanoDisk quotas for user fulano (uid 4123):Filesystem usage quota limit grace files quota limit grace

Page 55: Servidores FreeBSD

/home 418 0 10000 3 0 0/var 384 0 5000 2 0 0

Alterar as quotas do usuário fulano para um limite soft de 10 MB no /var e 50 MB no /home e um limite hard de 12 MB no /var e 60 MB no /home:

# edquota -u fulano

Quotas for user fulano:/home: kbytes in use: 418, limits (soft = 0, hard = 10000)inodes in use: 3, limits (soft = 0, hard = 0)/var: kbytes in use: 384, limits (soft = 0, hard = 5000)inodes in use: 2, limits (soft = 0, hard = 0)

alterar para

Quotas for user fulano:/home: kbytes in use: 418, limits (soft = 50000, hard = 60000)inodes in use: 3, limits (soft = 0, hard = 0)/var: kbytes in use: 384, limits (soft = 10000, hard = 12000)inodes in use: 2, limits (soft = 0, hard = 0)

Como pode-se ver o processo é muito simples. O problema é quando o número de usuários é grande, tornando impossível gerenciar manualmente as quotas para cada um. Pode ser criado um script em shell para gerenciar isso, utilizando-se dos recursos do comando edquota, ou apenas utilizando os mesmos recursos via linha de comando.Os principais recursos do edquota para isso são a cópia de quotas de um usuário para outro(s) e a definição não-interativa das quotas. Exemplos:

Copiar as quotas do usuário fulano para o usuário beltrano:

# edquota -p fulano beltrano

Copiar as quotas do usuário fulano para todos os usuários com UIDs entre 2000 e 10000:

# edquota -p fulano 2000-10000

Definir as quotas dos usuários fulano e beltrano para um limite soft de 5 MB no /var e 50 MB no /home e um limite hard de 6 MB no /var e 55 MB no /home:

# edquota -e /var:5000:6000 -e /home:50000:55000 fulano beltrano

Definir as quotas acima para todos os usuários com UIDs entre 2000 e 10000:

# edquota -e /var:5000:6000 -e /home:50000:55000 2000-10000

Remover os limites do usuário beltrano para o seu diretório home:

# edquota -e /home:0:0 beltrano

Para alterar o "grace period" deve ser utilizado o comando "edquota -t", o período pode ser definido independentemente para cada filesystem com suporte a quotas. Se especificado o período 0 (zero), será utilizado o padrão, que é 7 dias. Se especificado o período de um segundo, não haverá "grace period", ou seja, qualquer "soft limit" será entendido como "hard limit".

3.4.7 - Antivírus

* ClamAV

Nosso escopo nesta seção será ter um antivírus funcionando e automatizar, através de um script em shell, a tarefa de varredura dos arquivos armazenados no servidor, em essencial os diretórios home dos usuários.O antivírus que será utilizado é o ClamAV - Clam AntiVirus. É escrito na linguagem C e possui licensa GPL. O ClamAV não limpa os arquivos infectados, apenas detecta. Seu site é www.clamav.net. Caso já tenha o ClamAV instalado e funcionando, ignore a parte de instalação e configuração do mesmo abaixo, e vá direto para a "Automatização da varredura"

* Instalação e configuração do ClamAV

Page 56: Servidores FreeBSD

Para instalar o ClamAV é necessário adicionar um grupo e um usuário chamados clamav, da seguintes forma:

# pw group add clamav -g 130# pw user add clamav -c "Clam AntiVirus" -d "/nonexistent" -s "/sbin/nologin" -u 130 -g 130

Efetue o download da última versão estável a partir de seu site, atualmente é a 0.65, disponível em http://unc.dl.sourceforge.net/sourceforge/clamav/clamav-0.65.tar.gz. Descompacte este arquivo no diretório /tmp, será criado o diretório clamav-0.65, acesse-o. Digite os seguintes comandos:

# ./configure# make# make install

Os executáveis serão instalados em /usr/local/bin e /usr/local/sbin, e o arquivo de configuração fica em /usr/local/etc/clamav.conf. Crie ainda o diretório /var/clamav, com dono clamav e permissão 700, e também o diretório /var/log/clamav. Copie o arquivo de configuração abaixo para /usr/local/etc/clamav.conf. Para maiores detalhes, consulte "man clamav.conf".

-------------------- Arquivo clamav.conf --------------------# clamav.conf

# Arquivo de log.LogFile /var/log/clamav/clamd.log

# Para permitir multiplas instancias com o mesmo arquivo de log# descomente a linha abaixo.#LogFileUnlock

# Tamanho maximo em bytes do arquivo de log. O valor 0 eh ilimitado.LogFileMaxSize 0

# Coloca data e hora em cada linha do log.LogTime

# Usar o Syslog.#LogSyslog

# Aumenta o detalhamento do log.#LogVerbose

# Caso desejado salvar o PID em arquivo.#PidFile /var/run/clamd.pid

# Diretorio contendo arquivos .db.DataDirectory /usr/local/share/clamav

# Caminho para o socket local.LocalSocket /var/clamav/clamd

# Remove sockets travados.FixStaleSocket

# Porta TCP.#TCPSocket 3310

# Endereco IP. A linha abaixo fornece alguma protecao, ja# que iremos trabalhar apenas localmente.TCPAddr 127.0.0.1

# Tamanho maximo da fila de conexoes pendentes.#MaxConnectionQueueLength 30

# Stream de entrada sera salvo no disco antes de ser scanneado.#StreamSaveToDisk

# Limite de tamanho do STREAM. Se excedido fecha a conexao.#StreamMaxLength 10M

# Numero maximo de threads simultaneas. O padrao eh 5.MaxThreads 20

# Tempo maximo em segs para cada thread. O padrao eh 180.#ThreadTimeout 500

Page 57: Servidores FreeBSD

# Profundidade maxima de varredura de diretorios.MaxDirectoryRecursion 50

# Segue links simbolicos de diretorios.#FollowDirectorySymlinks

# Segue links simbolicos de arquivos.#FollowFileSymlinks

# Intervalo em segs entre cada verificacao da integridade interna.# O padrao eh 3600.#SelfCheck 600

# Comando executado quando um virus eh encontrado.# Nao deve ser usado para deletar ou mover arquivos.# %v = nome do virus / %f = nome do arquivo#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %f: %v"

# Usuario sob o qual ira rodar.User clamav

# Habilita grupos adicionais se o usuario clamav participar de algum.#AllowSupplementaryGroups

# Nao roda em background. Util para debug.#Foreground

# Habilita mensagens de debug.#Debug

# Descomentar a linha abaixo se for varrer arquivos de e-mail.#ScanMail

# Comentar a linha abaixo para desabilitar a varredura de arquivos.ScanArchive

# Suporte a arquivos compactados RAR.#ScanRAR

# Tamanho maximo de arquivo scanneado. O valor 0 eh ilimitado.ArchiveMaxFileSize 50M

# Recursao maxima em arquivos compactados (um dentro do outro).ArchiveMaxRecursion 10

# Numero maximo de arquivos dentro de algum compactado.ArchiveMaxFiles 1000

# Limita a memoria para descompressao bzip2.#ArchiveLimitMemoryUsage-------------------- Fim do arquivo clamav.conf --------------------

Após isso, teste o ClamAV através do scanner de linha de comando, executando o seguinte:

# clamascan -r /usr/originais/clamav-0.65.tar.gz

Deverá aparecer a seguinte linha:

/usr/originais/clamav-0.65.tar.gz: ClamAV-Test-Signature FOUND

Este scanner de linha de comando (clamscan) é o programa que iremos utilizar para fazer a varredura nos arquivos. O daemon (clamd) não será utilizado para esta tarefa.

Após isso, devemos configurar o sistema de atualização automática. Prepare o arquivo de log da atualização, através dos seguintes comandos:

# touch /var/log/clamav/clam-update.log# chown clamav /var/log/clamav/clam-update.log# chmod 600 /var/log/clamav/clam-update.log

Adicione a seguinte linha ao arquivo /etc/crontab:

0 */4 * * * root /usr/local/bin/freshclam --quiet -l /var/log/clamav/clam-update.log

Page 58: Servidores FreeBSD

Isto fará com que o ClamAV seja atualizado a cada quatro horas, de acordo com a documentação do mesmo este é o período mínimo sugerido.

Crie um script para rotacionar o log do ClamAV, coloque-o em /usr/local/script/rotate_log_clamav.sh. Crie também o diretório /var/log/clamav/oldlog.

-------------------- Arquivo rotate_log_clamav.sh --------------------#!/bin/sh

# Define o nome para arquivamentoOLD_UPDATE_LOG=/var/log/clamav/oldlog/clam-update.log.`date +%y%m%d-%H%M%S`

# move o arquivo para o diretorio de arquivamentomv /var/log/clamav/clam-update.log `echo $OLD_UPDATE_LOG`

# cria novamente o arquivo de log do updatetouch /var/log/clamav/clam-update.logchown clamav /var/log/clamav/clam-update.logchmod 600 /var/log/clamav/clam-update.log

# compacta o arquivado/usr/bin/gzip $OLD_UPDATE_LOG

# apaga os logs com mais de um anofind /var/log/clamav/oldlog -mtime +365 -exec rm -f {} \;-------------------- Fim do arquivo rotate_log_clamav.sh --------------------

Edite o arquivo /etc/crontab e adicione a seguinte linha:

20 0 1 * * root /usr/local/script/rotate_log_clamav.sh

Isto fará com que o arquivo de log seja rotacionado à 0h20min do primeiro dia de cada mês.

* Automatização da varredura

Agora temos um antivírus instalado e funcionando, basta automatizar a tarefa de varredura. Para isso crie um script com o nome /usr/local/script/varredura_antivirus.sh, como o exemplo abaixo, e adapte-o para as suas necessidades. A permissão deve ser 700.

-------------------- Arquivo varredura_antivirus.sh --------------------#!/bin/sh

COMANDO="/usr/local/bin/clamscan --quiet --log=/var/log/clamav/clamscan.log --recursive --move=/var/infectados --max-files=100 --max-space=100M --max-recursion=15"

$COMANDO /home$COMANDO --mbox /var/mail-------------------- Fim do arquivo varredura_antivirus.sh --------------------

Desta forma, será feita a varredura e os arquivos infectados encontrados serão movidos para o diretório /var/infectados. Não esqueça de criar este diretório e atribuir o dono clamav. Será criado também o arquivo de log /var/log/clamav/clamscan.log.

Agende a execução deste script no Cron, para o horário que for mais conveniente. Por exemplo, para fazer a varredura todo dia às 2 horas, insira a seguinte linha no arquivo /etc/crontab:

0 2 * * * root /usr/local/script/varredura_antivirus.sh

3.4.8 - Backup

* rsync

Fazer backup e ter certeza de que ele funciona é uma das coisas mais importantes que podem ser feitas para proteger os dados armazenados em um servidor. Geralmente não se pode prever acidentes, ataques, desastres e outros tipos de eventos que irão prejudicar os dados ou o próprio hardware. Quanto ao hardware, podemos consertar, utilizar outra máquina ou mesmo receber outra do seguro, ou seja, é algo que tem preço, pode ser comprado. Já os dados e arquivos dos usuários na maioria das vezes são insubstituíveis, podendo representar anos de trabalho, e a sua perda é algo que pode parar uma empresa ou ao menos afetar muito o andamento dos processos. Aí está a importância de existir um backup recente que possa ser restaurado no caso de qualquer incidente.

A estratégia de backup adotada nesta seção é simples e barata. Temos uma segunda máquina, que será o servidor de backup, conectada via rede ao servidor do qual será feito o backup, que será denominado cliente de backup. O backup será feito no disco rígido do servidor de backup. O programa utilizado será o rsync, cuja finalidade é prover um sistema

Page 59: Servidores FreeBSD

de transferência de arquivos rápido e incremental. No primeiro backup o rsync irá copiar todos os arquivos para a máquina destino. Após isso, em cada backup ele irá apenas atualizar os arquivos que estão no backup, sincronizando-os com os originais. Desta forma são transferidos pela rede apenas as diferenças entre os arquivos original e backup, tornando o processo mais rápido. A página do rsync é rsync.samba.org.

Efetue o download do source da última versão do rsync a partir de http://samba.org/ftp/rsync/. A versão atual é 2.6.0 e seu arquivo chama-se rsync-2.6.0.tar.gz. Descompacte este arquivo no /tmp. Será criado o diretório /tmp/rsync-2.6.0, acesse-o e digite os comandos abaixo:

# ./configure# make# make install

O executável será instalado em /usr/local/bin/rsync. Remova agora o diretório /tmp/rsync-2.6.0.O rsync é um programa muito versátil, veja suas funcionalidades na sua man page (man rsync). Iremos utilizá-lo da seguinte forma: o servidor de backup irá rodar o rsync como um daemon, com módulos diferentes para cada servidor do qual se deseja fazer backup (clientes de backup). Os módulos são locais de armazenamento pré-definidos em que apenas determinado usuário e senha terão acesso. Cada cliente de backup terá agendado no seu Cron um processo rsync que irá sincronizar os arquivos originais com os arquivos do seu módulo no servidor de backup.O rsync deverá ser instalado no servidor de backup e também em cada cliente.

* Configuração no servidor de backup

No servidor de backup, crie o arquivo /usr/local/etc/rsyncd.conf, seguindo e adaptando o exemplo abaixo. A man page deste arquivo é acessível através de "man rsyncd.conf".

-------------------- Arquivo rsyncd.conf --------------------# rsyncd.conf

# Usuario sob o qual o rsync ira rodar.uid=root

# Grupo sob o qual o rsync ira rodar.gid=wheel

# Arquivo de log.log file = /var/log/rsyncd.log

# Modulo para o servidorz.[servidorz]

# Caminho onde fica o espaco para este modulo.path = /backup/servidorz

# Usuario(s) autorizado(s).auth users = servidorzbak

# Arquivo de senhas.secrets file = /usr/local/etc/rsyncd.secrets

# Permitir gravacao.read only = false

# Nao incluir este modulo quando solicitada a listagem.list = false

# Hosts permitidos a conectar. Especificar o IP do # cliente de backup.hosts allow = 10.2.3.4

# Modulo para o servidorb.[servidorb]path = /backup/servidorbauth users = servidorbbaksecrets file = /usr/local/etc/rsyncd.secretsread only = falselist = falsehosts allow = 10.5.6.7-------------------- Fim do arquivo rsyncd.conf --------------------

Para cada "path" especificado deverá ser criado o diretório correspondente. Neste exemplo, devemos criar manualmente os diretórios /backup, /backup/servidorz e /backup/servidorb, e atribuir a permissão 700 a todos. O dono destes

Page 60: Servidores FreeBSD

diretórios deve ser o root.Deverá ser criado ainda o arquivo /usr/local/etc/rsyncd.secrets, que contém as senhas dos usuários de cada módulo. Estes usuários não precisam existir no sistema.

-------------------- Arquivo rsyncd.secrets --------------------# rsyncd.secrets

# Formato:# usuario:senha

servidorzbak:senhaXservidorbbak:senhaY-------------------- Fim do arquivo rsyncd.secrets --------------------

Os arquivos rsyncd.conf e rsyncd.secrets deverão ter permissão 600.

Crie um script de inicialização para o rsync, com os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/bin/rsync --daemon --config=/usr/local/etc/rsyncd.conf

e

killall rsync

* Configuração no cliente de backup

No servidor ou máquina da qual se deseja fazer backup (cliente de backup), crie um script como o exemplo abaixo, com a permissão 700. Adapte-o para cada cliente de backup e também para incluir todos os locais que se deseja fazer backup:

-------------------- Arquivo backup.sh --------------------#!/bin/sh

# Comando rsync.RSYNC='/usr/local/bin/rsync -avR --delete --numeric-ids --password-file=/usr/local/etc/rsync.password'

# Destino do backup. Ajuste o ip do servidor de backup.# Formato: login_do_modulo@ip_do_servidor_backup::modulo/DEST='[email protected]::servidorz/'

# Arquivo de log.LOG='/var/log/backup.log'

# Grava a data/hora de inicio do backup.echo -e "\nInicio do backup - `date`\n" >> $LOG

##########

# Para fazer backup do /home.$RSYNC /home $DEST >> $LOG 2>&1

# Para fazer backup do /usr/local/apache2/htdocs.$RSYNC /usr/local/apache2/htdocs $DEST >> $LOG 2>&1

##########

# Grava a data/hora de fim do backup.echo -e "\nFim do backup - `date`\n" >> $LOG-------------------- Fim do arquivo backup.sh --------------------

Crie ainda o arquivo /usr/local/etc/rsync.password. O conteúdo deste arquivo deverá ser apenas uma linha com a senha que foi configurada no servidor de backup para este módulo. Atenção na permissão deste arquivo, deverá ser 600.

Por fim, agende a execução do backup no Cron. Edite o arquivo /etc/crontab e adicione uma linha para executar o script na freqüência desejada. O exemplo abaixo irá executar nas segundas, quartas e sextas-feiras às 2 horas:

0 2 * * 1,3,5 root /usr/local/script/backup.sh

Para executar o backup todo dia, insira uma linha como a seguinte:

0 2 * * * root /usr/local/script/backup.sh

Outro ponto a ser observado é que o arquivo de log pode se tornar demasiado grande, neste caso implemente um script que faça a rotação desse log e agende sua execução no Cron.

Page 61: Servidores FreeBSD

3.4.9 - Autenticação RADIUS

* FreeRADIUS

RADIUS é a sigla de Remote Authentication Dial In User Service. É um padrão de autenticação, autorização e accounting ("contabilização") muito utilizado para as situações em que um equipamento de acesso remoto, como um NAS (Network Access Server), precisa autenticar usuários de conexões discadas, como no caso de um provedor.O RADIUS trabalha em um modelo cliente/servidor, onde o NAS é o cliente. O servidor é responsável por receber o pedido de conexão, autenticar o usuário, e autorizar, ou não, que seja estabelecida a conexão dial-up entre o usuário e o NAS. A comunicação entre o Servidor RADIUS e o NAS é feita através do protocolo UDP, nas portas 1812 (autenticação - radius) e 1813 (accounting - radacct).O padrão RADIUS é definido pela RFC2865.

O servidor que iremos utilizar é o FreeRADIUS, que define-se como um servidor RADIUS de alta performance e altamente configurável. Sua página é www.freeradius.org.

Efetue o download do source da última versão estável do FreeRADIUS a partir de ftp://ftp.freeradius.org/pub/radius/. A versão atual é 0.9.3 e o arquivo chama-se freeradius-0.9.3.tar.gz. Descompacte este arquivo no /tmp e acesse o diretório que será criado, /tmp/freeradius-0.9.3.

Execute os seguintes comandos:

# ./configure --localstatedir=/var# make# make install

Será criado automaticamente o diretório /var/log/radius, onde ficarão todos os logs. Será instalado o daemon radiusd no diretório /usr/local/sbin, e os utilitários abaixo no diretório /usr/local/bin:

radclient -> emula um cliente RADIUS, enviando pacotes para o servidor e mostrando a resposta.radlast -> mostra as últimas conexões de usuários.radtest -> frontend para o radclient, utilizado para testar o servidor.radwho -> mostra os usuários conectados.radrelay -> replica dados de accounting para outro servidor RADIUS.radwatch -> não é utilizado, é instalado apenas por razões históricas.radzap -> efetua a limpeza da base de dados de sessões ativas.

Os arquivos de configuração ficam no diretório /usr/local/etc/raddb, acesse-o.

O arquivo clients.conf guarda a configuração de quais clientes RADIUS iremos aceitar pedidos. Uma entrada de localhost como cliente irá permitir que sejam efetuados testes com o utilitário radtest. Segue abaixo um exemplo do arquivo, que deverá ter a permissão 600:

-------------------- Arquivo clients.conf --------------------# clients.conf

# Definicao do cliente 127.0.0.1client 127.0.0.1 {

# Secret do NASsecret = secretX

# Apelidoshortname = localhost

# Tipo de NASnastype = other}

# Definicao do cliente 10.20.30.40.# Este devera ser o seu NAS.client 10.20.30.40 {secret = secretYshortname = nas-1nastype = usrhiper}

# Tipos de NAS (nastype) permitidos:## cisco - Cisco Access Server

Page 62: Servidores FreeBSD

# computone - Computone PowerRack# livingston - Livingston PortMaster# max40xx - Ascend Max 4000 family# multitech - Multitech CommPlete Server# netserver - 3Com/USR NetServer# pathras - Cyclades PathRAS# patton - Patton 2800# portslave - Cistron PortSlave# tc - 3Com/USR TotalControl# usrhiper - 3Com/USR Hiper Arc Total Control# other-------------------- Fim do arquivo clients.conf --------------------

O próximo arquivo é o naspasswd, que guarda o login e a senha de acesso administrativo de cada NAS para fazer a verificação se um cliente já está conectado ou não, caso se deseje limitar o login simultâneo. Este arquivo só é necessário para os tipos de NAS que não permitem fazer essa verificação via SNMP ou finger, que são os seguintes: 3Com/USR TotalControl, 3Com/USR NetServer e Cyclades PathRAS. O arquivo deverá ter a permissão 600, e possui o seguinte conteúdo:

-------------------- Arquivo naspasswd --------------------# naspasswd

# Formato:# ip_do_nas login senha

10.20.30.40 admin senhaX-------------------- Fim do arquivo nasspasswd --------------------

O FreeRADIUS poderá checar o login e senha dos usuários do sistema ou então poderá ser cadastrado cada usuário no arquivo "users". O mais recomendado é que haja uma máquina dedicada para isso, e sejam utilizados o login e senha do sistema para a autenticação, ou seja, cada usuário criado no FreeBSD será um usuário do provedor. Segue um exemplo do arquivo users abaixo, que deverá ter permissão 600:

---------- Arquivo users --------------------# users

# Desativa o acesso do usuario beltrano.#beltrano Auth-Type := Reject# Reply-Message = "Seu acesso foi desativado."

# Desativa o acesso dos usuarios do grupo 'desativados'.#DEFAULT Group == "desativados", Auth-Type := Reject# Reply-Message = "Seu acesso foi desativado."

# Para cadastrar os usuarios neste arquivo, insira as 4 linhas# abaixo para cada usuario.##fulano Auth-Type := Local, User-Password == "senhaY"# Service-Type = Framed-User,# Framed-Protocol = PPP,# Framed-Compression = Van-Jacobson-TCP-IP

# Padrao para efetuar a checagem de senha no sistema.# Comentar caso seja feito o cadastro dos usuarios neste arquivo.# Ajuste o parâmetro Simultaneous-Use para o numero de conexoes# simultaneas permitidas com o mesmo login.DEFAULT Auth-Type := System, Simultaneous-Use := 1Service-Type = Framed-User,Framed-Protocol = PPP,Framed-Compression = Van-Jacobson-TCP-IP-------------------- Fim do arquivo users --------------------

O arquivo de configuração principal do FreeRADIUS é o radiusd.conf. Faça uma cópia do original para ter como referência, e leia todos os seus comentários. No exemplo abaixo foram retiradas algumas opções.

-------------------- Arquivo radiusd.conf --------------------# radiusd.conf

prefix = /usr/localexec_prefix = /usr/local

Page 63: Servidores FreeBSD

sysconfdir = /usr/local/etclocalstatedir = /var/radiussbindir = /usr/local/sbinlogdir = /var/log/radiusraddbdir = /usr/local/etc/raddbradacctdir = /var/log/radacctconfdir = /usr/local/etc/raddbrun_dir = /var/run/radiusdlibdir = /usr/local/liblog_file = /var/log/radius/radius.logpidfile = /var/run/radiusd/radiusd.pid

# Usuario sob o qual o daemon ira rodar.# Caso comentado ira rodar sob o usuario que o inicializou.#user = nobody

# Grupo sob o qual o daemon ira rodar.# Caso comentado ira rodar sob o grupo do usuario que o inicializou.#group = nobody

# Tempo maximo em segundos para processar um pedido.max_request_time = 30

delete_blocked_requests = nocleanup_delay = 5

# Numero maximo de pedidos em andamento. O recomendado eh# 256 * numero de NAS.max_requests = 256

# Endereco IP local utilizado. Ira aceitar pedidos nesta interface de# rede e ira enviar as respostas tambem por esta.#bind_address = 10.1.2.3

# Porta utilizada. Alguns NAS ainda utilizam o padrao# antigo, que eh 1645.port = 1812

hostname_lookups = noallow_core_dumps = noregular_expressions = yesextended_expressions = yeslog_stripped_names = no

# Logar ou nao pedidos de autenticacao no arquivo radius.log.log_auth = no

# Logar ou nao senhas invalidas.log_auth_badpass = no

# Logar ou nao senhas corretas.log_auth_goodpass = no

usercollide = nolower_user = afterlower_pass = nonospace_user = afternospace_pass = no

checkrad = /usr/local/sbin/checkrad

security {max_attributes = 200reject_delay = 1status_server = no}

proxy_requests = no

$INCLUDE /usr/local/etc/raddb/clients.conf

snmp = no

Page 64: Servidores FreeBSD

thread pool {start_servers = 5max_servers = 32min_spare_servers = 3max_spare_servers = 10max_requests_per_server = 0}

modules {pap {encryption_scheme = crypt}

unix {cache = nocache_reload = 0radwtmp = /var/log/radius/radwtmp}

preprocess {with_ascend_hack = noascend_channels_per_line = 23with_ntdomain_hack = nowith_specialix_jetstream_hack = nowith_cisco_vsa_hack = no}

files {usersfile = /usr/local/etc/raddb/usersacctusersfile = /usr/local/etc/raddb/acct_userscompat = no}

detail {detailfile = /var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%mdetailperm = 0600}

detail auth_log {detailfile = /var/log/radius/radacct/%{Client-IP-Address}/auth-detail-%Y%mdetailperm = 0600}

acct_unique {key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port-Id"}

radutmp {filename = /var/log/radius/radutmpusername = %{User-Name}case_sensitive = nocheck_with_nas = yes perm = 0600callerid = "yes"}

attr_filter {attrsfile = /usr/local/etc/radius/attrs}

always fail {rcode = fail}always reject {rcode = reject}always ok {

Page 65: Servidores FreeBSD

rcode = oksimulcount = 0mpp = no}

expr {}}

instantiate {expr}

authorize {preprocessauth_logfiles}

authenticate {Auth-Type PAP {pap}unix}

preacct {preprocessfiles}

accounting {acct_uniquedetailunixradutmp}

session {radutmp}-------------------- Fim do arquivo radiusd.conf --------------------

Execute ainda os seguintes comandos, para que não sejam utilizados arquivos de configuração obsoletos, que são incluídos apenas por motivo históricos:

# cd /usr/local/etc/raddb# mv naslist naslist.OFF# mv clients clients.OFF# mv realms realms.OFF

Feitas estas configurações, o servidor pode ser inicializado e testado. Execute o /usr/local/sbin/radiusd e verifique o arquivo de log, em /var/log/radius/radius.log. Na última linha deverá constar a seguinte frase logo após a inicialização:

Info: Ready to process requests.

Agora teste o servidor, com o utilitário radtest. Execute a linha de comando abaixo, substituindo os valores usuario e senha por um username e senha válidos no seu sistema e secretX pelo secret do cliente 127.0.0.1 definido no arquivo clients.conf:

# radtest usuario senha 127.0.0.1 10 secretX

Deverá aparecer a string Access-Accept como resultado. Tente novamente o comando com uma senha incorreta, e veja se aparece a string Access-Reject como retorno.

O arquivo de log do daemon é o /var/log/radius/radius.log. Além deste, temos outros dois tipos de log, em /var/log/radius/radacct. Um é o detail-aaaamm, onde aaaamm será o ano e o mês corrente, este arquivo guarda o log de accounting. O outro chama-se auth-detail-aaaamm, e registra todos os pedidos de autorização (login) para conexão.

Crie um script de inicialização para o FreeRADIUS, em /usr/local/etc/rc.d/freeradius.sh, com a permissão 700 e os seguintes comandos para inicialização e shutdown, respectivamente:

Page 66: Servidores FreeBSD

/usr/local/sbin/radiusd

e

kill `cat /var/run/radiusd/radiusd.pid`

3.5 - Serviço de Rede, Controle e Segurança

3.5.1 - DNS

* ISC BIND9

* Introdução ao DNS

O DNS - Domain Name System - é um banco de dados hierárquico e distribuído. Ele guarda os dados que possibilitam descobrir endereços IP de máquinas a partir do hostname das mesmas, e vice-versa, e também informações sobre roteamento de e-mail e outras. Os clientes consultam os servidores DNS através de uma biblioteca 'resolver'. O DNS é definido originalmente pelas RFCs 1034, 1035 e outras.

* Domínios

Os dados armazenados no DNS são identificados por nomes de domínios, que são organizados em formato de árvore invertida. Cada ramificação representa um domínio, e o endereço completo de um ponto específico é determinado através da ligação de todas as ramificações daquele ponto até a raiz, veja o exemplo abaixo.

Cada nó da árvore é um domínio, mesmo que o nó seja terminal, ou seja, que não possua subdomínios. Podemos concluir também que cada subdomínio é um domínio, e cada domínio é um subdomínio, exceto o Root Domain, ou seja, a raiz da árvore.

* Zonas

Uma zona (zone) é um espaço de nomes - um pedaço contínuo da árvore DNS - que foi delegado a um determinado servidor de nomes. Este servidor irá possuir todas as informações referentes à esta zona, e irá possuir autoridade para responder qualquer requisição referente a ela. Pertencem a esta zona todas as ramificações da árvore a partir do ponto onde foi delegada a autoridade, exceto as ramificações que pertencem a outras zonas. Uma zona pode englobar um domínio inteiro ou apenas parte de um domínio.Cada zona possui ao menos um servidor de nomes autoritário - Authoritative Name Server.

* Servidor Mestre Primário (Primary Master)

Também chamado de servidor primário, é o servidor autoritário onde é mantida a cópia mestre dos dados sobre a zona. Os dados são carregados a partir de arquivos chamados "arquivos de zonas".

* Servidor Escravo (Slave Server)

Conhecido como servidor secundário, é também um servidor autoritário sobre a zona. Busca os dados sobre a zona a partir do servidor primário usando um processo de replicação chamado "zone transfer".

Page 67: Servidores FreeBSD

* Resource Records (RRs)

Os Resource Records são registros que apontam diferentes serviços em um arquivo de zona. São padronizados pela RFC1034 e outras subseqüentes. Os principais tipos são:

SOA -> Início de uma zona autoritáriaNS -> Servidor de nomes autoritárioA -> Endereço de hostCNAME -> ApelidoMX -> Mail eXchangerPTR -> Ponteiro (utilizado para DNS reverso)

O formato destas entradas no arquivo de zona é:nome_registro IN tipo valor

* Instalação e Configuração do BIND

O BIND - Berkeley Internet Name Domain - é um software mantido pelo Internet Software Consortium que implementa uma biblioteca 'resolver' e um servidor de nomes, o named. É utilizado pela maior parte dos servidores DNS na Internet, incluindo os Root Name Servers. Possui atualmente as distribuições 8, que ainda está sendo utilizada, e 9, que implementa mais funcionalidades e é a que iremos utilizar. Uma das principais mudanças em relação à versão 8 é que a 9 implementa o suporte a Views, que permite que um servidor seja visualizado de formas diferentes dependendo do cliente, por exemplo, é possível definir uma vista interna para alguns clientes, e uma vista externa para os outros. O site do BIND é www.isc.org/products/BIND.

Primeiramente desative o BIND que vem na instalação padrão do FreeBSD. Execute os seguintes comandos:

# mv /usr/sbin/named /usr/sbin/named.OFF# mv /etc/namedb /etc/namedb.OFF# rm /usr/share/man/man8/named*

A versão atual do BIND9 é a 9.2.3, efetue o seu download a partir de algum mirror disponível no site ou de ftp://ftp.isc.org/isc/bind9/9.2.3/bind-9.2.3.tar.gz. Descompacte o arquivo no /tmp e acesse o diretório que será criado. Execute os comandos abaixo:

# ./configure --sysconfdir=/usr/namedb --disable-threads# make# make install

Crie agora o usuário e o grupo named, da seguinte forma:

# pw group add named -g 170# pw user add named -c "Bind" -d "/nonexistent" -s "/sbin/nologin" -u 170 -g 170

Crie os diretórios /etc/namedb, com dono named e permissão 700. Todos os arquivos dentro deste diretório deverão ter o dono named e permissão 600. Crie também o diretório /var/log/named, onde o named irá guardar seus arquivos de log. O dono deverá ser named também, e a permissão 700.

* Configuração Simples

Para efetuar este esquema de configurações simples, tomaremos como base os seguintes dados hipotéticos:

Domínio: exemplo.orgServidor DNS: ns1.exemplo.org - IP 192.168.0.5Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10

Vá até o diretório /etc/namedb e efetue o download do arquivo named.root, que indica os Root Name Servers:

# fetch ftp.internic.net/domain/named.root

Crie o arquivo named.conf. Este será o arquivo de configuração principal do named, que ele irá ler na inicialização.

-------------------- Arquivo named.conf --------------------# named.conf

options {

# Diretorio onde ficam os arquivos de configuracao. directory "/etc/namedb";

# Arquivo que armazena o PID. pid-file "/var/log/named/named.pid";

Page 68: Servidores FreeBSD

# Para nao anunciar a versao, caso solicitado. version "";

};

# Direcionar o log para o arquivo /var/log/named/named.loglogging { channel "named_log" { file "/var/log/named/named.log" versions 3 size 5m; print-time yes; print-category yes; print-severity yes; };

category "default" { "named_log"; };};

# Desabilita os canais de controle via rndc.controls {};

# Root Domain.# Especifica o arquivo que ira indicar os Root Name Servers,# que sao os responsaveis pela raiz do DNS.zone "." { type hint; file "named.root";};

# Reverso da zona localhostzone "0.0.127.in-addr.arpa." {

# Este eh o servidor primary master desta zona. type master;

# Arquivo de zona. file "localhost.REV";

# Nao notificar sobre alteracoes desta zona. notify no;};

# Zona exemplo.orgzone "exemplo.org" { type master; file "exemplo.org.DB";};

# Reverso da zona exemplo.orgzone "0.168.192.in-addr.arpa." { type master; file "exemplo.org.REV";};-------------------- Fim do arquivo named.conf --------------------

Agora devem ser criados todos os arquivos de zonas. Veja os exemplos abaixo:

---------- Arquivo exemplo.org.DB --------------------; exemplo.org.DB

$TTL 3600

; Zonaexemplo.org. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 1 ; serial

Page 69: Servidores FreeBSD

10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.

; Nomes de hostslocalhost IN A 127.0.0.1ns1 IN A 192.168.0.5mail IN A 192.168.0.8www IN A 192.168.0.10@ IN A 192.168.0.10

; Apelidosftp IN CNAME www

; Servidores de e-mail@ IN MX 10 mail.exemplo.org.-------------------- Fim do arquivo exemplo.org.DB --------------------

No arquivo acima, temos as seguintes configurações:

$TTL: é o tempo de vida das configurações deste arquivo, se algum outro servidor fizer cache destas informações ele guardará apenas pelo tempo determinado.

Zona: é a entrada "IN SOA" (Start Of Authority). Especifica a zona sobre a qual temos autoridade, e qual servidor primário responde por ela. Também é especificado o endereço de e-mail do administrador, substituindo a arroba por ponto, por exemplo, [email protected] deve ser inserido como admin.exemplo.org. Os parâmetros entre parênteses são, na ordem: serial: número serial da configuração, que deve ser incrementado toda vez que é feita alguma mudança. refresh: tempo em segundos em que os servidores slave desta zona deverão atualizar os seus dados, a partir do master. retry: caso algum slave não consiga atualizar os seus dados, deverá tentar novamente neste intervalo de tempo, em segundos. expire: se após este tempo (em segundos), algum slave não conseguiu atualizar seus dados, deverá descartá-los. minimum: TTL para o cache de respostas negativas.

Servidores DNS: são as entradas "IN NS" (Name Server), e indicam os servidores de nomes que possuem informações sobre a zona em questão. Todos os servidores autoritários desta zona deverão ser incluídos. A arroba indica a origem, o seja, exemplo.org. Ao invés da arroba poderíamos colocar (neste arquivo) exemplo.org, o efeito seria o mesmo.

Nomes de Hosts: associam nomes de hosts a seus respectivos endereços IP. São entradas "IN A". Novamente, a arroba indica a origem, então exemplo.org indicará o endereço 192.168.0.10. Como em todo o arquivo de zona, caso um hostname seja especificado com ponto no final é um endereço absoluto. Se for especificado sem um ponto no final, é um endereço relativo à origem, ou seja www se torna www.exemplo.org.

Apelidos: são as entradas CNAME, ou Canonical Name. Associam outros nomes à hosts que já estão cadastrados com entradas "IN A", formando aliases. Podem também ser usadas para fazer balanceamento de carga, especificando-se o mesmo apelido para várias máquinas diferentes, então cada requisição irá para a próxima máquina. Por exemplo:

www.exemplo.org IN CNAME www1.exemplo.org www.exemplo.org IN CNAME www2.exemplo.org www.exemplo.org IN CNAME www3.exemplo.org

Neste exemplo, as requisições para o endereço www.exemplo.org conterão na resposta a indicação das três máquinas, variando em ordem round-robin, e o cliente normalmente optará pela primeira indicação. Desta forma, a carga é distribuída (de uma forma primitiva) entre 3 servidores.

Servidores de e-mail: são as entradas "IN MX" (Mail eXchanger). Especificam para qual servidor deve ir os e-mails para o domínio exemplo.org (@). É possível especificar mais de um, será seguida a ordem da prioridade especificada (10, no exemplo). Quanto mais baixa a prioridade antes será verificado. Se o de prioridade mais baixa não reconhecer o destinatário, o e-mail é enviado ao servidor com a segunda prioridade mais baixa, e assim por diante.

O próximo arquivo de zona é o reverso da zona exemplo.org, segue o exemplo abaixo:

-------------------- Arquivo exemplo.org.REV --------------------

Page 70: Servidores FreeBSD

; exemplo.org.REV

$TTL 3600

; Zona reversa0.168.192.in-addr.arpa. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 1 ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.

; IPs de Hosts5 IN PTR ns18 IN PTR mail10 IN PTR www-------------------- Fim do arquivo exemplo.org.REV --------------------

O objetivo deste arquivo é fazer a relação entre endereços IPs e hostnames, ou seja, dado um determinado endereço IP descobre-se o hostname. O arquivo segue mais ou menos o mesmo formato do anterior, apenas algumas diferenças:

Zona reversa: é especificada no formato da faixa de IPs invertida mais a string ind-addr.arpa. Neste arquivo os IPs são todos lidos da direita para a esquerda, desta forma uma máquina com o IP 192.168.0.5 terá uma entrada 5.0.168.192.in-addr.arpa. Ao invés de especificar a zona "0.168.192.in-addr.arpa." poderíamos apenas especificar "@", já que a @ será substituída pela origem, que está no arquivo named.conf como "0.168.192.in-addr.arpa.", para este arquivo.

IPs de Hosts: são especificados por meio de entradas "IN PTR", relacionando endereços IP a hostnames.

O outro arquivo de configuração que foi especificado no named.conf é o localhost.REV, que é a zona reversa da máquina local. Segue o exemplo:

-------------------- Arquivo localhost.REV --------------------; localhost.REV

$TTL 3600

; Zona0.0.127.in-addr.arpa. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 1 ; serial 3600 ; refresh 900 ; retry 3600000 ; expire 3600 ) ; minimum

; Servidores DNS@ IN NS ns1

; IPs de hosts1 IN PTR localhost-------------------- Fim do arquivo localhost.REV --------------------

Com estes arquivos no lugar, é possível inicializar e testar o named. Execute o comando a seguir:

# /usr/local/sbin/named -u named -c /etc/namedb/named.conf

Verifique o arquivo de log, em /var/log/named/named.log e também /var/log/messages e veja se não há nenhuma mensagem de erro. Adicione o seu servidor DNS no arquivo /etc/resolv.conf, coloque a primeira entrada "nameserver" apontando para o IP do servidor. Faça alguns testes, com os comandos dig e host, exemplos:

# dig www.exemplo.org

# host exemplo.org

Para maiores detalhes veja as man pages dos comandos dig, host e nslookup.

Por fim, faça um script de inicialização para o BIND, com os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/sbin/named -u named

e

Page 71: Servidores FreeBSD

kill `cat /var/log/named/named.pid`

* Configuração com Views

Após ter feito a configuração acima e estar tudo funcionando corretamente, pode-se partir para esta. Nesta configuração fazemos uso da funcionalidade "Views", que permite que criemos um servidor que irá retornar respostas diferentes dependendo do cliente. Podemos assim criar um servidor DNS que trabalha com um mesmo domínio mas fornecendo endereços de duas redes, uma interna e a outra externa. Esta configuração também é chamada de Split DNS.

Para esta configuração, iremos tomar como base os seguintes dados hipotéticos:

Domínio: exemplo.org

Rede Externa:Servidor DNS: ns1.exemplo.org - IP 192.168.0.5Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10

Rede Interna:Servidor DNS: ns1.exemplo.org - IP 10.10.0.5Servidor de E-Mail: mail.exemplo.org - IP 10.10.0.8Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 10.10.0.10

Os arquivos named.root, localhost.REV, exemplo.org.DB e exemplo.org.REV continuam os mesmos. É preciso modificar o arquivo named.conf e criar os arquivos exemplo.org.INTERNA.DB e exemplo.org.INTERNA.REV. Os exemplos estão abaixo:

-------------------- Arquivo named.conf --------------------# named.conf

options { directory "/etc/namedb"; pid-file "/var/log/named/named.pid"; version "";};

logging { channel "named_log" { file "/var/log/named/named.log" versions 3 size 5m; print-time yes; print-category yes; print-severity yes; };

category "default" { "named_log"; };};

controls {};

# Vista Internaview interna {

# Clientes que irao visualizar esta view. match-clients { 10.10.0.0/16; };

# Efetua a busca recursiva apenas para clientes internos. recursion yes;

# Root Domain. # Igual nas duas views. zone "." { type hint; file "named.root"; };

# Reverso da zona localhost # Igual nas duas views.

Page 72: Servidores FreeBSD

zone "0.0.127.in-addr.arpa." { type master; file "localhost.REV"; notify no; };

# Zona exemplo.org interna zone "exemplo.org" { type master; file "exemplo.org.INTERNA.DB"; };

# Reverso da zona exemplo.org interna zone "0.10.10.in-addr.arpa." { type master; file "exemplo.org.INTERNA.REV"; };

};

# Vista Externaview externa {

# Serve a qualquer cliente. match-clients { any; };

# Não faz buscas recursivas para clientes externos. recursion no;

# Root Domain. zone "." { type hint; file "named.root"; };

# Reverso da zona localhost zone "0.0.127.in-addr.arpa." { type master; file "localhost.REV"; notify no; };

# Zona exemplo.org zone "exemplo.org" { type master; file "exemplo.org.DB"; };

# Reverso da zona exemplo.org zone "0.168.192.in-addr.arpa." { type master; file "exemplo.org.REV"; };

};-------------------- Fim do arquivo named.conf --------------------

No arquivo acima, a cláusula "match-clients" da View Externa poderia ter sido omitida, pois caso não seja especificada nenhuma "match-clients" dentro de uma View, o padrão é servir a qualquer cliente.

-------------------- Arquivo exemplo.org.INTERNA.DB --------------------; exemplo.org.INTERNA.DB

$TTL 3600

; Zona

Page 73: Servidores FreeBSD

exemplo.org. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 1 ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.

; Nomes de hostslocalhost IN A 127.0.0.1ns1 IN A 10.10.0.5mail IN A 10.10.0.8www IN A 10.10.0.10@ IN A 10.10.0.10

; Apelidosftp IN CNAME www

; Servidores de e-mail@ IN MX 10 mail.exemplo.org.-------------------- Fim do arquivo exemplo.org.INTERNA.DB --------------------

-------------------- Arquivo exemplo.org.INTERNA.REV --------------------; exemplo.org.INTERNA.REV

$TTL 3600

; Zona reversa0.10.10.in-addr.arpa. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 1 ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.

; IPs de Hosts5 IN PTR ns18 IN PTR mail10 IN PTR www-------------------- Fim do arquivo exemplo.org.INTERNA.REV --------------------

* Configuração de DNS Primário e Secundário

Normalmente para cada zona são definidos no mínimo dois servidores DNS, um primário e outro secundário. Conforme descrito anteriormente, o servidor secundário busca todas as informações de zonas a partir do servidor primário, num processo conhecido como "zone transfer".Tomaremos como base a Configuração Simples feita anteriormente, que é de um servidor primário, para adicionar suporte a um servidor secundário. Também iremos ver os arquivos de configuração do servidor secundário.

Domínio: exemplo.orgServidor DNS Primário: ns1.exemplo.org - IP 192.168.0.5Servidor DNS Secundário: ns2.exemplo.org - IP 192.168.0.6Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10

Os arquivos de zona exemplo.org.DB e exemplo.org.REV, armazenados no servidor primário, deverão se modificados para incluir o novo servidor de nomes, conforme os exemplos abaixo:

---------- Arquivo exemplo.org.DB --------------------; exemplo.org.DB

$TTL 3600

; Zonaexemplo.org. IN SOA ns1.exemplo.org. admin.exemplo.org. (

Page 74: Servidores FreeBSD

2 ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.@ IN NS ns2.exemplo.org.

; Nomes de hostslocalhost IN A 127.0.0.1ns1 IN A 192.168.0.5ns2 IN A 192.168.0.6mail IN A 192.168.0.8www IN A 192.168.0.10@ IN A 192.168.0.10

; Apelidosftp IN CNAME www

; Servidores de e-mail@ IN MX 10 mail.exemplo.org.-------------------- Fim do arquivo exemplo.org.DB --------------------

-------------------- Arquivo exemplo.org.REV --------------------; exemplo.org.REV

$TTL 3600

; Zona reversa0.168.192.in-addr.arpa. IN SOA ns1.exemplo.org. admin.exemplo.org. ( 2 ; serial 10800 ; refresh 3600 ; retry 604800 ; expire 86400 ) ; minimum

; Servidores DNS@ IN NS ns1.exemplo.org.@ IN NS ns1.exemplo.org.

; IPs de Hosts5 IN PTR ns16 IN PTR ns28 IN PTR mail10 IN PTR www-------------------- Fim do arquivo exemplo.org.REV --------------------

Note que os arquivos de zonas acima sofreram um incremento no número serial. Cada vez que um arquivo de zona é modificado é necessário fazer tal incremento, para que os outros servidores DNS, que buscam dados de zonas neste, saibam que o arquivo foi modificado e que devem atualizar os seus dados locais. Após isso, dê um "killall -HUP named", para que os arquivos sejam re-lidos pelo BIND.

Partimos agora para a configuração do servidor secundário. Siga os mesmos passos da instalação etc. do primeiro servidor, o que irá mudar são apenas os arquivos de configuração. Crie o arquivo named.conf conforme o exemplo abaixo:

-------------------- Arquivo named.conf --------------------# named.conf

options { directory "/etc/namedb"; pid-file "/var/log/named/named.pid"; version "";};

logging { channel "named_log" {

Page 75: Servidores FreeBSD

file "/var/log/named/named.log" versions 3 size 5m; print-time yes; print-category yes; print-severity yes; };

category "default" { "named_log"; };};

controls {};

# Root Domain.zone "." { type hint; file "named.root";};

# Reverso da zona localhostzone "0.0.127.in-addr.arpa." { type master; file "localhost.REV"; notify no;};

# Zona exemplo.orgzone "exemplo.org" { type slave; file "exemplo.org.DB"; masters { 192.168.0.5; };};

# Reverso da zona exemplo.orgzone "0.168.192.in-addr.arpa." { type slave; file "exemplo.org.REV"; masters { 192.168.0.5; };};-------------------- Fim do arquivo named.conf --------------------

Note que no arquivo acima as zonas forward e reverse exemplo.org passaram a ser do tipo slave, especificando que este servidor é o escravo, ou secundário, para estas zonas. O parâmetro "file" servirá apenas para fazer uma cópia dos dados das zonas nos arquivos especificados, ou seja, não adianta mudar algo nestes arquivos porque o servidor master irá mandar atualizações dos mesmos e eles serão sobrescritos. O parâmetro "masters" indica qual é o servidor primário responsável por esta zona.

Também copie para este servidor o arquivo named.root. Crie ainda o arquivo localhost.REV, com a seguinte configuração:

-------------------- Arquivo localhost.REV --------------------; localhost.REV

$TTL 3600

; Zona0.0.127.in-addr.arpa. IN SOA ns2.exemplo.org. admin.exemplo.org. ( 1 ; serial 3600 ; refresh 900 ; retry 3600000 ; expire

Page 76: Servidores FreeBSD

3600 ) ; minimum

; Servidores DNS@ IN NS ns2

; IPs de hosts1 IN PTR localhost-------------------- Fim do arquivo localhost.REV --------------------

3.5.2 - DHCP (Dynamic Host Configuration Protocol)

* ISC DHCP Server

Um servidor DHCP tem por objetivo fornecer parâmetros de configuração, como por exemplo o próprio endereço IP, à hosts em uma rede. É definido pela RFC2131. O DHCP funciona basicamente da seguinte forma: quando o cliente é inicializado ou configurado para obter um endereço IP automaticamente, ele faz broadcasts na porta UDP 68, solicitando suas configurações.

O servidor, após receber a solicitação, responde na porta UDP 67, fornecendo ao cliente um endereço IP e outras configurações, como gateway, DNS etc. Essas informações são "alocadas" ao cliente, sendo que só serão válidas por um período determinado. Caso o cliente ainda esteja na rede quando este período acabar, pode solicitar que seja renovada a sua alocação.

Iremos utilizar o servidor DHCP fornecido pelo Internet Software Consortium, sua página é http://www.isc.org/products/DHCP. Este pacote inclui um servidor DHCP (dhcpd), que é o que iremos utilizar, um cliente DHCP (dhclient) e um agente de retransmissão DHCP (dhcrelay), que pode ser útil caso seja necessário obter endereços IP de um servidor que não se encontra no mesmo domínio de broadcast que os clientes.

Baixe o source da última versão estável, que fica em ftp://ftp.isc.org/isc/dhcp/dhcp-latest.tar.gz. Neste momento, a última versão é a 3.0pl2.

Descompacte o arquivo dhcp-latest.tar.gz no diretório /tmp, será criada a pasta /tmp/dhcp-3.0pl2. Acesse essa pasta e digite os seguintes comandos:

# ./configure# make# make install

O executável dhcpd será instalado em /usr/sbin/dhcpd. Copie o arquivo /tmp/dhcp-3.0pl2/server/dhcpd.conf para /etc/dhcpd.conf.sample. Este arquivo é um exemplo de configuração, iremos guardá-lo como referência. Remova agora o diretório /tmp/dhcp-3.0pl2.

A configuração do servidor DHCP consiste em apenas um arquivo, que irá ficar em /etc/dhcpd.conf. Este arquivo define, por exemplo, quais os endereços IP disponíveis para alocação, qual o gateway etc. Atribua a permissão 600 a este arquivo. Segue abaixo um exemplo comentado deste arquivo:

-------------------- Arquivo dhcpd.conf --------------------# dhcpd.conf

# Dominio.option domain-name "exemplo.org";

# Servidores DNS.option domain-name-servers 10.10.0.5, 10.10.0.6;

# Servidores WINS.# Descomentar caso utilizado.#option netbios-name-servers 10.10.0.9;

# Tempo padrao de alocacao em segundos.# Se o cliente não especificar nenhum periodo de tempo# sera atribuido este.default-lease-time 600;

# Tempo maximo de alocacao em segundos.# Tempo maximo que o cliente podera alocar o IP.# Apos isso deve renovar a alocacao.max-lease-time 7200;

# Nao tentar atualizar o DNS.

Page 77: Servidores FreeBSD

ddns-update-style none;

# Caso este servidor nao seja o oficial para esta rede o# parametro abaixo devera ser comentado.authoritative;

# O log eh feito pelo syslog.log-facility daemon;

# Declaracao de Subrede.subnet 10.10.0.0 netmask 255.255.0.0 {

# Faixa de IPs disponiveis para alocar. range 10.10.20.1 10.10.20.100;

# Gateway. option routers 10.10.0.5;

}

# Declaracao de um cliente especifico.# Pode ser especificado um IP fixo, que nao deve estar na faixa# de disponiveis para alocacao acima.host maquina10 {

# Endereco MAC do host. hardware ethernet 08:00:07:26:c0:a5;

# Endereco fixo. fixed-address 10.10.30.10;

# Tempo padrao de alocacao em segundos. default-lease-time 86400;

# Tempo maximo de alocacao em segundos. max-lease-time 864000;

}-------------------- Fim do arquivo dhcpd.conf --------------------

Deve ser criado um arquivo em branco onde o DHCP irá armazenar as informações sobre as alocações, para seu controle. Execute os seguintes comandos:

# touch /var/db/dhcpd.leases# chmod 600 /var/db/dhcpd.leases

Para que o log seja direcionado para um arquivo específico, edite o arquivo /etc/syslog.conf e adicione as seguintes linhas:

!dhcpd*.* /var/log/dhcp/dhcpd.log

Crie então o diretório /var/log/dhcp e o arquivo dhcpd.log, ambos com permissão 600, e reinicialize o syslog:

# mkdir /var/log/dhcp# touch /var/log/dhcp/dhcpd.log# chmod -R 600 /var/log/dhcp# killall -HUP syslogd

Poderá ser criado um script para rotacionar o log do DHCP, para o mesmo não se tornar demasiado grande.

Após isso, inicialize o seu servidor DHCP executando o comando abaixo (substitua xl0 pela sua interface de rede que irá servir DHCP):

# /usr/sbin/dhcpd xl0

Efetue alguns testes, com máquinas clientes utilizando configuração automática de IP. Verifique o arquivo de log, em /var/log/dhcp/dhcpd.log. Verifique também o arquivo de alocações, em /var/db/dhcpd.leases. Toda vez que for feita alguma modificação no arquivo dhcpd.conf, o dhcpd deverá ser parado e inicializado novamente.

Faça um script de inicialização, com os seguintes comandos para inicialização e shutdown, respectivamente (substitua xl0 pela sua interface de rede que irá servir DHCP):

/usr/sbin/dhcpd xl0 -q

Page 78: Servidores FreeBSD

e

killall dhcpd

3.5.2 - Firewall

* IPFW2

O IPFIREWALL é o filtro de pacotes nativo do FreeBSD, sendo também chamado de IPFW, que é a interface para controle do IPFIREWALL. O IPFIREWALL faz o monitoramento de cada pacote em cada conexão feita à máquina, determinando por meio das regras definidas pelo IPFW qual é o tratamento dado a estes pacotes. As regras são lidas de cima para baixo, e podem determinar se o pacote será liberado, bloqueado, encaminhado etc.

Atualmente podemos ativar o suporte a IPFW2. O IPFW2 é uma nova versão do IPFW, com maior flexibilidade no formato das regras e algumas funcionalidades a mais, entre elas: suporte a regras não específicas para TCP ou UDP com número de porta, suporte a blocos OR, keepalives para sessões stateful e filtragem por cabeçalho MAC.

Ativando o IPFW2

Para habilitar o suporte ao ipfirewall e o ipfw2, devemos seguir alguns passos. Inicialmente, o próprio ipfw deverá ser recompilado, para suportar ipfw2. Execute os seguintes comandos:

# cd /usr/src/sbin/ipfw# make clean# make -DIPFW2# make -DIPFW2 install

Para que quando formos atualizar o sistema e executar um "make buildworld" o make saiba deste detalhe no momento de compilar o ipfw, adicione a linha abaixo ao arquivo /etc/make.conf:

IPFW2=TRUE

Edite o arquivo de configuração do kernel e insira as seguintes linhas, descritas abaixo:

options IPFIREWALLoptions IPFW2options IPFIREWALL_VERBOSEoptions IPFIREWALL_VERBOSE_LIMIT=100options IPFIREWALL_FORWARDoptions IPDIVERT

Primeira linha: ativa o ipfirewall, carregando-o estaticamente no kernel.Segunda linha: ativa o ipfw2 propriamente dito.Terceira linha: ativa o suporte a log no ipfirewall. O log é feito via syslog.Quarta linha: define um limite para o log de cada regra. O padrão é 100, dessa forma cada regra terá até 100 ocorrências no log. Isto é feito para evitar o comprometimento do sistema em caso de ataques como negação de serviço.Quarta linha: ativa o suporte a encaminhamento de pacotes.Quinta linha: ativa o suporte a redirecionamento de porta através de socket "divert".

Após todas estas configurações, compile e reinstale o kernel, e reinicie a máquina. Isto deverá ser feito no console, pois após reiniciar o firewall será carregado, e como não foi definida nenhuma regra irá bloquear tudo. Uma forma de contornar isso, caso não seja possível estar junto a máquina, é inserir as seguintes linhas no arquivo /etc/rc.conf:

firewall_enable="YES"firewall_type="OPEN"

Isto fará com que na inicialização seja carregada a configuração "OPEN" do arquivo /etc/rc.firewall. Esta configuração irá adicionar uma regra que libera todo o tráfego.

Após reiniciada a máquina, digite o seguinte comando:

# ipfw list

Será mostrada a lista de regras ativas, que de acordo com a configuração OPEN do arquivo /etc/rc.firewall deverá ser a seguinte:

00100 allow ip from any to any via lo000200 deny ip from any to 127.0.0.0/800300 deny ip from 127.0.0.0/8 to any65000 allow ip from any to any65535 deny ip from any to any

Page 79: Servidores FreeBSD

Neste momento, todos os pacotes que entram e saem da máquina estão passando por estas regras, na ordem em que estão, definida pelo número da regra (que vai de 1 a 65535). A primeira regra que for atendida irá definir o que fazer com o pacote, e as demais são geralmente ignoradas (em alguns casos específicos o pacote é reinjetado).

Regra 100: permite que qualquer pacote IP trafegue na interface lo0 (localhost).Regra 200: bloqueia o tráfego de qualquer origem para a rede 127.0.0.0/8 (localhost).Regra 300: bloqueia o tráfego com origem na rede 127.0.0.0/8 para qualquer destino.Regra 65000: permite qualquer tráfego.Regra 65535: bloqueia qualquer tráfego.

Estas regras estão no formato do ipfw1, que também é suportado, para compatibilidade, pelo ipfw2. Lembre-se que todas estas regras foram definidas pelo rc.firewall, exceto a regra de número 65535 (máximo), que é o padrão do ipfirewall, bloquear tudo. Caso seja conveniente que o padrão do firewall seja liberar tudo, ou seja, a regra 65535 seria "allow all from any to any", então deve ser adicionada a seguinte linha na configuração do kernel:

options IPFIREWALL_DEFAULT_TO_ACCEPT

Comando IPFW

O comando ipfw, de uma forma sucinta, possui os seguintes parâmetros:

ipfw [-q] add regra -> Adiciona a regra (ver o formato abaixo). A opção "-q" indica que deverá ser uma operação "silenciosa", não gerando saídas nem relatando as ações.

ipfw delete número_regra -> Remove a regra com o número especificado.

ipfw list -> Lista as regras ativas.

ipfw [-t -d] show -> Lista as regras ativas, incluindo os contadores número de pacotes e número de bytes. O parâmetro -t inclui ainda a data/hora da última ocorrência. O parâmetro -d lista também as regras dinâmicas.

ipfw [-q] flush -> Deleta todas as regras.

ipfw [-q] zero -> Zera todos os contadores (número de pacotes, número de bytes, número de logs e timestamp).

ipfw [-q] resetlog -> Zera o contador número de logs.

Formato das Regras

As regras que vimos anteriormente, como foi mencionado, estão no formato do ipfw1, que atualmente também é aceito pelo ipfw2. Pode-se usar este formato para escrever as regras, no entanto é bom se habituar com o novo formato. Quando forem acrescentadas regras no formato novo, o ipfw2 irá automaticamente inserir as palavras "ip from any to any", que fazem parte do formato antigo, e não irão mudar em nada a regra, já que não impões nenhuma restrição, e quem vai ditar a especificação dos pacotes são as opções, explicadas adiante. Este esquema é feito para manter uma certa compatibilidade com o ipfw1.

A partir de agora, já podem ser definidas regras para controlar o Firewall. É muito importante se familiarizar com a sintaxe e forma de uso do ipfw, que será o único comando utilizado para controlar o ipfirewall. A formato das regras é o seguinte:

[número_regra] [prob probalilidade] ação [log [logamount número] ] corpo_regra

[número_regra]Varia de 1 a 65535 e indica a seqüência em que as regras serão processadas. A número 65535 é reservado para a ação padrão do firewall, que será bloquear ou permitir tudo, dependendo da configuração do kernel. Se não for inserido um número de regra ela será automaticamente a última antes da 65535. Se forem inseridas duas ou mais regras com o mesmo número, será obedecida a ordem em que foram inseridas.

[prob probabilidade]Define uma probabilidade para aplicar a regra. Varia de 0 a 1.

Ação

allowSinônimo de accept, pass e permit. Libera o tráfego do pacote e termina a leitura das regras.

check-stateCheca o pacote contra um conjunto de regras dinâmico.

countApenas atualiza o contador desta regra. As demais regras continuam a ser lidas.

denySinônimo de drop, descarta o pacote e termina a leitura das regras.

divert porta

Page 80: Servidores FreeBSD

Redireciona o pacote para a porta especificada, utilizando um socket "divert". Pode ser especificado número ou nome, veja /etc/services.

fwd ip[,porta]Sinônimo de forward, encaminha o pacote para o ip especificado. Se o ip for local será encaminhado para a porta especificada, se o ip não for local a porta será ignorada. O pacote não é alterado, e isto inclui o ip de destino, então se o pacote for encaminhado para outro host provavelmente será rejeitado. Caso seja encaminhado para um ip local, desta máquina, o socket que irá receber o pacote terá o seu endereço alterado para coincidir com o endereço de destino do pacote, aceitando desta forma o mesmo.

pipe númeroPassa o pacote através de um "pipe" dummynet, para controle de tráfego.

queue númeroPassa o pacote para uma "queue" dummynet, para controle de tráfego utilizando WF2Q+.

resetDescarta o pacote, e se o mesmo for TCP tenta enviar um TCP RST.

skipto númeroPula para a regra de número especificado.

tee portaAceita o pacote e envia uma cópia do mesmo para a porta especificada, via socket "divert".

unreach códigoDescarta o pacote, e tenta enviar uma resposta "ICMP unreachable" com o código especificado. O código deve ser entre 0 e 255, ou alguma destas palavras chave: net, host, protocol, port, needfrag, srcfail, net-unknown, host-unknown, isolated, net-prohib, host-prohib, tosnet, toshost, filter-prohib, host-precedence ou precedence-cutoff.

[log [logamount número] ]Caso mencionada a palavra log, cada vez que um pacote coincidir com esta regra será feito um log, através do syslog. Caso seja inserido logamount número, este será o limite de vezes que será feito o log para esta regra. O valor 0 (zero) significa sem limites. Caso não seja inserido logamount, o padrão é o limite que foi configurado no kernel.

corpo_regraContém uma ou mais exigências que o pacote precisa coincidir para a regra ser atendida. Essa especificação pode incluir endereço ip de origem, endereço ip de destino, porta de origem, porta de destino, protocolo, interface de rede de entrada, interface de rede de saída etc. O corpo da regra pode possuir uma ou mais opções. Essas opções podem ser precedidas de "not", como negação, ou serem agrupadas em blocos OR, entre chaves, por exemplo: { dst-port 50 or dst-port 51 or not src-port 52 }.

A seguir as opções mais importantes:

// comentárioInsere o texto como sendo um comentário na regra.

dst-ip endereçoEndereço IP de destino do pacote.

dst-port portaPorta(s) de destino do pacote. Se for especificada mais de uma porta, separar por vírgula (50, 51, 52), ou em faixa de portas (50-60).

establishedSe o pacote tiver os bits RST ou ACK.

fragfragmentos de pacotes, não sendo o primeiro fragmento.

gid grupoPacotes TCP ou UDP enviados ou recebidos pelo grupo. O grupo pode ser especificado pelo nome ou pelo GID.

icmptypes tipoTipo(s) de pacotes ICMP. Se for mais de um, separar por vírgula. Os tipos podem ser: echo reply (0), destination unreachable (3), source quench (4), redirect (5), echo request (8), router advertisement (9), router solicitation (10), time-to-live exceeded (11), IP header bad (12), timestamp request (13), timestamp reply (14), information request (15), information reply (16), address mask request (17) e address mask reply (18).

in | outPacotes de entrada ou de saída. Note que isto significa que os pacotes estão entrando ou saindo da máquina, então

Page 81: Servidores FreeBSD

mesmo que um pacote venha da rede interna, estará entrando na máquina antes de sair.

keep-stateQuando um pacote coincidir com uma regra que tiver esta opção, será criada uma regra dinâmica, cujo comportamento será coincidir o tráfego bidirecional entre este ip/porta de origem e ip/porta de destino, no mesmo protocolo. A regra dinâmica expira após um certo tempo. Dessa forma, pode-se definir uma regra "check-state" anterior a esta, liberando este fluxo de pacotes, e teremos um firewall "stateful".

limit {ip-origem | porta-origem | ip-destino | porta-destino} númeroSerão permitidas apenas o número especificado de conexões com os parâmetros especificados.

mac mac-destino mac-origemPacotes com o endereço MAC de destino e/ou de origem especificados. Se não for especificado algum deverá ser usada a palavra "any", para coincidir com todos os endereços.

proto protocoloPacotes com o protocolo (IP) especificado. Veja /etc/protocols.

recv interface | xmit interface | via interfacePacotes recebidos pela interface de rede especificada (recv xl0), pacotes transmitidos pela interface especificada (xmit fxp0), ou pacotes passando pela interface, independentemente de entrar ou sair (via xl0). Quando xmit for utilizado é requerida a opção "out", já que o pacote estará saindo.

setupPacotes com o bit SYN mas sem o bit ACK.

src-ip endereçoEndereço IP de origem do pacote.

src-port portaPorta(s) de origem do pacote.

tcpflags flagsFlags dos pacotes TCP, separadas por vírgula. As possíveis são: fin, syn, rst, psh, ack e urg. A negação pode ser feita por um "!".

uid usuárioPacotes TCP ou UDP enviados ou recebidos pelo usuário. O usuário pode ser especificado pelo username ou pelo UID.

vrrevpathPra pacotes de entrada, é feita uma consulta ao endereço de origem na tabela de roteamento. Se a interface na qual o pacote entrou é a mesma de saída especificada pela rota, então a regra coincide. Isto pode ser utilizado para criar regras anti-spoofing. Os pacotes de saída não são submetidos à verificação.

Firewall Stateful

O funcionamento stateful permite que o firewall crie regras dinâmicas para fluxos específicos de pacotes. Pode-se fazer algumas coisas interessantes, como por exemplo manter o firewall fechado, bloqueando todo tráfego de fora para dentro e permitindo apenas que pacotes da rede interna saiam para a rede externa, passando por uma regra "keep-state". Assim, cada conexão feita de dentro para fora irá criar uma regra dinâmica, que irá liberar aquele tráfego nas duas direções, permitindo que os dados de resposta, por exemplo, uma página web que um usuário acessou, cheguem até a máquina do usuário, na rede interna.As regras dinâmicas possuem as seguintes informações: protocolo, endereço IP e porta de origem e endereço IP e porta de destino. Elas irão permitir o tráfego bidirecional, ou seja, mesmo que os endereços de origem e destino se invertam. Isto é uma das coisas que possibilita criar o que foi descrito acima. As regras dinâmicas possuem um tempo de vida limitado, que é determinado pelas variáveis net.inet.ip.fw.dyn*, do sysctl (maiores informações vide a man page do sysctl). Estas variáveis também determinam o número máximo de regras dinâmicas, entre outros.Uma regra dinâmica é criada cada vez que um pacote coincide com uma regra que possua as opções keep-state ou limit, não sem antes checar se a regra já existe. As regras dinâmicas são checadas na ocorrência da ação check-state.

Exemplo:

# ipfw add 1000 check-state# ipfw add 1100 allow tcp from 10.10.0.0/16 to any setup keep-state# ipfw add 1200 deny tcp from any to any

Este conjunto de regras irá, para cada pacote:1. Checar se existe alguma regra dinâmica que permita o tráfego do mesmo;2. Caso o pacote seja da rede 10.10.0.0/16 e tiver o bit SYN, mas não o bit ACK (indicando desta forma um início de conexão), irá permitir o tráfego e criar uma regra dinâmica;3. Bloquear qualquer outro tráfego.

Log

Page 82: Servidores FreeBSD

Para direcionar os logs do ipfw para o arquivo /var/log/ipfw/ipfw.log, primeiramente crie este diretório e este arquivo:

# mkdir /var/log/ipfw# touch /var/log/ipfw/ipfw.log# chmod -R 600 /var/log/ipfw

Então adicione as seguintes linhas ao arquivo /var/log/syslog.conf:

!ipfw*.* /var/log/ipfw/ipfw.log

Após isso, reinicie o syslog, através do comando "killall -HUP syslog". Talvez seja interessante também criar um script que faça a rotação deste log e agendar no Cron, ou adicionar uma entrada no newsyslog.conf, para que o arquivo não fique demasiado grande.

Arquivo de Regras

Não é recomendado editar o arquivo /etc/rc.firewall, que vem com o sistema. O seu conjunto de regras deverá ficar em um arquivo separado, exclusivo para isso. Este arquivo poderá ser um script shell ou poderá ser apenas uma listagem de regras, que o ipfw irá interpretar. O tipo de arquivo é uma escolha pessoal, e não fará diferença no funcionamento do firewall.

Arquivo com listagem de regras

Deverá ser criado um arquivo, por exemplo /etc/firewall, com dono root e permissão 600. Neste arquivo serão colocadas as regras, que são iguais às passadas via linha de comando ao ipfw, mas sem o comando "ipfw" no começo. Exemplo:

add 1000 allow src-ip 10.10.0.0/16 dst-ip 192.168.0.0/16

Para efetuar a inicialização destas regras no momento da inicialização, adicione ou modifique as seguintes linhas no /etc/rc.conf:

firewall_enable="YES"firewall_type="/etc/firewall"firewall_quiet="YES"

A opção firewall_quiet faz com que seja executado o comando "ipfw -q" ao invés de simplesmente "ipfw", ao ler cada regra do arquivo. Dessa forma ocorrerá uma operação "silenciosa", não gerando saídas na tela. Para interpretar um arquivo deste tipo via linha de comando, simplesmente execute "ipfw /etc/firewall".

Script de regras

No caso de criamos um script shell com as regras, também deverá ser criado um arquivo exclusivo para isso, como por exemplo /etc/firewall.sh, com dono root e permissão 700. O conteúdo deste arquivo pode ser como você quiser, pois trata-se de um script comum. Quando for passar as regras, o comando ipfw deve ser exatamente como se fosse via linha de comando. É recomendado usar a opção "-q", do comando ipfw, em scripts.Para que o script seja executado na inicialização do sistema, edite o arquivo /etc/rc.conf, remova as linhas (caso existirem) firewall_type e firewall_quiet, mantenha a linha

firewall_enable="YES"

e adicione a seguinte linha:

firewall_script="/etc/firewall.sh"

Deste ponto em diante, cabe a você decidir como deverá ser o comportamento do seu firewall, tendo em vista a que ele se destina. Sugiro a leitura do livro "Building Internet Firewalls", de D. Brent Chapman e Elizabeth D. Zwicky, da editora O'Reilly. Seguem abaixo algumas regras e um script simples, a título de exemplo.

Exemplos de Regras

(não esquecer do comando "ipfw" antes delas):

add 100 allow via lo0add 200 deny { dst-ip 127.0.0.0/8 or src-ip 127.0.0.0/8 }

Observe os espaços após a "{" e antes da "}". Se não houver este espaço será retornado o seguinte erro:

ipfw in free(): warning: modified (chunk-) pointer

Estas duas regras acima terão o mesmo efeito que as regras abaixo, no formato antigo, descritas anteriormente:

Page 83: Servidores FreeBSD

add 100 pass all from any to any via lo0add 200 deny all from any to 127.0.0.0/8add 300 deny ip from 127.0.0.0/8 to any

add 1000 allow src-ip 10.10.0.0/16 dst-port 80add 1100 allow dst-ip 10.10.0.0/16 dst-port 1024-65535

Irá permitir que máquinas da rede 10.10.0.0/16 enviem pacotes com destino a porta 80 e irá permitir que pacotes cheguem até a rede 10.10.0.0/16 com destino a portas entre 1024 e 65535, permitindo por exemplo a resposta de um pedido HTTP.

add 1000 allow proto tcp dst-port ssh recv xl0add 1100 deny proto tcp dst-port ssh out

Irá permitir que a máquina receba conexões TCP pela interface de rede xl0, à porta do ssh, que é a porta 22, conforme definido no arquivo /etc/services. Também irá negar a saída de qualquer pacote com protocolo TCP e com destino a porta do ssh.

add 1000 check-stateadd 1100 allow src-ip 10.10.0.0/16 keep-stateadd 1200 deny log ip from any to any

Irá permitir que a rede 10.10.0.0/16 estabeleça qualquer conexão, cujo tráfego de resposta será liberado pelas regras dinâmicas que serão criadas pela regra 1100 e que serão checadas pela regra 1000. Qualquer outro tráfego será bloqueado e logado no arquivo de log.

add 50 deny not vrrevpath in

Irá bloquear ip-spoofing, conforme explicado anteriormente.

add 500 deny log { src-ip 10.0.0.0/8 or dst-ip 10.0.0.0/8 } via xl0add 510 deny log { src-ip 172.16.0.0/12 or dst-ip 172.16.0.0/12 } via xl0add 520 deny log { src-ip 192.168.0.0/16 or dst-ip 192.168.0.0/16 } via xl0

Irá proibir o tráfego de pacotes de redes privadas, conforme definido na RFC1918, na interface de rede xl0. Também irá fazer log quando a regra coincidir com algum pacote.

add 100 prob 0.05 deny in

Irá bloquear 5% dos pacotes de entrada, como se houvesse perda de pacotes.

Exemplo de Script

#!/bin/sh

ipfw="/sbin/ipfw -q"

# IP localip="10.10.0.5"

# Portas de entrada permitidasportas="22,53,80"

$ipfw flush

Page 84: Servidores FreeBSD

$ipfw add 100 deny log not verrevpath in$ipfw add 1000 check-state$ipfw add 1100 allow src-ip $ip keep-state$ipfw add 1200 allow dst-port $portas in$ipfw add 65000 deny ip from any to any

3.5.4 - Controle de Tráfego

* IPFW2 + Dummynet

O Dummynet é uma ferramenta muito flexível para gerenciamento de banda, para impor ou simular algumas condições desejadas no tráfego da rede. Ele funciona interceptando os pacotes e passando-os por um ou mais "pipes" ou "queues", que podem efetuar a limitação de banda, perdas de pacotes, retardos de propagação etc. Os pipes são canais com largura de banda fixa, enquanto as queues representam filas de pacotes, associadas a um peso (weight). As queues compartilham, em proporção ao peso, a largura de banda dos pipes aos quais estão associadas.

Todo o gerenciamento do Dummynet é feito através do IPFW, que deverá estar configurado e funcionando. Veja sobre isto na seção Firewall - IPFW2. Há apenas duas opções a mais que devem ser adicionadas à configuração do kernel:

options DUMMYNEToptions HZ=1000

A segunda opção não é obrigatória, mas na maioria dos casos auxilia no funcionamento do Dummynet. Ela define a granularidade do timer utilizado pelo sistema, que é de 10ms (HZ=100) por padrão. Efeitos do Dummynet como o delay de propagação são aplicados um a cada ponto do timer, então reduzir a granularidade irá possibilitar o tratamento de taxas de tráfego mais altas, e a especificação de delays mais precisos. A opção HZ=1000 irá definir a granularidade para 1ms. Valores menores que 1ms não são recomendados, para maiores informações veja a RFC1323.

Adicionadas as opções, compile e instale o kernel, conforme descrito na seção Recompilação e Instalação do Kernel.

Após isso, basta adicionar as regras desejadas através do IPFW. As opções do IPFW específicas para Dummynet estão descritas abaixo.

Para definir um pipe utiliza-se o seguinte comando / regra:

ipfw pipe número config opções-configuração

Para a definição de uma queue utiliza-se o comando / regra abaixo:

ipfw queue número config opções-configuração

Em ambos os casos o parâmetro número não depende da númeração das demais regras do ipfw. As opções de configuração são as seguintes:

Opções de configuração específicas do pipe:

bw bandaDefine a largura de banda do pipe. A banda deve ser especificada em Kbit/s, Mbit/s, KByte/s ou MByte/s.

delay delayDefine o delay de propagação do pipe. O delay deverá ser especificado em milisegundos.

Opções de configuração específicas da queue:

pipe númeroConecta a queue ao pipe especificado. Podem ser conectadas várias queues a um único pipe.

weight pesoEspecifica o peso daquela queue. O valor pode variar de 1 a 100.

Principais opções de configuração, comuns ao pipe e à queue:

buckets tamanho-tabelaEspecifica o tamanho da tabela usada para guardar as diversas queues. O valor pode variar de 16 a 65536, o padrão é 64.

mask especificação-máscaraDefine diferentes fluxos através da aplicação da máscara especificada. Cada fluxo é enviado para uma queue ou pipe separado, criados dinamicamente. Cada pipe dinâmico terá a mesma largura de banda do pipe original, enquanto que cada queue dinâmica irá compartilhar com as demais dinâmicas a largura de banda do pipe ao qual está conectada a original. A especificação de máscara deve ser uma ou mais das seguintes:

Page 85: Servidores FreeBSD

dst-ip máscara, src-ip máscara, dst-port máscara, src-port máscara, proto máscara ou all.O parâmetro all define que todos os bits em todos os campos são significantes.

noerrorNão reporta o erro quando um pacote for perdido, por exemplo em uma simulação de perda de pacotes ou congestionamento.

plr taxa-perdaDefine a taxa de perda de pacotes. O valor deverá ser entre 0 e 1, com 0 significando nenhuma perda, e 1 significando 100% de perda.

queue {slots | tamanhoKBytes}Tamanho da fila, em slots ou KBytes.

Os comandos para manipular as regras de pipes e queues são similares aos das regras comuns do IPFW:

ipfw {pipe | queue} {delete | list | show} número

Exemplos

Limitar o tráfego da rede 10.10.0.0/16 para a 192.168.0.0/16 em 300 Kbit/s:

ipfw add 1000 pipe 1 src-ip 10.10.0.0/16 dst-ip 192.168.0.0/16ipfw pipe 1 config bw 300Kbit/s queue 50KBytes

Simular uma perda de pacotes de entrada de 5%:

ipfw add 1000 pipe 1 inipfw pipe 1 config plr 0.05

Limitar o tráfego em 300Kbit/s de entrada em ambas as direções:

ipfw add 1000 pipe 1 inipfw add 1100 pipe 2 outipfw pipe 1 config bw 300Kbit/s queue 50KBytesipfw pipe 2 config bw 300Kbit/s queue 50KBytes

Limitar o tráfego de cada máquina da rede 10.10.0.0/16 em 128Kbit/s nas duas direções:

ipfw add 1000 pipe 1 src-ip 10.10.0.0/16 outipfw add 1100 pipe 2 dst-ip 10.10.0.0/16 inipfw pipe 1 config mask src-ip 0x000000ff bw 128Kbit/s queue 10KBytesipfw pipe 2 config mask dst-ip 0x000000ff bw 128Kbit/s queue 10KBytes

Introduzir um delay no tráfego:

ipfw add 1000 pipe 1 inipfw add 1100 pipe 2 outipfw pipe 1 config delay 250ms bw 1Mbit/sipfw pipe 2 config delay 250ms bw 1Mbit/s

Devemos dar atenção ao tamanho da queue (fila) nos pipes quando fazemos limitação de banda, pois apesar de limitarmos a largura de banda em 50 Kbit/s, por exemplo, o MTU da interface de rede continua o normal, 1500 bytes. Se não for especificado o tamanho da fila, ela será muito grande e irá gerar um delay não desejado no tráfego. O tamanho padrão da fila é 50 slots, que multiplicado pelo MTU de 1500 bytes, dá o valor de 600 Kbits. Essa fila iria levar 12 segundos para ser preenchida por uma banda de 50 Kbit/s, o que é um atraso muito grande na comunicação.

Page 86: Servidores FreeBSD

3.5.5 - NAT (Network Address Translation)

* IPFW2 + NATD

O NAT - Network Address Translation, ou Tradução de Endereço de Rede - é um mecanismo que permite por exemplo que máquinas com endereços IPs de redes privadas se comuniquem com máquinas na Internet, que possuem IPs válidos. O daemon que implementa o NAT no FreeBSD é o natd.Um gateway rodando o natd irá alterar os pacotes que vão para a rede externa fazendo com que o IP de origem destes pacotes seja o endereço do gateway, e para cada pacote alterado cria uma entrada em uma tabela interna para registrar isso. A porta de origem também é alterada para indicar a entrada relacionada ao pacote na tabela. Todos os pacotes que chegam tendo como destino o gateway são verificados contra a tabela. Caso possua algum registro na tabela, o pacote é encaminhado para o IP interno e a porta correta.

Para fazer o NAT desta forma, é preciso que o daemon natd esteja rodando em uma porta específica. O IPFW filtra o tráfego decidindo o que deve ser encaminhado para NAT, e faz isso através de um socket divert.

Para que o NAT funcione com IPFW2, são necessárias as seguintes opções no kernel:

options IPFIREWALL options IPFW2options IPDIVERT

Veja maiores detalhes na seção de configuração do IPFW2, é importante saber como funciona, pois o NATD sozinho não fará nada. O firewall deverá estar configurado e funcionando.

Também é necessário que a máquina atua como Gateway. Para isso, insira a seguinte linha no arquivo /etc/rc.conf:

gateway_enable="YES"

Segue abaixo a descrição dos principais parâmetros do natd:

-logFaz o log de algumas informações no arquivo /var/log/alias.log. Este arquivo é truncado cada vez que o natd for inicializado.

-deny_incomingNão permite a passagem de pacotes que não possuam uma entrada na tabela interna de tradução.

-log_deniedFaz um log de cada pacote bloqueado, via syslog. É interessante direcionar este log para um arquivo, via /etc/syslog.conf.

-log_facility daemonFaz o log com a "facilidade" do syslog especificada.

-use_socketsAloca um socket para cada conexão ftp data, permitindo melhor funcionamento do FTP.

-same_portsTenta manter a mesma porta quando altera os pacotes de saída. Com isso, protocolos como RPC têm mais chances de funcionar.

-verboseNão se torna um daemon, fica rodando no console. Útil para debug.

-unregistered_onlyAltera apenas os pacotes de saída que pertençam a redes privadas (RFC1918).

-redirect_port proto ipdestino:portadestino [ipalias:]portaalias [ipremoto[:portaremota]]Redireciona conexões de entrada na porta "portaalias" para o host "ipdestino" na porta "portadestino". O parâmetro "proto" deverá ser tcp ou udp. O parâmetro "ipalias" pode ser utilizado para especificar o endereço da placa de rede onde a máquina deverá esperar este tipo de conexão. Os parâmetros "ipremoto" e "portaremota" podem ser especificados se você deseja determinar que somente as conexões vindas deste ip e porta deverão ser redirecionadas.

-redirect_proto proto iplocal [ippublico [ipremoto]]Redireciona os pacotes de entrada do protocolo "proto" destinados ao endereço "ippublico" para o endereço "iplocal". Os protocolos se encontram listados em /etc/protocols. Se "ippublico" não for especificado, será utilizada a interface de tradução padrão. Se o parâmetro "ipremoto" for especificado, apenas os pacotes vindos deste endereço serão redirecionados.

-redirect_address iplocal ippublicoRedireciona o tráfego que chega em "ippublico" para o host "iplocal". Esta função é conhecida como SNAT - Static NAT, ou NAT Estático.

Page 87: Servidores FreeBSD

-redirect_port proto ipdestino:portadestino[,ipdestino:portadestino[,...]] [ipalias:]portaalias [ipremoto[:portaremota]]-redirect_address iplocal[,iplocal[,...]] ippublicoEstes formatos de "-redirect_port" e "-redirect_address" são utilizados para distribuir de forma transparente a carga de um servidor entre vários. Essa função é conhecida como LSNAT - Load Sharing NAT - definida pela RFC2391. Cada conexão será direcionada para uma máquina, em ordem round-robin.

-port portaUtiliza a porta especificada para operação. Note que trata-se de uma porta "divert". Se esta opção não for especificada, é utilizada a porta padrão do natd, que é 8668, conforme especificado em /etc/services.

-alias_address endereçoUtiliza o endereço especificado para fazer a tradução. Este endereço deverá ser de uma interface de rede da máquina local e geralmente é da interface conectada a rede externa. Esta opção ou a opção abaixo (uma das duas) deve ser sempre utilizada.

-interface interfaceEspecifica a interface de rede em que será feita a tradução. Similar ao "-alias_address endereço", geralmente é a interface que se conecta à rede externa.

-config arquivoUtiliza as configurações determinadas no arquivo. As opções que não levam argumentos são seguidas de yes ou no.

-reverseFaz com que o natd trabalhe de forma inversa com os pacotes de entrada e de saída. Desta forma, ele pode operar na interface interna ao invés da externa. Útil para algumas situações de proxy transparente.

-proxy_onlyForça o natd a trabalhar apenas como um proxy transparente. Não são efetuadas traduções de endereços.

-proxy_rule port porta server ip:portaTrabalha como proxy transparente, redirecionando pacotes TCP com a "porta" especificada para o host e porta "ip:porta".

-punch_fw basenumber:countEssa opção permite ao natd "abrir buracos" no ipfw para conexões FTP funcionarem corretamente. Isto é feito automaticamente instalando uma regra temporária no firewall que irá permitir a conexão. Assim que a conexão for encerrada a regra é removida. O argumento "basenumber" especifica o número de regra inicial e o argumento "count" especifica o máximo de regras que serão criadas.

-log_ipfw_deniedFaz o log quando um pacote não pode ser re-injetado devido a uma regra no ipfw que bloqueia o mesmo.

-pid_file arquivoEspecifica um arquivo alternativo para guardar o PID. O padrão é /var/run/natd.pid.

Os parâmetros do natd podem ser passados via linha de comando ou podem ser colocados em um arquivo, você que sabe. Geralmente a opção do arquivo é mais interessante, por facilitar a organização.

Exemplo 1:Vamos supor que você possua uma rede interna 10.10.0.0/16. A interface externa é a xl1, com o endereço 192.168.0.5. Crie um arquivo chamado /etc/natd.conf e insira as configurações, uma em cada linha. Segue o exemplo abaixo:

-------------------- Arquivo natd.conf --------------------# natd.conf

use_sockets yesalias_address 192.168.0.5punch_fw 500:100-------------------- Fim do arquivo natd.conf --------------------

Coloque a seguinte regra no ipfw2:

add 1000 divert natd via xl1

Note que esta regra deverá ficar antes de qualquer outra regra que possa permitir que os pacotes entrem e saiam da máquina, pois caso contrário provavelmente esta regra nem será lida. Após feita a tradução pelo natd, o pacote é reinjetado no ipfw na regra logo após a 1000 (neste caso), então qualquer outro bloqueio poderá afetar o tráfego.

Exemplo 2:

Adicione ao cenário acima o fato de você ter um servidor web rodando na máquina 10.10.0.15 da rede interna, e deseja que todas as conexões ao IP 192.168.0.6, que é um alias da interface xl1, sejam direcionadas para este servidor.

Page 88: Servidores FreeBSD

Mantenha a configuração como está, apenas adicione a seguinte linha no /etc/natd.conf:

redirect_port tcp 10.10.0.15:80 192.168.0.6:80

Para que o natd seja inicializado no corretamente no momento do boot, insira as linhas abaixo no arquivo /etc/rc.conf:

natd_enable="YES"natd_flags="-config /etc/natd.conf"

Para inicializar o natd no console digite a seguinte linha de comando:

/sbin/natd -config /etc/natd.conf

3.5.6 - Proxy e Cache HTTP

* Squid

O Squid é um software largamente utilizado como servidor proxy e cache HTTP em diversos tipos de redes, como corporativas, de provedores, universidades etc. Possui alta performance e suporta os protocolos HTTP, FTP e Gopher. A sua página é www.squid-cache.org. De um modo simplificado, o Squid recebe os pedidos de usuários que desejam visualizar páginas externas e verifica se tem a página em cache. Se tiver a página em cache, verifica se ela ainda é válida e envia para o cliente. Se não tiver a página em cache, busca a página no servidor externo, armazena no cache e manda para o cliente. Assim, na próxima vez que alguém solicitar esta página a mesma será carregada muito mais rapidamente, pois estará em um cache local. Entre as principais vantagens de utilizar o Squid estão:

· Aumento na segurança, pois todas as requisições para páginas externas irão passar através do proxy;· Aumento da velocidade de navegação e/ou diminuição da utilização do link Internet, já que muitas páginas acessadas pelos usuários estarão em cache local;· Possibilidade de definir uma política de acesso, bloqueando páginas fora do escopo a que se destina a Internet na instituição, como chat, pornografia etc.

O Squid necessita de um diretório no disco onde irá armazenar o seu cache. Geralmente, em máquinas com esse propósito criamos um filesystem especial para o Squid, que pode ser /squid, onde serão guardados o cache e os logs. O tamanho do cache pode ser determinado pela configuração do Squid, e quanto maior o cache mais páginas serão armazenadas e mais rápida será a navegação.

Efetue o download da última versão estável do Squid, a partir do seu site. A versão atual é 2.5 STABLE4, e o arquivo se encontra em http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE4.tar.gz. Extraia este arquivo no /tmp, e vá até o diretório que será criado.

Execute os seguintes comandos:

# ./configure --prefix="/usr/local" --sysconfdir="/usr/local/etc/squid" --localstatedir="/var" --enable-storeio="ufs diskd" --enable-removal-policies="lru heap" --enable-default-err-language="Portuguese" --disable-hostname-checks# make# make install

O executável do Squid será instalado em /usr/local/sbin/squid. O arquivo de configuração será /usr/local/etc/squid/squid.conf. Deve ainda ser removido o diretório /var/logs (iremos utilizar outro diretório para os logs do Squid):

# rmdir /var/logs

Crie um usuário e um grupo de nome squid:

# pw group add squid -g 180# pw user add squid -c "Squid" -d "/nonexistent" -s "/sbin/nologin" -u 180 -g 180

Crie o diretório /var/log/squid, para armazenar os logs do Squid. Atribua a este diretório o dono squid e aplique a permissão 750.

Vá até o diretório /usr/local/etc. Visualize o arquivo squid.conf.default e veja todas as opções. Segue abaixo um exemplo sintetizado do arquivo squid.conf. Copie-o no diretório mencionado. Mantenha o squid.conf.default como referência.

-------------------- Arquivo squid.conf --------------------# squid.conf

# Define em qual ip e porta o Squid devera aguardar requisicoes.# Pode ser definido o IP interno, no caso de uma maquina com# mais de uma interface. Tambem pode ser especificada apenas a

Page 89: Servidores FreeBSD

# porta. O padrao eh ouvir todas as interfaces na porta 3128.#http_port 10.10.0.5:3128

# O parametro no_cache define que determinados objetos não deverão# ser armazenados em cache. Eh preciso primeiro definir uma acl# indicando quais os objetos. Em seguida aplica-se o no_cache a# esta acl.acl QUERY urlpath_regex cgi-bin \?no_cache deny QUERY

# O parametro cache_mem nao especifica o tamanho maximo do processo# do Squid, que ira ultrapassar este valor. O cache_mem se destina a# especificar o espaco em memoria destinado aos objetos em transito e# outros importantes. A prioridade eh dos objetos em transito, e# apenas o espaco restante sera ocupado pelos outros (Hot Objects e# Negative-Cached Objects). Se o espaco necessario para os objetos# em transito for maior que cache_mem sera alocada mais memoria,# ou seja, cache_mem nao especifica um limite de memoria. O padrao# eh 8 MB.#cache_mem 8 MB

# Tamanho maximo dos objectos armazenados no cache no disco.# O padrao eh 4096 KB.#maximum_object_size 4096 KB

# Tamanho minimo dos objetos armazenados no cache no disco.# O padrao eh 0, sem limite.#minimum_object_size 0 KB

# Tamanho maximo dos objetos mantidos em memoria.# O padrao eh 8 KB.#maximum_object_size_in_memory 8 KB

# O parametro cache_replacement_policy determina qual a politica# de substituicao dos objetos quando se esgota o espaco destinado# ao cache em disco.# lru: mantem os objetos referenciados recentemente.# heap GDSF: otimiza o "hit rate" por manter objetos pequenos e# e populares no cache, guardando assim um numero maior de objetos.# heap LFUDA: otimiza o "byte hit rate" por manter objetos populares# no cache sem levar em conta o tamanho. Se for utilizado este, o# maximum_object_size devera ser aumentado para otimizar o LFUDA.cache_replacement_policy heap GDSF

# O memory_replacement_policy define a politica de substituicao dos# objetos em memoria, da mesma forma como o cache_replacement_policy.# Os valores possiveis são os mesmos. O padrao eh lru.#memory_replacement_policy lru

# O cache_dir define qual o diretorio e qual o espaco# utilizado para o cache no disco. Podem ser definidos# varios diretorios se necessario. O tamanho (em MB) nao deve# ser o tamanho total da particao, descontar no minimo# 20%.# cache_dir diskd Diretorio Tamanho 16 256 Q1=72 Q2=64cache_dir diskd /squid 1000 16 256 Q1=72 Q2=64

# Log de requisicoes.cache_access_log /var/log/squid/access.log

# Log do cache.cache_log /var/log/squid/cache.log

# Log de objetos guardados. Pode ser desativado.cache_store_log none

# Arquivo com o PID.pid_filename /var/log/squid/squid.pid

# Tempo de espera para resolver conexoes pendentes antes de

Page 90: Servidores FreeBSD

# efetuar o shutdown do Squid. O padrao eh 30 seconds.shutdown_lifetime 10 seconds

# ACLs gerais.acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objectacl localhost src 127.0.0.1/255.255.255.255acl to_localhost dst 127.0.0.0/8acl SSL_ports port 443 563 10000acl Safe_ports port 80 21 443 563 70 210 1025-65535 280 488 591 777acl CONNECT method CONNECT

# ACL que define os clientes permitidos. Especificar as redes que# irao utilizar o cache.acl clientes src 10.10.0.0/16 10.20.0.0/16

# ACLs para paginas proibidas. Os arquivos especificados conterao# as ACLs, para facilitar a edicao.acl proibido-url url_regex -i "/usr/local/etc/squid/proibido-url"acl proibido-urlpath urlpath_regex -i "/usr/local/etc/squid/proibido-urlpath"acl proibido-dominios dstdom_regex -i "/usr/local/etc/squid/proibido-dominios"

# Permitir ou negar o acesso baseado nas acls.http_access allow manager localhosthttp_access deny managerhttp_access deny !Safe_portshttp_access deny CONNECT !SSL_portshttp_access deny proibido-urlhttp_access deny proibido-urlpathhttp_access deny proibido-dominioshttp_access allow clienteshttp_access deny all

# Usuario sob o qual ira rodar o Squid.cache_effective_user squid

# Grupo sob o qual ira rodar o Squid.cache_effective_group squid

# Hostname completo.visible_hostname squid.exemplo.org

# Opcoes para suportar proxy transparente.httpd_accel_host virtualhttpd_accel_port 80httpd_accel_with_proxy onhttpd_accel_uses_host_header on

# Numero de arquivos de log rotacionados a guardar.logfile_rotate 4

# O parametro always_direct permite definir que as requisicoes# preenchendo as exigencias de determinada ACL serao sempre# encaminhadas direto ao servidor requisitado. Exemplo:#acl servidores-locais dstdomain dominiolocal.org#always_direct allow servidores-locais

# Evita que sejam feitos coredumps.coredump_dir none-------------------- Fim do arquivo squid.conf --------------------

O diretório no qual o Squid irá guardar o cache deverá ter o dono squid e permissão 750.

Como estaremos utilizando o diskd, é interessante fazer um certo tuning, adicionando algumas opções no kernel. Adicione as opções abaixo, e após isso recompile e instale o novo kernel, e reinicie a máquina.

# Suporte a memoria compartilhada.options SYSVSHM

Page 91: Servidores FreeBSD

# Maximo de segmentos de memoria compartilhada por processo.options SHMSEG=16

# Numero maximo de identificadores de memoria compartilhada.options SHMMNI=32

# Tamanho maximo de segmento de memoria compartilhada.options SHMMAX=2097152

# Numero maximo de paginas de memoria compartilhada.options SHMALL=4096

# Suporte a filas de mensagens.options SYSVMSG

# Numero maximo de bytes por fila de mensagem.options MSGMNB=16384

# Numero maximo de identificadores de filas de mensagens.options MSGMNI=41

# Numero maximo de segmentos de mensagem no sistema.options MSGSEG=2049

# Tamanho de um segmento de mensagem.options MSGSSZ=64

# Numero maximo de mensagens no sistema.options MSGTQL=2049

Após ter configurado, execute o Squid pela primeira vez com a opção "-z":

# /usr/local/sbin/squid -z

Isto irá criar a estrutura de diretórios que irá suportar o cache.

Para efetuar o serviço de proxy transparente, este servidor deverá encaminhar para a porta do Squid as requisições HTTP vindas dos clientes, da rede interna por exemplo. Para isso, você deverá ter um firewall configurado e funcionando, veja a seção IPFW2. Coloque a seguinte regra no ipfw2:

add 800 fwd 127.0.0.1,3128 dst-port { 80 or 21 } src-ip 10.10.0.0/16add 810 allow dst-port 3128 dst-ip 10.10.0.5 src-ip 10.10.0.0/16add 900 deny dst-port 3128

A rede 10.10.0.0/16 no exemplo é a rede interna, cujas requisições nas portas 80 e 21 serão direcionadas para a porta 3128 em localhost. Também será permitido que máquinas da rede local contatem o Squid, caso o proxy seja configurado manualmente. O ip 10.10.0.5 no exemplo é o da interface do servidor conectada a rede interna. A terceira regra irá bloquear qualquer outro tráfego tendo como destino a porta 3128. Estas regras devem ficar antes da(s) regra(s) do NAT, caso esteja utilizando-o.

Vá até o diretório /usr/local/etc/squid. Poderão ser criados os arquivos proibido-url, proibido-urlpath e proibido-dominios, todos com o dono squid. Estes arquivos deverão possuir a relação de páginas cujo acesso não será permitido. Deverão ter uma entrada por linha, e descritas em expressões regulares - na maioria das vezes não são necessárias espressões muito elaboradas, bastando inserir as strings, uma por linha. O arquivo proibido-url deve conter as strings que serão verificadas contra toda a URL. O proibido-urlpath, as strings que serão verificadas contra a URL completa menos o nome do servidor e domínio, por exemplo no endereço www.exemplo.org/testes/pagina, o urlpath é apenas "testes/pagina". Já o proibido-dominios é o contrário, contém as strings que serão verificadas apenas contra o nome e domínio do site, no exemplo anterior seria "www.exemplo.org". Um excelente guia sobre expressões regulares se encontra no endereço http://aurelio.net/er/.

Para que os logs do Squid sejam rotacionados na freqüência desejada, insira uma linha no arquivo /etc/crontab que execute o comando "squid -k rotate". O exemplo abaixo faz com que a rotação seja feita todo sábado às 23h58min:

58 23 * * 6 root /usr/local/sbin/squid -k rotate

Crie um script de inicialização para o Squid, em /usr/local/etc/rc.d/squid.sh. Os comandos de inicialização e shutdown deverão ser, respectivamente:

/usr/local/sbin/squid

e

Page 92: Servidores FreeBSD

/usr/local/sbin/squid -k shutdown

3.5.7 - Relatório de Uso do Squid

* Sarg (Squid Analysis Report Generator)

O Sarg - Squid Analysis Report Generator - como o próprio nome diz serve para gerar relatórios de utilização do Squid. É desenvolvido por um brasileiro, e seu site é http://web.onda.com.br/orso/sarg.html. O Sarg gera relatórios em HTML.

Faça o download da última versão do Sarg a partir de seu site. A versão atual é 1.4.1 e se encontra em http://web.onda.com.br/orso/sarg-1.4.1.tar.gz. Extraia o arquivo no diretório /tmp, será criado o diretório sarg-1.4.1, acesse-o. Execute os comandos abaixo:

# ./configure --enable-bindir=/usr/local/bin --enable-sysconfdir=/usr/local/etc# make# make install

O executável será instalado em /usr/local/bin/sarg, e o arquivo de configuração será /usr/local/etc/sarg/sarg.conf. Mova este arquivo para sarg.conf.original, para tê-lo como referência, e copie e adapte o exemplo abaixo em seu lugar, ou simplesmente edite o sarg.conf e altere os parâmetros que achar necessários:

-------------------- Arquivo sarg.conf --------------------# sarg.conf

# Idioma.language Portuguese

# Local do arquivo de log do Squid.access_log /var/log/squid/access.log.0

# Titulo do relatorio.title "Relatorio de Uso do Squid"

# Diretorio onde sera salvo o relatorio.output_dir /usr/local/apache2/htdocs/sarg

# Converter enderecos IP para nomes DNS ou não.resolve_ip yes

# Formato da data. e=dd/mm/yy.date_format e

# Numero de relatorios que devem ser mantidos.# Insira 0 (zero) para não limitar.lastlog 12

# Local do arquivo exclude_codes.exclude_codes /usr/local/etc/sarg/exclude_codes-------------------- Fim do arquivo sarg.conf --------------------

Crie o diretório /usr/local/apache2/htdocs/sarg para que sejam guardados aí os relatórios. Será acessível através de http://servidor/sarg, este diretório pode ser protegido por senha se você preferir (através do Apache).

Especificamos no arquivo de configuração que será analisado o arquivo access.log.0 para gerar o relatório. Poderá ser especificado o arquivo access.log, mas da forma como fizemos fica mais prático para fazer a rotação do arquivo de log, através do "squid -k rotate". Desta forma, agendamos no Cron a execução da rotação do log e após isso o Sarg, que fará a análise do arquivo recém-rotacionado.

Exemplo de entrada no /etc/crontab:

58 23 * * 6 root /usr/local/sbin/squid -k rotate10 00 * * 7 root /usr/local/bin/sarg

Com isso, a rotação do log será feita às 23h58min no sábado, e o Sarg irá gerar os relatórios à 0h10min.

3.5.8 - Gráfico de Consumo de Banda

* MRTG (Multi Router Traffic Grapher)

O MRTG - Multi Router Traffic Grapher - é uma ferramenta que gera gráficos indicativos do consumo de banda em redes. Os gráficos, no formato PNG, são inseridos em relatórios HTML, e são atualizados constantemente, mostrando as condições dos enlaces de rede de uma forma bastante clara e atualizada. O MRTG é desenvolvido em Perl e C. Seu

Page 93: Servidores FreeBSD

site oficial é http://people.ee.ethz.ch/~oetiker/webtools/mrtg.

Além da função original do MRTG, que é monitorar roteadores através do protocolo SNMP (Simple Network Management Protocol), ele também pode ser utilizado para monitorar diversos outros sistemas, como servidores de e-mail, Squid, servidores web, condições do tempo, temperatura etc. Basta que se tenha alguma fonte de dados para que o MRTG gere seus gráficos.

O relatório de consumo de banda para um determinado link possui quatro gráficos: diário, última semana, últimas cinco semanas e último ano. Normalmente, trabalha-se com quatro dados, na seguinte ordem: contagem de bytes de entrada, contagem de bytes de saída, uptime e nome.

Faça a instalação do MRTG através do Ports. É mais fácil, já que o MRTG depende de algumas bibliotecas gráficas que podem não estar instaladas no seu sistema, Vá até o diretório /usr/ports/net/mrtg e digite o comando "make install". O MRTG será instalado, o seu executável ficará em /usr/local/bin/mrtg, e seu arquivo de configuração no diretório /usr/local/etc/mrtg/. É instalado por padrão um arquivo de configuração de exemplo, mrtg.cfg.sample. Mantenha-o como referência, e crie outro arquivo, com o nome mrtg.cfg para as suas configurações.

As principais opções de configuração são descritas abaixo:

WorkDir: /usr/local/apache2/htdocs/mrtgLocal onde serão colocadas as páginas e os gráficos.

RunAsDaemon: YesRodar como um daemon ou não.

Interval: 5Intervalo em minutos entre aquisições de dados pelo MRTG. O padrão é 5 minutos, que também é o valor mínimo.

Refresh: 300Tempo em segundos para atualização da página no browser. O padrão é 300.

Language: brazilianIdioma.

Target:Especifica quais as portas de quais roteadores o MRTG deverá consultar e construir gráficos. Os principais formatos são:

Target[nome]: porta:community@roteador

Target[nome]: /ip:community@roteador

O nome é uma descricao da porta/link, e o community é a senha para acesso via SNMP ao roteador. Exemplos:

Target[link1]: 1:[email protected]

Target[link2]: /192.168.0.15:[email protected]

A especificação do endereço IP da porta ao invés do número é útil em alguns casos onde a ativação ou desativação de uma porta no equipamento muda toda a seqüência.

Para combinar mais de uma porta no mesmo gráfico, somando os dados, deve-se utilizar o seguinte formato:

Target[portas3e4]: 3:[email protected] + 4:[email protected]

Pode ser utilizado também algum programa ou script externo para gerar os dados lidos pelo MRTG. A saída do script deverá conter 4 linhas:

Linha 1: estado atual da primeira variável, normalmente a contagem de bytes de entrada.Linha 2: estado atual da segunda variável, normalmente a contagem de bytes de saída.Linha 3: string com o uptime do dispositivo.Linha 4: string com o nome do dispositivo.

Para utilizar um script deste tipo, a entrada no mrtg.cfg deverá ter o formato abaixo:

Target[disco1]: `/usr/local/script/df2mrtg /dev/ad0s1a`

MaxBytes[nome]: 12500000Velocidade máxima em bytes/segundo para aquela porta.

Title[nome]: Análise de Tráfego da Porta 1 do Roteador XTítulo da página que será gerada.

PageTop[nome]: <H1>Análise de Tráfego</H1><br>Qualquer texto.HTML a ser inserido no topo da página.

PageFoot[nome]: Qualquer texto...

Page 94: Servidores FreeBSD

HTML a ser inserido no final da página.

Unscaled[nome]: dwNão altera a escala vertical dos gráficos especificados de acordo com o tráfego, ou seja, mesmo havendo baixos valores a escala continua a mesma. Os gráficos especificados podem ser (d)ay, (w)eek, (m)onth e (y)ear.

WithPeak[nome]: wmPor padrão os gráficos semanal, mensal e anual contém apenas as médias de tráfego, sem mostrar os picos. Esta opção indica que deverão ser exibidos os picos de tráfego para os gráficos especificados.

Suppress[nome]: ymNão produz os gráficos especificados.

PNGTitle[nome]: Trafego Link YInsere o texto como título no gráfico gerado.

Options[nome]: opçõesPermite definir algumas opções booleanas. As principais são:

growrightPor padrão os gráficos crescem para a esquerda. Este parâmetro inverte, fazendo com que os dados mais recentes estejam na parte esquerda do gráfico.

bitsExibe os valores em bits ao invés de bytes nos gráficos.

noinfoNão coloca as informações uptime e nome do dispositivo na página.

nopercentNão exibe as porcentagens de utilização.

transparentGera os gráficos com fundo transparente.

noborderGera os gráficos sem borda.

Para incluir parâmetros que serão usados em mais de um dispositivo (determinado pelo valor "nome"), pode-se fazer uso de valores padrão, especificados como o nome "_". Exemplo:

Options[_]: growright,noinfoMaxBytes[_]: 12500000

Todos os parâmetros decritos deverão estar no arquivo de configuração, mrtg.cfg. Segue abaixo um exemplo do arquivo:

-------------------- Arquivo mrtg.cfg --------------------# mrtg.cfg

WorkDir: /usr/local/apache2/htdocs/mrtg

RunAsDaemon: Yes

Language: brazilian

Options[_]: growright,bits

Target[porta1]: 1:[email protected][porta1]: 12500000Title[porta1]: Analise de Trafego Porta 1PageTop[porta1]: <H1>Estatisticas Porta 1</H1>

Target[porta2]: 2:[email protected][porta2]: 1250000Title[porta2]: Analise de Trafego Porta 2PageTop[porta2]: <H1>Estatisticas Porta 2</H1>-------------------- Fim do arquivo mrtg.cfg --------------------

Crie um usuário de nome mrtg no grupo mrtg, para não precisar rodar o MRTG como root. Execute os seguintes comandos:

# pw group add mrtg -g 190

Page 95: Servidores FreeBSD

# pw user add mrtg -c "MRTG" -d "/nonexistent" -s "/sbin/nologin" -u 190 -g 190

Deverá ser criado o diretório no qual o MRTG irá colocar as páginas e os gráficos e deverá ser atribuído o dono mrtg ao diretório, que é definido pelo parâmetro "WorkDir". Atribua também o dono mrtg ao diretório /usr/local/etc/mrtg.

Para inicializar o MRTG utilize o seguinte comando:

# /usr/local/bin/mrtg --user=mrtg --group=mrtg /usr/local/etc/mrtg/mrtg.cfg

Faça alguns testes, e verifique as páginas criada em http://servidor/mrtg/. A página com os gráficos de cada porta/link terá o nome que foi especificado no arquivo de configuração, por exemplo porta1.html, porta2.html etc. Você poderá criar uma página index.html para agrupar estes gráficos ou para fornecer links para a página de cada porta.

Faça um script de inicialização para o MRTG, com os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/bin/mrtg --user=mrtg --group=mrtg /usr/local/etc/mrtg/mrtg.cfg > /dev/null

e

kill -9 `cat /usr/local/etc/mrtg/mrtg.pid`

4 - Artigos Diversos4.1 - Adição de Espaço de Swap em ArquivoEm determinado momento você pode se deparar com um servidor que necessita de mais espaço para Swap, seja porque a partição swap original foi mal calculada ou por qualquer outro motivo. A maneira mais simples é criar um arquivo e instruir o sistema a fazer swap naquele arquivo.

Inicialmente, edite o arquivo de configuração do kernel e adicione a seguinte linha:

pseudo-device vn 1

Após isso, recompile e instale o novo kernel, e então reinicie a máquina. Estes passos estão descritos na seção Recompilação e Instalação do Kernel.

Após a reinicialização da máquina, deve ser criado o dispositivo "vn":

# cd /dev # sh MAKEDEV vn0

Defina o tamanho desejado de swap adicional, e então crie o arquivo. O exemplo abaixo irá criar um arquivo chamado /usr/swap0, com 2GB (2048 blocos de 1024k cada):

# dd if=/dev/zero of=/usr/swap0 bs=1024k count=2048 # chmod 0600 /usr/swap0

Edite o arquivo /etc/rc.conf e adicione a seguinte linha:

swapfile="/usr/swap0"

Agora basta reiniciar a máquina para ativar o novo espaço de swap, ou executar a seguinte linha de comando:

# vnconfig -e /dev/vn0b /usr/swap0 swap

Você pode verificar se a swap nova está ativa e também o uso da swap através do comando "swapinfo".

Maiores informações sobre a adição de swap em um sistema FreeBSD podem ser obtidas no endereço http://www.freebsd.org/handbook/adding-swap-space.html.