セキュリティ
aikagi が値をどう暗号化して保存し、誰に渡し、何を記録しているかをまとめます。
保存時の暗号化
値は AES-256-GCM で暗号化して保存します。暗号化に使うデータ暗号鍵(DEK)はプロジェクトごと(自分用のワークスペースではワークスペースごと)に別々で、DEK はさらにマスターキー(KEK)で暗号化しています。KEK は値とは別の場所に保管しています。KEK を入れ替えても、保存済みの値を暗号化し直す必要はありません。
キーの一覧を取得しても、値は返しません。値を返すのは、キーを名前で指定して取得したときだけです。
通信
Web の画面と CLI からサーバへの通信は、すべて TLS で暗号化しています。CLI の認証情報は ~/.config/aikagi に、本人だけが読める権限で保存されます。
サインイン
Web の画面へのサインインは Google アカウントだけです。aikagi 専用のパスワードはありません。そのため、パスワードの使い回しや、退職者のパスワードが残る問題が起きません。
CLI からのログインは、毎回ブラウザで承認します。承認した端末は一覧に表示され、いつでも失効できます(端末)。
アクセス制御
値を渡すかどうかは、次の 3 つを順に確認して決めます。
- ワークスペースとプロジェクトでの役割。
- フォルダの範囲。
aws/devのように絞れます。 - アクセス元。承認した端末のログインか、プロジェクトで許可した GitHub Actions の 2 つだけです。GitHub Actions は値を読むことしかできません。
許可されていないキーは、名前も返しません。権限が足りない場合は、空の結果ではなく、権限が無いことを示すエラーを返します。
監査ログ
値の取得は 1 回ごとに 1 行記録され、誰が・いつ・どのキーの・どの版を・どこから取得したかが残ります。監査ログは Web の画面からも CLI からも確認できます。値そのものは記録しません。
アクセスを止める
値の受け渡しを止める方法は 3 つあります。どれも操作した時点で反映されます。
- 端末を失効する。その端末は、再びログインするまで値を取得できません。
- プロジェクトの設定で GitHub Actions の許可を削除する。そのリポジトリからは値を取得できなくなります。
- メンバーを外す、または招待を取り消す。
AI ツールや CI に値を渡すときの設計
一度渡した値は、受け取った側の手元に残ります。aikagi は次の 4 点で、渡した後の値を管理しやすくしています。
- 値は環境変数として渡し、
.envのようなファイルを作りません。値は起動したコマンド(子プロセス)の中にだけ存在します。 - 渡す範囲は役割とフォルダで狭められます。GitHub Actions が受け取るのは、許可した環境の共有の値だけです。
- AI ツールや CI のために長期間有効な token を発行しません。手元の AI ツールはその人のログインを使い、CI は実行中だけ有効な認証情報を使います。
- 値を渡したことも取得したことも、すべて監査ログに記録されます。