ตั้งค่า phpMyAdmin บน Kubernetes ให้เชื่อมต่อไปยัง AWS RDS เเบบ SSL

โดยทั่วไปเเล้ว การที่เราจะเข้าไปจัดการ Database กัน ถ้าเป็นตระกูล SQL ทั้งหลาย อย่างเช่น MySQL หรือ MariaDB ที่เราๆคุ้นเคยกัน เราก็มักจะใช้ phpMyAdmin กันใช่มั๊ยครับ เพราะมันง่ายดี เเละ Manage ผ่านหน้าเว็บได้ด้วย

แต่ก็มีเรื่องของความปลอดภัยเข้ามาเกี่ยวข้องนิดนึง เพราะการเชื่อมต่อระหว่าง phpMyAdmin ไปยัง Database ไม่ได้ทำการเข้ารหัสไว้ ซึ่งเเน่นอนว่ามันอาจโดนดักฟังเอาได้

และใน AWS RDS (ในนี้ใช้เเบบ MariaDB) ก็รองรับการเชื่อมต่อเเบบ SSL ด้วย (หรืออาจเป็น TLS ด้วยไม่เเน่ใจ เเต่คือการใช้อะไรพวกนี้มาเข้ารหัสนี่เเหละครับ) ซึ่งช่วยในการเข้ารหัสการเชื่อมต่อ ทำให้ไม่สามามารถดักฟังได้โดยง่าย

ในบทความนี้เราจะมาตั้งค่าให้ phpMyAdmin เชื่อมต่อไปยัง AWS RDS ให้มันเข้ารหัสกันครับ

สำหรับ Environment ที่ผมใช้อ้างอิงในการเขียนบทความนี้เป็นเเบบนี้ครับ

  • phpMyAdmin ลงบน Kubernetes จำนวน 1 Pod เเละเปิดเป็น NodePort เอาไว้ จากนั้นใช้ Nginx ที่ลงบน EC2 อีกตัวนึงเเยกต่างหาก (เป็น Dev Server ไม่ได้อยู่บน K8S Cluster) ทำ Revers Proxy กลับมาหา phpMyAdmin หรือจะใช้ Ingress Controller ก็ได้ ตามสะดวกเลยครับ ส่วน Docker image ใช้ของ phpmyadmin/phpmyadmin เลย ไม่ได้เอามาปรับเเต่งอะไร
  • AWS RDS ใช้เป็นเเบบ MariaDB ตั้งค่าเป็นเเบบ Private

การตั้งค่าก็ไม่ยากครับ มาลุยกันเลย

สร้าง file ชื่อ config.user.inc.php ขึ้นมา จากนั้นก็เขียน Code PHP ลงไป หน้าตาก็จะออกมาประมาณนี้ อันนี้เข้าใจว่าเป็น Config ที่ให้ User เขียนเพิ่มเติมเอาเอง สังเกตชื่อ file ดูนะครับ มีคำว่า .user เเทรกเข้ามา อันนี้ถ้าใครเล่น phpMyAdmin ก็คงรู้ว่า file config ของมัน ตัวหลักก็คือ config.inc.php นั่นเอง

<?php
    $cfg[‘Servers’][2][‘ssl’] = true;
    $cfg[‘Servers’][2][‘ssl_verify’] = true;
    $cfg[‘Servers’][2][‘ssl_ca’] = ‘/etc/phpmyadmin/rds-ca-2019-root.pem’;
?> 

บรรทัดเเรก ก็คือเปิดใช้ SSL บรรทัดต่อมาก็คือกำหนดให้ Verrify SSL ด้วย บรรทัดสุดท้ายก็คือกำหนด CA Cert ที่เราโหลดมาจากเว็บของ AWS นะครับ

ปล.นับบรรทัดเเรกที่ $cfg ไม่ได้นับจาก <?php นะครับ 😀

จากนั้นสังเกตตรงเลข [2] นะครับ อันนี้จะเเตกต่างกันไปตามเเต่ Environment เเล้วเเต่ว่าเราจะตั้งค่าให้ phpMyAdmin สามารถเชื่อมต่อไปหา Server ได้กี่ตัว อย่างของผมมี Server อยู่ 2 ตัวครับ ตัวเเรกจะเป็น MySQL บน k8s ตัวที่สองก็คือ RDS ดังนั้นหมายเลขตรงนี้ก็ต้องใส่เป็นหมายเลข 2 นะครับ ส่วนหมายเลข 0 อันนี้เข้าใจว่าหมายถึง localhost

ส่วนถ้าอธิบายเเบบ Programming หน่อยๆ ก็คือมันเป็น Index of Array ครับ

จะใช้เลขไหนก็ขึ้นกับการตั้งค่านะครับ ลองใส่ดู ถ้าไม่ได้ก็เปลี่ยน 55555+

อีกอย่างนึง ใครใช้ External Name เพื่อ Map Domain Name ของ RDS เข้ากับชื่อ Service ที่ตั้งขึ้นเอง เเล้วเอาชื่อนี้เป็น hosname เพื่อต่อไปหา RDS มันใช้ไม่ได้นะครับ จะโดนฟ้องมาว่า Hostname ไม่ตรงกัน ถ้าอยากทำเเบบนี้ ตรง ssl_verify ตั้งเป็น false ดูนะครับ คิดว่าใช้ได้ เเต่ผมเองยังไม่ได้ลอง 555+

จากนั้นก็ไปโหลด File CA Cert จาก AWS มานะครับ ให้โหลด File Cert ตัวใหม่ด้วย ถ้าใครตามข่าวก็จะรู้ว่า Cert เดิมมันจะหมดอายุ ทาง AWS เค้าก็บอกข่าวให้เราๆ มา Rotate Cert กันอยู่

โหลดได้จากที่นี่เลยครับ

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html

ส่วนใครที่สร้าง RDS Instance ขึ้นใหม่ มันจะใช้ Cert ตัวใหม่ล้ะครับ

ณ ตอนนี้เราก็มี 2 file ที่ต้อง Copy เอาไปวางใน phpMyAdmin Pod ก็คือ

config.user.inc.php และ rds-ca-2019-root.pem

ซึ่งเราก็จัดการ Copy เข้าไปใน Pod ด้วยคำสั่ง

$ kubectl cp rds-ca-2019-root.pem <pod_name>:/etc/phpmyadmin/rds-ca-2019-root.pem
$ kubectl cp config.user.inc.php <pod_name>:/etc/phpmyadmin/config.user.inc.php

จากนั้นก็จัดการ Log in เข้าไปยัง phpMyAdmin ทางหน้าเว็บเลยครับ ถ้าสำเร็จมันจะ Log in ได้ เเละจะไม่มีข้อความสีเเดงๆเตือนล้ะ ว่าไม่ได้ใช้ SSL ในการเชื่อมต่อไปหา DB

อันนี้ตัวอย่างของผมเอง สังเกตตรงกรอบสีเขียวนะครับ มันจะบอกว่าการเชื่อมต่อเป็น SSL เเล้ว ซึ่งก่อนหน้ามันจะขึ้นเป็นอักษรสีเเดง

แต่เนื่องจากว่าในเคสนี้เป็น k8s นะครับ หาก Pod ตายขึ้นมา หรือมีความจำเป็นอะไรที่ทำให้มีการสร้าง Pod ใหม่ขึ้นมา เช่นการ update k8s อะไรเเบบนี้ ก็จะทำให้ file 2 file ที่เรา Copy ลงไปวางใน Pod หายไปด้วย ถ้าไม่อยากให้เกิดเคสนี้ ก็จัดการ Build Docker Image ใช้เองนะครับ แล้วใส่คำสั่ง copy 2 file นี้ลงไป ก็ใช้ได้เเล้ว

เพียงเเค่นี้เราก็ได้การเชื่อมต่อที่มีการเข้ารหัสล้ะครับ

ส่วนความจำเป็น อันนี้ก็เเล้วเเต่งาน หรือ Requirement เลยครับ การเปิด SSL ขึ้นมาก็ทำให้ใช้เวลาเพิ่มขึ้น ในการเข้ารหัส ถอดรหัสอีก

Network / Cloud Engineer , Instructor / Blogger
รักเเละหลงไหลไปกับเทคโนโลยีต่างๆมากมาย

Leave A Reply