Instalando e Configurando OpenLDAP com Kerberos no Debian Squeeze

Vamos preparar o nosso servidor Kerberos

  1. Nome ldap1.douglasqsantos.com.br
  2. IP: 10.0.0.25
  3. Domínio: douglasqsantos.com.br
  4. Realm: douglasqsantos.com.br

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Sempre quanto terminar a edição de algum arquivo .ldif no vim sempre pressione F7 para ele remover os espaços nos finais de linha que sempre da merda ;)

Vamos desabilitar o ipv6

echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf

Agora vamos acertar o nome da maquina

vim /etc/hostname
ldap1

Agora vamos acertar o arquivo /etc/hosts

vim /etc/hosts
127.0.0.1       localhost
10.0.0.23       ldap1.douglasqsantos.com.br ldap1

Agora vamos reinicar o servidor para ficar certa a nossa configuração

reboot

Agora vamos atualizar os repositórios e instalar alguns pacotes necessários

aptitude update && aptitude dist-upgrade -y && aptitude install ssh ntp ntpdate xinetd nmap -y

Agora vamos instalar os pacotes necessários para o kerberos

apt-get install krb5-{admin-server,user,config} libpam-krb5 -y
##Responder da seguinte forma
1) douglasqsantos.com.br
2) ldap1.douglasqsantos.com.br
3) ldap1.douglasqsantos.com.br

Agora vamos fazer um acerto no xinetd, por causa do serviço de propagação de base do kerberos

vim /etc/xinetd.d/krb_prop
service krb_prop
{
        disable         = no
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
        server          = /usr/sbin/kpropd
}

Agora vamos reiniciar o xinetd

/etc/init.d/xinetd restart

Agora vamos criar o nosso realm kerberos

krb5_newrealm
This script should be run on the master KDC/admin server to initialize
a Kerberos realm.  It will ask you to type in a master key password.
This password will be used to generate a key that is stored in
/etc/krb5kdc/stash.  You should try to remember this password, but it
is much more important that it be a strong password than that it be
remembered.  However, if you lose the password and /etc/krb5kdc/stash,
you cannot decrypt your Kerberos database.
Loading random data
Initializing database '/var/lib/krb5kdc/principal' for realm 'douglasqsantos.com.br',
master key name 'K/M@douglasqsantos.com.br'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key: #senha
Re-enter KDC database master key to verify: #senha


Now that your realm is set up you may wish to create an administrative
principal using the addprinc subcommand of the kadmin.local program.
Then, this principal can be added to /etc/krb5kdc/kadm5.acl so that
you can use the kadmin program on other computers.  Kerberos admin
principals usually belong to a single user and end in /admin.  For
example, if jruser is a Kerberos administrator, then in addition to
the normal jruser principal, a jruser/admin principal should be
created.

Don't forget to set up DNS information so your clients can find your
KDC and admin servers.  Doing so is documented in the administration
guide.

Vamos acertar agora as acls do kerberos

vim /etc/krb5kdc/kadm5.acl
[...]
*/admin *
admin *

Agora vamos fazer um backup do arquivo /etc/krb5.conf

cp -Rfa  /etc/krb5.conf{,.bkp}

Agora vamos acertar o arquivo /etc/krb5.conf

vim /etc/krb5.conf
[libdefaults]
        default_realm = douglasqsantos.com.br
        forwardable = true
        proxiable = true

[realms]
        douglasqsantos.com.br = {
                kdc = ldap1.douglasqsantos.com.br
                admin_server = ldap1.douglasqsantos.com.br
        }

[domain_realm]
        .douglasqsantos.com.br = douglasqsantos.com.br
        douglasqsantos.com.br = douglasqsantos.com.br

[logging]
        kdc = FILE:/var/log/krb5/kdc.log
        admin_server = FILE:/var/log/krb5/kadmin.log
        default = FILE:/var/log/krb5/klib.log

Agora vamos criar o diretório para armazenar os logs

mkdir /var/log/krb5

Agora vamos acertar o logrotate para o kerberos

vim /etc/logrotate.d/krb5
/var/log/krb5/kadmin.log /var/log/krb5/kdc.log /var/log/krb5/klib.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
}

Agora vamos mudar o tempo de vida do ticket

kadmin.local

Authenticating as principal root/admin@douglasqsantos.com.br with password.
kadmin.local:  modprinc -maxlife "1 day" -maxrenewlife "90 day" krbtgt/douglasqsantos.com.br
Principal "krbtgt/douglasqsantos.com.br@douglasqsantos.com.br" modified.
kadmin.local:  q

Agora vamos acertar o kdc.conf para acertar o tempo de vida do ticket

vim /etc/krb5kdc/kdc.conf
[...]
max_life = 1d 0h 0m 0s
max_renewable_life = 90d 0h 0m 0s

Agora vamos reiniciar os serviços

/etc/init.d/krb5-admin-server restart ; /etc/init.d/krb5-kdc restart

Agora vamos criar o nosso admin

kadmin.local

Authenticating as principal root/admin@douglasqsantos.com.br with password.
kadmin.local:  addprinc admin
WARNING: no policy specified for admin@douglasqsantos.com.br; defaulting to no policy
Enter password for principal "admin@douglasqsantos.com.br": #Informe a senha
Re-enter password for principal "admin@douglasqsantos.com.br": #Informe a senha
Principal "admin@douglasqsantos.com.br" created.
kadmin.local:  q

Agora vamos criar a nossa keytab e adicionar o nosso host

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@douglasqsantos.com.br: #senha
kadmin:  addprinc -randkey host/ldap1.douglasqsantos.com.br
WARNING: no policy specified for host/ldap1.douglasqsantos.com.br@douglasqsantos.com.br; defaulting to no policy
Principal "host/ldap1.douglasqsantos.com.br@douglasqsantos.com.br" created.
kadmin:  ktadd host/ldap1.douglasqsantos.com.br
Entry for principal host/ldap1.douglasqsantos.com.br with kvno 2, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/ldap1.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/ldap1.douglasqsantos.com.br with kvno 2, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/ldap1.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Agora vamos aos testes

Vamos criar um ticket para o admin

kinit admin
Password for admin@douglasqsantos.com.br: #informe a senha

Agora vamos listar o nosso ticket

klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@douglasqsantos.com.br

Valid starting     Expires            Service principal
09/28/11 11:49:11  09/29/11 11:49:10  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora para destruir o ticket para testar

kdestroy

Agora vamos listar novamente

klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

Agora vamos testar o kerberos com ssh, vamos adicionar o root no kerberos

kadmin -p admin
kadmin:  addprinc root
WARNING: no policy specified for root@douglasqsantos.com.br; defaulting to no policy
Enter password for principal "root@douglasqsantos.com.br":
Re-enter password for principal "root@douglasqsantos.com.br":
Principal "root@douglasqsantos.com.br" created.
kadmin: q

Vamos somente acertar o arquivo de configuração da sessão caso o usuário não tenho um diretório home, então vai ser criado automáticamente

vim /etc/pam.d/common-session
session  [default=1]                                      pam_permit.so
session  requisite                                        pam_deny.so
session  required                                         pam_permit.so
session  optional                                         pam_krb5.so minimum_uid=1000
session  required                                         pam_unix.so
session  optional                                         pam_mkhomedir.so skel=/etc/skel umask=077

Agora vamos acertar o arquivo de configuração do serviço de ssh

vim /etc/ssh/sshd_config
[...]
#A opção abaixo deve estar habilitada para que a troca de senhas via ssh
# ocorra adequadamente.
ChallengeResponseAuthentication yes
# Opções para autenticação via Kerberos:
KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
# Opções para aunteticação via GSSAPI:
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

Agora vamos reiniciar o serviço de ssh

/etc/init.d/ssh restart

Vamos acertar o cliente ssh

vim /etc/ssh/ssh_config
[...]
StrictHostKeyChecking no
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Agora temos que iniciar o ticket do root para testar o ssh

kinit root
Password for root@douglasqsantos.com.br: #informe a senha setada no kerberos

Vamos listar o ticket para ver se foi criado com sucesso

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 12:28:15  11/08/11 12:28:15  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos testar a conexão ssh

ssh ldap1.douglasqsantos.com.br
Warning: Permanently added 'ldap1.douglasqsantos.com.br,10.0.0.25' (RSA) to the list of known hosts.
Linux ldap1 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov  7 11:59:00 2011 from 10.0.0.20
[12:29:03] root@ldap1 [~] # 

Como pode ser notado ocorreu tudo ok, não foi solicitada a senha para a conexão via ssh por causa que configuramos o serviço do ssh a utilizar o ticket do kerberos

Agora vamos verificar se as portas do kerberos estão escutando ok

nmap -sU -sT -p U:88,464,T:464,749 ldap1.douglasqsantos.com.br

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 12:31 BRST
Interesting ports on ldap1.douglasqsantos.com.br (10.0.0.25):
PORT    STATE         SERVICE
464/tcp open          kpasswd5
749/tcp open          kerberos-adm
88/udp  open|filtered kerberos-sec
464/udp open|filtered kpasswd5

Nmap done: 1 IP address (1 host up) scanned in 3.08 seconds

Como pode ser notado elas estão open então vamos configurar

Agora vamos cadastrar o serviço do ldap no kerberos

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@douglasqsantos.com.br: #senha
kadmin:  addprinc -randkey ldap/ldap1.douglasqsantos.com.br
WARNING: no policy specified for ldap/ldap1.douglasqsantos.com.br@douglasqsantos.com.br; defaulting to no policy
Principal "ldap/ldap1.douglasqsantos.com.br@douglasqsantos.com.br" created.
kadmin:   ktadd ldap/ldap1.douglasqsantos.com.br
Entry for principal ldap/ldap1.douglasqsantos.com.br with kvno 2, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal ldap/ldap1.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal ldap/ldap1.douglasqsantos.com.br with kvno 2, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal ldap/ldap1.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Agora vamos para a configuração do LDAP o nosso Kerberos já esta ok

Vamos instalar os pacotes necessários

aptitude install slapd ldap-utils -y
#Respostas
1) Informe a senha
2) Confirme a senha

Vamos verificar a porta do ldap

nmap -p 389 localhost -T4

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 12:34 BRST
Interesting ports on localhost (127.0.0.1):
PORT    STATE  SERVICE
389/tcp closed ldap

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

Agora vamos ajustar a consulta para a nossa base LDAP

vim /etc/ldap/ldap.conf
BASE     dc=douglasqsantos,dc=com,dc=br
URI      ldap://ldap1.douglasqsantos.com.br

Vamos verificar a configuração da nossa base

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: none
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=douglasqsantos,dc=com,dc=br
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" wri
 te by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=douglasqsantos,dc=com,dc=br
olcRootPW: {SSHA}6B8iNyd8/fUHy8DPMsvo9nIjRQCyu9/T
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq

Agora vamos acertar a configuração do nosso LDAP

vim ~/olc-mod1.ldif
# 1.
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats

# 2.1.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {2}to *
  by self write
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by * read
-
# 2.1.2.
delete: olcAccess
olcAccess: {1}to dn.base=""
  by * read
-
# 2.1.3.
delete: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by self write
  by anonymous auth
  by dn="cn=admin,dc=douglasqsantos,dc=com,dc=br" write
  by * none
-
# 2.2.1.
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
  by * none
-
# 2.2.2.
add: olcAccess
olcAccess: {1}to attrs=loginShell
  by self write
  by * none
-
# 2.2.3.
add: olcAccess
olcAccess: {2}to dn.base=""
  by * read
-
# 2.2.4.
add: olcAccess
olcAccess: {3}to *
  by users read
  by * none
-
# 2.3.
add: olcDbIndex
olcDbIndex: uid eq
-
# 2.4.
add: olcDbIndex
olcDbIndex: cn eq
-
# 2.5.
add: olcDbIndex
olcDbIndex: ou eq
-
# 2.6.
add: olcDbIndex
olcDbIndex: dc eq

Agora vamos importar a configuração

ldapmodify -QY EXTERNAL -H ldapi:/// -f ~/olc-mod1.ldif
modifying entry "cn=config"

modifying entry "olcDatabase={1}hdb,cn=config"

Agora vamos remover o admin criado na instalação do ldap pois vamos utilizar o admin do kerberos

ldapdelete -x -h localhost -D cn=admin,dc=douglasqsantos,dc=com,dc=br -w senha cn=admin,dc=douglasqsantos,dc=com,dc=br

Agora vamos instalar o sasl2 para a autenticação do ldap no kerberos

aptitude install libsasl2-modules-gssapi-mit -y

Vamos acertar as permissões do keytab agora

chmod 640 /etc/krb5.keytab
chown root.openldap /etc/krb5.keytab

Agora precisamos descomentar a seguinte linha no arquivo /etc/default/slapd

vim /etc/default/slapd
[...]
#No final do arquivo
export KRB5_KTNAME=/etc/krb5.keytab

Agora vamos acertar o /etc/ldap/ldap.conf

vim /etc/ldap/ldap.conf
[...]
#No final do arquivo
SASL_MECH GSSAPI

Agora vamos criar a base para o nosso LDAP

vim ~/ous.ldif
dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
objectClass: organizationalUnit
ou: Usuarios

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
objectClass: organizationalUnit
ou: Grupos

Vamos importar a configuração

ldapadd -xWD cn=admin,dc=douglasqsantos,dc=com,dc=br -f ~/ous.ldif
Enter LDAP Password: 
adding new entry "ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"

adding new entry "ou=Grupos,dc=douglasqsantos,dc=com,dc=br"

Vamos acertar as permissões agora no LDAP

vim ~/olc-mod2.ldif
# 1.1.
dn: cn=config
changetype: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=([^,]+),cn=douglasqsantos.com.br,cn=gssapi,cn=auth
  uid=$1,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
-
# 1.2.
add: olcSaslRealm
olcSaslRealm: douglasqsantos.com.br

# 2.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: uid=admin,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
-
# 2.2
delete: olcRootPW

Vamos importar a configuração

ldapmodify -QY EXTERNAL -H ldapi:/// -f ~/olc-mod2.ldif
modifying entry "cn=config"

modifying entry "olcDatabase={1}hdb,cn=config"

Agora vamos reiniciar o LDAP

/etc/init.d/slapd restart
Stopping Openldap: slapd.
Starting Openldap: slapd.

Vamos efetuar uma consulta anonima

ldapsearch -xLLL
No such object (32)

Agora vamos efetuar uma consulta com o admin interno do ldap

ldapsearch -xWLLL -D cn=admin,dc=douglasqsantos,dc=com,dc=br ou=Usuarios
Enter LDAP Password:
ldap_bind: Invalid credentials (49)

Agora vamos criar um tiket no kerberos para o admin

kinit admin
Password for admin@douglasqsantos.com.br: #senha

Agora vamos verificar se foi gerado o ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 12:50:01  11/08/11 12:50:00  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos efetuar uma consulta no LDAP

ldapsearch -LLL
SASL/GSSAPI authentication started
SASL username: admin@douglasqsantos.com.br
SASL SSF: 56
SASL data security layer installed.
dn: dc=douglasqsantos,dc=com,dc=br
objectClass: top
objectClass: dcObject
objectClass: organization
o: douglasqsantos.com.br
dc: douglas

dn: ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
objectClass: organizationalUnit
ou: Usuarios

dn: ou=Grupos,dc=douglasqsantos,dc=com,dc=br
objectClass: organizationalUnit
ou: Grupos

Agora vamos verificar o usuário que estamos logados para o Linux

whoami
root

Agora vamos verificar no LDAP com qual usuário estamos logados

ldapwhoami 
SASL/GSSAPI authentication started
SASL username: admin@douglasqsantos.com.br
SASL SSF: 56
SASL data security layer installed.
dn:uid=admin,ou=usuarios,dc=douglasqsantos,dc=com,dc=br

Agora vamos criar um novo usuário

Temos que criar o usuário tanto na base LDAP quanto na base Kerberos

Vamos criar o usuário primeiro no kerberos

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@douglasqsantos.com.br: 
kadmin:  addprinc douglas
WARNING: no policy specified for douglas@douglasqsantos.com.br; defaulting to no policy
Enter password for principal "douglas@douglasqsantos.com.br": 
Re-enter password for principal "douglas@douglasqsantos.com.br": 
Principal "douglas@douglasqsantos.com.br" created.
kadmin:  q

Vamos gerar um hash da senha para armazenar no LDAP

slappasswd -s 123
{SSHA}oJvrkYndrF0M3EZEXisub3Rm1yB9XEXA

Agora vamos criar o usuário no LDAP

vim ~/douglas.ldif
dn: cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br
cn: ti-admin
gidNumber: 20001
objectClass: top
objectClass: posixGroup

dn: uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br
uid: douglas
uidNumber: 20001
gidNumber: 20001
cn: Douglas
sn: Santos
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/douglas
userPassword: {SSHA}oJvrkYndrF0M3EZEXisub3Rm1yB9XEXA

Agora vamos importar o nosso usuário

ldapadd -Qf ~/douglas.ldif
adding new entry "cn=ti-admin,ou=Grupos,dc=douglasqsantos,dc=com,dc=br"

adding new entry "uid=douglas,ou=Usuarios,dc=douglasqsantos,dc=com,dc=br"

Vamos destruir o ticket do admin

kdestroy

Agora vamos criar um ticket para o novo usuário

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Agora vamos listar o ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 12:58:32  11/08/11 12:58:32  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos ver com quem estamos logados no LDAP

ldapwhoami 
SASL/GSSAPI authentication started
SASL username: douglas@douglasqsantos.com.br
SASL SSF: 56
SASL data security layer installed.
dn:uid=douglas,ou=usuarios,dc=douglasqsantos,dc=com,dc=br

Como pode ser notado estamos logado com o novo usuário

Vamos configurar agora o servidor como cliente

Vamos acertar o debconf

dpkg-reconfigure debconf
#Responda a perguntas
#1) Dialog
#2) baixa

Agora vamos instalar os pacotes para trabalhar como cliente LDAP

aptitude install ldap-utils libnss-ldap libpam-ldap nscd libsasl2-modules-gssapi-mit -y
#Responda as perguntas da seguinte forma
#1) ldap://ldap1.douglasqsantos.com.br
#2) dc=douglasqsantos,dc=com,dc=br
#3) 3
#4) No
#5) No 
#6) No
#7) OK
#8) No
#9) No
#10) Criptografia
#11) No
#12) Deixe selecionado somente Kerberos e Unix Autentication

Vamos instalar o kstart

aptitude install kstart -y

Adicione no final do arquivo /etc/inittab

vim /etc/inittab
[...]
KS:2345:respawn:/usr/bin/k5start -U -f /etc/krb5.keytab -K 10 -l 24h

Agora vamos forçar o reload do /etc/inittab

kill -HUP 1

Vamos acertar o arquivo /etc/libnss-ldap.conf

vim /etc/libnss-ldap.conf
[...]
#No final do arquivo adicione
use_sasl        on
sasl_mech       gssapi
krb5_ccname     FILE:/tmp/krb5cc_0

Agora vamos acertar o /etc/nsswitch.conf

vim /etc/nsswitch.conf
[...]
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

Reiniciar o nscd

/etc/init.d/nscd restart
Restarting Name Service Cache Daemon: nscd.

Vamos fazer um teste de autenticação com o novo usuário

Vamos gerar um ticket para ele

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Vamos listar o ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 13:42:37  11/08/11 13:42:36  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos efetuar um teste de ssh no servidor para ele mesmo com o usuário douglas

ssh douglas@ldap1.douglasqsantos.com.br
Creating directory '/home/douglas'.
Linux ldap1 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
$ pwd
/home/douglas
$     

Agora vamos fazer um teste de conexão de um cliente remoto para o servidor

ssh douglas@10.0.0.25
Password: 
Linux ldap1 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov  7 13:45:35 2011 from ldap1.douglasqsantos.com.br
$

Como o nosso cliente não esta configurado para ser cliente do nosso domínio kerberos foi solicitada a senha, porém foi gerado o ticket na inicialização da sessão vamos confirmar isso

$ klist
Ticket cache: FILE:/tmp/krb5cc_20001_zz3086
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 13:47:10  11/08/11 13:47:10  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Foi gerado corretamente o ticket, agora vamos consultar o log de autenticação no servidor

tail -f /var/log/auth.log
Nov  7 13:47:10 ldap1 sshd[3088]: pam_krb5(sshd:auth): user douglas authenticated as douglas@douglasqsantos.com.br
Nov  7 13:47:10 ldap1 sshd[3086]: Accepted keyboard-interactive/pam for douglas from 10.0.0.20 port 57753 ssh2
Nov  7 13:47:10 ldap1 sshd[3086]: pam_unix(sshd:session): session opened for user douglas by (uid=0)

Como pode ser notado o cliente foi autenticado como douglas@douglasqsantos.com.br e a autenticação foi validada por pam_krb5

Agora vamos configurar o cliente kerberos

  1. Nome: cliente.douglasqsantos.com.br
  2. IP: 10.0.0.27
  3. Domínio: douglasqsantos.com.br
  4. Realm: douglasqsantos.com.br

Vamos desabilitar o ipv6

echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf

Acertando o nome da maquina

vim /etc/hostname
cliente

Vamos acertar o /etc/hosts

vim /etc/hosts
127.0.0.1       localhost
10.0.0.27       cliente.douglasqsantos.com.br    cliente
10.0.0.25       ldap1.douglasqsantos.com.br      ldap1

Vamos reiniciar a maquina cliente

reboot

Vamos atualizar os repositórios e instalar alguns pacotes necessários

aptitude update && aptitude dist-upgrade -y && aptitude install ssh ntp ntpdate nmap -y

Agora vamos verificar se o servidor kerberos esta respondendo consultas

nmap -sU -sT -p U:88,464,T:464,749 ldap1.douglasqsantos.com.br

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 13:59 BRST
Interesting ports on ldap1.douglasqsantos.com.br (10.0.0.25):
PORT    STATE         SERVICE
464/tcp open          kpasswd5
749/tcp open          kerberos-adm
88/udp  open|filtered kerberos-sec
464/udp open|filtered kpasswd5
MAC Address: 08:00:27:C5:C8:32 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 1.37 seconds

Agora vamos instalar os pacotes para o cliente poder logar no servidor kerberos

aptitude install krb5-{config,user} libpam-krb5 -y
#Responder as perguntas da seguinte forma
#1) douglasqsantos.com.br
#2) ldap1.douglasqsantos.com.br
#3) ldap1.douglasqsantos.com.br 

Agora vamos acertar o /etc/krb5.conf

Vamos fazer backup do arquivo /etc/krb5.conf

cp /etc/krb5.conf{,.bkp}

Agora vamos modificar o arquivo

vim /etc/krb5.conf
[libdefaults]
        default_realm = douglasqsantos.com.br
        forwardable = true
        proxiable = true

[realms]
        douglasqsantos.com.br = {
                kdc = ldap1.douglasqsantos.com.br
                admin_server = ldap1.douglasqsantos.com.br
        }

[domain_realm]
        .douglasqsantos.com.br = douglasqsantos.com.br
        douglasqsantos.com.br = douglasqsantos.com.br

[logging]
        kdc = FILE:/var/log/krb5/kdc.log
        admin_server = FILE:/var/log/krb5/kadmin.log
        default = FILE:/var/log/krb5/klib.log

Vamos criar o diretorio para armazenar os logs

mkdir /var/log/krb5

Agora vamos inserir o host do cliente no kerberos, no servidor kerberos

kadmin  -p admin
Authenticating as principal admin with password.
Password for admin@douglasqsantos.com.br: 
kadmin:  addprinc -randkey host/cliente.douglasqsantos.com.br
WARNING: no policy specified for host/cliente.douglasqsantos.com.br@douglasqsantos.com.br; defaulting to no policy
Principal "host/cliente.douglasqsantos.com.br@douglasqsantos.com.br" created.
kadmin:  ktadd host/cliente.douglasqsantos.com.br
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Agora vamos adicionar o host no keytab do cliente agora, no cliente

kadmin  -p admin
Authenticating as principal admin with password.
Password for admin@douglasqsantos.com.br: 
kadmin:  ktadd host/cliente.douglasqsantos.com.br
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type AES-256 CTS mode with 96-bit SHA-1 HMAC added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Vamos consultar o keytab para verificar a existência do nosso host

klist -ke
Keytab name: WRFILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 host/cliente.douglasqsantos.com.br@douglasqsantos.com.br (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
   2 host/cliente.douglasqsantos.com.br@douglasqsantos.com.br (ArcFour with HMAC/md5) 
   2 host/cliente.douglasqsantos.com.br@douglasqsantos.com.br (Triple DES cbc mode with HMAC/sha1) 
   2 host/cliente.douglasqsantos.com.br@douglasqsantos.com.br (DES cbc mode with CRC-32) 

Vamos acertar o debconf

dpkg-reconfigure debconf
#Responda a perguntas
#1) Dialog
#2) baixa

Agora vamos instalar os pacotes para trabalhar como cliente LDAP

aptitude install ldap-utils libnss-ldap libpam-ldap nscd libsasl2-modules-gssapi-mit -y
#Responda as perguntas da seguinte forma
#1) ldap://ldap1.douglasqsantos.com.br
#2) dc=douglasqsantos,dc=com,dc=br
#3) 3
#4) No
#5) No 
#6) No
#7) OK
#8) No
#9) No
#10) Criptografia
#11) No
#12) Deixe selecionado somente Kerberos e Unix Autentication

Vamos instalar o kstart

aptitude install kstart -y

Adicione no final do arquivo /etc/inittab

vim /etc/inittab
[...]
KS:2345:respawn:/usr/bin/k5start -U -f /etc/krb5.keytab -K 10 -l 24h

Agora vamos forçar o reload do /etc/inittab

kill -HUP 1

Vamos acertar o arquivo /etc/libnss-ldap.conf

cp -Rfa /etc/libnss-ldap.conf{,.bkp}
vim /etc/libnss-ldap.conf
[...]
#No final do arquivo adicione
use_sasl        on
sasl_mech       gssapi
krb5_ccname     FILE:/tmp/krb5cc_0

Vamos acertar o arquivo /etc/ldap/ldap.conf

cp -Rfa /etc/ldap/ldap.conf{,.bkp}
vim /etc/ldap/ldap.conf
BASE    dc=douglasqsantos,dc=com,dc=br
URI     ldap://ldap1.douglasqsantos.com.br
SASL_MECH GSSAPI

Agora vamos acertaro /etc/nsswitch.conf

vim /etc/nsswitch.conf
[...]
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

Reiniciar o nscd

/etc/init.d/nscd restart
Restarting Name Service Cache Daemon: nscd.

Vamos acertar a configuração da sessão na pam

vim /etc/pam.d/common-session
session  [default=1]                                      pam_permit.so
session  requisite                                        pam_deny.so
session  required                                         pam_permit.so
session  optional                                         pam_krb5.so minimum_uid=1000
session  required                                         pam_unix.so
session  optional                                         pam_mkhomedir.so skel=/etc/skel umask=077

Vamos acertar o ssh

vim /etc/ssh/sshd_config
[...]
#A opção abaixo deve estar habilitada para que a troca de senhas via ssh
# ocorra adequadamente.
ChallengeResponseAuthentication yes
# Opções para autenticação via Kerberos:
KerberosAuthentication yes
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
# Opções para aunteticação via GSSAPI:
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

Vamos reiniciar o serviço do ssh

/etc/init.d/ssh restart

Vamos acertar o cliente ssh

vim /etc/ssh/ssh_config
[...]
StrictHostKeyChecking no
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

Agora vamos testar a conexão do novo cliente com o servidor kerberos

Vamos iniciar um ticket para o cliente

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Vamos verificar se ele esta ok

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 14:11:38  11/08/11 14:11:38  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br
  renew until 11/08/11 14:16:26

Agora vamos efetuar o teste de ssh para o servidor kerberos

ssh douglas@ldap1.douglasqsantos.com.br
Warning: Permanently added 'ldap1.douglasqsantos.com.br,10.0.0.25' (RSA) to the list of known hosts.
Linux ldap1 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov  7 13:47:10 2011 from 10.0.0.20
$ 

Vamos ver se foi criado um ticket na sessão de ssh para o servidor

$ klist
Ticket cache: FILE:/tmp/krb5cc_20001_BDtCdl3117
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 14:11:46  11/08/11 14:11:38  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br
  renew until 11/08/11 14:16:26

Agora vamos efetuar um teste de conexão do servidor para o cliente

Vamos acertar o arquivo /etc/hosts do servidor

vim /etc/hosts
127.0.0.1       localhost
10.0.0.25       ldap1.douglasqsantos.com.br   ldap1
10.0.0.27       cliente.douglasqsantos.com.br cliente

Vamos inicializar um ticket

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Agora vamos listar o nosso ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 14:16:22  11/08/11 14:16:21  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos testar a conexão

ssh douglas@cliente.douglasqsantos.com.br
Warning: Permanently added 'cliente.douglasqsantos.com.br,10.0.0.27' (RSA) to the list of known hosts.
Password: 

Como pode ser notado tivemos um erro novamente, vamos analizar no cliente

Vamos efetuar um teste de ssh para do cliente para ele mesmo

Vamos inicializar um ticket

kinit douglas
Password for douglas@douglasqsantos.com.br: 
kinit: Clock skew too great while getting initial credentials

O cliente esta com problemas com o horário, vamos verificar o horário no cliente e no servidor

No cliente

date
Seg Nov  7 14:32:06 BRST 2011

No servidor

date
Seg Nov  7 14:26:41 BRST 2011

Como pode ser notado temos uma diferença entre os dois vamos sincronizar o cliente com o servidor

ntpdate -u ldap1.douglasqsantos.com.br
 7 Nov 14:36:42 ntpdate[2086]: no server suitable for synchronization found

Vamos sincronizar os dois servidor com o ntp.usp.br

No servidor

ntpdate -u ntp.usp.br
 7 Nov 14:43:32 ntpdate[3483]: step time server 143.107.255.15 offset 5.530868 sec

No cliente

ntpdate -u ntp.usp.br
 7 Nov 14:44:10 ntpdate[2103]: step time server 143.107.255.15 offset -0.848529 sec

Agora no cliente vamos incializar um novo ticket

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Agora vamos listar o ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 15:07:45  11/08/11 15:07:45  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br
  renew until 11/08/11 15:08:21

Agora vamos efetuar uma conexão de ssh do cliente para ele mesmo

ssh douglas@cliente.douglasqsantos.com.br
Creating directory '/home/douglas'.
Linux cliente 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
[14:57:44] douglas@cliente [~] $ 

Como pode ser notado a configuração passou normalmente

Agora novamente no servidor vamos fazer o teste de conexão ssh

Vamos inicializar um ticket

kinit douglas
Password for douglas@douglasqsantos.com.br: #senha

Agora vamos listar o ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: douglas@douglasqsantos.com.br

Valid starting     Expires            Service principal
11/07/11 15:13:28  11/08/11 15:13:27  krbtgt/douglasqsantos.com.br@douglasqsantos.com.br

Agora vamos testar a conexão ssh do servidor para o cliente

ssh douglas@cliente.douglasqsantos.com.br
Linux cliente 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov  7 15:13:51 2011 from cliente.douglasqsantos.com.br
[15:14:22] douglas@cliente [~] $ 

Como pode ser notado a autenticação estão ok