Servidor NFS no OpenBSD

•Junho 30, 2008 • Não Há Comentários

NFS, Network File System, é usado para compartilhar o sistema de arquivos através da rede.
Esse artigo seguirá os passos para uma configuração simples do NFS. Esse exemplo detalha um servidor na rede LAN, com os clientes acessando o NFS. Não falarei sobre a segurança no NFS pressumindo que você já tenha instalado o packet filter ou outra proteção de firewall, prevenindo assim acessos de fora da rede. Se você precisar liberar o NFS para fora da rede, sugiro que utilize algum método de acesso via VPN. De outra maneira, pessoas poderão capturar o seu tráfego NFS. Alguém também, poderia forjar o endereço IP que está autorizado a acessar o servidor NFS.

Configurando um servidor NFS

Esses serviços devem estar ativados e rodando no servidor:

- portmap
- mountd
- nfsd

Por padrão cada um deles está desativado no OpenBSD. Adicione as seguintes linhas em /etc/rc.conf.local para habilitá-los.

portmap=YES

nfs_server=YES

O próximo passo é colocar a lista de arquivos que serão disponibilizados para a montagem pelos clientes.

Nesse exemplo, temos um servidor com o endereço IP 10.0.0.1. Esse servidor NFS compartilha apenas para os clientes que estão na mesma subrede. Tudo isso é configurado no arquivo /etc/exports. Nesse arquivo você coloca as pastas que deseja tornar acessíveis via NFS e define quem pode acessá-las. Há muitas opções que podem ser usadas em /etc/exports; Para o nosso exemplo de servidor, o arquivo de configuração do /etc/exports se paresse com esse:

## NFS exports Database
# See exports(5) for more information. Be very careful, misconfiguration
# of this file can result in your filesystems being readable by the world.
/work -alldirs -ro -network=10.0.0 -mask=255.255.255.0

Isso significa que a pasta /work foi disponibilizada via NFS. A opção –alldirs, especifica que os clientes serão capazes de montar em qualquer ponto dentro de /work, bem como o próprio /work. Por exemplo, se dentro de /work tiver um diretório chamado /work/monday, os clientes poderiam montar /work ( e ter acesso a todos os arquivos e subdiretórios ), ou eles poderiam montar /work/monday e ter acesso apenas aos arquivos e diretórios contidos nele. A opção -ro especifica que será concedido aos clientes apenas acesso de leitura. Os dois útimos argumentos especifica que apenas os clientes que estão na rede 10.0.0.0 e usando a máscara 255.255.255.0 serão autorizados a montar pasta. Isso é importante para servidores que são acessados por diferentes redes.

Agora você pode iniciar o serviço ou reiniciar ( após habilitá-los com as opões acima ) ou executá-los manualmente.

# /usr/sbin/portmap
# echo -n >/var/db/mountdtab
# /sbin/mountd# /sbin/nfsd -tun 4

Os argumentos passados para o nfsd para habilitá-lo com conexões TCP ( -t ) e UDP ( -u ) e habilitá-locom 4 instancias ( -n ).
Você deve setar apropriadamente o número de instâncias do NFS, para lidar com o número máximo de clientes.

Agora está pronto para montar o sistema de arquivos a partir dos clientes.

Lembre-se: Se você fizer alterações em /etc/exportfs enquanto o NFS estiver rodando, será precisoreiniciar o serviço.
Para isso basta um sinal de HUP e as alterações entrarão em vigor.

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

Montando o sistema de arquivos NFSO sitema de arquivos NFS pode ser montando nos clientes, sem a necessidade de qualquer
serviço ou daemon. O NFS pode ser montado como qualquer outro sistema de arquivos.

O NFS deve ser montando com o comando mount, ou mais especificamente com o comando mount_nfs.
Para montar o sistema de arquivos /work no computador 10.0.0.1 e na pasta /mnt, segueo exemplo abaixo:
( note que você não precisa utilizar o endereço ip, se estiver utilizando um resolverde nomes, named ou bind, por exemplo ).

# mount -t nfs 10.0.0.1:/work /mnt

