AES를 사용하여 Amazon EMR에서 HBase 테이블을 암호화하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 5월 18일

AES(Advanced Encryption Standard)를 사용하여 Amazon EMR 클러스터에서 Apache HBase 테이블을 암호화하려고 합니다.

해결 방법

투명한 암호화 기능을 사용하여 신규 또는 기존 HBase 테이블을 암호화할 수 있습니다. 이 기능은 HFile 데이터와 WAL(Write-Ahead Log)을 암호화합니다.

참고: Amazon Simple Storage Service(Amazon S3)를 HDFS가 아닌 데이터 원본으로 사용할 경우 서버 측 및 클라이언트 측 암호화를 사용하여 저장 데이터와 전송 중인 데이터를 보호할 수 있습니다. 자세한 내용은 암호화를 사용하여 데이터 보호를 참조하십시오.

새 HBase 테이블 암호화

1.    Amazon EMR 콘솔을 엽니다.

2.    이미 HBase가 있는 클러스터를 선택하거나 HBase를 사용하여 새 클러스터를 생성합니다.

3.    SSH를 사용하여 마스터 노드에 연결합니다.

4.    keytool 명령을 사용하여 AES 암호화에 적합한 길이의 보안 키를 생성합니다. 암호와 별칭을 입력합니다.

예제 명령은 다음과 같습니다.

sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass your-password -genseckey -keyalg AES -keysize 128 -alias your-alias

예제 출력:

Output:
Enter key password for <your_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.    EMR 클러스터의 각 노드에 있는 hbase-site.xml 파일에 다음 속성을 추가합니다. hbase.crypto.keyprovider.parameters 속성에서 hbase.jks 경로 및 암호를 제공합니다. 이 암호는 4단계에서 keytool 명령에 지정한 암호와 동일합니다. 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><your-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>

6.    hbase.jks 파일을 모든 클러스터 노드에 복사합니다. 파일을 hbase.crypto.keyprovider.parameters 속성에 지정된 위치로 복사해야 합니다. 다음 예제에서는 HostToCopyToHost를 노드의 해당 퍼블릭 DNS 이름으로 바꿉니다.

cd /etc/hbase/conf
scp hbase.jks HostToCopy:/tmp
ssh ToHost
sudo cp /tmp/hbase.jks /etc/hbase/conf/

7.    다음 예제와 같이 마스터 및 코어 노드에서 모든 HBase 서비스를 다시 시작합니다. 각 코어 노드에서 hbase-regionserver 중지 및 시작 명령을 반복합니다.

sudo initctl stop hbase-master
sudo initctl stop hbase-regionserver

sudo initctl start hbase-master
sudo initctl start hbase-regionserver

8.    HBase 셸에 로그인합니다.

# hbase shell

9.    AES 암호화를 사용하여 테이블을 생성합니다.

create 'table1',{NAME=>'columnfamily',ENCRYPTION=>'AES’}

예제 출력:

0 row(s) in 1.6760 seconds
=> Hbase::Table - table1

10.    테이블을 설명하여 AES 암호화가 활성화되었는지 확인합니다.

describe ‘table1’

예제 출력:

Table table1 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', BLOCKCA
CHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0320 seconds

기존 테이블 암호화

1.    암호화되지 않은 테이블을 설명합니다.

describe 'table2'

예제 출력:

Table table2 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 seconds

2.    alter 명령을 사용하여 AES 암호화를 활성화합니다.

alter 'table2',{NAME=>'cf2',ENCRYPTION=>'AES'}

예제 출력:

Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9000 seconds

3.    테이블이 암호화되었는지 확인합니다.

describe ‘table2'

예제 출력:

Table table2 is ENABLED
table2
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf2', 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 => 't
rue', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.0120 seconds

참고: 테이블에 보조 인덱스를 생성하는 경우(예: Apache Phoenix 사용) WAL 암호화가 작동하지 않을 수 있습니다. 이 경우 "java.lang.NullPointerException" 응답을 받습니다. 이 문제를 해결하려면 hbase-site.xml 파일에서 hbase.regionserver.wal.encryptionfalse로 설정합니다. 예:

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

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?