仮想マシンセキュリティ強化-ディスク暗号化の有効化方法

IPVではWindows Server、Linuxが標準で提供しているソフトウエアベースのディスク暗号化機能が利用可能です。
IPVでは本機能を利用したディスクの暗号化する事を推奨しております。

本ガイドでは、仮想マシンへ追加されたデータボリュームに対してディスク暗号化機能を適用する手順を記載します。

OSごとのディスク暗号化機能

本ガイドで利用するソフトウエアベースのディスク暗号化機能は、以下の通りです。

ディスク暗号化機能
OS 機能名 概要
Windows Server BitLocker
オペレーティングシステムと統合されたディスク暗号化機能です。
ドライブ全体を暗号化することにより、データの盗難や漏洩の脅威に対して強固なセキュリティを提供します。
Windows Server2012以上で利用可能です。
Linux LUKS(Linux Unified Key Setup-on-disk-format)
Linuxで提供されるディスク暗号化のための標準的な仕組みです。
本機能はブロックデバイス全体を暗号化します。
ファイルやディレクトリ(フォルダ)単位ではなく、パーティションを丸ごと暗号化する為、ファイルの個数や種類、サイズなども秘匿できます。
暗号化そのものを意識せずに普通の保存領域として使うことができます。

注釈

弊社より提供するプレイベートテンプレートのデプロイ時、ディスクの暗号化はされておりません。


前提条件

本ガイドでは、"Org Admin"での操作を想定しています。
IPVご利用開始時に標準で用意されているロール、ロールに紐づいている権限は以下を参照下さい。


作業手順

1. BitLockerを使ったWindows Serverのディスク暗号機能の有効化

Windows Serverの仮想マシンへ"BitLocker"を導入してディスクを暗号化する手順を記載します。

1.1. 事前準備

他チュートリアルを参考に仮想ネットワーク、および仮想マシンを作成します。
本ガイドにおける、仮想マシンのスペックは下記の通りです。

ディスク暗号化適用仮想マシン
テンプレート名 追加するディスクのサイズ
WindowsServer-2019_Standard_64_include-license_hw17_MvP_01 100GB

追加するディスクは、データボリュームとして利用します。
事前にディスクのフォーマットを実施しておきます。

1.2. 仮想マシンへのBitLockerの導入

注釈

OS上の操作はAdministratorで行います。

[Server Manager]->[Dashboard]->[Add roles and features]をクリックします。

../_images/guide_sec-instbitlocker_001.png

[Add roles and features]ウィザードが起動します。
そのまま[Next]をクリックします。

../_images/guide_sec-instbitlocker_002.png

"Role-based or feature-based installation"にチェックが付いていることを確認し、[Next]をクリックします。

../_images/guide_sec-instbitlocker_003.png

"Select a server from the server pool"にチェックが付いていること、Server Pool欄のデプロイサーバーが選択されていることを確認し、[Next]をクリックします。

../_images/guide_sec-instbitlocker_004.png

そのまま[Next]をクリックします。

../_images/guide_sec-instbitlocker_005.png

「BitLocker Drive Encription」にチェックを入れます。

../_images/guide_sec-instbitlocker_006.png

確認ダイアログが表示されますので、[Add Features]をクリックします。

../_images/guide_sec-instbitlocker_007.png

[Next]をクリックします。

../_images/guide_sec-instbitlocker_008.png

注釈

BitLocker Disk Encription、Enhanced Storageにチェックがつきます。

インストール内容を確認し[Install]をクリックします。

../_images/guide_sec-instbitlocker_009.png

インストールが実行され、エラーメッセージが表示されないことを確認します。
インストール完了後、仮想マシンを再起動して下さい。

../_images/guide_sec-instbitlocker_010.png

以上で、仮想マシンへ"BitLocker"が導入されます。

1.3. ディスクの暗号化

"BitLocker"を使って、データボリュームを暗号化します。