Para que o NFS seja montando no boot, adicione a seguinte linha no /etc/fstab.

10.0.0.1:/work /mnt nfs rw 0 0

É importantíssimo que você use 0 0 no final dessa linha, para que o sistema não tente usar o fsck na inicialização. Outra opção de segurança,
tal como o noexec, nodev e nosuid também devem ser usadas se for preciso.

10.0.0.1:/work /mnt nfs rw,nodev,nosuid 0 0

Dessa forma, nenhum dispositivo ou programa com setuid bit no servidor NFS possa subverter as medidas de seguranças nos clientes NFS.
Se você não for executar programas nos clientes NFS, pode-se adicionar a opção noexec.

Quando acessar um ponto de montagem NFS com o usuário root, o servidor automaticamente mapeiará o root para o usuário nobody e
para o grupo nobody. Isso é importante saber quando seleva em conta as permissões de arquivos. Por exemplo, ter um arquivo com
essas permissões:

-rw——- 1 root wheel 0 Dec 31 03:00 _daily.B20143

Se esse arquivo foi compartilhado com o NFS e o usuário root tentar acessar esse arquivo a partirde um cliente NFS, o acesso será negado.
Isso ocorre por que o servidor usa as credenciais dousuário “nobody” quando o usuário root tenta acessar o arquivo. Uma vez que o usuário
“nobody” nãotem permissão de acessar o arquivo, o acesso é negado.

Checando o status do NFS

Afim de verificar se o NFS está funcionando corretamente e que todos os daemon estejam registrados em RCP. Para fazer isso, use o rpcinfo.

rpcinfo -p 10.0.0.1
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 633 mountd
100005 3 udp 633 mountd
100005 1 tcp 916 mountd
100005 3 tcp 916 mountd
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs

Em condições normais de uso, existem outros utilitários que permitem ver o que está acontecendocom o NFS. Um deles é o showmount,
que permite visualizar o que está montando atualmente e quem está montando o NFS. Há também o nfsstat que mostra mais detalhes e
estatísticas. Parautilizar o showmount tente /usr/bin/showmount -a host. Por exemplo:
$ /usr/bin/showmount -a 10.0.0.1
All mount points on 10.0.0.1:
10.0.0.37:/work

A saída mostra que o cliente 10.0.0.37 tem montando o /work que foi exportado a partir do servidor10.0.0.1.

André Facina

*Tradução parcial da documentação Oficial do OpenBSD.

Adicionando e apagando usuários no OpenBSD

•Junho 29, 2008 • Não Há Comentários

O OpenBSD fornece dois comandos para facilmente adicionar usuários no sistema. Os comandos são:

- adduser
- user

Além disso, você pode adicionar usuários manualmente com o comando vipw, mas isso é mais difícil para a maioria das operações.

A maneira fácil de adicionar usuários no OpenBSD é usando o script adduser. Você pode configurar o adduser editando o arquivo /etc/adduser.conf. O comando adduser permite verificar a consistência dos arquivos /etc/passwd e /etc/group.
Aqui no exemplo, o usuário testuser será adicionado no sistema.
Para o usuário testuser será dado o diretório $HOME (/home/testuser), fará parte do grupo guest e vai ter o Korn Shell como shell padrão (/bin/ksh).

# adduser
Use option “-silent” if you don’t want to see all warnings and questions.Reading /etc/shells
Reading /etc/login.conf
Check /etc/master.passwd
Check /etc/groupOk, let’s go.
Don’t worry about mistakes. I will give you the chance later to correct any input.
Enter username []: testuser
Enter full name []: Test User
Enter shell csh ksh nologin sh [sh]: ksh
Uid [1002]: Enter
Login group testuser [testuser]: guest
Login group is “guest”. Invite testuser into other groups: guest no
[no]: no
Login class auth-defaults auth-ftp-defaults daemon default staff
[default]: Enter
Enter password []: Type password, then Enter
Enter password again []: Type password, then Enter

Name: testuser
Password: ****
Fullname: Test FAQ User
Uid: 1002
Gid: 31 (guest)
Groups: guest
Login Class: default
HOME: /home/testuser
Shell: /bin/ksh
OK? (y/n) [y]: y
Added user “testuser”
Copy files from /etc/skel to /home/testuser
Add another user? (y/n) [y]: n
Goodbye!

Para deletar usuários do sistema, você deve usar o utilitário rmuser. Ele removerá tudo do usuário. Ele removerá qualquer entrada no crontab,
o diretório $HOME ( se o $HOME for de propriedade do usuário ) e os seus e-mails. Claro, além disso ele removerá as suas entradas em /etc/passwd e     /etc/group. A seguir um exemplo, vamos remover o usuário que foi adicionado no exemplo acima.Você será questionado sobre o nome do usuário e se é para remover o diretório HOME do mesmo.

# rmuser


Enter login name for user to remove: testuser
Matching password entry:testuser:$2a$07$ZWnBOsbqMJ.ducQBfsTKUe3PL97Ve1AHWJ0A4uLamniLNXLeYrEie:1002
:31::0:0:Test FAQ User:/home/testuser:/bin/kshIs this the entry you wish to remove? y
Remove user’s home directory (/home/testuser)? y
Updating password file, updating databases, done.
Updating group file: done.
Removing user’s home directory (/home/testuser): done.

Adicionando usuários com o comando user

Essas ferramentas são menos interativas do que o comando adduser, tornado-as mais fácil de se usar em shell scripts.

O conjunto completo das ferramentas é:

group
groupadd
groupdel
groupinfo
groupmod
user
useradd
userdel
userinfo
usermod

Adicionando usuários:
Essencialmente o comando user não é interativo, a maneira mais fácil e eficiente de adicionar usuários é usar o comando adduser. O atual comando /usr/sbin/user é apenas um frontend para o resto dos comandos /usr/sbin/user*. Portando, os seguintes comandos, user add ou useradd, podem ser usados para adicionar usuários, a escolha é sua, e o uso dos comandos será o mesmo.

Nesse exemplo nós adicionamos o mesmo usuário que especificamos no exemplo acima ( adduser ), é muito mais fácil de utilizar, se você conhece as configurações padrões, antes de adicionar um usuário. Estas configurações estão localizadas em /etc/usermgmt.conf e podem ser vistas com o comando:

$ user add -D
group users
base_dir /home
skel_dir /etc/skel
shell /bin/csh
inactive 0
expire Null (unset)
range 1000..60000

As configurações acimas serão aplicadas, ao menos que você especifique as opções na linha de comando. Por exemplo, em nosso caso, queremos que o usuário comece no grupo guest, e não no user. Complicando um pouco mais, quando adicionarmos o usuário, queremos que a senha seja especificada na linha de comando. Isto é, a senha deve ser criptografada, para isso você deve primeiro usar o utilitário encrypt para criar a senha. Por exemplo: As senhas do OpenBSD por padrão utilizam o Blowfish um algorítimo com 6 saltos. Aqui é um exemplo para criar uma senha criptografada para ser especificada no useradd.

$ encrypt -p -b 6
Enter string:
$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq

Agora que temos a senha criptografada, estamos prontos para adicionar o usuário.

# user add -p ‘$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWXVJRzlq’ -u 1002 \
-s /bin/ksh -c “Test FAQ User” -m -g guest testuser

Nota: Certifique-se de utilizar aspas simples (’ ’) na senha criptografada. Além de que, certifique-se também de especificar a opção -m, se quiser que seja criado o diretório HOME a partir da cópia do diretório /etc/skel.

Para ver se o usuário foi criado corretamente, podemos usar vários utilitários diferentes. Abaixo são alguns comando que podem ser usados para checar rapidamente se tudo foi criado corretamente.

$ ls -la /home
total 14
drwxr-xr-x 5 root wheel 512 May 12 14:29 .
drwxr-xr-x 15 root wheel 512 Apr 25 20:52 ..
drwxr-xr-x 24 ericj wheel 2560 May 12 13:38 ericj
drwxr-xr-x 2 testuser guest 512 May 12 14:28 testuser
$ id testuser
uid=1002(testuser) gid=31(guest) groups=31(guest)
$ finger testuser
Login: testuser Name: Test FAQ User
Directory: /home/testuser Shell: /bin/ksh
Last login Sat Apr 22 16:05 (EDT) on ttyC2
No Mail.
No Plan.

