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