★悩み★
・HDFSに格納されたデータを暗号化することはできるのだろうか。
・HDFSのTransparent Encryption機能で、データの暗号化はできるのかな。
・HDFSのTransparent Encryption(透過的暗号化)を使う手順を知りたい。
こういった「悩み」に答えます。
★本記事の内容★
① HDFSで暗号化(Transparent Encryption)を使用するための準備をご紹介
② HDFSで暗号化(Transparent Encryption)を使用する手順をご紹介
③ 暗号化(Transparent Encryption)されたHDFSの動作検証をご紹介
これからご紹介する「HDFSで暗号化(Transparent Encryption)を使用する手順」を実践したことで、2時間以内で「HDFSのデータを暗号化」できました。
記事の前半では「HDFSで暗号化(Transparent Encryption)を使用するための準備」を解説しつつ、記事の後半では「HDFSで暗号化(Transparent Encryption)を使用する手順と動作検証結果」を紹介します。
この記事を読み終えることで、「セキュアなHDFSを利用できる」状態になります。
HDFSで暗号化(Transparent Encryption)を使用するための準備
「HDFSで暗号化(Transparent Encryption)を使用するための準備」に関してご紹介します。
★HDFSで暗号化(Transparent Encryption)を使用するための準備の流れ★
手順1:Hadoop(HDFS)環境を構築
手順2:HDFSの動作確認
上記の流れで、「HDFSで暗号化(Transparent Encryption)を使用するための準備」ができます。
上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年5月29日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)
以降で、上記「HDFSで暗号化(Transparent Encryption)を使用するための準備の流れ」の各手順に関してご説明します。
手順1:Hadoop(HDFS)環境を構築
「手順1:Hadoop(HDFS)環境を構築」に関してご説明します。
HDFSの暗号化(Transparent Encryption)機能を使用するために、Hadoop(HDFS)環境を構築しましょう。
「Hadoop(HDFS)環境の構築手順」に関しては、以下の記事をご覧ください。
上記手順を実施することで、以下のHadoop(HDFS)環境を構築できます。
以降の手順では、上図のHadoop(HDFS)環境を想定として手順を解説します。
既にHadoop(HDFS)環境を構築済みである場合、本手順を省略してください。
以上で、「手順1:Hadoop(HDFS)環境を構築」は完了です。
手順2:HDFSの動作確認
「手順2:HDFSの動作確認」に関してご説明します。
HDFSが正常動作することを確認するために、「HDFSへのデータ格納」と「HDFSからのデータ参照」が正常動作することを確認しましょう。
HDFSにデータを格納するために、以下のコマンドをマスター(node1)上で実行してください。
# su - hadoop
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -mkdir /user
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -mkdir /user/hadoop
$ vi sample.txt
$ cat sample.txt
a
b
c
d
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -put sample.txt
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -ls
-rw-r--r-- 1 hadoop supergroup 8 2021-05-29 09:58 sample.txt
「hadoop fs -ls実行後、sample.txtが表示された」場合、「正常にHDFSにデータを格納できた」と判断できます。
続いて、HDFSに格納したデータの参照を確認するために、以下のコマンドをマスター(node1)上で実行してください。
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -cat sample.txt
a
b
c
d
$
上記のように「a b c d」が表示された場合、「正常にHDFSのデータを参照できた」と判断できます。
以上で、「手順2:HDFSの動作確認」は完了です。
上記の流れで、HDFSで暗号化(Transparent Encryption)を使用するための準備ができました。
HDFSで暗号化(TransparentEncryption)を使用する手順
「HDFSで暗号化(Transparent Encryption)を使用する手順」に関してご紹介します。
★HDFSで暗号化(Transparent Encryption)を使用するまでの流れ★
手順1:Key Management Server(KMS)の設定
手順2:Key Management Server(KMS)を起動
手順3:HDFSの設定を修正
手順4:HDFSの再起動
手順5:暗号化キー(encryption key)の作成
手順6:暗号化領域(Encryption Zone)をHDFS上に作成
上記の流れで、「HDFSで暗号化(Transparent Encryption)を使用」できます。
上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年5月29日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)
以降で、上記「HDFSで暗号化(Transparent Encryption)を使用までの流れ」の各手順に関してご説明します。
手順1:KMSの設定【HDFSの暗号化に必要】
「手順1:KMSの設定」に関してご説明します。
HDFSの暗号化(Transparent Encryption)機能を使うには、「Key Management Server(KMS)」を起動が必要です。
Key Management Server(KMS)を起動するために、マスター(node1)上で「kms-site.xml」と「kms-env.sh」を以下のように編集してください。コマンド実行例中の「適宜変更」と書いてある部分は、自分用に書き換えてください。
$ su - hadoop # hadoopを管理するユーザーに切り替え(適宜変更)
$ cd /opt/oss/hadoop-3.2.2/etc/hadoop/ # hadoopをインストールした場所に移動(適宜変更)
$ cat kms-site.xml # kms-site.xmlを以下のように修正
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>hadoop.kms.key.provider.uri</name>
<value>jceks://file@/${user.home}/kms.keystore</value>
</property>
<property>
<name>hadoop.security.keystore.java-keystore-provider.password-file</name>
<value>kms.keystore.password</value>
</property>
</configuration>
$ tail -n 1 kms-env.sh # kms-env.shに下記を追記
export HADOOP_KEYSTORE_PASSWORD=password
以上で、「手順1:KMSの設定」は完了です。
手順2:KMSを起動【HDFSの暗号化に必要】
「手順2:KMSを起動」に関してご説明します。
HDFSの暗号化(Transparent Encryption)機能を使用するために、「Key Management Server(KMS)」を起動しましょう。
Key Management Server(KMS)を起動するために、マスター(node1)上で以下のコマンドを実行してください。
$ /opt/oss/hadoop-3.2.2/bin/hadoop --daemon start kms
$ jps
9665 KMSWebServer
6979 ResourceManager
9742 Jps
6655 NameNode
コマンド実行後、「KMSWebServer」が表示された場合、「正常にKey Management Server(KMS)が起動した」と判断できます。
以上で、「手順2:KMSを起動」は完了です。
手順3:HDFSの設定を修正【暗号化を使用する設定へ】
「手順3:HDFSの設定を修正」に関してご説明します。
「手順2で起動したKey Management Server(KMS)」と「HDFS」が連携できるように設定を修正しましょう。
マスター(node1)上で「hdfs-site.xml」と「core-site.xml」を以下のように編集してください。「適宜変更」と書いてある部分は、自分用に書き換えてください。
$ cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/var/opt/oss/hadoop322/data</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/var/opt/oss/hadoop322/name</value>
</property>
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
<property>
<name>dfs.encryption.key.provider.uri</name>
<value>kms://http@node1:9600/kms</value> ← KMSのURLを設定(適宜変更)
</property>
</configuration>
$ cat core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.security.key.provider.path</name>
<value>kms://http@node1:9600/kms</value> ← KMSのURLを設定(適宜変更)
</property>
</configuration>
HDFSの設定終了後、修正した「core-site.xml」と「hdfs-site.xml」を各サーバに転送するために、マスター(node1)で以下のコマンドを実行します。
$ scp -pr /opt/oss/hadoop-3.2.2/etc/hadoop/core-site.xml node2:/opt/oss/hadoop-3.2.2/etc/hadoop
core-site.xml 100% 1012 1.7MB/s 00:00
$ scp -pr /opt/oss/hadoop-3.2.2/etc/hadoop/core-site.xml node3:/opt/oss/hadoop-3.2.2/etc/hadoop
core-site.xml 100% 1012 1.5MB/s 00:00
$ scp -pr /opt/oss/hadoop-3.2.2/etc/hadoop/hdfs-site.xml node3:/opt/oss/hadoop-3.2.2/etc/hadoop
hdfs-site.xml 100% 1481 2.0MB/s 00:00
$ scp -pr /opt/oss/hadoop-3.2.2/etc/hadoop/hdfs-site.xml node2:/opt/oss/hadoop-3.2.2/etc/hadoop
hdfs-site.xml 100% 1481 2.2MB/s 00:00
以上で、「手順3:HDFSの設定を修正」は完了です。
手順4:HDFSの再起動
「手順4:HDFSの再起動」に関してご説明します。
手順3で修正した設定を反映させるために、HDFSを再起動しましょう。
HDFSを再起動するために、マスター(node1)上で以下のコマンドを順に実行してください。
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh stop namenode
$ ssh node2 # node2へログインし、datanodeを停止
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh stop datanode
$ exit
$ ssh node3 # node3へログインし、datanodeを停止
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh stop datanode
$ exit
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh start namenode
$ ssh node2 # node2へログインし、datanodeを起動
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh start datanode
$ exit
$ ssh node3 # node3へログインし、datanodeを起動
$ /opt/oss/hadoop-3.2.2/sbin/hadoop-daemon.sh start datanode
$ exit
以上で、「手順4:HDFSの再起動」は完了です。
手順5:暗号化キー(encryption key)の作成
「手順5:暗号化キー(encryption key)の作成」に関してご説明します。
暗号化キー(encryption key)は、HDFSのデータを暗号化するのに利用されます。
暗号化キー(encryption key)を作成するために、マスター(node1)で以下のコマンドを実行してください。
$ /opt/oss/hadoop-3.2.2/bin/hadoop key create mykey
mykey has been successfully created with options Options{cipher='AES/CTR/NoPadding', bitLength=128, description='null', attributes=null}.
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@5f683daf has been updated.
$ echo $?
0
暗号化キー(encryption key)が作成されたことを確認するために、以下のコマンドをマスター(node1)で実行します。
$ /opt/oss/hadoop-3.2.2/bin/hadoop key list
Listing keys for KeyProvider: org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider@2e377400
mykey
$
コマンド実行後、「mykey」が表示された場合、「正常に暗号化キー(encryption key)を作成できた」と判断できます。
以上で、「手順5:暗号化キー(encryption key)の作成」は完了です。
手順6:暗号化領域(Encryption Zone)をHDFS上に作成
「手順6:暗号化領域(Encryption Zone)をHDFS上に作成」に関してご説明します。
HDFS上に暗号化領域(格納されたデータを暗号化して保持するフォルダ)を作成しましょう。
暗号化領域(Encryption Zone)をHDFS上に作成するために、マスター(node1)で以下のコマンドを順に実行してください。
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -mkdir securezone
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -ls
Found 2 items
-rw-r--r-- 1 hadoop supergroup 8 2021-05-29 09:58 sample.txt
drwxr-xr-x - hadoop supergroup 0 2021-05-29 10:50 securezone
$ /opt/oss/hadoop-3.2.2/bin/hdfs crypto -createZone -keyName mykey -path securezone
Added encryption zone securezone
$ /opt/oss/hadoop-3.2.2/bin/hdfs crypto -listZones
/user/hadoop/securezone mykey
$
「hdfs crypto -listZones」実行後、「securezone mykey」が出力された場合、「正常に暗号化領域(Encryption Zone)をHDFS上に作成できた」と判断できます。
以上で、「手順6:暗号化領域(Encryption Zone)をHDFS上に作成」は完了です。
上記の流れで、HDFSで暗号化(TransparentEncryption)を使用できます。
暗号化(Transparent Encryption)されたHDFSの動作検証
「暗号化(Transparent Encryption)されたHDFSの動作検証」に関してご紹介します。
★暗号化(Transparent Encryption)されたHDFSの動作検証★
・HDFS上の暗号化領域に対するデータ格納と参照を検証
・HDFS上の暗号化領域に格納されたデータを用いたMapReduceを検証
「暗号化(TransparentEncryption)されたHDFSの動作検証」として、上記項目をご紹介します。
上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年5月29日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)
以降で、上記「暗号化(TransparentEncryption)されたHDFSの動作検証」の各手順に関してご説明します。
HDFS上の暗号化領域に対するデータ格納と参照を検証
「HDFS上の暗号化領域に対するデータ格納と参照を検証」に関してご説明します。
HDFS上の暗号化領域にデータを格納し、参照してみましょう。
HDFS上の暗号化領域にデータを格納するために、マスター(node1)で以下のコマンドを順に実行してください。
$ cat sample.txt
a
b
c
d
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -put sample.txt securezone
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -ls -R
-rw-r--r-- 1 hadoop supergroup 8 2021-05-29 09:58 sample.txt
drwxr-xr-x - hadoop supergroup 0 2021-05-29 11:02 securezone
drwxrwxrwt - hadoop supergroup 0 2021-05-29 10:58 securezone/.Trash
-rw-r--r-- 1 hadoop supergroup 8 2021-05-29 11:02 securezone/sample.txt
$
コマンド実行後、「securezone/sample.txt」が表示された場合、「正常にHDFS上の暗号化領域にデータを格納できた」と判断できます。
続いて、HDFS上の暗号化領域に格納したデータを参照するために、マスター(node1)で以下のコマンドを実行してください。
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -cat securezone/sample.txt
a
b
c
d
$
暗号化を意識することなく、HDFS上の暗号化領域に格納したデータを参照できました。
最後に、「HDFS上の暗号化領域に格納したデータが暗号化されているか」を確認するために、マスター(node1)で以下のコマンドを順に実行します。
$ ssh node2
$ cd /var/opt/oss/hadoop322/data/current/BP-182370049-192.168.10.150-1622249499650/
$ cd current/finalized/subdir0/
$ ls
blk_1073741826 blk_1073741826_1002.meta blk_1073741827 blk_1073741827_1003.meta
$ cat blk_1073741827 ← securezone/sample.txtのデータが暗号化されていることを確認
??3J??Z
$ cat blk_1073741826 ← sample.txtのデータが暗号化されていないことを確認
a
b
c
d
$
以上で、「HDFS上の暗号化領域に対するデータ格納と参照を検証」は完了です。
HDFS上の暗号化領域に格納されたデータを用いたMapReduceを検証
「HDFS上の暗号化領域に格納されたデータを用いたMapReduceを検証」に関してご説明します。
HDFS上の暗号化領域に格納されたデータを用いて、MapReduceが正常動作するか確認しましょう。
HDFS上の暗号化領域に格納されたデータを用いてMapreduceを開始するために、マスター(node1)で以下のコマンドを順に実行してください。
$ $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount securezone output
$ /opt/oss/hadoop-3.2.2/bin/hadoop fs -cat output/part-r-00000
a 1
b 1
c 1
d 1
$
コマンド実行後、「a 1」が表示された場合、「HDFS上の暗号化領域に格納されたデータを用いたMapReduceが正常に終了した」と判断できます。
以上で、「HDFS上の暗号化領域に格納されたデータを用いたMapReduceを検証」は完了です。
HDFSクライアントおよびMapReduceから、HDFSの暗号化(Transparent Encryption)を意識せずにデータへのアクセスができました。
ちなみに、「HDFSとは何か?」や「MapReduceって何?」かを詳しく知りたい方には、以下の動画がオススメです。
【まとめ】HDFSで暗号化(TransparentEncryption)を使用する手順
今回の記事を通して、「HDFSで暗号化(Transparent Encryption)を使用する手順」をご紹介することで、以下の悩みを解消しました。
★悩み★
・HDFSに格納されたデータを暗号化することはできるのだろうか。
・HDFSのTransparent Encryption機能で、データの暗号化はできるのかな。
・HDFSのTransparent Encryption(透過的暗号化)を使う手順を知りたい。
「HDFSで暗号化(Transparent Encryption)を使用する手順は?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。
コメント