Servidor Kerberos Master/Slave + Debian Squeeze

  1. Nome servidor master: kdc1.douglasqsantos.com.br
  2. IP servidor master: 10.0.0.25
  3. Domínio: douglasqsantos.com.br
  4. Realm: DOUGLASQSANTOS.COM.BR
  5. Nome servidor slave: kdc2.douglasqsantos.com.br
  6. IP servidor slave: 10.0.0.26
  7. Domínio: douglasqsantos.com.br
  8. Realm: DOUGLASQSANTOS.COM.BR
  9. Nome cliente: cliente.douglasqsantos.com.br
  10. IP cliente: 10.0.0.27
  11. Domínio: douglasqsantos.com.br
  12. 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.

Vamos preparar o ambiente primeiro

Vamos acertar o /etc/hosts do servidor master

vim /etc/hosts
127.0.0.1       localhost
10.0.0.25       kdc1.douglasqsantos.com.br       kdc1
10.0.0.26       kdc2.douglasqsantos.com.br       kdc2
10.0.0.27       cliente.douglasqsantos.com.br    cliente

Vamos ajustar o nome do servidor master em /etc/hostname

vim /etc/hostname
kdc1

Vamos acertar o /etc/hosts do servidor slave

vim /etc/hosts
127.0.0.1       localhost
10.0.0.25       kdc1.douglasqsantos.com.br       kdc1
10.0.0.26       kdc2.douglasqsantos.com.br       kdc2
10.0.0.27       cliente.douglasqsantos.com.br    cliente

Vamos ajustar o nome do servidor slave em /etc/hostname

vim /etc/hostname
kdc2

Vamos desabilitar o IPV6 nos dois servidores

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

Agora vamos reiniciar os dois servidores

reboot

Agora vamos instalar as dependências para podermos trabalhar com o kerberos

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

Agora vamos instalar os serviços do servidor kerberos

apt-get install krb5-{admin-server,user} libpam-krb5 -y

Responda as perguntas da seguinte forma somente mudando o domínio de acordo com a necessidade

  1. DOUGLASQSANTOS.COM.BR
  2. kdc1.douglasqsantos.com.br
  3. kdc1.douglasqsantos.com.br

Agora vamos acertar o Xinetd para ele fazer a propagação da 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 ele

/etc/init.d/xinetd restart

Agora vamos criar o nosso domínio com o comando krb5_newrealm

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: #informe a senha
Re-enter KDC database master key to verify: #confirme a 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.

Agora vamos acertar as acls do kerberos

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

Agora vamos acertar o arquivo de configuração krb5.conf

Vamos fazer um backup do arquivo

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

Agora deixe ele como abaixo

vim /etc/krb5.conf
[libdefaults]
        default_realm = DOUGLASQSANTOS.COM.BR
        forwardable = true
        proxiable = true

