แบบฝึกหัด - จํากัดการเข้าถึงสภาพแวดล้อม Azure Container Apps

เสร็จสมบูรณ์เมื่อ

ในหน่วยนี้ คุณแน่ใจว่าฐานข้อมูล PostgreSQL สามารถเข้าถึงได้โดยแอปพลิเคชัน Quarkus เท่านั้น และไม่ใช่จากไคลเอ็นต์ภายนอกอื่น ขณะนี้คุณสามารถเข้าถึงฐานข้อมูลจากไคลเอ็นต์ใด ๆ ได้โดยใช้ Azure CLI และเรียกใช้ Quarkus ภายในเครื่อง การกําหนดค่านี้ไม่ปลอดภัย คุณจําเป็นต้องเพิ่มกฎไฟร์วอลล์เพื่ออนุญาตเฉพาะที่อยู่ IP ภายในสภาพแวดล้อม Azure Container Apps เพื่อเข้าถึงเซิร์ฟเวอร์ฐานข้อมูล

เข้าถึงเซิร์ฟเวอร์ PostgreSQL โดยใช้ CLI

ก่อนอื่น ตรวจสอบให้แน่ใจว่า คุณสามารถเข้าถึงเซิร์ฟเวอร์ PostgreSQL โดยใช้ Azure 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

คุณควรจะเห็นเนื้อหาของฐานข้อมูล ถ้าทําได้ คุณสามารถเข้าถึงฐานข้อมูลภายนอกสภาพแวดล้อมได้

ลบกฎไฟร์วอลล์ที่อนุญาต

ฐานข้อมูล Azure สําหรับ PostgreSQL มีการรักษาความปลอดภัยตามค่าเริ่มต้น ไฟร์วอลล์มักจะไม่อนุญาตการเชื่อมต่อที่เข้ามา แต่เมื่อคุณสร้างเซิร์ฟเวอร์ PostgreSQL คุณระบุพารามิเตอร์ --public-access "All" เพื่อเปิดใช้งานการเข้าถึงภายนอกซึ่งกําหนดค่าไฟร์วอลล์ให้เปิดไปยังสาธารณะ

คุณสามารถแสดงกฎไฟร์วอลล์ที่มีอยู่ได้โดยการเรียกใช้คําสั่งนี้:

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

คุณควรเห็นผลลัพธ์ต่อไปนี้:

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

โปรดสังเกตว่าช่วงของที่อยู่ IP ที่ได้รับอนุญาตจะ 0.0.0.0 ผ่าน 255.255.255.255 กฎไฟร์วอลล์เช่นนี้อนุญาตให้ไคลเอ็นต์ใด ๆ เข้าถึงฐานข้อมูลได้ เพื่อให้แน่ใจว่าเฉพาะแอปพลิเคชัน Quarkus เท่านั้นที่สามารถเข้าถึงฐานข้อมูลได้ คุณจําเป็นต้องอัปเดตกฎไฟร์วอลล์ของเซิร์ฟเวอร์ PostgreSQL ในกรณีนี้เป็นเพียงการเอากฎสาธารณะออก หากต้องการลบ ออก ให้เรียกใช้คําสั่งต่อไปนี้:

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

ในตอนนี้ให้ลองคิวรีฐานข้อมูลโดยการเรียกใช้คําสั่ง SQL จาก 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

การโทรจะหมดเวลาในที่สุด คุณควรเห็นข้อความนี้:

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

เนื่องจากคุณได้ลบกฎไฟร์วอลล์ทั้งหมดแล้ว ตอนนี้แม้แต่แอปพลิเคชัน Quarkus ก็ไม่สามารถเข้าถึงฐานข้อมูลได้ ถ้าคุณพยายามเรียกใช้สิ่งที่ต้องปฏิบัติจากฐานข้อมูล คําขอจะล้มเหลว เรียกใช้คําขอ cURL ต่อไปนี้:

curl https://$AZ_APP_URL/api/todos

เพิ่มกฎไฟร์วอลล์ใหม่

คุณจําเป็นต้องกําหนดค่าไฟร์วอลล์เพื่ออนุญาตให้เข้าถึงเฉพาะแอปพลิเคชัน Quarkus เท่านั้น คุณจําเป็นต้องเพิ่มกฎไฟร์วอลล์ใหม่ หากต้องการเพิ่มกฎ ให้เรียกใช้คําสั่งนี้:

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"

การตั้งค่า start-ip-address และ end-ip-address เป็น 0.0.0.0 จะอนุญาตการเข้าถึงจากที่อยู่ IP ภายใน Azure ทั้งหมด แต่ไม่อนุญาตให้มีการเข้าถึงจากที่อยู่ IP ภายนอก แนวทางปฏิบัตินี้จะช่วยรักษาความปลอดภัยฐานข้อมูลจากการเข้าถึงภายนอก

หากคุณพยายามเข้าถึงฐานข้อมูลจาก 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

แต่ถ้าคุณลองใช้คําสั่งต่อไปนี้เพื่อดึงสิ่งที่ต้องทําจากฐานข้อมูลผ่านแอปพลิเคชัน Quarkus ที่ทํางานบน Container Apps ความพยายามจะประสบความสําเร็จ:

curl https://$AZ_APP_URL/api/todos

คําสั่งนี้แสดงรายการ to-do ทั้งหมดจากฐานข้อมูล สามารถเข้าถึงเซิร์ฟเวอร์ PostgreSQL ได้จากแอปพลิเคชัน Quarkus ที่กําลังทํางานบนบริการ Azure แต่ไม่สามารถเข้าถึงได้จากภายนอก Azure