phpMyAdmin: ติดตั้งบน Ubuntu อย่างปลอดภัย จำกัด IP ใช้ HTTPS

ติดตั้ง phpMyAdmin บน Ubuntu แบบไม่เปิดช่องโหว่ เปลี่ยน URL จำกัด IP เพิ่ม Basic Auth บังคับ HTTPS ห้ามล็อกอิน root หรือเลือกใช้ผ่าน SSH Tunnel อย่างเดียว

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที

แชร์FacebookXLINELinkedIn
phpMyAdmin — phpMyAdmin: ติดตั้งบน Ubuntu อย่างปลอดภัย จำกัด IP ใช้ HTTPS
phpMyAdmin: ติดตั้งบน Ubuntu อย่างปลอดภัย จำกัด IP ใช้ HTTPS

คำตอบสั้น ๆ: ติดตั้ง phpMyAdmin บน Ubuntu แบบไม่เปิดช่องโหว่ เปลี่ยน URL จำกัด IP เพิ่ม Basic Auth บังคับ HTTPS ห้ามล็อกอิน root หรือเลือกใช้ผ่าน SSH Tunnel อย่างเดียว

คู่มือนี้อธิบาย phpMyAdmin ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

phpMyAdmin คือเครื่องมือจัดการฐานข้อมูล MySQL และ MariaDB ผ่านเว็บเบราว์เซอร์ที่คนใช้มากที่สุด สะดวกสำหรับดูตาราง แก้ข้อมูล นำเข้าและส่งออกไฟล์ SQL โดยไม่ต้องจำคำสั่ง แต่ก็เป็นหน้าเว็บที่บอตสแกนหามากที่สุดเช่นกัน เพราะถ้าเจาะได้ก็เข้าถึงข้อมูลทั้งหมดได้ทันที การติดตั้งด้วยค่าเริ่มต้นแล้วเปิดไว้ที่ /phpmyadmin ให้ทุกคนบนอินเทอร์เน็ตเห็นจึงเป็นความเสี่ยงที่ไม่ควรรับ

คู่มือนี้ติดตั้งบน Ubuntu ร่วมกับ Apache แล้วซ้อนการป้องกันหลายชั้น ได้แก่ เปลี่ยน URL จำกัด IP เพิ่มรหัสผ่านชั้นที่สองด้วย Basic Auth บังคับ HTTPS และห้ามล็อกอินด้วย root พร้อมทางเลือกที่ปลอดภัยที่สุดคือไม่เปิดสู่ภายนอกเลยและเข้าผ่าน SSH Tunnel

แผนภาพการป้องกัน phpMyAdmin หลายชั้น ตั้งแต่ HTTPS การจำกัด IP และ Basic Auth ของ Apache จนถึงผู้ใช้ MySQL ที่ไม่ใช่ root
ผู้โจมตีต้องผ่านทุกชั้นก่อนถึงหน้าล็อกอิน และ root ใช้ล็อกอินผ่านเว็บไม่ได้

สิ่งที่ต้องเตรียม

  • Cloud Server ที่ใช้ Ubuntu 22.04 หรือ 24.04 พร้อม Apache, PHP และ MySQL หรือ MariaDB ทำงานอยู่แล้ว
  • บัญชีที่ใช้ sudo ได้ และเข้า MySQL ด้วย sudo mysql ได้
  • IP สาธารณะของออฟฟิศหรือเครื่องผู้ดูแลที่จะอนุญาต
  • โดเมนย่อยที่ชี้มาที่เซิร์ฟเวอร์ เช่น db.example.com สำหรับออกใบรับรอง HTTPS
  • ถ้าใช้ Plesk หรือ DirectAdmin อยู่แล้ว แผงควบคุมมีเครื่องมือนี้ให้ในตัว ไม่ต้องติดตั้งเพิ่ม

ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ phpMyAdmin

sudo apt update
sudo apt install phpmyadmin php-mbstring

