[OpenBSD]

[Índice da FAQ] [Seção 9 - Migração para OpenBSD] [Seção 11 - O sistema X Window]

10 - Administração do Sistema


Conteúdo


10.1 - Por que ele diz que estou no grupo errado quando eu tento usar o su para me tornar root?

No OpenBSD, usuários que estão no grupo wheel têm permissão para usar o su(1) para se tornarem root. Usuários que não estão no grupo "wheel" não podem usar o su(1). Caso contrário, o usuário receberá uma mensagem de erro como retorno.

Se você está criando um novo usuário com o adduser(8), você pode colocá-lo no grupo wheel adicionando o nome do grupo wheel como resposta para "Invite user into other groups:". Isso o adicionará ao grupo e o arquivo /etc/group ficará parecido com:

wheel:*:0:root,ericj

Se você está procurando uma maneira de permitir aos usuários acesso limitado aos privilégios de super usuário, sem colocá-los no grupo "wheel", use o sudo(8).

10.2 - Como duplicar um sistema de arquivos?

Para duplicar seu sistema de arquivos, use o dump(8) e o restore(8). Por exemplo, para duplicar tudo que esteja no diretório SRC para o diretório DST, faça um:

# cd /SRC; dump 0f - . | (cd /DST; restore -rf - )

dump é projetado para fornecer possibilidades de backup, e ele pode ser exagerado se você apenas quer duplicar uma parte de um (ou todo o) sistema de arquivos. O comando tar(1) pode ser mais rápido para essa operação. O formato é muito parecido com:

# cd /SRC; tar cf -  . | (cd /DST; tar xpf - )

10.3 - Como eu inicio daemons ao mesmo tempo que o sistema inicializa? (Visão geral do rc(8))

O OpenBSD utiliza o estilo rc(8) de inicialização. Esse estilo usa alguns arquivos-chave para a inicialização.

Como o rc(8) funciona?

Os arquivos principais que o administrador de sistema deve se concentrar são: /etc/rc.conf (como guia), /etc/rc.conf.local (para alterações), /etc/rc.local e /etc/rc.shutdown. Para compreender o funcionamento do processo rc(8), veja o fluxo:

Depois que o kernel é inicializado, o /etc/rc é iniciado:

Inicialização de Daemons e Serviços do OpenBSD

A maioria dos daemons e serviços contidos no OpenBSD são controlados na inicialização pelas variáveis definidas no arquivo de configuração /etc/rc.conf. Dê uma olhada no arquivo /etc/rc.conf. Você verá linhas similares a esta:

ftpd_flags=NO           # for non-inetd use: ftpd_flags=""

Uma linha igual a essa mostra que o ftpd(8) não é carregado com o sistema (pelo menos não como um daemon através do rc(8); o ftpd na maioria das vezes é executado pelo inetd(8), veja a FAQ sobre FTP anônimo para ler mais sobre isso). Cada linha tem um comentário que mostra os sinalizadores para o uso normal daquele daemon ou serviço. Isso não significa que você deve executar aquele daemon ou serviço com aqueles sinalizadores. Leia a página de manual referente ao assunto para ver como você pode ter aquele daemon ou serviço carregando de qualquer forma que você quiser.

Nós recomendamos fortemente que você nunca toque no /etc/rc.conf. Ao invés disso, crie o arquivo /etc/rc.conf.local, copie de /etc/rc.conf apenas as linhas que você precisa alterar, e ajuste-as do modo que quiser. Isso torna as futuras atualizações de versão fáceis -- todas as modificações/atualizações estão em um arquivo que não foi modificado por você. De fato, o processo de atualização de versão padrão assume que você não modificou o /etc/rc.conf e sobrescreve-o com a nova versão do arquivo.

Por exemplo, esta é a linha padrão relacionada ao httpd(8).

httpd_flags=NO          # for normal use: "" (or "-DSSL" after reading ssl(8))

Aqui você pode ver que para carregar o httpd normalmente nenhum sinalizador é necessário, então uma linha como httpd_flags="" adicionada ao /etc/rc.conf.local cumpre a tarefa. Mas para carregar o httpd com SSL ativo (consulte a FAQ sobre SSL ou ssl(8)), você começaria com uma linha como httpd_flags="-DSSL", embora você possa precisar adicionar outros parâmetros por outros motivos.

Inicialização de daemons e a configuração local

Para outros daemons que você deseja instalar no seu sistema através de pacotes ou outros meios, você pode usar o arquivo /etc/rc.local. Por exemplo, eu instalei um daemon que se situa em /usr/local/sbin/daemonx, e quero que ele carregue no momento da inicialização. Eu poderia adicionar uma entrada no /etc/rc.local igual a esta:

if [ -x /usr/local/sbin/daemonx ]; then
	echo 'Starting daemonx'; /usr/local/sbin/daemonx
fi

(Se o daemon não se destaca automaticamente durante a inicialização, lembre-se de adicionar um "&" no fim da linha de comando.)

A partir de agora esse daemon será carregado no inicialização. Você será capaz de ver qualquer erro na inicialização, sendo que uma inicialização normal, sem erros, deve mostrar uma linha como esta:

Starting daemonx

O diretório /etc/rc.d/

Desde o surgimento do OpenBSD 5.0, daemons de sistema ("services") são iniciados, parados e controlados através do /etc/rc.d. Todos os daemons de sistema e a maioria dos pacotes adicionais também são controlados através destes scripts.

Esses scripts (um para cada daemon) são chamados pelo rc. A ordem de execução dos daemons do sistema está presenta no código do rc, e a ordem de pacotes adicionais é controlada através da variável de ambiente pkg_scripts, que deve ser configurada no arquivo /etc/rc.conf.local. Note que o simples fato de adicionar um script no diretório /etc/rc.d não o faz ser carregado automaticamente no processo de boot; o nome do script deve, também, ser especificado na variável pkg_scripts para que ele seja carregado durante o processo de boot do OpenBSD.

The starting of system scripts is determined by entries in the /etc/rc.conf.local file. For example, /etc/rc.d/httpd does not start httpd(1) unless /etc/rc.conf or /etc/rc.conf.local contains a line defining the "httpd_flags" variable. To help make sure your system will come up as expected on the next boot, the rc.d scripts will not run their daemon if the appropriate variable is not defined. You can, of course, manually invoke /usr/sbin/httpd directly with whatever options you wish, if you wish to run the program manually.

Perceba que em vez de ter cada script em /etc/rc.d, controlando todas as operações de startup, shutdown, reload, restart e check pode ser reduzida a uma especificação com muito poucas variáveis¿¿ com o uso do rc.subr, que gerencia a maior parte dessas tarefas de forma padronizada no OpenBSD.

Por exemplo, o daemon de nossa aplicação daemonx pode ser iniciado através de um script presente em /etc/rc.d com o seguinte conteúdo:

#!/bin/sh

daemon="/usr/local/sbin/daemonx"

. /etc/rc.d/rc.subr

rc_cmd $1
Em seguida, adicionar o nome do script para gerenciamento do daemon a variável pkg_scripts em /etc/rc.conf.local.

rc.shutdown

/etc/rc.shutdown é um script que é executado no desligamento. Qualquer tarefa que você queira fazer antes do sistema ser desligado deve ser adicionada nesse arquivo. Se você usa o apm, você pode também definir "powerdown=YES". Isso é o equivalente do "shutdown -p".

10.4 - Por que os usuários recebem a mensagem "relaying denied" quando estão enviando correio eletrônico remotamente através do OpenBSD?

Tente isto:

# grep relay-domains /etc/mail/sendmail.cf

A saída talvez se pareça com esta:

