# セキュリティ

aikagi が値をどう暗号化して保存し、誰に渡し、何を記録しているかをまとめます。

## 保存時の暗号化

値は AES-256-GCM で暗号化して保存します。暗号化に使うデータ暗号鍵（DEK）はプロジェクトごと（自分用のワークスペースではワークスペースごと）に別々で、DEK はさらにマスターキー（KEK）で暗号化しています。KEK は値とは別の場所に保管しています。KEK を入れ替えても、保存済みの値を暗号化し直す必要はありません。

キーの一覧を取得しても、値は返しません。値を返すのは、キーを名前で指定して取得したときだけです。

## 通信

Web の画面と CLI からサーバへの通信は、すべて TLS で暗号化しています。CLI の認証情報は `~/.config/aikagi` に、本人だけが読める権限で保存されます。

## サインイン

Web の画面へのサインインは Google アカウントだけです。aikagi 専用のパスワードはありません。そのため、パスワードの使い回しや、退職者のパスワードが残る問題が起きません。

CLI からのログインは、毎回ブラウザで承認します。承認した端末は一覧に表示され、いつでも失効できます（[端末](https://aikagi.dev/guide/devices.md)）。

## アクセス制御

値を渡すかどうかは、次の 3 つを順に確認して決めます。

- ワークスペースとプロジェクトでの[役割](https://aikagi.dev/guide/members.md)。
- フォルダの範囲。`aws/dev` のように絞れます。
- アクセス元。承認した[端末](https://aikagi.dev/guide/devices.md)のログインか、プロジェクトで許可した [GitHub Actions](https://aikagi.dev/guide/ci.md) の 2 つだけです。GitHub Actions は値を読むことしかできません。

許可されていないキーは、名前も返しません。権限が足りない場合は、空の結果ではなく、権限が無いことを示すエラーを返します。

## 監査ログ

値の取得は 1 回ごとに 1 行記録され、誰が・いつ・どのキーの・どの版を・どこから取得したかが残ります。[監査ログ](https://aikagi.dev/guide/audit.md)は Web の画面からも CLI からも確認できます。値そのものは記録しません。

## アクセスを止める

値の受け渡しを止める方法は 3 つあります。どれも操作した時点で反映されます。

- 端末を失効する。その端末は、再びログインするまで値を取得できません。
- プロジェクトの設定で [GitHub Actions](https://aikagi.dev/guide/ci.md) の許可を削除する。そのリポジトリからは値を取得できなくなります。
- メンバーを外す、または招待を取り消す。

## AI ツールや CI に値を渡すときの設計

一度渡した値は、受け取った側の手元に残ります。aikagi は次の 4 点で、渡した後の値を管理しやすくしています。

- 値は環境変数として渡し、`.env` のようなファイルを作りません。値は起動したコマンド（子プロセス）の中にだけ存在します。
- 渡す範囲は役割とフォルダで狭められます。[GitHub Actions](https://aikagi.dev/guide/ci.md) が受け取るのは、許可した環境の共有の値だけです。
- AI ツールや CI のために長期間有効な token を発行しません。手元の AI ツールはその人のログインを使い、CI は実行中だけ有効な認証情報を使います。
- 値を渡したことも取得したことも、すべて監査ログに記録されます。

---

出典: https://aikagi.dev/guide/security/
