TT Lab
はじめる
学ぶ 学習パス コース

閉域網の現場 — 防衛ドメイン

搬入はファイルを移す仕事ではなく依存関係を閉じる仕事だ

TT Labで続きを見る

一言でいうと

エアギャップ環境への持ち込みで、失敗の大半は署名ではなく依存関係から出ます。それを防ぐ仕組みが、すべてを同梱したバンドルと、ファイル単位のマニフェストです。

なぜ必要なのか

外でのデプロイは、こうなります。リポジトリからコードを受け取り、パッケージマネージャーが依存関係をダウンロードし、コンテナレジストリがイメージレイヤーを埋めます。私たちが移しているのは、実は「アドレス」であり、実際の中身は、実行時点にネットワークが埋めます。

エアギャップ環境には、そのネットワークがありません。アドレスを移しても、何も埋まりません。そのため、移すのはアドレスではなく、中身のすべてでなければなりません。アプリケーションのコードだけでなく、そのコードが呼び出すライブラリ、そのライブラリが呼び出すライブラリまで、すべてです。

ここで出てくる失敗は、非常に特徴的です。持ち込み審査を通過し、媒体を持って入り、インストールを始めたあとで、ライブラリが1つ欠けていることに気づきます。そして、その1つを埋めるには、再び出て、再び詰め、再び審査を受けなければなりません。審査の周期が週単位の場所では、これが1週間です。欠けたファイル1つのコストが1週間だという事実が、このモジュール全体の理由です。

どう動くのか

そのため、持ち込みバンドルには、3つが一緒に入ります。

1つ目は、ペイロードです。実行に必要なファイルのすべてです。ここでの原則は、「外で1度でもネットワークが埋めてくれたものは、すべて同梱する」です。開発環境で動くから動くだろうという判断が、最も危険です。開発環境には、すでにキャッシュがあります。

2つ目は、マニフェストです。ペイロードに入ったファイル1つ1つのSHA-256の一覧です。なぜバンドル全体のハッシュ1つでは足りないのか。全体のハッシュは、「何かが違う」までしか教えてくれません。どのファイルが違うのかがわからなければ、調査する場所がバンドル全体になり、数百個のバンドルでは、これは事実上、調査不可能です。パスは相対パスで書きます。受け取る側は別のディレクトリに展開するので、絶対パスはその場で役に立たなくなります。

3つ目は、署名です。マニフェスト1枚に対する署名です。ファイルが数千個あっても、署名は1つで済みます。ファイルごとの完全性はマニフェストが担当し、マニフェストの真正性は署名が担当します。この2つの層を分けることが、次の話のすべてです。

페이로드 파일들 ──(각 파일의 SHA-256)──▶ MANIFEST.sha256 ──(개인키 서명)──▶ MANIFEST.sig
     ▲                                          ▲                              ▲
     └ 파일 해시 대조로 확인                     └ 목록이 맞는지                └ 목록을 우리가
                                                                                  아는 사람이 만들었는지

現場での姿

gpgがない場所が多くあります。許可されたソフトウェアの一覧になければインストールできず、一覧に入れるには、それ自体が持ち込み審査です。そのため、現実的には、どこにでもあるopensslで行います。openssl dgst -sha256 -signと-verifyの2つのコマンドで、署名と検証が終わります。派手ではありませんが、この環境で実際に動く方法です。

バイナリは目で確認できません。テキストファイルはdiffで見られますが、.soや.whlは開いても何も見えません。しかもNULが混ざっているので、headやgrepにかけると、結果そのものを信じられません。バイナリを扱うツールは、file、sha256sum、opensslの3つだけだと考えるほうが安全です。

一度痛い目に遭ったこと。バンドルを束ね直したあと、ハッシュファイルを取り直さなかったことがあります。媒体に入れて入場したところ、受け取る側でハッシュが合わず、差し戻されました。再び出てくるのに、1日かかりました。それ以来、束ねるコマンドとハッシュを取るコマンドを、必ず同じスクリプトの中にくっつけて置いています。

続けて読むこと

ここまでが「何を詰めて送るか」です。すぐあとに来る記事は、「受け取る側が何をどの順序で確認するか」を扱います。ハッシュと署名がそれぞれ何を守ってくれるのか、1つの層だけを見るとどんな改ざんが通過するのか、そして公開鍵がバンドルの中に入っていると、なぜ検証がまるごと無意味になるのかが、その記事の内容です。そのあとのラボで、2つの記事を、一度に手で追います。