Mengonfigurasi autentikasi pengguna Anthos Service Mesh

Autentikasi pengguna Anthos Service Mesh adalah solusi terintegrasi untuk autentikasi pengguna akhir berbasis browser dan kontrol akses ke workload yang di-deploy. Dengan API ini, Anda dapat berintegrasi dengan Penyedia Identitas (IDP) yang ada untuk autentikasi pengguna serta menggunakan Istio API dan kebijakan otorisasi untuk pengelolaan akses. Layanan ini merupakan alternatif yang mudah digunakan untuk autentikasi Istio JSON Web Token (JWT).

Kasus penggunaan umum terjadi ketika organisasi menggunakan Anthos Service Mesh untuk menghosting aplikasi web yang dapat diakses tenaga kerjanya melalui browser web. Selain itu, organisasi harus menggunakan penyedia identitas yang sudah ada untuk mengelola identitas pengguna. Autentikasi pengguna Anthos Service Mesh memudahkan pengguna melakukan autentikasi menggunakan alur izin dan login OpenID Connect (OIDC) berbasis web standar. Saat pengguna melakukan autentikasi, Anthos Service Mesh akan menerapkan kebijakan otorisasi Istio, dan pada otorisasi yang berhasil, Anthos akan mengirimkan identitas ke workload dalam format kredensial yang aman.

Cara kerjanya

Autentikasi pengguna Anthos Service Mesh memperkenalkan komponen baru, authservice. Komponen ini terintegrasi dengan ingress berbasis Envoy sebagai layanan otorisasi eksternal yang mencegat semua permintaan masuk untuk autentikasi. authservice menerapkan protokol OIDC sisi klien dan memungkinkan akses pengguna ke aplikasi melalui browser. Di sini, pengguna menyelesaikan alur izin dan autentikasi interaktif untuk membuat sesi berdurasi singkat. authservice menerapkan protokol standar industri untuk berintegrasi dengan penyedia identitas apa pun yang dapat bertindak sebagai server otorisasi OIDC. Saat pengguna diautentikasi, informasi utama dienkapsulasi dalam RCToken dalam format JWT, yang ditandatangani oleh authservice yang diteruskan ke lapisan otorisasi Istio dalam proses masuk. Model ini menyediakan kontrol akses perimeter untuk traffic ke mesh. Jika pengguna diizinkan untuk mengakses resource, RCToken ini juga akan diteruskan ke microservice untuk mendapatkan informasi utama dan menerapkan kontrol akses yang mendetail.

Diagram berikut menunjukkan lokasi authservice dalam mesh dan hubungannya dengan bagian mesh lainnya, seperti traffic masuk, beban kerja, browser pengguna, dan IDP yang ada.

autentikasi pengguna akhir

Administrator dapat menginstal authservice sebagai add-on melalui penginstalan Anthos Service Mesh. Jika diinstal, authservice akan membaca konfigurasi endpoint OIDC dan setelan terkait lainnya yang ditentukan dalam resource kustom UserAuth. Administrator dapat menggunakan ExternalAuthorization API Anthos Service Mesh untuk mengonfigurasi auth_server sebagai filter pada ingress.

Menginstal layanan autentikasi pengguna

Langkah berikut menjelaskan cara mengonfigurasi authservice.

Prasyarat

Ikuti langkah-langkah di bagian Menginstal alat dependen dan memvalidasi cluster untuk:
  • Jika Anda menggunakan Anthos Service Mesh terkelola di cluster pribadi, pastikan cluster dapat mengirimkan traffic keluar ke IDP.

  • Dapatkan paket kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.2 .
    cd asm-user-auth/
    

    Perintah ini mengambil paket kpt dengan konfigurasi authservice yang direkomendasikan dari repositori publik. Paket ini berisi manifes untuk men-deploy container authservice sebagai Pod di namespace asm-user-auth. API ini juga mengonfigurasi gateway masuk (ingress) guna mengharuskan otorisasi untuk semua permintaan.

Mengonfigurasi penyedia otorisasi eksternal dan men-deploy gateway masuk

Untuk menginstal layanan autentikasi pengguna, sesuaikan penginstalan Anthos Service Mesh untuk menambahkan penyedia otorisasi eksternal. Langkah-langkah yang diperlukan bergantung pada apakah Anda menggunakan Anthos Service Mesh terkelola atau dalam cluster.

