Pređi na glavni sadržaj

Ključevi iz promenljivih okruženja i datoteka

Pored čuvanja tajne u bazi podataka, stavka skladišta ključeva (Key Store) može da pročita svoju vrednost u trenutku izvršavanja zadatka iz datoteke na Semaphore serveru ili iz promenljive okruženja procesa Semaphore servera. Ovo je korisno kada je kredencijal već obezbeđen izvan Semaphore-a, na primer:

  • SSH ključ montiran u Semaphore kontejner kao Docker ili Kubernetes secret;
  • token koji agent (HashiCorp Vault Agent, cert-manager itd.) upisuje na disk i redovno rotira;
  • lozinka koju vaš orkestrator ubacuje u okruženje kontejnera.

Semaphore ne kopira vrednost u svoju bazu podataka. Svaki put kada je zadatku (Task) potreban ključ, server ponovo čita datoteku ili promenljivu, tako da rotacija kredencijala na disku stupa na snagu pri sledećem zadatku.

informacija

Datoteku ili promenljivu čita Semaphore server, a ne runner. Kada koristite udaljene runnere (Runner), montirajte datoteku na host servera; server razrešava tajnu i prosleđuje je runneru.

Izbor izvora

Kada kreirate ili menjate ključ (Key Store → New Key), na vrhu forme nalaze se kartice izvora:

KarticaOdakle dolazi vrednostŠta uneti
LocalSemaphore baza podataka (šifrovano)Korisničko ime, lozinku ili privatni ključ u formi
Storage ProEksterno skladište tajni kao što je HashiCorp VaultSkladište i putanju tajne
EnvPromenljiva okruženja procesa Semaphore serveraNaziv promenljive, na primer PROD_SSH_KEY
FileDatoteka na Semaphore serveruApsolutnu putanju do datoteke, na primer /var/lib/semaphore/secrets/prod.json

Kada je izabrano Env ili File, polja za korisničko ime, lozinku i privatni ključ nestaju. Ceo kredencijal, uključujući korisničko ime za SSH i Login With Password ključeve, mora biti u datoteci ili promenljivoj.

1. Dozvolite direktorijum

Iz bezbednosnih razloga Semaphore čita samo datoteke ključeva koje se nalaze unutar njegovog direktorijuma za tajne. Svaka druga putanja se odbija pri pokretanju zadatka:

Failed to install inventory: file path must be inside secrets path

Podrazumevani direktorijum za tajne je /tmp/semaphore. Usmerite ga na direktorijum u kome se nalaze vaše datoteke ključeva pomoću dirs.secrets u config.json ili promenljive okruženja SEMAPHORE_SECRETS_PATH. Pogledajte Direktorijum za tajne za pravila prioriteta.

Primer za Docker Compose koji montira direktorijum hosta i dozvoljava ga:

services:
semaphore:
image: semaphoreui/semaphore:latest
environment:
SEMAPHORE_SECRETS_PATH: /var/lib/semaphore/secrets
volumes:
- /srv/semaphore/secrets:/var/lib/semaphore/secrets:ro

Ekvivalentan fragment config.json:

{
"dirs": {
"secrets": "/var/lib/semaphore/secrets"
}
}

Pravila za putanju unetu u kartici File:

  • mora biti apsolutna (/var/lib/semaphore/secrets/prod.json, a ne prod.json);
  • ne sme da sadrži segmente ..;
  • mora da se razreši na lokaciju unutar direktorijuma za tajne (poddirektorijumi su dozvoljeni);
  • datoteka mora biti čitljiva za korisnika pod kojim se Semaphore izvršava (u zvaničnoj Docker slici to je semaphore, UID 1001).

Promenljive okruženja nemaju takvo ograničenje; server jednostavno čita navedenu promenljivu iz sopstvenog okruženja.

2. Formatirajte vrednost

Sadržaj datoteke (ili vrednost promenljive) zavisi od tipa ključa. Jedan završni prelom reda na kraju datoteke se ignoriše; sve ostalo se koristi doslovno.

SSH ključ

Semaphore očekuje JSON dokument, a ne sirovu PEM ili OpenSSH datoteku privatnog ključa:

{
"login": "deploy",
"passphrase": "",
"private_key": "-----BEGIN OPENSSH PRIVATE KEY-----\n...\n-----END OPENSSH PRIVATE KEY-----\n"
}
  • login — SSH korisničko ime, koje se prosleđuje Ansible-u kao --user. Ostavite ga prazno da bi inventar (Inventory) odlučio (ansible_user). Za Git repozitorijume prazno korisničko ime podrazumevano je git.
  • passphrase — lozinka privatnog ključa ili prazan string.
  • private_key — privatni ključ sa prelomima redova kodiranim kao \n.

Generišite omotač iz postojećeg ključa pomoću jq, koji se brine o escape-ovanju:

jq -n --arg login deploy --rawfile key ~/.ssh/id_ed25519 \
'{login: $login, passphrase: "", private_key: $key}' \
> /srv/semaphore/secrets/prod_ssh.json
chmod 0400 /srv/semaphore/secrets/prod_ssh.json

Zatim kreirajte ključ tipa SSH, otvorite karticu File i unesite /var/lib/semaphore/secrets/prod_ssh.json (putanju kako se vidi unutar kontejnera).

upozorenje

Usmeravanje kartice File na sirovi privatni ključ kao što je ~/.ssh/id_ed25519 ne radi. Datoteka se parsira kao JSON i zadatak ne uspeva da učita inventar.

Login With Password

Takođe JSON dokument:

{
"login": "svc-ansible",
"password": "s3cr3t"
}

Ostavite login prazno da biste ključ koristili kao običan token ili lozinku, na primer kao lozinku za Ansible vault.

Primer promenljive okruženja

Isti JSON format važi i za karticu Env. U Docker Compose-u:

services:
semaphore:
image: semaphoreui/semaphore:latest
environment:
PROD_SSH_KEY: '{"login":"deploy","passphrase":"","private_key":"-----BEGIN OPENSSH PRIVATE KEY-----\n...\n-----END OPENSSH PRIVATE KEY-----\n"}'

Kreirajte SSH ključ, izaberite karticu Env i unesite PROD_SSH_KEY kao naziv promenljive.

savet

Promenljive okruženja su vidljive svakom procesu u kontejneru i često završavaju u metapodacima i logovima orkestratora. Kada možete, radije koristite karticu File sa montiranim secret-om.

Rešavanje problema

GreškaUzrokRešenje
file path must be absoluteUneta je relativna putanjaUnesite punu putanju koja počinje sa /
file path must not contain traversal segmentsPutanja sadrži ..Unesite razrešenu putanju
file path must be inside secrets pathDatoteka je izvan dirs.secretsPostavite SEMAPHORE_SECRETS_PATH na direktorijum datoteke ili premestite datoteku
no such file or directoryPutanja je pogrešna ili nije montirana u kontejnerProverite montiranje volume-a i koristite putanju unutar kontejnera
permission deniedSemaphore proces ne može da pročita datotekuIspravite vlasništvo ili prava pristupa datoteke
invalid character '-' looking for beginning of valueUmesto JSON omotača dat je sirovi privatni ključUmotajte ključ kao što je prikazano iznad