[スタート]->[ファイルエクスプローラー]を起動します。
[This PC]を選択し、"New Volume(ドライブレター)"が表示されていることを確認します。

../_images/guide_sec-bitlocker_001.png

"New Volume(ドライブレター)"を右クリックし、メニューより[Turn on BitLocker]をクリックします。

../_images/guide_sec-bitlocker_002.png

[BitLocker Drive Encription]ダイアログが起動します。
"Use a Password to unlock the drive"をチェックし、ボリュームの暗号化を解除するためのパスワードを設定し、、[Next]をクリックします。

../_images/guide_sec-bitlocker_003.png

"Save to File"をクリックし、リカバリKeyとなるファイルを保存します。
[Next]をクリックします。
../_images/guide_sec-bitlocker_004.png

|"Encrypt used disk space only(faster and best for new PCs and drives)"をチェックし、[Next]をクリックします。 |

../_images/guide_sec-bitlocker_005.png

"Compatible mode(best for drivers that can be moved from this device)"をチェックし、[Next]をクリックします。
../_images/guide_sec-bitlocker_006.png

[Start Encryption]をクリックします。
../_images/guide_sec-bitlocker_007.png

暗号化処理が完了したら、ボリュームアイコンに鍵アイコンが表示されます。

../_images/guide_sec-bitlocker_008.png

以上で、データボリュームの暗号化が完了です。
ディスクを追加した場合は、本手順に従い暗号化してください。

2. LUKSを使ったLinuxのディスク暗号機能の有効化

Linuxの仮想マシンへ"LUKS"を導入してディスクを暗号化する手順を記載します。
本ガイドでは"LUKS"を使用しユーザーホームディレクトリ用の暗号化パーティションを作成します。
これにより、仮想マシンパフォーマンスを損なわずにセキュリティを強化することが可能となります。

2.1. 事前準備

他チュートリアルを参考に仮想ネットワーク、および仮想マシンを作成します。
本ガイドにおける、仮想マシンのスペックは下記の通りです。

ディスク暗号化適用仮想マシン
テンプレート名 追加するディスクのサイズ
RedHatEnterpriseLinux-8.1_64_include-license_hw17_MvP_01 100GB

追加するディスクは、データボリュームとして利用します。
事前にディスクのフォーマットを実施しておきます。

2.2. 仮想マシンへのLUKSの導入

注釈

OS上の操作はroot権限のあるユーザー(以下、データボリューム利用ユーザー)で行います。

  • "LUKS"パッケージを導入します。
    以下コマンドにて必要なパッケージをインストールします。
Linux
yum install -y cryptsetup cryptsetup-libs

## 出力例(RedHat Enterprise Linux8.1テンプレート利用時)
Last metadata expiration check: ~ 中略 ~
Upgraded:
 cryptsetup-libs-2.3.3-4.el8.x86_64
Installed:
 cryptsetup-2.3.3-4.el8.x86_64
Complete!

以上で、仮想マシンへ"LUKS"が導入されます。

2.3. ディスクの暗号化

ディスクの暗号化は、暗号化したパーティションをマウントする方法ごとに2種類記載します。
OS起動後に手動でマウントする方法、OS起動時に自動でマウントする方法です。

2.3.1 暗号化したパーティションをOS起動後に手動でマウントする方法
暗号化したパーティションを手動でマウントする手順を記載します。

追加したディスクのパーティションを暗号化します。

Linux
# パーティションを暗号化
cryptsetup luksFormat /dev/sdb1

## 出力例
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.

### YESを大文字で入力
Are you sure? (Type uppercase yes): YES

### パスフレーズを設定
Enter passphrase for /dev/sdb1:
Verify passphrase:

パスフレーズチェック時にてエラーとなる場合のメッセージ: 以下メッセージが出た場合は、パスフレーズを見直して下さい。
(参考)
Password quality check failed:
 The Password fails the dictionary check - it is based on a dictionary word

