Latihan - Membatasi akses ke lingkungan Azure Container Apps

Selesai

Dalam unit ini, Anda memastikan bahwa database PostgreSQL hanya dapat diakses oleh aplikasi Quarkus, dan bukan oleh klien eksternal lainnya. Saat ini Anda dapat mengakses database dari klien mana pun dengan menggunakan Azure CLI dan menjalankan Quarkus secara lokal. Konfigurasi ini tidak aman. Anda perlu menambahkan aturan firewall untuk hanya mengizinkan alamat IP dalam lingkungan Azure Container Apps untuk mengakses server database.

Mengakses server PostgreSQL dengan menggunakan CLI

Pertama, pastikan Anda dapat mengakses server PostgreSQL dengan menggunakan Azure CLI. Untuk melakukannya, jalankan perintah ini:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Anda akan dapat melihat konten database. Jika bisa, database dapat diakses di luar lingkungan.

Menghapus aturan firewall permisif

Azure Database for PostgreSQL menyediakan keamanan secara default. Firewall-nya biasanya tidak mengizinkan koneksi masuk. Tetapi ketika Anda membuat server PostgreSQL, Anda menentukan parameter --public-access "All" untuk mengaktifkan akses eksternal, yang mengonfigurasi firewall agar terbuka untuk publik.

Anda dapat mencantumkan aturan firewall yang ada dengan menjalankan perintah ini:

az postgres flexible-server firewall-rule list \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --output table

Anda akan melihat output berikut:

EndIpAddress     Name                         ResourceGroup           StartIpAddress
---------------  ---------------------------  ----------------------  ----------------
255.255.255.255  AllowAll_2025-2-26_16-57-40  rgazure-deploy-quarkus  0.0.0.0

Perhatikan bahwa rentang alamat IP yang diizinkan 0.0.0.0 melalui 255.255.255.255. Aturan firewall seperti ini memungkinkan klien mana pun mengakses database. Untuk memastikan bahwa hanya aplikasi Quarkus yang dapat mengakses database, Anda perlu memperbarui aturan firewall server PostgreSQL. Dalam hal ini, itu hanya masalah menghapus aturan publik. Untuk menghapusnya, jalankan perintah berikut:

az postgres flexible-server firewall-rule delete \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name <name of the AllowAll firewall rule> \
    --yes

Sekarang coba kueri database dengan menjalankan pernyataan SQL dari CLI:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Panggilan akhirnya kehabisan waktu. Anda akan melihat pesan ini:

Unable to connect to flexible server: connection to server failed: Operation timed out

Karena Anda menghapus semua aturan firewall, sekarang bahkan aplikasi Quarkus tidak dapat mengakses database. Jika Anda mencoba mengambil daftar tugas dari database, permintaan tersebut gagal. Jalankan permintaan cURL berikut:

curl https://$AZ_APP_URL/api/todos

Menambahkan aturan firewall baru

Anda perlu mengonfigurasi firewall untuk mengizinkan akses hanya ke aplikasi Quarkus. Anda perlu menambahkan aturan firewall baru. Untuk menambahkan aturan, jalankan perintah ini:

az postgres flexible-server firewall-rule create \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --resource-group "$AZ_RESOURCE_GROUP" \
    --rule-name "Allow_Azure-internal-IP-addresses" \
    --start-ip-address "0.0.0.0" \
    --end-ip-address "0.0.0.0"

Mengatur start-ip-address dan end-ip-address ke 0.0.0.0 memungkinkan akses dari semua alamat IP internal Azure tetapi tidak mengizinkan akses dari alamat IP eksternal. Praktik ini membantu mengamankan database dari akses eksternal.

Jika Anda mencoba mengakses database dari CLI dengan menjalankan perintah berikut, upaya akan gagal:

az postgres flexible-server execute \
    --name "$AZ_POSTGRES_SERVER_NAME" \
    --database-name "$AZ_POSTGRES_DB_NAME" \
    --admin-user "$AZ_POSTGRES_USERNAME" \
    --admin-password "$AZ_POSTGRES_PASSWORD" \
    --querytext "select * from Todo" \
    --output table

Tetapi jika Anda mencoba menggunakan perintah berikut untuk mengambil tugas dari database melalui aplikasi Quarkus yang berjalan di Container Apps, upaya berhasil:

curl https://$AZ_APP_URL/api/todos

Perintah ini mengembalikan daftar semua item to-do dari database. Server PostgreSQL dapat diakses dari aplikasi Quarkus yang berjalan pada layanan Azure, tetapi tidak dapat diakses dari luar Azure.