Com a configuração padrão do Apache HBase, todos podem ler e gravar em todas as tabelas disponíveis no sistema. Para muitas configurações corporativas, esse tipo de política é inaceitável.
Os administradores podem configurar firewalls que decidem quais máquinas têm permissão para se comunicar com o HBase. No entanto, as máquinas que podem passar pelo firewall ainda têm permissão para ler e gravar em todas as tabelas. Esse tipo de mecanismo é eficaz, mas insuficiente porque o HBase ainda não consegue diferenciar entre vários usuários que usam as mesmas máquinas cliente e ainda não há granularidade em relação ao acesso à tabela HBase, família de colunas ou qualificador de coluna.
Nesta postagem, discutiremos como o Kerberos é usado com o Hadoop e o HBase para fornecer Autenticação do usuário , e como o HBase implementa a Autorização do usuário para conceder permissões aos usuários para ações específicas em um conjunto de dados especificado.
Secure HBase:autenticação e autorização
Um HBase seguro visa proteger contra sniffers, usuários não autenticados/não autorizados e ataques baseados em rede. Ele não protege contra usuários autorizados que excluem acidentalmente todos os dados.
O HBase pode ser configurado para fornecer autenticação do usuário , que garante que apenas usuários autorizados possam se comunicar com o HBase. O sistema de autorização é implementado no nível de RPC e é baseado na Simple Authentication and Security Layer (SASL), que suporta (entre outros mecanismos de autenticação) Kerberos. SASL permite autenticação, negociação de criptografia e/ou verificação de integridade de mensagem por conexão (propriedade de configuração “hbase.rpc.protection”).
A próxima etapa depois de ativar a Autenticação do usuário é dar a um administrador a capacidade de definir uma série de regras de autorização do usuário que permitem ou negam ações específicas. O sistema de autorização, também conhecido como Access Controller Coprocessor ou Access Control List (ACL), está disponível a partir do HBase 0.92 (CDH4) e permite definir a política de autorização (Read/Write/Create/Admin), com tabela/família /qualifier granularidade, para um usuário especificado.
Kerberos
Kerberos é um protocolo de autenticação em rede. Ele foi projetado para fornecer autenticação forte para aplicativos cliente/servidor usando criptografia de chave secreta. O protocolo Kerberos usa criptografia forte (AES, 3DES, …) para que um cliente possa provar sua identidade para um servidor (e vice-versa) em uma conexão de rede insegura. Depois que um cliente e um servidor usam o Kerberos para provar suas identidades, eles também podem criptografar todas as suas comunicações para garantir a privacidade e a integridade dos dados enquanto realizam seus negócios.
Protocolo de troca de passagens
Em um nível alto, para acessar um serviço usando Kerberos, cada cliente deve seguir três etapas:
- Autenticação Kerberos:o cliente se autentica no Servidor de Autenticação Kerberos e recebe um Ticket Granting Ticket (TGT).
- Autorização Kerberos:o cliente solicita um ticket de serviço do Ticket Granting Server, que emite um ticket e uma chave de sessão se o TGT do cliente enviado com a solicitação for válido.
- Solicitação de serviço:o cliente usa o tíquete de serviço para se autenticar no servidor que está fornecendo o serviço que o cliente está usando (por exemplo, HDFS, HBase, …)
HBase, HDFS, ZooKeeper SASL
Como o HBase depende do HDFS e do ZooKeeper, o HBase seguro depende de um HDFS seguro e de um ZooKeeper seguro. Isso significa que os servidores HBase precisam criar uma sessão de serviço segura, conforme descrito acima, para se comunicar com o HDFS e o ZooKeeper.
Todos os arquivos escritos pelo HBase são armazenados em HDFS. Assim como nos sistemas de arquivos Unix, o controle de acesso fornecido pelo HDFS é baseado em usuários, grupos e permissões. Todos os arquivos criados pelo HBase possuem “hbase” como usuário, mas esse controle de acesso é baseado no nome de usuário fornecido pelo sistema, e todos que podem acessar a máquina são potencialmente capazes de “sudo” como o usuário “hbase”. Secure HDFS adiciona as etapas de autenticação que garantem que o usuário “hbase” seja confiável.
O ZooKeeper tem uma Lista de Controle de Acesso (ACL) em cada znode que permite acesso de leitura/gravação aos usuários com base nas informações do usuário de maneira semelhante ao HDFS.
HBase ACL
Agora que nossos usuários são autenticados via Kerberos, temos certeza de que o nome de usuário que recebemos é um de nossos usuários confiáveis. Às vezes, isso não é granularidade suficiente – queremos controlar se um usuário especificado é capaz de ler ou gravar uma tabela. Para isso, o HBase fornece um mecanismo de Autorização que permite acesso restrito a usuários específicos.
Para habilitar esse recurso, você deve habilitar o coprocessador do Controlador de Acesso, incluindo-o em hbase-site.xml nas classes de coprocessador do servidor mestre e da região. (Veja como configurar a segurança do HBase aqui.)
Um coprocessador é um código que é executado dentro de cada HBase Region Server e/ou Master. Ele é capaz de interceptar a maioria das operações (colocar, obter, excluir, …) e executar código arbitrário antes e/ou após a execução da operação.
Usando essa capacidade de executar algum código antes de cada operação, o coprocessador do Controlador de Acesso pode verificar os direitos do usuário e decidir se o usuário pode ou não executar a operação.
O shell do HBase tem alguns comandos que permitem que um administrador gerencie os direitos do usuário:
conceder [tabela] [família] [qualificador]
revogar [tabela] [família] [qualificador]
Como você vê, um administrador tem a capacidade de restringir o acesso do usuário com base no esquema da tabela:
- Conceder ao Usuário-W apenas direitos de leitura para Tabela-X/Família-Y (
conceder 'Usuário-W', 'R', 'Tabela-X', 'Família-Y'
) - Dê ao usuário-W todos os direitos de leitura/gravação para o Qualificador-Z (
concede 'Usuário-W', 'RW', 'Tabela-X', 'Família-Y', 'Qualificador-Z' )
Um administrador também pode conceder direitos globais, que operam no nível do cluster, como criar tabelas, balancear regiões, desligar o cluster e assim por diante:
- Dê ao usuário-W a capacidade de criar tabelas (
conceder 'User-W', 'C'
) - Dê ao usuário-W a capacidade de gerenciar o cluster (
conceder 'User-W', 'A'
)
Todas as permissões são armazenadas em uma tabela criada pelo coprocessador do Controlador de Acesso, chamada _acl_. A chave primária desta tabela é o nome da tabela que você especifica no comando grant. A tabela _acl_ tem apenas um grupo de colunas e cada qualificador descreve a granularidade dos direitos para uma determinada tabela/usuário. O valor contém os direitos reais concedidos.
Como você pode ver, os comandos do shell do HBase estão intimamente relacionados à forma como os dados são armazenados. O comando grant adiciona ou atualiza uma linha e o comando revoke remove uma linha da tabela _acl_.
Controlador de acesso nos bastidores
Conforme mencionado anteriormente, o coprocessador do Controlador de acesso usa a capacidade de interceptar cada solicitação do usuário e verificar se o usuário tem direitos para executar as operações.
Para cada operação, o Controlador de Acesso precisa consultar a tabela _acl_ para ver se o usuário tem direitos para executar a operação.
No entanto, esta operação pode ter um impacto negativo no desempenho. A solução para corrigir esse problema é usar a tabela _acl_ para persistência e o ZooKeeper para acelerar a pesquisa de direitos. Cada servidor de região carrega a tabela _acl_ na memória e é notificado sobre alterações pelo ZkPermissionWatcher. Dessa forma, cada servidor de região tem o valor atualizado todas as vezes e cada verificação de permissão é realizada usando um mapa na memória.
Roteiro
Embora o Kerberos seja um sistema de autenticação estável, bem testado e comprovado, o recurso HBase ACL ainda é muito básico e sua semântica ainda está evoluindo. HBASE-6096 é o JIRA abrangente como referência para todas as melhorias a serem enviadas em uma v2 do recurso ACL.
Outro tópico aberto sobre autorização e controle de acesso é a implementação de um sistema de segurança por KeyValue (HBASE-6222 ) que dará a possibilidade de ter valores diferentes na mesma célula associados a uma tag de segurança. Isso permitiria mostrar uma determinada informação com base nas permissões do usuário.
Conclusão
O HBase Security adiciona dois recursos extras que permitem proteger seus dados contra sniffers ou outros ataques de rede (usando o Kerberos para autenticar usuários e criptografar comunicações entre serviços) e permitir que você defina políticas de autorização de usuários, restrinja operações e limite a visibilidade de dados para usuários específicos.
Matteo Bertozzi é Engenheiro de Software no Spotify e Consultor HBase na Cloudera.