Deixando seu OpenBSD com cara de Linux

Maio 21, 2007

Este artigo tem como objetivo deixar o terminal do OpenBSD mais amigável, principalmente para aqueles que estão acostumados com as facilidades do bash no linux. O OpenBSD utiliza por padrão o shell csh, com ele você não tem o recurso de “auto-completar”, por exemplo, se você digitar cd /usr/lo[TAB] no csh nada irá acontecer, para que ele complete com /usr/local devemos utilizar o bash. Além deste recurso vamos implementar as cores do ls, que também ajudam muito na visualização rápida de algum arquivo e que não é padrão do OpenBSD. O primeiro passo é instalar o pacote do bash, para isso temos duas opções, a primeira, e recomendada pela equipe do OpenBSD é a seguinte:

Instalação do bash
pkg_add -v ftp://ftp.kd85.com/pub/OpenBSD/3.7/packages/i386/bash-3.0.16p0.tgz

A outra maneira é compilar o pacote pelos ports, caso você não tenha a árvore de ports, baixe em algum mirror e descompacte no diretório /usr:
cd /usr/ports/shells/bash/
make && make install
Com isso teremos o bash no sistema, mas seu usuário ainda está utilizando o shell csh, para que você possa utilizar o bash devemos editar o arquivo /etc/shells e colocar o bash ali para que o sistema aceite sua utilização:
echo “/usr/local/bin/bash” >> /etc/shells

