Mengakses sumber daya yang dilindungi Microsoft Azure AD dari aplikasi di Google Cloud (pratinjau)

Beban kerja perangkat lunak yang berjalan di Google Cloud memerlukan aplikasi Azure Active Directory (Microsoft Azure AD) untuk mengautentikasi dan mengakses sumber daya yang dilindungi Microsoft Azure AD. Praktik umumnya adalah mengonfigurasi aplikasi itu dengan info masuk (rahasia atau sertifikat). Info masuk digunakan oleh beban kerja Google Cloud untuk meminta token akses dari platform identitas Microsoft. Informasi masuk ini menimbulkan risiko keamanan dan harus disimpan dengan aman dan diputar secara teratur. Anda juga menjalankan risiko downtime layanan jika informasi masuk kedaluwarsa.

Federasi identitas beban kerja memungkinkan Anda mengakses sumber daya yang dilindungi Microsoft Azure AD dari layanan yang berjalan di Google Cloud tanpa perlu mengelola rahasia. Sebagai gantinya, Anda dapat mengonfigurasi aplikasi Microsoft Azure AD Anda untuk mempercayai token yang diterbitkan oleh Google dan menukarnya dengan token akses dari platform identitas Microsoft.

Membuat pendaftaran aplikasi di Microsoft Azure AD

Buat pendaftaran aplikasi di Azure Active Directory.

Catat ID objek aplikasi (bukan ID aplikasi (klien)) yang Anda perlukan dalam langkah-langkah berikut. Buka daftar aplikasi terdaftar di portal Microsoft Azure, pilih pendaftaran aplikasi Anda, dan temukan ID Objek di Ringkasan->Esensial.

Memberikan izin aplikasi Anda ke sumber daya

Berikan aplikasi Anda izin yang diperlukan untuk mengakses sumber daya yang dilindungi Microsoft Azure AD yang ditargetkan oleh beban kerja perangkat lunak Anda yang berjalan di Google Cloud. Misalnya, tetapkan peran Kontributor Data Blob Storage ke aplikasi Anda jika aplikasi Anda perlu membaca, menulis, dan menghapus data blob di Azure Storage.

Menyiapkan identitas di Google Cloud

Anda memerlukan identitas di Google Cloud yang dapat dikaitkan dengan aplikasi Microsoft Azure AD Anda. Akun layanan, misalnya, digunakan oleh aplikasi atau beban kerja komputasi. Anda dapat menggunakan akun layanan default proyek Cloud Anda atau membuat akun layanan khusus.

Setiap akun layanan memiliki ID yang unik. Saat Anda membuka halaman IAM & Admin di konsol Google Cloud, klik Akun Layanan. Pilih akun layanan yang Anda rencanakan untuk digunakan, dan salin ID Uniknya.

Shows a screen shot of the Service Accounts page

Token yang diterbitkan oleh Google ke akun layanan akan memiliki ID Unik ini sebagai klaim subjek.

Klaim pengeluar sertifikat dalam token akan berupa https://accounts.google.com.

Anda memerlukan nilai klaim ini untuk mengonfigurasi hubungan kepercayaan dengan aplikasi Microsoft Azure AD, yang memungkinkan aplikasi Anda mempercayai token yang diterbitkan oleh Google ke akun layanan Anda.

Mengonfigurasi aplikasi Microsoft Azure AD untuk mempercayai identitas Google Cloud

Konfigurasikan info masuk identitas terfederasi pada aplikasi Microsoft Azure AD Anda untuk menyiapkan hubungan kepercayaan.

Bidang yang paling penting untuk membuat info masuk identitas terfederasi adalah:

  • ID objek: ID objek aplikasi (bukan ID (klien) aplikasi) yang sebelumnya Anda daftarkan di Microsoft Azure AD.
  • subjek: harus sesuai dengan klaim sub dalam token yang diterbitkan oleh IdP lain, dalam hal ini Google. Ini adalah ID Unik dari akun layanan yang Anda rencanakan untuk digunakan.
  • pengeluar sertifikat: harus sesuai dengan klaim iss dalam token yang diterbitkan oleh IdP. URL yang sesuai dengan spesifikasi Penemuan OIDC. Microsoft Azure AD menggunakan URL pengeluar sertifikat ini untuk mengambil kunci yang diperlukan guna memvalidasi token. Dalam kasus Google Cloud, pengeluar sertifikatnya adalah https://accounts.google.com.
  • audiens: harus sesuai dengan klaim aud dalam token. Untuk alasan keamanan, Anda harus memilih nilai yang unik untuk token yang dimaksudkan untuk Microsoft Azure AD. Nilai yang disarankan Microsoft adalah api://AzureADTokenExchange.

Perintah berikut mengonfigurasi info masuk identitas terfederasi:

az rest --method POST --uri 'https://graph.microsoft.com/beta/applications/41be38fd-caac-4354-aa1e-1fdb20e43bfa/federatedIdentityCredentials' --body '{"name":"GcpFederation","issuer":"https://accounts.google.com","subject":"112633961854638529490","description":"Testing","audiences":["api://AzureADTokenExchange"]}'

Untuk informasi dan contoh lebih lanjut, lihat Membuat info masuk identitas terfederasi.

Menukar token Google untuk token akses

