From 4a68b9face918164eb4bba04ba0c5d99d5df6fb9 Mon Sep 17 00:00:00 2001 From: moons14 Date: Sat, 6 Jun 2026 22:27:32 +0900 Subject: [PATCH 1/3] fix: use standard key generation flows --- .gitignore | 2 + .sops.yaml | 10 +++ docs/installer/iso.md | 72 ++++++++++++++++ docs/installer/recommendations.md | 10 +++ docs/secrets/sops-nix.md | 78 +++++++++++++++++ flake.nix | 6 ++ hosts/default.nix | 57 ++++++++++--- hosts/installer-iso/default.nix | 65 +++++++++++++++ modules/features/default.nix | 1 + modules/features/identity/ssh-default-key.nix | 29 ++++--- modules/features/security/default.nix | 5 ++ modules/features/security/sops.nix | 24 ++++++ modules/system/default.nix | 1 + modules/system/secrets/default.nix | 5 ++ modules/system/secrets/sops.nix | 83 +++++++++++++++++++ modules/system/user/default.nix | 3 +- profiles/workloads/secure-storage.nix | 6 +- secrets/users/README.md | 21 +++++ 18 files changed, 452 insertions(+), 26 deletions(-) create mode 100644 .sops.yaml create mode 100644 docs/installer/iso.md create mode 100644 docs/installer/recommendations.md create mode 100644 docs/secrets/sops-nix.md create mode 100644 hosts/installer-iso/default.nix create mode 100644 modules/features/security/default.nix create mode 100644 modules/features/security/sops.nix create mode 100644 modules/system/secrets/default.nix create mode 100644 modules/system/secrets/sops.nix create mode 100644 secrets/users/README.md diff --git a/.gitignore b/.gitignore index 66ecee4..e19da57 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ !/flake.nix !/flake.lock +!/.sops.yaml !shells/ !hosts/ @@ -17,5 +18,6 @@ !modules/ !docs/ !images/ +!secrets/ !/flake/ diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000..0fac9da --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,10 @@ +# Replace the sample age recipient with each host's real public key before encrypting secrets. +# Generate or install the host key with docs/installer/iso.md and inspect the public key with: +# age-keygen -y /var/lib/sops-nix/key.txt +keys: + - &replace_with_host_age_key age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +creation_rules: + - path_regex: secrets/.*\.ya?ml$ + key_groups: + - age: + - *replace_with_host_age_key diff --git a/docs/installer/iso.md b/docs/installer/iso.md new file mode 100644 index 0000000..d5a6d47 --- /dev/null +++ b/docs/installer/iso.md @@ -0,0 +1,72 @@ +# Installer ISO + +この flake は SSH 経由でのインストールを基本にした `installer-iso` NixOS 構成を公開します。直接接続したディスプレイとキーボードもフォールバックとして使えます。 + +## ビルド + +```sh +nix build .#nixosConfigurations.installer-iso.config.system.build.isoImage +``` + +ISO は `result/iso/` 以下に生成されます。 + +## 起動とネットワーク + +基本は有線 Ethernet + DHCP です。WiFi は NetworkManager でフォールバックとして使えます。 + +```sh +nmcli radio wifi on +nmcli device wifi list +nmcli device wifi connect '' --ask +``` + +## SSH-first workflow + +OpenSSH は ISO 起動時に有効です。`moons` ユーザーが作成され、リポジトリで管理している authorized keys でログインできます。 + +別マシンから次のように入ります。 + +```sh +ssh moons@ +``` + +IP アドレスが分からない場合は、フォールバックコンソールで次を確認します。 + +```sh +ip addr +``` + +## 初回用の sops-nix age 鍵を作る + +独自 helper は使わず、`age-keygen` と `install` だけでインストール対象に鍵を作ります。インストール対象の root filesystem を `/mnt` にマウントした後に実行してください。 + +```sh +sudo install -d -m 0700 /mnt/var/lib/sops-nix +sudo age-keygen -o /mnt/var/lib/sops-nix/key.txt +sudo chmod 0600 /mnt/var/lib/sops-nix/key.txt +``` + +公開 recipient は次で確認します。 + +```sh +sudo age-keygen -y /mnt/var/lib/sops-nix/key.txt +``` + +この recipient を `.sops.yaml` に追加してから secret を暗号化・更新してください。 + +既存の age identity を使い回す場合は、標準の `install` でコピーします。 + +```sh +sudo install -d -m 0700 /mnt/var/lib/sops-nix +sudo install -m 0600 ./key.txt /mnt/var/lib/sops-nix/key.txt +``` + +## インストール後も使われる鍵 + +`/mnt/var/lib/sops-nix/key.txt` に作った age identity は、そのままインストール後の `/var/lib/sops-nix/key.txt` になります。つまり ISO 上で生成した sops-nix 鍵を、インストール後の通常起動でも継続利用できます。 + +OpenSSH の host key は NixOS の OpenSSH module が `/etc/ssh/` 以下へ自動生成します。`moons` の SSH client key は Home Manager の user systemd service が `~/.ssh/id_ed25519` が無い場合に初回ログイン後へ自動生成します。 + +## フォールバックローカルコンソール + +SSH が使えない場合は、直接接続したディスプレイとキーボードで作業します。ISO には `neovim`、`tmux`、`git`、`sops`、`age`、`ssh-to-age`、`disko`、OpenSSH tools、NetworkManager tools が入っています。 diff --git a/docs/installer/recommendations.md b/docs/installer/recommendations.md new file mode 100644 index 0000000..213dbdc --- /dev/null +++ b/docs/installer/recommendations.md @@ -0,0 +1,10 @@ +# Installer recommendations + +追加で入れる・運用するとよいもの: + +- 有線 Ethernet を標準手順にする。WiFi credential や firmware 問題を避けやすいです。 +- 再インストール前に `/var/lib/sops-nix/key.txt` のバックアップをオフライン保管する。 +- ホストごとの Disko recipe を用意して、パーティション作成も再現可能にする。 +- `moons` の SSH client public key はマシンごとに登録する。秘密鍵を他マシンへコピーしない方針にできます。 +- リモート地のインストールが必要になったら ISO へ Tailscale を追加する。ローカル作業だけなら authorized keys 付き SSH の方が単純です。 +- ホストごとに disk 名、NIC 名、WiFi chipset、Secure Boot 状態、TPM/FIDO availability の確認 checklist を作る。 diff --git a/docs/secrets/sops-nix.md b/docs/secrets/sops-nix.md new file mode 100644 index 0000000..2af47d2 --- /dev/null +++ b/docs/secrets/sops-nix.md @@ -0,0 +1,78 @@ +# sops-nix secrets + +このリポジトリでは、`sops-nix` は全 NixOS 構成で常に有効です。復号できるかどうかは Nix の feature ではなく、各 SOPS ファイルがどの age recipient に暗号化されているかで制御します。 + +## 方針 + +- sops-nix の NixOS module と `sops.age.generateKey` を使い、独自の鍵生成 shell helper は持ちません。 +- 全ホストの sops-nix age identity は `/var/lib/sops-nix/key.txt` に置きます。 +- `my.system.secrets.sops.generateKey` のデフォルトは `true` なので、鍵が無い場合は sops-nix 側で生成されます。 +- 初回ログインの hashed password など、初回起動時から secret が必要なホストでは、インストーラー ISO 上で先に `/mnt/var/lib/sops-nix/key.txt` を作ってから `nixos-install` します。 + +## ホスト age 鍵 + +通常起動後の公開 recipient は次のコマンドで確認します。 + +```sh +sudo age-keygen -y /var/lib/sops-nix/key.txt +``` + +インストール対象を `/mnt` にマウントしている間は次のコマンドです。 + +```sh +sudo age-keygen -y /mnt/var/lib/sops-nix/key.txt +``` + +## 権限モデル + +- `sops-nix` 自体は全環境で有効です。 +- 復号権限は `.sops.yaml` と各暗号化ファイルの age recipient で管理します。 +- あるホストに読ませたい secret は、そのホストの public age recipient を入れて `sops updatekeys` します。 +- 読ませたくないホストの recipient は入れません。 + +## moons のログインパスワードを SOPS から使う + +`moons` ユーザーの hashed password を SOPS から使う場合は、対象ホストや profile で次のように設定します。 + +```nix +my.features.security.sops = { + defaultSopsFile = ../../secrets/users/moons.yaml; + userPassword.enable = true; +}; +``` + +期待する secret key は次の形です。 + +```yaml +users: + moons: + hashedPassword: "$y$j9T$..." +``` + +ハッシュは次のコマンドで作ります。 + +```sh +mkpasswd -m yescrypt +``` + +暗号化ファイルの編集は次のコマンドです。 + +```sh +sops secrets/users/moons.yaml +``` + +## SSH 鍵との関係 + +- OpenSSH server の host key は、NixOS の `services.openssh.hostKeys` の標準挙動で `/etc/ssh/` 以下へ自動生成されます。 +- `moons` の通常の SSH client key は、`my.features.identity.sshDefaultKey.enable` が有効な profile で user systemd service が初回ログイン後に `~/.ssh/id_ed25519` として自動生成します。 +- sops-nix の age 鍵は SSH 鍵とは別に `/var/lib/sops-nix/key.txt` へ sops-nix の `generateKey` で自動生成します。 + +## SSH host key を sops-nix recipient に使う場合 + +sops-nix の README では、SSH host key から age recipient を作る方法も紹介されています。必要になった場合は次のように public key を age recipient に変換できます。 + +```sh +ssh-to-age < /etc/ssh/ssh_host_ed25519_key.pub +``` + +ただし、初回起動のユーザーパスワード復号に使う場合は、復号前に host key が存在している必要があります。このリポジトリでは初回インストール手順を単純にするため、sops-nix 専用の age key file を標準にしています。 diff --git a/flake.nix b/flake.nix index 3e4b271..bbefd48 100644 --- a/flake.nix +++ b/flake.nix @@ -51,6 +51,12 @@ inputs.nixpkgs.follows = "nixpkgs"; }; + # Secrets + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # Boot lanzaboote = { url = "github:nix-community/lanzaboote"; diff --git a/hosts/default.nix b/hosts/default.nix index c4f429b..0721eb7 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -17,6 +17,26 @@ let }; }; + mkNixos = + { + host, + system, + modules ? [ ], + }: + assert lib.assertMsg (lib.elem system config.systems) + "mkNixos: system '${system}' not in valid systems: ${lib.generators.toPretty { } config.systems}"; + nixosSystem { + inherit system modules; + specialArgs = { + inherit + inputs + username + unstable + host + ; + }; + }; + mkSystem = { host, @@ -24,10 +44,8 @@ let profiles ? [ ], extraModules ? [ ], }: - assert lib.assertMsg (lib.elem system config.systems) - "mkSystem: system '${system}' not in valid systems: ${lib.generators.toPretty { } config.systems}"; - nixosSystem { - inherit system; + mkNixos { + inherit host system; modules = [ { nixpkgs.config.allowUnfree = true; @@ -37,14 +55,25 @@ let ] ++ map (p: ../profiles/${p}.nix) profiles ++ extraModules; - specialArgs = { - inherit - inputs - username - unstable - host - ; - }; + }; + + mkInstallerIso = + { + system, + extraModules ? [ ], + }: + mkNixos { + host = "installer-iso"; + inherit system; + modules = [ + { + nixpkgs.config.allowUnfree = true; + } + "${inputs.nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" + ../modules + ./installer-iso/default.nix + ] + ++ extraModules; }; in { @@ -59,6 +88,10 @@ in "workloads/remote" ]; }; + installer-iso = mkInstallerIso { + system = "x86_64-linux"; + }; + x1g13 = mkSystem { host = "x1g13"; system = "x86_64-linux"; diff --git a/hosts/installer-iso/default.nix b/hosts/installer-iso/default.nix new file mode 100644 index 0000000..5a6113b --- /dev/null +++ b/hosts/installer-iso/default.nix @@ -0,0 +1,65 @@ +{ + lib, + pkgs, + username, + ... +}: +{ + isoImage = { + isoName = lib.mkDefault "moons-nixos-installer.iso"; + appendToMenuLabel = " moons installer"; + }; + + networking = { + hostName = "nixos-installer"; + useDHCP = lib.mkDefault true; + networkmanager = { + enable = true; + wifi.backend = "wpa_supplicant"; + wifi.powersave = false; + }; + wireless.iwd.enable = false; + }; + + services.openssh = { + enable = true; + openFirewall = true; + settings = { + PermitRootLogin = "no"; + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + PubkeyAuthentication = "yes"; + }; + }; + + users.users.${username} = { + isNormalUser = true; + extraGroups = [ + "networkmanager" + "wheel" + ]; + }; + + security.sudo.wheelNeedsPassword = false; + + environment.systemPackages = with pkgs; [ + age # File encryption tool used with sops-nix age keys + disko # Declarative disk partitioning helper + git # Version control client for fetching dotfiles + neovim # Text editor for fallback console installation + networkmanager # Network management CLI and daemon for Ethernet and WiFi + openssh # Standard SSH client, server, and ssh-keygen tools + sops # Editor and CLI for SOPS encrypted secrets + ssh-to-age # Convert SSH public keys to age recipients + tmux # Terminal multiplexer for resilient SSH sessions + ]; + + programs.zsh.enable = true; + + documentation = { + enable = true; + nixos.enable = true; + }; + + system.stateVersion = "26.05"; +} diff --git a/modules/features/default.nix b/modules/features/default.nix index b3aa070..5272e1f 100644 --- a/modules/features/default.nix +++ b/modules/features/default.nix @@ -8,6 +8,7 @@ ./gui ./identity ./network + ./security ./services ./storage ]; diff --git a/modules/features/identity/ssh-default-key.nix b/modules/features/identity/ssh-default-key.nix index eeef32b..94e42ee 100644 --- a/modules/features/identity/ssh-default-key.nix +++ b/modules/features/identity/ssh-default-key.nix @@ -9,7 +9,7 @@ let in { options.my.features.identity.sshDefaultKey = { - enable = lib.mkEnableOption "Generate default SSH key (ed25519)"; + enable = lib.mkEnableOption "Generate default SSH client key (ed25519)"; }; config.home-manager.sharedModules = [ @@ -17,16 +17,23 @@ in { lib, ... }: { config = lib.mkIf cfg.enable { - home.activation.generateSshKey = lib.hm.dag.entryAfter [ "writeBoundary" ] '' - key="$HOME/.ssh/id_ed25519" - if [ ! -f "$key" ]; then - umask 077 - mkdir -p "$HOME/.ssh" - ${pkgs.openssh}/bin/ssh-keygen -t ed25519 -N "" -f "$key" \ - -C "moons@$(${pkgs.hostname}/bin/hostname || echo host)" - echo "Generated SSH key at $key" - fi - ''; + systemd.user.services.generate-default-ssh-key = { + Unit = { + Description = "Generate the default SSH client key"; + ConditionPathExists = "!%h/.ssh/id_ed25519"; + }; + + Service = { + Type = "oneshot"; + ExecStartPre = [ + "${pkgs.coreutils}/bin/mkdir -p %h/.ssh" + "${pkgs.coreutils}/bin/chmod 700 %h/.ssh" + ]; + ExecStart = ''${pkgs.openssh}/bin/ssh-keygen -t ed25519 -N "" -f %h/.ssh/id_ed25519 -C "%u@%H"''; + }; + + Install.WantedBy = [ "default.target" ]; + }; }; } ) diff --git a/modules/features/security/default.nix b/modules/features/security/default.nix new file mode 100644 index 0000000..7c110d7 --- /dev/null +++ b/modules/features/security/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./sops.nix + ]; +} diff --git a/modules/features/security/sops.nix b/modules/features/security/sops.nix new file mode 100644 index 0000000..a214ceb --- /dev/null +++ b/modules/features/security/sops.nix @@ -0,0 +1,24 @@ +{ + config, + lib, + ... +}: +let + cfg = config.my.features.security.sops; +in +{ + options.my.features.security.sops = { + defaultSopsFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = null; + description = "Default encrypted SOPS file for host secrets."; + }; + + userPassword.enable = lib.mkEnableOption "hashed password for the primary user from sops-nix"; + }; + + config.my.system.secrets.sops = { + inherit (cfg) defaultSopsFile; + userPassword.enable = cfg.userPassword.enable; + }; +} diff --git a/modules/system/default.nix b/modules/system/default.nix index aeefa4e..234d130 100644 --- a/modules/system/default.nix +++ b/modules/system/default.nix @@ -12,6 +12,7 @@ ./nix.nix ./power.nix ./secure-boot.nix + ./secrets ./user ./version.nix ]; diff --git a/modules/system/secrets/default.nix b/modules/system/secrets/default.nix new file mode 100644 index 0000000..7c110d7 --- /dev/null +++ b/modules/system/secrets/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./sops.nix + ]; +} diff --git a/modules/system/secrets/sops.nix b/modules/system/secrets/sops.nix new file mode 100644 index 0000000..e7d4e15 --- /dev/null +++ b/modules/system/secrets/sops.nix @@ -0,0 +1,83 @@ +{ + config, + inputs, + lib, + pkgs, + username, + ... +}: +let + cfg = config.my.system.secrets.sops; +in +{ + imports = [ + inputs.sops-nix.nixosModules.sops + ]; + + options.my.system.secrets.sops = { + ageKeyFile = lib.mkOption { + type = lib.types.path; + default = /var/lib/sops-nix/key.txt; + description = "Path to the host age key used by sops-nix."; + }; + + generateKey = lib.mkOption { + type = lib.types.bool; + default = true; + description = "Generate the host age key at ageKeyFile when it does not exist."; + }; + + defaultSopsFile = lib.mkOption { + type = lib.types.nullOr lib.types.path; + default = null; + description = "Default encrypted SOPS file for host secrets."; + }; + + userPassword = { + enable = lib.mkEnableOption "hashed password for the primary user from sops-nix"; + + secretName = lib.mkOption { + type = lib.types.str; + default = "users/${username}/hashedPassword"; + description = "SOPS secret name containing the hashed password for the primary user."; + }; + }; + }; + + config = lib.mkMerge [ + { + environment.systemPackages = with pkgs; [ + age # File encryption tool used with sops-nix age keys + sops # Editor and CLI for SOPS encrypted secrets + ssh-to-age # Convert SSH public keys to age recipients + ]; + + sops = { + age = { + keyFile = cfg.ageKeyFile; + inherit (cfg) generateKey; + }; + }; + } + + (lib.mkIf (cfg.defaultSopsFile != null) { + sops.defaultSopsFile = cfg.defaultSopsFile; + }) + + (lib.mkIf cfg.userPassword.enable { + assertions = [ + { + assertion = cfg.defaultSopsFile != null; + message = "my.system.secrets.sops.userPassword.enable requires my.system.secrets.sops.defaultSopsFile."; + } + ]; + + sops.secrets.${cfg.userPassword.secretName} = { + neededForUsers = true; + }; + + users.mutableUsers = false; + users.users.${username}.hashedPasswordFile = config.sops.secrets.${cfg.userPassword.secretName}.path; + }) + ]; +} diff --git a/modules/system/user/default.nix b/modules/system/user/default.nix index 3882832..17d4535 100644 --- a/modules/system/user/default.nix +++ b/modules/system/user/default.nix @@ -1,9 +1,10 @@ +{ lib, ... }: { imports = [ ./moons.nix ]; - users.mutableUsers = true; + users.mutableUsers = lib.mkDefault true; nix.settings.allowed-users = [ "moons" ]; nix.settings.trusted-users = [ diff --git a/profiles/workloads/secure-storage.nix b/profiles/workloads/secure-storage.nix index c3820e1..290414c 100644 --- a/profiles/workloads/secure-storage.nix +++ b/profiles/workloads/secure-storage.nix @@ -1,4 +1,6 @@ { - my.features.boot.secureBoot.enable = true; - my.features.boot.storageCrypto.enable = true; + my.features = { + boot.secureBoot.enable = true; + boot.storageCrypto.enable = true; + }; } diff --git a/secrets/users/README.md b/secrets/users/README.md new file mode 100644 index 0000000..3718989 --- /dev/null +++ b/secrets/users/README.md @@ -0,0 +1,21 @@ +# User secrets + +`moons` の hashed password を SOPS で管理する場合は、`my.features.security.sops.userPassword.enable` を有効にする前に `moons.yaml` を暗号化して作成してください。 + +```yaml +users: + moons: + hashedPassword: "$y$j9T$..." +``` + +ハッシュ生成コマンド: + +```sh +mkpasswd -m yescrypt +``` + +編集コマンド: + +```sh +sops secrets/users/moons.yaml +``` From 52f14549e0e7f09f38c689246a4606edad296736 Mon Sep 17 00:00:00 2001 From: moons14 Date: Sat, 6 Jun 2026 23:13:37 +0900 Subject: [PATCH 2/3] fix: move sops feature to top level --- docs/secrets/sops-nix.md | 2 +- modules/features/default.nix | 2 +- modules/features/security/default.nix | 5 ----- modules/features/{security/sops.nix => sops/default.nix} | 4 ++-- secrets/users/README.md | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) delete mode 100644 modules/features/security/default.nix rename modules/features/{security/sops.nix => sops/default.nix} (84%) diff --git a/docs/secrets/sops-nix.md b/docs/secrets/sops-nix.md index 2af47d2..8d7f600 100644 --- a/docs/secrets/sops-nix.md +++ b/docs/secrets/sops-nix.md @@ -35,7 +35,7 @@ sudo age-keygen -y /mnt/var/lib/sops-nix/key.txt `moons` ユーザーの hashed password を SOPS から使う場合は、対象ホストや profile で次のように設定します。 ```nix -my.features.security.sops = { +my.features.sops = { defaultSopsFile = ../../secrets/users/moons.yaml; userPassword.enable = true; }; diff --git a/modules/features/default.nix b/modules/features/default.nix index 5272e1f..fafb0ff 100644 --- a/modules/features/default.nix +++ b/modules/features/default.nix @@ -8,7 +8,7 @@ ./gui ./identity ./network - ./security + ./sops ./services ./storage ]; diff --git a/modules/features/security/default.nix b/modules/features/security/default.nix deleted file mode 100644 index 7c110d7..0000000 --- a/modules/features/security/default.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - imports = [ - ./sops.nix - ]; -} diff --git a/modules/features/security/sops.nix b/modules/features/sops/default.nix similarity index 84% rename from modules/features/security/sops.nix rename to modules/features/sops/default.nix index a214ceb..de396dc 100644 --- a/modules/features/security/sops.nix +++ b/modules/features/sops/default.nix @@ -4,10 +4,10 @@ ... }: let - cfg = config.my.features.security.sops; + cfg = config.my.features.sops; in { - options.my.features.security.sops = { + options.my.features.sops = { defaultSopsFile = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; diff --git a/secrets/users/README.md b/secrets/users/README.md index 3718989..394ec56 100644 --- a/secrets/users/README.md +++ b/secrets/users/README.md @@ -1,6 +1,6 @@ # User secrets -`moons` の hashed password を SOPS で管理する場合は、`my.features.security.sops.userPassword.enable` を有効にする前に `moons.yaml` を暗号化して作成してください。 +`moons` の hashed password を SOPS で管理する場合は、`my.features.sops.userPassword.enable` を有効にする前に `moons.yaml` を暗号化して作成してください。 ```yaml users: From 6671e0201550d6f05dbcd763defc08c39d0b2b02 Mon Sep 17 00:00:00 2001 From: moons-14 Date: Sun, 7 Jun 2026 12:49:09 +0900 Subject: [PATCH 3/3] fix flake nix --- flake.lock | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/flake.lock b/flake.lock index 1160ba5..d8f2d77 100644 --- a/flake.lock +++ b/flake.lock @@ -938,6 +938,7 @@ "noctalia": "noctalia", "quickshell": "quickshell", "services-flake": "services-flake", + "sops-nix": "sops-nix", "stylix": "stylix", "systems": "systems_6", "treefmt-nix": "treefmt-nix_3", @@ -981,6 +982,26 @@ "type": "github" } }, + "sops-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1780547341, + "narHash": "sha256-Gq8KNx5A7hBB3uGJaj6eQfLDIz5YdLu92gqBcvHvoUo=", + "owner": "Mic92", + "repo": "sops-nix", + "rev": "9ed65852b6257fbeae4355bc24ecfea307ca759a", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "sops-nix", + "type": "github" + } + }, "stylix": { "inputs": { "base16": "base16",