[realms]
        DOUGLASQSANTOS.COM.BR = {
                kdc = kdc1.douglasqsantos.com.br
                admin_server = kdc1.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 que vai armazenar os logs

mkdir /var/log/krb5

Agora vamos configurar o logrotate para fazer rotação dos logs do 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.
#Vamos mudar o tempo de vida do ticket
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 com o novo tempo de vida máximo 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.
#Vamos criar o admin
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: #informe a senha do admin
#Agora vamos criar um host no kerberos
kadmin:  addprinc -randkey host/kdc1.douglasqsantos.com.br
WARNING: no policy specified for host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR; defaulting to no policy
Principal "host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR" created.
#Agora vamos adicionar o host ao keytab
kadmin:  ktadd host/kdc1.douglasqsantos.com.br
Entry for principal host/kdc1.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/kdc1.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.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/kdc1.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 nosso admin

kinit admin
Password for admin@DOUGLASQSANTOS.COM.BR: #informe a senha

Agora vamos confirmar se o nosso ticket foi criado

klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
10/10/11 11:43:59  10/11/11 11:43:58  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora vamos destruir o nosso ticket

kdestroy

Agora vamos listar novamente para confirmar que destruímos o ticket

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

Como pode ser notado não temos mais o ticket

Agora vamos a algumas operações do kerberos

Vamos listar a base de dados do nosso kerberos

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@DOUGLASQSANTOS.COM.BR: #senha
#Vamos listar a base do kerberos
kadmin:  listprincs
K/M@DOUGLASQSANTOS.COM.BR
admin@DOUGLASQSANTOS.COM.BR
host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
kadmin/admin@DOUGLASQSANTOS.COM.BR
kadmin/changepw@DOUGLASQSANTOS.COM.BR
kadmin/history@DOUGLASQSANTOS.COM.BR
kadmin/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora vamos obter os possíveis comandos que podemos utilizar no console do Kerberos

#Vamos listar os possíveis comandos
kadmin:  ?
Available kadmin requests:

add_principal, addprinc, ank
                         Add principal
delete_principal, delprinc
                         Delete principal
modify_principal, modprinc
                         Modify principal
change_password, cpw     Change password
get_principal, getprinc  Get principal
list_principals, listprincs, get_principals, getprincs
                         List principals
add_policy, addpol       Add policy
modify_policy, modpol    Modify policy
delete_policy, delpol    Delete policy
get_policy, getpol       Get policy
list_policies, listpols, get_policies, getpols
                         List policies
get_privs, getprivs      Get privileges
ktadd, xst               Add entry(s) to a keytab
ktremove, ktrem          Remove entry(s) from a keytab
lock                     Lock database exclusively (use with extreme caution)
unlock                   Release exclusive database lock
list_requests, lr, ?     List available requests.
quit, exit, q            Exit program.
kadmin:  q

Agora vamos mudar a senha do admin

#Comando para alterar a senha do admin
kadmin:  cpw admin
Enter password for principal "admin@DOUGLASQSANTOS.COM.BR": #informe a senha
Re-enter password for principal "admin@DOUGLASQSANTOS.COM.BR": #confirme a senha
Password for "admin@DOUGLASQSANTOS.COM.BR" changed.

Agora vamos obter informações a respeito de um determinado usuário

#Comando para obter informações 
kadmin:  getprinc admin
Principal: admin@DOUGLASQSANTOS.COM.BR
Expiration date: [never]
Last password change: Mon Oct 10 11:41:09 BRT 2011
Password expiration date: [none]
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 90 days 00:00:00
Last modified: Mon Oct 10 11:41:09 BRT 2011 (root/admin@DOUGLASQSANTOS.COM.BR)
Last successful authentication: Mon Oct 10 11:52:11 BRT 2011
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 1, AES-256 CTS mode with 96-bit SHA-1 HMAC, no salt
Key: vno 1, ArcFour with HMAC/md5, no salt
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Key: vno 1, DES cbc mode with RSA-MD5, Version 4
Key: vno 1, DES cbc mode with RSA-MD5, Version 5 - No Realm
Key: vno 1, DES cbc mode with RSA-MD5, Version 5 - Realm Only
Key: vno 1, DES cbc mode with RSA-MD5, AFS version 3
MKey: vno 1
Attributes: REQUIRES_PRE_AUTH
Policy: [none]

Vamos ver como deletamos um host

#Comando que deleta um host
kadmin:  delprinc host/kdc1.douglasqsantos.com.br
Are you sure you want to delete the principal "host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR"? (yes/no): yes
Principal "host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR" deleted.
Make sure that you have removed this principal from all ACLs before reusing.

Vamos adicionar o nosso host novamente

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@DOUGLASQSANTOS.COM.BR: #informe a senha do admin
#Agora vamos criar um host no kerberos
kadmin:  addprinc -randkey host/kdc1.douglasqsantos.com.br
WARNING: no policy specified for host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR; defaulting to no policy
Principal "host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR" created.
#Agora vamos adicionar o host ao keytab
kadmin:  ktadd host/kdc1.douglasqsantos.com.br
Entry for principal host/kdc1.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/kdc1.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.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/kdc1.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Vamos listar a base do kerberos para verificar a exclusão

kadmin:  listprincs
K/M@DOUGLASQSANTOS.COM.BR
admin@DOUGLASQSANTOS.COM.BR
kadmin/admin@DOUGLASQSANTOS.COM.BR
kadmin/changepw@DOUGLASQSANTOS.COM.BR
kadmin/history@DOUGLASQSANTOS.COM.BR
kadmin/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora vamos verificar como adicionamos mais um usuário na base

kadmin:  addprinc douglas
WARNING: no policy specified for douglas@DOUGLASQSANTOS.COM.BR; defaulting to no policy
Enter password for principal "douglas@DOUGLASQSANTOS.COM.BR":  #informe a senha
Re-enter password for principal "douglas@DOUGLASQSANTOS.COM.BR": #informe a senha
Principal "douglas@DOUGLASQSANTOS.COM.BR" created.

Vamos listar a base novamente para verificar a criação do novo usuário

kadmin: listprincs
K/M@DOUGLASQSANTOS.COM.BR
admin@DOUGLASQSANTOS.COM.BR
douglas@DOUGLASQSANTOS.COM.BR
host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
kadmin/admin@DOUGLASQSANTOS.COM.BR
kadmin/changepw@DOUGLASQSANTOS.COM.BR
kadmin/history@DOUGLASQSANTOS.COM.BR
kadmin/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Vamos mudar o tempo de vida padrão de um ticket

kadmin:  modprinc -maxlife "100 day" douglas
Principal "douglas@DOUGLASQSANTOS.COM.BR" modified.

Vamos vamos listar o ticket

kadmin:  getprinc douglas
Principal: douglas@DOUGLASQSANTOS.COM.BR
Expiration date: [never]
Last password change: Wed Sep 28 11:57:30 BRT 2011
Password expiration date: [none]
Maximum ticket life: 100 days 00:00:00
Maximum renewable life: 90 days 00:00:00
Last modified: Wed Sep 28 12:00:30 BRT 2011 (admin@DOUGLASQSANTOS.COM.BR)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 1, AES-256 CTS mode with 96-bit SHA-1 HMAC, no salt
Key: vno 1, ArcFour with HMAC/md5, no salt
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Key: vno 1, DES cbc mode with RSA-MD5, Version 4
Key: vno 1, DES cbc mode with RSA-MD5, Version 5 - No Realm
Key: vno 1, DES cbc mode with RSA-MD5, Version 5 - Realm Only
Key: vno 1, DES cbc mode with RSA-MD5, AFS version 3
MKey: vno 1
Attributes: REQUIRES_PRE_AUTH
Policy: [none]

Remover uma maquina do keytab

kadmin:  ktrem host/kdc1.douglasqsantos.com.br
Entry for principal host/kdc1.douglasqsantos.com.br with kvno 3 removed from keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.douglasqsantos.com.br with kvno 3 removed from keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.douglasqsantos.com.br with kvno 3 removed from keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.douglasqsantos.com.br with kvno 3 removed from keytab WRFILE:/etc/krb5.keytab.

Agora adicione ele novamente no keytab

#Agora vamos adicionar o host ao keytab
kadmin:  ktadd host/kdc1.douglasqsantos.com.br
Entry for principal host/kdc1.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/kdc1.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc1.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/kdc1.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.

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:

OBS: Para utilizar o ssh o cliente tem que estar cadastrado tanto no domínio kerberos quanto na maquina Linux para castrar um cliente na maquina Linux podemos utilizar o comando useradd -m usuario e setar a senha dele com o comando passwd usuario, porém a senha utilizada vai ser a do kerberos para inicializar o ticket.

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 ssh

/etc/init.d/ssh restart

Vamos acertar o cliente

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

Agora temos que iniciar o ticket do root

kinit root
Password for root@DOUGLASQSANTOS.COM.BR: #informe a senha setada no kerberos

Vamos vamos ver se temos o ticket

klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
10/10/11 12:08:29  10/11/11 12:08:28  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora vamos logar note que temos que informar o nome da maquina que esta cadastrada no kerberos que é kdc1.douglasqsantos.com.br

ssh kdc1.douglasqsantos.com.br
Warning: Permanently added 'kdc1.douglasqsantos.com.br,10.0.0.25' (RSA) to the list of known hosts.
Linux kdc1 2.6.32-5-amd64 #1 SMP Mon Oct 3 03:59:20 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 Oct 10 11:23:05 2011 from 10.0.0.20
[12:09:20] root@kdc1 [~] # 

Vamos listar o nosso ticket

klist
Ticket cache: FILE:/tmp/krb5cc_0_LuZDtg1890
Default principal: root@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
10/10/11 12:09:20  10/11/11 12:08:28  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Como pode ser notado não foi preciso informar a senha pois o ssh foi validado com o ticket do kerberos, então para logar em outros clientes que estão no domínio vamos utilizar o mesmo ticket que foi criado com o kinit não precisando informar a senha novamente até que o prazo de validade do ticket acabe.

Agora vamos a configuração de um cliente para o domínio kerberos

Desabilitando 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.25       kdc1.douglasqsantos.com.br kdc1
10.0.0.26       kdc2.douglasqsantos.com.br kdc2
10.0.0.27       cliente.douglasqsantos.com.br cliente

Reiniciar o cliente

reboot

Agora vamos instalar alguns pacotes

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

Agora vamos instalar os pacotes para o cliente Kerberos

apt-get install krb5-{config,user} libpam-krb5 -y

Responder da seguinte forma

  1. DOUGLASQSANTOS.COM.BR
  2. kdc1.douglasqsantos.com.br kdc2.douglasqsantos.com.br
  3. kdc1.douglasqsantos.com.br

Agora ao arquivo de configuração krb5.conf

Vamos fazer backup do arquivo

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

Agora vamos acertar o arquivo deixe ele como abaixo

vim /etc/krb5.conf
[libdefaults]
        default_realm = DOUGLASQSANTOS.COM.BR
        forwardable = true
        proxiable = true

[realms]
        DOUGLASQSANTOS.COM.BR = {
                kdc = kdc1.douglasqsantos.com.br
                kdc = kdc2.douglasqsantos.com.br
                admin_server = kdc1.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 diretório para armazenar os logs

mkdir /var/log/krb5

Agora vamos configurar 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 cadastrar a maquina cliente no servidor kerberos.

No servidor kerberos

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@DOUGLASQSANTOS.COM.BR: #Senha admin
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 no cliente vamos adicionar a maquina no keytab

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 3, 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 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/cliente.douglasqsantos.com.br with kvno 3, 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 3, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Vamos listar as maquinas que estão no keytab do cliente

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

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 ssh

/etc/init.d/ssh restart

Vamos acertar o cliente

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

Vamos testar agora

Vamos criar um ticket para o root na maquina cliente

kinit root
Password for root@DOUGLASQSANTOS.COM.BR: #senha do root do kerberos

Vamos listar o nosso ticket

klist 
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
11/07/11 16:40:46  11/08/11 16:40:44  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora vamos conectar via ssh no servidor, no cliente então

ssh kdc1.douglasqsantos.com.br
Warning: Permanently added 'kdc1.douglasqsantos.com.br,10.0.0.25' (RSA) to the list of known hosts.
Linux kdc1 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 16:26:27 2011 from kdc1.douglasqsantos.com.br
[16:41:27] root@kdc1 [~] # 

Como pode ser notado conexão do cliente para o servidor esta ok

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

ssh cliente.douglasqsantos.com.br
Warning: Permanently added 'cliente.douglasqsantos.com.br,10.0.0.27' (RSA) to the list of known hosts.
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 16:31:46 2011 from 10.0.0.20
[16:42:39] root@cliente [~] # 

Conexão ok do servidor para o cliente também

OBS: Por definições da biblioteca de autenticação pam_krb5 o uid minimo para a conexão utilizando Kerberos é o 1000 ou seja usuários comuns cadastrados manualmente, pois os usuário de serviço do sistema tem o uid menor que 1000, pois caso tenhamos alguma pane na rede ficariamos sem conseguir autenticação caso todos os usuários fossem autenticados no Kerberos.

Agora vamos fazer mais um teste, vamos cadastrar um novo usuário no Linux e no Kerberos

Tem que cadastrar o usuário tanto no Linux do servidor quanto do cliente

useradd -m -s /bin/bash douglas

Agora vamos setar a senha para o novo usuário 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

Agora no cliente vamos efetuar uma conexão via ssh para o servidor sem criar um ticket antes

Vamos destruir os tickets ativos caso tenhamos algum

kdestroy

Vamos verificar agora

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

No servidor vamos fazer o mesmo procedimento

kdestroy

Vamos verificar

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

Agora no cliente vamos efetuar um acesso via ssh para o servidor kerberos

ssh kdc1.douglasqsantos.com.br -l douglas
Password: 
Linux kdc1 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.
You have new mail.
douglas@kdc1:~$ 

Agora vamos listar os tickets

klist 
Ticket cache: FILE:/tmp/krb5cc_1000_NI1970
Default principal: douglas@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
11/07/11 16:52:42  11/08/11 16:52:42  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Vamos verificar agora no servidor como que foi efetuada a conexão

tail -f /var/log/auth.log 
Nov  7 16:52:01 kdc1 sshd[1941]: pam_krb5(sshd:auth): user douglas authenticated as douglas@DOUGLASQSANTOS.COM.BR
Nov  7 16:52:01 kdc1 sshd[1939]: Accepted keyboard-interactive/pam for douglas from 10.0.0.27 port 37507 ssh2
Nov  7 16:52:01 kdc1 sshd[1939]: pam_unix(sshd:session): session opened for user douglas by (uid=0)
Nov  7 16:52:24 kdc1 sshd[1943]: Received disconnect from 10.0.0.27: 11: disconnected by user
Nov  7 16:52:24 kdc1 sshd[1939]: pam_unix(sshd:session): session closed for user douglas
Nov  7 16:52:42 kdc1 sshd[1972]: pam_krb5(sshd:auth): user douglas authenticated as douglas@DOUGLASQSANTOS.COM.BR
Nov  7 16:52:42 kdc1 sshd[1970]: Accepted keyboard-interactive/pam for douglas from 10.0.0.27 port 37508 ssh2
Nov  7 16:52:42 kdc1 sshd[1970]: pam_unix(sshd:session): session opened for user douglas by (uid=0)
Nov  7 16:53:09 kdc1 sshd[1973]: Received disconnect from 10.0.0.27: 11: disconnected by user
Nov  7 16:53:09 kdc1 sshd[1970]: pam_unix(sshd:session): session closed for user douglas

Como o uid do usuário douglas é maior que 1000 foi utilizado o kerberos para a autentição, nós já tinhamos cadastrado o usuário tanto no sistema como no kerberos o login foi efetuado corretamente

Agora vamos a configuração do servidor slave

Vamos instalar alguns pacotes necessários

apt-get install ssh ntp ntpdate xinetd nmap -y

Agora vamos ver se estamos conseguindo vizualizar o servidor master

nmap -sT -p T:749,754 kdc1.douglasqsantos.com.br

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 16:55 BRST
Interesting ports on kdc1.douglasqsantos.com.br (10.0.0.25):
PORT    STATE SERVICE
749/tcp open  kerberos-adm
754/tcp open  krb_prop
MAC Address: 08:00:27:C5:C8:32 (Cadmus Computer Systems)

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

Agora vamos instalar o pacote para a configuração do cliente

apt-get install krb5-user -y
#Responda da seguinte forma
1) DOUGLASQSANTOS.COM.BR
2) kdc1.douglasqsantos.com.br kdc2.douglasqsantos.com.br
3) kdc1.douglasqsantos.com.br

Vamos agora acertar o krb5

vim /etc/krb5.conf
[libdefaults]
        default_realm = DOUGLASQSANTOS.COM.BR
        forwardable = true
        proxiable = true

[realms]
        DOUGLASQSANTOS.COM.BR = {
                kdc = kdc1.douglasqsantos.com.br
                kdc = kdc2.douglasqsantos.com.br
                admin_server = kdc1.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 acertar o diretorio de logs

mkdir /var/log/krb5

Agora vamos acertar o logrotate

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 cadastrar o nosso host na base kerberos no servidor master

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@DOUGLASQSANTOS.COM.BR:
kadmin:  addprinc -randkey host/kdc2.douglasqsantos.com.br
WARNING: no policy specified for host/kdc2.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR; defaulting to no policy
Principal "host/kdc2.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR" created.
kadmin:  ktadd host/kdc2.douglasqsantos.com.br
Entry for principal host/kdc2.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/kdc2.douglasqsantos.com.br with kvno 2, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/kdc2.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/kdc2.douglasqsantos.com.br with kvno 2, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:  q

Agora adicionar o host kdc2 no keytab do servidor slave

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

Podemos listar as chaves em nosso keytab no servidor master com o seguinte comando

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

Agora vamos instalar o kdc no servidor slave

apt-get install krb5-kdc -y

Agora vamos acertar o xinetd para podermos propagar a base

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 serviço do kerberos

/etc/init.d/xinetd restart

Agora vamos ver se o serviço esta respondendo

nmap -sT -p T:754 localhost

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 17:05 BRST
Interesting ports on localhost (127.0.0.1):
PORT    STATE SERVICE
754/tcp open  krb_prop

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

Agora temos que acertar as acls nos dois servidores kerberos

vim /etc/krb5kdc/kpropd.acl
host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
host/kdc2.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR

Agora vamos acertar a propagação da base primeiro vamos acertar o tempo de vida dos tickets

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

Agora no servidor kdc1 vamos fazer um dump da base

kdb5_util dump /var/lib/krb5kdc/slave_datatrans

Agora no servidor master vamos propagar a base

kprop kdc2.douglasqsantos.com.br
Database propagation to kdc2.douglasqsantos.com.br: SUCCEEDED

Agora vamos voltar ao servidor kdc2 e vamos criar o stash

kdb5_util stash
kdb5_util: Can not fetch master key (error: No such file or directory). while reading master key
kdb5_util: Warning: proceeding without master key
Enter KDC database master key: #senha do master

Agora vamos iniciar o servidor kerberos kdc no slave

/etc/init.d/krb5-kdc start

Agora vamos ver se as portas estão escutando

nmap -sU -sT -p U:88,464,750,T:464,749,754 localhost

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-07 17:11 BRST
Interesting ports on localhost (127.0.0.1):
PORT    STATE         SERVICE
464/tcp closed        kpasswd5
749/tcp closed        kerberos-adm
754/tcp open          krb_prop
88/udp  open|filtered kerberos-sec
464/udp closed        kpasswd5
750/udp open|filtered kerberos

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

Como pode ser notado o kpasswd5 e o kerberos-admin não estão habilitados nese servidor, por que o kerberos admin não esta instalado nesse servidor então a base do kerberos no servidor slave é somente leitura

Agora vamos criar um arquivo de replicação da base no servidor master

vim /etc/cron.hourly/krb5-prop
#!/bin/sh

slave="kdc2.douglasqsantos.com.br"

/usr/sbin/kdb5_util dump /var/lib/krb5kdc/slave_datatrans
erro=$?

if [ $erro -ne 0 ]; then

        echo "O dump da base Kerberos falhou"
        echo "com o codigo de erro: $error."
        exit 1
else
        echo "O dump da base Kerberos foi efetuado com exito"
fi

for kdc in $slave; do

        /usr/sbin/kprop $kdc > /dev/null
        erro=$?

        if [ $erro -ne 0 ]; then

                echo "Propagando a base para o host: $kdc"
                echo "Falhou codigo de erro: $error."
        else
                echo "A propagação da base para o host: $kdc"
                echo "foi efetuada com sucesso"
        fi

done

exit 0

Agora vamos acertar as permissões do nosso script

chmod 755 /etc/cron.hourly/krb5-prop

Vamos testar a replicação

/etc/cron.hourly/krb5-prop
O dump da base Kerberos foi efetuado com exito
A propagação da base para o host: kdc2.douglasqsantos.com.br
foi efetuada com sucesso

Caso haja necessidade de habilitar o kerberos admin no servidor slave deve ser efetuado da seguinte forma

No servidor master vamos parar o serviço

/etc/init.d/krb5-admin-server stop

Agora vamos desabilitar a proparação da base para o slave

mv /etc/cron.hourly/krb5-prop ~/

Vamos executar a última replicação

~/krb5-prop

Agora vamos instalar o kerberos admin no servidor slave

apt-get install krb5-admin-server -y

Agora vamos vamos acertar as acls no slave

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

Agora vamos criar um arquivo de replicação da base no servidor master

vim /etc/cron.hourly/krb5-prop
#!/bin/sh

slave="kdc1.douglasqsantos.com.br"

/usr/sbin/kdb5_util dump /var/lib/krb5kdc/slave_datatrans
erro=$?

if [ $erro -ne 0 ]; then

        echo "O dump da base Kerberos falhou"
        echo "com o codigo de erro: $error."
        exit 1
else
        echo "O dump da base Kerberos foi efetuado com exito"
fi

for kdc in $slave; do

        /usr/sbin/kprop $kdc > /dev/null
        erro=$?

        if [ $erro -ne 0 ]; then

                echo "Propagando a base para o host: $kdc"
                echo "Falhou codigo de erro: $error."
        else
                echo "A propagação da base para o host: $kdc"
                echo "foi efetuada com sucesso"
        fi

done

exit 0

Agora vamos acertar as permissões do nosso script

chmod 755 /etc/cron.hourly/krb5-prop

Vamos testar a propagação

/etc/cron.hourly/krb5-prop 
O dump da base Kerberos foi efetuado com exito
A propagação da base para o host: kdc1.douglasqsantos.com.br
foi efetuada com sucesso

Agora podemos mudar o /etc/krb5.conf dos clientes como abaixo

vim /etc/krb5.conf
[libdefaults]
        default_realm = DOUGLASQSANTOS.COM.BR
        forwardable = true
        proxiable = true

[realms]
        DOUGLASQSANTOS.COM.BR = {
                kdc = kdc1.douglasqsantos.com.br
                kdc = kdc2.douglasqsantos.com.br
                admin_server = kdc2.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 reiniciar os serviços

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

Vamos fazer um teste de conexão com o novo server-admin

kadmin -p admin
Authenticating as principal admin with password.
Password for admin@DOUGLASQSANTOS.COM.BR:
kadmin:  listprincs
K/M@DOUGLASQSANTOS.COM.BR
admin@DOUGLASQSANTOS.COM.BR
douglas@DOUGLASQSANTOS.COM.BR
host/cliente.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
host/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
host/kdc2.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
kadmin/admin@DOUGLASQSANTOS.COM.BR
kadmin/changepw@DOUGLASQSANTOS.COM.BR
kadmin/history@DOUGLASQSANTOS.COM.BR
kadmin/kdc1.douglasqsantos.com.br@DOUGLASQSANTOS.COM.BR
krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR
root@DOUGLASQSANTOS.COM.BR
kadmin: q

Referências