「自己暗号化ドライブ」の版間の差分
(同期) |
Kusanaginoturugi (トーク | 投稿記録) (→パスフレーズの変更: add == Waking up from suspend ==) |
||
169行目: | 169行目: | ||
# sedutil-cli --setSIDPwd <password> <newpassword> <device> |
# sedutil-cli --setSIDPwd <password> <newpassword> <device> |
||
# sedutil-cli --setAdmin1Pwd <password> <newpassword> <device> |
# sedutil-cli --setAdmin1Pwd <password> <newpassword> <device> |
||
+ | |||
+ | == Waking up from suspend == |
||
+ | |||
+ | {{Warning|Keeping the unlock password or hash on disk and in kernel memory is a requirement.}} |
||
+ | |||
+ | Suspending the system results in a crash by default, because power is being cut from the drive and that causes it to lock itself. In order to wake up from suspend the kernel should know a hashed password for the disk. This functionality is in-kernel since 4.11, but in it's only available via a fork of sedutil, {{AUR|sedutil-sleep-git}}. |
||
+ | |||
+ | Generate a hashed password for the [[block device]] specified as {{ic|''/dev/device''}}: |
||
+ | |||
+ | # sedutil-sleep --printPasswordHash ''password /dev/device'' |
||
+ | |||
+ | Then create a [[systemd]] service, inserting hashes for each device: |
||
+ | |||
+ | {{hc|1=/etc/systemd/system/sedutil-sleep.service|2= |
||
+ | [Unit] |
||
+ | Description=sedutil-sleep |
||
+ | |||
+ | [Service] |
||
+ | Type=oneshot |
||
+ | #Add as many ExecStart lines as needed here |
||
+ | ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 ''hash /dev/device'' |
||
+ | #ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 ''hash2 /dev/device'' |
||
+ | RemainAfterExit=true |
||
+ | |||
+ | [Install] |
||
+ | WantedBy=multi-user.target |
||
+ | }} |
||
== ディスク消去 == |
== ディスク消去 == |
2022年4月21日 (木) 15:17時点における版
現在では多数のハードディスクドライブ (HDD) メーカーからハードウェアベースのフルディスク暗号化 (FDE) が提供されています。特にソリッドステートドライブ (SSD) では珍しいものではなくなりました。フルディスク暗号化 (FDE) が組み込まれた HDD あるいは SSD のことは自己暗号化ドライブ (Self-Encrypting Drive, SED) と呼ばれるようになっています。OPAL は Trusted Computing Group によって開発された自己暗号化ドライブの規格です。
目次
概要
HDD/SSD メーカーによって製造されている最近の SED FDE は Trusted Computing Group (TCG) によって開発された OPAL 2.0 や Enterprise 標準に準拠しています。TCG 標準規格の Enterprise SAS バージョンは "TCG Enterprise" ドライブと呼称されます。標準に則って製造されたハードウェアのリストは こちら にあります。
(復号化するための) ドライブのロック解除はソフトウェアによって行われるか、あるいは電源が入ったときに起動前の認証環境や BIOS ベースの ATA パスワードが使われます。
ハードウェアベースの FDE が必要なのかどうか決めかねている場合は利点と欠点についてのセクションを読んでください。
鍵管理の技術的な実装
鍵の管理はディスクコントローラの中で行われ、暗号鍵は大抵128あるいは256ビットの Advanced Encryption Standard (AES) になります。
TCG OPAL 2.0 の標準仕様に準拠している SED は認証鍵 (Authentication Key, AK) とデータ暗号鍵 (Data Encryption Key, DEK) による鍵管理を実装しています。DEK はデータを暗号化・復号化するときに使用する鍵です。AK はユーザーが使用するパスワード・パスフレーズで、DEK を復号化します (そして復号化された DEK でデータが復号化されます)。このような暗号方式には以下のようなメリットがあります:
- ユーザーがパスフレーズを変更してもディスク上の既存の暗号データが使えなくなることはありません。
- パスフレーズが漏洩した場合に、すぐ簡単にパスフレーズを無効化できるためセキュリティ的にも優れています。
- 暗号的に安全にディスクを完全に消去することが容易になります。
暗号に精通している人のために説明すると、SED の鍵管理は dm-crypt でよく使われている LUKS の鍵管理レイヤーに似ています。LUKS を使用する際、ユーザーは8個までのキーファイルあるいはパスフレーズを使って暗号鍵を復号化して、それから暗号鍵によってデータを復号化します。パスフレーズやキーファイルを変更しても暗号鍵は変わらないため、データを再暗号化する必要がありません。
実際に、FDE 機能を搭載しているドライブでは、データをディスクに保存するときは常に DEK が用いられます。(新しいドライブの場合など) パスワードが設定されていない場合ですら DEK で暗号化されます。メーカーがこのようにしている理由は SED のセキュリティ機能を使えない、あるいは有効にしたくないユーザーのためです。全てのドライブがデフォルトで空文字のパスワードを使って透過的にデータを暗号化・復号化していると考えることもできます (ユーザーが操作しなくてもセキュアなアクセスが保証されるパスワード不要の ssh 鍵のようなものです)。
重要なのは後でユーザーが暗号化を有効にしたいと思ったときにパスワード (AK) を設定することができ、パスワードを使って既存の DEK が暗号化される点です (パスフレーズが必要になるのは DEK を復号化するときになります)。既存の DEK が変更されたり再生成されることはありませんが、ドライブにはロックがかかり、ディスク上の暗号化されたデータが失われることはありません。
利点
- (ソフトウェアベースの暗号化と比較した場合に) 設定が容易。
- 最初の起動時の認証を除けば、ユーザーが操作しなくても透過的に動作。
- 保存データ保護。
- 高いパフォーマンス (暗号化・復号化の計算に CPU が消費されません)。
- 攻撃経路を減らすことによる高いセキュリティ (攻撃対象からメイン CPU やメモリは除外されます)。
- (ディスク容量に比例しない) 高速かつ安全なディスク消去 (sanitation)。
- 起動前にディスクにアクセスすることはできず MBR を暗号化することができるため他のブート手段による攻撃から保護されます。
欠点
- 電源不断の脆弱性
- 基本的に、ロックが解除された自己暗号化ドライブは電源が供給されているかぎりロックが解除されたままになります。電源を切ることなくドライブの外に環境を変更することで、ロックが解除された状態でドライブの中を閲覧できてしまいます。例えば、電源を切らずに再起動して攻撃者が操作するオペレーティングシステムに乗っ取られる可能性があります (エアランゲン·ニュルンベルク大学の研究者によって検証済み)。また、電源を切らずに他のコンピュータにドライブを移動する方法も研究者によって実証されています [1]。
- メモリの脆弱性
- システムが S3 モード (スリープ状態) になると、ドライブの電源は落ちますが、復帰 (ウェイクアップ) のためにドライブは内部メモリ (NVRAM) に暗号鍵を保存します。起動前に復号化に必要なパスワードを再入力させる標準的な方法は存在しないため、任意のオペレーティングシステムでシステムを起動できるようにするには、どうしても内部メモリから暗号鍵にアクセスしなければなりません。(ドライブに物理アクセスできる) 攻撃者はこれを利用してドライブにアクセスすることが可能です。既知の脆弱性とあわせて、研究者は「システムが稼働中あるいはスタンバイ状態であればハードウェアベースの FDE でも12台中11台は破ることができる」としています [2]。ただし、(Linux で TCG OPAL 2.0 SED を管理するためのツールセットである) sedutil は S3 ("sleep") をサポートしていません。
- ファームウェアの脆弱性
- ドライブのファームウェアに枝 (バックドア) をつけられる可能性があり、そこからデータが漏洩する危険性があります (物理的なドライブにアクセスさえできれば悪意を持った第三者によって復号化されるかもしれません)。ただし、(dm-crypt などを使って) データをオペレーティングシステムで暗号化していれば、ドライブから暗号鍵を再生できないため、攻撃経路を断つことができます。
Linux のサポート
Linux において SED のサポートを得るためのオープンソースのコードベースである msed と OpalTool はどちらも開発が中止され、開発は公式に Drive Trust Alliance (DTA) 傘下の sedutil に移っています。sedutil は誰でも自由に自己暗号化ドライブの技術を使えるようにすることを目指しているオープンソース (GPLv3) のプロジェクトです。
sedutilAUR パッケージをインストールしてください。sedutil-cli ツールと、使用中の OS から起動前認証 (PBA) イメージを作成するためのヘルパースクリプトが含まれています (カスタムコンソールキーマップの設定などが行えます)。sedutil-cli ツールセットを使うためだけに sedutil をインストールすることもできます。Drive Trust Alliance によって提供されている コンパイル済みの PBA イメージ (BIOS 用) をインストール・使用してください。UEFI マシンの場合、64ビットの UEFI PBA をダウンロードしてください。
sedutil を使用するには libata.allow_tpm
を 1
(true) に設定しなければなりません。カーネルパラメータに libata.allow_tpm=1
を追加するか、実行中の環境で /sys/module/libata/parameters/allow_tpm
を 1
に設定してください。
ルート (ブート) ドライブの暗号化
以下の手順では sedutil-cli ツールのインストールが必要です。
ディスクが OPAL に対応しているか確認
以下のコマンドを実行してください:
# sedutil-cli --scan
以下のように表示される場合:
Scanning for Opal compliant disks /dev/sda No LITEONIT LMT-256L9M-11 MSATA 256GB HM8110B
あなたの使っているディスクは OPAL に対応していません。逆に、OPAL に対応していると以下のような出力がなされます:
/dev/sda 12 Samsung SSD 850 EVO 500GB EMT02B6Q
Windows 版の sedutils は以下のように出力します:
\\.\PhysicalDrive0 12 Samsung SSD 850 PRO 512GB EXM02B6Q
起動前認証 (PBA) イメージのダウンロード (または作成)
BIOS あるいは 64ビット UEFI マシン用の起動前認証 (PBA) イメージをダウンロードしてください。
もしくは、ヘルパーを使って自分で PBA イメージを作成することもできます。
EFI イメージ (/boot/linuxpba-efi.diskimg
) を作成するには:
# mklinuxpba-efi
BIOS イメージ (/boot/linuxpba.diskimg
) を作成するには:
# mklinuxpba-bios
マシンで PBA をテスト (任意)
公式ドキュメント を参照してください。
OPAL ディスクのリストを取得する方法はありません。USB メモリから PBA を試みても SSD ディスクの OPAL ロックは有効になりません。"INVALID PARAMETER" と書かれたエラーメッセージが表示されます ([3] を参照)。
レスキューイメージの準備とテスト (任意)
公式ドキュメント を参照してください。
ドライブのセットアップ
PBA を解凍してください:
$ gunzip pba.img.gz
lsblk --fs
で適切なドライブを確認して、以下のコマンドを実行してください:
# sedutil-cli --initialsetup <password> <drive> # sedutil-cli --loadPBAimage <password> <pba_file> <drive> # sedutil-cli --setMBREnable on <password> <drive>
ロックの有効化
以下のコマンドを実行してください:
# sedutil-cli --enableLockingRange 0 <password> <drive>
コンピュータの電源を切るとドライブが施錠されます。
次にコンピュータの電源を入れると、PBA はパスワードを要求します。それからドライブが解錠されて復号化された OS がチェインロードされます。
ライブ環境からドライブにアクセス
Shadow MBR を実行したい場合、先に暗号化された SSD を起動するのが一番簡単です。それからブートメニューが表示されるので適切なデバイスで起動してください。それで SED は完全に透過されます。
ライブ環境を直接起動して sedutil を使って SSD のロックを解除する方法もあります:
# sedutil-cli --setlockingrange 0 rw <password> <drive> # sedutil-cli --setmbrdone on <password> <drive>
sedutil を使用するには libata.allow_tpm
を 1
(true) に設定しなければなりません。カーネルパラメータに libata.allow_tpm=1
を追加するか、実行中の環境で /sys/module/libata/parameters/allow_tpm
を 1
に設定してください。
ロックの無効化
ロックと PBA をオフにしたい場合:
# sedutil-cli --disableLockingRange 0 <password> <drive> # sedutil-cli --setMBREnable off <password> <drive>
ロックと PBA の再有効化
ロックと PBA を再度有効化するには以下のコマンドを実行してください:
# sedutil-cli --enableLockingRange 0 <password> <drive> # sedutil-cli --setMBRDone on <password> <drive> # sedutil-cli --setMBREnable on <password> <drive>
ルートドライブ以外の暗号化
ルート以外のドライブは PBA のロードを必要としません。以下のコマンドを実行するだけで暗号化が有効になります:
# sedutil-cli --initialsetup <password> <drive>
パスフレーズの変更
パスワードを変更しても既存のデータが消えることはなく、データの再暗号化も必要ありません。変更するには:
# sedutil-cli --setSIDPwd <password> <newpassword> <device> # sedutil-cli --setAdmin1Pwd <password> <newpassword> <device>
Waking up from suspend
Suspending the system results in a crash by default, because power is being cut from the drive and that causes it to lock itself. In order to wake up from suspend the kernel should know a hashed password for the disk. This functionality is in-kernel since 4.11, but in it's only available via a fork of sedutil, sedutil-sleep-gitAUR.
Generate a hashed password for the block device specified as /dev/device
:
# sedutil-sleep --printPasswordHash password /dev/device
Then create a systemd service, inserting hashes for each device:
/etc/systemd/system/sedutil-sleep.service
[Unit] Description=sedutil-sleep [Service] Type=oneshot #Add as many ExecStart lines as needed here ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 hash /dev/device #ExecStart=-+/usr/bin/sedutil-sleep -n -x --prepareForS3Sleep 0 hash2 /dev/device RemainAfterExit=true [Install] WantedBy=multi-user.target
ディスク消去
SED ではディスクの完全消去は簡単・高速です。(適切な認証情報を入力した後に) 暗号ディスク消去 (crypto erase) コマンドを実行するだけで、ドライブは内部的に新しいランダムな暗号鍵 (DEK) を自動生成します。古い鍵は使えなくなるため、暗号化されたデータには永久に復元できなくなります。ドライブは購入時と同じ状態になります。
BIOS ベースの ATA パスワード
業界標準の TCG OPAL 2.0 が作られる前は、ATA 標準によって SED FDE の "ATA Security feature Set" が定義されていました。(SSD や HDD ではなく) PC の BIOS を利用してユーザーの暗号パスワード・パスフレーズを設定してロックを解除する方式です。このような旧式の BIOS ベース (ATA) の方法は信頼性が欠けており PC メーカー間の相互運用性は乏しいものでした [4]。例えば、別のハードウェアメーカーのシステムに接続するとデバイスのロックを解除できないなどの不備があります。最近はこのような旧式のパスワード保護機能は BIOS からなくなってきています (特に一般消費者向け製品)。