Capítulo 5. Autenticação do Sistema

Índice
Introdução
LDAP
NIS
Implementação do serviço de NIS
Radius/Portslave

Introdução

Um dos principais requisitos exigidos de um sistema é segurança. Um sistema seguro é aquele que permite que as informações possuam integridade, e que os acessos às informações sejam feitos por pessoas autorizadas, permitindo protegê-las contra acessos indesejáveis.

É importante frisar que não existe um sistema que possa ser completamente seguro. Tudo que se pode fazer é aumentar a dificuldade de invasões no sistema. É necessário estabelecer uma política de segurança, informando o quanto de segurança é necessário no sistema e qual a melhor maneira de implementá-la para este nível. Por exemplo, a implementação de uma rede segura pode ser diferente da implementação de um site seguro, que pode diferir de proteger apenas um servidor dentro da rede.

Existem vários métodos simples que podem ser verificados para aumentar a segurança de um sistema: quem pode acessar fisicamente uma máquina essencial, segurança na BIOS, gerenciador de inicialização com senha, privilégios para usuários, verificação de portas para Internet, compilação de módulos de segurança no kernel, enfim, uma infinidade de detalhes que podem ser verificados pelo administrador do sistema como tarefas rotineiras.

Neste contexto está incluído o conceito de autenticar. Autenticação é o processo de reconhecimento dos dados que são recebidos, comparando-os com os dados que foram enviados, e verificando se o transmissor que fez a requisição é, na verdade, o transmissor real.

Autenticação utiliza o modelo cliente-servidor. Um cliente faz a requisição para o servidor, que verifica se o cliente tem a permissão para acessar o servidor. Este também verifica quais são estas permissões, ou seja, quais as informações que o cliente poderá acessar. Após isso, retorna a requisição para o cliente.

Neste capítulo serão apresentadas três soluções que implementam autenticação: LDAP, que trabalha com serviço de diretório, NIS que trabalha com serviços e compartilhamento de informações de usuários na rede, e a solução Radius e Portslave, que é um protocolo de autenticação e um emulador de hardware que utiliza este protocolo.

LDAP

Nesta seção apresentaremos informações sobre instalação, configuração, execução e administração de um Servidor LDAP (Lightweight Directory Access Protocol) em um computador com Linux. Você aprenderá como recuperar informações do seu Diretório, utilizando os clientes e utilitários fornecidos. Serão tratados assuntos como a migração de sua base de usuários para um banco de dados LDAP, quais informações serão importadas, de que modo efetuar autenticação e acesso remoto através do LDAP, entre outros, além de mostrar como usar o Livro de Endereços do Netscape para o envio de e-mails e a navegação através de URLs, fazendo o uso dos recursos de LDAP.

Nota: A versão 2.1 do OpenLDAP é agora a versão padrão do LDAP usada no Conectiva Linux. A versão anterior, 1.2.x, é oferecida apenas para compatibilidade com binários antigos, e se chama openldap1-1.2.11.

Apresentação

LDAP é um protocolo (executado sobre o TCP/IP) cliente-servidor, utilizado para acessar um serviço de Diretório. Ele foi inicialmente usado como uma interface para o X.500, mas também pode ser usado com autonomia e com outros tipos de servidores de Diretório. Atualmente vem se tornando um padrão, diversos programas já têm suporte a LDAP. Livros de endereços, autenticação, armazenamento de certificados digitais (S/MIME) e de chaves públicas (PGP) são alguns dos exemplos onde o LDAP já é amplamente utilizado.

Serviço de Diretório

Um Diretório é como um banco de dados, mas tende a conter mais informações descritivas, baseadas em atributo e é organizado em forma de árvore, não de tabela. A informação em um Diretório é geralmente mais lida do que é escrita. Como conseqüência, Diretórios normalmente não são usados para implementar transações complexas, ou esquemas de consultas regulares em bancos de dados, transações estas que são usadas para fazer um grande volume de atualizações complexas. Atualizações em Diretórios são tipicamente simples ou nem são feitas.

Diretórios são preparados para dar resposta rápida a um grande volume de consultas ou operações de busca. Eles também podem ter a habilidade de replicar informações extensamente; isto é usado para acrescentar disponibilidade e confiabilidade, enquanto reduzem o tempo de resposta.

Existem várias maneiras diferentes para disponibilizar um serviço de Diretório. Métodos diferentes permitem que diferentes tipos de informações possam ser armazenadas no Diretório, colocando requerimentos diferentes, sobre como aquela informação poderá ser referenciada, requisitada e atualizada, como ela é protegida de acessos não autorizados, etc. Alguns serviços de Diretório são locais, fornecendo o serviço para um contexto restrito (exemplo: o serviço finger em uma máquina isolada). Outros serviços são globais, fornecendo o serviço para um contexto muito maior (por exemplo, a própria Internet).

Serviços globais normalmente são distribuídos (Figura 5-1), ou seja, cada servidor é responsável por uma parte apenas. O DNS (Domain Name System) é um exemplo, ele é um tipo de serviço de Diretório, embora bastante especializado.

Figura 5-1. Dados de um Diretório distribuídos em três servidores

Tipo de Informação

O modelo de serviço do Diretório LDAP é baseado em entradas. Uma entrada é um conjunto de atributos e é referenciada através de um nome distinto[1]. O DN é usado para referenciar uma entrada de forma não ambígua. Cada um dos atributos de entrada tem um tipo e um ou mais valores. Este tipos geralmente são palavras mnemônicas, como cn para nome comum, ou mail para endereço de correio eletrônico; existem RFCs (Request For Comments) que determinam estas palavras. Os valores dependem do tipo de atributo. Por exemplo, um atributo mail pode conter o valor . Um atributo photoJpeg irá conter uma fotografia.

Organizando a Informação

No LDAP, entradas de Diretório são organizadas em uma hierarquia de árvore invertida, semelhante em alguns aspectos à organização do DNS. A estrutura desta árvore geralmente reflete limites políticos, geográficos e/ou organizacionais. O nó mais alto (raiz) é tipicamente o componente nome de domínio dc[2] de uma companhia, estado ou organização. Abaixo ficam as entradas representando estados ou organizações nacionais. Abaixo elas podem ser entradas representando pessoas, unidades organizacionais, impressoras, documentos, ou qualquer outra coisa em que você possa pensar. A Figura 5-2 mostra um exemplo de um Diretório LDAP em árvore.

Figura 5-2. Árvore de Diretório LDAP

Apesar de termos entradas para países, o diretório não possui uma entidade centralizadora como, por exemplo, o root servers do DNS. A separação por países, por exemplo, pode ser útil para empresas multinacionais. A Figura 5-2 também ilustra uma outra vantagem de um serviço de Diretórios. Os ramos da árvore podem estar em máquinas diferentes. No caso da Figura 5-2, a entrada o=Brasil Ltda está em um outro computador. Note que esta característica também é típica do DNS.

Classes de Objetos

Já foi visto alguns tipos de atributos usados nas entradas em um serviço de Diretórios: mail, cn, telephoneNumber e outros. Pode-se criar qualquer tipo de atributo, mas isto não é recomendado. No LDAP existem diversas classes de objetos, e cada classe contém uma lista de atributos obrigatórios e opcionais. Essa lista é tipicamente definida em uma RFC, mas empresas ou organizações também podem criar suas próprias classes.

Por exemplo, a classe person é definida da seguinte maneira (definida na RFC2256):

objectclass ( 2.5.6.6 NAME 'person' SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

O servidor LDAP pode ser configurado para verificar as classes (através da opção schemacheck) e forçar o uso correto dos atributos. Isto geralmente é uma boa idéia; com a verificação das classes habilitada, será obrigatória a inserção dos atributos objectClass, sn e cn, por exemplo. Quando for definido que uma entrada do Diretório é da classe person, um atributo description será opcional. Entradas em Diretórios podem ter várias classes diferentes, basta apenas observar os requisitos de atributos de cada classe.

Referenciando a Informação

Uma entrada é referenciada pelo seu nome distinto DN. O DN é único e na sua construção utiliza o caminho inteiro, desde a entrada até o topo do Diretório. Por exemplo, na Figura 5-2, DN="cn=Maria A Silva,o=U de M,c=BR". As entradas também podem ser referenciadas através de um RDN (Relative Distinguished Name). Ainda neste exemplo o RDN é cn=Maria A. Silva. Pode-se fazer uma comparação com hostname (RDN) e FQDN (DN).

Acessando a Informação

O LDAP define operações para consultar e atualizar o Diretório. Operações são fornecidas para adição e remoção de uma entrada do Diretório, modificação de uma entrada existente e modificação do nome de uma entrada. A operação LDAP de busca pode abranger a árvore toda (uma busca com escopo subtree) ou apenas um ramo, sem descer ou subir para os demais. Além de especificar com filtros quais entradas se deseja encontrar, também é possível especificar quais atributos destas entradas estão sendo procurados. Se os atributos não forem especificados, todos serão retornados.

Por exemplo, na Figura 5-2 você pode querer pesquisar toda a sub-árvore de Diretório abaixo da Universidade de Marília, procurando por pessoas com o nome de Maria Silva, recuperando o endereço de correio eletrônico para cada entrada encontrada. O LDAP permite que você faça isto facilmente. Ou você pode querer buscar as entradas diretamente abaixo do c=BR, entrada para organizações com a palavra "Brasil" no seu nome, e que tenham um número de telefone. O LDAP permite que você faça isto também. A próxima seção descreve com mais detalhes o que você pode fazer com LDAP e como isto poderá ser útil.

Proteção Contra Acessos Não Autorizados

Alguns serviços de Diretório não fornecem proteção, permitindo que qualquer um possa ver as informações. O LDAP fornece um método para autenticação de um cliente, ou prova sua identidade para um servidor de Diretório, pavimentando o caminho para um rico controle de acesso, protegendo as informações contidas no servidor.

Funcionamento do LDAP

O serviço de Diretório LDAP é baseado em um modelo cliente-servidor. Um ou mais servidores LDAP contêm os dados criando a árvore de Diretório LDAP. Um cliente LDAP conecta-se a um servidor e faz uma requisição. O servidor responde com a requisição, ou exibe um ponteiro para um local onde o cliente pode conseguir a informação (tipicamente, outro servidor LDAP). Pode-se fazer novamente uma comparação com o DNS, a diferença é que o servidor LDAP não faz buscas recursivas, ou seja, em nome do cliente. O cliente é encarregado de procurar pelo servidor até encontrar a informação desejada.

Conceito e Utilização do slapd

O slapd é um servidor de Diretório LDAP que pode ser executado em diferentes plataformas Linux. Você pode usá-lo para fornecer o seu próprio serviço de Diretório. Seu Diretório pode conter qualquer coisa que você queira colocar. Você pode conectá-lo a um serviço de Diretório LDAP global, ou executar o serviço para você mesmo. Algumas das características e potencialidades mais interessantes do slapd incluem:

Escolha do banco de dados: O slapd vem com quatro tipos diferentes de banco de dados que você pode escolher. São eles: LDBM, um banco de dados baseado em disco de alta performance; SHELL, uma interface de banco de dados para comandos arbitrários do Linux ou scripts de linha de comando e PASSWD, um banco de dados simples de um arquivo de senhas. A partir da versão 2.1 do OPENLDAP também existe a opção de usar BDB[3] como backend que é o padrão.

Múltiplas instâncias dos bancos de dados: O slapd fornece uma rica e poderosa facilidade no controle de acesso, permitindo a você controlar o acesso a informação em seu(s) banco(s) de dados. Você pode controlar o acesso às entradas baseadas em informação de autenticação LDAP, endereço IP, nome do domínio e outros critérios.

Gerenciamento de processos: O slapd utiliza vários processos para ter uma alta performance. Um único sub-processo slapd manuseia todas as requisições vindas, reduzindo a quantidade requisitada de recursos do sistema. O slapd irá automaticamente selecionar o melhor suporte a vários processos para a sua plataforma.

Replicação: O slapd pode ser configurado para usar réplicas. Este esquema de replicação mestre/escravo é vital em ambientes de grande volume, onde um único slapd não pode fornecer a disponibilidade ou a confiabilidade necessárias.

Facilidade de configuração: O slapd é altamente configurável. Através de um único arquivo de configuração ele permite mudar simplesmente tudo, sempre que você quiser alterar. As opções de configuração têm padrões razoáveis, tornando o seu trabalho muito mais fácil.

As características do openldap-2.1.x são:

LDAPv2 e LDAPv3: O slapd suporta as versões 2 e 3 do LDAP. Ele fornece suporte para as últimas características enquanto mantém interoperabilidade com os clientes existentes. O slapd tem suporte somente ao IPv4. Por padrão, apenas o LDAPv3 está habilitado.

Autenticação SASL: O slapd tem suporte a serviços de autenticação diferenciados através do uso de SASL. A implementação SASL do slapd utiliza o software Cyrus SASL com suporte a vários mecanismos, incluindo DIGEST-MD5 e CRAM-MD5.

Camada de Transporte Segura: O slapd fornece proteções de privacidade e integridade através do uso de TLS. A implementação TLS do slapd utiliza o software OpenSSL[4].

Internacionalização: O slapd suporta Unicode e tags de linguagem.

LDAP e o X.500

O LDAP foi originalmente desenvolvido como um cliente para o X.500, o serviço de Diretório OSI. O X.500 define o Protocolo de Acesso a Diretório (DAP[5]) para os clientes usarem quando estiverem em contato com servidores de Diretório. O DAP é um protocolo pesado, que roda sobre uma camada OSI completa, e precisa de uma quantidade significante de recursos computacionais para ser executado. O LDAP roda diretamente sobre o TCP e fornece a maioria das funcionalidades do DAP, a um custo muito menor.

Este uso do LDAP torna fácil acessar o Diretório X.500, mas ainda exige um serviço X.500 completo, para tornar os dados disponíveis aos vários clientes LDAP que estão sendo desenvolvidos.

Se você já está executando um serviço X.500 e quer continuar a fazer isto, você provavelmente pode parar de ler este capítulo, ele é todo sobre como executar o LDAP via slapd, sem utilizar o X.500. Se você não está usando o X.500, quer parar de usar o X.500 ou não tem planos imediatos para executar o X.500, continue lendo.

É possível replicar dados de um servidor de Diretório slapd para um DAP X.500; isto permite que sua organização torne seus dados disponíveis como parte de um serviço de Diretório X.500 global em uma base somente para leitura.

Um outro caminho para tornar os dados em um servidor slapd disponíveis para a comunidade X.500 seria usando um DAP X.500 para porta de entrada do LDAP.

Replicação

O slurpd é um servidor para Linux que auxilia o slapd, provendo a replicação do banco de dados. Ele é responsável pela distribuição das mudanças ocorridas no servidor master para o servidor slave (a réplica). Veja a Figura 5-3.

Figura 5-3. Um Serviço de Diretório Replicado com Dados Distribuídos em Três Servidores

O slapd e o slurpd se comunicam através de um simples arquivo texto, que é usado para registrar as mudanças. A sintaxe deste arquivo lembra um pouco a sintaxe dos arquivos resultantes do diff, no sentido de que estão descritas as entradas ou atributos que devem ser removidos, adicionados ou modificados. O slurpd irá se encarregar de aplicar estas mudanças ao servidor da réplica. Durante este processo, a réplica e o master ficarão diferentes.

Autenticação com OpenLDAP-2.1.X

Uma das questões mais importantes do pacote openldap é sem dúvida a autenticação. Isto é necessário para que a implementação estivesse em conformidade com o protocolo LDAPv3, que exige algum tipo de autenticação forte. Há basicamente dois mecanismos de autenticação:

  • suporte a SSL nativo em todas as conexões (sem necessidade de programas como Stunnel);

  • suporte a Simple Authentication and Security Layer, também conhecido com SASL, definido da RFC2222. A autenticação SASL também pode ser usada por outros servidores, como versões recentes do MTA Sendmail.

Ambos os mecanismos permitem a autenticação segura, pois as senhas não trafegarão mais em texto claro (clear text), sendo imunes a sniffers de rede. Prós e contras de cada um dos mecanismos serão apresentados para que o administrador possa escolher a melhor solução para a sua rede.

SSL com OpenLDAP-2.1.x

O processo de se conectar a um servidor LDAP e realizar alguma operação sempre começa com a autenticação do usuário. Esta autenticação pode ser de um usuário mesmo (ou seja, com login e senha), ou anônima, à semelhança do que pode ser feito com FTP. Normalmente operações de pesquisa (search) no diretório podem ser anônimas, mas acesso ao atributo de senha, por exemplo, precisa ser autenticado com um usuário real.

A operação de bind é a operação de autenticação de usuário. Quando nenhum DN (que seria o nome de login) é fornecido, a autenticação é considerada do tipo anônima. Abaixo, uma entrada de log do servidor LDAP mostrando uma autenticação anônima, uma pesquisa e um logout:

Jun 23 13:44:14 kepler slapd[13336]: conn=365 op=1 BIND dn="" 
method=128
Jun 23 13:44:14 kepler slapd[13336]: conn=365 op=1 RESULT tag=97
err=0 text=
Jun 23 13:44:14 kepler slapd[13463]: conn=365 op=2 SRCH
base="o=minhaorganizacao,c=br" scope=2 filter="(uid=usuario)"
Jun 23 13:44:14 kepler slapd[13463]: conn=365 op=2 SEARCH RESULT
tag=101 err=0 text=
Jun 23 14:07:53 kepler slapd[13337]: conn=365 op=3 UNBIND

Note que o argumento da operação BIND é uma string vazia, ou seja, foi uma autenticação "anônima". Abaixo, o log de uma conexão autenticada de um usuário chamado usuario:

Jun 25 10:03:34 kepler slapd[2016]: conn=10 op=1 BIND
dn="UID=USUARIO,OU=PEOPLE,O=MINHAORGANIZACAO,C=BR" method=128

Jun 25 10:03:34 kepler slapd[2016]: conn=10 op=1 RESULT tag=97 err=0
text=
Jun 25 10:03:34 kepler slapd[2012]: conn=10 op=2 SRCH
base="o=minhaorganizacao,c=br" scope=2 filter="(uid=usuario)"

Jun 25 10:03:34 kepler slapd[2012]: conn=10 op=2 ENTRY
dn="uid=usuario,ou=People,o=minhaorganizacao,c=br"

Jun 25 10:03:34 kepler slapd[2012]: conn=10 op=2 SEARCH RESULT
tag=101 err=0 text=

Jun 25 10:03:34 kepler slapd[2016]: conn=10 op=3 UNBIND

A chamada autenticação simples, que era a única disponível nas versões 1.2.x do OpenLDAP, transmite a senha em texto claro através da rede até o servidor LDAP. Isso é pior do que parece. Sabe-se que o arquivo /etc/shadow contém as senhas da máquina Linux, por exemplo, mas que elas estão criptografadas, ou seja, mesmo tendo acesso a este arquivo, um atacante ainda precisaria realizar um ataque de dicionário para tentar descobrir as senhas. A autenticação simples do LDAP nem usa esses hashes. A senha vai em texto claro mesmo, exatamente como é digitada. Ou seja, totalmente vulnerável.

Versões anteriores do OpenLDAP tinham que usar programas externos para poder proteger essa operação, como por exemplo o Stunnel. Neste caso, a conexão é criptografada e esse perigo não existe.

Se for usada autenticação simples no OpenLDAP-2.1.x, então será preciso usar criptografia. A diferença é que agora ela é nativa, ou seja, não precisa mais do Stunnel. Mais adiante será mostrado como configurar o servidor e o cliente para usar criptografia; agora, apenas serão mostrado os tipos de sessões criptografadas disponíveis, que são dois: SSL e START-TLS.

Até agora sempre foi falado em proteger a autenticação. Na verdade, dependendo dos dados disponíveis no servidor LDAP, pode ser bastante interessante proteger a sessão toda, e não apenas a operação de BIND. O uso de SSL permite isso, ao contrário de alguns métodos da autenticação SASL, como será visto mais adiante.

Note que para usar SSL é necessário que o servidor tenha um certificado. A partir da versão 2.1 do OPENLDAP, certificados auto-assinados não são mais aceitos. É necessário o uso de um certificado emitido por uma CA própria ou comercial.

SSL

No modo SSL, o servidor LDAP vai atender, além da porta normal de serviço (389), uma porta para conexões criptografadas (ldaps, a porta 636). Assim, clientes que desejarem conexões criptografadas devem usar a porta 636. Onde a criptografia não é necessária, usa-se a porta normal 389.

Um mesmo servidor pode ser configurado para escutar em ambas as portas ou apenas numa delas sem problemas. Ao usar SSL, após o estabelecimento da sessão, todos os dados estarão criptografados, e não apenas a operação de BIND.

START-TLS

A operação de start-tls é bastante semelhante à SSL comum (numa porta exclusiva), mas a criptografia acontece na porta não-ssl mesmo (ou seja, 389).

O cliente se conecta na porta 389 como sempre e pode agora escolher se quer uma sessão criptografada ou não. Se quiser uma sessão comum, sem criptografia, prossegue normalmente como se a opção start-tls não existisse. Mas, por outro lado, se quiser iniciar uma sessão criptografada, não é necessário trocar de porta (para a 636), basta utilizar o comando de start-tls e a sessão criptografada iniciará nesta porta mesmo, a 389.

Isto tem a vantagem de se ter apenas uma porta aberta, o que pode ser bom para algumas configurações de firewall, por exemplo. Mas nem todos os clientes suportam o recurso start-tls; alguns esperam encontrar a porta 636 quando é pedido que usem o recurso de criptografia. No servidor LDAP, ambas as opções podem estar habilitadas simultaneamente: SSL na porta 636 e START-TLS na porta normal, a 389.

SASL

SASL é um mecanismo genérico de autenticação para protocolos que precisem desse tipo de serviço. Atualmente, sendmail, cyrus-imap e openldap-2.x são capazes de usar SASL, e mais aplicativos com este tipo de autenticação devem surgir.

SASL é genérico e pode oferecer diversos tipos de autenticação. Estes mecanismos são também conhecidos como plugins, e podem ser tão simples como o PLAIN, onde a senha trafega em texto claro, e avançados como DIGEST-MD5, onde é usado um método de desafio/resposta (challenge-response). Os pacotes fornecidos no Conectiva Linux implementam pelo menos os seguintes mecanismos de autenticação SASL:

  • ANONYMOUS: autenticação anônima, ou seja, não é fornecido nem usuário nem senha;

  • CRAM-MD5: vários protocolos, para estarem em conformidade, precisam usar pelo menos este tipo de autenticação. Aqui é usado um hash MD5 em um mecanismo de desafio/resposta;

  • DIGEST-MD5: mecanismo novo, provavelmente será obrigatório para novas versões de alguns protocolos. Aqui é implementada a última versão da especificação SASL-DIGEST-MD5, baseada na autenticação tipo DIGEST para HTTP;

  • PLAIN: a senha trafega em texto claro e é o único mecanismo onde uma cópia da senha do usuário é efetivamente enviada para o servidor. Deve ser usado em conjunto com criptografia para proteger a senha.

  • GSS-API: utiliza KERBEROS 5 para a autenticação. Opcionalmente pode criptografar a sessão também.

Estes mecanismos podem ser divididos em dois grupos: aquele onde o servidor possui uma cópia da senha do usuário (o chamado shared secret) e aquele onde o servidor possui apenas um hash da senha do usuário, ou nem possui a senha localmente (usado por PLAIN). Ironicamente, os mecanismos shared secret são os que oferecem a chamada autenticação forte, embora a senha dos usuários seja armazenada sem criptografia (com exceção do GSS-API).

Para saber quais são os mecanismos de autenticação SASL suportados por um servidor LDAP, execute:

# ldapsearch -h host -x -b ¨¨ -s base supportedSASLMechanisms

O mecanismo PLAIN

O mecanismo PLAIN não é um mecanismo de autenticação seguro por si só, pois a senha do usuário é transmitida sem qualquer proteção. Por isso é necessário o auxílio de criptografia. Por outro lado, este mecanismo na forma como é implementado aqui é bastante flexível em termos da forma como ele autentica o usuário, ou seja, de onde ele pega a senha:

passwd: a senha é obtida através da chamada getpwnam(), que normalmente consulta o arquivo /etc/passwd. Este mecanismo não funciona se shadow passwords estiverem em uso;

shadow: semelhante a passwd, mas a senha é obtida de /etc/shadow. Aqui pode surgir um problema, pois este arquivo de senhas só pode ser lido pelo superusuário. Hoje em dia é comum que serviços rodem como usuários não privilegiados para aumentar a segurança do sistema. Estes serviços não conseguirão autenticar usuários usando /etc/shadow a não ser que voltem a rodar como superusuário. Uma outra saída é usar, por exemplo, outras permissões para o arquivo /etc/shadow de forma que o servidor slapd consiga lê-lo.

pam: também é possível usar PAM para autenticar usuários. Esta opção é bastante flexível, pois a autenticação pode acabar sendo feita por qualquer método suportado pela biblioteca PAM. No entanto, dependendo do método, pode-se incorrer no mesmo problema do /etc/shadow: o serviço precisa rodar como superusuário. Por exemplo, se PAM estiver configurado para autenticar usuários localmente através do /etc/shadow, o servidor que estiver usando SASL terá que rodar como superusuário.

sasldb: este mecanismo é na verdade um mecanismo de senhas compartilhadas, mas também pode ser usado em conjunto com PLAIN. Utiliza uma base de senhas em /etc/sasldb2, a mesma dos mecanismos de senhas compartilhadas.

Há outros métodos que não foram mostrados aqui. Para mais detalhes, consulte a documentação da biblioteca SASL em /usr/share/doc/sasl-docs-versão.

Mecanismos de Senhas Compartilhadas

A biblioteca SASL da Cyrus suporta dois mecanismos de senhas compartilhadas: CRAM-MD5 e seu sucessor, DIGEST-MD5. Estes mecanismos necessitam de que o cliente e o servidor compartilhem um segredo, que é a própria senha. O servidor gera um desafio baseado nessa senha e o cliente prova o conhecimento da mesma senha se conseguir responder corretamente ao desafio.

Note que em nenhum momento a senha é enviada do cliente para o servidor e vice-versa, por isso esses mecanismos são considerados muito mais seguros. Mas, para isso funcionar, o servidor precisa conhecer a senha, a senha mesmo, e não um hash dela ou uma versão criptografada. Ou seja, se o arquivo de senhas SASL do servidor for comprometido, todas as senhas serão imediatamente conhecidas pelo atacante, não sendo necessário nenhum ataque do tipo dicionário ou força bruta como seria o caso com um /etc/shadow comprometido.

Nota: As senhas utilizadas nestes mecanismos ficam no arquivo /etc/sasldb2. É de fundamental importância que este arquivo seja protegido. Não deve ser permitido o acesso de usuários da máquina a este arquivo, pois isso comprometeria imediatamente todas as senhas SASL usadas neste servidor.

A proteção deste arquivo reflete de volta ao problema do /etc/shadow ilustrado anteriormente. Para que a aplicação possa efetivamente autenticar o usuário, ela precisa ter acesso a este arquivo. Ou seja, se o arquivo tiver permissões tais que apenas o usuário root pode ler seu conteúdo, então a aplicação que está autenticando o usuário também precisa rodar como root.

Uma alternativa é dar permissões 640, donos root.sasl ao arquivo e colocar os usuários sob os quais as aplicações rodam dentro do grupo "sasl" caso elas já não rodem como root (sendmail, por exemplo, roda como root, portanto não teria problemas nessa autenticação, mas outros serviços, como o próprio OpenLDAP, podem rodar como um usuário não-privilegiado). Os segredos no arquivo /etc/sasldb2 podem ser gerenciados com as ferramentas /usr/sbin/saslpasswd2 e /usr/sbin/sasldblistusers2.

Qual Mecanismo de Autenticação Usar?

Tanto a autenticação simples como a que usa SASL podem ser usados com o servidor OpenLDAP-2.1.x. Algumas considerações importantes:

  • autenticação simples e SASL PLAIN precisam ser protegidas por uma camada de criptografia. Do contrário as senhas poderão ser capturadas em trânsito;

  • mecanismos SASL de segredos compartilhados são bastante avançados e não precisam de criptografia adicional para proteger a autenticação propriamente dita;

  • nos mecanismos SASL compartilhados (e no "sasldb" do mecanismo PLAIN), as senhas ficam armazenadas em /etc/sasldb2, sem qualquer criptografia. Se o arquivo for comprometido, as senhas o serão também;

  • nem todos os aplicativos clientes suportam SASL, mas criptografia na camada de transporte (TLS) já é suportado por diversos aplicativos.

Neste guia não será usado SASL, mas sim a autenticação simples protegida por SSL. SASL é, atualmente, mais complexo de gerenciar e não é suportado ainda pelos clientes que serão usados aqui, como gq, pam_ldap e Netscape®. Mas esses clientes todos já suportam TLS/SSL, o que contorna o problema da autenticação simples.

Por outro lado, SASL é importante para autenticar o próprio administrador do diretório (já que essa senha usualmente sempre ficava armazenada no arquivo /etc/openldap/slapd.conf), ou mesmo para autenticar os servidores slave usados na replicação da base de dados LDAP.

Implementação

Pré-requisitos

Para executar a configuração sugerida por este guia para a implementação de um servidor LDAP, é necessário verificar os seguintes requisitos:

  • É importante, mas não obrigatório, que o Netscape Communicator® esteja instalado, para a execução de testes.

  • Levantamento dos dados que serão armazenados no servidor: verificação da necessidade de replicação de dados, definição da hierarquia de servidores, entre outros necessários antes de instalar o servidor.

Instalação

Para instalação do servidor LDAP, será utilizado o OpenLDAP. Execute o Synaptic e selecione os seguintes pacotes para a instalação:

  • openldap

  • openldap-server

  • openldap-client

  • nss_ldap

  • pam_ldap

  • migrationtools-common

  • migrationtools-offline

ou utilize o comando apt-get:

# apt-get install openldap openldap-server openldap-client
# apt-get install migrationtools-offline
# apt-get install nss_ldap pam_ldap

Configuração do Servidor

  1. Edite o arquivo /etc/openldap/slapd.conf e modifique as seguintes opções:

    suffix "o=minhaorganizacao, c=br"

    rootdn "cn=manager, o=minhaorganizacao, c=br"

    rootpw minha-senha

    ...

    # For Netscape Roaming support, each user gets a roaming
    # profile for which they have write access to
    access to dn=".*,ou=Roaming,o=minhaorganizacao,c=br"
    by dnattr=owner write

    # The userPassword by default can be changed by the
    # entry owning it if they are authenticated.
    # Others should not be able to see it, except the
    # admin entry below
    access to attr=userPassword
    by dn="cn=manager,o=minhaorganizacao,c=br" write
    by anonymous auth
    by self write
    by * none

    # Full rights to the admin
    access to *
    by dn="cn=manager,o=minhaorganizacao,c=br" write
    by * read


    suffix: a raiz, a base do seu Diretório.

    rootdn: o login do administrador.

    rootpw: a senha do administrador; pode ser colocada criptografada. Consulte a página de manual do slapd.conf (man slapd.conf) para mais informações.

    Os três últimos blocos definem Controles de Acesso a características e permissões para o servidor LDAP.

As outras opções já estão configuradas com os valores padrão.

Habilitando LDAPS://

Para habilitar LDAPS:// (LDAP sobre SSL na porta 636 para clientes que não suportam START-TLS), basta acrescentar a opção -h "ldaps:///" na chamada ao servidor LDAP. Para fazer isso, deve-se editar o arquivo localizado em /etc/sysconfig/ldap. Abaixo este arquivo está reproduzido:

# configuration file for the ldap startup script

# change to "yes" if you want the ldap server (slapd) to
# also listen on the ldaps (636) port. Otherwise, encryption
# will only be possible via START-TLS
LDAPS=no

# You may define an user and group here if you want to. The ldap
# server will then be started using the user and group specified
# here. Be aware that you will also have to change permissions
# on the database if you use this! And some authentication methods,
# specially those using SASL, may fail if they can't access
# /etc/shadow or something like that. You may want to check
# the use of SASL's pwcheck method in that case.
USER=ldap
GROUP=ldap

Se o parâmetro LDAPS for trocado para yes, o servidor LDAP, após ser reiniciado, irá também escutar na porta 636 (a porta reservada para ldaps). Trocando para no, o servidor irá atender apenas na porta 389 (e sessões criptografadas apenas estarão disponíveis para clientes que suportarem START-TLS).

Neste arquivo de configuração também é possível trocar o usuário sob o qual o servidor é executado. Por padrão, o servidor roda como usuário ldap e grupo ldap e o pacote está ajustado para rodar como estes usuários. Se, no entanto, o administrador tiver outro usuário para esta função, ou desejar rodar o serviço como root, basta trocar estas linhas. Para rodar o serviço como superusuário, basta comentar ambas as linhas (USER e GROUP).

Note que ainda é necessária a instalação do certificado e da chave privada no servidor LDAP. Consulte a documentação do slapd.conf para mais informações.

Configurando Alguns Clientes

Agora deve-se configurar alguns clientes para usarem SSL ao se conectarem ao servidor LDAP. Pacotes como nss_ldap e pam_ldap já virão configurados para usarem START-TLS, mas, a exemplo do que foi feito na configuração do servidor, porém será mostrado aqui como isso foi feito.

Os programas cliente do pacote openldap-client utilizam um arquivo de configuração global chamado ldap.conf localizado em /etc/openldap/.

Nota: Não confunda o arquivo ldap.conf, do servidor LDAP, mencionado no parágrafo anterior com o arquivo de configuração do módulo pam, que é /etc/ldap.conf.

Há basicamente duas opções que precisam ser configuradas: uso ou não de SASL e uso ou não de SSL. Será usado como exemplo o programa ldapsearch, utilizado para fazer pesquisas em um servidor LDAP. Os dois parâmetros utilizados serão:

-x: utilizar autenticação simples, ou seja, não utilizar SASL. Isso requer que criptografia seja usada, pois a senha é transmitida em texto claro. Para isso serve o próximo parâmetro;

-Z[Z]: utilizar START-TLS. Com apenas um Z (-Z), o cliente tentará usar START-TLS se esta opção estiver disponível no servidor; caso contrário, usará uma conexão não criptografada comum. Com um segundo Z (-ZZ), o uso de START-TLS é obrigatório e a conexão será encerrada se esta opção não estiver disponível no servidor. É fortemente recomendado que sempre se use -ZZ, portanto.

Ainda é possível usar LDAPS:// em vez de START-TLS, usando -H ldaps:///.

nss_ldap e pam_ldap

Mais adiante neste manual, o leitor verá como usar LDAP para autenticar seus usuários, e então nss_ldap e pam_ldap serão mencionados. Por padrão, o uso de START-TLS já é habilitado nestes pacotes. A configuração necessária para isso é apenas uma linha em /etc/ldap.conf:

ssl start_tls

Alternativamente, LDAPS também pode ser usado. Para isso, coloque:

ssl on

Para desabilitar SSL ou START-TLS, use:

ssl off

Note que as duas opções não podem ser usadas ao mesmo tempo: é uma ou outra.

Criando o Diretório LDAP

Edite o arquivo /usr/share/openldap/migration/migrate_common.ph:

$DEFAULT_MAIL_DOMAIN = "minhaorganizacao.com.br";

$DEFAULT_BASE = "o=minhaorganizacao,c=br";

$EXTENDED_SCHEMA = 0;

O valor padrão para o campo $EXTENDED_SCHEMA é zero. Se for modificado para 1, irá ativar o suporte a outras classes de objetos, como person, por exemplo.

Executando o Script migrate_all_offline.sh

Este script irá pesquisar vários arquivos do diretório /etc e criar as entradas no seu Diretório. Note que o último comando é utilizado para deixar os arquivos do diretório com usuário e grupo ldap.

# cd /usr/share/openldap/migration/
# ./migrate_all_offline.sh
Creating naming context entries...
Migrating aliases...
Migrating groups...
Migrating hosts...
Migrating networks...
Migrating users...
Migrating protocols...
Migrating rpcs...
Migrating netgroups...
Importing into LDAP...
Migrating netgroups (by user)...
Migrating netgroups (by host)...
Preparing LDAP database...
# chown ldap.ldap /var/lib/openldap-data/*

Nota: Esta ação irá migrar apenas os usuários com UID entre 500 e 65533.

Editando o Arquivo /etc/openldap/ldap.conf

BASE o=minhaorganizacao,c=br
URI ldap://servidor.ldap.minhaorganizacao
Atenção

Se o servidor LDAP estiver utilizando SSL, é imprescindível que a opção URI descrita acima seja substituída pelo nome da máquina onde esteja o servidor. Isto porque o LDAP irá utilizar o comando hostname para identificar o servidor, e se esta opção estiver preenchida com localhost, não será possível completar a autenticação.

Use ldaps:// acima, se estiver usando LDAPS (porta 636, portanto).

Para iniciar o servidor LDAP, digite:

# service ldap start

O OpenLDAP é ligado com a biblioteca TCP/Wrappers. Por este motivo o controle de acesso pode ser feito através dos arquivos /etc/hosts.allow e /etc/hosts.deny, além do recurso de ACLs do próprio OpenLDAP. Utilize estes arquivos para controlar as máquinas que irão acessar o servidor LDAP. Para acessar através do próprio servidor, caso o arquivo /etc/hosts.deny esteja com o parâmetro ALL:ALL, insira no /etc/hosts.allow a linha

ALL: localhost
.

Testando a configuração

Abra um terminal e utilize os seguintes comandos:

  • para verificar tudo que existe no Diretório:

    $ ldapsearch "objectclass=*" -x 
    version: 2

    #
    # filter: objectclass=*
    # requesting: ALL
    #

    # minhaorganizacao, br
    dn: o=minhaorganizacao,c=br
    dc: minhaorganizacao
    objectClass: top
    objectClass: domain

    # People, minhaorganizacao, br
    dn: ou=People,o=minhaorganizacao,c=br
    ou: People
    objectClass: top
    objectClass: organizationalUnit

    ...
  • para verificar se os usuários foram inseridos:

    $ ldapsearch uid=usuario -x
    version: 2

    #
    # filter: uid=usuario
    # requesting: ALL

    # usuario, People, minhaorganizacao, br
    dn: uid=usuario,ou=People,o=minhaorganizacao,c=br
    uid: usuario
    cn: usuario
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    shadowLastChange: 11725
    shadowMax: 99999
    shadowWarning: 7
    loginShell: /bin/bash
    uidNumber: 501
    gidNumber: 501
    homeDirectory: /home/usuario

    # numResponses: 2
    # numEntries: 1
  • para verificar se as senhas foram inseridas usando a senha do administrador do Diretório:

    $ ldapsearch -D cn=manager,o=minhaorganizacao,c=BR \
    -W uid=usuario -x -ZZ
    Enter LDAP Password:
    version: 2

    #
    # filter: uid=usuario
    # requesting: ALL
    #

    # usuario, People, minhaorganizacao, br
    uid=usuario,ou=People,o=minhaorganizacao,c=br
    uid=usuario
    cn=usuario
    sn=usuario
    mail=usuario@minhaorganizacao.com.br
    objectclass=person
    objectclass=organizationalPerson
    objectclass=inetOrgPerson
    objectclass=account
    objectclass=posixAccount
    objectclass=top
    objectclass=kerberosSecurityObject
    userpassword={crypt}VazDY6ytbW/YI
    krbname=usuario@MINHAORGANIZACAO.COM.BR
    loginshell=/bin/bash
    uidnumber=500
    gidnumber=500
    homedirectory=/home/usuario

    # numResponses: 2
    # numEntries: 1

    De acordo com as ACLs, o administrador sempre tem acesso a todos os atributos.

  • para verificar a senha do seu usuário usando sua própria senha:

    $ ldapsearch -D uid=usuario,ou=people,o=minhaorganizacao,c=br \
    -W uid=usuario -x -ZZ
    Enter LDAP Password:
    version: 2

    #
    # filter: uid=usuario
    # requesting: ALL
    #

    # usuario, People, minhaorganizacao, br
    uid=usuario,ou=People,o=minhaorganizacao,c=br
    uid=usuario
    cn=usuario
    sn=usuario
    mail=usuario@minhaorganizacao.com.br
    objectclass=person
    objectclass=organizationalPerson
    objectclass=inetOrgPerson
    objectclass=account
    objectclass=posixAccount
    objectclass=top
    objectclass=kerberosSecurityObject
    userpassword={crypt}VazDY6ytbW/YI
    krbname=usuario@MINHAORGANIZACAO.COM.BR
    loginshell=/bin/bash
    uidnumber=500
    gidnumber=500
    homedirectory=/home/usuario

    # numResponses: 2
    # numEntries: 1

    Note que as ACLSs deverão estar elaboradas de tal forma, que o atributo userpassword possa ser lido somente pelo próprio usuário e pelo usuário root.

Configurando o Netscape Communicator

Quando se trabalha com servidores LDAP, é comum existir uma limitação para a quantidade máxima de respostas retornadas pelo servidor. Esta limitação existe sempre no servidor, mas pode existir também no cliente, como no caso do Netscape.

Entre no ambiente gráfico com o seu login de usuário, execute o Netscape Communicator e faça as seguintes configurações:

  1. No Livro de Endereços (Alt - Shift - 2) clique em Arquivo -> Diretório Novo...; surgirá a janela Informação do Diretório (Figura 5-4). Basta preencher esta janela da seguinte maneira:

    Figura 5-4. Informações do Diretório

  2. No campo Diretórios, selecione o Diretório que você adicionou, efetue uma pesquisa de todos os usuários que existem no Diretório digitando no campo digite o nome que está procurando um * seguido de um Enter. Você deverá visualizar todos os usuários encontrados no diretório. Será possível ver aqui também os usuários administrativos, como bin, daemon, etc. Eles podem ser removidos do Diretório.

  3. Configure o correio do Netscape para utilizar o endereçamento de mensagens através do servidor de Diretório.

    Em Editar -> Preferências, clique na seta para expandir a categoria Correio e Notícias e selecione a subcategoria Endereçamento.

    Habilite a opção Servidor de Diretório: e selecione o servidor que você adicionou (no exemplo: minhaorganização.com.br).

  4. Sempre que for enviar uma mensagem bastará colocar um dado qualquer, ou apenas parte dele, de um usuário existente no Diretório. O Netscape se encarregará de preencher o restante. Caso exista mais de uma entrada, ele mostrará a lista de usuários encontrados, para você selecionar o usuário desejado.

É importante informar que a opção Seguro, contida na Figura 5-4, pode ser usada se ldaps estiver habilitada no servidor (ver /etc/sysconfig/ldap) e o certificado já tiver sido importado pelo Netscape® (caso não seja de uma CA reconhecida);. Se isto ainda não ocorreu, basta acessar o endereço https://localhost:636 e ir respondendo as perguntas.

Acessando o Servidor LDAP por URLs

Também é possível usar o Netscape Communicator para se comunicar com um servidor LDAP através do navegador. A sintaxe é a seguinte:

ldap[s]://<maq><:porta>/<base>?<atrib>?<escopo>?<Filtro>

O [s] é usado quando se tem uma conexão segura (SSL). Veja exemplos de algumas utilizações de URLs do Netscape® para o LDAP:

  • ldap://localhost/o=minhaorganizacao,c=br??sub?

    Isto retornará do servidor cada registro do banco de dados. Veja a Figura 5-5:

Figura 5-5. Informações do Diretório Através do Navegador

  • ldap://localhost/o=minhaorganizacao,c=br?cn,mail?sub?

    Isto irá retornar apenas os objetos (pessoas), nome e endereço de correio eletrônico para cada pessoa do banco de dados.

  • ldap://localhost/o=minhaorganizacao,c=br??sub?(cn=maria)

    Retornará apenas o registro maria.

  • ldap://localhost/o=minhaorganizacao,c=br??sub?(cn=maria*)

    Trará para você qualquer registro em que o nome inicie com maria.

  • ldap://localhost/o=minhaorganizacao,c=br??sub?(sn=silva)

    Isto lhe dará todos os registros que tenham o sobrenome silva.

NSS com o LDAP

Seu servidor LDAP pode autenticar usuários, usando um mecanismo chamado PAM[6] (Módulos de Autenticação Plugáveis). Desde o princípio do Linux, a autenticação de um usuário foi feita através da entrada de uma senha pelo usuário, e o sistema verificando se a senha digitada corresponde à senha oficial criptografada, que fica armazenada no arquivo /etc/passwd. Isto foi apenas no início. Desde então, um número de novos caminhos para a autenticação de usuários vem se tornando popular, incluindo substituições mais complicadas, como por exemplo para o arquivo /etc/passwd e dispositivos de hardware chamados de Smart Cards.

O problema é que a cada vez que um novo esquema de autenticação é desenvolvido, requer que todos os programas necessários (login, ftpd, etc.) sejam reescritos para suportar este novo esquema. O PAM fornece um caminho para desenvolver programas que são independentes do esquema de autenticação. Estes programas precisam de módulos de autenticação, anexados a eles em tempo de execução, para que possam funcionar.

A seguir será visto como configurar o seu sistema para fazer a autenticação via LDAP.

No diretório /usr/share/doc/pam_ldap-XX, onde XX é a versão do módulo instalado, você encontrará o diretório pam.d.conectiva que é a recomendação da Conectiva para o conteúdo do diretório /etc/pam.d. Faça um backup do seu diretório /etc/pam.d original e copie o novo diretório recomendado para o mesmo local:

# mv /etc/pam.d /etc/pam.d.org 
# cp -R /usr/share/doc/pam_ldapXX/pam.d.conectiva /etc/pam.d

Edite o arquivo /etc/ldap.conf e altere as linhas HOST e BASE como já foi feito para o arquivo /etc/openldap/ldap.conf. Altere também o arquivo /etc/nsswitch.conf para o seguinte conteúdo:

passwd:     files ldap nis nisplus
shadow: files ldap nis nisplus
group: files ldap nis nisplus

Para testar a autenticação e o NSS, faça uma cópia do seu /etc/passwd:

# cp /etc/passwd /etc/passwd.org

Remova deste arquivo um usuário com o comando userdel nome-do-usuário, para ter certeza de que ele não será encontrado no /etc/passwd. Em seguida, experimente:

$ id  usuario_removido

Será possível visualizar o nome do usuário. Experimente também acessar o Conectiva Linux com o usuário que havia no arquivo /etc/passwd.

Nota: Se não for utilizar LDAP para autenticação, não esqueça de recuperar o seu /etc/passwd original para continuar com o uso do sistema:

# mv /etc/passwd.org /etc/passwd

Ferramentas Gráficas para o LDAP

Além do Netscape existem outras ferramentas LDAP que podem ser usadas no ambiente gráfico. Pesquisas, visualização e até mesmo manutenções na base de dados podem ser feitas através destes programas.

O Cliente de LDAP GQ

O GQ é um cliente LDAP para o ambiente X, com uma interface simples escrito para o Gnome, sendo possível executá-lo em outros gerenciadores de janela também. Instale-o utilizando o Synaptic e selecionando o pacote gq para a instalação.

Como usuário normal, inicialize o programa com o comando gq. Sua configuração também é simples, bastando adicionar o servidor LDAP que você gostaria de usar, e a Base DN do diretório. Um recurso interessante deste aplicativo é o modo de navegação, sendo possível observar o diretório em árvore e ter uma visão completa de todos os dados do diretório.

$ gq

Para adicionar uma base, dirija-se ao menu File -> Preferences e selecione a aba Servers, pressionando o botão New para adicionar as configurações sobre o servidor LDAP.

Você já pode efetuar consultas. Vá para a aba Search, na janela principal, e proceda sua busca, selecionando o servidor. Em seguida, clique em Find, e o gq irá fazer a busca no servidor, mostrando os dados em caso de sucesso, ou mostrando uma mensagem No entries found caso os dados não estejam no servidor.

Veja na Figura 5-6 um exemplo de conexão:

Figura 5-6. Buscas com o Cliente de LDAP GQ

Em seguida, serão mostradas as informações sobre o usuário teste.

Referências

  • Documento sobre LDAP .

  • Página oficial da Comunidade de desenvolvimento do OpenLDAP, incluindo um Guia para o administrador, em inglês .

  • Documento Como-Fazer que mostra a integração do LDAP com outras ferramentas, como por exemplo Radius, PAM e NSS .

NIS

Um dos principais objetivos em uma rede local é fornecer para os usuários um ambiente que torne a rede transparente. Um importante passo é manter dados importantes, como informações de todas as contas de usuários na rede sincronizadas em todas as máquinas, pois isto permite ao usuário mover-se de uma máquina para outra sem o inconveniente de ter que se lembrar de diferentes senhas, ou copiar dados de uma máquina para outra.

Esse é o principal objetivo do serviço NIS (Network Information Service ou Serviço de Informação de Rede). A informação administrativa que é armazenada no servidor não precisa ser duplicada, e assim é possível medir a consistência dos dados, aumentar a flexibilidade para os usuários e também tornar a vida do administrador do sistema muito mais fácil através da manutenção de uma única cópia da informação requerida.

Sendo este o seu principal propósito, o servidor deve conter uma quantidade considerável de informações disponíveis na rede local, sendo que estas poderão ser:

Se, por exemplo, uma entrada contendo uma senha é gravada em uma base de dados NIS, o usuário será capaz de acessar qualquer máquina da rede que contenha os programas-cliente do NIS que estão sendo executados, como se fosse sua própria máquina.

NIS é baseado em RPC (Remote Procedure Call ou Chamada de Procedimento Remoto), e é composto basicamente do servidor, que armazena as informações do cliente, que acessa o servidor, e de várias ferramentas administrativas. Originalmente, NIS era chamado de YP (Yellow Pages ou Páginas Amarelas), que ainda é utilizado para referenciá-lo. Infelizmente, "páginas amarelas" é uma marca registrada da British Telecom™, e portanto a Sun®, desenvolvedora do NIS, descartou este nome. Entretanto, estes nomes são utilizados nos comandos e pacotes utilizados para a configuração do servidor, tais como ypserv e ypbind.

O NIS mantém as informações da base de dados em arquivos chamados mapas, que contêm pares formados por chave-valor. Um exemplo deste par é o nome de usuário mais a senha de acesso criptografada. Os mapas são armazenados em uma máquina que está executando o NIS, da qual os clientes podem recuperar as informações através de chamadas RPC.

Os mapas são gerados usualmente a partir dos arquivos "mestre", tais como /etc/hosts ou /etc/passwd. Para alguns arquivos são criados vários tipos de mapas, cada um para um tipo de chave de procura. Por exemplo, um cliente pode buscar o nome de uma certa máquina tanto pelo nome da máquina como pelo seu endereço IP. Em conseqüência, dois mapas são derivados: hosts.byname e hosts.byaddr.

Existem dois tipos de servidores: servidores mestre e escravo. Um servidor mestre é uma máquina exclusiva, com um domínio particular, que mantém os mapas autenticados. O mestre executa o servidor ypupdated, que alerta os servidores escravos, pedindo para que eles atualizem suas cópias dos mapas (todas as outras máquinas no domínio devem obter suas informações do servidor mestre, direta ou indiretamente). Os servidores escravos agem como intermediários entre os clientes e o mestre, mantendo réplicas exatas dos mapas contidos no servidor principal. Todas as mudanças de mapas são feitas no mestre, e portanto, as mudanças se propagam do mestre para os servidores escravos. As máquinas cliente, por sua vez, executam o servidor ypbind, que as torna capazes de executar processos para obterem as informações de um servidor. As máquinas cliente não mantêm os mapas, porém, preferivelmente, consultam os servidores para informações sobre o sistema e conta de usuários.

Implementação do serviço de NIS

Pré-requisitos

Para a instalação de um servidor NIS são necessários os seguintes pré-requisitos:

  • sua rede deve estar corretamente configurada e funcional;

  • o serviço portmap deve estar sendo executados no servidor.

Instalação

Para a instalação dos pacotes necessários para um servidor NIS, execute o Synaptic e instale os seguintes pacotes:

  • ypserv

  • ypbind

  • yp-tools

  • linuxconf-nisconf

Para as máquinas cliente são suficientes os pacotes:

  • ypbind

  • yp-tools

  • linuxconf-nisconf

ou utilize o apt-get para a instalação:

# apt-get install yp.* linuxconf-nisconf

Configuração

Esta seção refere-se à configuração de um servidor e das máquinas clientes. Se você estiver interessado em montar um servidor mestre e outros servidores escravos, procure na documentação indicada na seção Referências.

Após a instalação dos pacotes, deve-se primeiramente verificar se o nome do servidor NIS está correto. Para isso, basta executar o comando nisdomainname e verificar o resultado. É importante observar que o domínio NIS não está relacionado de nenhuma forma com o domínio DNS, mesmo que na maioria das vezes o nome de domínio seja o mesmo.

# nisdomainname
minhaorganizacao.

É importante verificar o ponto após o domínio. Se algo estiver incorreto, basta executar nisdomainname [dominio_correto].

O próximo passo é incluir a máquina que deverá ser o servidor. Para isso, execute o seguinte comando:

# /usr/lib/yp/ypinit -m

At this point, we have to construct a list of the hosts which
will run NIS servers. kepler in the list of NIS server hosts.
Please continue to add the names for the other hosts, one per
line. When you are done with the list, type a
<control D>.
next host to add: kepler
next host to add:

# Digite aqui o Control-d

The current line of NIS servers looks like this:

kepler.minhaorganizacao

# Pressione y (sim) na próxima linha, se
# tudo estiver correto

Is this correct? [y/n: y] y
We need some minutes to build the databases...
Building /var/yp/servidor./ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/servidor.'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
...

kepler has been set up as a NIS master server.

Este comando irá gerar a base de dados do NIS e incluir as informações para que as máquinas da rede possam acessar o servidor.

Após estas configurações execute o Linuxconf e inicialize o serviço principal do servidor (ypserv) e o servidor de senhas (yppasswdd). Isto pode ser feito no menu Controle -> Painel de Controle -> Controle de atividade dos serviços.

As máquinas cliente podem ser configuradas através do Linuxconf em Configuração -> Rede -> Tarefas de Cliente -> Network Information System (NIS) (que atualiza o arquivo /etc/yp.conf). Veja a Figura 5-7:

Figura 5-7. Configuração de um Cliente NIS pelo Linuxconf

Você deve preencher o primeiro campo com o domínio do servidor e o segundo campo com o nome do servidor (ou seu endereço IP). A terceira opção não precisa ser assinalada, já que uma máquina cliente não pode atualizar a base de dados do NIS.

Para garantir controle de acesso, pode-se também configurar, no servidor, o arquivo /etc/ypserv.conf, que contém uma lista de regras e máquinas, úteis para a segurança do sistema. Uma linha do arquivo pode ser composta por uma opção, contendo o seguinte formato:

opção: [sim|não]

ou, uma linha pode ser uma regra de acesso:

host: mapa: segurança: campo_seguro

os possíveis valores do campo campo_seguro podem ser yes ou no. Se o campo for habilitado, será testada a segurança do campo, ou seja, o campo será substituído por um "x" se a verificação da porta revelar que existe uma requisição que não possua os privilégios necessários.

Veja um exemplo simples deste arquivo:

# Some options for ypserv. This things are all not 
# needed, if you have a Linux net.
dns: no

# The following, when uncommented, will give you shadow
# like passwords.
# Note that it will not work if you have slave NIS
# servers in your network that do not run the same
# server as you.

# Host : Map : Security : Passwd_mangle
#
* : passwd.byname : port : yes
* : passwd.byuid : port : yes

...

* : shadow.byname : port : yes
* : passwd.adjunct.byname : port : yes

As primeiras opções não são necessárias em uma rede Linux. Em seguida, são mostradas as regras de acesso, indicando as máquinas (hosts) que possuem acesso às regras e mapas (neste caso, todas as máquinas - "*"). Os mapas devem ser indicados (por exemplo, o primeiro mapa indica a busca de senhas pelo nome) seguidos pelo meio de segurança; existem as seguintes opções de segurança:

none: sem restrições ao mapa indicado.

port: permite acesso somente se a requisição vem de uma porta menor que 1024.

deny: não permite acesso algum ao mapa indicado.

des: necessita de uma autenticação DES (ainda não implementada).

Por fim, o último campo indica qual campo será monitorado (neste caso, o campo de senha). Se for colocada a opção no, este campo não será monitorado.

Nota: As regras de acesso para determinados mapas não garantem um aumento real de segurança, mas dificultam o trabalho de um possível invasor. Veja as páginas de manual para mais detalhes (man ypserv.conf e man ypbind).

Um outro modo de restringir o acesso aos usuários em seu servidor NIS é através do arquivo /etc/passwd. Primeiro, deve-se configurar o servidor como uma máquina cliente (veja logo a seguir) e adicionar as linhas iniciadas com o sinal "+" no meio do arquivo, antes de listar os usuários. Veja o exemplo:

root:x:0:0:root:/root:/bin/bash
daemon:*:1:1:daemon:/usr/sbin:
bin:*:2:2:bin:/bin:
sys:*:3:3:sys:/dev:
sync:*:4:100:sync:/bin:/bin/sync
man:*:6:100:man:/var/catman:
lp:*:7:7:lp:/var/spool/lpd:
mail:*:8:8:mail:/var/spool/mail:
uucp:*:10:50:uucp:/var/spool/uucp:
...
+ana::::::
+marcio::::::
+:*:::::
[ Todos os usuários normais após esta linha! ]
ana:x:500:500:ana:/home/ana:/bin/bash
marcio:x:501:501:marcio:/home/marcio:/bin/bash

O sistema irá ignorar todas as entradas marcadas, e irá buscá-las no servidor. Esse é um meio de se garantir integridade e segurança.

Um meio mais rápido e eficiente de garantir a autenticação de usuários é através do arquivo /var/yp/securenets. Ele define acessos diretos de clientes NIS ao servidor. O arquivo contém pares de máscara_rede/end_IP. Se a máquina cliente estiver na mesma rede que o servidor, pode-se colocar a palavra host ou a máscara 255.255.255.255. Veja o exemplo:

# Always allow access for localhost
255.0.0.0 127.0.0.0

# This line gives access to everybody. PLEASE ADJUST!
host 10.0.2.62
host 10.0.2.85

Testes de Configuração

Após as configurações, você pode fazer os seguintes testes:

  • Configure o servidor como uma máquina cliente, e execute o serviço ypbind. Se ele achar o servidor, a configuração estará correta.

  • Configure uma máquina cliente qualquer e execute o serviço ypbind. Faça com que este serviço se torne automático, assinalando esta opção no Linuxconf. Reinicialize o cliente. Tente acessar a máquina com um outro usuário que esteja autenticado no servidor NIS, mas que anteriormente não tinha uma conta de acesso na máquina. Se o acesso foi permitido, a configuração está correta.

Radius/Portslave

Apresentação

Para garantir um sistema ainda mais seguro existem opções de hardware e protocolos que podem oferecer autenticação, autorização e configuração das informações entre um servidor de acesso, que deseja autenticar as conexões e requisições, e um servidor de autenticação.

O Radius[7] é um protocolo de autenticação de usuários que permite uma maior segurança aos acessos remotos ao seu sistema. Quando um usuário tenta acessar o sistema, um servidor de acesso faz uma requisição ao servidor de autenticação para que este valide a tentativa de acesso, retornando o resultado ao servidor de acesso. Isso permite a centralização do processo de autenticação, já que pode-se ter diversos servidores de acesso usando um único servidor de autenticação central.

Portslave é um software que emula o Livingstone Portmaster II. Ele é necessário para a utilização do servidor de acesso. Na verdade, o Portslave atua como um cliente Radius, sendo utilizado para criar conexões dial-up aos servidores de acesso. Ele utiliza o protocolo Radius para autenticar um servidor remoto que contenha as informações sobre a conta do usuário. Basicamente, ele serve para criar a conexão PPP, mas também pode ser utilizado com outros protocolos e serviços.

Portanto, o Radius simplesmente permite que os acessos sejam autenticados de um servidor central (ou servidor Radius[8]), sem a necessidade de manter as informações sobre as contas dos usuários em várias máquinas. O Portslave pode "escutar a linha" e agir como um cliente Radius, tanto para autenticação como para outros serviços como Telnet e shell seguro (SSH).

Implementação

Pré-requisitos

São necessários os seguintes pré-requisitos para a implementação deste serviço:

  • no mínimo 1 (um) modem;

  • opcionalmente uma placa multiserial para permitir um maior número de conexões;

  • o servidor pppd corretamente configurado para aceitar conexões.

Instalação

Execute o Synaptic e instale os seguintes pacotes necessários para um servidor de autenticação com Radius e Portslave:

  • radiusd-cistron

  • portslave

  • linuxconf-radiusconf

ou utilize o apt-get para a instalação:

# apt-get install radiusd-cistron portslave 
# apt-get install linuxconf-radiusconf

Configuração

Primeiramente, será feita a configuração do Radius, e para isso execute o Linuxconf e dirija-se ao menu Configuração -> Rede -> Tarefas de servidor -> Configurador Radius. Esta configuração é dividida em três partes:

Clientes

Acesse a opção Clientes. Ela contém uma lista de clientes que possuem permissões para fazer requisições, juntamente com suas chaves de criptografia. Portanto, clique em Adicionar para incluir as máquinas e suas chaves, como mostrado na Figura 5-8.

Figura 5-8. Configuração de Clientes para o Radius

Basta completar o primeiro campo com o nome do servidor de acesso que pode fazer uma requisição (opção Nome da máquina (ou IP)) mais a chave que deve ser utilizada para decriptografar as requisições (Chave de criptografia). No exemplo anterior o servidor Radius da empresa hipotética Minhaorganizacao Ltda. centraliza a autenticação em um servidor que faz a autenticação para um servidor de acesso chamado kepler. Nada impede que existam outros servidores de acesso, e neste caso, cada um destes servidores deve utilizar uma chave própria para criptografar suas requisições ao servidor.

Lista NAS

A segunda opção que deve ser configurada é a opção Lista NAS (Network Access Servers). Deve-se clicar em Adicionar para acrescentar uma lista. Esta opção contém uma lista de servidores de acesso conhecidos, e possui o seguinte formato:

Nome da Máquina (ou IP): é o nome do servidor de acesso.

Nome abreviado: é um apelido utilizado para identificar o servidor em arquivos de registro.

Tipo: identifica o tipo de servidor de acesso. Existe uma lista de tipos, sendo que portslave é o tipo escolhido por padrão.

Para configurar um servidor de acesso clique em Adicionar. Veja a Figura 5-9, que mostra esta tela:

Figura 5-9. Configuração de Servidores Terminais para o Radius

Usuários

Esta opção define como o servidor Radius irá autenticar os usuários. No exemplo, será usado o próprio arquivo de senhas do Conectiva Linux para autenticar usuários, ou seja, os usuários poderão conectar-se remotamente.

Esta opção possui algumas configurações padrão. O botão Ajuda do Linuxconf descreve a maioria dos ítens. Além de autenticar, esta opção também pode definir os usuários que serão autenticados pelo Radius, sendo que a opção DEFAULT do campo Nome de usuário indica se todos os usuários (sejam locais ou não) serão autenticados. Veja a Figura 5-10 que mostra esta tela:

Figura 5-10. Configuração da Autenticação do Radius

Em seguida, execute o servidor Radius (radiusd) no menu Controle -> Painel de Controle -> Controle de atividade de serviços.

O próximo passo é a configuração do Portslave. Para isso, dirija-se ao menu Configuração -> Rede ->Tarefas de Servidor -> Configurador Portslave. Existem duas opções:

Configuração para Ajustes e Padrões

Configuração geral do Portslave. Primeiramente, serão definidas as opções de conexão com o servidor na aba Configurações. Os campos que não estão mostrados são opcionais ou já estão habilitadas por padrão:

Máquina: nome da máquina que está sendo configurada.

Número IP: endereço IP. Se esta opção não for informada, o endereço da máquina será utilizado. Este endereço é utilizado como endereço local de conexões PPP e SLIP.

Login remoto: protocolo padrão de conexão.

Logins locais : se esta opção estiver habilitada, é possível conectar-se localmente colocando um sinal de exclamação antes do nome de usuário. Isto é útil em emergências quando o servidor Radius não está no ar.

Syslog: utiliza um serviço de syslog remoto; basta você colocar o nome da máquina que irá cuidar dos acessos ao sistema. Caso deseje acessar localmente, não marque esta opção.

Stripnames: Caso habilitada, os caracteres iniciais "P", "S", "C", "L" e "!", e as cadeias finais ".slip", ".cslip" e ".ppp" serão tiradas do nome do usuário antes de ele ser gravado nos arquivos de sistema utmp e wtmp (somente se sysutmp e syswtmp estiverem desligados).

Em seguida, configure os padrões para as portas (aba Padrões de Porta -> Rede). Veja a Figura 5-11 que mostra como configurar as máquinas de autenticação e contabilidade:

Figura 5-11. Configuração do Portslave - Servidores

Depurar: Habilita a depuração (envio de informações ao syslog).

Tipo de aut.: autenticação utilizada. Na solução, foi utilizada a opção Radius.

Máquina aut.: servidor de autenticação. Pode ser atribuído, opcionalmente, um servidor de autenticação secundário (Máquina aut. 2).

Máquina conta 1: servidor de contabilidade de acesso. Opcionalmente pode ser colocado mais um servidor (Máquina conta 2).

Tempo limite RAD: tempo de espera antes de se tentar conectar aos servidores opcionais, caso sejam configurados.

Definições de domínios: os nomes de acesso usuario@maquina são reconhecidos, porém a parte @maquina é usada para selecionar diferentes máquina contas/autenticação. Por isso, é necessário neste campo definir a seqüência de domínio de máquinas, como mostrada na Figura 5-11 (domínio, autenticação e contabilidade).

Segredo: chave de autenticação. Deve ser a mesma utilizada na configuração do Radius.

Protocolo: protocolo a ser usado nas sessões.

Host: nome da máquina.

Número IP: endereço IP atribuído à porta.

IPs automáticos (recomendado): quando esta opção estiver habilitada, o número será adicionando ao endereço IP fornecido na opção anterior, de forma que IPs diferentes possam ser atribuídos a cada porta.

Máscara de rede: máscara de rede a ser utilizada na conexão; se você não souber o que colocar, deixe o valor 255.255.255.255.

MTU: unidade de transferência de rede. Este campo é opcional.

A aba Comm possui as opções de configuração da conexão do modem. Poucas modificações são necessárias.

Configuração dos nós

Esta seção adiciona, remove ou configura individualmente as portas que o Portslave irá administrar. Você deve escolher uma porta, configurar o dispositivo (geralmente serial) e configurar os campos. Estes campos são os mesmos mostrados na opção Configurador Portslave-> Configuração para Ajustes e Padrões-> Padrões de Porta-> Comm. Se você não configurar as portas, elas utilizarão a configuração global definida através do menu anterior.

Além destas configurações, você deve editar o arquivo /etc/inittab e adicionar uma linha para cada linha dialin que você tenha configurado. As linhas devem se parecer com:

T0:23:respawn:/usr/bin/portslave 0

Testes de Configuração

  • Pode-se testar a configuração do Radius através do comando radtest. Primeiro teste com um usuário que realmente esteja cadastrado em seu sistema, ou seja, que deve receber permissão de acesso. Por exemplo, vamos supor que queiramos testar uma tentativa do usuário "teste" para conectar-se à porta 21 com sua senha "senha123". A requisição vem do servidor de acesso kepler.minhaorganizacao:

    # radtest teste senha123 kepler.minhaorganizacao 21 123chave
    Sending request.
    radrecv: Reply from host 127.0.0.1 code=2, id=26, length=20

    O usuário pode conectar-se.

  • Teste novamente a autenticação com o comando radtest mas informe uma senha incorreta:

    # radtest teste senhaerrada kepler.minhaorganizacao 123chave
    Sending request.
    radrecv: Reply from host 127.0.0.1 code=3, id=60, length=20
    Access denied.

    O servidor de autenticação não irá permitir o acesso.

  • Uma outra possibilidade é a do servidor de acesso enviar uma chave de criptografia errada ao servidor Radius:

    # radtest teste senha123 kepler.minhaorganizacao chave123
    Sending request.
    Warning: Received invalid reply digest from server
    radrecv: Reply from host 127.0.0.1 code=3, id=60, length=20
    Access denied.

Notas

[1]

Distinguished name (DN).

[2]

Domain component.

[3]

Berkeley DB, versão 4.1

[4]

A instalação padrão do pacote da Conectiva já gera os certificados (auto-assinados) para permitir o uso de criptografia no slapd. START-TLS sempre poderá ser usado e, para usar LDAPS://, edite o arquivo /etc/sysconfig/ldap.

[5]

Directory Access Protocol.

[6]

Pluggable Authentication Module.

[7]

Remote Authentication Dial In User Service ou Serviço de Autenticação Remota de Usuários Dial In.

[8]

Por padrão, o termo Radius (Remote Auth Servers) refere-se ao servidor.