Pređi na glavni sadržaj

JWT tokeni zadataka

Kada je izdavanje JWT tokena uključeno na serveru, šablon zadatka (Task Template) može da izda kratkotrajni, potpisani token za svaki zadatak (Task) koji pokrene. Token je dostupan playbook-u ili skripti koja se izvršava kao promenljiva okruženja SEMAPHORE_JWT i može se zameniti za kredencijale u bilo kom sistemu koji podržava JWT autentifikaciju – kao što su OpenBao ili HashiCorp Vault.

Prednost u odnosu na dugotrajnu tajnu sačuvanu u skladištu ključeva (Key Store) je to što svaki zadatak dobija svež token koji identifikuje tačno to pokretanje zadatka (projekat, šablon, id korisnika) i ističe ubrzo nakon završetka zadatka.

Uključivanje JWT tokena na šablonu​

U formi šablona pomerite se do odeljka JWT (pojavljuje se samo kada je administrator uključio izdavanje JWT tokena) i štiklirajte JWT uključen (JWT enabled).

Za svaki šablon možete podesiti sledeće opcije:

PoljeOpis
AudienceJedan ili više stringova koji se upisuju u aud claim. Postavite ovo na identifikator(e) koje očekuje vaš ciljni sistem (na primer URL OpenBao servera). Podržano je do 32 stavke.
TTLTrajanje tokena kao vremenski interval (30s, 10m, 1h, ...). Ako se ostavi prazno, koristi se globalna vrednost jwt.default_ttl. TTL ne sme biti veći od globalne vrednosti jwt.max_ttl.

Claim-ovi tokena​

Svaki token nosi sledeće claim-ove na koje se možete osloniti prilikom dodele pristupa u ciljnom sistemu:

ClaimPrimerNapomene
isshttps://semaphore.example.comPodešava administrator.
audhttps://bao.example.comIz liste audience vrednosti šablona.
subtask:1234Jedinstven za svako pokretanje zadatka.
iat / nbf / expStandardni vremenski claim-ovi.
jtiJedinstveni identifikator tokena.
project_id7Projekat (Project) kojem šablon pripada.
template_id42Šablon koji je proizveo zadatak.
user_id67Korisnik koji je pokrenuo zadatak (izostavlja se za zakazana pokretanja i pokretanja iz integracija)

Koristite ove claim-ove da ograničite pristup na strani potrošača. Na primer, OpenBao uloga koja prihvata samo tokene sa project_id = 7 i određenim template_id.

Korišćenje tokena unutar zadatka​

Semaphore izvozi token kao SEMAPHORE_JWT u okruženju procesa zadatka.

#!/usr/bin/env bash

# Bash example
echo "Look at my fancy token: $SEMAPHORE_JWT"
# Ansible example
- name: Read secret from OpenBao KVv2 via JWT auth
ansible.builtin.set_fact:
openbao_secret_value: >-
{{ lookup(
'community.hashi_vault.hashi_vault',
secret='kv/data/semaphore/demo:value',
auth_method='jwt',
url='https://bao.example.com',
role_id=bao_role,
jwt=lookup('ansible.builtin.env', 'SEMAPHORE_JWT')
) }}

Primer: OpenBao​

Sledeće uputstvo podešava OpenBao tako da veruje JWT tokenima Semaphore-a i zamenjuje ih za demo lozinku. Zamenite semaphore.example.com i bao.example.com sopstvenim nazivima hostova.

1. Podesite JWT metod autentifikacije​

Uključite JWT metod autentifikacije i usmerite ga na JWKS endpoint vaše Semaphore instance. OpenBao koristi javni ključ koji odatle preuzima da bi proverio svaki token.

bao auth enable jwt

bao write auth/jwt/config \
jwks_url="https://semaphore.example.com/.well-known/jwks.json" \
bound_issuer="https://semaphore.example.com"

2. Definišite politiku​

Dodelite dozvole koje su zadatku potrebne. Primer ispod dozvoljava čitanje demo kredencijala koji se nalazi pod kv/data/semaphore/demo:

bao policy write semaphore-demo-policy - <<EOF
path "kv/data/semaphore/demo" {
capabilities = ["read"]
}
EOF

3. Definišite OpenBao ulogu vezanu za šablon​

OpenBao uloga odlučuje koji Semaphore zadaci smeju da preuzmu koju politiku. Koristite claim-ove specifične za Semaphore (project_id, template_id, ...) kao bound_claims da bi samo željeni šablon mogao da koristi ulogu:

bao write auth/jwt/role/semaphore-demo-role - <<EOF
{
"role_type": "jwt",
"user_claim": "sub",
"bound_audiences": "https://bao.example.com",
"bound_claims": {
"project_id": "7",
"template_id": "42"
},
"policies": ["semaphore-demo-policy"],
}
EOF

Uvek ograničite svaku ulogu bar claim-om project_id ili template_id. Bez takvog vezivanja bilo koji JWT koji izda vaša Semaphore instanca mogao bi da preuzme ulogu.

Potpuna lista podržanih konfiguracionih parametara nalazi se ovde

4. Podesite šablon​

Na Semaphore šablonu koji pokreće deploy playbook:

  • Štiklirajte JWT uključen (JWT enabled).
  • Postavite Audience na https://bao.example.com – to odgovara vrednosti bound_audiences u OpenBao ulozi.
  • Opciono postavite TTL na 15m da bi token istekao ubrzo nakon završetka zadatka.

5. Koristite token u zadatku​

- hosts: localhost
gather_facts: false
tasks:
- name: Read secret from OpenBao KVv2 via JWT auth
ansible.builtin.set_fact:
openbao_secret_value: >-
{{ lookup(
'community.hashi_vault.hashi_vault',
secret='kv/data/semaphore/demo:value',
auth_method='jwt',
url='https://bao.example.com',
role_id='semaphore-demo-role',
jwt=lookup('ansible.builtin.env', 'SEMAPHORE_JWT')
) }}

Zadatak se sada autentifikuje prema OpenBao-u bez ikakve unapred deljene tajne 🎉