Sekarang setelah Anda mengonfigurasi aplikasi Microsoft Azure AD untuk mempercayai akun layanan Google, Anda siap mendapatkan token dari Google dan menukarkannya dengan token akses dari platform identitas Microsoft. Kode ini berjalan dalam aplikasi yang disebarkan ke Google Cloud dan berjalan, misalnya, di Mesin Aplikasi.

Mendapatkan token ID untuk akun layanan Google Anda

Seperti disebutkan sebelumnya, sumber daya cloud Google seperti Mesin Aplikasi secara otomatis menggunakan akun layanan default proyek Cloud Anda. Anda juga dapat mengonfigurasi aplikasi untuk menggunakan akun layanan yang berbeda saat Anda menyebarkan layanan. Layanan Anda dapat meminta token ID untuk akun layanan tersebut dari server metadata yang menangani permintaan tersebut. Dengan pendekatan ini, Anda tidak memerlukan kunci apa pun untuk akun layanan Anda: ini semua dikelola oleh Google.

Berikut adalah contoh di TypeScript tentang cara meminta token ID dari server metadata Google:

async function getGoogleIDToken() {
    const headers = new Headers();

    headers.append("Metadata-Flavor", "Google ");

    let aadAudience = "api://AzureADTokenExchange";

    const endpoint="http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience="+ aadAudience;

    const options = {
            method: "GET",
            headers: headers,
        };

    return fetch(endpoint, options);
}

Penting

Audiens di sini perlu mencocokkan nilai audiens yang Anda konfigurasikan pada aplikasi Microsoft Azure AD saat membuat info masuk identitas terfederasi.

Menukar token identitas untuk token akses Microsoft Azure AD

Sekarang aplikasi Anda yang berjalan di Google Cloud memiliki token identitas dari Google, tukarkan token dengan token akses dari platform identitas Microsoft. Gunakan Microsoft Authentication Library (MSAL) untuk meneruskan token Google sebagai pernyataan klien. Versi MSAL berikut mendukung pernyataan klien:

Menggunakan MSAL, Anda menulis kelas token (menerapkan antarmuka TokenCredential) menukar token ID. Kelas token sebelumnya bersama pustaka klien yang berbeda untuk mengakses sumber daya yang dilindungi Microsoft Azure AD.

Cuplikan kode sampel TypeScript berikut mengimplementasikan antarmuka TokenCredential, mendapatkan token ID dari Google (menggunakan metode getGoogleIDToken yang ditentukan sebelumnya), dan menukar token ID untuk token akses.

const msal = require("@azure/msal-node");
import {TokenCredential, GetTokenOptions, AccessToken} from "@azure/core-auth"

class ClientAssertionCredential implements TokenCredential {

    constructor(clientID:string, tenantID:string, aadAuthority:string) {
        this.clientID = clientID;
        this.tenantID = tenantID;
        this.aadAuthority = aadAuthority;  // https://login.microsoftonline.com/
    }
    
    async getToken(scope: string | string[], _options?: GetTokenOptions):Promise<AccessToken> {

        var scopes:string[] = [];

        if (typeof scope === "string") {
            scopes[0]=scope;
        } else if (Array.isArray(scope)) {
            scopes = scope;
        }   

        // Get the ID token from Google.
        return getGoogleIDToken() // calling this directly just for clarity, 
                               // this should be a callback
        // pass this as a client assertion to the confidential client app
        .then((clientAssertion:any)=> {
            var msalApp: any;
            msalApp = new msal.ConfidentialClientApplication({
                auth: {
                    clientId: this.clientID,
                    authority: this.aadAuthority + this.tenantID,
                    clientAssertion: clientAssertion,
                }
            });
            return msalApp.acquireTokenByClientCredential({ scopes })
        })
        .then(function(aadToken) {
            // return in form expected by TokenCredential.getToken
            let returnToken = {
                token: aadToken.accessToken,
                expiresOnTimestamp: aadToken.expiresOn.getTime(),
            };
            return (returnToken);
        })
        .catch(function(error) {
            // error stuff
        });
    }
}
export default ClientAssertionCredential;

Mengakses sumber daya yang dilindungi Microsoft Azure AD

Aplikasi Anda yang berjalan di Google Cloud sekarang memiliki token akses yang diterbitkan oleh platform identitas Microsoft. Gunakan token akses untuk mengakses sumber daya yang dilindungi Microsoft Azure AD yang aplikasi Microsoft Azure AD Anda miliki izin aksesnya. Sebagai contoh, ini adalah cara Anda dapat mengakses penyimpanan Azure Blob menggunakan kelas token ClientAssertionCredential dan pustaka klien Azure Blob Storage. Ketika Anda membuat permintaan ke BlobServiceClient untuk mengakses penyimpanan, BlobServiceClient memanggil metode getToken pada objek ClientAssertionCredential untuk mendapatkan token ID baru dan menukarnya dengan token akses.

Contoh TypeScript berikut menginisialisasi objek ClientAssertionCredential baru lalu membuat objek BlobServiceClient baru.

const { BlobServiceClient } = require("@azure/storage-blob");

var storageUrl = "https://<storageaccount>.blob.core.windows.net";
var clientID:any = "<client-id>";
var tenantID:any = "<tenant-id>";
var aadAuthority:any = "https://login.microsoftonline.com/";
var credential =  new ClientAssertionCredential(clientID,
                                                tenantID,
                                                aadAuthority);
                                             
const blobServiceClient  = new BlobServiceClient(storageUrl, credential);

// write code to access Blob storage

Langkah berikutnya

Pelajari lebih lanjut federasi identitas beban kerja.