Mac
Linux
archLinux
ssd

MacBook Air (Mid 2012)のSSDをSecure Eraseで完全消去してみた

前置き

概要

OSの入れ直しを行う前に一度MacBook AirのSSDの完全消去を行いたくなったので、その方法を調べて実行してみました。
HDDであればddやshredなどのコマンドで全領域に0を書き込んだりすれば済むのでシンプルですが、SSDの場合にはそれでは確実にデータが消去されない可能性があります。SSDの場合には可能であればSecure Erase機能を利用した方が確実でしょう。
本記事ではUSBメモリからLinuxを起動し、コマンドを実行することでSSDのSecure Eraseを実行しています。
新し目のバージョンのhdparmコマンドが使えればLinuxのディストリビューションやバージョンは何でも構わないはずですが、ここではArch LinuxのインストールISO(2018.11.01)を使用する手順としています。

注意事項

本記事は、以下の実行環境に記す環境において下記手順が成功したことを記録するものであり、同等機種を含むMacBookや他のコンピュータにおいて同様の手順が成功することを保証するものではありません。
また下記手順を実行した際、操作ミスなどによるデータの誤消去や、各機能の実行を受け付けないSSDが使用不可に陥るなどのトラブルが発生したとしても筆者は一切の責任を負いません。
実行する場合には自己責任であることを承知の上で行うようにしてください。

実行環境

MacBook Air 11インチ (Mid 2012)
CPU: Intel Core i5
メモリ: 8GB
SSD: 128GB

手順

起動用USBメモリの作成

概要にも記載した通り、ここでは起動用のUSBメモリとして、Arch LinuxのインストールISOを使用します。
一言でまとめればUSB インストールメディア - ArchWikiに沿ってやればいいです。
ここではmacOS Mojave (10.14.1)で起動用USBメモリの作成を実施した例を示します。

まずはインストールISOをダウンロードしてきます。
Arch Linux - Downloads
タイミング的に、2018年11月1日付リリースのイメージがダウンロードできる状態でした。
これを ~/Downloads/archlinux-2018.11.01-x86_64.iso として保存したものとします。

次にUSBメモリを本体に挿入します。
今回使用したUSBメモリは手元にあった8GBのもので、念のために予めMS-DOS(FAT)/MBRでフォーマットしておきました。
なおISOイメージが614MB程度なので、USBメモリは1GBもあれば充分なんじゃないでしょうか。

ターミナルを開き、USBメモリのパスを確認します。

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI BOOT                    536.9 MB   disk0s1
   2:                 Apple_APFS Container disk1         120.8 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +120.8 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume macOS                   13.6 GB    disk1s1
   2:                APFS Volume Preboot                 25.0 MB    disk1s2
   3:                APFS Volume Recovery                509.8 MB   disk1s3
   4:                APFS Volume VM                      1.1 GB     disk1s4

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.7 GB     disk2
   1:                 DOS_FAT_32 USB                     7.7 GB     disk2s1

/dev/disk0 が本体のSSDで、 /dev/disk1 がそのうちのAPFS領域ですね。
USBメモリは /dev/disk2 であることが確認できました。

書き込みを行う前にUSBメモリをアンマウントします。

$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful

無事にアンマウントができたようなので、ddコマンドを使用してISOイメージをUSBに書き込みます。
/dev/disk2 ではなく /dev/rdisk2 を指定しrawモードを利用してデータ転送を高速化します。
ちなみにbsで指定するサイズ単位は小文字じゃないとエラーになるようなので要注意です。

$ sudo dd if=~/Downloads/archlinux-2018.11.01-x86_64.iso of=/dev/rdisk2 bs=8m

筆者の環境では2分かからない程度で処理が完了しました。
書き込み完了時に『セットしたディスクは、このコンピュータで読み取れないディスクでした。』というダイアログが出ますがこれは"無視"でOKです。

これで起動用のUSBメモリが作成できました。

Linuxでの起動とコマンド実行

一旦システム終了してから、作成した起動用USBメモリが本体に挿してあることを確認して起動ボタンを押します。
起動中にoptionキーを押しっぱなしにすることでブートデバイスの選択が可能になるので、オレンジ色アイコンの"EFI Boot"を選択してEnterキーを押します。
いくつかブートメニューが出てくるので一番上の"Arch Linux archiso x86_64 UEFI CD"を選択してEnterキーを押すか、放っておいて自動で選択されて進むのを待ちましょう。
その後はArch Linuxの起動プロセスが走り、プロンプトが表示されます。

Arch Linux 4.18.16-arch1-1-ARCH (tty1)

archiso login: root (automatic login)
root@archiso ~ #

筆者のMacBook Airは英語キーボードのため不要なのですが、日本語キーボードなどの環境ではここでまずキーボードレイアウトの指定をしておいた方が入力がやりやすいかもしれません。方法は インストールガイド - ArchWiki を参照してください。

それではまずディスクの確認から行っていきます。

# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 474.1M  1 loop /run/archiso/sfs/airootfs
sda      8:0    0   113G  0 disk
├sda1    8:1    0   512M  0 part
└sda2    8:2    0 112.5G  0 part
sdb      8:16   1   7.2G  0 disk
├sdb1    8:17   0   586M  0 part /run/archiso/bootmnt
└sdb2    8:18   0    64M  0 part

SIZE欄から、sdaがMacBook Air本体のSSD、sdbが起動用USBディスクであることが分かります。
(余談: 前までEFI System Partitionって200MBで作成されていませんでしたっけ? macOS Mojave 10.14.1で変わったような気がする…。)

SSDのパスも分かったのでhdparmコマンドで現状を確認しましょう。

# hdparm -I /dev/sda
(省略)
Security:
        Master password revision code = 65533
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
(省略)

見ての通り frozen 状態になっています。(何度か試してますが毎回こうなってました)
not frozenでなければSecure Eraseは実行できないため、frozen状態を解除します。

筆者の環境では、一旦サスペンド状態にしてから復帰させることで解除ができました。

# echo -n mem > /sys/power/state

上記コマンドを実行すると即座に画面が消えてサスペンド状態になります。電源ボタンを押せば復帰できます。
これで再度確認。

# hdparm -I /dev/sda
(省略)
Security:
        Master password revision code = 65533
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
(省略)

frozenがnot frozenに変わりました。

次にセキュリティの有効化です。一時的にユーザーパスワードを設定することになります。
このパスワードはあくまで一時的なものなので悩まなくていいです。ここでは hoge を指定する例を示します。

# hdparm --user-master u --security-set-pass hoge /dev/sda
security_password: "hoge"

/dev/sda:
 Issuing SECURITY_SET_PASS command, password="hoge", user=user, mode=high

通った模様。確認してみます。

# hdparm -I /dev/sda
(省略)
Security:
        Master password revision code = 65533
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        Security level high
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
(省略)

not enabledだったのがenabledに変わり、Security level highという行も追加されています。
これでちゃんと有効になったようです。

ではSecure Eraseコマンドの実行です。
先程の出力結果ではEnhancedでもそうでなくとも同じく2minという表記になっていますが、これはどちらにしても同じ方式で処理が行われるということらしいです。実際に非EnhancedとEnhancedの両方を試してみましたが、明確な差は感じられませんでした。

ここでは一応Enhancedで処理をするように明示したコマンドを記載しておきます。

注意: これでSSDのデータが完全に消去されます。一度実行してしまうと復旧できません。

# hdparm --user-master u --security-erase-enhanced hoge /dev/sda
security_password: "hoge"

/dev/sda:
 Issuing SECURITY_ERASE command, password="hoge", user=user

2minとか言っていた割には一瞬で完了します。
(非EnhancedでもEnhancedでもどちらでも一瞬でした)

実行結果の確認

実行後の状況をhdparmコマンドで確認してみます。

# hdparm -I /dev/sda
(省略)
Security:
        Master password revision code = 65533
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
(省略)

enabledだったのがnot enabledに戻り、Security level highの行も消えました。
Secure Eraseが実行されて、それまでの設定がクリアされたように見えます。
一時的に設定していたパスワードもこの時点で解除されています。

またodコマンドを利用して、実際のディスクデータを直接覗いてみます。先頭16MB程度を確認してみましょう。

# od -tx1 --read-bytes=16m /dev/sda
0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 *
100000000

確認した範囲ではすべて0で埋め尽くされているようなので、全領域がクリアされていそうです。
またgdiskを起動して、パーティションテーブルがなくなっていることも確認しておきます。

# gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.4

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

(省略)

すべてnot presentなので、パーティションテーブルも完全に消去できていることが分かります。

消去作業としては以上です。
この状態からインターネット復元を利用してmacOSをインストールするもよし、そのまま続けてArch Linuxをインストールするもよし、です。

参考にさせて頂いたページ

Secure Eraseの詳細及び実行手順
SSDをSecure Erase機能で安全に消去する - Qiita
ソリッドステートドライブ/メモリセルの消去 - ArchWiki

odコマンドによるディスクデータ確認
ゼロ書き込みしたHDDの状態を確認する方法 - しょぼんメモリ (´・ω・`)