## Secrets (CLI Reference) #### Adding Secrets (set) ```bash clan secrets set mysecret > Paste your secret: ``` !!! note As you type your secret won't be displayed. Press Enter to save the secret. #### List all Secrets (list) ```bash clan secrets list ``` #### Assigning Access (set) By default, secrets are encrypted for your key. To specify which users and machines can access a secret: ```bash clan secrets set --machine --machine --user --user ``` #### Displaying Secrets (get) ```bash clan secrets get mysecret ``` #### Rename TODO #### Remove TODO #### import-sops TODO ### Users (Reference) Learn how to manage users and allowing access to existing secrets. #### list user Lists all added users ```bash clan secrets user list ``` ``` {.console, title="Example output", .no-copy} jon sara ``` !!! Question "Who can execute this command?" Everyone - completely public. #### add user add a user ```bash clan secrets users add {username} {public-key} ``` !!! Note Changes can be trusted by maintainer review in version control. #### get user get a user public key ```bash clan secrets users get {username} ``` ``` {.console, title="Example output", .no-copy} age1zk8uzrte55wkg9lkqxu5x6twsj2ja4lehegks0cw4mkg6jv37d9qsjpt44 ``` #### remove user remove a user ```bash clan secrets users remove {username} ``` !!! Note Changes can be trusted by maintainer review in version control. #### add-secret user Grants the user (`username`) access to the secret (`secret_name`) ```bash clan secrets users add-secret {username} {secret_name} ``` !!! Note Requires the executor of the command to have access to the secret (`secret_name`). #### remove-secret user remove the user (`username`) from accessing the secret (`secret_name`) !!! Danger "Make sure at least one person has access." It might still be possible for the machine to access the secret. (See [machines](#machines)) We highly recommend to use version control such as `git` which allows you to rollback secrets in case anything gets messed up. ```bash clan secrets users remove-secret {username} {secret_name} ``` !!! Question "Who can execute this command?" Requires the executor of the command to have access to the secret (`secret_name`). ### Machines (Reference) - [list](): list machines - [add](): add a machine - [get](): get a machine public key - [remove](): remove a machine - [add-secret](): allow a machine to access a secret - [remove-secret](): remove a machine's access to a secret #### List machine New machines in Clan come with age keys stored in `./sops/machines/`. To list these machines: ```bash clan secrets machines list ``` #### Add machine For clan machines the machine key is generated automatically on demand if none exists. ```bash clan secrets machines add ``` If you already have a device key and want to add it manually, see: [How to obtain a remote key](#obtain-remote-keys-manually) #### get machine TODO #### remove machine TODO #### add-secret machine TODO #### remove-secret machine TODO ### Groups (Reference) The Clan-CLI makes it easy to manage access by allowing you to create groups. - [list](): list groups - [add-user](): add a user to group - [remove-user](): remove a user from group - [add-machine](): add a machine to group - [remove-machine](): remove a machine from group - [add-secret](): allow a user to access a secret - [remove-secret](): remove a group's access to a secret #### List Groups ```bash clan secrets groups list ``` #### add-user Assign users to a new group, e.g., `admins`: ```bash clan secrets groups add-user admins ``` !!! info The group is created if no such group existed before. The user must exist in beforehand (See: [users](#users-reference)) ```{.console, .no-copy} . ├── flake.nix . ... └── sops ├── groups │ └── admins │ └── users │ └── -> ../../../users/ ``` #### remove-user TODO #### add-machine TODO #### remove-machine TODO #### add-secret ```bash clan secrets groups add-secret ``` #### remove-secret TODO ### Key (Reference) - [generate]() generate age key - [show]() show age public key - [update]() re-encrypt all secrets with current keys (useful when changing keys) #### generate TODO #### show TODO #### update TODO ## Further Secrets in the repository follow this structure: ```{.console, .no-copy} sops/ ├── secrets/ │ └── / │ ├── secret │ └── users/ │ └── / ``` The content of the secret is stored encrypted inside the `secret` file under `mysecret`. By default, secrets are encrypted with your key to ensure readability. ### Obtain remote keys manually To fetch a **SSH host key** from a preinstalled system: ```bash ssh-keyscan | nix shell nixpkgs#ssh-to-age -c ssh-to-age ``` !!! Success This command converts the SSH key into an age key on the fly. Since this is the format used by the clan secrets backend. Once added the **SSH host key** enables seamless integration of existing machines with clan. Then add the key by executing: ```bash clan secrets machines add ``` See also: [Machine reference](#machines-reference) ### NixOS integration A NixOS machine will automatically import all secrets that are encrypted for the current machine. At runtime it will use the host key to decrypt all secrets into an in-memory, non-persistent filesystem using [sops-nix](https://github.com/Mic92/sops-nix). In your nixos configuration you can get a path to secrets like this `config.sops.secrets..path`. For example: ```nix { config, ...}: { sops.secrets.my-password.neededForUsers = true; users.users.mic92 = { isNormalUser = true; passwordFile = config.sops.secrets.my-password.path; }; } ``` See the [readme](https://github.com/Mic92/sops-nix) of sops-nix for more examples. ### Migration: Importing existing sops-based keys / sops-nix `clan secrets` stores each secret in a single file, whereas [sops](https://github.com/Mic92/sops-nix) commonly allows to put all secrets in a yaml or json document. If you already happened to use sops-nix, you can migrate by using the `clan secrets import-sops` command by importing these files: ```bash % clan secrets import-sops --prefix matchbox- --group admins --machine matchbox nixos/matchbox/secrets/secrets.yaml ``` This will create secrets for each secret found in `nixos/matchbox/secrets/secrets.yaml` in a `./sops` folder of your repository. Each member of the group `admins` in this case will be able to decrypt the secrets with their respective key. Since our clan secret module will auto-import secrets that are encrypted for a particular nixos machine, you can now remove `sops.secrets. = { };` unless you need to specify more options for the secret like owner/group of the secret file.