FR-o /etc/mail/relay-domains

Se esse arquivo não existe, crie-o. Você precisa especificar as máquinas que estão enviando correio eletrônico remotamente, com a seguinte sintaxe:

.domain.com    #Allow relaying for/to any host in domain.com
sub.domain.com #Allow relaying for/to sub.domain.com and any host in that domain
10.2           #Allow relaying from all hosts in the IP net 10.2.*.*

Não se esqueça de enviar um sinal 'HangUP' para o sendmail (um sinal que faz com que a maioria dos daemons leiam novamente seus arquivos de configuração):

# kill -HUP `head -1 /var/run/sendmail.pid`

Para mais informações

10.5 - Eu configurei o POP, mas recebo erros quando acesso meu correio eletrônico através do POP. O que posso fazer?

A maioria dos problemas relacionados ao POP são problemas com arquivos temporários e arquivos bloqueados. Se seu servidor POP envia uma mensagem de erro do tipo:

-ERR Couldn't open temporary file, do you own it?

Tente configurar suas permissões do seguinte modo:

permissões em  /var
drwxrwxr-x   2 bin     mail     512 May 26 20:08 mail


permissões em  /var/mail
-rw-------   1 username   username        0 May 26 20:08 username

Outra coisa para verificar é se o usuário é realmente o dono de seu arquivo em /var/mail. Normalmente esse deve ser o caso (por exemplo, o dono de /var/mail/joe deveria ser o próprio usuário joe), mas se não está definido corretamente, essa pode ser a causa do problema!

Normalmente, deixar o /var/mail com permissão de escrita para o grupo "mail" cria alguns problemas de segurança. É provável que você nunca terá problemas com ele, mas pode ter! (especialmente se seu sítio é de grande volume, como um "ISP", ...) Existem vários servidores POP que você pode instalar diretamente através da coleção de portes. Se possível, use o popa3d, que está disponível na instalação base do OpenBSD. Também poderia ser o caso de uma seleção incorreta das opções para o seu daemon pop. Ou você precisa apenas mudar o diretório em que ele faz o bloqueio (embora o bloqueio somente seria de valor para o daemon POP).

Nota: O OpenBSD não tem um grupo com o nome "mail". Você precisa criá-lo em seu arquivo /etc/group se você precisa dele. Uma entrada como:

mail:*:6:

seria o suficiente.

10.6 - Por que o Sendmail ignora o arquivo /etc/hosts?

Por padrão, o Sendmail usa o serviço DNS para a resolução de nomes, e não o arquivo /etc/hosts. Esse comportamento pode ser alterado através do uso do arquivo /etc/mail/service.switch.

Se você deseja consultar o arquivo hosts antes dos servidores DNS, crie o arquivo /etc/mail/service.switch e coloque nele a seguinte linha:

hosts       files dns

Se você deseja consultar SOMENTE o arquivo hosts, use o seguinte:

hosts       files

Envie ao Sendmail um sinal HUP:

# kill -HUP `head -1 /var/run/sendmail.pid`

e as mudanças terão efeito.

10.7 - Configuração de um servidor HTTP seguro com SSL(8)

O OpenBSD é distribuído com bibliotecas RSA e um servidor httpd que suporta SSL. Para o uso com o httpd(8), você primeiro precisa ter um certificado. O certificado será mantido em /etc/ssl/, com a chave correspondente em /etc/ssl/private/. As etapas descritas aqui são, em partes, retiradas da página de manual ssl(8); utilize-a para obter mais informação. Esta parte da FAQ é somente sobre a criação de um certificado RSA para servidores Web, ela não descreve certificados de servidores DSA. Para mais informações sobre como fazer isso, leia a página de manual ssl(8).

Para começar, você precisa criar o certificado e a chave do seu servidor usando o OpenSSL:

# openssl genrsa -out /etc/ssl/private/server.key 2048

Ou, se você deseja que a chave seja encriptada com uma frase secreta que você terá que digitar quando iniciar os servidores

# openssl genrsa -aes256 -out /etc/ssl/private/server.key 2048

O próximo passo é gerar uma Requisição de Assinatura de Certificado, que é utilizada para permitir que uma Autoridade de Certificação (CA - "Certifying Authority") assine seu certificado. Para fazer isso, use o comando:

# openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

O arquivo server.csr pode então ser enviado a uma Autoridade de Certificação que assinará a chave. Uma das Autoridades de Certificação é a Thawte Certification, que você pode encontrar no endereço http://www.thawte.com/.

Se você não pode fazer isso, ou simplesmente quer assinar o certificado você mesmo, o seguinte comando pode ser usado.

# openssl x509 -sha256 -req -days 365 -in /etc/ssl/private/server.csr \
       -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt

Com os arquivos /etc/ssl/server.crt e /etc/ssl/private/server.key no lugar certo, você deve então iniciar o httpd(8) com o sinalizador -DSSL (veja a seção sobre o rc(8) nesta faq), ativando assim as transações https na porta 443 da sua máquina.

10.8 - Eu editei o arquivo /etc/passwd, mas as mudanças não tiveram efeito. Por quê?

Se você editou diretamente o arquivo /etc/passwd, suas mudanças serão perdidas. O OpenBSD gera dinamicamente o arquivo /etc/passwd com o pwd_mkdb(8). O arquivo de senhas principal no OpenBSD é o /etc/master.passwd. De acordo com o pwd_mkdb(8),

FILES
     /etc/master.passwd  current password file
     /etc/passwd         a 6th Edition-style password file
     /etc/pwd.db         insecure password database file
     /etc/pwd.db.tmp     temporary file
     /etc/spwd.db        secure password database file
     /etc/spwd.db.tmp    temporary file

Em um arquivo de senhas tradicional do Unix, como o /etc/passwd, tudo e inclusive a senha criptografada do usuário está disponível para qualquer um no sistema (e é o primeiro alvo para programas como o "Crack"). O 4.4BSD introduziu o arquivo master.passwd, que possui um formato estendido (com opções adicionais além daquelas fornecidas pelo /etc/passwd) e somente pode ser lido pelo usuário root. Para acesso rápido aos dados, as chamadas de bibliotecas que acessam esses dados normalmente leem os arquivos /etc/pwd.db e /etc/spwd.db.

O OpenBSD inclui uma ferramenta para a edição do arquivo de senhas. Essa ferramenta é chamada vipw(8). Vipw usa o vi (ou seu editor favorito definido por $EDITOR) para editar o arquivo /etc/master.passwd. Após a modificação, ele recria /etc/passwd, /etc/pwd.db e /etc/spwd.db, conforme as mudanças que você tenha feito. Vipw também se encarrega de bloquear esses arquivos, de modo que se alguém tentar mudá-los ao mesmo tempo, o acesso é negado.

10.9 - Qual é a melhor forma de adicionar e excluir usuários?

O OpenBSD fornece dois comandos para a adição fácil de usuários no sistema:

Você também pode adicionar manualmente os usuários, usando o vipw(8), mas na maioria das operações isso é mais difícil.

A forma mais fácil de adicionar um usuário no OpenBSD é usando o script adduser(8). Você pode configurar o adduser(8) através da edição do arquivo /etc/adduser.conf. O adduser(8) permite verificações consistentes em /etc/passwd, /etc/group e no banco de dados de shell. Ele cria as entradas e o diretório $HOME para você. É possível enviar uma mensagem de boas vindas ao usuário. Este é um exemplo de usuário, testuser, sendo adicionado no sistema. Ele(a) terá o diretório $HOME em /home/testuser, fará parte do grupo guest, e terá o shell /bin/ksh.

# adduser
Use option ``-silent'' if you don't want to see all warnings and questions.