Habilitando bash para o uso
Nosso próximo passo será alterar o shell do usuário no sistema, para isso vamos utilizar o comando chpass, este comando irá abrir um arquivo com os dados de seu usuário, os comandos para edição são os mesmos do vi. Você deve ter algo parecido com isto:
# Changing user database information for root.
Login: root
Encrypted password: $1b$58$W0GO8s5BDdXxRu349xsauVfJSa3TuYrNVKlasdj9lLM2uvIFe
Uid [#]: 0
Gid [# or name]: 0
Change [month day year]:
Expire [month day year]:
Class: daemon
Home directory: /root
Shell: /usr/local/bin/bash
Full Name: Charlie &
Office Location:
Office Phone:
Home Phone:

Neste ponto basta efetuar o login novamente para começar a utilizar o bash, porém, vamos fazer mais alguns ajustes para que ele fique o mais parecido possível com o terminal que você utiliza no Linux.
touch /etc/bashrc
chmod 755 /etc/bashrc
echo “export PS1=’u@h:w$ ‘” >> /etc/bashrc
Esta variável PS1 é a responsável por exibir no console o path em que você se encontra atualmente. (Vide comando para instalar o bash)

Cor do ls
Agora vamos fazer o ls ficar colorido, o ls do OpenBSD não é igual ao do Linux, por isso temos que instalar outro pacote para habilitarmos esta feature. Mais uma vez podemos instalar o pacote pre-compilado ou compilar pelo ports, neste caso vou instalar o pacote, caso você queria instalar pelo ports, ele fica em: /usr/ports/sysutils/colorls.
pkg_add -v ftp://ftp.kd85.com/pub/OpenBSD/3.7/packages/i386/colorls-3.7.tgz

Se você digitar ls agora ele ainda não estará colorido, assim como no Linux existe o alias ls=`ls –color`, no OpenBSD também devemos criar um alias, mas um pouquinho diferente:
echo “alias ls=’colorls -FG’” >> /etc/bashrc
Prontinho, basta efetuar o login novamente e todas as alterações entrarão em vigor.


Cluster de Firewall com carp + pfsync

Maio 21, 2007

Introdução
Para quem não conhece o assunto, com carp + pfsync é possível criar um cluster de firewalls de uma forma que elimine um único ponto de falha, e ainda por cima é totalmente transparente, uma máquina pode explodir que a outra irá assumir instantaneamente e você não vai perder se quer um misero pacote de seu download. CARP = Common Address Resolution Protocol, o carp é o principal responsável pelo compartilhamento de IP entre o cluster. É com ele que faremos a redundância das máquinas, se uma cair a outra irá assumir o ip setado no carp. Além do carp iremos utilizar o PFSYNC para fazer a sincronia de estados das conexões entre as máquinas, é por causa dele que se uma máquina cair e o tráfego for redirecionado para a outra a conexão não será cortada.

Requerimentos
Neste exemplo vou criar um cluster apenas entre duas máquinas, então vamos precisar de duas máquinas duh :P , cada uma delas com 3 placas de rede. Porque 3 placas? Simples, uma para a rede válida, outra para a rede privada, e a última como meio de sincronia dos estados das conexões entre as duas máquinas. Além disso iremos precisar de 8 IPs diferentes, 4 para cada máquina, 1 ip válido para cada máquina, 1 ip privado para cada máquina, mais 1 ip privado para cada máquina para sincronia (pfsync) e mais 2 ips virtuais que serão setados em cada carp, um público e outro privado. Não se assustem com a quantidade de ips utilizados, logo tudo isso irá ficar mais claro.

Configurações

CARP
Primeiro vamos criar as interfaces do carp, sim, elas funcionam como uma interface virtual :) .
Um pequeno resumo dos ips:
fw01:
xl0 – 200.x.x.2
xl1 – 192.168.0.2
rl0 – 10.10.10.1
carp0 – 200.x.x.1
carp1 – 192.168.0.1
fw02:
xl0 – 200.x.x.3
xl1 – 192.168.0.3
rl0 – 10.10.10.2
carp0 – 200.x.x.1
carp1 – 192.168.0.1
Execute isso nas duas máquinas, não se preocupe com os parâmetros, irei explica-los:
# ifconfig carp0 create
# ifconfig carp1 create
Máquina 1:
# ifconfig carp0 vhid 1 pass senha carpdev xl0 advskew 0 200.x.x.1 netmask 255.255.255.0
# ifconfig carp0 vhid 2 pass senha carpdev xl1 advskew 0 192.168.0.1
netmask 255.255.255.0
Máquina 2:
# ifconfig carp0 vhid 1 pass senha carpdev xl0 advskew 128 200.x.x.1 netmask 255.255.255.0
# ifconfig carp0 vhid 2 pass senha carpdev xl1 advskew 128
192.168.0.1 netmask 255.255.255.0

Parâmetros
vhid: O Virtual Host ID. Este é um número único que é usado para identificar o grupo de redundância de outros nós na rede. Valores aceitos são 1 à 255.
pass:É a senha de comunicação entre os nós, evitando que algum engraçadinho entre na rede afim de snifar o tráfego.
carpdev: Aqui é especificado a qual interface o carp está conectado.
advskew: Ele define a prioridade da máquina, quanto menor o valor maior a prioridade, em nosso caso, se as duas máquinas estiverem no ar, a primerira irá funcionar como master.

PFSYNC
Agora vamos configurar o meio de sincronia entre os nós:
Máquina 1:
# ifconfig rl0 10.10.10.1 netmask 255.255.255.252
Máquina 2:
# ifconfig rl0 10.10.10.2 netmask 255.255.255.252
Nas duas máquinas:
# ifconfig pfsync0 syncdev rl0
Como estou utilizando apenas 2 máquinas eu interliguei as 2 através de um cabo cross, com isso eu evito que alguém tente conectar um cabo na rede (caso houvesse).

SYSCTL
Outra coisa importante é ativar o carp com o sysctl, estas são as possíveis entradas:
net.inet.carp.allow: Aceita entrada de pacotes CARP ou não. Padrão é 1 (sim).
net.inet.carp.preempt: Permite hosts dentro de um grupo de redundância ter um melhor advbase e advskew para tomar o lugar (preempt) do master. Adicionalmente, esta opção habilita failing over em todas as interfaces caso uma interface caia (down). Se uma interface física CARP cair, o CARP trocará o advskew para 240 em todas as outras interfaces CARP, em essência o failing termina por si mesmo. Esta opção é 0 (desabilitada) por padrão.
net.inet.carp.log: Loga pacotes CARP. O padrão é 0 (desabilitado).
net.inet.carp.arpbalance: Carrega balanceamento de tráfego entre múltiplos hosts no grupo de redundância. O padrão é 0 (desabilitado). Veja carp(4) para mais informações.
Precisamos ativar o preempt, para isso execute nas duas máquinas:
# sysctl -w net.inet.carp.preempt=1

Salvando as Configurações
Como o carp e o pfsync são tratados como interfaces, o arquivo de configuração a ser criado para eles é quase igual ao de uma placa de rede.
Crie os respectivos arquivos em cada uma das máquinas com os respectivos IPs:
/etc/hostname.carp0:
# inet 200.x.x.2 255.255.255.0 200.x.x.255 vhid 1 advskew 0 carpdev xl0 pass senha
/etc/hostname.carp1:
# inet 192.168.0.2 255.255.255.0 192.168.0.255 vhid 2 advskew 0 carpdev xl0 pass senha
/etc/hostname.rl0:
# inet 10.10.10.1 255.255.255.252 NONE
/etc/hostname.pfsync0:
# up syncdev rl0
E para finalizar habilite o preempt do carp no /etc/sysctl.conf

Testando
Depois de tudo configurado você verá algo do tipo em sua máquina:
[root@firewall01 admin]$ ifconfig
lo0: flags=8049 mtu 33224
groups: lo
inet 127.0.0.1 netmask 0xff000000
xl0: flags=8943 mtu 1500
lladdr 00:50:04:42:f1:c1
groups: egress
media: Ethernet 100baseTX full-duplex
status: active
inet 200.x.x.2 netmask 0xfffffff0 broadcast 200.x.x.255
xl1: flags=8943 mtu 1500
lladdr 00:50:04:42:aa:bb
media: Ethernet 100baseTX full-duplex
status: active
inet 192.168.0.2 netmask 0xffffff80 broadcast 192.168.0.255
rl0: flags=8843 mtu 1500
lladdr 00:15:f2:b0:80:3d
media: Ethernet 100baseTX full-duplex
status: active
inet 10.10.10.1 netmask 0xfffffffc broadcast 10.10.10.3
pflog0: flags=141 mtu 33224
pfsync0: flags=41 mtu 1460
pfsync: syncdev: rl0 syncpeer: 224.0.0.240 maxupd: 128
enc0: flags=0 mtu 1536
carp0: flags=8843 mtu 1500
carp: MASTER carpdev xl0 vhid 1 advbase 1 advskew 0
groups: carp
inet 200.x.x.1 netmask 0xfffffff0 broadcast 200.x.x.255
carp1: flags=8843 mtu 1500
carp: MASTER carpdev xl1 vhid 2 advbase 1 advskew 0
groups: carp
inet 192.168.0.1 netmask 0xffffff80 broadcast 192.168.0.255

Caso você execute ifconfig carp0 down, ou tirar um cabo de rede o carp0 da segunda máquina irá mudar de BACKUP para MASTER.
Existem três estados para uma interface do carp:
MASTER: Acho que dispensa comentários :)
BACKUP: Esse também :D
INIT: INIT é quando a interface ainda não está no ar, é o que irá acontecer se você executar o ifconfig carpX down.

Firewall
Outra coisa importante a se fazer é liberar o tráfego do carp e pfsync no firewall :D Sem isso tudo o que foi feito anteriormente é inútil.
Não irei entrar em detalhes sobre o firewall agora, apenas insira isto no inicio de suas regras para garantir que tudo vai funcionar como esperado:
#libera carp entre as maquinas fw
pass quick on { $pfsync_if } proto pfsync
pass quick on { $ext_if $int_if } proto carp keep state
Não se esqueça de criar as variáveis definindo as interfaces para pfsync_if,etc.


OpenBSD – Apache – pf –

Maio 21, 2007

Apache
O Apache já vem pré-instalado no OpenBSD, bastando apenas algumas modificações para o seu funcionamento desejado. No nosso exemplo, queremos rodar ele com suporte a PHP, então devemos instalar o PHP:
cd /usr/ports/www/php4
make
make install
/usr/local/sbin/php4-enable
E depois adicionar as seguintes linhas no /var/www/conf/httpd.conf, para ele aceitar seus scripts PHP:
LoadModule php4_module /usr/lib/apache/modules/libphp4.so
DirectoryIndex index.php index.html index.wml index.php3
AddType application/x-httpd-php .php .php3 .phtml
AddType application/x-httpd-php-source .phps

E então reiniciar o apache:
apachectl restart

pf
O OpenBSD ( a partir do 3.0) vem com o packetfilter (pf), que é um excelente filtro de pacotes, mas com uma configuração bem simples, toda dentro do arquivo “/etc/pf.conf” (nat.conf para nat). No nosso exemplo, usaremos a política de bloquear todo o acesso a nossa máquina, liberando apenas as portas usadas por nós (22,25,53,80 e 110). O acesso de saída será totalmente liberado. Nosso arquivo de configuração ficaria então desse modo:
#echo >> /etc/pf.conf


Compartilhar conexão com FreeBSD

Maio 21, 2007

Introdução
Certamente, se você está começando a ir mais à fundo no mundo do nosso querido FreeBSD, e tem uma pequena rede local , com certeza tem interesse em compartilhar sua conexão de Internet para toda a rede, otimizando assim todo o tráfego.
Você vai aprender agora, uma forma prática e objetiva de compartilhar a Internet com o natd, e instalar um squid para cachear as páginas acessadas pela rede. Primeiramente, você deve compilar o kernel com estas configurações abaixo, para otimizar o diskd do Squid e habilitar o ipdivert e ipfirewall:

Parametros de compilação

options NETGRAPH
options NETGRAPH_PPPOE
options NETGRAPH_ETHER
options NETGRAPH_PPP
options NETGRAPH_ASYNC
options NMBCLUSTERS=65536
options MSGBUF_SIZE=1048576
options SYSVMSG
options MSGMNB=16384

options MSGMNI=41
options MSGSEG=2049
options MSGSSZ=64
options MSGTQL=512
options SHMSEG=16
options SHMMNI=32
options SHMMAX=2097152
options SHMALL=4096
options IPDIVERT
options IPSTEALTH

options IPFIREWALL
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options DUMMYNET
options TCPDEBUG
Se você não sabe onde localiza-se o arquivo de configuração do kernel, é no diretório “/usr/src/sys/i386/conf”. Aqui no site há um artigo ensinando a compilar o kernel, siga-o para acertar esta etapa.
Reinicie o seu computador.

Configuração

Logo após seguir esta etapa, você precisa habilitar o natd , o repasse de pacotes e o seu firewall . Vá ao arquivo “/etc/rc.conf” e insira as seguintes linhas:
natd_enable=”YES”
natd_interface=”xy0″ #onde xy0 é a sua interface onde há a conexão com a internet.
gateway_enable=”YES”
firewall_enable=”YES”
firewall_type=”OPEN” #tipo do firewall

Feito isto, salve o seu “rc.conf” e reboote novamente. Se você inicialmente estiver com algum problema para navegar, digite como root o seguinte comando do ipfw:
ipfw add 65000 allow ip from any to any
Este comando irá repassar todos os pacotes, ignorando as regras de bloqueio, pode ser útil em algumas situações :) .
Ok, teoricamente você já estará compartilhando o seu acesso à Internet.

Instalação do Proxy

Vamos à etapa posterior igualmente importante, que é a instalação do cache (proxy) Squid. A função do squid é a de fazer cache das páginas acessadas pela rede, bem como filtrar o acesso a determinada páginas, entre outras funções importantes mas que não serão vistas neste artigo.
Vá como root, ao diretório “/usr/ports/www/squid” e digite o comando “make install clean”. Deixe as opções padrões marcadas e espere a instalação se completar.
Agora, vamos dar uma pequena olhada no arquivo onde contém os parâmetros de configuração do mesmo, denominado “squid.conf” que está em “/usr/local/etc/squid/”.
Alguns parâmetros básicos devem ser vistos, conforme abaixo:
http_port 3128 #porta onde roda o seu squid
cache_mem 16 MB # quantidade de memória alocada pelo seu squid, quanto mais melhor :)
dns_nameservers 200.215.1.35
200.202.30.1 200.202.17.1 #servidores dns
acl rede src 192.168.1.0/24

#esta ACL ou seja, regra, é para controlar o acesso ao seu squid. No caso, eu digo que a acl rede #possui a origem a rede
192.168.1.0/24.

http_access allow rede # este parâmetro libera a ACL rede para navegar.

httpd_accel_port 80 #aceleramento da porta
httpd_accel_host virtual
httpd_accel_with_proxy on

httpd_accel_uses_host_header on
Basicamente estes parâmetros já deixam o seu squid seguro e funcional.
Agora tem mais outro passo importante, que é fazer o proxy trabalhar de forma transparente, sem precisar configurar nada nas máquinas clientes. No meu firewall eu inseri a seguinte linha:
${fwcmd} add 60 fwd 127.0.0.1,3128 tcp from 192.168.1.0/24 to any 80 via rl0
Lembrando que a interface rl0 deve ser substituída pela interface da sua rede local. Insira esta linha, abaixo das regras que lêem o tipo do firewall , no nosso caso é open. Se você se perder, procure esta linha e insira a regra do firewall abaixo.
case ${firewall_type} in
[Oo][Pp][Ee][Nn])
Ok, está quase tudo pronto, faltando somente o parametro dentro do “rc.conf” no “/etc” para startar o squid automaticamente. Insira o seguinte parâmetro:
squid_enable=”YES”
Salve o arquivo, e reinicie o seu gateway. E teste, para ver se não houve algum problema.


DNS (Named) facilmente no FreeBSD

Maio 21, 2007

Introdução

Muitos usuários que pretendem colocar um domínio no ar, ficam praticamente perdidos, na hora de configurar os seus servidores DNS. Configurar o DNS, requer pelo menos o conhecimento de seu “modus operandi”. Explicarei, passo a passo, a forma mais prática e rápida de configurar o DNS, para funcionar tranquilamente na suarede. –

Como funciona o DNS?
O DNS, funciona da seguinte maneira:
Todo site ou host, possui um IP na internet. O DNS traduz, o seu ip para um endereço em formato de string.
Exemplo: Usando o nslookup – nslookup bsdpe.teste.com.br
Name: bsdpe.teste.com.br
Address: 66.200.200.97
Como você pode perceber, o nosso site possui um IP. Então, o nosso servidor de DNS, publicou para toda a Internet, que possuimos dentro deste host , este ip.
Certo, agora você já sabe como funciona basicamente o DNS.

