Autentikasi pengguna dengan Identity-Aware Proxy

Autentikasi pengguna dengan Identity-Aware Proxy

Tentang codelab ini

subjectTerakhir diperbarui Nov 20, 2021
account_circleDitulis oleh engelke

1. Pengantar

Mengautentikasi pengguna aplikasi web Anda sering kali diperlukan, dan biasanya memerlukan pemrograman khusus dalam aplikasi Anda. Untuk aplikasi Google Cloud Platform, Anda dapat menyerahkan tanggung jawab tersebut ke layanan Identity-Aware Proxy. Jika Anda hanya perlu membatasi akses ke pengguna tertentu, perubahan pada aplikasi tidak diperlukan. Jika aplikasi perlu mengetahui identitas pengguna (seperti untuk menyimpan preferensi pengguna di sisi server), Identity-Aware Proxy dapat menyediakannya dengan sedikit kode aplikasi.

Apa itu Identity-Aware Proxy?

Identity-Aware Proxy (IAP) adalah layanan Google Cloud Platform yang mencegat permintaan web yang dikirim ke aplikasi Anda, mengautentikasi pengguna yang membuat permintaan menggunakan Google Identity Service, dan hanya mengizinkan permintaan tersebut jika berasal dari pengguna yang Anda izinkan. Selain itu, layanan ini dapat mengubah header permintaan untuk menyertakan informasi tentang pengguna yang diautentikasi.

Codelab ini akan memandu Anda membuat aplikasi sendiri, membatasi akses ke aplikasi tersebut, dan mendapatkan identitas pengguna dari IAP.

Yang akan Anda buat

Dalam codelab ini, Anda akan membangun aplikasi web minimal dengan Google App Engine, lalu mempelajari berbagai cara menggunakan Identity-Aware Proxy untuk membatasi akses ke aplikasi dan memberikan informasi identitas pengguna ke aplikasi. Aplikasi Anda akan:

  • Menampilkan halaman sambutan
  • Mengakses informasi identitas pengguna yang disediakan oleh IAP
  • Menggunakan verifikasi kriptografi untuk mencegah spoofing informasi identitas pengguna

Yang akan Anda pelajari

  • Cara menulis dan men-deploy aplikasi App Engine sederhana menggunakan Python 3.7
  • Cara mengaktifkan dan menonaktifkan IAP untuk membatasi akses ke aplikasi Anda
  • Cara mendapatkan informasi identitas pengguna dari IAP ke dalam aplikasi Anda
  • Cara memverifikasi informasi dari IAP secara kriptografis untuk berlindung dari spoofing

Yang Anda butuhkan

  • Browser web modern seperti Chrome.
  • Pengetahuan dasar tentang bahasa pemrograman Python

Codelab ini berfokus pada Google App Engine dan IAP. Konsep dan blok kode yang tidak relevan akan dibahas sekilas dan disediakan, jadi Anda cukup menyalin dan menempelkannya.

2. Mempersiapkan

Anda akan bekerja di lingkungan command line Cloud Shell. Mulailah dengan membuka lingkungan tersebut dan mengambil kode contoh ke dalamnya.

Meluncurkan Console dan Cloud Shell

Di bagian kiri atas halaman lab, klik tombol Open Google Console. Anda harus login dengan Nama Pengguna dan Sandi yang ditampilkan di bawah tombol tersebut.

Semua perintah dalam codelab ini akan dijalankan dalam Cloud Shell untuk project yang dibuat dan dibuka untuk Anda. Buka Cloud Shell dengan mengklik ikon Aktifkan Cloud Shell yang ada di sisi kanan header halaman konsol. Bagian bawah halaman akan memungkinkan Anda untuk masuk dan menjalankan perintah.Perintah dapat dijalankan dari PC Anda sendiri, tetapi Anda harus menginstal dan mengonfigurasi software pengembangan yang diperlukan terlebih dahulu. Cloud Shell memiliki semua alat software yang Anda butuhkan.

Download kodenya

Klik bidang command line di Cloud Shell untuk mengetikkan perintah. Ambil kode dari GitHub, lalu ubah ke folder kode:

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user
-authentication-with-iap

Folder ini berisi satu subfolder untuk setiap langkah codelab ini. Anda akan mengubahnya ke folder yang benar di tiap langkahnya.

