Ir para o conteúdo

Como uso o AES para criptografar uma tabela do Apache HBase no Amazon EMR?

5 minuto de leitura
0

Quero usar o Advanced Encryption Standard (AES) para criptografar uma tabela do Apache HBase no Amazon EMR.

Resolução

Observação: se você usar o Amazon Simple Storage Service (Amazon S3) como fonte de dados em vez do Sistema de Arquivos Distribuído do Hadoop (HDFS), use a criptografia do lado do servidor e do lado do cliente para proteger os dados.

Criptografar uma nova tabela do Apache HBase

Conclua as seguintes etapas:

  1. Abra o console do Amazon EMR.

  2. Escolha um cluster que já tenha o HBase. Ou crie um novo cluster com o HBase.

  3. Use SSH para se conectar ao nó primário do cluster do Amazon EMR.

  4. Execute o comando keytool para criar uma chave secreta de criptografia com AES:

    sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias example-alias

    Observação: substitua example-alias pelo seu alias.
    Exemplo de saída:

    Output:Enter key password for example-key-store
        (RETURN if same as keystore password):
    Warning:The JCEKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /etc/hbase/conf/hbase.jks -destkeystore /etc/hbase/conf/hbase.jks -deststoretype pkcs12".
  5. Adicione as seguintes propriedades ao arquivo hbase-site.xml para cada nó no cluster do Amazon EMR. Forneça o caminho e a senha de hbase.jks para o parâmetro hbase.crypto.keyprovider. Além disso, especifique seu alias no parâmetro hbase.crypto.master.key.name.

    
      <property>
        <name>hbase.crypto.keyprovider.parameters</name>  
        <value>jceks:///etc/hbase/conf/hbase.jks?password=your_password</value>
      </property>
    
      <property>
        <name>hbase.crypto.master.key.name</name>
        <value>example-alias</value>
      </property>
    
      <property>
        <name>hbase.regionserver.hlog.reader.impl</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader</value>
      </property>
    
      <property>
        <name>hbase.regionserver.hlog.writer.impl</name>
        <value>org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter</value>
      </property>
    
      <property>
        <name>hfile.format.version</name>
        <value>3</value>
      </property>
    
      <property>
        <name>hbase.regionserver.wal.encryption</name>
        <value>true</value>
      </property>
    
      <property>
        <name>hbase.crypto.keyprovider</name>
        <value>org.apache.hadoop.hbase.io.crypto.KeyStoreKeyProvider</value>
      </property>

    Observação: em vez do algoritmo MD5 padrão, é possível usar um algoritmo de hash de chave de criptografia personalizado, como HBase-25181. Para mais informações, consulte Adicionar opções para desativar a criptografia de famílias de colunas e escolher o algoritmo de hash para chaves de criptografia agrupadas no site da Apache. Para definir o hash, use a opção de configuração hbase.crypto.key.hash.algorithm. O exemplo a seguir usa o algoritmo SHA-512:

    <property>
      <name>hbase.crypto.key.hash.algorithm</name>
      <value>SHA-512</value></property>
  6. Copie o arquivo hbase.jks para todos os nós do cluster no local especificado no parâmetro hbase.crypto.keyprovider:

    cd /etc/hbase/conf
    scp hbase.jks example-host-to-copy:/tmp
    ssh example-to-hostsudo cp /tmp/hbase.jks /etc/hbase/conf/

    Observação: substitua example-host-to-copy e example-to-host pelos nomes DNS públicos dos seus nós.

  7. Reinicie todos os serviços do HBase nos nós primário e central. Em seguida, repita os comandos “stop” e “start” do hbase-regionserver em cada nó central.
    Observação: quando você interrompe e inicia os servidores da região AWS, isso pode afetar as leituras e gravações recorrentes nas tabelas do HBase em seu cluster. Interrompa e inicie os daemons do HBase somente durante o tempo de inatividade. É uma prática recomendada interromper e iniciar um cluster de teste antes de interromper e iniciar um cluster de produção.

    Amazon EMR 5.30.0 e versões posteriores:

    sudo systemctl stop hbase-mastersudo
    systemctl stop hbase-regionserver
    
    sudo systemctl start hbase-mastersudo
    systemctl start hbase-regionserver

    Versões do Amazon EMR 4x ao Amazon EMR 5.29.0:

    sudo initctl stop hbase-master
    sudo initctl stop hbase-regionserver
    
    sudo initctl start hbase-master
    sudo initctl start hbase-regionserver
  8. Faça login no shell do HBase:

    # hbase shell
  9. Crie uma tabela com criptografia com AES:

    create 'example-table',{NAME=>'columnfamily',ENCRYPTION=>'AES'}

    Observação: substitua example-table pelo nome da sua tabela.
    Exemplo de saída:

    0 row(s) in 1.6760 seconds=> Hbase::Table - example-table1
  10. Confirme se a criptografia com AES está ativada:

describe 'example-table'

Observação: substitua example-table pelo nome da sua tabela.
Exemplo de saída:

Table example-table is ENABLED
table1
COLUMN FAMILIES DESCRIPTION
{NAME => 'columnfamily', BLOOMFILTER => 'ROW', ENCRYPTION => 'AES', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE',
DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0320 seconds

Criptografe uma tabela do Apache HBase

Conclua as seguintes etapas:

  1. Descreva a tabela não criptografada:

    describe 'example-table'

    Observação: Substitua example-table pela tabela que você deseja descrever.
    Exemplo de saída:

    Table example-table is ENABLED
    table2
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'cf2', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL =>
    'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6
    5536', REPLICATION_SCOPE => '0'}1 row(s) in 0.0140 seconds2
  2. Ative a criptografia com AES:

    alter 'example-table',{NAME=>'columnfamily2',ENCRYPTION=>'AES'}

    Observação: substitua example-table pela sua tabela.
    Exemplo de saída:

    Updating all regions with the new schema...
    1/1 regions updated.
    Done.0 row(s) in 1.9000 seconds3.
  3. Confirme se a tabela está criptografada:

    describe 'example-table'

    Observação: substitua example-table pela sua tabela.
    Exemplo de saída:

    Table example-table is ENABLED
    table2
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'columnfamily2', BLOOMFILTER => 'ROW', ENCRYPTION => 'AES', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE',
    DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}1 row(s) in 0.0120 seconds

    Observação: se você criar um índice secundário na tabela, a criptografia WAL poderá não funcionar e uma resposta java.lang.NullPointerException é gerada. Para resolver esse problema, defina hbase.regionserver.wal.encryption como falso no arquivo hbase-site.xml:

    <property>      
          <name>hbase.regionserver.wal.encryption</name>
          <value>false</value>
      </property>

Informações relacionadas

Usar o shell do HBase

Criptografia transparente em HDFS no Amazon EMR

AWS OFICIALAtualizada há um ano