ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².:
ΠΡ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ Kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΡΠ»ΠΈ Istio ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Sentiment Analysis, β ΡΠ°ΠΊ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Istio.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Istio Π½Π°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΠΊΠΈΡ
Β«ΡΠ»ΠΎΡΠ²Β», ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (Retries), ΡΠ°ΠΉΠΌΠ°ΡΡΡ (Timeouts), Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ (Circuit Breakers), ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° (Tracing), ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ (Monitoring). ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΌΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»ΠΈ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΡ: A/B-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π·Π΅ΡΠΊΠ°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°Π½Π°ΡΠ΅Π΅ΡΠ½ΡΠ΅ Π²ΡΠΊΠ°ΡΡ.
Π Π½ΠΎΠ²ΠΎΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅ ΠΌΡ ΡΠ°Π·Π±Π΅ΡΡΠΌΡΡ Ρ ΡΠΈΠ½Π°Π»ΡΠ½ΡΠΌΠΈ ΡΠ»ΠΎΡΠΌΠΈ Π½Π° ΠΏΡΡΠΈ ΠΊ business value: Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ β ΠΈ Π² Istio ΡΡΠΎ ΡΠΏΠ»ΠΎΡΠ½ΠΎΠ΅ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅!
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² Istio
ΠΠΈΠΊΠΎΠ³Π΄Π° Π±Ρ Π½Π΅ ΠΏΠΎΠ²Π΅ΡΠΈΠ», ΡΡΠΎ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π»ΡΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. Π§ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΊΠΎΠ³ΠΎ Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΡ Istio Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΈ ΡΠ΅ΠΌΡ ΡΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΈ Π΄Π°ΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ β ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ Π²Π΄ΠΎΡ Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΈ Π²Π°Ρ?
ΠΡΠ²Π΅Ρ ΠΏΡΠΎΡΡ: Istio ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Ρ Π²Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π° ΠΏΡΠΎΠΊΡΠΈ Envoy. ΠΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡΠΎΡΡ Π΄ΠΎΡΡΠΈΠ³Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΠΎΠ½ΠΈ ΡΠΆΠ΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Ρ, ΡΠ°ΠΊ ΡΡΠΎ Π²Π°ΠΌ ΠΎΡΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΈΡΠ°ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ Π΄Π»Ρ Π±ΠΈΠ·Π½Π΅ΡΠ° ΠΊΠΎΠ΄.
ΠΠ²ΡΡΠΈΡ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ? ΠΠ°Π³Π»ΡΠ½Π΅ΠΌ ΠΆΠ΅ Π²Π½ΡΡΡΡ!
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Ρ Auth0
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Auth0, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π½Π°Ρ Π²Π΅ΡΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ΅Π½ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΠΏΠΎΠΏΡΠΎΡΡΡ Π½ΡΠ°Π²ΠΈΡΡΡ ΠΌΠ½Π΅. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΡΠ΅ ΠΆΠ΅ ΡΠ°ΠΌΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΈ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π·Π°ΠΉΠ΄ΠΈΡΠ΅ Π½Π°
Π£ΠΊΠ°ΠΆΠΈΡΠ΅ ΡΡΠΎΡ Π΄ΠΎΠΌΠ΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ resource-manifests/istio/security/auth-policy.yaml
(
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: auth-policy
spec:
targets:
- name: sa-web-app
- name: sa-feedback
origins:
- jwt:
issuer: "https://{YOUR_DOMAIN}/"
jwksUri: "https://{YOUR_DOMAIN}/.well-known/jwks.json"
principalBinding: USE_ORIGIN
Π Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅ΡΡΡΡΠΎΠΌ, Pilot (ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΡΡ
Π±Π°Π·ΠΎΠ²ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Control Plane Π² Istio β ΠΏΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².) Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ Envoy’ΠΈ Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΡ
Π½Π° ΡΠ΅ΡΠ²ΠΈΡΡ: sa-web-app
ΠΈ sa-feedback
. Π ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΊ Envoy’ΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ° sa-frontend
, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π½Π°ΠΌ ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ Π½Π΅Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ (Policy), Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io βauth-policyβ created
ΠΠ΅ΡΠ½ΠΈΡΠ΅ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ Π·Π°ΠΏΡΠΎΡ β ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΎΠ½ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ ΡΡΠ°ΡΡΡΠΎΠΌ 401 Unauthorized. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Ρ Auth0.
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ Auth0
Π§ΡΠΎΠ±Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ API Π² Auth0, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ (reviews, details ΠΈ ratings). ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ API ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Auth0 Portal > APIs > Create API ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΎΡΠΌΡ:
ΠΠ°ΠΆΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ Π·Π΄Π΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Identifier, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠΊΡΠΈΠΏΡΠ΅. ΠΡΠΏΠΈΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ΅Π±Π΅ ΡΠ°ΠΊ:
- Audience: {YOUR_AUDIENCE}
ΠΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π½Π° Auth0 Portal Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Applications β Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Test Application (ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ API).
ΠΠ΄Π΅ΡΡ ΠΌΡ Π·Π°ΠΏΠΈΡΠ΅ΠΌ:
- Domain: {YOUR_DOMAIN}
- Client Id: {YOUR_CLIENT_ID}
ΠΡΠΎΠΊΡΡΡΠΈΡΠ΅ Π² Test Application Π΄ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ Allowed Callback URLs (ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΠ΅ URL’Ρ Π΄Π»Ρ callback’Π°), Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΡΠΊΠ°ΠΆΠ΅ΠΌ URL, ΠΊΡΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ:
http://{EXTERNAL_IP}/callback
Π Π΄Π»Ρ Allowed Logout URLs (ΡΠ°Π·ΡΠ΅ΡΡΠ½Π½ΡΠ΅ URL’Ρ Π΄Π»Ρ ΡΠ°Π·Π»ΠΎΠ³ΠΈΠ½ΠΈΠ²Π°Π½ΠΈΡ) Π΄ΠΎΠ±Π°Π²ΠΈΠΌ:
http://{EXTERNAL_IP}/logout
ΠΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ ΠΊ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Ρ.
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°
ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ΡΡ Π½Π° Π²Π΅ΡΠΊΡ auth0
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ [istio-mastery]
. Π ΡΡΠΎΠΉ Π²Π΅ΡΠΊΠ΅ ΠΊΠΎΠ΄ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° ΠΈΠ·ΠΌΠ΅Π½ΡΠ½ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² Auth0 Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ JWT-ΡΠΎΠΊΠ΅Π½ Π² Π·Π°ΠΏΡΠΎΡΠ°Ρ
ΠΊ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ. ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (
analyzeSentence() {
fetch('/sentiment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${auth.getAccessToken()}` // Access Token
},
body: JSON.stringify({ sentence: this.textField.getValue() })
})
.then(response => response.json())
.then(data => this.setState(data));
}
Π§ΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
tenant’Π° Π² Auth0, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ sa-frontend/src/services/Auth.js
ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π·Π°ΠΏΠΈΡΠ°Π»ΠΈ Π²ΡΡΠ΅ (
const Config = {
clientID: '{YOUR_CLIENT_ID}',
domain:'{YOUR_DOMAIN}',
audience: '{YOUR_AUDIENCE}',
ingressIP: '{EXTERNAL_IP}' // ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡΠ° ΠΏΠΎΡΠ»Π΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
}
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ. Π£ΠΊΠ°ΠΆΠΈΡΠ΅ ΡΠ²ΠΎΠΉ Docker ID Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠ½Π½ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:
$ docker build -f sa-frontend/Dockerfile
-t $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
sa-frontend
$ docker push $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
$ kubectl set image deployment/sa-frontend
sa-frontend=$DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅! ΠΠ°Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΡΡ Π½Π° Auth0, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π»ΠΎΠ³ΠΈΠ½ΠΈΡΡΡΡ (ΠΈΠ»ΠΈ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ), ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²Π°Ρ ΠΎΡΠΏΡΠ°Π²ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΡΠΆΠ΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ. ΠΡΠ»ΠΈ ΠΆΠ΅ Π²Ρ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ Π² ΠΏΠ΅ΡΠ²ΡΡ ΡΠ°ΡΡΡΡ ΡΡΠ°ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Ρ curl β ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΊΠΎΠ΄ 401 Status Code, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡΠΈΠΉ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π·Π°ΠΏΡΠΎΡ Π½Π΅ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½.
Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β Π°Π²ΡΠΎΡΠΈΠ·ΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΡ.
ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Ρ Auth0
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΊ ΡΠ΅ΠΌΡ Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ. Istio ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄Π²Π΅ Π³ΡΡΠΏΠΏΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (ΡΠΌ. Π½Π° ΡΡ Π΅ΠΌΠ΅ Π½ΠΈΠΆΠ΅):
- ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ (users) β Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΊ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ SA-WebApp ΠΈ SA-Frontend;
- ΠΠΎΠ΄Π΅ΡΠ°ΡΠΎΡΡ (moderators) β Ρ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΡΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ.
ΠΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠΈΡ Π³ΡΡΠΏΠΏ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ Auth0 Authorization ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Istio ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΈΠΌ ΡΠ°Π·Π½ΡΠ΅ ΡΡΠΎΠ²Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ°.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Auth0 Authorization
ΠΠ° ΠΏΠΎΡΡΠ°Π»Π΅ Auth0 ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΠΌ (Extensions) ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Auth0 Authorization. ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ Authorization Extension, Π° ΡΠ°ΠΌ β ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ tenant’Π° ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡ ΡΠΏΡΠ°Π²Π° Π½Π°Π²Π΅ΡΡ Ρ ΠΈ Π²ΡΠ±ΠΎΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΎΠΏΡΠΈΠΈ ΠΌΠ΅Π½Ρ (Configuration). ΠΠΊΡΠΈΠ²ΠΈΡΡΠΉΡΠ΅ Π³ΡΡΠΏΠΏΡ (Groups) ΠΈ Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° (Publish rule).
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏ
Π Authorization Extension ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Groups ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π³ΡΡΠΏΠΏΡ Moderators. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π²ΡΠ΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΡ , ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π΄Π»Ρ Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ Π½Π΅Ρ.
ΠΡΠ±Π΅ΡΠΈΡΠ΅ Π³ΡΡΠΏΠΏΡ Moderators, Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° Add Members, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ²ΠΎΠΉ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ. ΠΡΡΠ°Π²ΡΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π³ΡΡΠΏΠΏΡ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏ Π΄Π»Ρ Π½ΠΈΡ Π·Π°ΠΏΡΠ΅ΡΡΠ½. (ΠΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π²ΡΡΡΠ½ΡΡ ΡΠ΅ΡΠ΅Π· Auth0 Portal > Users > Create User.)
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Group Claim Π² Access Token
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² Π³ΡΡΠΏΠΏΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΎΡΡΠ°ΠΆΠ΅Π½Π° ΠΈ Π² ΡΠΎΠΊΠ΅Π½Π°Ρ
Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ°. Π§ΡΠΎΠ±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ OpenID Connect ΠΈ Π² ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π³ΡΡΠΏΠΏΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ, ΡΠΎΠΊΠ΅Π½Ρ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΉ
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π½Π° Auth0 Portal ΠΊ Rules, Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° Create Rule ΠΈ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΡΡΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΈΠ· ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ².
Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΊΠΎΠ΄ Π½ΠΈΠΆΠ΅ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Add Group Claim (
function (user, context, callback) {
context.accessToken['https://sa.io/group'] = user.groups[0];
return callback(null, user, context);
}
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΡΡΠΎΡ ΠΊΠΎΠ΄ Π±Π΅ΡΡΡ ΠΏΠ΅ΡΠ²ΡΡ Π³ΡΡΠΏΠΏΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ Π² Authorization Extension, ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π΅Ρ Π² access-ΡΠΎΠΊΠ΅Π½ ΠΊΠ°ΠΊ custom claim (ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ ΠΈΠΌΡΠ½, ΠΊΠ°ΠΊ ΡΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Auth0).
ΠΠ΅ΡΠ½ΠΈΡΠ΅ΡΡ ΠΊ ΡΡΡΠ°Π½ΠΈΡΠ΅ Rules ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π°, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅:
- auth0-authorization-extension
- Add Group Claim
ΠΠΎΡΡΠ΄ΠΎΠΊ Π²Π°ΠΆΠ΅Π½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ»Π΅ Π³ΡΡΠΏΠΏΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ auth0-authorization-extension ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ claim Π²ΡΠΎΡΡΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ access-ΡΠΎΠΊΠ΅Π½:
{
"https://sa.io/group": "Moderators",
"iss": "https://sentiment-analysis.eu.auth0.com/",
"sub": "google-oauth2|196405271625531691872"
// [ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΎ Π΄Π»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ]
}
Π’Π΅ΠΏΠ΅ΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Envoy-ΠΏΡΠΎΠΊΡΠΈ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ°, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π³ΡΡΠΏΠΏΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΡΠ°ΡΠΊΠΈΠ²Π°ΡΡΡΡ ΠΈΠ· claim (https://sa.io/group
) Π² Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΌ access-ΡΠΎΠΊΠ΅Π½Π΅. ΠΡΠΎ ΡΠ΅ΠΌΠ° Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° ΡΡΠ°ΡΡΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π² Istio
Π§ΡΠΎΠ±Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ RBAC Π΄Π»Ρ Istio. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ:
apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
name: default
spec:
mode: 'ON_WITH_INCLUSION' # 1
inclusion:
services: # 2
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
- "sa-feedback.default.svc.cluster.local"
ΠΠΎΡΡΠ½Π΅Π½ΠΈΡ:
- 1 β Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ RBAC ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΠΈΠΌΡΠ½, ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ
Π² ΠΏΠΎΠ»Π΅
Inclusion
; - 2 β ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
ΠΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created
Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΡΡΠ΅Π±ΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠ»Π΅ΠΉ (Role-Based Access Control). ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ Π·Π°ΠΏΡΠ΅ΡΡΠ½ ΠΈ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΎΡΠ²Π΅ΡΡ RBAC: access denied
. Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΠΎΠ±ΡΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
ΠΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ SA-Frontend ΠΈ SA-WebApp. Π Π΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² Istio:
- ServiceRole β ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΡΠ°Π²Π°, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ;
- ServiceRoleBinding β ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊ ΠΊΠΎΠΌΡ ΡΡΠ° ServiceRole ΠΎΡΠ½ΠΎΡΠΈΡΡΡ.
ΠΠ»Ρ ΠΎΠ±ΡΡΠ½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ (
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: regular-user
namespace: default
spec:
rules:
- services:
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
paths: ["*"]
methods: ["*"]
Π ΡΠ΅ΡΠ΅Π· regular-user-binding
ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ ServiceRole ΠΊΠΎ Π²ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»ΡΠΌ ΡΡΡΠ°Π½ΠΈΡΡ (
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: regular-user-binding
namespace: default
spec:
subjects:
- user: "*"
roleRef:
kind: ServiceRole
name: "regular-user"
ΠΠ·Π½Π°ΡΠ°Π΅Ρ Π»ΠΈ Β«Π²ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈΒ», ΡΡΠΎ ΠΈ Π½Π΅Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΏΠΎΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ SA WebApp? ΠΠ΅Ρ, ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΡ Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ JWT-ΡΠΎΠΊΠ΅Π½Π°.
ΠΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding created
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΠΌΠΎΠ΄Π΅ΡΠ°ΡΠΎΡΠΎΠ²
ΠΠ»Ρ ΠΌΠΎΠ΄Π΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π²ΠΊΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ (
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: mod-user
namespace: default
spec:
rules:
- services: ["*"]
paths: ["*"]
methods: ["*"]
ΠΠΎ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΡΠ°ΠΊΠΈΡ
ΠΏΡΠ°Π² ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ΅Ρ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π² access-ΡΠΎΠΊΠ΅Π½Π΅ ΠΊΠΎΡΠΎΡΡΡ
Π΅ΡΡΡ claim https://sa.io/group
ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Moderators
(
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: mod-user-binding
namespace: default
spec:
subjects:
- properties:
request.auth.claims[https://sa.io/group]: "Moderators"
roleRef:
kind: ServiceRole
name: "mod-user"
ΠΡΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding created
ΠΠ·-Π·Π° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² envoy’ΡΡ Π΄Π»Ρ Π²ΡΡΡΠΏΠ»Π΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠΈΠ»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΏΠ°ΡΠ° ΠΌΠΈΠ½ΡΡ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΌΠΎΠ΄Π΅ΡΠ°ΡΠΎΡΠΎΠ² ΡΠ°Π·Π½ΡΠ΅ ΡΡΠΎΠ²Π½ΠΈ Π΄ΠΎΡΡΡΠΏΠ°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ
ΠΡ Π²ΠΎΡ ΡΠ΅ΡΡΡΠ·Π½ΠΎ: Π²Ρ Π³Π΄Π΅-Π½ΠΈΠ±ΡΠ΄Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ, Π½Π΅ ΡΡΠ΅Π±ΡΡΡΠΈΠΉ ΡΡΠΈΠ»ΠΈΠΉ, ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΠΉ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ?
ΠΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΡΡΠΈ ΡΠ΅ΡΡΡΡΠ° Istio (RbacConfig, ServiceRole, and ServiceRoleBinding) ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠΎΠ½ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π΄ΠΎΡΡΡΠΏΠ° ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΊ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ.
ΠΠ΄ΠΎΠ±Π°Π²ΠΎΠΊ, ΠΌΡ Π²ΡΠ½Π΅ΡΠ»ΠΈ Π·Π°Π±ΠΎΡΡ ΠΎΠ± ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ ΠΈΠ· Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π² envoy’ΠΈ, Π΄ΠΎΠ±ΠΈΠ²ΡΠΈΡΡ:
- ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΈΠΏΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ Π±Π°Π³ΠΈ;
- ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π³Π»ΡΠΏΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ΄ΠΈΠ½ endpoint ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΡΠ½Π°ΡΡΠΆΠΈ ΠΈ Π·Π°Π±ΡΠ» ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎΠ± ΡΡΠΎΠΌ;
- ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π²ΡΠ΅Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΈΠ»ΠΈ ΠΏΡΠ°Π²Π°;
- ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½ΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΎΡΡΠ°ΡΡΡΡ ΠΏΡΠΎΡΡΡΠΌΠΈ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ ΠΈ Π±ΡΡΡΡΡΠΌΠΈ.
ΠΡΠ²ΠΎΠ΄
Istio ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΡΡΠΎΠΊΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΠ΅ΡΡΡΡΡ Π½Π° Π²Π°ΠΆΠ½ΡΡ Π΄Π»Ρ Π±ΠΈΠ·Π½Π΅ΡΠ° Π·Π°Π΄Π°ΡΠ°Ρ , Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ ΠΎΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΠΈΡ ΠΊ ΡΡΠ°ΡΡΡΡ Β«ΠΌΠΈΠΊΡΠΎΒ».
Π‘ΡΠ°ΡΡΡ (Π² ΡΡΡΡ ΡΠ°ΡΡΡΡ ) ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»Π° Π±Π°Π·ΠΎΠ²ΡΠ΅ Π·Π½Π°Π½ΠΈΡ ΠΈ Π³ΠΎΡΠΎΠ²ΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ Ρ Istio Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ .
P.S. ΠΎΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«ΠΠ°Π·Π°Π΄ ΠΊ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ Π²ΠΌΠ΅ΡΡΠ΅ Ρ IstioΒ»:
ΡΠ°ΡΡΡ 1 (Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ) ,ΡΠ°ΡΡΡ 2 (ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΊΠΎΠΌ) ; - Β«
Conduit β Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠΉ service mesh Π΄Π»Ρ Kubernetes Β»; - Β«
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ service mesh ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ ΠΌΠ½Π΅ Π½ΡΠΆΠ΅Π½ [Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ]? Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com