
Allt stÀmmer, efter lanseringen i början av maj 2019 kan man autentisera applikationer och tjÀnster som körs i Kubernetes, nativt i Consul.
I den hĂ€r guiden kommer vi steg för steg att skapa (Proof of concept, PoC â bevis för konceptets genomförbarhet â kommentar till översĂ€ttningen), och demonstrera denna nya funktion. Du förvĂ€ntas ha grundlĂ€ggande kunskaper om Kubernetes och Hashicorp's Consul. Och Ă€ven om du kan anvĂ€nda vilken molnplattform eller lokal miljö som helst, kommer vi i denna guide att anvĂ€nda Googleâs Cloud Platform.
Ăversikt
Om vi gÄr till , fÄr vi en kort översikt över dess syfte och anvÀndningsfall, samt nÄgra tekniska detaljer och en allmÀn översikt över logiken. Jag rekommenderar starkt att du lÀser igenom det Ätminstone en gÄng innan du fortsÀtter, eftersom jag nu kommer att förklara och utveckla allt detta.

Schema 1: Officiell översikt över Consuls autentiseringsmetod
LÄt oss titta i .
SjÀlvklart finns det anvÀndbar information dÀr, men ingen handledning om hur man faktiskt anvÀnder allt detta. SÄ, som varje förnuftig person, söker du pÄ internet efter en guide. Och sedan... rÄkar du pÄ motgÄngar. SÄdant hÀnder. LÄt oss rÀtta till det.
Innan vi gÄr vidare till att skapa vÄr POC, lÄt oss ÄtervÀnda till översikten över Consuls autentiseringsmetoder (Schema 1) och specificera den i kontexten av Kubernetes.
Arkitektur
I denna guide kommer vi att skapa en Consul-server pÄ en separat maskin som kommer att interagera med Kubernetes-klustret dÀr Consul-klienten Àr installerad. Sedan kommer vi att skapa vÄr dummyapplikation i en pod och anvÀnda vÄr konfigurerade autentiseringsmetod för att lÀsa frÄn vÄrt Consul key/value-lager.
Schemat nedan visar detaljerat arkitekturen som vi skapar i denna guide, samt logiken för autentiseringsmetoden som kommer att förklaras senare.

Schema 2: Ăversikt över autentisering i Kubernetes
Ett litet meddelande: Consul-servern behöver inte leva utanför Kubernetes-klustret för att detta ska fungera. Men ja, den kan vara bÄde och.
SÄ, med översiktsschemat för Consul (Schema 1) och tillÀmpat pÄ Kubernetes, fÄr vi schemat ovan (Schema 2), och logiken kommer att vara följande:
- Varje pod kommer att kopplas till ett tjÀnstekonto som innehÄller en JWT-token, som genereras av och Àr kÀnd av Kubernetes. Denna token sÀtts ocksÄ in i podden som standard.
- VÄr applikation eller tjÀnst inom podden initierar en inloggningskommandotill vÄrt Consul-klient. I inloggningsbegÀran kommer Àven vÄr token att anges och nÀmna namnet sÀrskilt skapad auktoriseringsmetod (av typen Kubernetes). Detta steg nummer 2 motsvarar steg 1 i Consul-diagrammet (Diagram 1).
- VÄr Consul-klient kommer sedan att skicka denna begÀran till vÄr Consul-server.
- MAGI! Det Àr hÀr som Consul-servern autentiserar begÀran, samlar in information om begÀran och jÀmför den med eventuella associerade fördefinierade regler. Nedan finns ett annat diagram för att illustrera detta. Detta steg motsvarar steg 3, 4 och 5 i översiktliga Consul-diagrammet (Diagram 1).
- VÄr Consul-server genererar en Consul-token med behörigheter i enlighet med de regler vi angivit för auktoriseringsmetoden (som vi har definierat) i relation till identiteten hos den som begÀr.
- VÄr Consul-klient omdirigerar token till den begÀrande applikationen eller tjÀnsten.
VÄr applikation eller tjÀnst kan nu anvÀnda denna Consul-token för att interagera med vÄra Consul-data, sÄsom definierat av token-behörigheterna.
Magin avslöjad!
För er som inte nöjer er med bara en kanin ur hatten och vill veta hur det fungerar⊠lÄt mig "visa er hur djup kaninhÄlet».
Som nÀmnts tidigare ligger vÄr "magiska" aspekt (Diagram 2: Steg 4) i att Consul-servern autentiserar begÀran, samlar information om begÀran och jÀmför den med eventuella associerade fördefinierade regler. Detta steg motsvarar steg 3, 4 och 5 i översiktliga Consul-diagrammet (Diagram 1). HÀr Àr ett diagram (Diagram 3) vars syfte Àr att visuellt visa vad som faktiskt hÀnder under huven med den specifika Kubernetes-auktoriseringsmetoden.

Diagram 3: Magin avslöjad!
- Som utgÄngspunkt omdirigerar vÄr Consul-klient inloggningsbegÀran till vÄr Consul-server med Kubernetes-konto-token och det specifika namnet pÄ instansen av auktoriseringsmetoden som skapades tidigare. Detta steg motsvarar steg 3 i den tidigare förklaringen av diagrammet.
- Nu mÄste Consul-servern (eller ledaren) verifiera giltigheten av den mottagna token. DÀrför kommer den att rÄdfrÄga Kubernetes-klustret (via Consul-klienten) och, om rÀttigheter finns, kommer vi att ta reda pÄ om token Àr Àkta och vem den tillhör.
- Den verifierade begÀran returneras sedan till Consul-ledaren, och pÄ Consul-servern utförs en sökning efter instansen av autentiseringmetoden med det angivna namnet frÄn inloggningsbegÀran (och typen Kubernetes).
- Consul-ledaren identifierar den angivna instansen av autentiseringmetoden (om den hittas) och lÀser uppsÀttningen av bindningsregler som kopplats till den. DÀrefter lÀser den dessa regler och jÀmför dem med de verifierade identitetsattributen.
- Tada! LÄt oss gÄ vidare till steg 5 i den tidigare förklaringen av schemat.
Kör Consul-servern pÄ en vanlig virtuell maskin.
FrĂ„n och med nu kommer jag mestadels att ge instruktioner om hur man skapar denna POC, ofta i punkter, utan förklarande hela meningar. Ăven som tidigare nĂ€mnts kommer jag att anvĂ€nda GCP för att skapa hela infrastrukturen, men du kan skapa en liknande infrastruktur nĂ„gon annanstans.
- Starta en virtuell maskin (instans / server).

- Skapa en brandvÀggsregel (sÀkerhetsgrupp i AWS):
- Jag gillar att ge samma namn pÄ maskinen till regeln och nÀtverkstaggen, i det hÀr fallet "skywiz-consul-server-poc".
- Hitta IP-adressen till din lokala dator och lÀgg till den i listan över ursprungliga IP-adresser, sÄ att vi kan fÄ tillgÄng till anvÀndargrÀnssnittet (UI).
- Ăppna port 8500 för UI. Klicka pĂ„ Skapa. Vi kommer snart att Ă€ndra denna brandvĂ€gg igen [].
- LÀgg till en brandvÀggsregel till instansen. GÄ tillbaka till VM-panelen pÄ Consul-servern och lÀgg till "skywiz-consul-server-poc" i nÀtverkstagsfÀltet. Klicka pÄ Spara.

- Installera Consul pÄ den virtuella maskinen, kolla hÀr. Kom ihÄg att du behöver Consul version ℠1.5 [lÀnk]
- LĂ„t oss skapa en enskild nod Consul â konfigurationen Ă€r följande.
groupadd --system consul
useradd -s /sbin/nologin --system -g consul consul
mkdir -p /var/lib/consul
chown -R consul:consul /var/lib/consul
chmod -R 775 /var/lib/consul
mkdir /etc/consul.d
chown -R consul:consul /etc/consul.d- En mer detaljerad guide för att installera Consul och konfigurera ett kluster med 3 noder finner du. .
- Skapa filen /etc/consul.d/agent.json pÄ följande sÀtt []:
### /etc/consul.d/agent.json
{
"acl" : {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}- Starta vÄr Consul-server:
consul agent
-server
-ui
-client 0.0.0.0
-data-dir=/var/lib/consul
-bootstrap-expect=1
-config-dir=/etc/consul.d- Du bör se en massa utdata och slutligen "... update blocked by ACLs".
- Hitta den externa IP-adressen för Consul-servern och öppna webblÀsaren med den IP-adressen pÄ port 8500. Se till att UI:n öppnas.
- Försök att lÀgga till ett par nyckel/vÀrde. Det bör bli ett fel. Det Àr för att vi har laddat Consul-servern med ACL och blockerat alla regler.
- GÄ tillbaka till din terminal pÄ Consul-servern och kör processen i bakgrunden eller pÄ nÄgot annat sÀtt sÄ att den fortsÀtter att köras, och skriv in följande:
consul acl bootstrap- Hitta vÀrdet "SecretID" och gÄ tillbaka till UI:n. PÄ fliken "ACL" anger du den hemliga identifieraren för token som du just kopierade. Kopiera SecretID nÄgon annanstans, vi behöver den senare.
- Nu lÀgg till ett par nyckel/vÀrde. För detta POC lÀgger vi till följande: nyckel: "custom-ns/test_key", vÀrde: "Jag Àr i mappen custom-ns!"
Starta Kubernetes-klustret för vÄr applikation med Consul-klienten som Daemonset.
- Skapa en K8s (Kubernetes) kluster. Vi kommer att skapa den i samma zon som servern för snabbare Ätkomst, och sÄ att vi kan anvÀnda samma undernÀt för enkel anslutning med interna IP-adresser. Vi kallar den "skywiz-app-with-consul-client-poc".

- Som en anteckning, hÀr Àr en bra guide som jag stötte pÄ nÀr jag konfigurerade POC Consul-klustret med Consul Connect.
- Vi kommer ocksÄ att anvÀnda Hashicorp helm chart med en utökad vÀrdefil.
- Installera och konfigurera Helm. Konfigurationsstegen:
kubectl create serviceaccount tiller --namespace kube-system
kubectl create clusterrolebinding tiller-admin-binding
--clusterrole=cluster-admin --serviceaccount=kube-system:tiller
./helm init --service-account=tiller
./helm update- helm chart:
- AnvÀnd följande vÀrdefil (notera, jag stÀngde av de flesta):
### poc-helm-consul-values.yaml
global:
enabled: false
image: "consul:latest"
# Expose the Consul UI through this LoadBalancer
ui:
enabled: false
# Allow Consul to inject the Connect proxy into Kubernetes containers
connectInject:
enabled: false
# Configure a Consul client on Kubernetes nodes. GRPC listener is required for Connect.
client:
enabled: true
join: ["<PRIVATE_IP_CONSUL_SERVER>"]
extraConfig: |
{
"acl" : {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
# Minimal Consul configuration. Not suitable for production.
server:
enabled: false
# Sync Kubernetes and Consul services
syncCatalog:
enabled: false- TillÀmpa helm chart:
./helm install -f poc-helm-consul-values.yaml ./consul-helm --name skywiz-app-with-consul-client-poc- NÀr du försöker starta den, kommer den att behöva behörigheter för Consul-servern, sÄ lÄt oss lÀgga till dem.
- Observera "pod-adressintervallet" som finns pÄ klusterpanelen, och gÄ tillbaka till vÄr brandvÀggsregel "skywiz-consul-server-poc".
- LÀgg till pod-adressintervallet till listan över IP-adresser och öppna portarna 8301 och 8300.

- GÄ till Consul UI, och efter nÄgra minuter ser du att vÄrt kluster dyker upp pÄ nodfliken.

Konfigurera autentiseringsmetod genom att integrera Consul med Kubernetes.
- GÄ tillbaka till terminalen pÄ Consul-servern och exportera token som du sparade tidigare:
export CONSUL_HTTP_TOKEN=- Vi behöver information frÄn vÄr Kubernetes-kluster för att skapa en instans av autentiseringsmetoden:
- kubernetes-host
kubectl get endpoints | grep kubernetes- kubernetes-service-account-jwt
kubectl get sa -consul-client -o yaml | grep "- name:"
kubectl get secret -o yaml | grep token:- Token Àr kodad i base64, sÄ dekoda det med ditt favoritverktyg []
- kubernetes-ca-cert
kubectl get secret -o yaml | grep ca.crt:- Ta certifikatet âca.crtâ (efter att det har dekodats frĂ„n base64) och skriv in det i filen âca.crtâ.
- Skapa nu en instans av autentiseringsmetoden, ersÀtt platshÄllarna med de vÀrden som du just har fÄtt.
consul acl auth-method create
-type "kubernetes"
-name "auth-method-skywiz-consul-poc"
-description "Detta Àr en autentiseringsmetod som anvÀnder kubernetes för klustret skywiz-app-with-consul-client-poc"
-kubernetes-host ""
-kubernetes-ca-cert=@ca.crt
-kubernetes-service-account-
jwt=""- Vidare mÄste vi skapa en regel och koppla den till den nya rollen. För denna del kan du anvÀnda Consul UI, men vi kommer att anvÀnda kommandoraden.
- Skriv regeln
### kv-custom-ns-policy.hcl
key_prefix "custom-ns/" {
policy = "write"
}- TillÀmpa regeln
consul acl policy create
-name kv-custom-ns-policy
-description "Detta Àr ett exempel pÄ en policy för kv pÄ custom-ns/"
-rules @kv-custom-ns-policy.hcl- Hitta id:t för regeln som du just har skapat frÄn utdata.
- Skapa en roll med den nya regeln.
consul acl role create
-name "custom-ns-role"
-description "Detta Àr ett exempel pÄ en roll för custom-ns-namnrymden"
-policy-id- Nu kopplar vi vÄr nya roll till instansen av autentiseringsmetoden. Observera att flaggan 'selektor' bestÀmmer om vÄr inloggningsbegÀran kommer att fÄ denna roll. Kontrollera hÀr andra selektoralternativ:
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-ns-role'
-selector='serviceaccount.namespace=="custom-ns"'Konfigurationer till sist
à tkomstbehörigheter
- Skapa Ätkomstbehörigheter. Vi behöver ge Consul tillstÄnd att verifiera och identifiera token-ID:t för K8s tjÀnsteerkÀnnande.
- Skriv följande i filen :
###skywiz-poc-consul-server_rbac.yaml
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: review-tokens
namespace: default
subjects:
- kind: ServiceAccount
name: skywiz-app-with-consul-client-poc-consul-client
namespace: default
roleRef:
kind: ClusterRole
name: system:auth-delegator
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: service-account-getter
namespace: default
rules:
- apiGroups: [""]
resources: ["serviceaccounts"]
verbs: ["get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: get-service-accounts
namespace: default
subjects:
- kind: ServiceAccount
name: skywiz-app-with-consul-client-poc-consul-client
namespace: default
roleRef:
kind: ClusterRole
name: service-account-getter
apiGroup: rbac.authorization.k8s.io- LÄt oss skapa Ätkomstbehörigheter
kubectl create -f skywiz-poc-consul-server_rbac.yamlAnslutning till Consul Client
- Som nÀmnts , finns det flera alternativ för att ansluta till daemonset, men vi gÄr vidare till nÀsta enklare lösning:
- TillÀmpa följande fil [].
### poc-consul-client-ds-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: consul-ds-client
spec:
selector:
app: consul
chart: consul-helm
component: client
hasDNS: "true"
release: skywiz-app-with-consul-client-poc
ports:
- protocol: TCP
port: 80
targetPort: 8500- TillÀmpa sedan följande inbyggda kommando för att skapa configmap []. Observera att vi refererar till namnet pÄ vÄr tjÀnst, byt ut det vid behov.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"consul": ["$(kubectl get svc consul-ds-client -o jsonpath='{.spec.clusterIP}')"]}
EOFTesta auth-metoden
Nu ska vi titta pÄ magin i aktion!
- Skapa ytterligare nÄgra nyckelmappare med samma övre nivÄnyckel (dvs. /sample_key) och vÀrde av ditt val. Skapa motsvarande policyer och roller för de nya nyckelvÀgarna. Vi kommer att göra bindningar senare.

AnvÀndartest av namnutrymme:
- LÄt oss skapa vÄrt eget namnutrymme:
kubectl create namespace custom-ns- LÄt oss skapa en pod i vÄrt nya namnutrymme. Skriv konfigurationen för podden.
###poc-ubuntu-custom-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: poc-ubuntu-custom-ns
namespace: custom-ns
spec:
containers:
- name: poc-ubuntu-custom-ns
image: ubuntu
command: ["/bin/bash", "-ec", "sleep infinity"]
restartPolicy: Never- Skapa pod:
kubectl create -f poc-ubuntu-custom-ns.yaml- SÄ snart containern Àr igÄng, gÄ in dÀr och installera curl.
kubectl exec poc-ubuntu-custom-ns -n custom-ns -it /bin/bash
apt-get update && apt-get install curl -y- Nu ska vi skicka en inloggningsbegÀran till Consul, med hjÀlp av den autentiseringsmetod vi skapade tidigare [].
- För att se den inmatade token frÄn ditt tjÀnsteprogram:
cat /run/secrets/kubernetes.io/serviceaccount/token- Skriv följande i en fil inuti containern:
### payload.json
{
"AuthMethod": "auth-method-test",
"BearerToken": "<jwt_token>"
}- Logga in!
curl
--request POST
--data @payload.json
consul-ds-client.default.svc.cluster.local/v1/acl/login- För att utföra de ovanstÄende stegen i en rad (eftersom vi kommer att köra flera tester), kan du göra följande:
echo "{
"AuthMethod": "auth-method-skywiz-consul-poc",
"BearerToken": "$(cat /run/secrets/kubernetes.io/serviceaccount/token)"
}"
| curl
--request POST
--data @-
consul-ds-client.default.svc.cluster.local/v1/acl/login- Det fungerar! à tminstone borde det. Nu tar du SecretID och försöker fÄ Ätkomst till nyckeln/vÀrdet som vi ska ha Ätkomst till.
curl
consul-ds-client.default.svc.cluster.local/v1/kv/custom-ns/test_key --header âX-Consul-Token: â- Du kan avkoda "Value" base64 och se att det motsvarar vĂ€rdet i custom-ns/test_key i UI. Om du anvĂ€nde samma vĂ€rde som anges ovan i denna handbok, kommer ditt kodade vĂ€rde att vara IkknbSBpbiB0aGUgY3VzdG9tLW5zIGZvbGRlciEi.
Test av anvÀndarkonto för tjÀnsten:
- Skapa ett anpassat ServiceAccount med följande kommando [].
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: custom-sa
EOF- Skapa en ny konfigurationsfil för podden. Observera att jag inkluderade installationen av curl för att spara arbete đ
###poc-ubuntu-custom-sa.yaml
apiVersion: v1
kind: Pod
metadata:
name: poc-ubuntu-custom-sa
namespace: default
spec:
serviceAccountName: custom-sa
containers:
- name: poc-ubuntu-custom-sa
image: ubuntu
command: ["/bin/bash","-ec"]
args: ["apt-get update && apt-get install curl -y; sleep infinity"]
restartPolicy: Never- Efter detta, kör en shell inuti containern.
kubectl exec -it poc-ubuntu-custom-sa /bin/bash- Logga in!
echo "{
"AuthMethod": "auth-method-skywiz-consul-poc",
"BearerToken": "$(cat /run/secrets/kubernetes.io/serviceaccount/token)"
}"
| curl
--request POST
--data @-
consul-ds-client.default.svc.cluster.local/v1/acl/login- à tkomst nekad. Oops, vi glömde att lÀgga till en ny regelbindning med motsvarande behörigheter, lÄt oss göra det nu.
Upprepa de tidigare stegen ovan:
a) Skapa en identisk policy för prefixet "custom-sa/".
b) Skapa en roll, kalla den "custom-sa-role"
c) Koppla policyn till rollen.
- Skapa en regelbindning (kan endast göras via cli / api). Observera det andra vÀrdet för selektorflaggan.
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-sa-role'
-selector='serviceaccount.name=="custom-sa"'- Upprepa inloggningen frÄn containern "poc-ubuntu-custom-sa". Lyckat!
- Kontrollera vÄr Ätkomst till den nyckfulla vÀgen custom-sa/.
curl
consul-ds-client.default.svc.cluster.local/v1/kv/custom-sa/test_key --header "X-Consul-Token: "- Du kan ocksÄ sÀkerstÀlla att denna token inte ger Ätkomst till kv i "custom-ns/". Upprepa helt enkelt kommandot ovan efter att du har bytt ut "custom-sa" mot prefixet "custom-ns".
Ă tkomst nekad.
Exempel pÄ överlÀgg:
- Det Àr vÀrt att notera att alla regelbindningar kommer att lÀggas till token med dessa rÀttigheter.
- VÄr container "poc-ubuntu-custom-sa" finns i standardnamnomrÄdet - lÄt oss anvÀnda den för en annan regelbindning.
- Upprepa de tidigare stegen:
a) Skapa en identisk policy för nyckelprefixet "default/".
b) Skapa en roll, kalla den "default-ns-role"
c) Koppla policyn till rollen. - Skapa en regelbindning (kan endast göras via cli / api)
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='default-ns-role'
-selector='serviceaccount.namespace=="default"'- à tergÄ till vÄr container "poc-ubuntu-custom-sa" och försök fÄ Ätkomst till vÀgen "default/" kv.
- Ă
tkomst nekad.
Du kan se de angivna uppgifterna för varje token i UI under ACL > Tokens. Som du ser har vÄr nuvarande token endast en tillagd "custom-sa-role". Token som vi anvÀnder för tillfÀllet genererades nÀr vi loggade in, och dÄ fanns det bara en regelbindning som stÀmde. Vi behöver logga in igen och anvÀnda en ny token. - Se till att du kan lÀsa bÄde frÄn "custom-sa/" och "default/" kv.
Lyckat!
Detta beror pÄ att vÄr "poc-ubuntu-custom-sa" matchar regelbindningarna "custom-sa" och "default-ns".
Slutsats
TTL token hantering?
Vid tidpunkten för denna artikel finns det inget integrerat sÀtt att bestÀmma TTL för token som genererats med denna autentiseringsmetod. Det skulle vara en fantastisk möjlighet - att möjliggöra sÀker automatisering av autentisering i Consul.
Det finns möjlighet att manuellt skapa en token med TTL:
Expiration Time (UtgĂ„ngstid) â tidpunkten dĂ„ denna token kommer att Ă„terkallas. (Valfritt; tillagt i Consul 1.5.0)- Finns endast för manuell skapelse / uppdatering
Jag hoppas att vi snart kan kontrollera hur tokens genereras (för varje regel eller autentiseringsmetod) och lÀgga till TTL.
Tills dess föreslÄs det att anvÀnda en utloggningsendpoint i sin logik.
LÀs Àven andra artiklar i vÄr blogg:
KĂ€lla: habr.com