Terkelola

  1. Update konfigurasi mesh di Istio ConfigMap untuk menambahkan penyedia otorisasi eksternal. Pada perintah berikut, gunakan REVISION_LABEL yang sama dengan yang Anda gunakan saat menyediakan Anthos Service Mesh terkelola (seperti asm-managed, asm-managed-rapid, atau asm-managed-stable):

    kubectl edit configmap istio-REVISION_LABEL -n istio-system
    
  2. Tambahkan penyedia ekstensi di bagian kolom mesh:

    mesh: |-
    ...
      extensionProviders:
      - name: "asm-userauth-grpc"
        envoyExtAuthzGrpc:
          service: "authservice.asm-user-auth.svc.cluster.local"
          port: "10003"
    
  3. Buat dan beri label namespace asm-user-auth.

    kubectl create namespace asm-user-auth
    kubectl label namespace asm-user-auth istio.io/rev=REVISION_LABEL --overwrite
    
  4. Instal gateway masuk di namespace asm-user-auth.

    kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
    

Dalam cluster

  1. Dapatkan contoh overlay autentikasi pengguna dan perbarui jika ada penyesuaian di mesh Anda. Sebagai praktik terbaik yang direkomendasikan untuk mengelola file overlay ini dalam kontrol sumber Anda.

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/asm-user-auth/v1.2.2/overlay/user-auth-overlay.yaml > user-auth-overlay.yaml
    
  2. Ikuti instal Anthos Service Mesh dengan overlay untuk menggunakan skrip yang disediakan Google guna menginstal Anthos Service Mesh dengan overlay autentikasi pengguna. 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 membuat AuthorizationPolicy untuk mereferensikan penyedia otorisasi eksternal yang ditentukan oleh pkg/ext-authz.yaml.

  3. Buat dan beri label namespace asm-user-auth.

    kubectl create namespace asm-user-auth
    kubectl label namespace asm-user-auth istio.io/rev=REVISION --overwrite
    

    Anda dapat menemukan nilai label REVISION dengan memeriksa kubectl get pod -n istio-system -L istio.io/rev

  4. Instal gateway Istio di namespace asm-user-auth.

    kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
    

Menyiapkan konfigurasi klien OIDC

Setel 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.

  1. Di konsol Google Cloud, buka API & Services > Credentials.

    Buka Kredensial

  2. Buka Buat Kredensial, lalu pilih Client ID OAuth. Jika diperlukan, setel opsi OAuth consent screen, lalu konfigurasikan opsi berikut:

    • Setel Jenis aplikasi ke Aplikasi web.
    • Tetapkan Authorized redirect URI ke https://REDIRECT_HOST/REDIRECT_PATH. Misalnya, untuk localhost, Anda dapat menetapkan ke https://localhost:8443/_gcp_asm_authenticate.

    Lalu klik Simpan.

  3. Selain itu, simpan konfigurasi klien OIDC Anda untuk digunakan di lain waktu.

    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
    

Menetapkan URL dan rahasia pengalihan untuk gateway masuk

OAuth2 memerlukan URL pengalihan yang dihosting di endpoint yang dilindungi HTTPS. Perintah-perintah ini misalnya digunakan untuk tujuan contoh dan menyederhanakan penyiapan dengan membuat sertifikat yang ditandatangani sendiri untuk gateway masuk Istio.

  1. Buat sertifikat yang ditandatangani sendiri:

    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
     -days 365 -nodes -subj '/CN=localhost'
    
  2. Buat rahasia untuk gateway masuk guna 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 kumpulan 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.

Kumpulan kunci kedua adalah pasangan kunci publik/pribadi. Kunci ini digunakan untuk menandatangani informasi pengguna terautentikasi dalam format JWT sebagai RCToken. Kunci publik dari pasangan ini dipublikasikan di endpoint yang telah ditentukan dan dapat digunakan untuk memvalidasi JWT.

