
Det er korrekt, efter udgivelsen i begyndelsen af maj 2019 kunne man i Consul udfĂžre godkendelse af applikationer og tjenester, der kĂžrer i Kubernetes, nativt.
I denne vejledning vil vi trin for trin oprette (Proof of concept, PoC â bevis for konceptets [gennemfĂžrlighed] â bemĂŠrk red.), demonstrerende denne nye funktion. Du forventes at have grundlĂŠggende kendskab til Kubernetes og Hashicorpâs Consul. Selvom du kan bruge enhver cloudplatform eller lokal miljĂž, vil vi i denne vejledning bruge Googleâs Cloud Platform.
Oversigt
Hvis vi ser pÄ , fÄr vi en kort oversigt over dens formÄl og brugsscenarier, samt nogle tekniske detaljer og en generel oversigt over logikken. Jeg anbefaler kraftigt at lÊse den mindst én gang, fÞr vi fortsÊtter, da jeg nu vil forklare og uddybe alt dette.

Diagram 1: Officiel oversigt over Consuls godkendelsesmetode
Lad os se pÄ .
SelvfÞlgelig er der nyttig information der, men der er ingen vejledning til, hvordan man virkelig bruger det hele. Derfor, som enhver fornuftig person, gennemser du internettet for at finde en vejledning. Og sÄ⊠lider du nederlag. SÄdan sker det. Lad os rette det.
FÞr vi gÄr videre med at oprette vores POC, lad os vende tilbage til oversigten over Consuls godkendelsesmetoder (Diagram 1) og tydeliggÞre det i konteksten af Kubernetes.
Arkitektur
I denne vejledning vil vi oprette en Consul-server pÄ en separat maskine, der vil interagere med Kubernetes-klusteret med en installeret Consul-klient. Derefter vil vi oprette vores dummy-applikation i en pod og bruge vores konfigurerede godkendelsesmetode til at lÊse fra vores Consul nÞgle/vÊrdi lager.
Diagrammet nedenfor viser detaljeret arkitekturen, som vi opretter i denne vejledning, samt logikken i godkendelsesmetoden, som senere vil blive forklaret.

Diagram 2: Oversigt over godkendelsesmetoden i Kubernetes
En lille bemÊrkning: Consul-serveren behÞver ikke at leve uden for Kubernetes-klusteret for at dette fungerer. Men ja, den kan vÊre der ogsÄ.
SÄ ved at tage oversigtsskemaet fra Consul (Diagram 1) og anvende det pÄ Kubernetes, fÄr vi skemaet ovenfor (Diagram 2), og logikken vil vÊre som fÞlger:
- Hver pod vil have en servicekonto knyttet til sig, som indeholder en JWT-token, genereret og kendt af Kubernetes. Denne token indsĂŠttes ogsĂ„ i podâen som standard.
- Vores applikation eller tjeneste inde i podâen initierer en login-anmodning til vores Consul-klient. I login-anmodningen vil ogsĂ„ vores token vĂŠre angivet samt navnet pĂ„ en specialoprettet autoriseringsmetode (Kubernetes-type). Dette trin nr. 2 svarer til trin 1 i Consul-schemaren (Schemaren 1).
- Vores Consul-klient sender derefter denne anmodning til vores Consul-server.
- MAGI! Det er her, Consul-serveren verificerer anmodningens autentitet, indsamler oplysninger om anmodningens identitet og sammenligner dem med eventuelle tilknyttede foruddefinerede regler. Nedenfor vil der vĂŠre en anden skema for at illustrere dette. Dette trin svarer til trin 3, 4 og 5 i oversigtsskemaren for Consul (Schemaren 1).
- Vores Consul-server genererer en Consul-token med de tilladelser, vi har angivet i de regler for autoriseringsmetoden (som vi har defineret) i relation til anmelderens identitet. Derefter sender den denne token tilbage. Dette svarer til trin 6 i Consul-schemaren (Schemaren 1).
- Vores Consul-klient videresender token til den anmodende applikation eller tjeneste.
Vores applikation eller tjeneste kan nu benytte denne Consul-token til at kommunikere med vores Consul-data, som er defineret af tokenens privilegier.
Magien er afslĂžret!
For dem af jer, der ikke er tilfredse med blot en kanin fra hatten og vil vide, hvordan det virker... lad mig "vise jer, hvor dyb kaninhullet».
Som nĂŠvnt tidligere, er vores âmagiskeâ skridt (Schemaren 2: Skridt 4) det, at Consul-serveren verificerer anmodningens autentitet, indsamler oplysninger om anmodningen og sammenligner dem med eventuelle tilknyttede foruddefinerede regler. Dette trin svarer til trin 3, 4 og 5 i oversigtsskemaren for Consul (Schemaren 1). Nedenfor er en skema (Schemaren 3), hvis formĂ„l er klart at vise, hvad der faktisk sker under panseret af den specifikke Kubernetes-autoriseringsmetode.

Schemaren 3: Magien er afslĂžret!
- Som udgangspunkt videresender vores Consul-klient login-anmodningen til vores Consul-server med Kubernetes-kontoens token og det specifikke navn pÄ instansen af autoriseringsmetoden, som blev oprettet tidligere. Dette trin svarer til trin 3 i den tidligere forklaring af skemaet.
- Nu skal Consul-serveren (eller lederen) bekrĂŠfte legitimiteten af den modtagne token. Derfor vil den konsultere Kubernetes-klusteret (gennem Consul-klienten), og hvis der gives de rette tilladelser, vil vi finde ud af, om token'en er ĂŠgte, og hvem den tilhĂžrer.
- Derefter returneres den validerede anmodning til Consul-lederen, og der udfÞres et opslag af instansen af godkendelsesmetoden med det angivne navn fra login-anmodningen (og typen Kubernetes) pÄ Consul-serveren.
- Consul-lederen identificerer den angivne instans af godkendelsesmetoden (hvis den findes) og lĂŠser det sĂŠt bindingsregler, der er knyttet til den. Derefter lĂŠser den disse regler og sammenligner dem med de validerede identitetsattributter.
- SÄdan! Vi gÄr videre til trin 5 i den tidligere beskrivelse af diagrammet.
Start Consul-serveren pÄ en almindelig virtuel maskine
Fra dette punkt vil jeg primĂŠrt give instruktioner til oprettelse af denne POC, ofte i punkter, uden forklarende sammenhĂŠngende sĂŠtninger. Som nĂŠvnt tidligere vil jeg bruge GCP til at oprette hele infrastrukturen, men du kan oprette en lignende infrastruktur et andet sted.
- Start den virtuelle maskine (instans / server).

- Opret en firewallregel (sikkerhedsgruppe i AWS):
- Jeg kan godt lide at give den samme navn til maskinen, reglen og netvĂŠrkstaget, i dette tilfĂŠlde er det 'skywiz-consul-server-poc'.
- Find IP-adressen pÄ din lokale computer, og tilfÞj den til listen over tilladte IP-adresser, sÄ vi kan fÄ adgang til brugergrÊnsefladen (UI).
- à bn port 8500 for UI. Klik pÄ Create. Vi vil snart Êndre denne firewall igen [].
- TilfÞj en regel til firewallen for instansen. GÄ tilbage til VM-overvÄgningspanelet pÄ Consul-serveren og tilfÞj 'skywiz-consul-server-poc' i feltet for netvÊrkstags. Klik pÄ Save.

- Installer Consul pÄ den virtuelle maskine, kontroller her. Husk, at du har brug for en Consul-version ℠1.5 [link]
- Lad os oprette en enkelt node Consul - konfigurationen er som fĂžlger.
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 mere detaljeret vejledning til installation af Consul og opsĂŠtning af en klynge med 3 noder findes her. .
- Opret filen /etc/consul.d/agent.json som fĂžlger []:
### /etc/consul.d/agent.json
{
"acl" : {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}- Start vores 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 skal se en masse output og i sidste ende â⊠update blocked by ACLsâ.
- Find den eksterne IP-adresse pÄ Consul-serveren og Äbne en browser med denne IP-adresse pÄ port 8500. SÞrg for, at UI'en Äbnes.
- PrĂžv at tilfĂžje et par nĂžgle/vĂŠrdi. Der bĂžr vĂŠre en fejl. Dette skyldes, at vi har indlĂŠst Consul-serveren med ACL og forbudt alle regler.
- GÄ tilbage til din shell pÄ Consul-serveren og kÞr processen i baggrunden eller pÄ anden mÄde, sÄ den kÞrer, og indtast fÞlgende:
consul acl bootstrap- Find vĂŠrdien âSecretIDâ og gĂ„ tilbage til UI'en. PĂ„ fanen âACLâ indtast den hemmelige token-identifikator, som du lige har kopieret. Kopier SecretID til et andet sted, vi fĂ„r brug for det senere.
- Nu, tilfĂžj et par nĂžgle/vĂŠrdi. For denne POC tilfĂžjer vi fĂžlgende: nĂžgle: âcustom-ns/test_keyâ, vĂŠrdi: âJeg er i mappen custom-ns!â
Start Kubernetes-klusteret for vores applikation med Consul-klienten som Daemonset
- Opret et K8s (Kubernetes) kluster. Vi vil oprette det i samme zone som serveren for hurtigere adgang, og derfor kan vi bruge det samme subnet til nem tilslutning med interne IP-adresser. Vi vil kalde det âskywiz-app-with-consul-client-pocâ.

- Som en note, her er en god vejledning, jeg stÞdte pÄ, mens jeg satte POC Consul-klusteret op med Consul Connect.
- Vi vil ogsÄ bruge Hashicorp helm chart med en udvidet vÊrdifil.
- Installer og konfigurer Helm. Konfigurationstrinene:
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:
- Brug fĂžlgende vĂŠrdifil (bemĂŠrk, at jeg har deaktiveret det meste):
### 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- Anvend helm chart:
./helm install -f poc-helm-consul-values.yaml ./consul-helm --name skywiz-app-with-consul-client-poc- NÄr du prÞver at starte den, vil den have brug for tilladelser til Consul-serveren, sÄ lad os tilfÞje dem.
- BemĂŠrk âPod adresseomrĂ„detâ, der er placeret pĂ„ klusterets dashboard, og gĂ„ tilbage til vores firewallregel âskywiz-consul-server-pocâ.
- TilfÞj adresseomrÄdet for pod'en til listen over IP-adresser og Äbn portene 8301 og 8300.

- GĂ„ til Consul UI, og efter et par minutter vil du se, at vores kluster vises under noden.

OpsĂŠtning af autorisationsmetode ved at integrere Consul med Kubernetes
- GÄ tilbage til shellen pÄ Consul-serveren og eksporter den token, du gemte tidligere:
export CONSUL_HTTP_TOKEN=- Vi har brug for information fra vores Kubernetes-klynge for at oprette en instans af auth-metoden:
- 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:- Tokenet er kodet i base64, sÄ dekod det med dit foretrukne vÊrktÞj []
- kubernetes-ca-cert
kubectl get secret -o yaml | grep ca.crt:- Tag certifikatet âca.crtâ (efter dekodning fra base64) og skriv det i filen âca.crtâ.
- Opret nu en instans af auth-metoden, og erstat pladsholdere med de vĂŠrdier, du lige har modtaget.
consul acl auth-method create
-type "kubernetes"
-name "auth-method-skywiz-consul-poc"
-description "Dette er en auth-metode, der bruger kubernetes til klyngen skywiz-app-with-consul-client-poc"
-kubernetes-host ""
-kubernetes-ca-cert=@ca.crt
-kubernetes-service-account-
jwt=""- Herefter skal vi oprette en regel og knytte den til den nye rolle. Til denne del kan du bruge Consul UI, men vi vil bruge kommandolinjen.
- Skriv regel
### kv-custom-ns-policy.hcl
key_prefix "custom-ns/" {
policy = "write"
}- Anvend regel
consul acl policy create
-name kv-custom-ns-policy
-description "Dette er et eksempel pÄ en politik for kv ved custom-ns/"
-rules @kv-custom-ns-policy.hcl- Find identifikatoren for den regel, du lige har oprettet, i output.
- Opret en rolle med den nye regel.
consul acl role create
-name "custom-ns-role"
-description "Dette er et eksempel pÄ en rolle for custom-ns-navnerum"
-policy-id- Nu vil vi knytte vores nye rolle til instansen af auth-metoden. BemÊrk, at flaget «selector» bestemmer, om vores indgangsanmodning vil fÄ denne rolle. Tjek her for andre selector-muligheder:
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-ns-role'
-selector='serviceaccount.namespace=="custom-ns"'Konfigurationerne til sidst
Adgangsrettigheder
- Opret adgangsrettigheder. Vi skal give Consul tilladelse til at validere og identificere identiteten af K8s service account token.
- Skriv fĂžlgende 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- Lad os oprette adgangsrettigheder
kubectl create -f skywiz-poc-consul-server_rbac.yamlForbindelse til Consul Client
- Som nÊvnt , er der flere muligheder for at forbinde til daemonset, men vi gÄr videre til den nÊste enkle lÞsning:
- Anvend den fĂžlgende 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- Anvend derefter den fÞlgende indbyggede kommando for at oprette configmap []. BemÊrk, at vi henviser til navnet pÄ vores service, erstat det om nÞdvendigt.
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}')"]}
EOFTest af auth-metoden
Lad os nu se magien i aktion!
- Opret flere nĂžglemapper med den samme Ăžverste nĂžgle (dvs. /sample_key) og en vĂŠrdi efter dit valg. Opret de relevante politikker og roller for de nye nĂžglebaner. Vi vil lave bindinger senere.

Brugerdefineret test af navnerum:
- Lad os oprette vores eget navnerum:
kubectl create namespace custom-ns- Lad os oprette en pod i vores nye navnerum. Skriv konfigurationen til pod'en.
###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- Opret pod:
kubectl create -f poc-ubuntu-custom-ns.yaml- NÄr containeren er startet, skal du logge ind og installere curl.
kubectl exec poc-ubuntu-custom-ns -n custom-ns -it /bin/bash
apt-get update && apt-get install curl -y- Nu vil vi sende en anmodning om login til Consul ved hjĂŠlp af den autoriseringsmetode, vi oprettede tidligere [].
- For at se den indtastede token fra din servicekonto:
cat /run/secrets/kubernetes.io/serviceaccount/token- Skriv fĂžlgende i en fil inden i containeren:
### payload.json
{
"AuthMethod": "auth-method-test",
"BearerToken": "<jwt_token>"
}- Login!
curl
--request POST
--data @payload.json
consul-ds-client.default.svc.cluster.local/v1/acl/login- For at udfÞre ovenstÄende trin i én linje (da vi vil kÞre flere tests), kan du gÞre fÞlgende:
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 virker! Det skulle, i det mindste. Nu tag SecretID og prÞv at fÄ adgang til nÞgle/vÊrdi, som vi skulle have adgang til.
curl
consul-ds-client.default.svc.cluster.local/v1/kv/custom-ns/test_key --header âX-Consul-Token: â- Du kan dekode "Value" base64 og se, at det svarer til vĂŠrdien i custom-ns/test_key i UI. Hvis du har brugt den samme vĂŠrdi, som nĂŠvnt ovenfor i denne vejledning, vil din kodede vĂŠrdi vĂŠre IkknbSBpbiB0aGUgY3VzdG9tLW5zIGZvbGRlciEi.
Test af den brugerdefinerede servicekonto:
- Opret en brugerdefineret ServiceAccount med fĂžlgende kommando [].
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: custom-sa
EOF- Opret en ny konfigurationsfil til pod'en. BemĂŠrk, at jeg har inkluderet installationen af curl for at spare arbejde đ
###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 dette skal du starte en shell inde i containeren.
kubectl exec -it poc-ubuntu-custom-sa /bin/bash- Login!
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- Adgang nĂŠgtet. Ă h, vi glemte at tilfĂžje det nye regelbinding med de relevante tilladelser, lad os gĂžre det nu.
Gentag de foregÄende trin ovenfor:
a) Opret en identisk politik for prĂŠfixet "custom-sa/".
b) Opret en rolle, kald den "custom-sa-role"
c) VedhĂŠft politikken til rollen.
- Opret en regelbinding (kan kun gĂžres fra cli/api). BemĂŠrk den forskellige vĂŠrdi af selector-flaget.
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-sa-role'
-selector='serviceaccount.name=="custom-sa"'- Log ind igen fra containeren "poc-ubuntu-custom-sa". Success!
- Kontroller vores adgang til nĂžglevejen custom-sa/.
curl
consul-ds-client.default.svc.cluster.local/v1/kv/custom-sa/test_key --header "X-Consul-Token: "- Du kan ogsÄ sikre dig, at denne token ikke giver adgang til kv i "custom-ns/". Gentag blot den ovenstÄende kommando efter at have Êndret "custom-sa" til prÊfixet "custom-ns".
Adgang nĂŠgtet.
Eksempel pÄ overlay:
- Det er vĂŠrd at bemĂŠrke, at alle matchende regelbindinger vil blive tilfĂžjet til tokenet med disse rettigheder.
- Vores container "poc-ubuntu-custom-sa" er i standardnavnerum - sÄ lad os bruge det til en anden regelbinding.
- Gentag de tidligere trin:
a) Opret en identisk politik for nĂžgleprĂŠfixet "default/".
b) Opret en rolle, kald den "default-ns-role"
c) VedhĂŠft politikken til rollen. - Opret en regelbinding (kan kun gĂžres fra 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"'- GÄ tilbage til vores container "poc-ubuntu-custom-sa" og prÞv at fÄ adgang til vejen "default/" kv.
- Adgang nĂŠgtet.
Du kan se de angivne legitimationsoplysninger for hver token i UI under ACL > Tokens. Som du kan se, er der kun knyttet én "custom-sa-role" til vores nuvÊrende token. Den token, vi bruger lige nu, blev genereret, da vi loggede ind, og der var dengang kun én regelbinding, der matchede. Vi skal logge ind igen og bruge det nye token. - Sikre dig, at du kan lÊse bÄde fra "custom-sa/" og "default/" kv.
Success!
Dette skyldes, at vores "poc-ubuntu-custom-sa" matcher regelbindingerne "custom-sa" og "default-ns".
Konklusion
TTL token mgmt?
PÄ tidspunktet for denne artikels skrivning findes der ikke en integreret mÄde at bestemme TTL for de tokens, der genereres med denne autorisationsmetode. Det ville vÊre en fantastisk mulighed - at sikre sikker automatisering af Consul-autorisation.
Der er mulighed for manuelt at oprette en token med TTL:
UdlĂžbstid (Expiration Time) â det tidspunkt, hvor denne token vil blive tilbagekaldt. (Ikke obligatorisk; tilfĂžjet i Consul 1.5.0)- Findes kun til manuel oprettelse / opdatering
Jeg hÄber, at vi snart kan kontrollere, hvordan tokens genereres (for hver regel eller autorisationsmetode), og tilfÞje TTL.
Indtil da anbefales det at bruge udgangsendpointen i din logik.
LÊs ogsÄ andre artikler pÄ vores blog:
Kilde: habr.com