ระหว่างติดตั้งจะมีหน้าต่างถามสองเรื่อง หน้าแรกให้เลือกเว็บเซิร์ฟเวอร์ กด Spacebar ให้มีเครื่องหมาย * หน้า apache2 ก่อนกด Enter ถ้าไม่ทำ ระบบจะไม่สร้างคอนฟิกของ Apache ให้ หน้าที่สองถามว่าจะตั้งฐานข้อมูลด้วย dbconfig-common หรือไม่ ให้ตอบ Yes แล้วตั้งรหัสผ่านที่แข็งแรงสำหรับผู้ใช้ควบคุมภายในของโปรแกรม

ขั้นตอนที่ 2: สร้างผู้ใช้ฐานข้อมูลสำหรับจัดการ

บน Ubuntu ผู้ใช้ root ของ MySQL ยืนยันตัวตนด้วย auth_socket และของ MariaDB ใช้ unix_socket ซึ่งล็อกอินจากหน้าเว็บไม่ได้ นี่คือสิ่งที่ดีและไม่ควรแก้ ให้สร้างผู้ใช้แยกที่มีสิทธิ์เท่าที่ต้องใช้แทน

sudo mysql
CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'Use-A-Long-Random-Password-2026';
GRANT ALL PRIVILEGES ON appdb.* TO 'dbadmin'@'localhost';
EXIT;

ถ้าผู้ใช้คนนี้ดูแลเพียงฐานข้อมูลเดียว ให้สิทธิ์เฉพาะฐานข้อมูลนั้นตามตัวอย่าง อย่าให้ ALL ON *.* ถ้าไม่จำเป็น ดูรูปแบบการให้สิทธิ์เพิ่มเติมใน คู่มือสร้างผู้ใช้และกำหนดสิทธิ์ MySQL

ขั้นตอนที่ 3: เปลี่ยน URL และจำกัด IP

เปิดไฟล์คอนฟิกที่แพ็กเกจสร้างให้ Apache ด้วย sudo nano /etc/phpmyadmin/apache.conf แก้บรรทัด Alias บรรทัดแรกให้เป็น URL ที่เดายาก แล้วเพิ่มบรรทัด Require ip ไว้ในบล็อก Directory แรก

Alias /dbadmin-7f3k /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    Require ip 198.51.100.0/24 203.0.113.25
sudo apachectl configtest
sudo systemctl reload apache2

configtest ต้องตอบ Syntax OK ก่อน reload ทุกครั้ง การเปลี่ยน URL ไม่ได้ป้องกันผู้โจมตีที่ตั้งใจ แต่ตัดบอตที่ยิงหา /phpmyadmin ทั้งวันออกไปได้เกือบหมด ส่วน Require ip คือชั้นป้องกันจริง ถ้าเซิร์ฟเวอร์อยู่หลัง Cloudflare หรือ Load Balancer ค่า IP ที่ Apache เห็นจะเป็นของตัวกลาง ต้องตั้ง mod_remoteip ก่อนจึงจะจำกัด IP ได้ถูกต้อง

ขั้นตอนที่ 4: เพิ่มรหัสผ่านชั้นที่สองด้วย Basic Auth

สร้างไฟล์รหัสผ่านของ Apache แยกจากรหัสผ่านฐานข้อมูล ผู้ที่หลุดผ่าน IP มาได้ก็ยังต้องผ่านรหัสชั้นนี้ก่อนจะเห็นหน้าล็อกอิน

sudo htpasswd -c /etc/apache2/.htpasswd-dbadmin opsadmin

จากนั้นแทนบรรทัด Require ip ในขั้นตอนที่ 3 ด้วยชุดนี้ เพื่อบังคับให้ผ่านทั้งสองเงื่อนไขพร้อมกัน

    AuthType Basic
    AuthName "Restricted"
    AuthUserFile /etc/apache2/.htpasswd-dbadmin
    <RequireAll>
        Require ip 198.51.100.0/24 203.0.113.25
        Require valid-user
    </RequireAll>

ตรวจด้วย configtest แล้ว reload Apache อีกครั้ง เปิด URL ใหม่จะเห็นกล่องถามชื่อผู้ใช้และรหัสผ่านของเบราว์เซอร์ก่อนหน้าล็อกอินปกติ

ขั้นตอนที่ 5: บังคับ HTTPS ด้วย Let's Encrypt

Basic Auth และรหัสผ่านฐานข้อมูลจะถูกส่งเป็นข้อความที่อ่านได้ถ้ายังใช้ HTTP ขอใบรับรองฟรีให้โดเมนย่อยด้วย certbot

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d db.example.com

certbot จะสร้าง VirtualHost สำหรับพอร์ต 443 และตั้งให้ HTTP เปลี่ยนเส้นทางไป HTTPS อัตโนมัติ รวมถึงตั้งงานต่ออายุใบรับรองให้ ทดสอบการต่ออายุได้ด้วย sudo certbot renew --dry-run

ขั้นตอนที่ 6: ห้ามล็อกอิน root และตั้งเวลาออกจากระบบ

แม้ root จะล็อกอินผ่านเว็บไม่ได้อยู่แล้ว ควรปิดไว้ที่ตัวโปรแกรมด้วย เผื่อมีคนเปลี่ยนวิธียืนยันตัวตนของ root ในอนาคต สร้างไฟล์ /etc/phpmyadmin/conf.d/hardening.php ด้วยเนื้อหานี้

<?php
$cfg['Servers'][1]['AllowRoot'] = false;
$cfg['LoginCookieValidity'] = 1200;

ค่าแรกปฏิเสธการล็อกอินด้วยชื่อ root บนเซิร์ฟเวอร์ลำดับที่ 1 ค่าที่สองออกจากระบบอัตโนมัติเมื่อไม่ได้ใช้งาน 20 นาที ค่านี้ต้องไม่มากกว่า session.gc_maxlifetime ของ PHP ซึ่งค่าเริ่มต้นคือ 1440 วินาที ไม่เช่นนั้นจะมีคำเตือนบนหน้าเว็บ

ขั้นตอนที่ 7: ทางเลือกที่ปลอดภัยที่สุดคือเข้าผ่าน SSH Tunnel

ถ้าผู้ดูแลมีไม่กี่คน ไม่จำเป็นต้องเปิดหน้าเว็บสู่ภายนอกเลย เปลี่ยนบรรทัด Require ในขั้นตอนที่ 3 เป็น Require local แล้วสร้างอุโมงค์จากเครื่องของคุณ

ssh -L 8080:127.0.0.1:80 [email protected]

ขณะที่ session นี้เปิดอยู่ ให้เข้า http://localhost:8080/dbadmin-7f3k/ บนเบราว์เซอร์ของเครื่องตัวเอง ข้อมูลทั้งหมดวิ่งผ่าน SSH ที่เข้ารหัสแล้ว ส่วนผู้ที่ใช้ Docker เรียกใช้อิมเมจทางการได้ด้วย docker run -d --name pma -p 127.0.0.1:8080:80 -e PMA_HOST=10.0.0.5 phpmyadmin:5.2 ซึ่งผูกพอร์ตไว้กับ localhost เท่านั้น ดูวิธีตั้งอุโมงค์แบบละเอียดได้ใน คู่มือ SSH Tunnel

ตารางเปรียบเทียบการเปิด phpMyAdmin ผ่านเว็บแบบจำกัด IP กับการเข้าผ่าน SSH Tunnel ทั้งพอร์ตที่เปิดและความสะดวก
ทีมเล็กที่มีคีย์ SSH อยู่แล้วควรเลือก SSH Tunnel เพราะไม่ต้องเปิดหน้าเว็บสู่ภายนอก

ตรวจสอบว่าการป้องกันทำงานครบทุกชั้น

ทดสอบจากภายนอกด้วย curl ให้ครบทั้งสี่กรณี URL เดิมต้องไม่พบหน้า IP ที่ไม่ได้รับอนุญาตต้องถูกปฏิเสธ IP ที่อนุญาตแต่ไม่ใส่รหัสต้องถูกถามรหัส และใส่รหัสถูกต้องจึงเห็นหน้าล็อกอิน

