Skip to content

Repository files navigation

Kiyome Storage OS(清め)

消去に、証跡を。— Erase with evidence.

CI License: Apache-2.0 Status: destructive alpha

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です。

UI

┌──────────────────────────────────────────────────────────────────────────────┐
│ 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.ps1

Linux/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 00FF → 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、再割当領域まで証明しません。

USB起動イメージを作る

ビルドは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/sdX

Warning

install-usb.shは指定した/dev/sdXのpartition tableとfilesystemを破棄し、USB全体を再partition・FAT32再formatします。これは既存dataのsecure eraseではなく、上書きされていない内容が回復可能な場合があります。実行中のsystem disk、partition指定、mount中の機器を拒否し、lsblkTRAN=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(atasatausbnvme)にある。NVMe-oF、iSCSI、FC、NBD、RBD、SAS、unknown等は拒否する。
  • 対象treeのsysfs holdersslaves、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付きのpcieliveで、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.sha256report.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候補が組織要件を満たさない場合があります。
  • レポートは技術的証拠であり、法令・契約・政府機関の認証書ではありません。

公開前ロードマップ

  1. initramfsでloop/dm/md/partition/NVMe subsystemを再帰解決するboot protection。
  2. QEMU E2E(hotplug、ログ抜去、電源断、再起動後recovery)。
  3. 非root TUIとroot daemonの分離、versioned IPC。
  4. 対応機種表付きNVMe HIL試験と、pin済みendpoint contractを満たすATA Sanitize adapterの設計・HIL試験。
  5. SCSI SANITIZE、SATA Security Eraseの限定fallback、eMMC。
  6. 署名済みrelease、SBOM、provenance、Secure Boot対応。

参照・方針

規格名・政府機関名の記載は、認証、推奨、承認を意味しません。

Contributing / Security / License

CONTRIBUTING.mdの安全不変条件を読んでから変更してください。誤った対象を消す、未消去なのに成功と記録する、起動媒体保護を回避できる問題は最重大としてSECURITY.mdの非公開手順で報告してください。

Apache License 2.0。詳細はLICENSEDISCLAIMER.mdを参照してください。

About

Safety-focused USB live OS for storage sanitization, with Japanese/English TUI, HDD overwrite, NVMe Sanitize, progress/ETA, and per-device audit reports. Destructive alpha; HIL validation pending.

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages