Mengonfigurasi autentikasi pengguna Anthos Service Mesh

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

Kasus penggunaan umum adalah 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 ada untuk mengelola identitas pengguna. Autentikasi pengguna Anthos Service Mesh memudahkan pengguna melakukan autentikasi menggunakan alur login dan izin OpenID Connect (OIDC) berbasis web standar. Saat pengguna melakukan autentikasi, Anthos Service Mesh akan menerapkan kebijakan otorisasi Istio, dan jika otorisasi berhasil, Anthos akan mengirimkan identitas ke workload dalam format kredensial yang aman.

Cara kerja Duet AI

Autentikasi pengguna Anthos Service Mesh memperkenalkan komponen baru, yaitu authservice. Komponen ini terintegrasi dengan ingress berbasis Envoy sebagai layanan otorisasi eksternal yang mencegat semua permintaan masuk untuk autentikasi. authservice menerapkan sisi klien protokol OIDC dan memungkinkan pengguna mengakses aplikasi melalui browser. Di browser ini, pengguna menyelesaikan autentikasi interaktif dan alur izin 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 di traffic masuk. Model ini menyediakan kontrol akses perimeter untuk traffic ke mesh. Jika pengguna diberi otorisasi untuk mengakses resource, RCToken ini juga akan diteruskan ke microservice untuk mendapatkan informasi utama dan menerapkan kontrol akses yang terperinci.

Diagram berikut menunjukkan lokasi authservice di mesh dan kaitannya 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. Saat diinstal, authservice akan membaca konfigurasi endpoint OIDC dan setelan terkait lainnya yang ditentukan dalam resource kustom UserAuth. Administrator dapat menggunakan Anthos Service Mesh ExternalAuthorization API untuk mengonfigurasi auth_server sebagai filter pada ingress.

Menginstal layanan autentikasi pengguna

Langkah-langkah berikut menjelaskan cara mengonfigurasi authservice.

Prasyarat

Pastikan Anda memenuhi prasyarat dengan menggunakan langkah-langkah berikut.

Menyesuaikan penginstalan menggunakan overlay autentikasi pengguna

Untuk menginstal layanan autentikasi pengguna, Anda harus menyesuaikan penginstalan ASM untuk menambahkan penyedia otorisasi eksternal level mesh.

  1. Dapatkan contoh overlay autentikasi pengguna dan perbarui jika ada penyesuaian di mesh Anda. Praktik terbaiknya adalah mempertahankan file overlay ini di kontrol sumber.

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/asm-user-auth/release-0.1/overlay/user-auth-overlay.yaml > user-auth-overlay.yaml
    
  2. Ikuti instal ASM dengan overlay untuk menggunakan skrip yang disediakan Google untuk menginstal Anthos Service Mesh dengan overlay autentikasi pengguna. Contoh:

    /install_asm \
     --project_id "PROJECT_ID" \
     --cluster_name "CLUSTER_NAME" \
     --cluster_location "CLUSTER_LOCATION" \
     --mode install \
     --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.

Menyiapkan konfigurasi klien OIDC

Tetapkan konfigurasi klien OIDC Anda 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 ID klien OAuth. Jika diperlukan, setel opsi OAuth consent screen Anda, lalu konfigurasikan opsi berikut:

    • Setel Jenis aplikasi ke Aplikasi web.
    • Setel Authorized redirect URI ke https://localhost:8443/_gcp_anthos_callback.

    Lalu klik Simpan.

  3. Selain itu, simpan client ID dan rahasia klien Anda untuk digunakan di lain waktu:

    export OIDC_CLIENT_ID='<your-client-id>'
    export OIDC_CLIENT_SECRET='<your-client-secret>'
    export OIDC_ISSUER_URI='https://accounts.google.com'
    

Dapatkan paket kpt

Gunakan langkah-langkah berikut untuk menginstal konfigurasi authservice yang direkomendasikan dari repositori publik. Perintah ini mengambil container authservice terbaru dan memulainya sebagai Pod di namespace asm-user-auth. Kode ini juga mengonfigurasi ingress untuk menangkap semua permintaan.

  1. Dapatkan paket kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth@release-0.1 .
    cd asm-user-auth/
    

Tetapkan URL dan rahasia pengalihan untuk gateway masuk

OAuth2 memerlukan URL pengalihan yang dihosting di endpoint yang dilindungi HTTPS. Perintah tersebut adalah contoh tujuan dan menyederhanakan penyiapan dengan membuat sertifikat yang ditandatangani sendiri untuk gateway ingress Istio. Deployment produksi tidak boleh menggunakan sertifikat yang ditandatangani sendiri.

  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 istio-system secret tls userauth-tls-cert --key=key.pem \
    --cert=cert.pem
    

Menerapkan kunci enkripsi dan penandatanganan

authservice memerlukan dua kumpulan kunci agar berhasil beroperasi. 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 diautentikasi dalam format JWT sebagai RCToken. Kunci publik dari pasangan ini dipublikasikan di endpoint yang telah ditentukan sebelumnya, yang dapat digunakan file bantuan 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. Setelah Anda membuat kunci, masukkan data kunci dalam format yang sama:

    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
         }
      ]
    }
    
    cat ./samples/cookie_encryption_key.json
    {
      "keys":[
         {
            "kty":"oct",
            "kid":"key-0",
            "K":"YOUR_KEY",
            "useAfter": 1612813735
         }
      ]
    }
    
  2. Buat rahasia kubernetes, yang akan dipasang authservice ke dalam sistem filenya sendiri.

    kubectl create namespace asm-user-auth
    kubectl label namespace asm-user-auth  istio-injection=enabled istio.io/rev=default --overwrite
    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 autentikasi pengguna dan deployment dalam namespace asm-user-auth.

  1. Tetapkan variabel oauth:

    kpt cfg set pkg anthos.servicemesh.user-auth.oidc.clientID ${OIDC_CLIENT_ID}
    kpt cfg set pkg anthos.servicemesh.user-auth.oidc.clientSecret ${OIDC_CLIENT_SECRET}
    kpt cfg set pkg anthos.servicemesh.user-auth.oidc.issuerURI ${OIDC_ISSUER_URI}
    
  2. Terapkan paket kpt:

    kubectl apply -f ./pkg/asm_user_auth_config_v1alpha1.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. Isinya adalah sebagai berikut:

cat pkg/user_auth_config.yaml

apiVersion: security.anthos.io/v1alpha1
kind: UserAuthConfig
metadata:
  name: auth-config
  namespace: user-auth
spec:
  authentication:
  - oidc:
      clientID: "${OIDC_CLIENT_ID}"
      clientSecret: "${OIDC_CLIENT_SECRET}"
      issuerURI: "${OIDC_ISSUER_URI}"
      redirectURIHost: ""
      redirectURIPath: "/_gcp_anthos_callback"
  outputJWTAudience: "test_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 langkah-langkah penginstalan sebelumnya.

Mengaktifkan autentikasi pengguna untuk aplikasi Anda

Bagian ini menunjukkan cara mengaktifkan autentikasi pengguna, dengan menggunakan Aplikasi contoh Online Boutique sebagai contoh.

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

Proses penginstalan juga membuat gateway Istio untuk menyalurkan traffic HTTPS menggunakan sertifikat TLS userauth-tls-cert yang Anda buat di atas. Berikut adalah konfigurasi pkg/gateway.yaml.

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: /_gcp_anthos_callback
    name: user-auth-route
    route:
    - destination:
        host: authservice
        port:
          number: 10004
  1. Update aplikasi Online Boutique agar dapat menggunakan gateway ini untuk menyalurkan traffic HTTPS, dan menggunakan penerusan port untuk mengakses aplikasi secara lokal:

    kubectl apply -f./samples/boutique-route.yaml -n demo
    kubectl port-forward service/istio-ingressgateway 8443:443 -n istio-system
    

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

  2. Verifikasi bahwa contoh aplikasi Butik Online dapat diakses di https://localhost:8443/.

Memverifikasi autentikasi pengguna

Layanan permohonan Butik Online sekarang mengharuskan pengguna akhir untuk masuk melalui akun Google mereka.

  1. Verifikasi bahwa Anda melihat halaman login OIDC dengan membuka https://localhost:8443/.

  2. Setelah login, klik Next dan pastikan halaman tersebut mengalihkan Anda ke halaman beranda Online Boutique.

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 mengirimkan informasi pengguna terautentikasi.

  1. Tambahkan kebijakan otorisasi Istio saat traffic masuk untuk memastikan bahwa pemeriksaan otorisasi dilakukan untuk setiap pengguna terautentikasi:

    kubectl apply -f ./samples/rctoken-authz.yaml
    
  2. File rctoken-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: RequestAuthentication
    metadata:
     name: require-rc-token
     namespace: istio-system
    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
     namespace: istio-system
    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
    

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 tokenEndpoint dan authorizationEndpoint yang dikonfigurasi di CRD UserAuthConfig memiliki rute yang dikonfigurasi di VirtualService. Langkah penginstalan sebelumnya menetapkan hal ini di asm-user-auth/userauth-oidc VirtualService.

Mengelola dan merotasi kunci

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

Kedua kunci menggunakan 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 di cookie browser. Untuk memastikan validitas sesi yang ada, authservice akan mencoba melakukan dekripsi dengan semua kunci dalam kumpulan kunci. Pada saat rotasi, authservice akan menggunakan kunci baru untuk mengenkripsi sesi baru, dan akan terus mencoba mendekripsi dengan kunci lama.

Pasangan kunci publik/pribadi digunakan untuk menandatangani RCToken. Kunci publik dikirim ke file bantuan oleh istiod untuk verifikasi JWT. Sangat 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 Anda:

  1. Lakukan rotasi kunci secara teratur 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.

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 sertifikat SSL domain server otorisasi OIDC.
authentication.oidc.clientID Client ID OAuth yang akan digunakan untuk alur autentikasi OIDC.
authentication.oidc.clientSecret Rahasia klien OAuth yang akan digunakan untuk alur autentikasi OIDC.
authentication.oidc.issuerURI URI yang akan digunakan sebagai penerbit dalam output RCToken.
authentication.oidc.redirectURIHost Host yang akan digunakan untuk URI penghentian OAuth. Jika Anda membiarkannya kosong, host dari URL target akan digunakan dan URI pengalihan akan disusun secara dinamis.
Nilai ini dapat digunakan jika sesi SSO autentikasi pengguna diinginkan pada 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 traffic masuk yang sama dengan `authservice` diaktifkan.
authentication.oidc.scopes Cakupan OAuth yang harus diminta dalam permintaan autentikasi.
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` pada output RCToken.
authentication.outputJWTAudience Audience dari RCToken yang dihasilkan oleh `authservice`. Sidecar dapat memvalidasi RCToken yang masuk terhadap nilai audience ini.

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, kunci enkripsi, semuanya perlu direplikasi di setiap cluster.

Secara default, gateway ingress akan melakukan load balancing terhadap permintaan autentikasi ke salah satu instance authservice. Anda dapat menggunakan aturan tujuan untuk mengonfigurasi gateway masuk guna 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.

FAQ

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

    Ikuti proses upgrade Anthos Service Mesh dan tentukan file overlay user-auth.yaml pada command line ke install_asm.