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