暗号化されたEBSを復号化しよう

おはようございます、もきゅりんです。
季節の変わり目って体調悪くなりますよね。
何だか喉が痛いのですが、花粉なのか風邪なのか。
皆さん、どうぞご自愛下さい。

ところで、

あ、あの暗号化していたEBSだけど、やっぱり暗号化止めたいなぁ〜。

そんなことありませんか?

え、ありません?

ですよねー!

はい。
ということで、正直、誰の需要なんですか?という話ですが、そういうの、自分、やってみたくなります。

やること

前提:

暗号化されたボリュームがアタッチされたインスタンスがいること

  1. 新規にEBS ボリュームを作成する

  2. 移行元に新規EBSボリュームをアタッチする

  3. 新規EBSボリュームを使用できるようにする

  4. 移行元のディレクトリから移行先の新規EBSボリュームにデータをコピーする

  5. スナップショットを作成して、どこかの誰かに共有したりします。

  6. 後片付け

前提

暗号化されたボリュームがアタッチされたインスタンスがいること

本来は、暗号化されたデータは別のボリュームとしてアタッチするかとは思いますが、検証なので(追加ボリュームをマウントするのも面倒なので)、暗号化された1ボリュームのインスタンスを作ります。

とりあえず、適当にEC2インスタンスを立ち上げます。

# EC2インスタンスを起動
InstanceID=`aws ec2 run-instances --image-id AMI_ID \
                             --subnet-id SUBNET_ID \
                             --security-group-ids SG_ID \
                             --count 1 \
                             --instance-type t2.micro \
                             --key-name YOUR_KEY_NAME \
                             --query "Instances[0].InstanceId" \
                             | sed -e "s/\"//g"`

# ネームタグを付けます。
aws ec2 create-tags --resources $InstanceID --tags Key=Name,Value=YOUR_INSTANCE_NAME

前回の[入門] EBSを暗号化しようの超絶雑スクリプト(ebs_encrypt.shのことね!)を流用して、暗号化されたAMIを作成します。

そのAMIからインスタンスを起動しましょう。

...できましたか?

そしたら続きです。

# 暗号化されたAMIのIDを取得
EncryptedAMIId=`aws ec2 describe-images --filters Name=name,Values=EncryptedAMI \
| jq -r '.Images[].ImageId'`

# 暗号化されたAMIからインスタンスを起動
EncryptedInstance=`aws ec2 run-instances --image-id $EncryptedAMIId \
                             --subnet-id SUBNET_ID \
                             --security-group-ids SG_ID \
                             --count 1 \
                             --instance-type t2.micro \
                             --key-name YOUR_KEY_NAME \
                             --query "Instances[0].InstanceId" \
                             | sed -e "s/\"//g"`

# 暗号化を確認
aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$EncryptedInstance \
        | jq '.Volumes[].Encrypted'
true

1 新規にEBS ボリュームを作成する

ま、適当に。

# test-volumeというEBSを作成します。
aws ec2 create-volume --size 16 --region ap-northeast-1 --availability-zone ap-northeast-1a --volume-type gp2 --tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=test-volume}]'

# 新規ボリュームIDを取得
VolumeId=`aws ec2 describe-volumes --filters Name=tag:Name,Values=test-volume \
| jq -r '.Volumes[].VolumeId'`

2 移行元に新規EBSボリュームをアタッチする

# インスタンスにボリュームをアタッチする
aws ec2 attach-volume --volume-id $VolumeId --instance-id $EncryptedInstance --device /dev/sdf

# 確認
aws ec2 describe-instances --instance-ids $EncryptedInstance \
| jq '.Reservations[].Instances[].BlockDeviceMappings'

3 新規EBSボリュームを使用できるようにする

# アタッチしたサーバーにログイン接続してディスクデバイスを確認します。
lsblk

...
xvdf    202:80   0  16G  0 disk

# ファイルシステムを作成する
sudo mkfs -t xfs /dev/xvdf

# ディレクトリを作成してボリュームをマウント
mkdir -p /mnt/data; sudo mount /dev/xvdf /mnt/data

# 確認
df -h

下記、再起動後に接続ボリュームを自動的にマウントしたい場合 (別にしたくない場合は無視で良いです。)

# blkid コマンドを使用してデバイスの UUIDを確認
blkid

# 原本をコピー
sudo cp /etc/fstab /etc/fstab.org

sudo vi /etc/fstab
UUID=/dev/xvdf_UUID  /  xfs  defaults,noatime  1  1

# いったん外す
sudo umount /mnt/data
# 付ける
sudo mount -a

おかしかったら何か怒られます。

4 移行元のディレクトリから移行先の新規EBSボリュームにデータをコピーする

特に意味もありませんが、何かファイル作って、/var以下をコピーしてみましょうか。

# 1Gファイルを作成しておく
sudo dd if=/dev/zero of=/var/testfile bs=1024k count=1000

# /var以下をコピーする
sudo rsync -avh --progress /var /mnt/data

# 確認 約1Gが/mnt/dataに復号化されてコピーされました。
df -h

5 スナップショットを作成して、どこかの誰かに共有したりします。

暗号化されたスナップショットはCMKの設定を変更しないと共有できないようになっています。

Amazon EBS スナップショットの共有

暗号化されたスナップショットは共有することはできず、共有したい場合は、スナップショットの暗号化に使用するカスタムCMK も共有する必要があります。 AWSでは、デフォルトCMKを使用して暗号化されたスナップショットを共有することができません。 共有する予定のスナップショットは、代わりにカスタムCMK(カスタマー管理型のキー)を使用して暗号化する必要があります。

復号されたボリュームのスナップショットはパブリックおよびプライベートで共有可能ですね。

KMSで暗号化されたデータとは、KMSに紐付くユーザーやロールに限定されたデータとなっており、データの共有は基本的に非推奨(まぁ当たり前か)で、それでも共有したい場合は自己責任・管理で暗号鍵も一緒にお渡ししてね、ということですね。

6 後片付け

無益なAMIとスナップショットは漏れなく削除しておきましょう。(特にスナップショット)

感想

穴掘って、埋める、みたいな。

参考

Amazon EBS Encryption Amazon EBS スナップショットの共有