Servidor Kerberos em Debian Squeeze

INTRODUÇÃO

Um dos grandes problemas ao implementar um sistema de segurança em uma organização é a parte interna da rede. E não a parte externa ou a internet, como muitas pessoas pensam. Para as conexões externas existem vários softwares e técnicas que implementam firewalls e proxies seguros. Mas para a rede interna da organização é mais complicado, pois neste ambiente estamos trabalhando com pessoas ligadas à organização e desta forma confiáveis.

Por descuido ou por vontade própria uma pessoa da organização pode instalar um software malicioso que libere acesso para fora da rede, deixando a rede interna, seus servidores e demais hosts desprotegidos. Ou, este software pode ser algum tipo de spyware, que mande informações sigilosas para fora da organização. Para evitar esse tipo de software e controlar este tipo de usuário descuidado pode-se utilizar o Kerberos.

A primeira seção deste artigo trata dos conceitos relacionados ao Kerberos. A segunda seção discute um pouco o conceito de segurança abordado pelo Kerberos. Na seção 3 são abordadas as decisões de configuração do sistema. A seção 4 aborda a configuração do Kerberos em uma rede e a seção 5 discute sobre a utilização do Kerberos pelos usuários da rede. Finalizando com a seção 5 e as conclusões sobre a utilização do Kerberos.

KERBEROS

Kerberos é um sistema de autenticação que permite usuários utilizarem serviços de rede se identificando e autenticando em tempo real, utilizando um sistema seguro e criptografado.

Em um sistema convencional é requerida ao usuário uma identificação e que este usuário autentique esta identificação antes da utilização do sistema. Uma rede que conecta possíveis clientes a serviços por ela providos também precisa identificar e autenticar estes clientes, que podem ser usuários ou softwares.

O problema é que muitos serviços de rede aceitam sem questionar a autenticação provida pela máquina cliente, que está sobre total domínio do usuário. E um serviço seguro de rede não pode confiar na integridade da autenticação provida por uma máquina cliente.

Com o Kerberos, toda vez que um possível cliente for utilizar um serviço da rede, ele vai questionar sua identidade e a respectiva autenticação, permitindo ou não o uso do serviço pelo cliente. Além disso, Kerberos provê um meio criptografado de comunicação, mesmo em uma rede não segura, como a internet.

AUTÊNTICAÇÃO KERBEROS

O sistema de autenticação Kerberos é baseado no protocolo de autenticação de três vias e foi desenvolvido pelos membros do projeto Athena no MIT (Massachusetts Institute of Technology).

O Kerberos prove aos usuários ou serviços “ticket” que são utilizados para a identificação e chaves criptografadas para comunicação pela rede.

O Kerberos é usualmente utilizado na camada de aplicação, provendo a segurança entre o usuário e o host. Mas também pode ser usado para prover segurança entre hosts, trabalhando com os protocolos IP, TCP e UDP.

Em uma rede com Kerberos é definido um host, denominado Servidor de Autenticação, que centraliza as funções administrativas do Kerberos e é onde também está o Centro de Distribuição de Chaves (KDC). Este servidor mantém uma base de dados com todas senhas secretas dos usuários. Sendo que ele é o responsável por gerar os tickets quando dois usuários desejam se comunicar através de um meio seguro, identificando e autenticando estes usuários.

DISTRIBUIÇÃO DE TICKET

Quando um cliente, que pode ser um usuário ou um serviço, faz um requerimento por um “ticket” para o Centro de Distribuição de Chaves (KDC), esse cria um “ticket granting ticket” (TGT) para o cliente e o criptografa utilizando a senha secreta do usuário. Após isso, o KDC envia o TGT criptografado para o cliente. O cliente descriptografa o TGT com sua senha secreta, garantindo a sua identidade.

O ticket expira de tempos em tempos. O Kerberos permite que o cliente obtenha um outro ticket, permitindo-o continuar a utilizar o serviço. Estes requerimentos adicionais de ticket são transparentes para o usuário.

PRINCIPAL

Principal é um termo do Kerberos que define uma entidade, ou seja, um usuário ou um serviço por meio de um endereço. Este endereço é comumente dividido em três partes: a primeira parte contém o nome do usuário ou do serviço, a segunda parte contém o nome do host ou nada quando se trata de um usuário e a terceira parte contém o nome do realm.

host/servico.empresab.br@SERVIDOR.EMPRESAB.BR

REDE KERBEROS

Kerberos divide a rede em domínios seguros, denominados “realms”. Cada realm tem seu servidor de autenticação e uma política de segurança própria. Isso permite que uma organização defina diferentes níveis de segurança, se assim desejar. A divisão dos realms também pode ser hierárquica, permitindo que cada área da organização possua um realm local vinculado ao realm central.

Essa hierarquia fica transparente para o usuário. Por exemplo, se um usuário autenticado no realm FINANCEIRO.EMPRESAA.COM requerer comunicação com o realm PESSOAL.EMPRESAA.COM, ele não precisa se autenticar novamente. A identidade do usuário é passada entre os realms internos ao realm pai EMPRESAA.

Mas se um usuário autenticado na EMPRESAA.COM for utilizar um serviço ou informação do realm SERVICO.EMPRESAB.BR, o Kerberos requer uma nova autenticação ao usuário da EMPRESAA.COM. Para que essa comunicação ocorra, as duas organizações tem que trocar chaves criptografadas dos servidores de chave. Desta forma é estabelecida uma comunicação segura através da internet, entre as duas organizações.

SEGURANÇA

Kerberos não é um sistema de segurança completo. Ele implementa três itens de segurança: autenticação, autorização e administração de contas. Sendo que a segurança destes é garantida através de criptografia.

AUTENTICAÇÃO

Qualquer usuário pode requerer uma identificação. Mas para que isso ocorra, o Kerberos requer sua senha secreta para que o usuário possa se autenticar no sistema. Este sistema pode ficar mais robusto se for provido “tokens” aos usuários. Estes tokens são hardwares específicos que contém uma string criptografada, por usuário. O sistema também pode fazer leitura biométrica do usuário, impressão digital, escaneamento de íris. Todas esses métodos são métodos de garantir a autenticação do usuário, ou seja, garantir que o usuário é quem ele está falando que é.

AUTORIZAÇÃO

Após a autenticação o sistema, o usuário é conhecido por uma ID. Neste ponto o Kerberos deve verificar este ID tem autorização para utilizar o serviço requerido.

ADMINISTRAÇÃO DE COTAS

O sistema de contas permite que possa ser feita auditoria dos acessos dos usuários. Isso é importante, pois em caso de invasão ou roubo de informações, fica mais fácil saber quem foi o responsável por esta ação, já que cada usuário é responsável por suas ações.

Decisões do sistema Como em todo sistema de segurança, antes de instalar o Kerberos é necessário definir algumas diretrizes.

NOME(S) DO(S) REALM(S)

Convenciona-se utilizar o mesmo nome do domínio em caixa alta para o realm. Se existirem mais de um realm, é aconselhado utilizar nomes descritivos para os realms filhos.

MAPEAMENTO DOS HOSTNAMES

O método mais seguro de mapear os hostnames nos realms é setando as regras no arquivo de configuração krb5.conf. O mapeamento pode ser feito por domínios ou subdomínios inteiros ou para cada hostname.

PORTAS DE ACESSO

A porta padrão utilizada pelo Kerberos v5 é a porta 88 para o KDC, a porta 749 para o servidor de administrador e a porta 754 para o servidor de propagação. Para a versão 4 do Kerberos é utilizada a porta 750 para o KDC e a porta 751 para o servidor de administrador.

KDC'S ESCRAVOS

KDC's escravos são úteis para auxiliar o KDC mestre a prover ticket ou até mesmo se o KDC mestre estiver inacessível. O número de KDC's escravos e a sua localização vão depender da rede em que eles atuarão.

Toda requisição de autenticação na rede será feita a um KDC, desta forma os hosts responsáveis por este serviço são muito acessados, sendo aconselhado ter pelo menos um KDC escravo para auxiliar o KDC mestre ou mesmo para ser utilizado como backup, caso o KDC mestre fique inalcançável por qualquer motivo.

HOSTNAMES PARA KDC'S

Normalmente se utilizam nomes semelhantes aos apelidos de DNS, por exemplo, Kerberos para o KDC mestre e Kerberos_1, Kerberos_2 e etc para os KDC's escravos.

No Kerberos V5 foi adicionado um mecanismo de localizar KDC's por DNS, através do parâmetro SRV do DNS. Esse parâmetro indica o nome do host e o número da porta do serviço, quando a localização for feita por nome de serviço e nome do domínio.

Utilizando este serviço de localização de nomes, o SRV, o nome de domínio utilizado é semelhante ao nome do realm. Isto é útil para utilização do Kerberos em ambientes fora da rede interna da organização, como na Internet.

Alguns nomes de serviços internos do Kerberos:

  • _kerberos._udp: Utilizado para contatar o KDC através de conexão UDP. Este é o tipo de conexão padrão e a conexão é feita pela porta 88 dos KDC's.
  • _kerberos._tcp: Para contatar um KDC através de conexão TCP. Por padrão o KDC do MIT não ouve conexões TCP's. Este serviço é utilizado se for utilizado um outro KDC. Esta conexão é estabelecida pela porta 88 TCP.
  • _kerberos-master._udp: Este serviço é utilizado para contatar o KDC mestre diretamente no caso do usuário estiver logando e sua senha secreta não for aceita porque o KDC que ele se refere normalmente ainda não tiver a base de dados atualizada. Se na rede existir somente um KDC, ou se o KDC mais próximo estiver atualizando a base de dados, este serviço não deve ser utilizado.
  • _kerberos-adm._tcp: Utilizado pelo programa kadmin, escuta a porta 749 no KDC mestre.
  • _kpasswd._udp: Utilizado para mudar senhas secretas, escuta a porta 464 no KDC mestre.
  • _kerberos-iv._udp: Refere-se aos KDC's do Kerberos v4, se este estiver habilitado.

PROPAGAÇÃO DA BASE DE DADOS

A base de dados central do Kerberos fica armazenada no KDC mestre e deve ser propagada regularmente para os KDC's escravos. Este tempo de propagação pode ser definido no KDC mestre através de um “cron job”. E deve ser feita toda vez que a base de dados for atualizada, por exemplo, ao alterar uma senha de usuário.

Se a base de dados for muito grande ou existirem muitos KDC's escravos, tornando o processo de propagação muito pesado para a rede, esta propagação pode ser feita aos poucos, onde o KDC mestre envia a base de dados para um grupo de KDC's escravos e estes reenviam para o restante dos KDC's escravos, em blocos.

INSTALAÇÃO

Agora que já temos uma ideia de como o Kerberos funciona vamos fazer a implementação dele no Debian Squeeze.

Agora vamos fazer alguns acertos para o nosso teste

  1. Vamos desabilitar o ipv6
  2. Vamos definir o nome da maquina como kdc1
  3. Vamos definir o endereço ip da maquina como 10.0.0.23

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.

Desabilitar o ipv6.

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

Vamos acertar o nome da maquina

vim /etc/hostname
kdc1

Agora vamos acertar o /etc/hosts

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

Vamos reiniciar o servidor

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.23' (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.23       kdc1.douglasqsantos.com.br kdc1
10.0.0.22       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
  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
                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.

Na maquina cliente.

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

No master vamos acertar o /etc/hosts

vim /etc/hosts
127.0.0.1       localhost
10.0.0.23       kdc1.douglasqsantos.com.br kdc1
10.0.0.22       cliente.douglasqsantos.com.br      cliente

Vamos listar as maquinas que estão no keytab

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 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
10/10/11 14:09:56  10/11/11 14:09:54  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

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

[14:12:38] root@cliente [~] # ssh kdc1.douglasqsantos.com.br
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 14:12:11 2011 from 10.0.0.22
[14:14:25] 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

[14:13:34] root@kdc1 [~] # ssh cliente.douglasqsantos.com.br
Warning: Permanently added 'cliente.douglasqsantos.com.br,10.0.0.22' (RSA) to the list of known hosts.
Linux cliente 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 12:21:52 2011 from 10.0.0.20
[14:13:35] 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 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.
You have new mail.
Last login: Mon Oct 10 14:27:06 2011 from cliente.douglasqsantos.com.br
douglas@kdc1:~$ 

Agora vamos listar os tickets

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

Valid starting     Expires            Service principal
10/10/11 14:31:42  10/11/11 14:31: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
Oct 10 14:31:42 kdc1 sshd[2324]: pam_krb5(sshd:auth): user douglas authenticated as douglas@DOUGLASQSANTOS.COM.BR
Oct 10 14:31:42 kdc1 sshd[2322]: Accepted keyboard-interactive/pam for douglas from 10.0.0.22 port 60036 ssh2
Oct 10 14:31:42 kdc1 sshd[2322]: pam_unix(sshd:session): session opened for user douglas by (uid=0)

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

Configurando o SUDO

aptitude update && aptitude install sudo -y

Agora vamos efetuar testes de autenticação de usuário comum via ssh e mudar para o root no cliente

[16:29:36] root@cliente [~] # ssh kdc1.douglasqsantos.com.br -l douglas
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.
You have new mail.
Last login: Mon Oct 10 16:27:38 2011 from cliente.douglasqsantos.com.br
douglas@kdc1:~$ 

Agora vamos listar os tickets

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

Valid starting     Expires            Service principal
10/10/11 16:29:48  10/11/11 15:38:19  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Temos o ticket então vamos se logar como root pelo sudo

douglas@kdc1:~$ sudo su 
Password: #informe a senha do usuário comum

Agora vamos checar o ticket

[16:31:43] root@kdc1 [/home/douglas] # klist 
Ticket cache: FILE:/tmp/krb5cc_1000_crrrE29557
Default principal: douglas@DOUGLASQSANTOS.COM.BR

Valid starting     Expires            Service principal
10/10/11 16:31:40  10/11/11 15:38:19  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Note que o ticket foi gerado para o usuário douglas@DOUGLASQSANTOS.COM.BR mesmo nós logados com o usuário root

Agora vamos logar novamente via ssh porém vamos utilizar o sudo su - ou invés de sudo su

douglas@kdc1:~$ sudo su -
Password: #informe a senha do usuário comum

Agora vamos listar os tickets

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

Como pode ser notado não foi gerado o ticket para o usuário root quando informamos sudo su - ele carrega as variáveis de ambiente para o usuário root.

Vamos fazer uma modificação na PAM para que seja criado o ticket quando executarmos sudo su ou sudo su -

vim /etc/pam.d/su
#Começo do arquivo
auth    sufficient  pam_krb5.so

auth    sufficient pam_rootok.so

Agora vamos logar novamente e passar para o usuário root

sudo su 
Password: #informe a senha do usuario
Password: #informe novamente a senha do usuário

Agora vamos listar os tickets novamente

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

Valid starting     Expires            Service principal
10/10/11 16:45:47  10/11/11 16:45:47  krbtgt/DOUGLASQSANTOS.COM.BR@DOUGLASQSANTOS.COM.BR

Agora foi gerado o ticket do root porém tivemos que informar duas vezes a senha na primeira vez que foi informada a senha ele foi passada para o comando sudo na segunda vez que foi informada a senha foi passada para o comando su -

Agora vamos ver os logs em /var/log/auth.log

Este primeiro é a autenticação via ssh

Oct 10 16:45:32 kdc1 sshd[30094]: Authorized to douglas, krb5 principal douglas@DOUGLASQSANTOS.COM.BR (krb5_kuserok)
Oct 10 16:45:32 kdc1 sshd[30094]: Accepted gssapi-with-mic for douglas from 10.0.0.22 port 60132 ssh2
Oct 10 16:45:32 kdc1 sshd[30094]: pam_unix(sshd:session): session opened for user douglas by (uid=0)

Este segundo log é do comando sudo

Oct 10 16:45:41 kdc1 sudo: pam_krb5(sudo:auth): user douglas authenticated as douglas@DOUGLASQSANTOS.COM.BR
Oct 10 16:45:41 kdc1 sudo:  douglas : TTY=pts/1 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/su

Este terceiro log é do comando su

Oct 10 16:45:47 kdc1 su[30123]: pam_krb5(su:auth): user root authenticated as root@DOUGLASQSANTOS.COM.BR
Oct 10 16:45:47 kdc1 su[30123]: Successful su for root by root
Oct 10 16:45:47 kdc1 su[30123]: + /dev/pts/1 root:root
Oct 10 16:45:47 kdc1 su[30123]: pam_unix(su:session): session opened for user root by douglas(uid=0)

Referências