O Kerberos não é um cachorro de 3 cabeças!

Neste artigo procuro explicar de forma simples a estrutura do Kerberos, mostrando exemplos de cada etapa da configuração desse extraordinário sistema de segurança.

[ Hits: 135.829 ]

Por: Oscar Costa em 04/11/2005 | Blog: https://oscarcosta.dev/


Instalação e configuração



Como o Kerberos V5 é um serviço quase nativo do Linux e já vem instalado em muitas distribuições, a sua instalação não foi abordada neste artigo. Outro motivo é o fato desta ser diferente em cada distribuição do Linux ou ainda poder ser instalada via código fonte.

A configuração do Kerberos V5, como a maioria dos serviços disponíveis no Linux, é feita mediante a edição de arquivos de configuração, tanto nas máquinas servidoras, que irão disponibilizar o serviço, quanto nas máquinas clientes, que utilizarão o serviço.

5.1. KDC's


5.1.1. KDC mestre


Depois de definidas todas as "decisões pré-instalação", o primeiro passo para a configurar o Kerberos é editar os arquivos de configuração /etc/krb5.conf e /usr/local/var/krb5kdc/kdc.conf. Depois deve ser criada a base de dados e o arquivo acl.

5.1.1.1. krb5.conf


O arquivo krb5.conf contém informações de configuração do Kerberos, incluindo dados dos KDC's e Servidores de Administração para os "realms", definições sobre o "realm" atual, dados sobre as aplicações suportadas pelo Kerberos e o mapeamento dos nomes dos hosts dos "realms".

O arquivo krb5.conf por padrão se localiza em /etc, mas o local pode ser escolhido pelo administrador de segurança, desde que ele informe a localização do arquivo na variável de ambiente KRB5_CONFIG. Este arquivo é organizado por seções:
  • [libdefaults]: contém os valores padrão para p Kerberos V5;
  • [login]: contém valores utilizados pelo programa de login;
  • [appdefaults]: contém valores utilizados pelas aplicações suportadas pelo Kerberos;
  • [realms]: contém subseções referentes aos "realms". Essas seções descrevem informações específicas de cada realm;
  • [domain_realm]: contém as relações dos mapas de domínio e subdomínio. Utilizado pelos programas para determinar qual "realm" vai serví-lo;
  • [logging]: determina quais programas podem conectar ao Kerberos;
  • [capaths]: contém os caminhos de autenticação, usada para autenticação não hierárquica. Informa aos clientes os "realms" intermediários que podem ser utilizados para realizar a autenticação.

Exemplo de um arquivo krb5.conf:

[libdefaults]
      default_realm = SERVIDOR.EMPRESAA.COM

[realms]
      SERVIDOR.EMPESAA.COM = {
      master_kdc =  SERVIDOR.EMPESAA.COM
      kdc = PESSOAL.EMPRESAA.COM
      kdc = FINANCEIRO.EMPRESAA.COM
      default_domain = EMPRESAA.COM
      }
      SERVIDOR.EMPRESAB.BR = {
      master_kdc =  SERVIDOR.EMPESAB.BR
      kdc =  SERVICO.EMPESAB.BR
      }

[domain_realm]
      .empresaa.com = SERVIDOR.EMPESAA.COM
      empresaa.com = SERVIDOR.EMPESAA.COM
   .empresab.br = SERVIDOR.EMPESAB.COM        

[logging]
   kdc = SYSLOG:INFO    

5.1.1.2. kdc.conf


O arquivo kdc.conf contém informações sobre o KDC, incluindo os padrões utilizados para a distribuição de ticket. Este arquivo por padrão está localizado em /usr/local/var/krb5kdc, mas pode ser colocado em outro lugar, desde que a nova localização seja informada na variável de ambiente.

