本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。

概要

アーカイブズ機関(文書館・史料館・資料館など)への移管ワークフローでは、受け入れたファイル群から SIP(Submission Information Package)を作る工程があります。定番ツールの CCA-Public/sipcreator は BitCurator(Linux)向けの PyQt5 アプリで、macOS で動かすには Docker コンテナを立て、ブラウザの noVNC デスクトップに接続し、ターミナルからコマンドを実行する、という手順が必要です。非技術者の担当者が日常的に使うには手順が多くなります。

そこで、この SIP 作成ワークフローをネイティブ macOS アプリとして実装し直し、ダウンロードして「アプリケーション」フォルダにドラッグし、ダブルクリックで使える形にしました。ソースと配布物(notarized DMG)は GitHub に公開しています。

SIP Creator の画面

インストール(はじめての方へ)

技術的な知識は不要で、Homebrew・Python・Docker・ターミナルのいずれも使いません。

  1. Releases ページ を開きます
  2. 最新版の SIPCreator.dmg をダウンロードします
  3. ダウンロードした .dmg をダブルクリックして開きます
  4. 開いたウィンドウで、SIP Creator アイコンを「アプリケーション」フォルダにドラッグします
  5. 「アプリケーション」フォルダ内の SIP Creator をダブルクリックして起動します

Apple の公証(notarization)済みのため、警告なしで起動できます。初回に「開発元を確認できません」等が表示された場合は、アプリを右クリックして「開く」を選ぶと起動できます。

動作要件は macOS 14(Sonoma)以降、Apple Silicon(M1 以降)です。

使い方

  1. 入力(資料)フォルダを「選択…」から指定します(移管対象のファイルが入ったフォルダ)
  2. 出力(SIP)フォルダを「選択…」から指定します(SIP の保存先)
  3. タイトル(必須)など記述メタデータを入力します
  4. 「SIP を作成」をクリックすると、出力先に SIP(または BagIt bag)が生成されます

実際の操作(フォルダ選択 → 入力 → 作成 → 完了)の流れは、次の操作デモ(字幕つき・約40秒)で確認できます。

(動画が表示されない場合は こちらのリンク からご覧ください)


ここからは、開発の背景・機能・本家との違い・ビルドから署名・公開までの流れを記録します。

背景

調べた範囲では、SIP 作成ワークフロー(フォーマット識別・チェックサム・記述スプレッドシート・パッケージ化)をまとめて行う、署名済みのネイティブ macOS アプリは見当たりませんでした。本家は Linux 前提で、近い Brunnhilde GUI も Python/Qt で依存を自分で用意する必要があります。

Docker や VNC が必要になる理由は、GUI そのものではなく、内部で呼ぶフォレンジック系の CLI(siegfried など)にあります。GUI は SwiftUI でネイティブに作れるため、識別エンジンの siegfried だけをアプリに同梱すれば、利用者は追加のインストールなしで使えます。

できること

  • フォーマット識別(siegfried / PRONOM。PRONOM は英国国立公文書館によるファイル形式レジストリ)。アプリに同梱しています
  • チェックサム(SHA-256、Apple CryptoKit)
  • 記述スプレッドシート(description.csv)。AtoM/ISAD(G)(国際標準アーカイブズ記述の一般原則)のインポート用に、識別子・タイトル・年代範囲・Extent・Scope を自動補完します
  • 技術インベントリ(formats.csv)、DFXML(Digital Forensics XML、dfxml.xml)、HTML レポート(report.html
  • パッケージ化(SIP ディレクトリ、または BagIt bag)

出力は本家に倣い metadata/submissionDocumentation/ の下にまとめます。

<SIP>/objects/...                          元ファイル(相対パス保持)
<SIP>/metadata/submissionDocumentation/
        ├ description.csv   AtoM/ISAD(G) 記述シート(SIP 1 行)
        ├ formats.csv       技術インベントリ(ファイル毎)
        ├ dfxml.xml         技術メタデータ(DFXML)
        ├ report.html       HTML レポート
        ├ report.txt        サマリ
        └ checksum.sha256

本家 SIP Creator との違い

下流(Archivematica / AtoM / BagIt)が認識できる出力は本家に合わせ、一部は異なる選択をしています。

機能本家本アプリ
フォーマット識別(PRONOM)siegfriedsiegfried(同じ PUID)
チェックサムMD5SHA-256
記述スプレッドシート(ISAD/AtoM)ありあり
DFXML / HTML レポートありあり(独自実装)
ウイルスチェック(ClamAV)あり(Brunnhilde 由来)なし(端末の AV / Docker 版に委ねる)
PII スキャン(bulk_extractor)任意なし
ディスクイメージ解析(fiwalk)△(Brunnhilde 由来・SIP Creator では未使用)なし

チェックサムは本家が MD5 です。本アプリでは、より衝突耐性の高い SHA-256 を採用しました(実際の移管ワークフローの検討でも、MD5 から SHA-256 への変更が論点になっていました)。識別・SIP 作成・記述シート・DFXML・HTML レポートは本家と同等で、本アプリで対象外としたのは ClamAV・fiwalk・PII の 3 つです(いずれも別ツールや Docker 版に委ねるのが妥当な範囲と考えています)。

ビルドから公開までの流れ

ネイティブ配布で警告なく起動できるようにするには、署名と notarization が必要です。流れは次のとおりです。

  1. 実装:SwiftUI でアプリ本体を作成します。パイプライン(走査 → siegfried 識別 → SHA-256 → スプレッドシート/DFXML/レポート → SIP・BagIt 組み立て)は Swift で実装し、XcodeGen でプロジェクトを生成します
  2. siegfried 同梱:brew で取得した sf バイナリと署名 DB を Resources/bin/ に同梱し、オフラインで識別します
  3. テスト:決定性(同じ入力なら同じ SHA-256)と、PRONOM ゴールデン(%PDF-1.4fmt/18 と識別される=本家 siegfried と同じ結果)を検証します
  4. 署名:Developer ID Application 証明書で署名し、ハードンドランタイムを有効にします。同梱した sf も Developer ID で署名し直します(入れ子のバイナリも署名されていないと notarization に通りません)
  5. notarization:xcrun notarytool submit --wait で Apple に提出し、Accepted の後に stapler staple でチケットを添付します
  6. 配布:create-dmg で DMG を作成し、GitHub Releases に公開します(gh release create

つまずいた点として、ENABLE_USER_SCRIPT_SANDBOXING が有効だと、ビルド中の Run Script が同梱バイナリにアクセスできず archive が失敗します。同梱バイナリの署名は、archive 時の Run Script ではなく export 後の codesign で行うのが安全でした。

配布形式は、GitHub の README をリファレンス、チュートリアル動画を使い方、本記事を背景と流れ、という三層に分けています。

まとめ

  • Docker や VNC が必要だった理由は GUI ではなく依存 CLI で、siegfried だけ同梱すればネイティブ化できます
  • 本家の標準(submissionDocumentation 配置・ISAD 記述シート・BagIt)には合わせつつ、チェックサムは MD5 から SHA-256 に変更しています
  • 署名と notarization まで通し、ダブルクリックで使える notarized DMG を GitHub で配布しています

関連