AES를 사용하여 Amazon EMR에서 HBase 테이블을 암호화하려면 어떻게 해야 합니까?
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를 사용하여 새 클러스터를 생성합니다.
4. keytool 명령을 사용하여 AES 암호화에 적합한 길이의 보안 키를 생성합니다. 암호와 별칭을 입력합니다.
명령 예:
sudo keytool -keystore /etc/hbase/conf/hbase.jks -storetype jceks -storepass:file mysecurefile -genseckey -keyalg AES -keysize 128 -alias your-alias<br>
참고: file: securefile에는 스토어 패스 암호가 포함되어 있습니다. 파일 소유자만 파일을 읽을 수 있고 사용 후 삭제되었는지 확인합니다.
출력 예시:
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 속성에 지정된 위치로 복사해야 합니다. 다음 예제에서는 HostToCopy 및 ToHost를 노드의 해당 퍼블릭 DNS 이름으로 바꿉니다.
cd /etc/hbase/conf scp hbase.jks HostToCopy:/tmp ssh ToHost sudo cp /tmp/hbase.jks /etc/hbase/conf/
7. 다음 예제와 같이 마스터 및 코어 노드에서 모든 HBase 서비스를 다시 시작합니다. 각 코어 노드에서 hbase-regionserver 중지 및 시작 명령을 반복합니다.
참고: 리전 서버를 중지하고 시작하면 클러스터의 HBase 테이블에 대한 지속적인 읽기/쓰기에 영향을 줄 수 있습니다. 따라서 가동 중단 시간에만 HBase 데몬을 중지하고 시작합니다. 프로덕션 클러스터를 시작 및 중지하기 전에 테스트 클러스터에 미칠 수 있는 영향을 확인합니다.
Amazon EMR 5.30.0 이상의 릴리스 버전:
sudo systemctl stop hbase-master sudo systemctl stop hbase-regionserver sudo systemctl start hbase-master sudo systemctl start hbase-regionserver
Amazon EMR 4x에서 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. 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', BLOCKCACHE => '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 => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 1 row(s) in 0.0120 seconds
참고: 테이블에 보조 인덱스를 생성하는 경우(예: Apache Phoenix 사용) WAL 암호화가 작동하지 않을 수 있습니다. 이 경우 "java.lang.NullPointerException" 응답을 받습니다. 이 문제를 해결하려면 hbase-site.xml 파일에서 hbase.regionserver.wal.encryption을 false로 설정합니다. 예:
<property> <name>hbase.regionserver.wal.encryption</name> <value>false</value> </property>
관련 정보
관련 콘텐츠
- 질문됨 2달 전lg...
- 질문됨 3달 전lg...
- AWS 공식업데이트됨 8달 전
- AWS 공식업데이트됨 6달 전
- AWS 공식업데이트됨 2년 전