หน้าจอ curl ทดสอบ URL เดิมได้ 404 IP นอกรายการได้ 403 ไม่ใส่รหัสได้ 401 และใส่รหัสถูกได้ 200
ผลลัพธ์ที่ถูกต้องต้องได้ครบทั้ง 404, 403, 401 และ 200 ตามเงื่อนไข

เปิด log ของ Apache ที่ /var/log/apache2/access.log เป็นระยะ ถ้าพบคำขอจำนวนมากที่ได้ 401 จาก IP เดียว แปลว่ามีคนพยายามเดารหัส Basic Auth ควรตรวจสอบรายการ IP ที่อนุญาตอีกครั้ง

ปัญหาที่พบบ่อยเกี่ยวกับ phpMyAdmin

ล็อกอินด้วย root แล้วขึ้น #1698 Access denied for user root@localhost ต้องทำอย่างไร?

เป็นพฤติกรรมปกติของ Ubuntu เพราะ root ยืนยันตัวตนผ่าน socket ไม่ใช่รหัสผ่าน ไม่ควรเปลี่ยน root ให้ใช้รหัสผ่านเพื่อให้ล็อกอินผ่านเว็บได้ ให้ใช้ผู้ใช้ dbadmin ที่สร้างในขั้นตอนที่ 2 แทน

ติดตั้งแล้วขึ้น Your password does not satisfy the current policy requirements แก้อย่างไร?

MySQL เปิดคอมโพเนนต์ตรวจความแข็งแรงของรหัสผ่านไว้ และรหัสผ่านที่ตั้งให้ผู้ใช้ควบคุมระหว่างติดตั้งไม่ผ่านเกณฑ์ เลือก retry ในหน้าต่างถัดไปแล้วตั้งรหัสที่ยาวขึ้น ผสมตัวพิมพ์ใหญ่ เล็ก ตัวเลข และสัญลักษณ์ หรือรันการตั้งค่าใหม่ภายหลังด้วย sudo dpkg-reconfigure phpmyadmin

เปิด URL แล้วเจอ 404 Not Found ทั้งที่ติดตั้งเสร็จแล้ว เกิดจากอะไร?

มักเกิดจากไม่ได้กด Spacebar เลือก apache2 ตอนติดตั้ง ทำให้คอนฟิกไม่ถูกเปิดใช้ แก้ด้วย sudo a2enconf phpmyadmin แล้ว sudo systemctl reload apache2 และอย่าลืมว่าถ้าเปลี่ยน Alias แล้ว URL เดิมจะเป็น 404 ตามที่ตั้งใจ

ตั้ง Require ip แล้วยังเข้าไม่ได้จากออฟฟิศ ต้องตรวจอะไร?

IP สาธารณะของออฟฟิศอาจเปลี่ยนไปแล้ว หรือออกอินเทอร์เน็ตผ่าน IP คนละชุดกับที่คิด ดู IP จริงที่ Apache เห็นได้จากบรรทัดล่าสุดใน access.log แล้วนำไปใส่ในรายการ ถ้าใช้อินเทอร์เน็ตที่ IP เปลี่ยนบ่อย การเข้าผ่าน SSH Tunnel ตามขั้นตอนที่ 7 สะดวกกว่า

รายการตรวจความปลอดภัยของ phpMyAdmin ทั้ง URL การจำกัด IP Basic Auth HTTPS และการห้าม root
ข้อสีแดงคือการตั้งค่าที่พบบ่อยในเซิร์ฟเวอร์ที่ถูกเจาะ แก้ก่อนเปิดใช้

ต้องการเซิร์ฟเวอร์ฐานข้อมูลที่ตั้งค่าความปลอดภัยไว้ให้ตั้งแต่ต้น หรือให้ช่วยตรวจระบบที่เปิดอยู่ ติดต่อทีมงาน THAI DATA CLOUD หรือดูเครื่องที่ Cloud Server รายละเอียดการตั้งค่าทั้งหมดอ่านได้จาก เอกสารการติดตั้งและความปลอดภัยของ phpMyAdmin

อ่านเพิ่มเติมเกี่ยวกับ phpMyAdmin

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน