\section{Introdução}

	Este documento descreve os passos para a instalação de um servidor OpenLDAP,
e os passos para a instalação de clientes LDAP.

	Nas quatro seções que se seguem,
	%~\ref{ldap_server},  ~\ref{ldap_client}, ~\ref{ldap_usuarios} e ~\ref{ldap_troca}
	são descritos - na seguinte ordem - os passos para se instalar o servidor; o cliente; como se inserir uma Organização e um usuário na base LDAP; e como implementar senhas seguras de usuários em seu servidor LDAP.

\section{Instalação de Servidor OpenLDAP}
\label{ldap_server}
	Todo o processo deve ser executado pelo usuário administrador (\textit{root}).

\subsection{Pré-Requisitos}
\label{pre_ldap_server}

Os pré-requisitos para a instalação de um servidor LDAP são:

\begin{itemize}
    \item LibertasBR
    \item Repositório LibertasBR
\end{itemize}

\subsection{Como Proceder}
\label{como-pro_ldap_server}

Primeiramente o pacote slapd, que é o servidor ldap propriamente dito, deve ser instalado.
Para isto, siga os passos:

\begin{enumerate}
    \item Execute o comando:
    \begin{framed}
    \verb!apt-get install slapd!
    \end{framed}%um dos pontos que a gente andou discutindo por aqui foi a utilizacao do aptitude em vez do apt-get... parece que o aptitude resolve melhor questoes de dependencias de pacotes... vcs preferem deixar apt-get mesmo?

    \item Confirme que deseja continuar a instalação, pressionando as teclas {\bf \verb!<S>!} e depois {\bf \verb!<Enter>!};
%    \item Escolha a opção ``domain or host" e pressione ``Enter" (OK) para seguir para próxima tela.
    \item Escolha o domínio para o qual o servidor OpenLDAP funcionará: \\
    Por exemplo: BH\_AGENCIALIVRE.livre;
    \item Defina o nome da organização: \\
    Por exemplo: BH\_AGENCIALIVRE.livre;
    \item Informe a senha do usuário administrador (`admin') da base LDAP.% Esse usuário é o admin.
    \item Repita a senha para confirmação
    \item Selecione a opção [No] , para realizar a configuração manual da árvore de diretórios. 
    \item Selecione novamente a opção [No] , pressione {\bf \verb!<Enter>!} e a instalação.
do servidor estará finalizada.
\end{enumerate}

    Além do pacote slapd, deve-se também instalar o pacote ldap-utils que contém as
ferramentas necessárias para se utilizar o OpenLDAP. Para isso, execute o comando:
    \begin{framed}
    \verb!apt-get install ldap-utils!
    \end{framed}
	
    O diretório /etc/ldap é onde se encontram os arquivos necessários para o funcionamento do ldap. Copie o arquivo /usr/share/slapd/slapd.conf para esse diretório executando o seguinte comando:
    
     \begin{framed}
    \verb!cp /usr/share/slapd/slapd.conf /etc/ldap/!
    \end{framed}

Esse é o arquivo de configuração de seu servidor LDAP, ele deve apresentar a mesma configuração do arquivo reproduzido abaixo:

%\begin{scriptsize}
\medskip
{\footnotesize
\begin{framed}
\begin{verbatim}
# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Features to permit
#allow bind_v2

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# Schema check allows for forcing entries to
# match schemas for their objectClasses's
schemacheck     on

# Where the pid file is put. The init.d script
# will not stop the server if you change this.
pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server
argsfile        /var/run/slapd.args

# Read slapd.conf(5) for possible values
loglevel        0

# Where the dynamically loaded modules are stored
modulepath      /usr/lib/ldap
moduleload      back_bdb

#######################################################################
# Specific Backend Directives for bdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend         bdb

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

#######################################################################
# Specific Backend Directives for 'other':
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
#backend                <other>

#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        bdb

# The base of your directory in database #1
# Substitua pela sua base de dados e as diretivas do usuário admin
suffix          "dc=BH_AGENCIALIVRE,dc=livre"
rootdn          "cn=admin,dc=BH_AGENCIALIVRE,dc=livre"
rootpw          {SSHA}vvq51Z/AOWawgQOo8y0vIrdbIoqyrYB2

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# Indexing options for database #1
index           objectClass eq

# Save the time that the entry gets modified, for database #1
lastmod         on

# Where to store the replica logs for database #1
# replogfile    /var/lib/ldap/replog

# 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
# These access lines apply to database #1 only
# Substitua pelo o administrador do seu dominio
access to attribute=userPassword
        by dn.base="cn=admin,dc=BH_AGENCIALIVRE,dc=livre" write
        by anonymous auth
        by self write
        by * none

# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work
# happily.
access to dn.base="" by * read

# The admin dn has full write access, everyone else
# can read everything.
# Substitua pelo seu Dominio

access to *
        by dn.base="cn=admin,dc=BH_AGENCIALIVRE,dc=livre" write
        by * read

# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#access to dn=".*,ou=Roaming,o=morsnet"
#        by dn="cn=admin,dc=BH_AGENCIALIVRE,dc=livre" write
#        by dnattr=owner write

#######################################################################
# Specific Directives for database #2, of type 'other' (can be bdb too):
# Database specific directives apply to this databasse until another
# 'database' directive occurs
#database        <other>

# The base of your directory for database #2
#suffix         "dc=debian,dc=org"
\end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

No arquivo acima, opção \textbf{rootpw  $<$ SENHA $>$} estabelece uma senha para o root do slapd.conf. Para gerar a a chave encriptada da senha escolhida basta executar o seguinte comando.%tem muito conceito novo aqui.... vc nao tinha dito antes a que se refere o DN, nem explicou o que e o hash rcf 2307 e tbm nao disse a que 'a chave' esta relacionada... ficou mto confuso este trecho.. :-(
    
    \begin{framed}
    \verb!slappaswd -s < SENHA >!
    \end{framed}

Depois basta copiar a chave gerada para o arquivo de configuração. Feito isso, a instalação de um servidor ldap para o domínio escolhido estará concluída.

\subsection{Proteção da Base LDAP}
\label{ldap_corromp}

Finalizada a instalação do servidor LDAP, é importante protegê-lo contra um possível corrompimento na sua base de dados - que pode ser causado, por exemplo, por quedas súbitas de energia. A importância desta proteção se deve ao fato de que um corrompimento poderia impedir a recuperação de dados quando a máquina que contém o servidor LDAP fosse reiniciada.

Para evitar este possível problema basta acrescentar a seguinte linha de comando no arquivo de configuração do ldap (/etc/ldap/slapd.conf), substituindo as variáveis X e Y por valores definidos.

\begin{framed}
\verb!checkpoint X Y!
\end{framed}

A variável X representará o número de entradas, e a Y, o número de minutos para se dar o \textit{flush}. Por exemplo, se X=2 e Y=10, a cada duas novas entradas na base ou a cada 10 minutos um \textit{flush} ocorrerá.

Além dessa alteração, instale o pacote \texttt{db4.2-util} que contém a ferramenta de recuperação de base de dados. Para isso execute o seguinte comando:

\begin{framed}
\verb!apt-get install db4.2-util!
\end{framed}

Outra medida a ser adotada é a modificação do script de inicialização do ldap(/etc/init.d/slapd) para que ele também possa recuperar a base de dados em caso de corrompimento. A alteração deve ser feita conforme mostrado abaixo:

\medskip%\begin{scriptsize}
\begin{framed}
{\footnotesize\begin{verbatim}
....
# Start the OpenLDAP daemons
start() {
        echo -n "Starting OpenLDAP:"
        trap 'report_failure' 0
        # ------Inserir essa linha--------------
        db4.2_recover -h <diretorio da base>
        start_slapd
        start_slurpd
        trap "-" 0
        echo .
}
....
\end{verbatim}}
\end{framed}
\medskip%\end{scriptsize}

Onde se lê ``diretorio da base", deve ser indicado o local onde a base está armazenada fisicamente.
O local padrão de armazenamento é /var/lib/ldap. Caso o sistema esteja configurado de outra forma, essa
informação deve ser obtida a partir da definição ``directory" do arquivo /etc/ldap/slapd.conf.

\section{Criação da Raíz de Diretórios}
Primeiramente reinicie a excução do ldap, com o comando:
    
    \begin{framed}
    \verb!/etc/init.d/slapd restart!
    \end{framed}

Agora crie um arquivo ``raiz" com a extensão \textbf{.ldif}, contendo os seguintes parâmentros:

\medskip\begin{framed}
{\footnotesize\begin{verbatim}
	objectClass: dcObject
	objectClass: organization
	o: BH_AGENCIALIVRE 
	dc: BH_AGENCIALIVRE

	dn: cn=admin,dc=BH_AGENCIALIVRE,dc=livre
	objectclass: organizationalRole
	cn: admin
    \end{verbatim}}
\end{framed}\medskip

Execute o comando 
   \begin{framed}
   \verb!ldapmodify -x -W -f raiz.ldif -D "cn=admin, dc=BH_AGENCIALIVRE, dc=livre"!
   \end{framed}

Será pedida a senha do administrador, utilize a senha que foi usada como argumento do rootpw. Para visualizar a raiz inserida utilize o seguinte comando:

   \begin{framed}
   \verb!ldapsearch -x -b "dc=BH_AGENCIALIVRE, dc=livre"!
   \end{framed}
      
%\newpage

\section{Instalação de Cliente OpenLDAP}
\label{ldap_client}
Todos os passos descritos nessa seção devem ser executados pelo usuário administrador.

\subsection{Pré-Requisitos}
\label{pre_ldap_client}

Os pré-requisitos para a instalação de um cliente LDAP são:

\begin{itemize}
    \item LibertasBR
    \item Repositório LibertasBR
    \item Um Servidor OpenLDAP
\end{itemize}

\subsection{Como Proceder}
\label{como-pro_ldap_client}
%Durante todo processo de instalação, o usuário deve possuir privilégios de root.
    Os seguintes pacotes devem ser instalados:
    \begin{itemize}\item libnss-ldap \item libpam-ldap \item nscd \end{itemize}

\begin{enumerate}
    \item Execute os comandos:

    \begin{framed}
    \verb!apt-get install libnss-ldap!
    \end{framed}
    \begin{framed}
    \verb!apt-get install libpam-ldap!
    \end{framed}
    \begin{framed}
    \verb!apt-get install nscd!
    \end{framed}

Ignore as perguntas feitas durante a instalação desses pacotes (simplesmente pressione {\bf \verb!<ENTER>!}). As configurações relevantes serão feitas manualmente após a instalação e estão descritas, em detalhes, nas seções seguintes.

% Não serão detalhados nesse documento todos os passos da instalação, mas a seguir será descrito, detalhadamente, quais arquivos e como cada um desses deverá ser configurado.

    \item Edite o arquivo /etc/libnss-ldap.conf. Este arquivo é responsável pela
configuração de qual servidor LDAP do dominíno que seu cliente utilizará. Para isso descomente a linhas, conforme descrito abaixo:

\medskip
    {\footnotesize\begin{verbatim}
    # Substitua pelo IP de seu servidor LDAP
    host 150.164.3.205

    # Substitua pela descrição de seu domínio, sua base  de dados LDAP
    base dc=BH_AGENCIALIVRE,dc=livre

    #Versão do Ldap
    ldap_version 3
    \end{verbatim}}
\medskip 
   
    As outras linhas devem continuar comentadas.

    \item Remova o arquivo /etc/ldap/ldap.conf e crie um link simbólico do arquivo /etc/libnss-ldap.conf para o mesmo. Para isso execute os seguintes comandos:

    \begin{framed}
    \verb!rm -f /etc/ldap/ldap.conf!
    \end{framed}
    \begin{framed}
    \verb!ln -s /etc/libnss-ldap.conf /etc/ldap/ldap.conf!
    \end{framed}

    \item O arquivo /etc/nsswitch.conf é responsável pela configuração da ordem pela qual dados referentes a usuários serão recuperados. O mesmo deve ser configurado conforme exemplo abaixo:

%\begin{scriptsize}
\medskip
{\footnotesize\begin{framed}
    \begin{verbatim}
    passwd      files ldap
    group:      files ldap
    shadow:     files ldap compat

    hosts:      files dns
    networks:   files

    protocols:  db files
    services:   db files
    ethers:     db files
    rpc:        db files

    netgroup:   ldap
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

    \item Edite o arquivo /etc/pam\_ldap.conf. As seguintes linhas devem ser descomentadas do arquivo:

    \medskip
    {\footnotesize\begin{verbatim}
    # Substitua o IP abaixo pelo IP do seu servidor LDAP
    host 150.164.3.205

    # Substitua a identificação abaixo pela identificação da sua base
    base dc=BH_AGENCIALIVRE,dc=livre

    ldap_version 3
    # Substitua a identificação do usuário admin abaixo pela identificação
    # do usuário administrador do seu dominio, ou seja, substitua o dominio
     rootbinddn cn=admin,dc=BH_AGENCIALIVRE,dc=livre

    # Implementa critografia das senhas
    pam_password crypt
    \end{verbatim}}
    \medskip

    As outras linhas do arquivo devem continuar descomentadas.

    \item Edite o arquivo /etc/pam.d/common-account da seguinte forma:

%\begin{scriptsize}
\medskip
{\footnotesize\begin{framed}
    \begin{verbatim}
    account     sufficient   pam_ldap.so
    account     required    pam_unix.so
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

    \item Edite o arquivo /etc/pam.d/common-auth da seguinte forma:

%\begin{scriptsize}
\medskip{\footnotesize\begin{framed}
    \begin{verbatim}
    auth    required        pam_nologin.so
    auth    sufficient       pam_unix.so
    auth    required        pam_env.so
    auth    required        pam_ldap.so use_first_pass
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}


    \item Edite o arquivo /etc/pam.d/common-session da seguinte forma:
%\begin{scriptsize}
\medskip
{\footnotesize
\begin{framed}
    \begin{verbatim}
    session   required  pam_mkhomedir.so  skel=/etc/skel/  umask=0022  silent
    session   sufficient  pam_unix.so
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

    \item Edite o arquivo /etc/pam.d/common-password da seguinte forma:
%\begin{scriptsize}
\medskip
{\footnotesize
\begin{framed}
   \begin{verbatim}
    password    sufficient  pam_unix.so   md5  debug
    password    required    pam_ldap.so    try_first_pass debug
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

    \item Cada serviço de accesso à máquina (por exemplo, ssh, login, kdm e etc.) possui
um arquivo de configuração no diretório /etc/pam.d/. Cada arquivo pode ter uma configuração própria ou utilizar uma configuração comum (padrão).

Assim, cada um desses arquivos possui um {\em include} dos arquivos configurados nos passos acima. Para maiores detalhes do funcionamento do PAM, acesse \url{http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html} .

    \item O último passo é reiniciar o nscd para que as configurações realizadas sejam aceitas.
    Para isto, basta executar o seguinte comando:

    \begin{framed}
\verb!/etc/init.d/nscd restart!
    \end{framed}

    \item Habilite as permissões para que sua máquina aceite acesso remoto através do {\em ssh}. Para isso edite o arquivo
    /etc/ssh/sshd\_config e altere a variável PAMAuthenticationViaKbdInt conforme descrito abaixo:

%\begin{scriptsize}
\medskip
{\footnotesize
\begin{framed}
    \begin{verbatim}
       PAMAuthenticationViaKbdInt yes
    \end{verbatim}
\end{framed}}
\medskip
%\end{scriptsize}

    \item Reinicie o serviço de {\em ssh} da seguinte forma:
	\begin{framed}
	\verb!/etc/init.d/ssh restart!
	\end{framed}
\end{enumerate}

Feito isso, a instalação de um cliente ldap para o domínio escolhido
estará completa. Veja também como é feita a instalação de um servidor ldap
na seção~\ref{ldap_server}, como configurar trocas de senhas na
seção~\ref{ldap_troca} e como acrescentar usuários em sua base de dados
ldap na seção~\ref{ldap_usuarios}

\newpage
\section{Inserções na Base OpenLDAP}
\label{ldap_usuarios}
%\label{como-pro_ldap_usuarios}

Nesta seção é descrito como se criar uma organização e como se inserir um usuário
na base do servidor OpenLDAP. Todos os passos aqui descritos devem ser executados na máquina servidora, ou seja, na máquina onde está instalado o servidor LDAP pelo usuário administrador (\textit{root}).

\subsection{Pré-Requisitos}
\label{pre_ldap_usuarios}

    Os pré-requisitos para se inserir usuários  em  um servidor LDAP são:
\begin{itemize}
    \item LibertasBR
    \item Repositório LibertasBR
    \item Servidor OpenLDAP
    \item Cliente OpenLDAP
\end{itemize}

%\subsection{Como Proceder}
%\label{como-pro_ldap_usuarios}

\subsection{Inserção de Organização na Base OpenLDAP}
Para criar uma organização (Organizational Unit - OU) em sua base de dados, onde deverão
ser inseridos os usuários, execute os seguintes procedimentos: 
%Para a criação da organização da base 
%Criado um ``ramo" na árvore do OpenLDAP, ou seja criada uma OU, é possível inserir usuários neste ramo.%ficou um pouco confuso este trecho... a ideia e criar a organizacao primeiro, ne? mas quais sao os procedimentos pra criar os ramos...? eles apareceram criados do nada... :-(
\begin{enumerate}
    \item Criar um arquivo com extensão .ldif, como mostrado abaixo:
    \begin{verbatim}
    dn: ou=People, dc=BH_AGENCIALIVRE,dc=livre
    changeType: add
    objectClass: organizationalUnit
    ou: People
    \end{verbatim}

    No caso desta instalação, o arquivo acima foi nomeado como people.ldif.

    \item Executar o seguinte comando:

\begin{framed}
\verb!ldapmodify -x -W -f people.ldif -D "cn=admin, dc=BH_AGENCIALIBRE, dc=livre"!
\end{framed}

    Ao executar este comando, deve-se entrar com a senha de administrador do
OpenLDAP, informada durante a instalação do mesmo.

\end{enumerate}

\subsection{Inserção de Usuários na Base OpenLDAP}
Para inserir usuários na Base de Dados basta executar os seguintes procedimentos:

\begin{enumerate}

    \item Criar um arquivo contendo as informações do usuário.
    Veja exemplo abaixo:

%    \begin{scriptsize}

\begin{framed}
{\footnotesize\begin{verbatim}
    dn: cn=joao,ou=People,dc=BH_AGENCIALIVRE,dc=livre
    changeType: add
    cn: Joao
    sn: Joao
    objectClass: person
    objectClass: posixAccount
    uid: Joao
    uidNumber: 25
    gidNumber: 1000
    loginShell: /bin/bash
    userPassword: senha01
    homeDirectory: /home/joao
    \end{verbatim}}
\end{framed}
%\end{scriptsize}

     No caso desta instalação, esse arquivo foi nomeado como usuarios.ldif.

    \item Executar o seguinte comando:

{\footnotesize\begin{verbatim}
#> ldapmodify -x -W -f usuarios.ldif -D "cn=admin, dc=BH_AGENCIALIVRE, dc=livre"
\end{verbatim}}

    Entrar com a senha de administrador do LDAP, informada durante a
instalação do mesmo.

\end{enumerate}

    Agora sua base de dados possui o usuário ``joao" inserido no ramo ``People".

    Para verificar a inserção correta, execute o comando abaixo:

    \begin{verbatim}
    #> slapcat
    \end{verbatim}

E a saída deve mostrar em sua saída algo parecido com:

%\begin{scriptsize}
\begin{framed}
{\footnotesize\begin{verbatim}
dn: dc=caixa,dc=livre
objectClass: dcObject
dc: caixa

dn: cn=admin,dc=caixa,dc=livre
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: admin
description: LDAP administrator
userPassword:: e0NSWVBUfWtOR1pGM2tyZy9rOUk=

dn: ou=People,dc=caixa,dc=livre
objectClass: organizationalUnit
ou: People

dn: ou=Roaming,dc=caixa,dc=livre
objectClass: organizationalUnit
ou: Roaming

dn: cn=Joao,ou=People,dc=caixa,dc=livre
sn: Joao
objectClass: person
objectClass: posixAccount
uid: Joao
uidNumber: 25
gidNumber: 1000
loginShell: /bin/bash
homeDirectory: /var/tmp/
creatorsName: cn=admin,dc=caixa,dc=livre
createTimestamp: 20040423133559Z
cn: Joao
userPassword:: e2NyeXB0fUE4SXBmZTcwWTBPcFk=
modifiersName: cn=admin,dc=caixa,dc=livre
modifyTimestamp: 20040427143756Z
\end{verbatim}}
\end{framed}
%\end{scriptsize}

\newpage

\section{Troca de Senhas segura no OpenLDAP}
\label{ldap_troca}

\subsection{Pré-Requisitos}
\label{pre_ldap_troca}

    Os pré-requisitos para a preparação do ambiente para que os usuários troquem
suas senhas com segurança são:

\begin{itemize}
    \item LibertasBR
    \item Repositório LibertasBR
    \item Servidor OpenLDAP
    \item Cliente OpenLDAP
    \item O usuário estar cadastrado no OpenLDAP
\end{itemize}


\subsection{Como Proceder}
\label{como-pro_ldap_troca}

    Durante todo processo de instalação, deve-se possuir privilégios de usuário administrador (root).

Os passos a seguir devem ser executados nas máquinas clientes.

\begin{enumerate}

    \item Instalar os pacotes de senha com os seguintes comandos:

\begin{verbatim}
#apt-get install libpam-cracklib
#apt-get install cracklib-runtime
#apt-get install cracklib2
#apt-get install cracklib2-dev
\end{verbatim}

    \item  Editar o arquivo /etc/pam.d/common-password para que o mesmo utilize agora o cracklib para não permitir senhas ``fáceis". Para isso edite-o da seguinte forma:

\begin{scriptsize}
\begin{framed}
{\footnotesize\begin{verbatim}
password     requisite     pam_cracklib.so retry=3 minlen=6 difok=3
password     sufficient    pam_ldap.so use_first_pass
password     required      pam_unix.so nullok obscure
\end{verbatim}}
\end{framed}
\end{scriptsize}

\end{enumerate}

    Pronto, sua máquina cliente está habilitada a realizar troca de senhas.

Para que um usuário altere sua senha, basta que o mesmo esteja utilizando sua conta e execute o seguinte comando:

\begin{verbatim}
#> passwd
\end{verbatim}

    Será pedida a senha atual e, em seguida, a nova senha e sua confirmação.
Não serão aceitas senhas ``fáceis".