Configurando o DNS no FreeBSD
Os arquivos de configuração do named, ficam normalmente, dentro da pasta “/etc/namedb”. Para configurar os arquivos, você deve estar logandos-se como root.
Normalmente, você precisa mexer para cada domínio novo, em dois arquivos, o named.conf e o arquivo da sua zona.
Lá dentro do seu arquivo do named, você vai ter essas linhas:
options {
directory “/etc/namedb”;
version “Named 6.6.6″;
statistics-file “/var/log/named.stats”;
dump-file “/var/log/named.dump”;
};
O que significa isto? São os parametros de opções que você pode setar para o seu named, acima nós temos o diretório onde estão os arquivos, a versão, que por um acaso eu alterei, para evitar que pessoas mal intencionadas saibam a versão do named, podendo se setado para qualquer valor.
Temos também o arquivo de estatística, e o de dump.
Normalmente, você pode usar o padrão que estou colocando.
logging{
category lame-servers{
null;
};
};
Estas opções são as opções de log, estou dizendo que os servidores mal-configurados não devem ter suas mensagens de erros logadas no meu servidor.
key “rndc-key”{
algorithm hmac-md5;
secret “jRt3wd1fmqu+GRcfPq4DAQ==”;
};
A chave secreta do meu “named”, a grosso modo pode-se usar esta.
zone “.” {
type hint;
file “named.root”;
};
Aqui está a zona “.”, ou seja, a zona raiz da internet, apontando para o arquivo que deve ser lido, no caso o named.root.

Agora, vem a parte “boa” da história, a configuração de seu domínio.
zone “bsdpe.teste.com.br ” {
type master;
file “bsdpe.teste.com.br “;
allow-transfer{
66.246.212.96;

};
allow-query{
any;
};
};
Zone, como nome diz, é a zona a ser configurada, normalmente você coloca o nome de seu domínio.
Type, é o modo de operação de seu named, se ele é o master (principal) ou slave (secundário).
Quando você configura o seu servidor slave, que é o secundário, nao é necessário fazer o procedimento abaixo e basta liberar ele dentro do allow-transfer dentro de seu servidor master. Não esqueça de apontar o seu servidor master dentro da linha masters.
zone “bsdpe.teste.com.br ” {
type slave;
file “bsdpe.teste.com.br “;
masters{
66.246.212.96;
};

allow-query{
any;
};
};
File é o arquivo dentro da pasta “/etc/namedb” onde estarão as configurações do meu domínio, no caso gnx.com.br
Allow-transfer seria o(s) servidor(es) slave que podem acessar meus arquivos.
Allow-query é o parametro utilizado para liberar o uso do meu DNS por qualquer computador, para resolver os nomes.
Agora, vamos para a segunda etapa, que seria o arquivo onde há a configuração de seu domínio.
==teste.com.br == (arquivo de zona)
Este arquivo é só um exemplo, se você quiser pegar os arquivos para testar, no fim do artigo estarão os links para download.
$TTL 86400 – Time to Live, é o tempo de atualização do named (em segundos)
@ IN
SOA ns.teste.com.br . hostmaster.ns.teste.com.br . (

2003262236
1H
15
14D
12H )
Aqui acima, eu estou dizendo que o meu servidor é o dono do domínio SOA, com a informação do nome da máquina (teste.com.br ), e o responsável hostmaster.teste.com.br .
Dentro dos parenteses, eu estou dizendo o Serial 2003262236 e os parâmetros de atualização, normalmente você pode deixar estes parametros.
teste.com.br .
IN NS
ns.teste.com.br .

Aqui eu digo que o meu servidor teste.com.br possui como seu servidor de dns, a máquina
ns.teste.com.br , que no caso é ela mesma. A flag NS, serve para setar o Name Server.

teste.com.br .
IN MX
5
ns.teste.com.br
A entrada MX, é responsável pelo servidor de e-mail. No caso, a linha acima diz que o dominio teste.com.br possui um servidor de e-mail (MX), com prioridade 5 (pode-se deixar este padrão) , apontando para a máquina ns.teste.com.br , no caso, ela mesma novamente.
teste.com.br .
IN A
66.246.212.96

ns
IN A
66.246.212.96

ns2
IN A
66.246.212.96

free
IN A
66.246.212.96

free.teste.com.br .
IN A
66.246.212.96
Aqui abaixo, eu seto as máquinas que fazem parte da rede, ou os aliases da minha máquina, a ns.teste.com.br . o campo A de aliases, serve para apontarmos o host ao ip que desejamos.
www.bsdpe.teste.com.br . IN CNAME teste.com.br .
ftp.bsdpe.teste.com.br . IN CNAME teste.com.br .

smtp.teste.com.br . IN CNAME teste.com.br .
pop.teste.com.br . IN CNAME teste.com.br .

webmail.teste.com.br. IN CNAME teste.com.br.
A linha CNAME, é o Canonical Name, ou seja, o apelido da máquina.
Digamos, que você já tem um alias pronto A, no caso, o teste.com.br apontando para um ip. Em vez de você fazer os outros hosts repetidamente, você pode simplesmente dizer que , o seu host vai herdar as mesmas configurações do host teste.com.br.
ns.teste.com.br.
IN A
66.246.212.96

ns
IN A
66.246.212.96

cidade.teste.com.br. IN CNAME teste.com.br.

teste.teste.com.br.
IN A
192.168.1.1

localhost.teste.com.br. IN A 127.0.0.1

nas.teste.com.br. IN A 66.246.212.96

pop3.teste.com.br .
IN A
66.246.212.96
Terminando de configurar, você deve parar o named e reiniciá-lo novamente. A grosso modo, você pode usar o comando killall named, e para startar digite named .


Recuperando sua senha no FreeBSD

Maio 21, 2007

Introdução

Olá pessoal! Peço desculpas pela demora em escrever deste artigo, mas como sempre, work work and work… ;)

Bom, vamos direto ao assunto: Já aconteceu de você esquecer sua senha de root? Ou então precisar descobrir a senha de root de uma máquina cujo você tem acesso físico? Ok, no FreeBSD também dá pra você “recuperar” a sua (ou não!?!?) senha de root.

Para isso, aí vai uma receitinha de bolo. Se você nao entender e tiver que me enviar um e-mail perguntando “como é que se faz isso?”, “como é que se faz aquilo?”, back to Window$ Dolly.

Aí vai:

Tenha em mente que você vai ter que dar um boot na máquina (pra tudo se tem um preço).

Reinicie a máquina e quando entrar na tela de contagem regressiva para iniciar o FreeBSD, pressione qualquer tecla para entrar o prompt de comando para as opções de boot.

Digite “boot -s” para entrar no modo monousuário.

Quando o FreeBSD lhe pedir para você colocar o caminho de uma shell, aperte enter, pois não vai fazer diferença mesmo…

Pronto, você já fez login no sistema operacional e nem precisou digitar a sua senha. Mas pensa que é só mudar a senha agora com passwd?

Tente… passwd… ;)

Se você conseguiu, parabéns, já pode reiniciar a máquina e parar de ler isso aqui.

Caso você não tenha conseguido, você não tem permissão de escrita na partição que está o “/etc/passwd” e “/etc/master.passwd”. Para obter permissão de escrita, então digite “mount -a”.

Feito, tente agora… passwd… ;)

And now… reboot the machine Dolly.


Solução de backup para servidores Windows, Linux & BSD’s.

Maio 21, 2007

Um administrador de sistema muitas vezes se depara em unificar um método para fazer os backups de seus servidores, principalmente se eles forem de ambientes mistos (por exemplo, Windows & Linux – o mais comum).

Este tutorial não é específico para servidores. Pode ser utilizado para fazer backup de estações Windows (9x/NT/2000/XP), Linux e BSD’s (FreeBSD, OpenBSD, NetBSD).

Neste pequeno tutorial, pretendo mostrar como é fácil criar uma rotina de backup homogênea e simples para facilitar a vida de muitos administradores de sistema.

O que você vai precisar:

  • Servidor(es) Windows NT4/2000/2003;
  • Servidor(es) Linux (qualquer distribuição);
  • Servidor(es) BSD’s (FreeBSD, OpenBSD, NetBSD);
  • cwRsyncServer (para servidores Windows);
  • rSync (para servidores Linux);
  • Script para o backup;
  • Dispositivo de armazenamento (neste tutorial utilizaremos o hd de nosso servidor encarregado dos backups).

[ation.html.

Exemplo do rsyncd.conf:

Abaixo, temos um exemplo de configuração do cwRSyncServer.

use chroot = false
strict modes = false
hosts allow = 172.30.31.253/255.255.255.255 127.0.0.1/255.255.255.0
log file =
rsyncd.log
pid file = rsyncd.pid
[Compartilhamentos]
path = /cygdrive/c/Compartilhamentos
comment = Documentos
read only = true
transfer logging = no

Obs.: Note que no path temos “/cygdrive/” antes de c/Compartilhamentos. Esta é a convenção utilizada pela cygwin (http://www.cygwin.com ).

RSync:

Geralmente, nas distribuições Linux você já pode encontrar pré-instalado o rsync. Assim como fizemos no cwRSyncServer, você deverá editar o arquivo rsyncd.conf. Este arquivo tem sua localização variada, dependendo da distribuição Linux/BSD utilizada. Na maioria dos casos está localizada no /etc. Caso esteja em outra localização, consulte a documentação do rsync (man rsynd.conf ou man rsync).

Juntando tudo

Agora que você já tem o rsync / cwRSyncServer instalado e configurado nos equipamentos que sofrerão backup, basta criar um script para fazer o backup e agendar no cron.

Eis um exemplo de script para backup de várias máquinas:

#!/bin/bash
#
# backup.sh
#
# Faz o backup dos servidores da rede, criando um subdiretório para cada
# um dos diretórios exportados via rSync.
#
# Autor: Luis Fernando Kieça
# Criado em: 14/10/04

# Última modificação em: 14/10/05
#

BACKUP_DIR='/mnt/hdc1/backup'
BACKUP_SERVERS='172.30.31.250 172.30.31.251 172.30.31.252 
172.30.31.253 172.30.31.254'

for SERVER in ${BACKUP_SERVERS}; do
# cria o diretório do backup se não existir
if [ ! -d ${BACKUP_DIR}/${SERVER} ]; then
mkdir ${BACKUP_DIR}/${SERVER}
fi

# entra no diretório do servidor correspondente

cd ${BACKUP_DIR}/${SERVER}

# descobre os diretórios exportados
SHARES=`rsync ${SERVER}:: | awk '{ print $1 }'
for SHARE in $SHARES; do
# Cria o diretório para cada compartilhamento (se não existir) e entra nele.

if [ ! -d ${BACKUP_DIR}/${SERVER}/${SHARE} ]; then
mkdir ${BACKUP_DIR}/${SERVER}/${SHARE}
fi
cd ${BACKUP_DIR}/${SERVER}/${SHARE}

#Faz o backup do compartilhamento
rsync -vurgoapl --delete-excluded${SERVER}::${SHARE} .

done
done

Obs.: Não esqueça de colocar a permissão para execução no script. :)

Agora, com o script criado, basta agendar a tarefa no crontab (ou no próprio agendador de tarefas do Windows).

Considerações finais:

Num primeiro momento, puxo todos os arquivos para o disco rígido do servidor encarregado do backup. Após isto ter sido concluído, efetuo a cópia em meio removível. Desta maneira, o servidor não demora para executar os backup diários (incrementais+diferenciais). Será demorado apenas na sua primeira execução (a máquina que conterá os arquivos precisará ter uma cópia de tudo o que possui nas demais máquinas).

Algumas coisas para se implementar nesta rotina:

  • Segurança (esta rotina não utiliza-se de nenhuma validação de usuário/senha)
  • Criptografia (os dados trafegam sem criptografia)
  • Compressão (para não congestionar sua rede e poder executar o script nos horários de expediente e possuir mais de um backup por dia)
  • Retorno do backup (pode-se exportar o diretório onde acontecem os backups via samba para que esteja disponível facilmente via rede ao retornar os arquivos.

Mas estes dois itens, eu deixo para você, leitor, implementar em seus servidores…


Montando um completo servidor de backup usando Bacula no FreeBSD

Maio 21, 2007

Muito se questiona sobre a preocupação com a segurança da informação nas empresas, normas, padrões e soluções disponíveis para (tentar) garantir uma infra-estrutura que suporte todos os negócios de uma empresa. Mas desde os primórdios da informática, quando o assunto é segurança, logo vem em mente o conceito de backup. Antes de qualquer adoção de políticas de segurança e normas que regem boas práticas em segurança da informação, o bom administrador de sistemas que se preze deve ter um trabalho de backup assegurando o mínimo de segurança. Seguindo essa linha e buscando sempre soluções que atendam as necessidades das empresas, o Bacula apresenta-se como uma plataforma cliente/servidor completa de Backup, suportando multíplas plataformas (inclusive clientes Windows), uso de discos e/ou fitas para o armazenamento dos dados, diferentes agendamentos para um mesmo trabalho de backup, uso de uma mesma fita para vários backups, e muitas outras opções. E o melhor de tudo é que o Bacula é open source! Em resumo, Bacula é uma completa solução para criação de trabalhos de backup em rede, com poderosos recursos, multíplas funções e de fácil configuração. A seguir apresentarei minha experiência com o Bacula, desde a instalação num sistema FreeBSD até sua configuração e agendamento de trabalhos, lógico de acordo com cada necessidade.

Instalação

Apesar de a instalação ter sido realizada no FreeBSD via ports, acredito que não haverá problemas na instalação em distribuições Linux; a única mudança será no momento da instalação e nos caminhos onde foram instalados os arquivos do Bacula. O Bacula armazena toda sua informação em base de dados MySQL, SQLite e até PostgreSQL, ou seja, antes de qualquer coisa você deverá ter instalado em seu servidor um desses programas. Chega de papo e mãos à obra: Como dito acima, instalei o Bacula no sistema via ports no FreeBSD. A versão utilizada do Bacula foi a 1.34.6.

cd /usr/ports/sysutils/bacula
make –DWITH_POSTGRESQL7
make install

Minha instalação foi simples, quase que padrão. Somente especifiquei o suporte ao banco PostgreSQL versão 7. Dependendo de seu caso, deverá configurar seu Bacula com suporte ao banco que escolher. Para maiores informações sobre as opções de instalação do Bacula, consulte o manual on-line ou baixe no formato PDF no site; até sua documentação é excelente, completa até com exemplos. Agora é hora de criar o banco de dados Bacula em seu SGBD. Nesse exemplo utilizei o PostgreSQL.

cd /usr/ports/sysutils/bacula/work/bacula-1.34.6/src/cats
./create_postgresql_database
./make_postgresql_tables
./grant_postgresql_privileges


Segurança

Os daemons utilizados pelo Bacula deverão rodar com usuário bacula. Na instalação via ports o usuário/grupo foram criados automaticamente. No arquivo /etc/passwd podemos encontrar a seguinte linha: bacula:*:1002:1002::0:0:Bacul Daemon:/var/db/bacula:/sbin/nologin

Em seguida, devemos definir as permissões para o diretório onde se encontra o BD Bacula:

chown -R bacula:bacula /var/db/bacula/

Configuração

Como deu pra perceber, a instalação do Bacula é simples e sem complicações. Por padrão os arquivos de configurações ficam em /usr/local/etc. Agora é a hora da configuração do servidor e, para isso, deve-se entender sua estrutura organizacional. Divide-se em 3 partes: – o Director (bacula-dir.conf) é a parte mais complexa do sistema, afinal é a principal onde figura-se toda a configuração dos trabalhos de backup (job), agendamentos, pools, seleção do que fazer backup (FileSet), definição do tipo de armazenamento, etc. Enfim, é onde se configura os clientes e arquivos que irão fazer parte do backup, além de se comunicarem com os clientes e dispositivos de armazenamento. – File Daemon (bacula-fd.conf) representa uma especié de agente, rodando em cada máquina que for participar de um trabalho de backup. Em resumo, todo cliente deverá ter rodando esse daemon, estabelecendo uma comunicação com o Director, que por sua vez gerencia todas essas comunicações. – Storage Daemon (bacula-sd.conf) é o arquivo de configuração do Bacula onde se insere os dispositivos de armazenamento, como fitas e discos. Esse daemon é responsável por estabelecer a comunicação com esses dispositivos.

Em resumo, a boa divisão das funções que compõem um serviço de backup do Bacula permite sua fácil configuração e administração. Para a configuração geral de um dado backup, edite o arquivo bacula-dir.conf; para configurar um cliente, é só editar o file daemon (bacula-fd.conf) na máquina que irá se comunicar com o servidor (onde se encontra a unidade de armazenamento); e para configurar o tipo de dispositivo que irá armazenar os trabalhos, é só editar o bacula-sd.conf. Antes de iniciar a configuração desses 3 arquivos, deve-se ter em mente o sistema de backup que você irá adotar para sua empresa. Ele irá variar de acordo com a necessidade de negócio. Nesse artigo o exemplo de configuração será baseado no seguinte sistema: – backup do próprio servidor, realizando a cópia completa de todos os sites hospedados, no período de segunda à sexta. Como deu pra perceber, configurei o Bacula no mesmo servidor Web, onde se encontra a unidade de dispositivo (fita DAT Sony SDT-9000). – Backup do servidor de e-mail, realizando a cópia de todas as pastas das contas existentes, também no mesmo período que o servidor Web. Esse é o cliente, rodando FreeBSD.

De acordo com os trabalhos definidos, agora é chegada a hora de configurar o Bacula para atender esses backups. Abaixo seguem os exemplos dos arquivos de configurações do servidor (onde se encontra a fita DAT). Não irei explicar todos os parâmetros de configuração, até porque são muitos. Como sempre, é só consultar o manual do Bacula para obter todas as informações sobre os recursos disponíveis. Primeiro irei configurar o arquivo bacula-sd.conf, inserindo as principais diretivas sobre o dispositivo de armazenamento:

# vi /usr/local/etc/bacula-sd.conf
#
Storage {
Name = "server-dir"
#por padrão o bacula já utiliza o nome do servidor #em que foi instalado, nesse caso o director será #identificado como server-dir

SDPort = 9103
#porta de conexão com o daemon
WorkingDirectory = "/var/db/bacula"
PidDirectory = "/var/run"
SubSysDirectory = "/var/db/bacula"
#diretórios utilizados pelo Bacula, também padrão

}

#
# List Directors who are permitted to contact Storage daemon
#
Director {
Name = server-dir
Password = "senha"
}

#
# Devices supported by this Storage daemon
# To connect, the Director must have the same Name #and MediaType,

# which are sent to the File daemon
#
Device {
Name = "DDS-3"
Media Type = DDS-3
Archive Device = /dev/sa0
#nesse caso, o dispositivo configurado é uma fita #DAT Sony SDT-9000, DDS-3. O caminho para #acesso no FreeBSD é o /dev/sa0, portanto muita #atenção para a configuração de acordo com seu #sistema

AutomaticMount = yes;
Offline On Unmount = yes
AlwaysOpen = yes;
RemovableMedia = yes;
Hardware End of Medium = No
BSF at EOM = yes
}

Messages {
Name = Standard
director = server-dir = all

operator = root = mount
}
#mensagens também padrão

Agora é hora de configurar o bacula-fd.conf de nosso servidor, afinal ele também será backupeado. Em resumo, o único parâmetro alterado foi a conexão com o Director, onde você deve inserir a mesma senha cadastrada no bacula-dir.conf. Obviamente elas devem coincidir para que sejam estabelecidas as conexões entre o Director, seu cliente, e o dispositivo.

#
# Default Bacula File Daemon Configuration file
#
# There is not much to change here except perhaps #the File daemon Name to
#

#
# List Directors who are permitted to contact this File #daemon

#
Director {
Name = server-dir
Password = "senha"
}

#
# "Global" File daemon configuration specifications
#
FileDaemon {
Name = ns2-fd
FDport = 9102
WorkingDirectory = /var/db/bacula

Pid Directory = /var/run
#arquivos de conexão com o daemon, também #padrão
}

# Send all messages except skipped files back to Director
Messages {
Name = Standard
director = server-dir = all, !skipped

}

Como teremos 2 clientes, o próprio servidor e outra máquina, tendo seus dados backupeados é preciso configurar somente o file daemon (bacula-fd.conf) da máquina conectada em rede. Antes disso, é preciso instalar o Bacula com a opção –enable-only-client. Após essa etapa, é só editar o arquivo com as mesmas configurações acima. Depois é só startar seu daemon. Para ter certeza de que tudo está em ordem com esse cliente, certifique-se de que o daemon esteja rodando:

ps awux | grep bacula
bacula 25934 0.0 0.7 3104 1892 ?? Ss Mon03PM 0:23.72 /sbin/bacula-fd -v -c /usr/local/etc/bacula-fd.conf

Beleza, está funcionando. A porta 9102 está aberta, pronta pra estabelecer conexão com o servidor quando esse efetuar o backup. Agora é chegada a hora de configurar o arquivo principal do Bacula, o Director. Nele iremos inserir os jobs, agendamentos, clientes e os arquivos a serem backupeados:

#
# Kerns Production Bacula Director Daemon #Configuration file
#

Director {
Name = server-dir
DIRport = 9101
QueryFile = "/usr/local/etc/query.sql"
WorkingDirectory = "/var/db/bacula"

PidDirectory = "/var/run"
SubSysDirectory = "/var/db/bacula"
Maximum Concurrent Jobs = 2
#como teremos 2 jobs sendo executados num #mesmo agendamento, a parâmetro foi alterado. O #padrão é 1.

Password = senha
}

Schedule {
Name = "Diario"
Run = Level=Full Pool=SegundaPool Monday at 10:00pm
Run = Level=Full Pool=TercaPool Tuesday at 10:00pm
Run = Level=Full Pool=QuartaPool Wednesday at 10:00pm

Run = Level=Full Pool=QuintaPool Thursday at 10:00pm
Run = Level=Full Pool=SextaPool Friday at 10:00pm
#no agendamento, o backup será realizado de #segunda à sexta, sempre às 22 horas. Criei um #pool dos volumes para cada dia, afinal cada fita terá #sua label para cada dia.

}

Job {
#essa é a configuração do trabalho do cliente, a #maquina remota.
Name = "Servidor NS1"
Type = Backup
Level = Full #backup do tipo full
Client=ns1-fd #esse parametro será configurado #logo abaixo

FileSet="Server-NS1" #seleção do que será #backupeado, também logo abaixo
Messages = Standard
Storage = DDS-3 #dispositivo onde será #armazenado o job
Pool = Default
Schedule = "Diario"

Write Bootstrap = "/var/db/bacula/Client1.bsr"
Priority = 10
}

Job {
Name = "Servidor NS2-local"
Type = Backup
Level = Full
Client=ns2-local
FileSet="Server-NS2"

Messages = Standard
Storage = DDS-3
Pool = Default
Schedule = "Diario"
RunAfterJob = "/usr/local/etc/ejeta_tape.sh" #esse #parâmetro especifica a execução de um comando #após o término do job. Esse script faz com que a #mídia seja desmontada e ejetada. O script está #disponível no término desse arquivo.

Write Bootstrap = "/var/db/bacula/Client1.bsr"
Priority = 10
}

# Standard Restore template, to be changed by #Console program
Job {
Name = "RestoreFiles"
Type = Restore
Client= ns2-local

FileSet="Full Set"
Storage = DDS-3
Messages = Standard
Pool = Default
Where = /tmp/bacula-restores
}

FileSet {
#insira os arquivos/diretórios que deverão ser #copiados
Name = "Server-NS2"

Include = signature=MD5 {
/www
}
Exclude = {
#caso queira excluir algum diretório
/www/data
/tmp/* }
}

FileSet {
Name = "Server-NS1"
Include = signature=MD5 {
/var/mail

}
Exclude = {
/tmp/* }
}

FileSet {
Name = "Full Set"
Include = signature=MD5 {
# @/etc/backup.list
}
Exclude = { }
}

# Definição do dispositivo de armazenamento

Storage {
Name = DDS-3
Address = 172.16.0.3 #atenção, coloque sempre o #IP e não localhost
SDPort = 9103
Password = senha
Device = "DDS-3" # deve ser o mesmo do que o #especificado no
bacula-sd.conf
Media Type = DDS-3
}

#maquina local
Client {
Name = ns2-local
Address = localhost
FDPort = 9102
Catalog = BackupDB
Password = senha
File Retention = 30d # 80 days
Job Retention = 1y # one year

AutoPrune = yes # Prune expired Jobs/Files
}

#maquina remota
Client {
Name = ns1-fd
Address = 172.16.0.2
FDPort = 9102
Catalog = BackupDB
Password = senha

File Retention = 30d # 80 days
Job Retention = 1y # one year
AutoPrune = yes # Prune expired Jobs/Files
}

Catalog {
Name = BackupDB
dbname = bacula; user = bacula; password = ""
}

#o Bacula oferece o recurso de enviar os relatórios #(logs) por e-mail. Para isso insira o seu servidor #smtp e seu e-mail
Messages {
Name = Standard
mailcommand = "/home/bacula/bin/smtp -h servidor.smtp -f "(Bacula) %r" -s "Bacula: %t %e of %c %l" %r"

operatorcommand = "/home/bacula/bin/smtp -h servidor.smtp -f "(Bacula) %r" -s "Bacula: Intervention needed for %j" %r"
MailOnError = usuario@mail.com
 = all
append = "/home/bacula/bin/log" = all
operator = YOUR-EMAIL@YOU.com = mount
console = all
}

Pool {
Name = Default
Pool Type = Backup

Recycle = yes # Bacula can automatically recycle Volumes
AutoPrune = yes # Prune expired volumes
Volume Retention = 1d # one year
}

Pool {
Name = SegundaPool
Pool Type = Backup
Recycle = yes
AutoPrune = yes

Volume Retention = 6d #o volume poderá ser #utilizado novamente para backup após 6 dias
Accept Any Volume = yes
}
Pool {
Name = TercaPool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 6d

Accept Any Volume = yes
}

Pool {
Name = QuartaPool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 6d
Accept Any Volume = yes
}

Pool {
Name = QuintaPool

Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 6d
Accept Any Volume = yes
}

Pool {
Name = SextaPool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 6d

Accept Any Volume = yes
}

Agora crie um script ejeta_tape.sh, e salve em /usr/local/etc/

#!/bin/sh
/usr/local/sbin/bconsole -c /usr/local/etc/bconsole.conf <
unmount
quit
END_OF_DATA

Após a configuração desses 3 arquivos no servidor, o serviço Bacula deverá ser iniciado. No meu caso, a instalação criou o daemon que controla os serviços em /usr/local/etc/rc.d.

bacula.sh start

Caso não haja erro de configuração, o Bacula será iniciado e pronto pra executar os trabalhos de backup. Para confirmar sua execução:

# ps awux | grep bacula
bacula 50839 0.0 0.4 3068 1864 ?? Ss 4:20PM 0:09.66 /usr/local/sbin/bacula-sd -u bacula -g operator -v -c /usr/local/etc/
root 50841 0.0 0.4 3024 1844 ?? Ss 4:20PM 0:20.00 /usr/local/sbin/bacula-fd -u root -g wheel -v -c /usr/local/etc/bacul

bacula 50845 0.0 0.5 5800 2564 ?? Ss 4:20PM 0:10.23 /usr/local/sbin/bacula-dir -u bacula -g bacula -v -c /usr/local/etc/b
root 53861 0.0 0.2 1448 848 p0 S+ 11:40AM 0:00.00 grep bacula

Para administrar o Bacula o padrão é seu console, mas existe também o modo gráfico que roda no Gnome. Para acessar o console precisamos editar o arquivo bconsole.conf, especificando somente como se conectar ao Director:

vi bconsole.conf
#
# Bacula User Agent (or Console) Configuration File
#

Director {
Name = server-dir
DIRport = 9101
address = localhost
Password = "senha"
}

Agora sim, para acessar o console:

/usr/local/sbin/bconsole –c /usr/local/etc/bconsole.conf
Connecting to Director server-dir:9101
1000 OK: HeadMan Version: 1.30 (28 April 2004)
*

Estamos no prompt do console. Para obter informações sobre todos os comandos disponíveis é só digitar help. Agora é escolher a opção desejada e trabalhar. Por exemplo, se quiser obter informações sobre o status de ser servidor, digite stat e selecione a opção desejada. O Bacula é muito fácil e intuitivo de ser gerenciado. Para realizar os trabalhos de backup nas unidades de fita, é preciso criar uma label para cada volume. Após isso é necessário montar o dispositivo pra ficar online, mas para agilizar a tarefa, digite mount e siga as etapas para criar a label e montar a fita. Caso queira realizar um trabalho de backup, execute run e escolha a opção de acordo com o menu. Para realizar a restauração de um arquivo/diretório, digitar restore:

*restore
Using default Catalog name=MyCatalog DB=bacula
First you select one or more JobIds that contain files
to be restored. You will be presented several methods
of specifying the JobIds. Then you will be allowed to

select which files from those JobIds are to be restored.
To select the JobIds, you have the following choices:
1: List last 20 Jobs run.
2: List Jobs where a given File is saved.
3: Enter list of JobIds to select.

4: Enter SQL list command.
5: Select the most recent backup for a client.
6: Select backup for a client before a specified time.
7: Enter a list of files to restore.
8: Enter a list of files to restore before a specified time.

9: Cancel.
Select item: (1-9): 3
Enter JobId(s), comma separated, to restore: 2
You have selected the following JobId: 2
Building directory tree for JobId 2 ...
1 Job inserted into the tree and marked for extraction.

Automatically selected Storage: File

You are now entering file selection mode where you add and
remove files to be restored. All files are initially added.
Enter "done" to leave this mode.

cwd is: /www

A maneira de se escolher os arquivos/diretórios à serem restaurados no Bacula demonstrado acima é simples; selecione a opção 3, e em seguida o JobID (cada trabalho executado recebe um número identificador). Após a seleção do trabalho, você irá navegar pela árvore de diretórios que foram backupeados.A navegação é padrão do shell Unix. Após encontrar o arquivo desejado, para selecioná-lo execute o comando mark. Um * aparecerá ao lado do arquivo. Para finalizar, execute done e siga os passos finais.