Mengonfigurasi autentikasi pengguna Cloud Service Mesh
Jika Anda memiliki TRAFFIC_DIRECTOR
penerapan bidang kontrol kemudian
fitur ini hanya didukung oleh daftar yang diizinkan. Hubungi dukungan untuk meminta akses.
Autentikasi pengguna Cloud Service Mesh adalah solusi terintegrasi untuk solusi berbasis browser autentikasi dan kontrol akses pengguna akhir ke workload yang di-deploy. Memungkinkan Anda berintegrasi dengan Penyedia Identitas (IDP) yang ada untuk otentikasi pengguna dan menggunakan Istio API dan kebijakan otorisasi untuk pengelolaan akses. Ini adalah alternatif yang mudah digunakan untuk autentikasi Istio JSON Web Token (JWT).
Kasus penggunaan yang umum adalah saat organisasi menggunakan Cloud Service Mesh untuk menghosting aplikasi web untuk diakses tenaga kerjanya melalui {i>browser<i} web. Selain itu, organisasi perlu menggunakan penyedia identitas mereka yang ada untuk mengelola pengguna identitas. Autentikasi pengguna Cloud Service Mesh memudahkan pengguna untuk mengautentikasi menggunakan login dan izin OpenID Connect (OIDC) berbasis web standar alur kerja. Saat pengguna melakukan autentikasi, Cloud Service Mesh menerapkan Istio kebijakan otorisasi, dan pada otorisasi yang berhasil, ia mengirimkan identitas ke workload dalam format kredensial yang aman.
Cara kerjanya
Autentikasi pengguna Cloud Service Mesh memperkenalkan komponen baru, yaitu authservice
.
Komponen ini terintegrasi dengan traffic masuk berbasis Envoy sebagai
layanan otorisasi yang mencegat
semua permintaan masuk untuk
autentikasi. authservice
menerapkan protokol OIDC sisi klien
dan memungkinkan akses pengguna ke aplikasi melalui {i>browser<i}, di mana pengguna menyelesaikan
proses otentikasi dan persetujuan interaktif untuk
membuat sesi berumur pendek.
authservice
menerapkan protokol standar industri untuk berintegrasi dengan
penyedia identitas yang dapat bertindak
sebagai server otorisasi OIDC. Saat pengguna
diautentikasi, informasi utama dienkapsulasi dalam RCToken
di JWT
format, ditandatangani oleh authservice
yang meneruskan ke otorisasi Istio
lapisan dalam traffic masuk. Model ini menyediakan kontrol akses perimeter untuk traffic
ke dalam jala. Jika pengguna diberi otorisasi untuk mengakses
sumber daya, RCToken ini
diteruskan ke microservice untuk mendapatkan informasi utama dan menerapkan
mengakses kontrol akses
yang sangat terperinci.
Diagram berikut menunjukkan lokasi authservice
di mesh dan caranya
berhubungan dengan bagian lain dari mesh, seperti traffic masuk, workload,
browser, dan IDP yang ada.
Administrator dapat menginstal authservice
sebagai add-on melalui Cloud Service Mesh
penginstalan. Saat diinstal, authservice
akan membaca endpoint OIDC
konfigurasi dan setelan terkait lainnya yang ditentukan dalam konfigurasi kustom UserAuth
resource Anda Administrator dapat menggunakan Cloud Service Mesh ExternalAuthorization
API
untuk mengonfigurasi auth_server
sebagai filter pada traffic masuk.
Menginstal layanan autentikasi pengguna
Langkah-langkah berikut menjelaskan cara mengonfigurasi authservice
.
Prasyarat
Ikuti langkah-langkah di artikel Menginstal alat dependen dan memvalidasi cluster menjadi:- Menginstal alat yang diperlukan
- Download
asmcli
- Memberikan izin admin cluster
- Memvalidasi project dan cluster
- Jika Anda menggunakan Cloud Service Mesh terkelola pada cluster pribadi, pastikan yang mampu mengirimkan traffic keluar ke IDP.
Selain itu, pastikan Anda memenuhi prasyarat dengan menggunakan referensi langkah.
Menyesuaikan overlay autentikasi pengguna penginstalan
Untuk menginstal layanan autentikasi pengguna, Anda harus menyesuaikan Cloud Service Mesh untuk menambahkan penyedia otorisasi eksternal tingkat mesh. Langkah-langkahnya yang diperlukan bergantung pada apakah Anda menggunakan Cloud Service Mesh yang terkelola atau dalam cluster.
Terkelola
Ubah ConfigMap untuk menyertakan autentikasi pengguna, MeshConfig. Dalam perintah berikut ini, gunakan
REVISION_LABEL
yang sama dengan yang Anda gunakan saat menyediakan Cloud Service Mesh terkelola (seperti,asm-managed
,asm-managed-rapid
, atauasm-managed-stable
):kubectl edit configmap istio-REVISION_LABEL -n istio-system
Tambahkan teks berikut di bagian kolom
mesh
di MeshConfig:mesh: |- ... extensionProviders: - name: "asm-userauth-grpc" envoyExtAuthzGrpc: service: "authservice.asm-user-auth.svc.cluster.local" port: "10003"
Buat namespace
asm-user-auth
.kubectl create namespace asm-user-auth
Mengaktifkan namespace untuk injeksi. Langkah-langkah bergantung pada penerapan bidang kontrol Anda.
Terkelola (TD)
Terapkan label injeksi default ke namespace:
kubectl label namespace asm-user-auth \ istio.io/rev- istio-injection=enabled --overwrite
Terkelola (Istiod)
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
```sh kubectl label namespace asm-user-auth \ istio.io/rev- istio-injection=enabled --overwrite ```
Jika Anda sudah menjadi pengguna dengan bidang kontrol Istio Terkelola: Kami menyarankan agar Anda menggunakan injeksi default, tetapi injeksi berbasis revisi didukung. Gunakan petunjuk berikut:
- Jalankan perintah berikut untuk menemukan saluran rilis yang tersedia:
kubectl -n istio-system get controlplanerevision
Outputnya mirip dengan hal berikut ini:
NAME AGE asm-managed-rapid 6d7h
Pada output, nilai pada kolom
NAME
adalah label revisi yang sesuai dengan saluran rilis yang tersedia untuk versi Cloud Service Mesh.Terapkan label revisi ke namespace:
kubectl label namespace asm-user-auth \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Menginstal gateway Istio dalam namespace
asm-user-auth
.kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
Dalam cluster
Dapatkan contohnya overlay autentikasi pengguna dan perbarui jika ada penyesuaian di mesh Anda. Ini adalah praktik terbaik yang disarankan untuk mempertahankan file overlay ini di sumber Anda kontrol.
curl https://raw.githubusercontent.com/GoogleCloudPlatform/asm-user-auth/v1.2.2/overlay/user-auth-overlay.yaml > user-auth-overlay.yaml
Ikuti cara menginstal Cloud Service Mesh dengan overlay untuk menggunakan skrip yang disediakan Google untuk menginstal Cloud Service Mesh dengan pengguna overlay autentikasi. Contoh:
./asmcli install \ --project_id PROJECT_ID \ --cluster_name CLUSTER_NAME \ --cluster_location CLUSTER_LOCATION \ --fleet_id FLEET_PROJECT_ID \ --output_dir DIR_PATH \ --enable_all \ --custom_overlay user-auth-overlay.yaml
Paket
kpt
autentikasi pengguna membuatAuthorizationPolicy
untuk merujuk ke penyedia otorisasi eksternal yang ditentukan olehpkg/ext-authz.yaml
.Buat namespace
asm-user-auth
.kubectl create namespace asm-user-auth
Mengaktifkan namespace untuk injeksi.
Direkomendasikan: Jalankan perintah berikut untuk menerapkan label injeksi default ke namespace:
kubectl label namespace asm-user-auth \ istio.io/rev- istio-injection=enabled --overwrite
Sebaiknya gunakan injeksi default, tetapi injeksi berbasis revisi didukung: Gunakan petunjuk berikut:
Gunakan perintah berikut untuk menemukan label revisi di
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Terapkan label revisi ke namespace. Dalam perintah berikut ini,
REVISION_LABEL
adalah nilai revisiistiod
label yang Anda catat pada langkah sebelumnya.kubectl label namespace asm-user-auth \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Menginstal gateway Istio dalam namespace
asm-user-auth
.kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
Menyiapkan konfigurasi klien OIDC
Tetapkan konfigurasi klien OIDC Anda dengan menggunakan langkah-langkah berikut. Panduan ini menggunakan Google sebagai IDP, tetapi Anda dapat menggunakan IDP apa pun yang mendukung autentikasi OIDC.
Di Konsol Google Cloud, buka API & Layanan > Kredensial.
Buka Create Credentials, lalu pilih OAuth client ID. Jika diperlukan, tetapkan opsi OAuth consent screen, lalu konfigurasikan opsi:
- Setel Application type ke Web application.
- Tetapkan Authorized redirect URI ke
https://REDIRECT_HOST/REDIRECT_PATH
. Misalnya, untuk {i>localhost<i} Anda bisa mengaturhttps://localhost:8443/_gcp_asm_authenticate
.
Selanjutnya, klik Save.
Selain itu, simpan konfigurasi klien OIDC Anda untuk digunakan nanti.
export OIDC_CLIENT_ID=CLIENT_ID export OIDC_CLIENT_SECRET=CLIENT_SECRET export OIDC_ISSUER_URI=ISSUER_URI export OIDC_REDIRECT_HOST=REDIRECT_HOST export OIDC_REDIRECT_PATH=REDIRECT_PATH
Mendapatkan paket kpt
Gunakan langkah-langkah berikut untuk menginstal konfigurasi authservice
yang direkomendasikan
dari
repositori publik. Ini
mengambil container authservice
terbaru dan memulainya sebagai Pod di
namespace asm-user-auth
. Ini juga mengonfigurasi traffic masuk untuk mencegat semua
permintaan.
Mendapatkan paket kpt:
kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.2 .
cd asm-user-auth/
Menetapkan rahasia dan URL pengalihan untuk gateway masuk
OAuth2
memerlukan URL pengalihan yang dihosting di endpoint yang dilindungi HTTPS. Ini
adalah contoh tujuan dan menyederhanakan penyiapan dengan membuat
untuk gateway masuk Istio.
Buat sertifikat yang ditandatangani sendiri:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \ -days 365 -nodes -subj '/CN=localhost'
Buat rahasia untuk gateway masuk untuk menghosting traffic HTTPS:
kubectl create -n asm-user-auth secret tls userauth-tls-cert --key=key.pem \ --cert=cert.pem
Menerapkan kunci enkripsi dan penandatanganan
authservice
memerlukan dua set kunci agar dapat beroperasi dengan sukses. Yang pertama adalah
kunci simetris untuk enkripsi dan dekripsi. Kunci ini digunakan untuk mengenkripsi
status sesi sebelum menetapkannya sebagai cookie.
Set kunci kedua adalah pasangan kunci publik/pribadi. Kunci ini digunakan untuk menandatangani informasi pengguna yang terautentikasi dalam format JWT sebagai RCToken. Kunci publik dari pasangan ini dipublikasikan di endpoint yang telah ditentukan dan dapat digunakan oleh file bantuan untuk memvalidasi JWT.
Paket kpt
autentikasi pengguna berisi dua contoh kunci untuk penyiapan cepat.
Namun, Anda dapat menggunakan sistem pengelolaan kunci pilihan Anda untuk membuat kunci ini
sebagai gantinya.
Siapkan kunci enkripsi sesi dengan format berikut atau gunakan contoh dari pkg, yang dapat Anda lihat menurut
cat ./samples/cookie_encryption_key.json
.{ "keys":[ { "kty":"oct", "kid":"key-0", "K":"YOUR_KEY", "useAfter": 1612813735 } ] }
Anda dapat membuat kunci AES pengujian dengan perintah berikut:
openssl enc -aes-256-cbc -k mycustomkey -P -md sha1 | grep key
Siapkan kunci penandatanganan RCToken dengan format berikut atau gunakan contoh dari pkg, yang dapat Anda lihat menurut
cat ./samples/rctoken_signing_key.json
.{ "keys":[ { "kty":"RSA", "kid":"rsa-signing-key", "K":"YOUR_KEY", # k contains a Base64 encoded PEM format RSA signing key. "useAfter": 1612813735 # unix timestamp } ] }
Anda dapat membuat kunci pribadi RSA 256 bit pengujian dengan perintah berikut:
openssl genpkey -algorithm RSA -out rsa_private.pem -pkeyopt rsa_keygen_bits:256
Buat rahasia kubernetes, yang akan dipasang
authservice
ke miliknya sendiri sistem file.kubectl create secret generic secret-key \ --from-file="session_cookie.key"="./samples/cookie_encryption_key.json" \ --from-file="rctoken.key"="./samples/rctoken_signing_key.json" \ --namespace=asm-user-auth
Men-deploy layanan autentikasi pengguna
Perintah berikut membuat layanan otentikasi pengguna dan deployment di
namespace asm-user-auth
.
Tetapkan nilai yang diperlukan untuk konfigurasi Autentikasi Pengguna. Client ID dan secret disimpan sebagai secret Kubernetes, jadi kita gunakan Base64 untuk mengenkodenya. Kunjungi repositori publik untuk melihat semua penyetel yang tersedia.
kpt fn eval pkg --image gcr.io/kpt-fn/apply-setters:v0.2 --truncate-output=false -- \
client-id="$(echo -n ${OIDC_CLIENT_ID} | base64 -w0)" \
client-secret="$(echo -n ${OIDC_CLIENT_SECRET} | base64 -w0)" \
issuer-uri="${OIDC_ISSUER_URI}" \
redirect-host="${OIDC_REDIRECT_HOST}" \
redirect-path="${OIDC_REDIRECT_PATH}"
Terapkan paket kpt
:
# Remove the potential alpha version CRD if exists.
kubectl delete crd userauthconfigs.security.anthos.io
kubectl apply -f ./pkg/asm_user_auth_config_v1beta1.yaml
kubectl apply -f ./pkg
authservice
menggunakan CRD UserAuthConfig
untuk memberikan pengguna akhir
autentikasi. UserAuthConfig
dapat dikonfigurasi selama runtime, dan Anda juga dapat
mengupdatenya untuk mengubah perilaku authservice
dan mengonfigurasinya dengan endpoint
untuk setiap server otorisasi OIDC.
Anda dapat melihat file menurut cat pkg/user_auth_config.yaml
, yang berisi kolom berikut:
apiVersion: security.anthos.io/v1beta1
kind: UserAuthConfig
metadata:
name: user-auth-config
namespace: asm-user-auth
spec:
authentication:
oidc:
certificateAuthorityData: "" # kpt-set: ${ca-cert}
issuerURI: "<your issuer uri>" # kpt-set: ${issuer-uri}
proxy: "" # kpt-set: ${proxy}
oauthCredentialsSecret:
name: "oauth-secret" # kpt-set: ${secret-name}
namespace: "asm-user-auth" # kpt-set: ${secret-namespace}
redirectURIHost: "" # kpt-set: ${redirect-host}
redirectURIPath: "/_gcp_asm_authenticate" # kpt-set: ${redirect-path}
scopes: "" # kpt-set: ${scopes}
groupsClaim: "" # kpt-set: ${groups}
outputJWTAudience: "test_audience" # kpt-set: ${jwt-audience}
Lihat
detail konfigurasi autentikasi pengguna
untuk deskripsi mendetail tentang kolom user_auth_config.yaml
.
Melakukan tugas pasca-penginstalan
Tugas berikut diperlukan setelah Anda menyelesaikan penginstalan sebelumnya langkah.
Mengaktifkan autentikasi pengguna untuk aplikasi Anda
Bagian ini menunjukkan cara mengaktifkan otentikasi pengguna, dengan menggunakan
httpbin
sebagai contoh.
Autentikasi pengguna Cloud Service Mesh menggunakan
CUSTOM
jenis kebijakan otorisasi untuk
memicu alur OIDC.
Setelah Anda memiliki
menginstal gateway Istio,
konfigurasikan untuk menyalurkan traffic HTTPS menggunakan sertifikat TLS userauth-tls-cert
yang telah Anda buat di atas. Di bawah ini adalah konfigurasi pkg/gateway.yaml
yang baru saja Anda
terinstal.
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: userauth
namespace: asm-user-auth
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: userauth-tls-cert
---
# This ensures the OIDC endpoint has at least some route defined.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: userauth-oidc
namespace: asm-user-auth
spec:
gateways:
- userauth
hosts:
- '*'
http:
- match:
- uri:
prefix: /status
- uri:
prefix: "your-oidc-redirect-path"
name: user-auth-route
route:
- destination:
host: authservice
port:
number: 10004
Beri label namespace
default
untuk mengaktifkan injeksi otomatisistio-proxy
untuk deployment.kubectl label namespace default istio.io/rev=REVISION --overwrite
Deploy
httpbin
ke namespacedefault
.kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/httpbin.yaml -n default
Update
httpbin
agar dapat menggunakan gateway ini untuk menyalurkan traffic HTTPS dan menggunakan port penerusan untuk mengakses aplikasi secara lokal:kubectl apply -f./samples/httpbin-route.yaml -n default kubectl port-forward service/istio-ingressgateway 8443:443 -n asm-user-auth
Gateway masuk pada port 8443 akan diteruskan ke
localhost
untuk membuat aplikasi dapat diakses secara lokal.Deploy
samples/rctoken-authz.yaml
untuk mengaktifkan RequestAuthentication dan AuthorizationPolicy untuk memverifikasi RCToken untuk permintaan.kubectl apply -f ./samples/rctoken-authz.yaml -n asm-user-auth
Contoh
samples/rctoken-authz.yaml
:apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: require-rc-token spec: selector: matchLabels: istio: ingressgateway jwtRules: - issuer: "authservice.asm-user-auth.svc.cluster.local" audiences: - "test_audience" jwksUri: "http://authservice.asm-user-auth.svc.cluster.local:10004/_gcp_user_auth/jwks" fromHeaders: - name: X-ASM-RCTOKEN forwardOriginalToken: true --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: require-rc-token spec: selector: matchLabels: istio: ingressgateway action: ALLOW rules: - when: - key: request.auth.claims[iss] values: - authservice.asm-user-auth.svc.cluster.local - key: request.auth.claims[aud] values: - test_audience
Memverifikasi autentikasi pengguna
httpbin
menayangkan dua jalur, /ip
dapat diakses secara publik dan /headers
mengharuskan pengguna akhir untuk login melalui IDP yang telah dikonfigurasi.
Verifikasi bahwa Anda dapat mengakses
/ip
secara langsung dengan mengunjungihttps://localhost:8443/ip
.Verifikasi bahwa Anda melihat halaman login OIDC dengan mengunjungi
https://localhost:8443/headers
.Setelah login, klik Next dan verifikasi bahwa halaman tersebut mengalihkan Anda ke
/headers
halaman.
Mengonfigurasi kebijakan otorisasi
Setelah Anda menyelesaikan konfigurasi di langkah sebelumnya, setiap pengguna akan
dialihkan melalui
alur otentikasi berbasis web. Setelah alur selesai,
authservice
akan menghasilkan RCToken
dalam format JWT, yang digunakannya untuk
mengirimkan informasi
pengguna yang diotentikasi.
Tambahkan kebijakan otorisasi Istio di halaman masuk untuk memastikan bahwa pemeriksaan otorisasi dilakukan untuk setiap pengguna terautentikasi:
kubectl apply -f ./samples/httpbin-authz.yaml -n asm-user-auth
File
httpbin-authz.yaml
mengonfigurasi gateway masuk untuk memvalidasi token RC yang dikeluarkan oleh authservice, dan hanya beri otorisasi jika JWT berisi kolom yang diinginkan, seperti audiens dan penerbit.Lihat contoh kebijakan otorisasi berikut:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: require-rc-token spec: selector: matchLabels: istio: ingressgateway action: ALLOW rules: - to: - operation: paths: ["/ip"] - to: when: - key: request.auth.claims[iss] values: - authservice.asm-user-auth.svc.cluster.local - key: request.auth.claims[aud] values: - test_audience - key: request.auth.claims[sub] values: - allowed_user_sub_1 # Change this with the "sub" claim in the RC token. Wildcard '*' will match everything.
Mengonfigurasi setelan spesifik per lingkungan
Langkah sebelumnya menggunakan localhost
dan sertifikat HTTPS yang ditandatangani sendiri untuk
penyiapan. Untuk penggunaan produksi yang sebenarnya, gunakan domain Anda sendiri, seperti example.com
.
Selain itu, pastikan certificateAuthorityData
memiliki root cert yang dimaksud
saat ini. Misalnya, jika IDP dipercaya
dengan sertifikat {i>root<i} sistem, Anda dapat
biarkan kosong. Jika ada {i>proxy<i} HTTPS yang
menghentikan koneksi HTTPS, itu
harus disetel ke root cert proxy.
Mengelola dan merotasi kunci
Ada dua kumpulan kunci yang digunakan oleh authservice
. Anda dapat merotasi setiap kunci
mereka dapat bekerja secara mandiri. Namun, sebelum Anda merotasi kunci, penting untuk
memahami cara kerja rotasi.
Kedua kunci dalam format JSON. Kolom useAfter
menentukan stempel waktu karena
kapan kunci tersebut akan
dianggap digunakan. Selama rotasi kunci, Anda harus
menyertakan kunci lama dan baru di JSON. Misalnya, dalam
contoh, new-key
hanya akan digunakan setelah stempel waktu 1712813735
.
{
"keys":[
{
"kty":"RSA",
"kid":"old-key",
"K":"...", # k contains a Base64 encoded PEM format RSA signing key.
"useAfter": 1612813735, # unix timestamp
}
{
"kty":"RSA",
"kid":"new-key",
"K":"...", # k contains a Base64 encoded PEM format RSA signing key.
"useAfter": 1712813735, # unix timestamp
}
]
}
Cloud Service Mesh menggunakan kunci simetris untuk mengenkripsi data sesi yang disimpan
di cookie browser. Untuk memastikan validitas sesi yang ada, authservice
mencoba dekripsi dengan
semua kunci dalam set kunci. Di rotasi, authservice
akan menggunakan kunci baru untuk mengenkripsi sesi baru, dan akan terus mencoba
dekripsi menggunakan kunci lama.
Pasangan kunci publik/pribadi digunakan untuk menandatangani RCToken
. Kunci publik merupakan
dikirimkan ke file bantuan oleh istiod
untuk verifikasi JWT. Sangat penting bagi
file bantuan untuk menerima kunci publik baru sebelum authservice
mulai menggunakan kunci publik baru
kunci pribadi untuk menandatangani RCToken
. Untuk itu, authservice
mulai memublikasikan
kunci publik segera setelah kunci ditambahkan, tetapi menunggu permintaan
yang berbeda sebelum mulai menggunakannya untuk menandatangani RCToken
.
Ringkasnya, saat melakukan rotasi kunci, sebaiknya:
- Lakukan rotasi kunci reguler atau sesuai permintaan sesuai kebutuhan Anda.
- Dalam format JSON, sertakan kunci saat ini dan kunci baru. Kunci baru harus dikaitkan dengan stempel waktu di masa yang akan datang. Sebaiknya Anda menentukan stempel waktu setidaknya beberapa jam lebih awal dari waktu saat ini.
- Pantau dan konfirmasi bahwa layanan masih responsif setelah kunci baru sedang digunakan. Tunggu setidaknya satu hari setelah kunci baru digunakan sebelum memindahkan ke langkah berikutnya.
- Hapus kunci lama dari entri JSON. Keduanya tidak lagi diperlukan.
Deployment Multi-Cluster
User Auth Cloud Service Mesh mendukung deployment multi-cluster. Anda perlu men-deploy autentikasi pengguna di setiap cluster seperti yang dijelaskan di atas. Konfigurasi autentikasi pengguna seperti resource kustom UserAuth, rahasia klien OIDC, kunci enkripsi, harus direplikasi di tiap klaster.
Secara default, gateway masuk akan melakukan load balancing pada permintaan autentikasi ke
salah satu dari authservice
instance. Anda dapat menggunakan aturan tujuan untuk mengonfigurasi
gateway masuk untuk mengirim permintaan ke authservice
di cluster yang sama, dan
hanya beralih ke cluster lain, authservice
.
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: authservice-fail-over
namespace: asm-user-auth
spec:
host: authservice.asm-user-auth.svc.cluster.local
trafficPolicy:
loadBalancer:
localityLbSetting:
enabled: true
failover:
- from: us-east
to: us-west
- from: us-west
to: us-east
Sama seperti konfigurasi lainnya, konfigurasi ini perlu dikonfigurasi di setiap cluster.
Pemetaan klaim kustom
Untuk mengonfigurasi pemetaan klaim kustom, konfigurasikan spec.authentication.oidc.attributeMapping
untuk menentukan pemetaan dari IDToken penyedia identitas asli. Kuncinya adalah klaim
dalam RCToken dan nilainya adalah ekspresi CEL tentang cara mengurai klaim dari IDToken,
gunakan assertion
untuk mereferensikan IDToken.
Contoh:
spec:
authentication:
oidc:
attributeMapping:
aud_copy: assertion.aud
decision: 'assertion.sub.startsWith("123") ? "success" : "fail"'
Dalam RCToken, attributes
klaim bertingkat berisi klaim yang telah dikonfigurasi:
"attributes": {
"aud_copy": "foo.googleusercontent.com",
"decision": "success"
}
Jika ekspresi CEL gagal mengurai nilai dari IDToken, ekspresi ini akan mengabaikan klaim tanpa menggagalkan alur otentikasi.
Upgrade Auth Pengguna
Instal kembali paket autentikasi pengguna karena berisi biner yang diupdate untuk versi autentikasi pengguna yang baru:
kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.2 . cd asm-user-auth/
Simpan konfigurasi klien OIDC Anda:
export OIDC_CLIENT_ID=CLIENT_ID export OIDC_CLIENT_SECRET=CLIENT_SECRET export OIDC_ISSUER_URI=ISSUER_URI export OIDC_REDIRECT_HOST=REDIRECT_HOST export OIDC_REDIRECT_PATH=REDIRECT_PATH
Men-deploy layanan autentikasi pengguna untuk meningkatkan ke versi baru.
Detail konfigurasi autentikasi pengguna
Tabel berikut menjelaskan setiap kolom di CRD:
Nama kolom | Deskripsi |
---|---|
authentication.oidc |
Bagian ini menyimpan konfigurasi endpoint OIDC dan parameter yang digunakan dalam alur OIDC. |
authentication.oidc.certificateAuthorityData |
Ini adalah root certificate SSL dari domain otorisasi OIDC atau proxy HTTPS jika ada. |
authentication.oidc.oauthCredentialsSecret |
Referensi rahasia ke secret jenis Kubernetes Opaque yang berisi Client_id dan client_secret OIDC OAuth2 dalam payload JSON. |
authentication.oidc.issuerURI |
URI yang akan digunakan sebagai penerbit dalam RCToken output. |
authentication.oidc.proxy |
Server proxy ke OIDC IDP, jika berlaku. Dengan format http://user:password@10.10.10.10:8888. |
authentication.oidc.redirectURIHost |
Host yang akan digunakan untuk URI penghentian OAuth. Jika Anda membiarkannya kosong, {i>host<i} dari
URL target akan digunakan dan URI pengalihan akan disusun secara dinamis. Nilai ini dapat digunakan ketika sesi SSO autentikasi pengguna diinginkan pada jaringan {i>level domain<i}. Misalnya, untuk mengaktifkan SSO antara profile.example.com/ dan admin.example.com/, nilai ini dapat ditetapkan ke example.com. Tindakan ini akan mengaktifkan autentikasi pengguna dibuat di example.com yang akan dibagikan di antara semua subdomain. Catatan: Jika beberapa domain ditayangkan dari mesh yang sama, {i>example1.com<i} dan {i>example2.com<i}, fitur tersebut tidak dapat digunakan, dan disarankan untuk dibiarkan kosong. |
authentication.oidc.redirectURIPath |
Jalur endpoint tempat authservice akan menghentikan alur OAuth. Anda
harus mendaftarkan jalur URI ini ditambah host sebagai URI pengalihan yang diotorisasi di
server otorisasi untuk authentication.oidc.clientID .Selain itu, URI ini harus disajikan dari mesh layanan yang sama dan traffic masuk dengan authservice diaktifkan. |
authentication.oidc.scopes |
Cakupan OAuth yang harus diminta dalam autentikasi permintaan. Daftar ID yang dipisahkan koma yang digunakan untuk menentukan akses apa hak istimewa yang diminta selain "openid" cakupan, misalnya "grup,allatclaim". |
authentication.oidc.groupsClaim |
Jika idtoken berisi klaim grup, gunakan kolom ini untuk menunjukkan
namanya. Jika ditentukan, layanan akan meneruskan data dalam
klaim ke klaim groups dalam RCToken output. Klaim ini harus berisi
daftar string yang dipisahkan koma, misalnya ["grup1", "grup2"]. |
authentication.oidc.attributeMapping |
Berisi satu atau beberapa pemetaan klaim dari ekspresi CEL yang diikuti idtoken . Semua klaim
harus direferensikan oleh assertion.X , assertion direferensikan
ke IDToken asli, misalnya aud_copy: assertion.aud |
authentication.outputJWTAudience |
Audiens RCToken yang dibuat oleh authservice . File bantuan dapat
memvalidasi RCToken yang masuk terhadap nilai audiens ini. |
Memecahkan masalah
Aksesibilitas jaringan ke IDP.
Log yang mungkin ditampilkan:
error: TLS handshake failed.
.Verifikasi dengan menjalankan
curl
dari penampung sementara yang dilampirkan keistio-proxy
untuk memanggil URI penerbit IDP. Misalnya, lihat Mengumpulkan Mesh Layanan Cloud log.Jika Anda tidak dapat terhubung, periksa aturan {i>firewall<i} atau konfigurasi jaringan lain untuk cluster tersebut.
Sertifikat CA root.
Log yang mungkin ditampilkan:
error: The server's TLS certificate did not match expectations.
atauerror: TLS handshake failed.
.Pastikan
certificateAuthorityData
memiliki sertifikat CA root yang benar. Jika tidak ada proxy HTTPS yang menghentikan traffic HTTPS, tindakan ini harus memiliki root Sertifikat CA untuk IDP. Jika ada, seharusnya yang ada di proxy.Konfigurasi jalur pengalihan.
Kemungkinan pengamatan: menerima halaman error 404 selama alur autentikasi OIDC.
Autentikasi Pengguna menampilkan "Set-Cookie" {i>header<i} tanpa menggunakan atribut jalur, yang secara {i>default<i} menggunakan direktori URL permintaan sebagai jalur cookie (cakupan cookie yang terkait dengan jalur). Jadi, sebaiknya jangan sertakan "/" di jalur pengalihan kecuali Anda sengaja.
File bantuan tidak dapat mengambil jwksUri.
Dalam beberapa skenario, bantuan pembatasan tersebut dapat menyebabkan kegagalan pengambilan jwksUri. Jika namespace tidak ada menggunakan karakter pengganti (misalnya,
./*
atauistio-system/*
) maka ini tidak akan berfungsi. Anda harus menambahkan namespace secara manual saat traffic keluar file bantuan.
FAQ
Bagaimana cara mengupgrade Cloud Service Mesh dengan User Auth diaktifkan?
Ikuti Upgrade Cloud Service Mesh dan menetapkan file {i>overlay<i} dengan menambahkan
--custom_overlay user-auth-overlay.yaml
pada command line untukasmcli install
.Berapa banyak resource yang harus kita sediakan untuk
authservice
? Berapa banyak yang bisa ditanganinya?Secara default,
authservice
dikonfigurasi dengan 2.0 vCPU, memori 256Mi. Di Bawah konfigurasi tersebut,authservice
mampu menangani 500 permintaan per detik. Untuk menangani jumlah permintaan yang lebih besar, Anda harus menyediakan lebih banyak CPU, yang kira-kira proporsional dengan kapasitas penanganan permintaannya. Anda dapat mengkonfigurasi beberapa replika authservice untuk meningkatkan skalabilitas horizontal.