Ostatnio rozkminiałem, zupełnie tak żeby się pobawić, proces pobierania secretów z repozytorium secretów. Sam używam gopass, którego z pełną odpowiedzialnością polecam jako manager secretów. Jest oparty o git i gpg, potrafi w integracje systmowe, wiele źródeł. Ogólnie naprawdę fajna rzecz, jest on golangową  implementacją passwordstore.

Pomysł pojawił się w sumie przez przypadek, bo wykombinowałem sobie proces, który będzie w stanie tworzyć hasła i je gdzieś odkładać, ale nie chciałem jak zawsze ogarniać tego za pomocą dodatkowego serwisu, ale zwykłego repozytorium.

No i sobie wymyśliłem coś takiego:

    flowchart TD
    A[Start CI/CD] --> B[Pobranie obrazu dla procesu]
    B --> C[secret GPG_PRIVATE_KEY]
    B --> D[secret GPG_PUBLIC_KEY]
    B --> E[secret SSH_PRIVATE_KEY]
    
    C & D & E --> F[Configure GPG and SSH access]
    F --> G[Clone repozytorium z secretami dla gopass]
    G --> H[Inicjalizacja gopass i deszyfrowanie plików z hasłami za pomocą gpg]
    H --> I[Export sekretów do zmiennych]
    I --> J[Uruchomienie jobów z pobranymi secretami]
    J --> K[Koniec]
  

Całość oparłem o gitea, której używam od dawna, bo jak juz wiecie nie lubię swoich rzeczy trzymać na obcych serwerach :)

Dla testu zrobiłem sobie taki skrypt w pipeline:

curl https://packages.gopass.pw/repos/gopass/gopass-archive-keyring.gpg | tee /usr/share/keyrings/gopass-archive-keyring.gpg >/dev/null
cat << EOF | tee /etc/apt/sources.list.d/gopass.sources
Types: deb
URIs: https://packages.gopass.pw/repos/gopass
Suites: stable
Architectures: all amd64 arm64 armhf
Components: main
Signed-By: /usr/share/keyrings/gopass-archive-keyring.gpg
EOF
apt update
apt install -y gopass gopass-archive-keyring
echo "${{ secrets.GPG_PRIVATE_KEY }}" | gpg --batch --import
echo "${{ secrets.GPG_PUBLIC_KEY }}" | gpg --batch --import
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
git clone ssh://gitea@git.cynarski.pl:65522/homelab/secrets.git "${PASSWORD_STORE_DIR}"
gpg --list-secret-keys
gopass list
gopass mounts
gopass services/proxmox
mkdir -p ${PASSWORD_STORE_DIR}/process
git config --global user.email "ci@automancer.dev"
git config --global user.name "Process CI"

echo "ci@automancer.dev" > ${PASSWORD_STORE_DIR}/process/.gpg-id
echo $(gopass pwgen -xn |head -n1) |gopass insert -m process/generated
gopass sync

No i gra pięknie :D

Szybkie info odnośnie samego gopass i sposobu zapisywania i odczytywania haseł z repozytorium. Gopass używa do szyfrowania gpg, oraz przypisywania odbiorców (kluczy publicznych) dla store, store to repozytotium i niestety gopass nie potrafi dla pojedynczych haseł robić różnych dostępów, ale potrafi to w kontekście katalogu (grupy). Służy to tego plik .gpg-id w którym zdefiniowane są klucze, mające dostęp do pęku. Jeżeli w procesie chcemy zapisać hasło do repozytorium to musimy mieć zaimportowane wszystkie klucze publiczne, które są w pliku .gpg-id dla danego katalogu.

Dlatego komenda wyżej dodaje adres email klucza, który zapisuje i szyfruje hasło stworzone w procesie.

To tak w telegraficznym skrócie. Jak widzicie, rozwiązanie jest typowo labowe, bo produkcyjnie używamy do tego wyspecjalizowanych serwisów, ale dla laba i fajnych automatów w/g mnie jak znalazł :)

Poniżej output z procesu:

gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 419EFC3AA0B51C36: public key "Process CI/CD (Process CI/CD) <ci@automancer.dev>" imported
gpg: key 419EFC3AA0B51C36: secret key imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1
gpg: key 419EFC3AA0B51C36: "Process CI/CD (Process CI/CD) <ci@automancer.dev>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
Cloning into '$CI_PROJECT_DIR/.secrets'...
Warning: Permanently added '[git.cynarski.pl]:65522' (ED25519) to the list of known hosts.
/root/.gnupg/pubring.kbx
------------------------
sec   rsa3072 2025-07-12 [SC]
      7A50A5675DACE35863C6D38B419EFC3AA0B51C36
uid           [ unknown] Process CI/CD (Process CI/CD) <ci@automancer.dev>
ssb   rsa3072 2025-07-12 [E]
gopass
└── services/
    └── proxmox
No mounts
tajnehaslo123
⚠ Found untracked files: [process/.gpg-id]
🚥 Syncing with all remotes ...
[<root>] 
   gitfs pull and push ... ⚠ Found untracked files: [process/.gpg-id]
OK (no changes)
   done
✅ All done