KRB5_KDC_PROFILE. O formato do arquivo kdc.conf se assemelha ao arquivo krb5.conf:
  • [kdcdefaults]: contém valores sobre o KDC;
  • [realms]: contém subseções com os nomes dos "realms". Cada seção descreve informações específicas sobre cada realm, incluindo a localização do servidor Kerberos daquele "realm";
  • [logging]: define quais programas podem se conectar ao Kerberos.

Exemplo de um arquivo kdc.conf:

[kdcdefaults]
   kdc_ports = 88

[realms]
   SERVIDOR.EMPRESAA.COM = {
      kadmind_port = 749
         max_life = 8h 0m 0s
      max_renewable_life = 5d 0h 0m 0s
      master_key_type = des3-hmac-sha1
      supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal des-cbc-crc:v4
   }

[logging]
   kdc = FILE:/usr/local/var/krb5kdc/kdc.log
   admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log

5.1.1.3. Base de dados no KDC mestre


A base de dados do KDC mestre pode ser criada através do comando kdb5_util. Pode ser criado o arquivo "stash", passando o parâmetro -s na linha de comando. O arquivo "stash" é uma cópia local da chave mestre dos KDC's locais e é utilizada para autenticação do próprio KDC antes de iniciar os daemons "kadmind" e krb5kdc.

Como o arquivo de keytab, o arquivo stash é um ponto de segurança crítico do sistema Kerberos, pois contém dados de acesso. O stask, como o keytab, deve ser mantido somente no disco local do KDC ao qual ele pertence e protegido contra todos.

O primeiro dado que o programa kdb5_util requer é a senha mestre da base de dados. Esta senha, como qualquer outra senha de serviços críticos, deve ser difícil de ser descoberta, devendo conter letras maiúsculas, minúsculas, números e caracteres especiais. Deve ser difícil a ponto de ninguém descobrir e não difícil de ser lembrada.

Exemplo de criação da base de dados com o comando kdb5_util:

# kdb5_util create -r SERVIDOR.EMPRESAA.COM -s
     Initializing database '/usr/local/var/krb5kdc/principal' for
     => realm 'SERVIDOR.EMPRESAA.COM',
     master key name 'K/M@SERVIDOR.EMPRESAA.COM'
     You will be prompted for the database Master Password.
     It is important that you NOT FORGET this password.
     Enter KDC database master key:  
     Re-enter KDC database master key to verify:  

A criação da base de dados irá criar cinco arquivos no diretório especificado no arquivo kdc.conf. Dois arquivo da base de dados (principal.db e principal.ok), um arquivo de configuração (principal.kadm5), o arquivo anterior protegido (principal.kadm5.lock) e o arquivo stash (.k5stash). O diretório padrão para criação da base de dados é /usr/local/var/krb5kdc.

5.1.1.4. ACL


O próximo passo é configurar o arquivo de Lista de Controle de Acesso (acl) e colocar os programas administrativos e suas permissões neste arquivo.

O nome deste arquivo é definido pela diretiva "acl_file" no arquivo kdc.conf. Por padrão o nome do arquivo acl é kadm5.acl e está localizado na pasta /usr/local/var/krb5kdc.

O formato do arquivo acl é:

Kerberos_principal   permissões   [alvo_do_principal]   [restrições]

As permissões são representadas por letras minúsculas e letras maiúsculas representam permissão negada:
  • a : permite a adição na base de dados;
  • A : nega a adição na base de dados;
  • d : permite a exclusão da base de dados;
  • D : nega a exclusão da base de dados;
  • m : permite a modificação na base de dados;
  • M : nega a modificação na base de dados;
  • c : permite a mudança de senha na base de dados;
  • C : nega a mudança de senha na base de dados;
  • i : permite indagar a base de dados;
  • I : não permite indagar a base de dados;
  • l : permite listagem da base de dados;
  • L : não permite listagem da base de dados;
  • s : permite setar uma chave para um principal;
  • S : não permite setar uma chave para um principal;
  • * : Todos privilégios;
  • x : mesmo que *.

Todas as permissões são referentes aos principals ou regras precedidas à elas.

As restrições são cadeias de "flags":
  • [+ -]flagname : <checar>;
  • -clearpolicy : a regra é apagada;
  • -policy pol : a regra é obedecida;
  • expire time, pwexpire time, maxlife time, maxrenewlife time : associados ao tempo de requisição;

Os flags de restrição atuam sobre operações de adicionar ou modificar em cada linha do arquivo acl. Exemplo do arquivo kadm5.acl:

*/*@EMPRESAA.COM ADMCILS #nega tudo
*/admin@EMPRESAA.COM *
admin/*@EMPRESAA.COM cil */root@EMPRESAA.COM
*/*@EMPRESAA.COM il

5.1.1.5. Adição de programas na base de dados


O último passo antes de inicializar os daemons no KDC mestre é adicionar os programas administrativos na base de dados do Kerberos. O programa encarregado de fazer isso é o kadmin.local. Os programas que devem ser criados neste ponto são os mesmos criados no item anterior [6.1.1.4]. Exemplo de criação do admin/admin:

# kadmin.local
kadmin.local: addprinc admin/admin@EMPRESAA.COM
NOTICE: no policy specified for "admin/admin@EMPRESAA.COM";
assigning "default".
Enter password for principal admin/admin@ATHENA.MIT.EDU:
Re-enter password for principal admin/admin@ATHENA.MIT.EDU:
Principal "admin/admin@EMPRESAA.COM" created.

5.1.1.6. Daemons do KDC mestre


Após ter feita toda a configuração do KDC mestre, é hora de inicializar os daemons:

# /usr/local/sbin/krb5kdc
# /usr/local/sbin/kadmind


Os daemons são executados em "background". Para automatizar a inicialização dos daemons do Kerberos na inicialização da máquina, os daemons podem ser chamados nos arquivos /etc/rc ou /etc/inittab. Mas para isso o arquivo stash deve ser criado.

Para verificar se os daemons foram iniciados corretamente, deve-se verificar os arquivos de log. Estes devem ser definidos no arquivo krb5.conf.

5.1.2. KDC's escravos


Para os KDC's escravos devem ser feitos os seguintes passos: criar chaves para cada KDC escravo, adicionar os arquivos keytabs para cada KDC, configurar os KDC's para propagação da base de dados e criar os arquivos stash. Estes passos são detalhes nos itens seguintes.

5.1.2.1. Criação de chaves nos KDC's escravos


Cada KDC necessita de um host principal na base de dados do Kerberos. Esta chave pode ser criada em qualquer host, desde que o daemon kadmind esteja funcionando.

Exemplo de criação das chaves:

# kadmin
kadmin: addprinc -randkey host/kerberos.empresaa.com
NOTICE: no policy specified for "host/kerberos.empresaa.com@SERVIDOR.EMPRESAA.COM";
assigning "default"
Principal "host/kerberos.empresaa.com@SERVIDOR.EMPRESAA.COM" created.
kadmin: addprinc -randkey host/kerberos-1.empresaa.com
NOTICE: no policy specified for "host/kerberos-1.empresaa.com@SERVIDOR.EMPRESAA.COM";
assigning "default"
Principal "host/kerberos-1.empresaa.com@SERVIDOR.EMPRESAA.COM" created.
kadmin: addprinc -randkey host/kerberos-2.empresaa.com
NOTICE: no policy specified for "host/kerberos-2.empresaa.com@SERVIDOR.EMPRESAA.COM";
assigning "default"
Principal "host/kerberos-2.empresaa.com@SERVIDOR.EMPRESAA.COM" created.

5.1.2.2. Adicionar o arquivo Keytab nos KDC's


Todos KDC's necessitam um arquivo keytab para decodificar os tickets. Se não for possível adicionar cada arquivo keytab localmente nos KDC's, pode ser utilizado uma sessão criptografada para adicionar estes arquivos.

Para extrair os arquivos keytab:

kadmin: ktadd host/kerberos.empresaa.com
kadmin: Entry for principal host/kerberos.empresaa.com@SERVIDOR.EMPRESAA.COM with kvno 1, encryption type DES-CBC-CRC added to keytab WRFILE:/etc/krb5.keytab. kadmin:


5.1.2.3. Configurando os KDC's para a propagação da base de dados


A base de dados é propagada do KDC mestre para os KDC's escravos através do daemon kpropd. Para que a propagação ocorra corretamente, deve-se criar o arquivo kpropd.acl no diretório /usr/local/krb5kdc contendo os principais para os KDC's.

Exemplo:

host/kerberos.empresaa.com@SERVIDOR.EMPRESAA.COM
host/kerberos-1.empresaa.com@SERVIDOR.EMPRESAA.COM
host/kerberos-2.empresaa.com@SERVIDOR.EMPRESAA.COM

Agora é necessário editar o arquivo /etc/initd.conf, acrescentando as seguintes linhas:

krb5_prop stream tcp nowait root /usr/local/sbin/kpropd kpropd
# Esta linha configura o daemon de propagação.

eklogin stream tcp nowait root /usr/local/sbin/klogind klogind -k -c -e
# Esta linha configura o daemon de login, que permite a
# autenticação via Kerberos para o KDC.

Deve-se verificar se as linhas referentes ao serviço Kerberos do arquivo /etc/services estão descomentadas:

kerberos        88/udp      kdc       # Kerberos authentication (udp)
kerberos        88/tcp      kdc       # Kerberos authentication (tcp)
krb5_prop       754/tcp               # Kerberos slave propagation
kerberos-adm    749/tcp               # Kerberos 5 admin/changepw (tcp)
kerberos-adm    749/udp               # Kerberos 5 admin/changepw (udp)
eklogin         2105/tcp              # Kerberos encrypted rlogin

5.1.2.4. Criando o arquivo stash nos KDC's escravos e inicializando o krb5kdc


Depois de feita a propagação da base de dados, pode ser criado o arquivo stash para cada KDC escravo e depois inicializado o daemon krb5kdc.

Para criar o arquivo stash nos KDC's escravos utiliza-se o comando:

# kdb5_util stash
kdb5_util: Cannot find/read stored master key while reading master key
kdb5_util: Warning: proceeding without master key
Enter KDC database master key: <= Enter the database master key.

Para iniciar o daemon krb5kdc nos KDC's:

# /usr/local/sbin/krb5kdc

Como no KDC mestre, é interessante acrescentar o comando krb5kdc no arquivo /etc/rc ou /etc/inittab, para que este daemon inicie na inicialização do sistema.

5.1.3. Propagação da Base de Dados


Após configurar os KDC's escravos, estes poderão receber a base de dados do KDC mestre. Para propagar a base de dados deve-se criar um "dump" da base de dados do KDC mestre:

# kdb4_util dump /usr/local/var/krb5kdc/slave_datatrans

Agora se deve realizar a propagação manualmente:

# kprop -f /usr/local/var/krb5kdc/slave_datatrans kerberos_1.empresaa.com
# kprop -f /usr/local/var/krb5kdc/slave_datatrans kerberos_2.empresaa.com


Esta propagação da base de dados do Kerberos pode ser automatizada com a criação de um script em bash. E para que a base de dados seja atualizada regularmente, deve-se criar um "cron job" para executar o script de atualização.

5.1.4. Configurações finais dos KDC's


Após a realizada a configuração dos KDC's, é preciso adicionar os "principals" à base de dados do Kerberos, para que os usuários da rede possam utilizar os serviços com o sistema de autenticação e com criptografia. Para adicionar "principals" à base de dados é utilizado o comando kadmin.

É possível limitar o acesso aos KDC's, para melhorar a segurança na rede. Pois são nos KDC's que estão guardados as senhas secretas e chaves do Kerberos e se estes dados caírem em mãos erradas, toda a organização poderá estar comprometida. Para realizar este limitamento, deve-se editar o arquivo /etc/inetd.conf:

# Exemplo de configuração para o arquivo /etc/inetd, limitando acesso ao KDC
#
# Serviços de sincronização
#

time    stream  tcp     nowait  root    internal
time    dgram   udp     wait    root    internal
#
# Serviços Kerberos limitados
#

krb5_prop stream tcp nowait root /usr/local/sbin/kpropd  kpropd
eklogin   stream tcp nowait root /usr/local/sbin/klogind klogind -5 -c -e

Outra configuração interessante que pode ser implementada é a possibilidade de utilizar algum KDC escravo como um KDC mestre, para caso do servidor do KDC mestre esteja "fora do ar" por motivos técnicos (upgrade, atualização de segurança, disk crash, etc). Para esta configuração "especial" deve-se assegurar que:

  • O servidor não esteja disponibilizando o serviço de KDC mestre, o processo kadmind não deve existir;
  • Os "cron jobs" de propagação de dados devem ser desabilitados;
  • A base de dados contida nos KDC's escravos deve ser a ultima versão da base de dados do KDC mestre;
  • Checados todos os itens acima, no novo KDC mestre deve ser feita as seguintes alterações:
    • Deve ser criado o arquivo keytab;
    • O daemon do kadmind deve ser inicializado;
    • Criar um "cron job" para propagar a base de dados;
    • Setar os CNAMEs do antigo e do novo KDC.

5.2. Máquinas cliente


A configuração das máquinas clientes é basicamente a checagem da existência dos programas cliente que utilizam Kerberos: login.krb5, rlogin, telnet, ftp, rcp, rsh, kinit, klist, kdestroy, kpasswd, ksu e krb524init. E se o caminho destes comandos se encontram no PATH dos usuários dessas máquinas.

Outra medida importante é a conscientização dos usuários para a utilização dos programas para requisição e manutenção dos tickets: kinit, klist, kestroy e os programas ksu e kpasswd em substituição aos comandos su e passwd.

Todas máquinas cliente devem ter o arquivo de configuração /etc/krb5.conf e o arquivo /etc/services deve estar com todos os serviços do Kerberos descomentados.

5.3. Servidores de aplicação


Os servidores de aplicação são hosts que provêem serviços na rede. Pode-se aumentar a segurança desses hosts utilizando conexão segura através do Kerberos. Como os clientes para serviços de redes citados anteriormente, os seus respectivos daemons também suportam o Kerberos, estes programas são: ftpd, klogind, kshd e telnetd.

Para implementar um servidor seguro, o arquivo /etc/inetd.conf deve ser editado, descomentando as linhas referentes aos serviços do Kerberos e comentando as linhas referentes aos serviços normais.

5.3.1. Arquivo Keytab


Os hosts que rodam servidores do Kerberos devem ter o arquivo /etc/krb5.keytab, para autenticar nos KDC's. Este arquivo é um arquivo que contém a chave do host criptografada. Por isso as permissões de acesso a este arquivo devem ser restritas à leitura do root e deve existir somente na máquina que o pertence.

O arquivo keytab é gerado pelo programa kadmin e chamando os servidores deste host pelo comando ktadd. Antes de criar o keytab é necessário inserir o host como principal na base de dados do KDC mestre.

Para gerar o arquivo keytab utiliza-se o kadmin, que é o programa de administração da base de dados do Kerberos e o comando ktadd, que é um comando do kadmin para adicionar um "principal" ou mais no arquivo keytab:

# kadmin.local
kadmin.local: ktadd -k /usr/local/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw
Entry for principal kadmin/admin with kvno 5, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab
WRFILE:/usr/local/var/krb5kdc/kadm5.keytab.
Entry for principal kadmin/admin with kvno 5, encryption type DES cbc mode         with CRC-32 added to keytab
WRFILE:/usr/local/var/krb5kdc/kadm5.keytab.
Entry for principal kadmin/changepw with kvno 5, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab
WRFILE:/usr/local/var/krb5kdc/kadm5.keytab.
Entry for principal kadmin/changepw with kvno 5, encryption type DES cbc mode with CRC-32 added to keytab
WRFILE:/usr/local/var/krb5kdc/kadm5.keytab.
kadmin.local: quit

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Kerberos
   3. Segurança
   4. Decisões do sistema
   5. Instalação e configuração
   6. Utilização
   7. Conclusões e Bibliografia
Outros artigos deste autor

Automatizando a montagem de partições Windows (FAT e NTFS) no Linux

SSH - Uma breve abordagem

A teoria por trás do firewall

Leitura recomendada

NTop - Configurações gerais

John The Ripper - Teste de Quebra de Senhas

Como instalar o Avast antivírus no Linux

Checando vulnerabilidades com o Nikto

Gaim + Gaim Encryption - Bate-papo com segurança

  
Comentários
[1] Comentário enviado por chavesfelipe em 04/11/2005 - 08:57h

Muito bom!!! Exelente!

[2] Comentário enviado por augusto_hp em 04/11/2005 - 11:58h

Caramba meu ... este é um artigo ímpar no VOL !! A deficiência de material sobre o kerberos é enorme, e quando existe é em uma linguagem praticamente inacessível ....excelente artigo kilocan ....

Acho que temos muito o que ganhar com este artigoão aqui !!! ;D

[3] Comentário enviado por removido em 04/11/2005 - 17:39h

nem doeu.....he...he...he...
;-))

[4] Comentário enviado por removido em 04/11/2005 - 23:04h

como disse augusto_hp, quando se acha algo sobre kerberos a linguagem é compreenssível apenas pelos "iniciados" e este artigo de qualidade contribui muito para o esclarecimento e implementação de rotinas de segurança tão inexistentes em nossas intranets e elevar ainda mais a qualidade do site.
parabéns.

[5] Comentário enviado por jeffestanislau em 05/11/2005 - 00:02h

Tá show de bola o artigo... bem esclarecedor!!!
Parabéns!!!

[]'s
Jefferson

[6] Comentário enviado por casterman em 06/11/2005 - 13:35h

Realmente parabéns pelo seu artigo, ta bem completo muito bom mesmo!!!

[7] Comentário enviado por cassao em 07/11/2005 - 11:44h

Bem legal, parabéns.
Mas só comentando o post do augusto_hp, tem muito material na net sobre o Kerberos cara... Em inglês tem bastante, em português tem menos, mas tem.

[8] Comentário enviado por forrest1777 em 17/03/2006 - 18:23h

Gostei muito desse artigo :P
bem esclarecedor, linguagem fácil de entender, nota 10!!

só to com um problema... o Kilocan citou o seguinte: "o programa de login pode ser adicionado a inicialização do sistema"
será que alguem poderia me dizer como fazer isso???
[]'s

[9] Comentário enviado por EnzoFerber em 14/12/2006 - 00:38h

Cara, excelente artigo. Parabéns.

Só pra constar: kerberos realmente não é um cachorro de 3 cabeças... e sim Cerberus, o guardiao da entrada do Submundo. :) Pelo menos eles compartilham uma qualidade: ambos zelam pela segurança. :)

Parabéns novamente pelo artigo.
[]'s
Slackware_10

[10] Comentário enviado por EnzoFerber em 14/12/2006 - 00:45h

Qual algoritmo de criptografia o kerberos usa? DES? Triple-DES? Ou algum algoritmo próprio?

[11] Comentário enviado por yetlinux em 24/04/2009 - 06:19h

Kerberos é nome grego. Cerberus é latim. Cérbero é aportuguesamento.

http://pt.wikipedia.org/wiki/C%C3%A9rbero

[12] Comentário enviado por samuelbpc em 19/03/2014 - 09:48h

Amigo,

- Obrigado pelo seu tempo dedicado.
Foi de grande ajuda o seu artigo.

Apesar de não ter resolvido o meu problema, me deu algumas pistas.

Obrigado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts