บทความนี้จะพาคุณติดตั้ง phpMyAdmin ผ่านแพ็กเกจระบบ (apt) เพื่อความง่ายในการดูแลรักษาและอัปเดตความปลอดภัยในระยะยาว โดยเราจะยกระดับการป้องกันด้วยเทคนิค สุ่ม Subdomain ลับ (Obscurity Subdomain), จำกัดสิทธิ์พื้นที่การทำงานของกระบวนการ PHP ด้วย open_basedir และ ทำระบบล็อกซ้ำชั้นหน้าบ้านด้วย HTTP Basic Auth เพื่อสกัดกั้นการสแกนจากบอทภายนอกได้แบบ 100%
📦 ขั้นตอนที่ 1: ติดตั้ง phpMyAdmin ผ่าน apt
เนื่องจากระบบของเราขับเคลื่อนด้วย Nginx เป็นหลัก เราจะไม่ติดตั้งซอฟต์แวร์ร่วมกับ Apache เพื่อหลีกเลี่ยงความซ้ำซ้อนและประหยัดทรัพยากรของเครื่องเซิร์ฟเวอร์
# อัปเดตแพ็กเกจระบบ
sudo apt update
sudo apt install phpmyadmin -y
⚠️ ข้อควรระวังระหว่างขั้นตอนติดตั้ง
- เมื่อระบบแสดงหน้าจอเมนูสีฟ้าถามเรื่อง Web Server (
apache2หรือlighttpd) ไม่ต้องเลือกตัวเลือกใด ๆ ให้กดปุ่มTabบนคีย์บอร์ดเพื่อเลื่อนมาที่ปุ่ม แล้วกดEnterทันที (เนื่องจากเราจะใช้ Nginx) - เมื่อระบบถามเรื่องการสร้างฐานข้อมูลด้วย
dbconfig-commonให้เลือกตอบ จากนั้นกำหนดรหัสผ่านเพื่อระบบจะสุ่มสร้างฐานข้อมูลภายในของตัวโปรแกรมเองโดยอัตโนมัติ
🔐 ขั้นตอนที่ 2: ตั้งค่าความปลอดภัยและสุ่ม Blowfish Secret
หากตรวจสอบไฟล์คอนฟิกแล้วพบว่าคีย์ระบบว่างเปล่า เราจำเป็นต้องสร้างสตริงรหัสลับขึ้นมาเอง เพื่อใช้ในการเข้ารหัสและป้องกันการดักจับเซสชัน (Session Cookie)
- เจนสตริงสุ่มความยาว 32 ตัวอักษร
รันคำสั่งนี้บน Terminal เพื่อสร้างชุดรหัสสุ่มที่มีความปลอดภัยสูงopenssl rand -base64 32
(คัดลอกข้อความสตริงผลลัพธ์ยาว ๆ ที่ได้จากหน้าจอเอาไว้) - นำไปเติมในไฟล์คอนฟิกเสริมของระบบ
เปิดไฟล์ที่เก็บคีย์ความปลอดภัยsudo nano /var/lib/phpmyadmin/blowfish_secret.inc.php
นำคีย์ที่คัดลอกมาวางไว้ภายในเครื่องหมายคำพูดเดี่ยว<?php $cfg['blowfish_secret'] = 'YOUR_GENERATED_OPENSSL_RANDOM_STRING';
- ผูก Path โฟลเดอร์เสริมเข้ากับไฟล์คอนฟิกหลัก
เปิดไฟล์คอนฟิกหลักของ phpMyAdminsudo nano /etc/phpmyadmin/config.inc.php
เลื่อนลงไปด้านล่างสุดของไฟล์ แล้วเพิ่มการผูก Path โฟลเดอร์สำหรับรองรับไฟล์อัปเดตขนาดใหญ่และระบบแคช (UploadDir,SaveDir,TempDir) เข้าไปดังนี้/* * Directories for saving/loading files from server */ $cfg['UploadDir'] = '/var/lib/phpmyadmin/upload'; $cfg['SaveDir'] = '/var/lib/phpmyadmin/save'; $cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
- สร้างไดเรกทอรีจริงและส่งมอบสิทธิ์ให้ PHP-FPM
รันคำสั่งสร้างโฟลเดอร์จริงบน Ubuntu และปรับสิทธิ์ Owner ให้กระบวนการทำงานของ PHP (www-data) สามารถอ่านและเขียนไฟล์ได้อย่างรัดกุม# Create target physical directories sudo mkdir -p /var/lib/phpmyadmin/upload sudo mkdir -p /var/lib/phpmyadmin/save sudo mkdir -p /var/lib/phpmyadmin/tmp # Reassign granular workspace permissions sudo chown -R www-data:www-data /var/lib/phpmyadmin sudo chmod 750 /var/lib/phpmyadmin/upload sudo chmod 750 /var/lib/phpmyadmin/save sudo chmod 777 /var/lib/phpmyadmin/tmp
🔒 ขั้นตอนที่ 3: สร้างระบบล็อกหน้าบ้าน (สุ่ม Nginx Username & Password)
เพื่อป้องกันไม่ให้ผู้ไม่หวังดีหรือบอทภายนอกเข้ามาพยายามเดารหัสผ่านหน้าเว็บตรง ๆ เราจะทำระบบ HTTP Basic Authentication ครอบทับไว้อีกหนึ่งชั้น โดยผู้ใช้จะต้องกรอกรหัสผ่านระดับเว็บเซิร์ฟเวอร์ให้ผ่านก่อน จึงจะมองเห็นหน้าล็อกอินหลักของ phpMyAdmin
- ติดตั้งเครื่องมือช่วยเข้ารหัสรหัสผ่าน
sudo apt install apache2-utils -y - สุ่มสร้างไฟล์เก็บรหัสลับ
ใช้คำสั่งด้านล่างนี้สร้างรหัสผ่านโดยกำหนดชื่อผู้ใช้ (Username) เช่นphpmyadmin_secure_admin(คุณสามารถเปลี่ยนเป็นชื่ออื่นที่ต้องการได้) จากนั้นระบบจะให้คุณตั้งรหัสผ่านและเข้ารหัสเก็บไว้ในไฟล์ /etc/nginx/.pma_passwdsudo htpasswd -c /etc/nginx/.pma_passwdphpmyadmin_secure_admin
(กรอกรหัสผ่านที่ต้องการล็อกหน้าบ้านจำนวน 2 ครั้ง)
🌐 ขั้นตอนที่ 4: การตั้งค่าคอนฟิก Nginx ร่วมกับ Subdomain ลับ
แทนที่จะติดตั้งไว้ภายใต้โฟลเดอร์ของโดเมนหลักปกติ เราจะหันมาใช้สถาปัตยกรรม Dedicated Subdomain แบบสุ่มสายยาว เพื่อตัดช่องทางการค้นหาของบอทภายนอกออกไปโดยสิ้นเชิง
สร้าง Subdomain ลับopenssl rand -hex 24
(คัดลอกข้อความสตริงผลลัพธ์ยาว ๆ 24 ตัวที่ได้จากหน้าจอเอาไว้) เช่น
kl3gxpezqqzerk3kvprec57bgdvwwwuh
สร้างไฟล์คอนฟิกบล็อกเซิร์ฟเวอร์ของ Nginxsudo nano /etc/nginx/sites-available/phpmyadmin.conf
ใส่เนื้อหาคอนฟิกที่ผ่านการปรับจูนความปลอดภัยระดับ Enterprise Isolating ซึ่งมีการใช้เทคนิคกักบริเวณกระบวนการด้วย open_basedir ของระบบแพ็กเกจ apt และเปิดระบบล็อกหน้าบ้าน โดยคอมเมนต์โค้ดทั้งหมดด้วยภาษาอังกฤษดังนี้ครับ
# --- 1. Redirect HTTP to HTTPS ---
server {
listen 80;
listen [::]:80;
server_name kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com;
# Allow Let's Encrypt / Certbot ACME verification challenges to pass through
location /.well-known/acme-challenge/ {
root /usr/common/var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
# --- 2. Main HTTPS Block ---
server {
server_name kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com;
# --- Listen Ports for SSL + HTTP/3 ---
listen 443 ssl;
listen 443 quic; # (Re-useport parameter managed in central global configuration)
listen [::]:443 ssl;
listen [::]:443 quic;
# Global security and optimizations templates
include snippets/cloudflare.conf;
include snippets/http3.conf;
include snippets/security.conf;
# Target source directory paths for native apt deployment structures
root /usr/share/phpmyadmin;
index index.php index.html;
# --- SSL Certificates Configuration ---
ssl_certificate /etc/letsencrypt/live/kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# --- Client Buffering Adjustments for Heavy Data Operations ---
client_max_body_size 64M;
client_body_timeout 300s;
# --- 🔒 HTTP Basic Authentication Gatekeeping ---
auth_basic "Restricted Access - Database Administrator Only";
auth_basic_user_file /etc/nginx/.pma_passwd;
# --- PHP-FPM Handling Configuration ---
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.5-fpm.sock;
# 🔹 🔒 SECURITY BOUNDARY UPGRADE: open_basedir sandboxing
# Enforces isolation boundaries for the runtime execution environment.
# Restricts script traversals completely within targeted application contexts.
fastcgi_param PHP_VALUE "open_basedir=/tmp/:/var/lib/php/sessions/:/usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/";
fastcgi_read_timeout 300;
}
# --- Security Rule: Block Sensitive Files ---
# Intercepts and drops incoming inquiries trying to expose version or vendor data.
location ~ /^(README|LICENSE|CHANGE|CHANGELOG|composer\.json|config\.inc\.php) {
deny all;
}
# --- Static Assets Caching Optimization ---
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|svg|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
# Drop and block visibility over all hidden operational system assets (e.g. .git, .env)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
🔄 ขั้นตอนที่ 5: set ssl
เพิ่ม ssl ให้เปลี่ยน subdomain ให้ถูกต้อง และอาจจะต้องเปลี่ยน cloudflare เป็น Flexible ก่อน
sudo certbot certonly --webroot -w /usr/common/var/www/html -d kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com
ทดสอบว่าใช้ได้มั๋ยcurl -Iv https://kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com --resolve kl3gxpezqqzerk3kvprec57bgdvwwwuh.plusmagi.com:443:127.0.0.1
- ถ้าขึ้นตอบกลับว่า
HTTP/2 401 Unauthorized(ติด Basic Auth): แปลว่า Nginx ฝั่งเซิร์ฟเวอร์เราทำงานถูกต้องแล้ว ปัญหาอยู่ที่ Cloudflare - ถ้าขึ้น Error เรื่อง SSL/BIO: แปลว่าใน Nginx Config บรรทัด
ssl_certificateหรือinclude /etc/letsencrypt/options-ssl-nginx.conf;ยังชี้พิกัดไฟล์ผิดอยู่ครับ
🔄 ขั้นตอนที่ 6: ตรวจสอบคอนฟิกและทำการรีโหลดเว็บเซิร์ฟเวอร์
ก่อนจะสั่งให้บริการ Nginx ดึงค่าคอนฟิกไปใช้งานจริง เราต้องรันระบบทดสอบความถูกต้องของ Syntax เสมอเพื่อไม่ให้เว็บหลักระบบอื่นหยุดทำงาน
# 1. เชื่อมโยงไฟล์คอนฟิกเพื่อเปิดการใช้งาน (สั่งเฉพาะการติดตั้งครั้งแรก)
sudo ln -s /etc/nginx/sites-available/phpmyadmin.conf /etc/nginx/sites-enabled/
# 2. ตรวจสอบโครงสร้างไฟล์ Nginx ด้วยสิทธิ์ Super-user
sudo nginx -t
หากหน้าจอตอบกลับมาไม่มี Error บรรทัดสีแดง
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ให้สั่งสั่งประมวลผลคอนฟิกใหม่ได้ทันทีโดยที่เว็บไม่จำเป็นต้องหยุดการทำงาน (Zero-downtime Hot Reload)sudo systemctl reload nginx
💻 วิธีการเปิดเข้าใช้งาน
เมื่อเปิดเว็บบราวเซอร์ของคุณแล้ววิ่งไปยัง URL ซับโดเมนลับที่ตั้งไว้
- ด่านป้องกันที่ 1: บราวเซอร์จะแสดงหน้าต่าง Pop-up ให้ป้อนรหัสผ่านชั้นแรก (ให้ป้อน Username
pitt_secure_adminและรหัสผ่านที่สุ่มตั้งไว้ในขั้นตอนที่ 3) - ด่านป้องกันที่ 2: เมื่อผ่านด่านเว็บเซิร์ฟเวอร์เข้ามาได้ คุณจึงจะพบหน้าต่างล็อกอินหลักของ phpMyAdmin เพื่อกรอกสิทธิ์ผู้ใช้ของระบบฐานข้อมูล MySQL/MariaDB ต่อไปครับ ระบบชุดนี้จะเงียบ สงบ ปลอดภัยจากการแอบส่องของบอท 100% ครับ
อ่านเพิ่มเติม