暗号化したパーティションを開き、フォーマットを行います。

Linux
# 暗号化したパーティションを開く
cryptsetup luksOpen /dev/sdb1 {データボリューム利用ユーザー名}

# パスフレーズを入力
Enter passphrase for /dev/sdb1:

# 暗号化パーティションのフォーマット
mkfs.xfs /dev/mapper/{データボリューム利用ユーザー名}

# フォーマットされたことを確認
fdisk -l

## 出力例
Disk /dev/mapper/{データボリューム利用ユーザー} : ~ 中略 ~

"データボリューム利用ユーザー"のホームディレクトリに対して暗号化ディスク領域をマウントします。
既存の"データボリューム利用ユーザー"ホームディレクトリをバックアップし、新規にマウント用のホームディレクトリを作成します。

Linux
# ホームディレクトリをバックアップ
mv /home/{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}.bk

# マウントポイントとなる新規ホームディレクトリを生成
mkdir /home/{データボリューム利用ユーザー名} && chown -R {データボリューム利用ユーザー名}:{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}

# 暗号化ディスク領域をマウント
mount -t xfs /dev/mapper/{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}

以上で、暗号化したパーティションを手動でマウントできました。

なお、暗号化したパーティションをアンマウントする手順は次の通りです。

Linux
# ホームディレクトリをアンマウント
umount /home/{データボリューム利用ユーザー名}

# 暗号化したパーティションを解除します。
cryptsetup luksClose {データボリューム利用ユーザー名}

この場合、OS起動ごとに追加したディスクのマウントが必要となります。
OSの再起動などでディスクがアンマウントされれた場合、以下の手順でマウントをします。

Linux
# 暗号化したパーティションを開く
cryptsetup luksOpen /dev/sdb1 {データボリューム利用ユーザー名}

# パスフレーズを入力
Enter passphrase for /dev/sdb1:

# 暗号化ディスク領域をマウント
mount -t xfs /dev/mapper/{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}

次に、暗号化したパーティションをOS起動時に自動でマウントする方法を記載します。

2.3.2 暗号化したパーティションをOS起動時に自動でマウントする方法1(手動でマウントする方法の自動化)
「2.3.1」で構築した環境に鍵ファイルを追加し、暗号化したパーティションをOS起動時に自動でマウントできるようにします。
暗号化したパーティションのマウントを解除します。

Linux
# ホームディレクトリをアンマウントします。
umount /home/{データボリューム利用ユーザー}

# 暗号化したパーティションを解除します。
cryptsetup luksClose {データボリューム利用ユーザー}

暗号化したパーティションをマウントする為の鍵ファイルを生成します。
以下のコマンドで鍵ファイルを生成します。

Linux
# 鍵ファイルの作成
# ※ここでは例として/etc/keyfileとします。
echo -n '{パスフレーズ}' > /etc/keyfile

# ファイルの所有者等を変更
chown {データボリューム利用ユーザー名}:{データボリューム利用ユーザー名} /etc/keyfile; chmod 400 /etc/keyfile

生成した鍵ファイルを使った暗号化、マウントを行います。

Linux
# Keyファイルを使用して暗号化
cryptsetup luksOpen /dev/sdb1 {データボリューム利用ユーザー}  --key-file /etc/keyfile

# 暗号化したパーテイションをマウント
mount -t xfs /dev/mapper/{データボリューム利用ユーザー} /home/{データボリューム利用ユーザー}

crypttabへの登録を行います。

Linux
vi /etc/crypttab

# 以下を追記
{データボリューム利用ユーザー名} /dev/sdb1 /etc/keyfile luks,timeout=5

OS起動時にマウントが実行されるようrc.localファイルへ設定を追加します。

Linux
vi /etc/rc.local

# 以下を追記
mount -t xfs /dev/mapper/{データボリューム利用ユーザー} /home/{データボリューム利用ユーザー}

# rc.localファイルの権限設定変更
chmod 755 /etc/rc.d/rc.local

仮想マシンの再起動を行い、暗号化したパーティションが自動で接続されることを確認します。

Linux
# マウントの確認
findmnt

## 出力例
TARGET                               SOURCE                                      FSTYPE      OPTIONS
~ 中略 ~
/home/{データボリューム利用ユーザー}   /dev/mapper/{データボリューム利用ユーザー}    xfs         rw,relatime,attr2,inode64,noquota

以上で暗号化したパーティションの自動接続処理が完了です。

2.3.3 暗号化したパーティションをOS起動時に自動でマウントする方法2(ランダムな文字列を使った鍵ファイル)
暗号化したパーティションを自動でマウントする手順を記載します。
本手順ではパスフレーズを乱数にて生成し、鍵ファイルとして保存します。
鍵ファイルは、暗号化したパーティションへのアクセス時に使用します。

鍵ファイルを生成します。
2048バイトのランダムな文字列にて鍵ファイルを生成します。

Linux
# ランダムな文字列を生成し鍵ファイル("/etc/randkeyfile"ファイル)へ保存
dd bs=512 count=4 if=/dev/urandom of=/etc/randkeyfile

# Keyファイルの所有者等を変更
chown {データボリューム利用ユーザー}:{データボリューム利用ユーザー} /etc/randkeyfile; chmod 400 /etc/randkeyfile

鍵ファイルを使用してパーティションを暗号化します。

Linux
# 鍵ファイルを使用してパーティションを暗号化
cryptsetup luksFormat /dev/sdb1 --key-file /etc/randkeyfile

## 出力例
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.

### YESを大文字で入力
Are you sure? (Type uppercase yes): YES

暗号化したパーティションを開き、フォーマットを行います。

Linux
# 暗号化したパーティションを開く
cryptsetup luksOpen /dev/sdb1 {データボリューム利用ユーザー名} --key-file /etc/randkeyfile

# 暗号化したパーティションのフォーマット
mkfs.xfs /dev/mapper/{データボリューム利用ユーザー名}

# フォーマットされたことを確認
fdisk -l

## 出力例
Disk /dev/mapper/{データボリューム利用ユーザー名} : ~ 中略 ~

"データボリューム利用ユーザー名"のホームディレクトリに対して暗号化ディスク領域をマウントします。
既存の"データボリューム利用ユーザー"ホームディレクトリをバックアップし、新規にマウント用のホームディレクトリを作成します。

Linux
# ホームディレクトリをバックアップ
mv /home/{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}.bk

# マウントポイントとなる新規ホームディレクトリを生成
mkdir /home/{データボリューム利用ユーザー名} && chown -R {データボリューム利用ユーザー名}:{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}

# 暗号化ディスク領域をマウント
mount -t xfs /dev/mapper/{データボリューム利用ユーザー名} /home/{データボリューム利用ユーザー名}

crypttabへの登録を行います。

Linux
vi /etc/crypttab

# 以下を追記
{データボリューム利用ユーザー名} /dev/sdb1 /etc/randkeyfile luks,timeout=5

OS起動時にマウントが実行されるようrc.localファイルへ設定を追加します。

Linux
vi /etc/rc.local

# 以下を追記
mount -t xfs /dev/mapper/{データボリューム利用ユーザー} /home/{データボリューム利用ユーザー}

# rc.localファイルの権限設定変更
chmod 755 /etc/rc.d/rc.local

仮想マシンの再起動を行い、暗号化したパーティションが自動で接続されることを確認します。

Linux
# マウントの確認
findmnt

## 出力例
TARGET                               SOURCE                                      FSTYPE      OPTIONS
~ 中略 ~
/home/{データボリューム利用ユーザー}   /dev/mapper/{データボリューム利用ユーザー}    xfs         rw,relatime,attr2,inode64,noquota

以上で暗号化したパーティションの自動接続処理が完了です。