Paket kpt autentikasi pengguna berisi dua kunci contoh untuk penyiapan cepat. Namun, Anda dapat menggunakan sistem pengelolaan kunci pilihan Anda untuk membuat kunci ini.

  1. 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_AES_KEY",
            "useAfter": 1612813735
         }
      ]
    }
    

    Anda dapat membuat kunci AES pengujian dengan perintah berikut:

    openssl rand -base64 32
    
  2. Siapkan kunci penandatanganan RCToken dengan format berikut atau gunakan contoh dari pkg, yang dapat Anda lihat berdasarkan cat ./samples/rctoken_signing_key.json.

    {
      "keys":[
         {
            "kty":"RSA",
            "kid":"rsa-signing-key",
            "k":"YOUR_AES_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
    
  3. Buat secret kubernetes, yang akan dipasang authservice ke sistem filenya sendiri.

    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 dan Deployment autentikasi pengguna dalam namespace asm-user-auth.

Tetapkan nilai yang diperlukan untuk konfigurasi User Auth. Client ID dan secret disimpan sebagai secret Kubernetes, jadi kami menggunakan Base64 untuk mengenkodenya. Buka 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 autentikasi pengguna akhir. UserAuthConfig dapat dikonfigurasi selama runtime, dan Anda dapat mengupdatenya untuk mengubah perilaku authservice serta mengonfigurasinya dengan endpoint untuk server otorisasi OIDC apa pun.

Anda dapat melihat file ini 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 mengetahui deskripsi mendetail tentang kolom user_auth_config.yaml.

Melakukan tugas pasca-penginstalan

Tugas berikut wajib dilakukan setelah Anda menyelesaikan langkah-langkah penginstalan.

Mengaktifkan autentikasi pengguna untuk aplikasi Anda

Bagian ini menunjukkan cara mengaktifkan autentikasi pengguna, dengan menggunakan aplikasi contoh httpbin sebagai contoh.

Autentikasi pengguna Anthos Service Mesh menggunakan kebijakan otorisasi jenis CUSTOM untuk memicu alur OIDC.

Setelah menginstal gateway Istio, konfigurasikan gateway untuk menyalurkan traffic HTTPS menggunakan sertifikat TLS userauth-tls-cert yang Anda buat di atas. Berikut adalah konfigurasi pkg/gateway.yaml yang baru saja Anda instal.

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
  1. Beri label namespace default untuk mengaktifkan injeksi otomatis istio-proxy untuk deployment.

    kubectl label namespace default istio.io/rev=REVISION --overwrite
    
  2. Deploy namespace httpbin ke default.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/httpbin.yaml -n default
    
  3. Update httpbin untuk menggunakan gateway ini untuk menyalurkan traffic HTTPS, dan gunakan penerusan port 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
    
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: httpbin
      namespace: default
    spec:
      gateways:
      - asm-user-auth/userauth
      hosts:
      - '*'
      http:
      - match:
        - uri:
            prefix: /ip
        - uri:
            prefix: /headers
        name: httpbin-routes
        route:
        - destination:
            host: httpbin.default.svc.cluster.local
            port:
              number: 8000
    

    Gateway masuk di port 8443 akan diteruskan ke localhost agar aplikasi dapat diakses secara lokal.

  4. Deploy samples/rctoken-authz.yaml untuk mengaktifkan RequestAuthentication dan AuthorizationPolicy guna memverifikasi RCToken untuk permintaan tersebut.

    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 melayani dua jalur, /ip dapat diakses secara publik dan /headers mengharuskan pengguna akhir untuk login melalui IDP yang dikonfigurasi.

  1. Verifikasi bahwa Anda dapat mengakses /ip secara langsung dengan membuka https://localhost:8443/ip.

  2. Pastikan Anda melihat halaman login OIDC dengan membuka https://localhost:8443/headers.

  3. Setelah login, klik Berikutnya dan pastikan Anda dialihkan ke halaman /headers.

Mengonfigurasi kebijakan otorisasi

Setelah Anda menyelesaikan konfigurasi pada langkah sebelumnya, setiap pengguna akan dialihkan melalui alur autentikasi berbasis web. Setelah alur selesai, authservice akan menghasilkan RCToken dalam format JWT, yang digunakan untuk mengirim informasi pengguna yang diautentikasi.

  1. Tambahkan kebijakan otorisasi Istio saat traffic masuk untuk memastikan bahwa pemeriksaan otorisasi terjadi untuk setiap pengguna yang diautentikasi:

    kubectl apply -f ./samples/httpbin-authz.yaml -n asm-user-auth
    
  2. File httpbin-authz.yaml mengonfigurasi gateway masuk untuk memvalidasi token RC yang dikeluarkan oleh authservice, dan hanya memberi otorisasi jika JWT berisi kolom yang diinginkan, seperti audience 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 cepat. Untuk penggunaan produksi yang sebenarnya, gunakan domain Anda sendiri, seperti example.com.

Selain itu, pastikan certificateAuthorityData memiliki konten root cert yang diinginkan. Misalnya, jika IDP dipercaya dengan root cert sistem, Anda dapat membiarkannya kosong. Jika ada proxy HTTPS yang menghentikan koneksi HTTPS, proxy tersebut harus ditetapkan ke root cert proxy.

Mengelola dan merotasi kunci

Ada dua set kunci yang digunakan oleh authservice. Anda dapat merotasi setiap kunci secara independen. Namun, sebelum memutar kunci, penting untuk memahami cara kerja rotasi.

Kedua kunci dalam format JSON. Kolom useAfter menentukan stempel waktu sejak kunci akan dianggap untuk digunakan. Selama rotasi kunci, Anda harus menyertakan kunci lama dan baru dalam JSON. Misalnya, dalam contoh berikut, 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
      }
   ]
}