3. Langkah 1 - Deploy aplikasi dan lindungi dengan IAP

Ini adalah aplikasi App Engine Standar yang ditulis dalam Python 3.7 yang hanya menampilkan "Hello, World" halaman sambutan. Kami akan men-deploy dan mengujinya, lalu membatasi aksesnya menggunakan IAP.

Meninjau kode aplikasi

Ubah dari folder project utama ke subfolder 1-HelloWorld yang berisi kode untuk langkah ini.

cd 1-HelloWorld

Kode aplikasi ada dalam file main.py. Library ini menggunakan framework web Flask untuk merespons permintaan web dengan konten template. File template tersebut ada di templates/index.html, dan untuk langkah ini hanya berisi HTML biasa. File template kedua berisi contoh kerangka kebijakan privasi di templates/privacy.html.

Ada dua file lainnya: requirements.txt mencantumkan semua library Python non-default yang digunakan aplikasi, dan app.yaml memberi tahu Google Cloud Platform bahwa ini adalah aplikasi App Engine Python 3.7.

Anda dapat mencantumkan tiap file dalam shell menggunakan perintah cat, seperti berikut:

cat main.py

Atau, Anda dapat membuka editor kode Cloud Shell dengan mengklik ikon Pensil di sisi kanan atas jendela Cloud Shell, lalu memeriksa kode tersebut.

Anda tidak perlu mengubah file apa pun untuk langkah ini.

Men-deploy ke App Engine

Sekarang deploy aplikasi ke lingkungan Standar App Engine untuk Python 3.7

gcloud app deploy

Anda mungkin akan diminta untuk memilih region tujuan deployment. Pilih perangkat di dekat Anda yang bertuliskan "mendukung standar". Saat ditanya apakah ingin melanjutkan, tekan Y untuk ya.

Dalam beberapa menit, deployment akan selesai dan Anda akan melihat pesan bahwa Anda dapat melihat aplikasi Anda dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka di browser Anda, klik link yang ditampilkan untuk membukanya di tab baru, atau salin ke tab baru yang dibuka secara manual jika perlu. Karena ini adalah pertama kalinya aplikasi dijalankan, perlu waktu beberapa detik hingga aplikasi muncul saat instance cloud dimulai, dan Anda akan melihat jendela berikut.

1c1c0b166c6023e.pngS

Anda dapat membuka URL yang sama dari komputer mana pun yang terhubung ke internet untuk melihat halaman web tersebut. Akses belum dibatasi.

Membatasi akses dengan IAP

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik Identity-Aware Proxy.

Karena ini adalah pertama kalinya Anda mengaktifkan opsi autentikasi untuk project ini, Anda akan melihat pesan yang menyatakan bahwa Anda harus mengonfigurasi layar izin OAuth sebelum dapat menggunakan IAP.

Klik TOMBOL LAYAR IZIN KONFIGURASI. Tab baru akan terbuka untuk mengonfigurasi layar izin.

Lengkapi bagian kosong yang diperlukan dengan nilai yang sesuai:

Nama aplikasi

Contoh IAP

Email dukungan

alamat email Anda. formulir tersebut mungkin sudah diisikan untuk Anda.

Domain yang diotorisasi

bagian nama host URL aplikasi, mis. iap-example-999999.appspot.com. Anda dapat melihatnya di kolom URL halaman web Hello World yang sebelumnya Anda buka. Jangan sertakan https:// awal atau akhir / dari URL tersebut.Anda harus menekan Enter setelah mengisi nilai ini.

Link halaman beranda aplikasi

URL yang Anda gunakan untuk melihat aplikasi Anda

Application privacy Policy link

link halaman privasi di aplikasi, sama seperti link halaman beranda dengan /privacy yang ditambahkan di bagian akhir

Klik Simpan. Anda akan diminta untuk membuat kredensial. Anda tidak perlu membuat kredensial untuk codelab ini, jadi Anda cukup menutup tab browser ini.

Kembali ke halaman Identity-Aware Proxy, lalu muat ulang halaman. Sekarang Anda dapat melihat daftar resource yang dapat dilindungi.Klik tombol di kolom IAP pada baris aplikasi App Engine untuk mengaktifkan IAP.

Anda akan melihat nama domain yang akan dilindungi oleh IAP. Klik AKTIFKAN.

Sekarang buka tab browser dan arahkan ke URL untuk aplikasi Anda. Anda akan melihat layar Login dengan Google yang mengharuskan Anda login untuk mengakses aplikasi.

Login dengan akun Google atau G Suite. Anda akan melihat layar yang menolak upaya akses tersebut.

Anda telah berhasil melindungi aplikasi dengan IAP, tetapi Anda belum memberi tahu IAP terkait akun mana yang akan diberi akses.

Kembali ke halaman Identity-Aware Proxy di konsol, pilih kotak centang di samping aplikasi App Engine, dan lihat sidebar di sebelah kanan halaman.

Setiap alamat email (atau alamat Google Grup, atau nama domain G Suite) yang seharusnya diizinkan aksesnya perlu ditambahkan sebagai Anggota. Klik TAMBAHKAN ANGGOTA. Masukkan alamat email Anda, lalu pilih peran Cloud IAP/IAP-Secured Web App User yang akan ditetapkan ke alamat tersebut. Anda dapat memasukkan lebih banyak alamat atau domain G Suite dengan cara yang sama.

Klik Simpan. Pesan "Policy Updated" akan muncul di bagian bawah jendela.

Kembali ke aplikasi dan muat ulang halaman. Anda sekarang akan melihat aplikasi web, karena Anda telah login dengan pengguna yang telah diotorisasi. Namun, Anda mungkin masih melihat pesan "Anda tidak memiliki akses" karena IAP mungkin tidak memeriksa ulang otorisasi Anda. Dalam hal ini, lakukan langkah-langkah berikut:

  • Buka browser web Anda ke alamat halaman beranda dengan menambahkan /_gcp_iap/clear_login_cookie ke bagian akhir URL, seperti di https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Anda akan melihat layar "Login dengan Google" yang baru, yang menampilkan akun Anda. Jangan mengklik akun tersebut. Sebagai gantinya, klik Use another account, dan masukkan kembali kredensial Anda.
  • Langkah-langkah ini akan membuat IAP memeriksa ulang akses, dan sekarang Anda akan melihat layar utama aplikasi.

Jika Anda memiliki akses ke browser lain atau dapat menggunakan Mode Samaran di browser Anda, dan memiliki akun GMail atau G Suite lain yang valid, Anda dapat menggunakan browser tersebut untuk membuka halaman aplikasi Anda dan login dengan akun lain tersebut. Karena akun tersebut belum diotorisasi, akan muncul tulisan “You Don't Have Access” di layar, bukan aplikasi Anda.

4. Langkah 2 - Akses informasi identitas pengguna

Setelah aplikasi dilindungi dengan IAP, aplikasi tersebut dapat menggunakan informasi identitas yang disediakan oleh IAP dalam header permintaan web yang dilaluinya. Pada langkah ini, aplikasi akan mendapatkan alamat email pengguna yang sedang login dan ID pengguna unik persisten yang ditetapkan oleh Google Identity Service untuk pengguna tersebut. Data tersebut akan ditampilkan kepada pengguna di halaman sambutan.

Ini adalah langkah 2, dan langkah terakhir diakhiri dengan Cloud Shell terbuka di folder iap-codelab/1-HelloWorld. Ubah ke folder untuk langkah ini:

cd ~/iap-codelab/2-HelloUser

Men-deploy ke App Engine

Karena deployment memerlukan waktu beberapa menit, mulailah dengan men-deploy aplikasi ke lingkungan Standar App Engine untuk Python 3.7:

gcloud app deploy

Saat Anda ditanya apakah ingin melanjutkan, tekan Y untuk ya. Dalam beberapa menit, deployment akan selesai. Sambil menunggu, Anda dapat memeriksa file aplikasi seperti yang dijelaskan di bawah.

Saat deployment siap, Anda akan melihat pesan bahwa Anda dapat melihat aplikasi Anda dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka pada browser, salin link yang ditampilkan dan buka link tersebut di tab baru seperti biasa. Anda akan melihat halaman seperti berikut:

5b5fb03111258cec.pngS

Anda mungkin perlu menunggu beberapa menit agar versi baru dari aplikasi dapat menggantikan versi sebelumnya. Muat ulang halaman jika diperlukan untuk melihat halaman yang mirip dengan halaman di atas.

Memeriksa file aplikasi