Além desses comandos, user prevê seu próprio utilitário para mostrar caracteristicas de usuários, esse comando é o userinfo.

$ userinfo testuser
login testuser
passwd *
uid 1002
groups guest
change Wed Dec 31 19:00:00 1969
class
gecos Test FAQ User
dir /home/testuser
shell /bin/ksh
expire Wed Dec 31 19:00:00 1969

Removendo usuários:

Para remover usuários com o comando user*, você usará o userdel. Ele é muito simples. Para remover um usuário criado no ultimo exemplo, simplesmente utilize:

# userdel -r testuser

Aviso: Com a opção -r, você especifica de deseja remover o diretório HOME do usuário. Alternativamente, você pode especificar -p e não -r, isso bloqueará a conta do usuário, mas não removerá qualquer informação.

André Facina

* Tradução parcial da documentação oficial do OpenBSD

Montando imagens ISO no OpenBSD

•Junho 29, 2008 • Não Há Comentários

Para montar uma imagem de disco ( Imagens ISO, imagens criadas com o dd, etc ) no OpenBSD você deve configurar um dispositivo vnd.

Por exemplo, se você tem uma imagem ISO localizada em /tmp/iso.image, você iria seguir as seguintes etapas para montá-la.

# vnconfig svnd0 /tmp/ISO.image
# mount -t cd9660 /dev/svnd0c /mnt

Observe que, essa é uma imagem ISO-9660, usadas por CDs e DVDs, você deve especificar o tipo de “cd9660″ quando montar esse tipo de imagem. Sempre deve ser especificado um tipo, não importando qual for o tipo do filesystem. Por exemplo, vocÊ deve usar o tipo ext2fs quando montar imagens de disco Linux.

Para desmontar a imagem você deve seguir os seguintes comandos:
# umount /mnt
# vnconfig -u svnd0

André Facina

*Tradução parcial da documentação oficial do OpenBSD ( www.openbsd.org )

Gravando CDs no OpenBSD

•Junho 27, 2008 • Não Há Comentários
Primeiramente você deve certificar-se que o gravador de CD/DVD foi reconhecido e configurado pelo kernel. A maioria dos dispositivos SCSI são suportados. Os dispositivos IDE/ATAPI e USB são suportados através da emulação SCSI. Você encontrará rapidamente seu aparelho com a saída do dmesg. Basta olhar as linhas que começam com “cd”, como no exemplo.

cd0 at scsibus0 targ 0 lun 0: <TOSHIBA, CD-ROM XM-5702B, 2826> SCSI0 5/cdrom removable cd1 at scsibus1 targ 4 lun 0: <PLEXTOR, CD-R PX-R412C, 1.04> SCSI2 5/cdrom removable

O cdrecord -scanbus não funciona!
O OpenBSD usa nomes diferentes para o qual o utilitário cdrecord foi escrito.
Todos os dispositivos configurados devem ter a saída no dmesg. Como mencionado no exemplo acima.
Por padrão, o instalador do OpenBSD cria apenas dois dispositivos de CD, cd0 e cd1. Para começar a usar o dispositivo cd2, você deve criar o dispositivo necessário para ele. A forma correta para fazer isso é usando o MAKEDEV.
# cd /dev
# ./MAKEDEV cd2

Checando o funcionamento do gravador de CD/DVD

Recomenda-se verificar se o seu gravador de CD/DVD está funcionando corretamente.
Neste exemplo, estou usando um gravador de DVD USB 2.0:

cd2 at scsibus2 targ 1 lun 0: <LITE-ON, DVDRW LDW-851S, GS0C> SCSI0 5/cdrom removable

Tente usar um um dispositivos existente de CD/DVD. Se desejar, você pode além disso checar a taxa de transferência quando copia arquivos para o seu disco rígido. O comando time será um bom assistente. Se algo der errado e você obter erros durante essa fase, é sensato corrigir o problema e não gravar CD/DVD até o mesmo estaja corrigido.

Gravando CD-ROM
Creating data CD-ROMs
Primeiramente, você deve criar um sistema de arquivos ISO9660, para gravar no CD. Para isso você pode usar o utilitário básico do sistema mkhybrid, ou o cdrecord, um utilitário que vem junto com o pacote cdrtools, ele faz um trabalho melhor com arquivos grandes. Nos exemplos a seguir, vamos usar mkhybrid, embora o uso do mkisofs seja muito semelhante.
Como um exemplo de utilização, digamos que eu queira guardar o fonte do kernel do OpenBSD em uma imagem ISO 9660
$ mkhybrid -R -o sys.iso /usr/src/sys

Using ALTQ_RMC.000;1 for /usr/src/sys/altq/altq_rmclass_debug.h (altq_rmclass.h)

Using IEEE8021.00H;1 for /usr/src/sys/net80211/ieee80211_amrr.c (ieee80211.c)
10.89% done, estimate finish Sat Nov 3 08:01:23 2007
21.78% done, estimate finish Sat Nov 3 08:01:28 2007

87.12% done, estimate finish Sat Nov 3 08:01:31 2007
98.01% done, estimate finish Sat Nov 3 08:01:32 2007
Total translation table size: 0
Total rockridge attributes bytes: 896209
Total directory bytes: 2586624
Path table size(bytes): 11886
Max brk space used 0
45919 extents written (89 Mb)

A opção -R do mkhybrid cria extensões Rock Ridge em uma imagem ISO9660.O Rock Ridge Interchange Protocol criará o suporte para o sistema de arquivos POSIX  para a imagem ISO 9660, tal como nome longos, dono de arquivos,permissões, link simbólicos, hierarquia de diretórios longa ( mais de 8 níveis de diretório),etc.
Se você quiser incluir arquivos com nomes longos em seu CD-ROM para ser lido nos sistemas Windows ou Dos, você deve adicionar a opção -J para incluir a extensão Joliet na imagem ISO.
Depois de criar o sistema de arquivos, você pode verificá-lo montado a imagem ISO.
Se estiver tudo correto, está pronto para gravar o CD-R (W). A Maneira mais fácil é com o utilitário cdio.
Se você estiver usando uma mídia regravável, você terá que limpá-la antes de gravar.
# cdio -f cd1c blank
Agora você está pronto para gravar a imagem criada no exemplo acima para um CD-R (W).
Você pode usar um comando similar a esse:
# cdio -f cd1c tao sys.iso
Com as opções especificadas acima, estamos pedindo para o cdio usar o segundo dispositivo de CD-ROM como gravador de CD.
Para verificar se o CD-ROM foi gravado corretamente, você pode montá-lo e checar se está tudo lá. Para montar o sistema de arquivos, você deve utilizar o dispositivo para a unidade de CD-ROM, que neste caso é ainda o gravador.
# mount /dev/cd1c /mnt/cdrom

Creating audio CDs
Para gravar CDs de audio, você pode novamente usar o cdio com a opção tao -a.Com um exemplo, eu vou fazer uma cópia de um dos meus Cds de músicas. Para isso segue dois passos:
1 – Ripar as faixas de música a partir do CD original. Por exemplo:
# cdio -f cd1c cdrip
Esse comando extrairá uma série de arquivos WAV do seu segundo drive de CD-ROM para o disco.
2 - Gravar as faixas de audio para um novo CD . Por exemplo:
# cdio -f cd1c tao -a *.wav

André Facina

*Tradução parcial da documentação Oficial do OpenBSD


Compilando remotamente o kernel do Linux

•Junho 8, 2008 • Não Há Comentários

Muitas vezes é preciso compilar o kernel do Linux, mas nem todas as vezes teremos acesso físico a máquina, e o trabalho deverá ser feito remotamente. Por ser um trabalho remoto, corre-se o risco da máquina na hora de bootar com o novo kernel aparecer a mesangem Kernel Panic e com isso ficar congelada até ser reiniciada na mão.