Reading /etc/shells
Check /etc/master.passwd
Check /etc/group

Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: testuser
Enter full name []: Test FAQ User
Enter shell csh ksh nologin sh [ksh]: ksh
Uid [1002]: Enter
Login group testuser [testuser]: guest
Login group is ``guest''. Invite testuser into other groups: guest no 
[no]: no
Login class authpf daemon default staff [default]: Enter
Enter password []: Digite a senha e tecle Enter
Enter password again []: Digite a senha e tecle 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 excluir usuários você deve usar o utilitário rmuser(8). Este remove toda a existência de um usuário. Ele remove qualquer entrada no crontab(1), o diretório $HOME (se o usuário em questão for o proprietário do diretório) e suas mensagens de correio eletrônico. Naturalmente, ele também remove as entradas nos arquivos /etc/passwd e /etc/group. O próximo exemplo é a remoção do usuário que foi adicionado acima. Repare que você será perguntado pelo nome, e se quer ou não remover o diretório pessoal do usuário.

# 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/ksh

Is 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.

Como adicionar usuários através do user(8)

Estas ferramentas são menos interativas que o comando adduser(8), o que as tornam fáceis de serem usadas em scripts.

A lista completa de ferramentas:

Como realmente adicionar usuários

O comando /usr/sbin/user é apenas uma interface para o resto dos comandos /usr/sbin/user*. Portanto, os comandos seguintes podem ser utilizados como user add ou useradd, de modo que depende da sua escolha qual utilizar, e não altera o resultado dos comandos. Lembre-se que o comando user(8) não é interativo, a maneira mais fácil de adicionar eficientemente usuários é através do comando adduser(8).

O comando useradd(8) é menos assustador se você já sabe a configuração padrão antes de adicionar o usuário. Essas configurações estão localizadas em usermgmt.conf(5), e podem ser visualizadas 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 acima serão as utilizadas, a menos que você especifique uma configuração diferente com as opções da linha de comando. Por exemplo, no nosso caso, queremos que o usuário pertença ao grupo guest, e não ao grupo users. Um pequeno obstáculo ao adicionar usuários é que as senhas precisam ser especificadas na linha de comando. As senhas devem ser criptografadas, então primeiro você precisa usar o utilitário encrypt(1) para criar a senha. Por exemplo: as senhas do OpenBSD usam por padrão o algoritmo Blowfish em 6 "rounds". Esta é uma linha de exemplo para criar uma senha encriptada para ser especificada ao useradd(8).

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

Agora que temos nossa senha encriptada, já estamos prontos para adicionar o usuário. Vamos adicionar o mesmo usuário com as mesmas especificações que adicionamos acima, desta vez via adduser(8).

# user add -p '$2a$06$YOdOZM3.4m6MObBXjeZtBOWArqC2.uRJZXUkOghbieIvSWX' -u 1002 \
-s /bin/ksh -c "Test FAQ User" -m -g guest testuser

Nota: Tenha certeza que você está usando ' ' (aspas simples) em ambos os lados da senha, e não " " (aspas duplas), já que estas serão interpretadas pelo shell antes de serem enviadas para o user(8). Em adição, tenha certeza de especificar a opção -m se você quer que o diretório pessoal do usuário seja criado e os arquivos de /etc/skel sejam copiados para lá.

Para ver se o usuário foi criado corretamente, podemos usar vários utilitários diferentes. Abaixo estão alguns comandos que você pode usar para verificar 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.

Em adição a tais comandos, o user(8) provê seu próprio utilitário para mostrar as características do usuário, chamado de userinfo(8).

$ 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

Como excluir usuários

Para remover usuários com a hierarquia de comandos user(8), você usa o comando userdel(8). Ele é muito simples, mas um comando útil. Para remover o usuário criado no último exemplo, basta executar:

# userdel -r testuser

Note a opção -r, que precisa ser especificada se você quer que o diretório pessoal do usuário também seja excluído. Alternativamente, você pode especificar -p e não -r, e assim a conta do usuário será bloqueada, mas nenhuma informação será eliminada.

10.10 - Como eu crio uma conta somente para ftp (que não seja FTP anônimo)?

Existem alguns meios de se fazer isso, mas um modo muito comum é adicionar "/usr/bin/false" no arquivo "/etc/shells". Então quando você configurar o shell dos usuários para "/usr/bin/false", eles não serão capazes de iniciar uma sessão interativa no sistema, mas serão capazes de usar o serviço ftp. Você talvez queira também restringir o acesso confinando os usuários em seus diretórios pessoais no ftpd.

10.11 - Configuração de quotas de disco

Quotas são utilizadas para limitar o espaço de disco disponível para os usuários. O sistema pode ser muito útil em situações onde você tem recursos limitados. Quotas podem ser configuradas por usuário e/ou por grupo.

O primeiro passo para configurar as quotas é ter certeza que "option QUOTA" está na configuração do kernel. Essa opção está no kernel GENERIC. Depois disso, você precisa marcar no /etc/fstab os sistemas de arquivos que terão as quotas ativadas. As palavras-chave userquota e groupquota devem ser usadas para marcar cada sistema de arquivos que você vai utilizar quotas. Por padrão, os arquivos quota.user e quota.group serão criados na raiz daquele sistema de arquivo para guardar informações sobre quotas. Esse padrão pode ser modificado especificando o nome do arquivo com a opção quota em /etc/fstab, como em "userquota=/var/quotas/quota.user". Este é um exemplo de /etc/fstab que tem um sistema de arquivos com quotas ativas, e o arquivo de quotas em uma localização não padrão:

/dev/wd0a / ffs rw,userquota=/var/quotas/quota.user 1 1

Agora é hora de configurar as quotas do usuário. Para esse fim, nós utilizamos o utilitário edquota(8). Um uso simples é "edquota <usuário>". edquota(8) utiliza o vi(1) para editar as quotas, a menos que a variável de ambiente EDITOR esteja definida para um editor diferente. Por exemplo, o comando:

# edquota ericj

Mostra uma saída similar a esta:

Quotas for user ericj:
/: KBytes in use: 62, limits (soft = 0, hard = 0)
        inodes in use: 25, limits (soft = 0, hard = 0)

Para adicionar limites, faça a edição para obter um resultado similar a este:

Quotas for user ericj:
/: KBytes in use: 62, limits (soft = 1000, hard = 1050)
        inodes in use: 25, limits (soft = 0, hard = 0)

Note que a alocação de quotas está em blocos de 1k. Nesse caso, o limite mínimo está fixado em 1000k e o limite máximo em 1050k. Um limite mínimo é um limite onde o usuário é avisado quando o ultrapassa, e tem um período de graça para reduzir seu uso do disco para abaixo do seu limite. Os períodos de graça podem ser configurados usando a opção -t do edquota(8). Depois que o perído de graça termina, o limite mínimo é manipulado como limite máximo. O resultado é uma falha de alocação.

Agora que as quotas estão configuradas, você precisa ativá-las. Para fazer isso, use o comando quotaon(8). Por exemplo:

# quotaon -a

Esse comando lê o /etc/fstab para ativar os sistemas de arquivos com as opções de quota. Agora que as quotas estão funcionando, você pode vê-las usando o comando quota(1). O uso do comando "quota <usuário>" mostra-lhe a informação do usuário. Quando chamado sem nenhum argumento, o comando quota(1) mostra-lhe suas estatísticas de quota. Por exemplo:

# quota ericj

Mostra um resultado como este:

Disk quotas for user ericj (uid 1001): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
              /      62    1000    1050              27       0       0        

Por padrão, as quotas configuradas em /etc/fstab são carregadas na inicialização. Para desligá-las, use:

# quotaoff -a

10.12 - Configuração de Clientes e Servidores KerberosV

O OpenBSD inclui o KerberosV como um componente pré-instalado do sistema padrão.

Para mais informações sobre o KerberosV a partir do seu sistema OpenBSD, use o comando:

# info heimdal

10.13 - Configuração de um servidor FTP anônimo

O FTP anônimo permite que usuários sem contas acessem arquivos no seu computador através do Protocolo de Transferência de Arquivos (FTP - "File Transfer Protocol"). Esta seção oferece um resumo sobre como configurar um servidor FTP anônimo, seu registro de dados, etc.

Criação de uma conta FTP

Para começar, você precisa ter uma conta ftp em seu sistema. Essa conta não deve ter uma senha usável. Neste exemplo, nós iremos configurar o diretório de início de sessão como /home/ftp, mas você pode colocá-lo em qualquer lugar que quiser. Quando o ftp anônimo é utilizado, o daemon ftp vai se confinar (chroot) no diretório pessoal do usuário ftp. Para saber mais sobre isso, leia as páginas de manual ftpd(8) e chroot(2). Este é um exemplo de como criar o usuário ftp. Para isso, usaremos o adduser(8). Nós também precisamos adicionar /usr/bin/false no nosso arquivo /etc/shells; esse será o "shell" que daremos ao usuário ftp. Isso não permite que ele inicie sessão, mesmo dando uma senha vazia. Para isso, você pode simplesmente fazer o seguinte:

echo /usr/bin/false >> /etc/shells
Depois disso, você está pronto para adicionar o usuário ftp:
# adduser
Use option ``-silent'' if you don't want to see all warnings and questions.

Reading /etc/shells
Check /etc/master.passwd
Check /etc/group

Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: ftp
Enter full name []: anonymous ftp
Enter shell csh false ksh nologin sh [ksh]: false
Uid [1002]: Enter
Login group ftp [ftp]: Enter
Login group is ``ftp''. Invite ftp into other groups: guest no 
[no]: no
Login class authpf daemon default staff [default]: Enter
Enter password []: Enter
Set the password so that user cannot logon? (y/n) [n]: y

Name:        ftp
Password:    ****
Fullname:    anonymous ftp
Uid:         1002
Gid:         1002 (ftp)
Groups:      ftp
Login Class: default
HOME:        /home/ftp
Shell:       /usr/bin/false
OK? (y/n) [y]: y
Added user ``ftp''
Copy files from /etc/skel to /home/ftp
Add another user? (y/n) [y]: n
Goodbye!

Configuração do diretório

Junto com o usuário, isso criou o diretório /home/ftp. É o que queremos, mas existem algumas mudanças que temos que fazer para torná-lo pronto para o ftp anônimo. Novamente, essas mudanças são explicadas na página de manual ftpd(8).

Você não precisa criar o diretório /home/ftp/usr ou /home/ftp/bin.

Note que todos esses diretórios devem ser de propriedade de ''root''. Esta é uma lista de como os diretórios devem se parecer após criados.

# pwd
/home
# ls -laR ftp
total 5
dr-xr-xr-x  5 root  ftp    512 Jul  6 11:33 .
drwxr-xr-x  7 root  wheel  512 Jul  6 10:58 ..
dr-x--x--x  2 root  ftp    512 Jul  6 11:34 etc
dr-xr-xr-x  2 root  ftp    512 Jul  6 11:33 pub

ftp/etc:
total 43
dr-x--x--x  2 root  ftp    512 Jul  6 11:34 .
dr-xr-xr-x  5 root  ftp    512 Jul  6 11:33 ..
-r--r--r--  1 root  ftp    316 Jul  6 11:34 group
-r--r--r--  1 root  ftp  40960 Jul  6 11:34 pwd.db

ftp/pub:
total 2
dr-xr-xr-x  2 root  ftp  512 Jul  6 11:33 .
dr-xr-xr-x  5 root  ftp  512 Jul  6 11:33 ..

Inicialização do servidor e do registro de dados

Você pode escolher como iniciar o ftpd, tanto pelo inetd(8) ou a partir dos scripts rc. Estes exemplos mostram nosso daemon sendo iniciado a partir do inetd.conf. Mas, antes, precisamos nos familiarizar com algumas das opções do ftpd. A linha padrão do /etc/inetd.conf é:

ftp             stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -US

Como você pode ver, o ftpd é executado com -US. Isso registra as conexões anônimas em /var/log/ftpd e as sessões concorrentes em /var/run/utmp. Desse modo, poderemos ver essas sessões com o comando who(1). É possível que alguns queiram apenas ter um servidor anônimo, e desativar o ftp para usuários. Para isso, você deve executar o ftpd com a opção -A. Aqui temos uma linha que inicia o ftpd somente para conexões anônimas. Ele também usa -ll para fazer o registro de cada conexão usando o syslog, junto com os comandos "get", "retrive", etc. do ftp.

ftp             stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -llUSA

Nota: Para aqueles que usam servidores ftp de ALTO tráfego, pode-se não querer executar o ftpd a partir do inetd.conf. A melhor opção é comentar a linha ftpd do inetd.conf e iniciar o ftpd a partir do rc.conf.local. Isso inicia o ftpd como um daemon, e será mais simples e rápido do que iniciar pelo inetd. Esta é uma linha de exemplo para iniciá-lo a partir do rc.conf.local:

ftpd_flags="llUSA"           # for non-inetd use: ftpd_flags=""

Evidentemente, somente funciona se você retirou (comentou) o ftpd do /etc/inetd.conf e fez com que o inetd lesse novamente o arquivo de configuração.

Não é necessário passar opções de inicialização adicionais para o ftpd permitir conexões anônimas. As etapas anteriores de criação do usuário 'ftp' e configuração dos diretórios relevantes com as permissões corretas são suficientes. No entanto, para impedir conexões anônimas, não é necessário desfazer tudo. Basta reiniciar o ftpd com a opção -n e conexões anônimas serão, então, desabilitadas.

Outros arquivos importantes

10.14 - Como confinar usuários em seus diretórios pessoais no ftpd(8)

Por padrão, quando os usuários se conectam por ftp, eles podem ir para qualquer diretório que tenham acesso no sistema de arquivos. Isso pode não ser desejável em certas ocasiões. É possível restringir o que os usuários podem ver em uma sessão ftp, confinando os usuários em seus diretórios pessoais usando o chroot.

Se você quer permitir conexões ftp somente em chroot, utilize a opção -A do ftpd(8).

Se você quer usar o chroot de maneira mais fina, a infraestrutura de capacidades de início de sessão e o ftpd(8) do OpenBSD tornam isso fácil.

Os usuários em uma classe de início de sessão com a variável ftp-chroot definida são confinados automaticamente. Adicionalmente, você pode adicionar um nome de usuário no arquivo /etc/ftpchroot para confinar apenas os usuários que tenham seus nomes nesse arquivo. Um usuário somente precisa ser listado em um desses lugares.

10.15 - Como aplicar correções no OpenBSD

Mesmo no OpenBSD, erros acontecem. Alguns problemas podem levar à problemas de confiabilidade (ou seja, algumas vezes pode fazer com que o sistema pare de funcionar como desejado). Outros problemas podem levar à vulnerabilidades de segurança (que pode permitir que outros "usem" seu computador de maneira não desejada e sem autorização). Quando uma falha crítica é encontrada, a correção é integrada na árvore de código fonte -current, e as correções são lançadas para as releases suportadas do OpenBSD. Essas correções aparecem na página Web das erratas, e são separadas em correções "commom", aplicáveis em todas as plataformas, e em correções aplicáveis em uma ou mais plataformas, mas não em todas.

Note, no entanto, que as correções não são publicadas de modo a fornecer novas funcionalidades ou suportes a novos hardwares ao OpenBSD, elas são feitas somente para correções importantes de confiabilidade ou problemas de segurança, que devem ser conduzidos de maneira correta nos sistemas afetados (que frequentemente NÃO são todos os sistemas, dependendo dos propósitos).

Existem três jeitos de atualizar seu sistema com código fonte corrigido:

Novamente, corrigir arquivos individuais não é sempre simples, então pense seriamente em seguir o ramo -stable (ou "patch") do OpenBSD. Misturar e combinar soluções de correção podem ser feitas se você entende como tudo funciona, mas novos usuários devem escolher um método a seguir.

Quais são as diferenças entre as correções da página das erratas e aquelas que estão na árvore CVS?

Todas as correções postadas na página Web das erratas são correções feitas na árvore de código fonte da release indicada. Correções na árvore CVS atual também incluem outras mudanças que não são desejadas em um sistema de produção. Isto é importante: se você instalar uma snapshot, fizer o download da árvore de código fonte no momento em que você obteve a snapshot, e tentar aplicar uma correção usando um arquivo de correção publicado, você vai ver que ele não é aplicado, já que o código pode ter mudado.

Como aplicar as correções.

As correções do OpenBSD são distribuídas em diffs unificados ("Unified diffs"), que são arquivos de texto que guardam as diferenças em relação ao código fonte original. Elas NÃO são distribuídas em formato binário. Isso significa que para aplicar as correções no seu sistema, você precisa ter o código fonte da versão RELEASE do OpenBSD à vossa disposição. Geralmente, você deve ter à disposição a árvore de código fonte completa. Se você está usando a versão release adquirida em um CD-ROM oficial, as árvores de código fonte estão disponíveis no disco 3, elas também estão disponíveis como arquivos nos servidores FTP. Iremos assumir que você tem a árvore de código fonte completa à disposição.

No nosso exemplo, nós vamos olhar a correção 001 para o OpenBSD 3.6, relacionada ao driver st(4), que controla drives de fitas magnéticas ("tape drives"). Sem esta correção, restaurar dados de backups seria um pouco difícil. As pessoas que usam um drive de fitas magnéticas precisam desta correção; no entanto, pessoas que não utilizem firas magnéticas podem não ter a necessidade de instalar esta correção. Vamos olhar a correção:

# more 001_st.patch
Apply by doing:
        cd /usr/src
        patch -p0 < 001_st.patch

Rebuild your kernel.

Index: sys/scsi/st.c
===================================================================
RCS file: /cvs/src/sys/scsi/st.c,v
retrieving revision 1.41
retrieving revision 1.41.2.1
diff -u -p -r1.41 -r1.41.2.1
--- sys/scsi/st.c       1 Aug 2004 23:01:06 -0000       1.41
+++ sys/scsi/st.c       2 Nov 2004 01:05:50 -0000       1.41.2.1
@@ -1815,7 +1815,7 @@ st_interpret_sense(xs)
        u_int8_t skey = sense->flags & SSD_KEY;
        int32_t info;
 
-       if (((sense->flags & SDEV_OPEN) == 0) ||
+       if (((sc_link->flags & SDEV_OPEN) == 0) ||
            (serr != 0x70 && serr != 0x71))
                return (EJUSTRETURN); /* let the generic code handle it */
Como você pode ver, no começo do arquivo de correção é incluído breves instruções sobre como aplicá-lo. Vamos assumir que você colocou esse arquivo de correção no diretório /usr/src, e as etapas seguintes serão usadas:
# cd /usr/src
# patch -p0 < 001_st.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Apply by doing:
|        cd /usr/src
|        patch -p0 < 001_st.patch
|
|Rebuild your kernel.
|
|Index: sys/scsi/st.c
|===================================================================
|RCS file: /cvs/src/sys/scsi/st.c,v
|retrieving revision 1.41
|retrieving revision 1.41.2.1
|diff -u -p -r1.41 -r1.41.2.1
|--- sys/scsi/st.c      1 Aug 2004 23:01:06 -0000       1.41
|+++ sys/scsi/st.c      2 Nov 2004 01:05:50 -0000       1.41.2.1
--------------------------
Patching file sys/scsi/st.c using Plan A...
Hunk #1 succeeded at 1815.              <-- Olhe essa mensagem!
done
Note a mensagem "Hunk #1 succeeded" acima. Isso indica que a correção foi aplicada corretamente. Muitas correções são mais complexas que essa, e envolvem múltiplos "hunks" e múltiplos arquivos. Você deve se assegurar que todos os "hunks" foram aplicados com sucesso em todos os arquivos. Se eles não foram aplicados com sucesso, normalmente isso significa que sua árvore de código fonte não está em conformidade com a árvore utilizada para desenvolvimento do patch, você não seguiu as instruções com cuidado, ou seu arquivo de correção estava corrompido. As correções são sensíveis em relação aos espaços em branco -- copiar e colar a partir do seu navegador frequentemente transforma caracteres tab em espaços ou altera de outra forma o espaço em branco de um arquivo, tornando a correção inutilizável.

Neste ponto, você já pode compilar e instalar um novo kernel e reiniciar o sistema da maneira habitual.

Nem todas as correções são para o kernel. Em alguns casos, você terá que recompilar utilitários individualmente. Em outras vezes, será necessário recompilar todos os utilitários ligados estaticamente em uma biblioteca corrigida. Siga o guia no cabeçalho do arquivo de correção, e se você estiver em dúvida, recompile o sistema inteiro.

Correções que são irrelevantes ao seu sistema em particular não precisam ser aplicadas -- usualmente. Por exemplo, se você não tem um drive de fitas magnética no seu sistema, você não se beneficiará com a correção acima. No entanto, assume-se que as correções sejam aplicadas "em ordem" -- é possível que uma última correção dependa de uma correção aplicada anteriormente. Seja consciente a respeito disso se você selecionou o método de escolher quais correções aplicar, e, se está em dúvida, aplique todas elas, em ordem.

10.16 - Me fala sobre o chroot(2) no Apache?

No OpenBSD, o servidor httpd(8) Apache é "chroot(2)ado" por padrão. Enquanto é um grande passo do ponto de vista da segurança, isso pode criar problemas se você não estiver preparado.

O que é um chroot?

Um aplicativo chroot(2)ado é trancado em um diretório específico e não pode passar para o resto da árvore de diretórios, e vê esse diretório como seu diretório raiz "/" ("root"). No caso do httpd(8), o programa inicia, abre os arquivos de registro, ouve em suas portas TCP (mas não aceita dados ainda), e lê sua configuração. Continuando, ele se tranca em /var/www e perde os privilégios, e então passa a aceitar as requisições. Isso significa que todos os arquivos servidos e usados pelo Apache precisam estar no diretório /var/www. Na configuração padrão do OpenBSD, todos os arquivos no diretório /var/www estão em modo apenas para leitura para o usuário que está executando o Apache, o www. Isso ajuda consideravelmente na segurança -- se existir algum problema de segurança com o Apache, o dano será confinado a um único diretório com permissões "apenas para leitura" e sem recursos que possam causar algum dano.

O que isso significa para o administrador?

Para sermos diretos, "chroot(2)ar" o Apache é uma coisa que não é feita por padrão na maioria dos outros sistemas operacionais. Muitas aplicações e configurações do sistema não funcionam em chroot(2) sem algumas modificações. No mais, é preciso estar ciente que segurança e conveniência frequentemente não possuem objetivos compatíveis. A implementação do Apache no OpenBSD não sacrifica a segurança em favor das vantagens ou da "facilidade".

Em alguns casos, a aplicação ou a configuração pode ser alterada para ser executada dentro do chroot(2). Em outros casos, você simplesmente terá que desabilitar essa funcionalidade usando a opção -u do httpd(8) no /etc/rc.conf.local.

Exemplo de chroot(2) de uma aplicação: wwwcount

Como exemplo de um processo que pode ser usado para fazer o chroot de uma aplicação, nós vamos olhar o caso do wwwcount, um contador simples de páginas Web, disponível através dos pacotes. Embora seja um programa eficaz, ele não sabe nada sobre o Apache "chroot(2)ado", e não funciona "chroot(2)ado" em sua configuração padrão.

Primeiro, nós instalamos o pacote wwwcount. Nós configuramos e testamos, e descobrimos que ele parece não funcionar: o Apache nos retorna uma mensagem dizendo "Internal Server Error". O primeiro passo consiste em parar e reiniciar o Apache com o comutador -u para verificar se o problema vem do chroot(2), e não da configuração do sistema.

# apachectl stop
/usr/sbin/apachectl stop: httpd stopped
# httpd -u
Após fazer isso, nós constatamos que o contador funciona corretamente, devido à mudança de dono em um diretório que o Apache (e os CGIs que ele executa) pode escrever nos arquivos. Assim, temos definitivamente um problema de chroot, então paramos e reiniciamos novamente o Apache, usando o chroot por padrão:
# apachectl stop
/usr/sbin/apachectl stop: httpd stopped
# httpd

Um bom ponto de partida pode ser supor que o wwwcount usa algumas bibliotecas e outros arquivos que ele não pode acessar estando em chroot. Nós podemos usar o comando ldd(1) para descobrir as dependências dinâmicas do CGI em questão:

# cd /var/www/cgi-bin/
# ldd Count.cgi
Count.cgi:
        Start    End      Type Open Ref GrpRef Name
        1c000000 3c007000 exe  1    0   0      /var/www/cgi-bin/Count.cgi
        0c085000 2c0be000 rlib 0    1   0      /usr/lib/libc.so.57.0
        08713000 08713000 rtld 0    1   0      /usr/libexec/ld.so
Certo, esse é um problema, dois arquivos que não estão disponíveis no ambiente chroot(2). Então nós copiamos para o ambiente:
# mkdir -p /var/www/usr/lib /var/www/usr/libexec
# cp /usr/lib/libc.so.57.0 /var/www/usr/lib
# cp /usr/libexec/ld.so /var/www/usr/libexec
e tentamos usar o contador novamente.

Bem, agora o programa está em execução e nos enviando as mensagens de erro diretamente: "Unable to open config file for reading". Nós fizemos um progresso, mas ainda não terminamos. O arquivo de configuração fica normalmente em /var/www/wwwcount/conf, mas dentro do ambiente chroot ele deve ser procurado em /wwwcount/conf. Nós temos duas opções: uma é recompilar o programa para fazer ele funcionar com a nova localização dos arquivos, a outra é mover os arquivos de dados. Como nós instalamos a partir de um pacote, vamos apenas mover os arquivos de dados. Para usar a mesma configuração em chroot(2) ou não, iremos usar uma ligação simbólica:

# mkdir -p /var/www/var/www
# cd /var/www/var/www
# ln -s ../../wwwcount wwwcount
Repare que a ligação simbólica é pensada para funcionar dentro do chroot. Novamente, nós testamos... e descobrimos mais um problema. Agora o wwwcount está reclamando que não pode achar os arquivos "strip image" que ele utiliza para mostrar as mensagens. Após um pouco de pesquisa, descobrimos que aqueles arquivos são armazenados em /usr/local/lib/wwwcount, então nós temos que copiá-los no ambiente chroot, como de hábito.
# tar cf - /usr/local/lib/wwwcount | (cd /var/www; tar xpf - )
nós testamos novamente... e ele funcionou!

Note que somente copiamos os arquivos que são absolutamente necessários para o bom funcionamento. Geralmente, somente o mínimo possível de arquivos necessários para executar uma aplicação deve ser copiado no ambiente chroot.

Devo utilizar o chroot?

No exemplo acima, o programa é relativamente simples, e ainda assim encontramos diferentes tipos de problemas.

Nem toda aplicação pode ou deve ser "chroot(2)ada".

O objetivo é um servidor Web seguro, o chroot(2) é apenas uma ferramenta para alcançar isso, não é o objetivo por si só. Lembre-se, a configuração inicial do Apache em chroot(2) do OpenBSD é onde o usuário que está executando o programa httpd(8) não pode executar nenhum programa, não pode alterar nenhum arquivo, e não pode assumir outra identidade de usuário. Perdendo essas restrições, você perde parte da sua segurança, usando ou não o chroot.

Algumas aplicações são relativamente simples, e utilizar o chroot(2) faz sentido. Outras são muito complexas, e não valem o esforço necessário para colocá-las em chroot(2), ou o tempo que você vai levar para copiar uma boa parte do sistema para o chroot, e no final acaba-se perdendo o benefício do ambiente chroot(2). Por exemplo, o programa OpenWebMail precisa ser capaz de ler e escrever no diretório de correio eletrônico, no diretório pessoal do usuário, e também precisa ser capaz de funcionar usando qualquer usuário no sistema. Tentar colocá-lo em chroot será inútil, já que você será obrigado a desativar todos os benefícios do uso do chroot(2). Mesmo com uma aplicação tão simples como o contador, ele precisa escrever no disco (para guardar sua contagem), então parte do benefício do chroot(2) é perdida.

Qualquer aplicação que deve funcionar com privilégios de root é inútil no escopo do chroot(2), já que o root pode sair do chroot(2).

Não se esqueça que, se o processo de colocar sua aplicação em chroot é muito difícil, você não pode atualizar ou instalar uma nova versão do sistema na frequência que deveria. Isso pode acabar tornando seu sistema MENOS seguro que um sistema mais atualizado e com o chroot desativado.

10.17 - Posso mudar o shell do usuário root?

Algumas vezes é dito que não se deve mudar o shell do usuário root, apesar de não existir razão para não fazer isso no OpenBSD.

O shell padrão para o usuário root no OpenBSD é o ksh.

Uma diretiva Unix tradicional é usar para o root somente shells compilados estaticamente, porque se seu sistema entra em modo usuário único, partições não-raiz não são montadas, e shells ligados dinamicamente não são capazes de acessar as bibliotecas situadas na partição /usr. Isso não é realmente um problema significante no OpenBSD, já que o sistema pergunta por um shell quando ele entra em modo usuário único, e o shell por padrão é o sh. Os três shells padrão do OpenBSD (csh, sh e ksh) são todos ligados estaticamente, e são utilizáveis no modo usuário único.

10.18 - O que mais posso fazer com o ksh?

No OpenBSD, ksh é o pdksh, o shell Korn em Domínio Público ("Public Domain Korn Shell"), e é o mesmo binário que o sh.

Usuários confortáveis com o shell bash, utilizado na maioria das vezes em sistemas Linux, provavelmente acharão o ksh muito familiar. O ksh(1) oferece a maioria das opções encontradas no shell bash, incluindo a completação de comandos através da tecla tab, edição de linha de comando e acesso ao histórico através das teclas direcionais, e CTRL-A/CTRL-E para pular para o começo ou fim da linha de comando. Se você deseja outras opções do shell bash, o próprio bash pode ser instalado através dos pacotes ou através dos portes.

O prompt de comando do ksh pode ser facilmente alterado para fornecer mais informações do que o prompt padrão "$ ", através da configuração da variável PS1. Por exemplo, ao inserir a seguinte linha:

export PS1='$PWD $ '
no seu arquivo /etc/profile, produz-se o seguinte prompt de comando:
/home/nick $
Veja o arquivo /etc/ksh.kshrc, que inclui muitas opções úteis e exemplos, e pode ser executado em seu arquivo .profile de usuário.

O shell ksh(1) do OpenBSD foi melhorado. Vários "caracteres especiais" para a sequência primária de prompt, PS1, similares àqueles usados no shell bash, foram adicionados. Por exemplo:

\e - Insere um caractere de escape ASCII.
\h - O nome da máquina, sem o nome de domínio.
\H - O nome completo da máquina, incluindo o nome de domínio.
\n - Insere um caractere de nova linha.
\t - O horário atual, no formato HH:MM:SS de 24 horas.
\u - O nome do usuário atual.
\w - O diretório de trabalho atual. $HOME é abreviado como `~'.
\W - O nome base do diretório de trabalho atual.
\$ - Mostra "#" para os usuários root, e "$" para os outros.
(veja a página de manual ksh(1) para obter mais detalhes, e muito, muito mais caracteres especiais! Também note que o caractere "$" tem um significado especial dentro de aspas duplas, então manipule-o com cuidado)

Você pode usar o seguinte comando:

export PS1="\n\u@\H\n\w \\$ "
para ter um prompt de comando excessivamente detalhado, mas de certa forma útil.

10.19 - Serviços de diretório

O OpenBSD pode ser usado como servidor e cliente de banco de dados contendo credenciais de usuários, informações de grupos e outros dados relacionados à rede.

10.19.1 - Quais serviços de diretório estão disponíveis?

Naturalmente, você pode usar vários serviços de diretório no OpenBSD. Mas o YP é o único que pode ser acessado diretamente usando as funções da biblioteca padrão de C como getpwent(3), getgrent(3), gethostbyname(3) e outras. Assim, se você mantém seus dados em um banco de dados YP, você não precisa copiá-lo para arquivos de configuração locais como master.passwd(5) antes de você poder utilizá-lo, por exemplo, para autenticar usuários do sistema.

YP é um serviço de diretório compatível com o NIS ("Network Information System", ou Sistema de Informação da Rede) da Sun Microsystems. Veja yp(8) para uma visão geral sobre as páginas de manual disponíveis. Seja cuidadoso, alguns sistemas operacionais possuem serviços de diretório com nomes parecidos, mas todos são incompatíveis; por exemplo, NIS+.

Para usar outros serviços de diretório, exceto o YP, você precisa popular arquivos de configuração locais a partir do diretório, ou você precisa de um "frontend" YP para o diretório. Por exemplo, você pode usar o porte sysutils/login_ldap quando escolher o primeiro, enquanto o daemon ypldap(8) fornece o último.

Para algumas aplicações, a simples sincronização de um pequeno número de arquivos de configuração entre um grupo de máquinas usando ferramentas como cron(8), scp(1) ou rsync (disponível no portes) se torna uma alternativa fácil e robusta para um serviço de diretório completo.

10.19.2 - Considerações de segurança sobre YP

Por razões de compatibilidade, todas as características de segurança embutidas na implementação de YP do OpenBSD estão desativadas, por padrão. Mesmo quando elas estão todas ativadas, o protocolo NIS ainda é de natureza insegura por duas razões: Todos os dados, incluindo dados sensíveis como dispersões de senhas, são transmitidos sem encriptação na rede, e nem o cliente nem o servidor podem verificar confiavelmente a identidade um do outro.

Dessa forma, antes de ativar qualquer servidor YP, você deve considerar se essas falhas de segurança são aceitáveis no seu contexto. Em particular, YP é inadequado se atacantes em potencial têm acesso físico à sua rede. Qualquer um com acesso root em qualquer computador conectado no seu segmento de rede com tráfego YP pode enganar o seu domínio YP e recuperar seus dados. Em alguns casos, passar o tráfego YP por túneis SSL ou IPSec pode ser uma opção, ou você pode considerar a combinação de YP com autenticação kerberos(8).

10.19.3 - Configuração de um servidor YP

  1. Um servidor YP serve um grupo de clientes chamado de um "domínio". Você primeiro deve selecionar um nome de domínio; ele pode ser uma string arbitrária e não precisa estar relacionado em nenhuma forma com nomes de domínio DNS. Escolher um nome aleatório, como "Eepoo5vi", pode melhorar marginalmente a segurança, embora o efeito seja de segurança por obscuridade. Caso você precise manter vários domínios YP diferentes, provavelmente é melhor escolher nomes descritivos como "vendas", "marketing" e "pesquisa" para evitar erros de administração do sistema causados pela obscuridade. Também note que algumas versões do SunOS requerem o uso do nome de domínio DNS da máquina, então sua escolha pode ser restrita em uma rede que inclui tais máquinas.

    Use o utilitário domainname(1) para definir um nome de domínio, e coloque-o no arquivo defaultdomain(5) para defini-lo automaticamente durante a inicialização do sistema.

    echo "puffynet" > /etc/defaultdomain
    domainname `cat /etc/defaultdomain`
    
  2. Inicialize o servidor YP usando o comando interativo

    ypinit -m
    
    Neste ponto ainda não é necessário especificar os servidores escravos. Para adicionar servidores escravos, você deve executar novamente o ypinit(8) usando a opção -u. Configurar ao menos um servidor escravo para cada domínio é útil para evitar as interrupções de serviço, pois o servidor mestre pode desligar-se ou perder a conectividade de rede; em particular, os processos clientes tentando acessar os mapas YP ficarão bloqueados indefinidamente até que eles recebam a informação requerida. Assim, interrupções de serviço YP tipicamente fazem com que as máquinas clientes fiquem inutilizáveis até que o serviço YP volte a funcionar.
  3. Decida onde guardar os arquivos fonte usados para gerar seus mapas YP. Manter a configuração do servidor separada da configuração servida ajuda a controlar quais informações serão servidas e quais não serão, então o /etc padrão na maioria das vezes não é a melhor escolha.

    A única inconveniência causada por mudar o diretório fonte é que você não será capaz de adicionar, remover e modificar usuários e grupos no domínio YP usando utilitários como user(8) e group(8). No lugar, você terá que editar os arquivos de configuração com um editor de texto.

    Para definir o diretório fonte, edite o arquivo /var/yp/`domainname`/Makefile e mude a variável DIR; por exemplo

    DIR=/etc/yp/src/puffynet
    
  4. Considere a personalização de outras variáveis em /var/yp/`domainname`/Makefile. Veja Makefile.yp(8) para obter mais detalhes.

    Por exemplo, mesmo no caso de você utilizar o diretório fonte padrão, /etc, você usualmente não precisa ter todas as contas e grupos existentes no servidor em todas as suas máquinas cliente. Em particular, não servir a conta do root e, assim, manter a dispersão da senha do root confidencial é, frequentemente, benéfico para a segurança. Revise os valores de MINUID, MAXUID, MINGID e MAXGID e ajuste-os de acordo com as suas necessidades.

    Se todos os seus clientes YP usam OpenBSD ou FreeBSD, exclua as senhas encriptadas dos mapas passwd definindo UNSECURE="" em /var/yp/`domainname`/Makefile.

    A prática anterior de editar o arquivo modelo /var/yp/Makefile.yp não é mais recomendada. Mudanças naquele arquivo afetam todos os domínios inicializados após a mudança, mas não afetam domínios inicializados antes da mudança, dessa forma essa prática é propensa a erros: você tem o risco de que as mudanças não tenham efeito, e o risco de esquecê-las e delas afetarem outros domínios mais tarde, para os quais essas mudanças nunca foram pretendidas.

  5. Crie o diretório fonte e popule-o com os arquivos de configuração que você necessita. Veja Makefile.yp(8) para aprender sobre quais mapas YP requerem quais arquivos fonte. Para o formato de arquivos de configuração individuais, consulte passwd(5), group(5), hosts(5) e outros, e olhe nos exemplos em /etc.

  6. Crie a versão inicial dos seus mapas YP utilizando os comandos

    cd /var/yp
    make
    
    Não se preocupe com as mensagens de erro do yppush(8) por enquanto. O servidor YP não está em execução ainda.
  7. YP utiliza o rpc(3) ("remote procedure calls", ou chamadas de procedimento remoto) para comunicar-se com os clientes, então é necessário ativar o portmap(8). Para fazer isso, edite o rc.conf.local(8) e defina portmap_flags="". Isso iniciará o portmapper na próxima inicialização. Você pode evitar a reinicialização iniciando-o manualmente:

    echo 'portmap_flags=""' >> /etc/rc.conf.local
    portmap
    
  8. Considere o uso do recurso de segurança securenet(5) ou o ypserv.acl(5) do daemon servidor YP. Mas esteja atento ao fato de que ambos somente fornecem controle de acesso baseado em IP. Dessa forma, eles somente ajudam enquanto atacantes em potencial não possuem acesso físico ao hardware do segmento de rede transmitindo seu tráfego YP nem acesso root em qualquer máquina conectada a esses segmentos de rede.

  9. Finalmente, inicie o daemon servidor YP:

    ypserv
    
    Ele será reiniciado automaticamente durante a inicialização contanto que o diretório /var/yp/`domainname` continue existindo.
  10. Para testar o novo servidor, considere torná-lo o seu próprio cliente, seguindo as instruções na primeira parte da próxima seção. Caso você não queira usar seus próprios mapas, você pode desativar a parte do cliente após o teste, com os seguintes comandos:

    pkill ypbind
    rm -rf /var/yp/binding
    
  11. Se você deseja permitir que usuários mudem suas senhas a partir de máquinas clientes, então você precisa ativar yppasswdd(8):

    echo 'yppasswdd_flags="-d /etc/yp/src/puffynet"' >> /etc/rc.conf.local
    rpc.yppasswdd
    
    Caso você deixe o diretório fonte no /etc padrão, use apenas yppasswdd_flags="".
  12. Lembre-se que a cada vez que você muda um arquivo incluído por um mapa YP, você deve gerar novamente seus mapas YP.

    cd /var/yp
    make
    
    Isso atualiza todos os arquivos de banco de dados em /var/yp/`domainname`, com uma exceção: o arquivo ypservers.db, que lista todos os servidores YP, mestres e escravos, associados ao domínio, é criado diretamente com ypinit -m e modificado exclusivamente por ypinit -u. No caso de você excluí-lo acidentalmente, execute ypinit -u para recriá-lo a partir do zero.

10.19.4 - Configuração de um cliente YP

Configurar um cliente YP envolve duas partes distintas. Em primeiro lugar, você precisa de um daemon cliente YP em execução, conectando a sua máquina cliente ao servidor YP. Ao finalizar os passos seguintes, você será capaz de recuperar dados de um servidor YP, mas aqueles dados ainda não serão usados pelo sistema:
  1. Igual no servidor, você precisa definir um nome de domínio e ativar o portmapper:

    echo "puffynet" > /etc/defaultdomain
    domainname `cat /etc/defaultdomain`
    echo "portmap=YES" >> /etc/rc.conf.local
    portmap
    
  2. É recomendado o fornecimento de uma lista de servidores YP no arquivo de configuração /etc/yp/`domainname`. Caso contrário, o daemon cliente YP usará emissões ("broadcasts") de rede para encontrar os servidores YP para seu domínio. Especifique de maneira explícita os servidores que são mais robustos e marginalmente menos abertos à ataques. Se você não configurou os servidores escravos, apenas coloque o nome de máquina do servidor mestre em /etc/yp/`domainname`.

  3. O daemon cliente YP é chamado de ypbind(8). A inicialização manual criará o diretório /var/yp/binding, como ele será automaticamente reiniciado na inicialização.

    ypbind
    
  4. Se tudo ocorrer bem, você deve ser capaz de consultar o servidor YP usando o ypcat(1) e ver seu mapa de senha como resposta.

    ypcat passwd
    bob:*:5001:5000:Bob Nuggets:/home/bob:/usr/local/bin/zsh
    ...
    
    Outras ferramentas úteis para a depuração da sua configuração YP incluem ypmatch(1) e yptest(8).
A segunda parte da configuração de um cliente YP envolve a edição de arquivos de configuração locais, tais como certos mapas YP usados por várias instalações do sistema. Nem todos os servidores servem todos os mapas padrão suportados pelo sistema operacional, alguns servidores servem mapas adicionais, que não fazem parte do padrão, e você não tem meios de forçar o uso de todos aqueles mapas. Quais dos mapas disponíveis serão ou não serão usados, e para quais propósitos eles serão usados, é responsabilidade do administrador de sistema da máquina cliente.

Para uma lista de mapas YP padrão e seus usos, veja Makefile.yp(8). Os casos mais comuns de uso incluem:

10.20 - Conjuntos de caracteres (charset) e suporte a idioma nativo

O OpenBSD usa ASCII como seu Conjunto de Caracteres (charset) padrão. Ele também suporta os seguintes charsets: Latin (ISO-8859-*), KOI-8 e Unicode (UTF-8).

10.20.1 - Configurando o charset

Para usar um dos conjuntos de caracteres estendidos, a variável de ambiente LC_CTYPE deve ser definida para o nome de uma das localidade suportadas. A variável LC_CTYPE afetará somente o conjunto de caracteres disponíveis para aplicações. Ela não vai mudar o idioma usado para mensagens do aplicativo.

A lista de localidades pode ser listada com o seguinte comando:

ls /usr/share/locale
A variável de ambiente LC_CTYPE pode ser definida das seguintes maneiras:

Poucos utilitários do sistema base suportam UTF-8 até o momento. A maioria vai fazer uso de caracteres ASCII. Entretanto, muitos programas presentes na Coleção de Ports tem suporte a UTF-8.

UTF-8 can also be used with specific applications only by starting those applications in uxterm(1). This works even if the login session uses a non-UTF-8 locale.

Se estiver efetuando login remoto utilizando ssh(1), a variável de ambiente LC_CTYPE presente em seu sistema não será propagada e você terá de defini-la manualmente para que tenha o mesmo valor utilizado no terminal local.

10.20.2 - Alterando idioma utilizado em mensagens das aplicações

O idioma utilizado em mensagens das aplicações pode ser alterado modificando o valor da variável de ambiente LC_MESSAGES para o nome de uma das localidades suportadas. Este procedimento pode ser realizado da mesma maneira como descrito acima, para alterar o valor da variável de ambiente LC_CTYPE. Ambas as variáveis, LC_MESSAGES e LC_CTYPE, devem ser configuradas com os mesmos valores.

Poucos utilitários presentes no sistema base suportam outro idioma, senão Inglês, até o momento. Entretanto, muitos programas presentes na Coleção de Ports já suportam diversos idiomas. Eles retornarão mensagens em Inglês, caso o idioma desejado não esteja disponível.

[Índice da FAQ] [Seção 9 - Migração para OpenBSD] [Seção 11 - O sistema X Window]


[voltar] www@openbsd.org
$OpenBSD: faq10.html,v 1.12 2013/01/18 07:15:55 ajacoutot Exp $