Folder ini berisi kumpulan file yang sama seperti yang terlihat di Langkah 1, tetapi dua file telah diubah: main.py dan templates/index.html. Program telah diubah untuk mengambil informasi pengguna yang disediakan IAP dalam header permintaan, dan sekarang, template menampilkan data tersebut.

Ada dua baris di main.py yang mendapatkan data identitas yang disediakan IAP:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id
= request.headers.get('X-Goog-Authenticated-User-ID')

Header X-Goog-Authenticated-User- disediakan oleh IAP, dan namanya tidak peka huruf besar/kecil, sehingga dapat diberikan dalam huruf kecil atau huruf besar semua jika diinginkan. Pernyataan render_template sekarang menyertakan nilai-nilai tersebut agar dapat ditampilkan:

page = render_template('index.html', email=user_email, id=user_id)

Template index.html dapat menampilkan nilai tersebut dengan mengapit nama dalam tanda kurung kurawal ganda:

Hello, {{ email }}! Your persistent ID is {{ id }}.

Seperti yang dapat Anda lihat, data yang disediakan diawali dengan accounts.google.com: yang menunjukkan asal informasi. Aplikasi Anda dapat menghapus semuanya hingga dan termasuk tanda titik dua untuk mendapatkan nilai mentah jika diinginkan.

Menonaktifkan IAP

Apa yang terjadi pada aplikasi ini jika IAP dinonaktifkan, atau diabaikan (misalnya oleh aplikasi lain yang berjalan di project cloud yang sama)? Nonaktifkan IAP untuk mengetahuinya.

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik Identity-Aware Proxy. Klik tombol alih IAP di samping aplikasi App Engine untuk menonaktifkan IAP.

Anda akan diperingatkan bahwa dengan menonaktifkan IAP, semua pengguna dapat mengakses aplikasi.

Muat ulang halaman web aplikasi. Anda akan melihat halaman yang sama, tetapi tanpa informasi pengguna:

17c850de95fea839.pngS

Karena aplikasi sekarang tidak terlindungi, pengguna dapat mengirim permintaan web yang terlihat telah melewati IAP. Misalnya, Anda dapat menjalankan perintah curl berikut dari Cloud Shell untuk melakukannya (ganti <your-url-here> dengan URL yang benar untuk aplikasi Anda):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

Halaman web akan ditampilkan pada command line, dan akan terlihat seperti berikut:

<!doctype html>
<html>
<head>
  <title>IAP Hello User</title>
</head>
<body>
  <h1>Hello World</h1>

  <p>
    Hello, totally fake email! Your persistent ID is None.
  </p>

  <p>
    This is step 2 of the <em>User Authentication with IAP</em>
    codelab.
 </p>

</body>
</html>

Tidak ada cara bagi aplikasi untuk mengetahui apakah IAP telah dinonaktifkan atau diabaikan. Untuk kasus yang berpotensi menimbulkan risiko, langkah 3 menunjukkan solusinya.

5. Langkah 3 - Gunakan verifikasi kriptografi

Jika ada risiko IAP dinonaktifkan atau diabaikan, aplikasi dapat memeriksa untuk memastikan informasi identitas yang diterimanya valid. Opsi ini menggunakan header permintaan web ketiga yang ditambahkan oleh IAP, yang disebut X-Goog-IAP-JWT-Assertion. Nilai header adalah objek yang ditandatangani secara kriptografis yang juga berisi data identitas pengguna. Aplikasi Anda dapat memverifikasi tanda tangan digital dan menggunakan data yang disediakan dalam objek ini untuk memastikan bahwa tanda tangan tersebut disediakan oleh IAP tanpa adanya perubahan.

Verifikasi tanda tangan digital memerlukan beberapa langkah tambahan, seperti mengambil set kunci publik Google yang terbaru. Perlu tidaknya langkah tambahan ini dapat ditentukan berdasarkan risikonya. Misalnya, seseorang mungkin dapat menonaktifkan atau mengabaikan IAP. Faktor penentu lainnya adalah sensitivitas aplikasi.

Ini adalah langkah 3, dan langkah terakhir diakhiri dengan Cloud Shell terbuka di folder iap-codelab/2-HelloUser. Ubah ke folder untuk langkah ini:

cd ~/iap-codelab/3-HelloVerifiedUser

Men-deploy ke App Engine

Deploy aplikasi ke lingkungan Standar App Engine untuk Python 3.7:

gcloud app deploy

Saat Anda ditanya apakah ingin melanjutkan, tekan Y untuk ya. Dalam beberapa menit, deployment akan selesai. Sambil menunggu, Anda dapat memeriksa file aplikasi seperti yang dijelaskan di bawah.

Saat deployment siap, Anda akan melihat pesan bahwa Anda dapat melihat aplikasi Anda dengan gcloud app browse. Masukkan perintah tersebut. Jika tab baru tidak terbuka pada browser, salin link yang ditampilkan dan buka link tersebut di tab baru seperti biasa.

Ingatlah bahwa Anda menonaktifkan IAP di Langkah 2, sehingga tidak ada data IAP yang disediakan ke aplikasi. Anda akan melihat halaman seperti berikut:

8ef2abcc23d96958.png

Seperti sebelumnya, Anda mungkin perlu menunggu beberapa menit hingga versi terbaru diluncurkan guna melihat versi baru dari halaman tersebut.

Karena IAP dinonaktifkan, tidak ada informasi pengguna yang tersedia. Sekarang aktifkan kembali IAP.

Di jendela Cloud Console, klik ikon menu di kiri atas halaman, klik Security, lalu klik Identity-Aware Proxy. Klik tombol IAP di samping aplikasi App Engine untuk mengaktifkan lagi IAP.

Muat ulang halaman. Halaman akan terlihat seperti berikut:

3a4d93c11f228852.pngS

Perhatikan bahwa alamat email yang diberikan oleh metode terverifikasi tidak memiliki awalan accounts.google.com:.

Jika IAP dinonaktifkan atau diabaikan, data yang diverifikasi akan hilang, atau tidak valid, karena data tersebut tidak dapat memiliki tanda tangan yang valid kecuali jika dibuat oleh pemegang kunci pribadi Google.

Memeriksa file aplikasi

Folder ini berisi kumpulan file yang sama seperti yang terlihat di Langkah 2, dengan dua file diubah dan satu file baru. File baru ini adalah auth.py, yang menyediakan metode user() untuk mengambil dan memverifikasi informasi identitas yang ditandatangani secara kriptografis. File yang diubah adalah main.py dan templates/index.html, yang sekarang menggunakan hasil metode tersebut. Header yang belum diverifikasi seperti yang ditemukan di langkah 2 juga ditampilkan sebagai perbandingan.

Fungsi baru terutama dalam fungsi user():

def user():
    assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
    if assertion is None:
        return None, None

    info = jwt.decode(
        assertion,
        keys(),
        algorithms=['ES256'],
        audience=audience()
    )

    return info['email'], info['sub']

assertion adalah data yang ditandatangani secara kriptografis dan disediakan di header permintaan yang ditentukan. Kode ini menggunakan library untuk memvalidasi dan mendekode data tersebut. Validasi menggunakan kunci publik yang disediakan oleh Google untuk memeriksa data yang ditandatanganinya, serta mengetahui audiens yang dituju oleh data tersebut (pada dasarnya, project Google Cloud yang sedang dilindungi). Fungsi bantuan keys() dan audience() mengumpulkan dan menampilkan nilai tersebut.

Objek yang ditandatangani memiliki dua data yang diperlukan: alamat email terverifikasi dan nilai ID unik (disediakan di sub, untuk pelanggan, kolom standar).

Langkah 3 telah selesai.

6. Ringkasan

Anda telah men-deploy aplikasi web App Engine. Pada Langkah 1, Anda membatasi akses ke aplikasi hanya untuk pengguna yang Anda pilih. Pada Langkah 2, Anda mengambil dan menampilkan identitas pengguna yang diizinkan oleh IAP untuk mengakses aplikasi Anda, dan melihat bagaimana informasi tersebut dapat di-spoofing jika IAP dinonaktifkan atau dilewati. Pada Langkah 3, Anda memverifikasi pernyataan identitas pengguna yang ditandatangani secara kriptografis, yang tidak dapat di-spoofing.

7. Pembersihan

Satu-satunya resource Google Cloud Platform yang Anda gunakan dalam codelab ini adalah instance App Engine. Setiap kali Anda men-deploy aplikasi, versi baru akan dibuat dan akan tetap ada hingga aplikasi tersebut dihapus. Keluar dari lab untuk menghapus project dan semua resource di dalamnya.