Anthos Service Mesh menggunakan kunci simetris untuk mengenkripsi data sesi yang disimpan dalam cookie browser. Untuk memastikan validitas sesi yang ada, authservice akan mencoba mendekripsi dengan semua kunci dalam kumpulan kunci. Saat rotasi, authservice akan menggunakan kunci baru untuk mengenkripsi sesi baru, dan akan terus mencoba dekripsi dengan kunci lama.

Pasangan kunci publik/pribadi digunakan untuk menandatangani RCToken. Kunci publik dikirim ke file bantuan oleh istiod untuk verifikasi JWT. Penting bagi sidecar untuk menerima kunci publik baru sebelum authservice mulai menggunakan kunci pribadi baru untuk menandatangani RCToken. Oleh karena itu, authservice mulai memublikasikan kunci publik segera setelah kunci ditambahkan, tetapi menunggu cukup lama sebelum mulai menggunakannya untuk menandatangani RCToken.

Ringkasnya, saat melakukan rotasi kunci, sebaiknya:

  1. Lakukan rotasi kunci secara rutin atau sesuai permintaan sesuai kebutuhan.
  2. Dalam format JSON, sertakan kunci saat ini dan kunci baru. Kunci baru harus dikaitkan dengan stempel waktu di masa mendatang. Sebaiknya tentukan stempel waktu setidaknya beberapa jam sebelum waktu saat ini.
  3. Pantau dan konfirmasi bahwa layanan masih responsif setelah kunci baru digunakan. Tunggu minimal satu hari setelah kunci baru digunakan sebelum melanjutkan ke langkah berikutnya.
  4. Hapus kunci lama dari entri JSON. Fungsi tersebut tidak diperlukan lagi.

Deployment Multi Cluster

Autentikasi Pengguna Anthos 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, dan kunci enkripsi, semuanya harus direplikasi di setiap cluster.

Secara default, gateway masuk akan melakukan load balancing terhadap permintaan autentikasi ke salah satu instance authservice. Anda dapat menggunakan aturan tujuan untuk mengonfigurasi gateway masuk untuk mengirim permintaan ke authservice di cluster yang sama, dan hanya mengalihkan ke authservice cluster lainnya.

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 nama 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, klaim bertingkat attributes berisi klaim yang telah dikonfigurasi:

"attributes": {
    "aud_copy": "foo.googleusercontent.com",
    "decision": "success"
}

Jika ekspresi CEL gagal mengurai nilai dari IDToken, ekspresi CEL akan mengabaikan klaim tersebut tanpa menggagalkan alur autentikasi.

Upgrade Autentikasi Pengguna

  1. Instal lagi paket autentikasi pengguna karena berisi biner yang diupdate untuk versi autentikasi pengguna baru:

    kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.2 .
    cd asm-user-auth/
    
  2. 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
    
  3. Deploy layanan autentikasi pengguna untuk mengupgrade ke versi baru.

Detail konfigurasi autentikasi pengguna

Tabel berikut menjelaskan setiap kolom dalam 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 server otorisasi OIDC atau proxy HTTPS, jika ada.
authentication.oidc.oauthCredentialsSecret Referensi secret ke secret jenis Bursa Kubernetes yang berisi client_id dan client_secret OAuth2 OIDC dalam payload JSON.
authentication.oidc.issuerURI URI yang akan digunakan sebagai penerbit dalam RCToken output.
authentication.oidc.proxy Server proxy ke IDP OIDC, 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 mengosongkannya, host dari URL target akan digunakan dan URI pengalihan akan disusun secara dinamis.
Nilai ini dapat digunakan jika sesi SSO autentikasi pengguna diinginkan di domain level yang lebih tinggi. Misalnya, untuk mengaktifkan SSO antara profile.example.com/ dan admin.example.com/, nilai ini dapat ditetapkan ke example.com. Hal ini akan memungkinkan pembuatan sesi autentikasi pengguna di example.com yang akan dibagikan di antara semua subdomain. Catatan: Jika beberapa domain ditayangkan dari mesh yang sama, example1.com dan example2.com, fitur ini tidak dapat digunakan, dan direkomendasikan untuk dibiarkan kosong.
authentication.oidc.redirectURIPath Jalur endpoint tempat authservice akan menghentikan alur OAuth. Anda harus mendaftarkan jalur URI ini dan host sebagai URI pengalihan yang diberi otorisasi di server otorisasi untuk authentication.oidc.clientID.
Selain itu, URI ini harus disalurkan dari mesh layanan dan ingress yang sama tempat authservice diaktifkan.
authentication.oidc.scopes Cakupan OAuth yang harus diminta dalam permintaan autentikasi. Daftar ID yang dipisahkan koma yang digunakan untuk menentukan hak istimewa akses apa yang diminta selain cakupan "openid", misalnya "groups,allatclaim".
authentication.oidc.groupsClaim Jika idtoken berisi klaim grup, gunakan kolom ini untuk menunjukkan namanya. Jika ditentukan, layanan akan meneruskan data dalam klaim ini 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. Sidecar dapat memvalidasi RCToken yang masuk terhadap nilai audiens ini.

Memecahkan masalah

  1. Aksesibilitas jaringan ke IDP.

    Log yang mungkin: error: TLS handshake failed..

    Verifikasi dengan menjalankan curl dari penampung istio-proxy ke URI penerbit IDP. Jika tidak dapat terhubung, pengguna dapat memeriksa aturan firewall atau konfigurasi jaringan lainnya untuk cluster tersebut.

  2. Sertifikat CA root.

    Log yang mungkin: error: The server's TLS certificate did not match expectations. atau error: TLS handshake failed..

    Pastikan certificateAuthorityData menyimpan sertifikat root CA yang benar. Jika tidak ada proxy HTTPS yang menghentikan traffic HTTPS, sertifikat ini harus menyimpan sertifikat CA root untuk IDP. Jika ada, server ini seharusnya menyimpan proxy.

  3. Konfigurasi jalur pengalihan.

    Kemungkinan pengamatan: terima halaman error 404 selama alur autentikasi OIDC.

    Auth Pengguna menampilkan header "Set-Cookie" tanpa menggunakan atribut jalur, yang secara default browser menggunakan direktori URL permintaan sebagai jalur cookie (cakupan cookie yang terkait dengan jalur). Jadi, sebaiknya jangan sertakan "/" di jalur pengalihan kecuali jika Anda memang bermaksud demikian.

  4. File bantuan tidak dapat mengambil jwksUri.

    Dalam beberapa skenario, pembatasan sidecar dapat menyebabkan kegagalan pengambilan jwksUri. Jika namespace tidak ada menggunakan karakter pengganti (misalnya, ./* atau istio-system/*), cara ini tidak akan berfungsi. Anda harus menambahkan namespace mereka secara manual di file bantuan keluar.

FAQ

  1. Bagaimana cara mengupgrade Anthos Service Mesh dengan Autentikasi Pengguna yang diaktifkan?

    Jika Anda menggunakan Anthos Service Mesh dalam cluster, ikuti proses upgrade Anthos Service Mesh dan tentukan file overlay dengan menambahkan --custom_overlay user-auth-overlay.yaml di command line ke asmcli install.

    Anthos Service Mesh terkelola akan otomatis diupgrade.

  2. Berapa banyak CPU dan memori yang harus saya sediakan untuk authservice? Berapa banyak permintaan per detik yang dapat ditangani?

    Secara default, authservice dikonfigurasi dengan vCPU 2.0 dan memori 256Mi. Pada konfigurasi tersebut, authservice dapat menangani 500 permintaan per detik. Untuk menangani jumlah permintaan yang lebih besar, Anda harus menyediakan lebih banyak CPU, yang kira-kira sebanding dengan kapasitas penanganan permintaannya. Anda juga dapat mengonfigurasi beberapa replika authservice untuk meningkatkan skalabilitas horizontal.