消去に、証跡を。— Erase with evidence.
English · 安全上の注意 · 消去方式 · ビルド · レポート仕様
Kiyome Storage OS(以下Kiyome)は、日本語を既定表示にしたUSB起動型のストレージ・データ消去OSです。磁気HDDの直接上書き、NVMe Sanitize、進捗と残り時間、ストレージ単位の監査履歴を、誤操作を防ぐ一つの画面フローにまとめることを目指しています。
Caution
現在は 0.1.0-alpha.1 です。価値のあるデータや業務用媒体には使用しないでください。 実ストレージ向けコードは含まれますが、対応機種ごとのHIL(実機)試験とリリース監査は未完了です。廃棄可能な専用媒体またはQEMUだけで評価してください。
Important
Kiyomeはデータを消去しますが、記憶媒体を物理的には破壊しません。法令・契約・組織規程で物理破壊が必要な場合、その代替にはなりません。
| 機能 | 状態 |
|---|---|
| 日本語/英語のフルスクリーンTUI | 実装済み |
| 保護対象を含むストレージ一覧、初期選択なし | 実装済み |
| 起動・ログ媒体の親ディスク保護、実行直前の対象再照合 | 実装済み(単純なblock-device構成。複雑なdm/md/multipathは未検証) |
| HDDの1-pass、Legacy 3-pass、7-pass、Gutmann | Kiyomeの直接上書きbackendを実装済み、実機検証前 |
| NVMe Sanitize Block Erase / Crypto Erase | SANICAP検出・scope固定・SPROG/SSTAT監視を開発実装済み、実機検証前 |
| ATA Sanitize Block Erase | profile/probe codeは将来用に保持するが、alphaでは選択・実行とも無効 |
| 進捗率、速度、経過時間、ETA | 直接上書きは実処理byte数、NVMeはcontroller statusから算出。根拠がない値は「算出不能」 |
| JSON、日英TXT、JSONLイベント、主要run artifactのSHA-256 manifest | 実装済み |
| WWNまたはserial+model+sizeによるストレージ別履歴 | 実装済み |
| Debian Live ISOと2パーティションUSB作成スクリプト | 実装済み、QEMU/実機boot試験前 |
| SATA Security Erase fallback、SCSI/SAS、eMMC、TCG Opal | ロードマップ |
この表の「実装済み」は安全性や規格適合の認証を意味しません。公開用の最初の目標は、QEMU試験と複数機種のHIL試験を通過した限定的な0.1.0です。
┌──────────────────────────────────────────────────────────────────────────────┐
│ Kiyome 0.1.0-alpha.1 ストレージ・データ消去専用OS │ 日本語 │ LOG: OK │
│ ALPHA — 廃棄可能な検証用媒体以外には使用しないでください │
├──────────────────────────────────────────────────────────────────────────────┤
│ 4 実行中 │
├──────────────────────────────────────────────────────────────────────────────┤
│ Example Enterprise HDD 2.0 TiB SN HDD-DEMO-0728 │
│ フェーズ: 検証 │
│ ███████████████████████████████░░░░░░░░░ 74.2% │
│ 経過: 00:42:17 残り: 00:14:36 速度: 182.4 MiB/s │
│ │
│ C 中止要求(ネイティブSanitizeは停止できません) │
└──────────────────────────────────────────────────────────────────────────────┘
色だけで状態を示さず、80×24端末でも主要操作ができる設計です。Live OSはNoto CJKとfbtermを使います。framebufferを使えないkernel VTへfallbackした場合は日本語glyphが出ない可能性があるため、一覧画面でLを押して英語へ切り替えられます。
Node.js 20以降だけで動作し、外部パッケージはありません。デモは架空の機器を使い、実ストレージへ書き込みません。
.\scripts\run-demo.ps1Linux/macOSでは次のとおりです。
npm run demo一覧だけをJSONで確認することもできます。
node ./bin/kiyome.mjs inventory --demo --jsonデモレポートは既定で.kiyome-demo-logs/KIYOME/へ保存されます。
| 画面上の方式 | 主な対象 | 実装 | 表示する保証 |
|---|---|---|---|
| ホスト上書き — Clear候補(ゼロ1回+読取検証) | HDD/汎用block device。flashにもClear候補として選択可 | pinしたFDへ00を直接書込み、fsync後に同じbuffered FDで最終pass全論理範囲を読戻し |
Clear候補 |
| NVMe Sanitize Block Erase | NVMe SSD | nvme sanitize+Sanitize Status Log |
条件付きPurge候補 |
| NVMe Sanitize Crypto Erase | 常時暗号化済みNVMe | 同上 | 厳しい前提付きPurge候補 |
| ATA Sanitize Block Erase | SATA/ATA | alphaでは無効。安全にpinできるATA/SG endpointとHIL試験が将来要件 | 将来の条件付きPurge候補 |
| Legacy 3-pass | 磁気HDD | 00 → FF → AES-256-CTR一時疑似乱数 |
歴史的互換方式。現行DoD準拠ではない |
| Legacy 7-pass / Gutmann | 磁気HDD | 固定済みpattern列をpinしたFDへ直接上書き | 歴史的互換方式 |
NIST SP 800-88 Rev.2はClear/Purge/Destroyを結果で分類し、技術固有のrecipeを本文から外してIEEE 2883等へ委ねています。上の1-pass方式はKiyomeがClear候補としてmappingするhost overwriteであり、NISTがこのrecipeや製品を認証したものではありません。SSDはwear levelingと予備領域があるため、host overwriteをPurgeとは扱いません。詳しくは消去方式と根拠を参照してください。
host overwriteは対象をO_EXCL付きでopenしてfile descriptorへ固定し、外部上書きtoolを介さずchunk単位で直接writeします。各pass後にfsyncし、最後のpassは同じbuffered FDから全論理範囲を読み戻して期待byte列と比較します。page cacheを明示invalidateせずO_DIRECTも使わないため、mediaからの独立した再読取証明ではありません。進捗、速度、ETAはwriteとreadbackで実際に処理した論理byte数から計算します。この検証はhostから見えるLBAだけが対象で、hidden area、SSDのspare area、再割当領域まで証明しません。
ビルドはDebian 13(trixie)または互換環境を想定しています。
sudo apt install live-build
sudo ./scripts/build-iso.sh成果物はout/kiyome-amd64.isoとSHA-256ファイルです。同じUSBへ履歴を残すには、ISOを単純にddするのではなく、付属インストーラーを使用します。
sudo apt install grub-pc-bin grub-efi-amd64-bin dosfstools parted rsync uuid-runtime openssl
sudo ./scripts/install-usb.sh ./out/kiyome-amd64.iso /dev/sdXWarning
install-usb.shは指定した/dev/sdXのpartition tableとfilesystemを破棄し、USB全体を再partition・FAT32再formatします。これは既存dataのsecure eraseではなく、上書きされていない内容が回復可能な場合があります。実行中のsystem disk、partition指定、mount中の機器を拒否し、lsblkのTRAN=usbかつHOTPLUG=1、対象へ解決されるstableな/dev/disk/by-id/wwn-*またはusb-*を要求します。USB by-idを使う場合は信頼できるID_SERIAL_SHORTも必須です。最後にINSTALL /dev/sdX <serial-or-by-id>の完全一致を要求しますが、表示されたby-id、model、serial、capacityを必ず目視確認してください。
作成される構成は次のとおりです。
USB physical device(全体を消去対象から保護)
├─ BIOS boot 2 MiB
├─ KIYOME_BOOT FAT32 / GRUB / 実行時はread-onlyのsquashfs
└─ KIYOME_LOGS FAT32 / KIYOME/.volume.json / reports
実行中のOS本体はread-only squashfsですが、KIYOME_BOOTのFAT32自体はofflineで書き換え可能で、tamper resistanceを提供しません。開発イメージは未署名のため、Secure Bootを無効にする必要があります。Windowsからはデモを実行できますが、この2パーティション構成を安全に作る公式PowerShellインストーラーはまだありません。
Kiyomeは次の条件を一つでも確認できなければ、消去を開始しません。
/etc/kiyome-liveがあり、rootで実行されている。- 現在の
lsblkツリーで/または/run/live/mediumを含むtop-level treeが一つだけで、そのtreeが保護対象として識別されている。 KIYOME_LOGSが一意でsentinelが正しい。開始時、破壊command直前、消去engine終了後にsentinel・mount source・書込み・fsyncを再検査する。- 対象が物理ディスクで、read-onlyでもmount中でもなく、transportがlocal whitelist(
ata、sata、usb、nvme)にある。NVMe-oF、iSCSI、FC、NBD、RBD、SAS、unknown等は拒否する。 - 対象treeのsysfs
holders、slaves、realpathを読み取れ、active holderがない。topologyを解決できない場合もblockする。 lsblkから得られたWWN、またはserial+model+sizeで対象を安定識別できる。- 計画後・実行直前のfingerprint、容量、devno、sysfs path、native command scopeが一致する。
- host overwriteは対象を
O_EXCL | O_NOFOLLOWでopenしたFDへ固定し、そのFDからidentityと容量を再照合したうえで直接writeする。 - NVMe native方式は再取得した能力ビットでも対応し、
nvme list-subsysが一つのNQN/controller/pathを返し、そのpathがaddress付きのpcie・liveで、hostから現在見える同scopeのdiskが一つ、list-ns --allに選択namespaceだけがある。NVMe-oFやmultipathは拒否する。選択namespace block FDとcontroller character FDをどちらもO_EXCLでpinし、namespaceの容量/devnoも再照合して完了まで保持する。 - 直接ATA/SATAのhost overwrite時は
hdparm -Nのcurrent/native sector数を取得でき、両者が一致する。 - plan digestから作った毎回変わるcodeとserial(なければfingerprint)末尾8文字を連結した
ERASE-XXXXXX <IDENTITY-SUFFIX>を完全一致で手入力した。
alpha版には無人のexecute CLIを意図的に用意していません。コマンドはshellを介さず引数配列で実行します。
KIYOME/
├─ runs.jsonl
└─ devices/<salted-device-key>/
├─ index.jsonl
└─ runs/<run-uuid>/
├─ report.json
├─ summary.ja.txt
├─ summary.en.txt
├─ events.jsonl
├─ engine.log # optional。現在はNVMe、将来のATA native adapter等だけ。host overwriteでは通常作らない
├─ checksums.sha256 # report / summaries / events / 存在するengine.log
└─ COMPLETED
device keyは現行の機器検出で取得できたWWNを優先し、serial+model+sizeをfallbackにします。fingerprint実装はEUI/NGUIDの入力にも対応しますが、現行のlsblk取得列はそれらを個別にprobeしません。/dev/sdaは履歴IDに使いません。開始時にaudit directoryを一階層ずつ作ってparent/childをfsyncし、report.partial.jsonとevent journalを保存します。finalizationは最終report、summary、checksum manifest、indexを書き、device/global indexのdirectoryもsyncしてからpartial reportを削除し、COMPLETEDを最後のmarker writeとして作成します。各fileもfsyncします。既知のunsupported errnoだけをaudit.directoryFsync=unsupportedとして続行し、媒体抜去やI/O failureを示し得るerrorは失敗させます。unsupportedの場合は突然の電源断後のmetadata永続性を保証しません。
実モードではCOMPLETEDがない過去runが1件でもあれば、方式を問わず全新規消去をblockします。markerがあるNVMe/ATA runも、明示的に認識したterminal result/verification pair以外は未解決としてblockします。completed reportが読めない場合もfail-closedです。alphaに自動resume/reconcile/repairはないため、USBやmarkerを編集せず、媒体を隔離してcontroller状態を外部確認してください。
checksums.sha256はreport.json、日英summary、events.jsonl、および存在する場合のengine.logを対象にします。device/global indexとCOMPLETEDは対象外です。このSHA-256は偶発的な破損・変更の検出用で、同じUSB内のhashだけで真正性や改ざん防止を保証するものではありません。timestampはLive環境のsystem clockをUTC表記したもので、Live imageは時刻同期を確立しません。既定はclockTrusted=false(機器RTC依存)で、信頼できる別メカニズムが明示的にKIYOME_CLOCK_TRUSTED=1を設定した時だけtrueです。またreportにはserial等の資産情報が含まれるため、公開Issueへ実ログを添付しないでください。
npm run check
npm test現在の自動試験は、fingerprint、起動媒体保護、直接上書きprofile、方式選択、確認コード、fail-closed policy、NVMe status parser、ATA無効化、日本語表示幅、レポート永続化を検証します。ホストの/devへ書くテストはありません。
QEMU用の使い捨て媒体は次のスクリプトで作れます。
sudo apt install qemu-system-x86 mtools dosfstools uuid-runtime openssl
./scripts/create-qemu-lab.sh
./scripts/run-qemu.sh- amd64、単一対象、直接接続の基本構成を最初の対象にしています。
- dm-crypt、LVM、mdraid、multipathの再帰的な物理scope解決は未完成です。NVMe native方式は一つのlive local PCIe pathだけに限定し、NVMe-oFとmultipathを拒否します。現在hostに見える
lsblk/list-nsだけを検査するため、inactive・未attach・hostから非表示のnamespaceが存在しないことまでは証明できません。 - NVMe-oF、iSCSI、FC、NBD、RBD、SAS、unknown等のremote/shared/未対応transportはalphaの対象外としてfail-closedで拒否します。
- USB installerはstable by-idと段階的なidentity再照合を使いますが、検査と各外部toolによるpath再openはatomicではありません。udev/kernel/by-idを信頼し、HIL未検証なので、非対象diskを物理的に外してください。
- ログUSBのidentityは破壊command直前とengine後に再検査しますが、実行中の継続監視は未実装です。抜去や電源断、FATのdirectory
fsync制約によりpartial/final reportやmarkerが失われる可能性があります。 - ATA Sanitizeは、外部toolがpin済みblock FDとは別のSG endpointを再openし得るためalphaでは全面的に無効です。安全なendpoint固定と機種別HILを終えるまで提示・実行しません。
- RAID controller配下、SCSI/SAS Sanitize、eMMC/UFS、Opal/PSID revertは未対応です。
- root UIと実行エンジンはまだ同一プロセスです。正式版までに非root UIとroot daemonへ分離予定です。
- firmware、故障、再割当領域、隠し領域、暗号鍵管理の品質によって、Purge候補が組織要件を満たさない場合があります。
- レポートは技術的証拠であり、法令・契約・政府機関の認証書ではありません。
- initramfsでloop/dm/md/partition/NVMe subsystemを再帰解決するboot protection。
- QEMU E2E(hotplug、ログ抜去、電源断、再起動後recovery)。
- 非root TUIとroot daemonの分離、versioned IPC。
- 対応機種表付きNVMe HIL試験と、pin済みendpoint contractを満たすATA Sanitize adapterの設計・HIL試験。
- SCSI SANITIZE、SATA Security Eraseの限定fallback、eMMC。
- 署名済みrelease、SBOM、provenance、Secure Boot対応。
- NIST SP 800-88 Rev.2: Guidelines for Media Sanitization
- NVM Express specifications
- DCSA: 32 CFR Part 117 / current NISPOM rule
- GNU Coreutils: shred limitations
規格名・政府機関名の記載は、認証、推奨、承認を意味しません。
CONTRIBUTING.mdの安全不変条件を読んでから変更してください。誤った対象を消す、未消去なのに成功と記録する、起動媒体保護を回避できる問題は最重大としてSECURITY.mdの非公開手順で報告してください。
Apache License 2.0。詳細はLICENSEとDISCLAIMER.mdを参照してください。