Para esses problemas é possível configurar o lilo para bootar somente uma vez o kernel, e se o mesmo apresentar o temível kernel panic o lilo irá reiniciar o computador em “n” segundos e tudo voltará ao normal =)

Para isso segue o roteiro de configuração abaixo:

  • Editar o lilo.conf com as seguintes entradas:
    image=/boot/vmlinuz.novo
      label=novo_linux
      append="panic=3 novo_linux"
      read-only
      optional

Devem existir também as entradas default, apontando para o kernel atual, assim como suas declarações (label,image,ect.)

  • lilo -v

para atualizar as entradas no MBR

  • lilo -v -R linux_new

após rebootar, a máquina utilizará apenas naquela inicialização o novo kernel

  • shutdown -r now

Se acontecer um kernel panic, a máquina rebootará em 3 segundos e entrará no kernel apontado pela diretiva default, descrita no lilo.conf

Pronto :)

André Facina

Replicando a base do LDAP com o slurp

•Junho 8, 2008 • Não Há Comentários

Recentemente, uma empresa em que presto serviços estava precisando de um servidor LDAP com redundância, pois, como se tratava de um serviço crítico, qualquer problema com o servidor, ninguém mais conseguiria fazer o login nas estações =)

Pois, bem, seguindo os passos explicados abaixo criei um segundo servidor LDAP ( slave ), para que, com um eventual problema no servidor master, o slave assumiria a posição de master automaticamente =)

Então, primeiramente deve-se instalar o openldap tanto no servidor master, quanto no servidor slave (o arquivo de configuração slapd.conf deve ser o mesmo para os dois), exceto por algumas diretivas (veja passo 2).

Configurações:

1. Servidor master: após a criação da entrada admin na base, deve-se adicionar as seguintes diretivas no arquivo de configuração /etc/ldap/slapd.conf (atenção à indentação! Se estiver errada, a diretiva falhará):

replica uri=ldap://192.168.1.2:389
binddn=”cn=admin,dc=facina,dc=com,dc=br”
bindmethod=simple
credentials=senha_da_conta_admin

replogfile /var/lib/ldap/replog.ldif

A primeira linha especifica o servidor slave, com a porta padrão utilizada pelo LDAP. A segunda linha define a conta administrativa do LDAP, nesse caso a conta administrativa é admin, do domínio facina.com.br.

O método “bindmethod=” quando especificada como “simple” orienta o slurp para autenticar com a senha definida em “credentials”. A última linha define o arquivo de log. :)

2. Servidor slave: adicionar as seguintes diretivas no arquivo de configuração /etc/ldap/slapd.conf (a diretiva updatedn deve coincidir com a utilizada na configuração do master)

access to *
by dn=”cn=admin,dc=facina,dc=com,dc=br” write

updatedn “cn=admin,dc=facina,dc=com,dc=br”
updateref ldap://192.168.1.1

3. Agora deve-se fazer um backup ou tirar um snapshot da base master:

# slapcat > base.ldif

4. No servidor slave, basta fazer a cópia da base:

# ldapadd -x -D “cn=admin,dc=facina,dc=com,dc=br” -f base.ldif

ou

# slapadd -l base.ldif

(Antes, pare o serviço do ldap: /etc/init.d/slapd stop)

5. Iniciar os serviços slapd e slurpd no servidor master e slapd no servidor slave, para Debian (veja /etc/default/slapd):

# /etc/init.d/slapd start

6. Pronto! Agora é só fazer os testes e verificar se a réplica está funcionando. Muitos serviços como o SAMBA e autenticação PAM, permitem a utilização de 2 ou mais servidores LDAP.

O samba permite a utilização de múltiplos servidores LDAP, basta adicionar uma diretiva como essa:

passdb backend = ldapsam:”ldap://192.168.1.1/ ldap://192.168.1.2/”

Assim se o servidor LDAP master cair o samba irá buscar as informações no servidor slave, sendo um processo totalmente transparente para o usuário.

Pronto :)

André Facina