背景
Nixでシークレット管理方法を探していたところ、agenixが良さそうだったので試してみることにしました。
流れ
下記を参考にインストールしていく
https://github.com/ryantm/agenix
今回はFlakes経由で以下の流れでagenixを試す
- キーペアを作成する
- agenixをインストール・設定
- 機密情報を暗号化
- 暗号化したシークレットをGitリポジトリにpush
- Gitリポジトリにpushしたシークレットをnixから参照し復号化する
キーペアを作成する
cd ~
ssh-keygen -t ed25519
agenixをインストール
agenixのrust版であるragenixをインストール・設定を行います
flake.nix
{
inputs = {
agenix.url = "github:yaxitech/ragenix";
};
}
{
config,
pkgs,
username,
inputs,
...
}: {
# ageモジュールを導入
imports = [
inputs.agenix.nixosModules.default
];
# agenixコマンドを導入
environment.systemPackages = [
inputs.agenix.packages."${pkgs.system}".default
];
# 復号化に利用する秘密鍵を指定
age.identityPaths = [
"/home/${username}/.ssh/id_ed25519"
];
}
機密情報を暗号化
secrets.nix
を作成する
mkdir secrets
cd secrets
vi secrets.nix
先ほど作った公開鍵をsecrets.nixに記入する
secrets.nix
let
key1 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMPUs/F1kXYEZ6b1+Twy4l/a9OT4MXDEfejh5Yc543zk";
in {
"secret1.age".publicKeys = [key1];
}
以下のコマンドを使用して、シークレットファイルを作成する
agenix -e secret1.age
上記を実行するとエディタが開くので暗号化したい情報を入力、保存し終了すると暗号化されたファイルがsecret1.age
が生成される。暗号化したシークレットをGitリポジトリにpushする
暗号化して秘密鍵がないと復号化できないとはいえ、機密情報をGitにPushするのは抵抗があったため、プライベートGitリポジトリにしてpushしました。
Gitリポジトリにpushしたシークレットをnixから参照する
nixからGitリポジトリを参照できるようにする
flake.nix
{
inputs = {
agenix.url = "github:yaxitech/ragenix";
+ mysecrets = {
+ url = "git+ssh://git@github.com/fabiiw05/xxxxx";
+ flake = false;
+ };
};
}
暗号化したシークレットを復号化して任意のPathに配置する
{
username,
inputs,
...
}: {
age.secrets = {
id_rsa = {
file = "${inputs.mysecrets}/keys/id_rsa.age";
path = "/home/${username}/.ssh/id_rsa";
mode = "600";
owner = "${username}";
group = "users";
};
};
}
おわり
簡単に暗号化・復号化できました。
また、agenix -e xxxxx
で暗号化情報を更新できるので運用面でも楽できそうです