Como manter seus Clusters Elasticsearch seguros com o Kerberos
O cão de guarda dos seus dados
A Elasticsearch 6.4 adicionou suporte a autenticação do Kerberos para assinaturas Platinum, que é o primeiro passo em direção a uma Elastic Stack totalmente Kerberizada. O Kerberos é uma tecnologia robusta que permite a autenticação segura em sistemas distribuídos. Ele oferece acesso único a diferentes serviços sem que você precise repetidamente informar um nome de usuário e senha. Este post mostra como configurar a Elasticsearch para ser compatível com a autenticação do Kerberos para tráfego HTTP.
Visão Geral da Implantação
Vamos considerar um cenário simples no qual a usuária Alice tenha um cluster Elasticsearch de nodo único. Alice já tem um reino Kerberos, demo.local
, e quer proteger o cluster da Elasticsearch usando a autenticação Kerberos. O servidor de autenticação Kerberos tem autoridade para autenticar um usuário, host ou serviço dentro do reino. Os comandos usados neste artigo se referem à implementação MIT Kerberos. Consulte a documentação do MIT Kerberos para saber mais.
Nessa situação simples, há três máquinas de host:
- Host-1 (
kdc.demo.local
): O Kerberos Key Distribution Center (KDC), normalmente com as funções de Authentication Server e Ticket Granting Server. - Host-2 (
es.demo.local
): É aqui que fica o cluster de nodo único da Elasticsearch. - Host-3 (
client.demo.local
): É onde o cliente da Elasticsearch está.
Veja os passos para garantir uma autenticação de sucesso com o Kerberos:-
- Alice (
alice@DEMO.LOCAL
) acessa a máquina do cliente (client.demo.local
) com suas credenciais. - A máquina do cliente exige um Ticket Granting Ticket (TGT) do servidor KDC (
kdc.demo.local
). - O cliente acessa o serviço Elasticsearch
https://es.demo.local:9200
, que devolve uma resposta com um código de status de HTTP deUnauthorized(401)
e inclui o cabeçalhoWWW-Authenticate: Negotiate
. - O cliente solicita um ticket de sessão do Ticket Granting Server (TGS) para o serviço Elasticsearch principal
HTTP/es.demo.local@DEMO.LOCAL
. O nome principal do serviço Elasticsearch é derivado do url usado para acessar o serviço. - O cliente apresenta seu ticket para o serviço Elasticsearch para autenticação.
- O serviço Elasticsearch valida o ticket do Kerberos e concede acesso (se o ticket for válido).
Vamos configurar o reino Kerberos
Para habilitar o reino Elasticsearch Kerberos, você precisará da infraestrutura Kerberos:
- Relógios sincronizados em todas as máquinas participantes no domínio.
- Um domínio DNS funcionando para todas as máquinas participantes.
- Um servidor KDC.
- Os nodos de cliente instalados com as bibliotecas Kerberos e arquivos de configuração como
kinit
,klist
.
Tendo a estrutura Kerberos, você precisará das seguintes informações:
- Arquivo de configuração Kerberos
krb5.conf
--- Esse arquivo contém as informações necessárias do seu ambiente Kerberos como o reino padrão, servidores KDC e mapas de reino do domínio. Em um sistema Linux, esse arquivo costuma estar localizado no diretório/etc
. A propriedade do sistema JVMjava.security.krb5.conf
deve ser definida para o caminho completo desse arquivo de configuração. O JVM carregará essa configuração e a usará para encontrar as informações necessárias quando necessário. - Serviço Elasticsearch HTTP
keytab
--- Um keytab é um arquivo que armazena pares de chaves principais e de criptografia. É a keytab usada pelo serviço Elasticsearch HTTP para validar tickets que chegam de clientes. Normalmente, os nomes do serviço do principal estariam no formatoHTTP/es.demo.local@DEMO.LOCAL
em que a classe do serviço éHTTP
,es.demo.local
é o nome de domínio totalmente qualificado para o host Elasticsearch eDEMO.LOCAL
e o reino Kerberos. Esse arquivo precisa ser colocado no diretório config da Elasticsearch. *É importante proteger o arquivo usando permissões de somente leitura para os usuários que usam a Elasticsearch, porque o arquivo contém credenciais. O administrador do sistema Kerberos pode oferecer o arquivo keytab para o seu serviço.
Com os dois arquivos, já podemos continuar a configuração do reino Kerberos na Elasticsearch.
1. Configure as opções de JVM
Primeiro, precisamos editar o arquivo de opções de JVM (jvm.options
) para configurar a propriedade do sistema JVM para o arquivo de configuração do Kerberos:
# Kerberos configuration
-Djava.security.krb5.conf=/etc/krb5.conf
2. Configure a Elasticsearch para o Kerberos
Depois, precisamos adicionar um reino Kerberos ao arquivo elasticsearch.yml
:
# Kerberos realm
xpack.security.authc.realms.kerb1:
type: kerberos
order: 1
keytab.path: es.keytab
Isso configura o reino Kerberos (kerb1
) do tipo kerberos
, realm order 1
e o keytab.path
que aponta para o arquivo keytab do serviço Elasticsearch (es.keytab
) no diretório de configuração. Para mais informações, consulte a documentação como configurar um reino Kerberos.
3. Reinicie a Elasticsearch
Depois que a configuração estiver feita, o nodo da Elasticsearch precisará ser reiniciado.
4. Mapear usuários em funções no Kerberos
O Kerberos é um protocolo de autenticação que não oferece detalhes da autorização. Para a autorização, podemos usar a API de mapeamento de funções para mapear usuários e funções. A opção a seguir cria um mapeamento de funções chamado kerbrolemapping
, em que a função monitoring_user
é atribuída ao usuário alice@DEMO.LOCAL
:
$ curl -u elastic -H "Content-Type: application/json" -XPOST http://es.demo.local:9200/_xpack/security/role_mapping/kerbrolemapping -d
{
"roles" : [ "monitoring_user" ],
"enabled": true,
"rules" : {
"field" : { "username" : "alice@DEMO.LOCAL" }
}
}
Para saber mais sobre mapeamento de funções, consulte a documentação sobre mapear usuários e grupos em funções
E pronto!
Para verificar a autenticação na máquina do cliente, precisamos emitir o comando kinit
para obter um Ticket Granting Ticket:
$ kinit alice@DEMO.LOCAL
Password for alice@DEMO.LOCAL:
$ klist
Ticket cache: KEYRING:persistent:1000:krb_ccache_NvNtNgS
Default principal: alice@DEMO.LOCAL
Valid starting Expires Service principal
31/08/18 02:20:07 01/09/18 02:20:04 krbtgt/DEMO.LOCAL@DEMO.LOCAL
Depois, invocar curl
com o parâmetro negotiate
para que a autenticação do Kerberos do HTTP possa ser realizada:
$ curl --negotiate -u : -XGET http://es.demo.local:9200/
e pronto!
{
"name" : "Lw7K29R",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "qd3iafXORLy0VCfVD_Hp9w",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : true,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Conclusão
Vimos como é fácil configurar um reino Kerberos depois que você tem acesso ao keytab principal do serviço e ao arquivo de configuração do reino Kerberos necessários para a Elasticsearch. A compatibilidade do Kerberos com a Elasticsearch é só o começo e vamos continuar lançando suporte a outros componentes da Elastic Stack nas próximas atualizações. Fique ligado!