ป้ายกำกับ: ล็อกอินหลัก

🛡️ คู่มือการติดตั้ง phpMyAdmin + Nginx บน Ubuntu ให้ปลอดภัยขั้นสุด (Enterprise Isolating)🛡️ คู่มือการติดตั้ง phpMyAdmin + Nginx บน Ubuntu ให้ปลอดภัยขั้นสุด (Enterprise Isolating)

บทความนี้จะพาคุณติดตั้ง 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

⚠️ ข้อควรระวังระหว่างขั้นตอนติดตั้ง

  1. เมื่อระบบแสดงหน้าจอเมนูสีฟ้าถามเรื่อง Web Server (apache2 หรือ lighttpd) ไม่ต้องเลือกตัวเลือกใด ๆ ให้กดปุ่ม Tab บนคีย์บอร์ดเพื่อเลื่อนมาที่ปุ่ม แล้วกด Enter ทันที (เนื่องจากเราจะใช้ Nginx)
  2. เมื่อระบบถามเรื่องการสร้างฐานข้อมูลด้วย dbconfig-common ให้เลือกตอบ จากนั้นกำหนดรหัสผ่านเพื่อระบบจะสุ่มสร้างฐานข้อมูลภายในของตัวโปรแกรมเองโดยอัตโนมัติ

🔐 ขั้นตอนที่ 2: ตั้งค่าความปลอดภัยและสุ่ม Blowfish Secret

หากตรวจสอบไฟล์คอนฟิกแล้วพบว่าคีย์ระบบว่างเปล่า เราจำเป็นต้องสร้างสตริงรหัสลับขึ้นมาเอง เพื่อใช้ในการเข้ารหัสและป้องกันการดักจับเซสชัน (Session Cookie)

  1. เจนสตริงสุ่มความยาว 32 ตัวอักษร
    รันคำสั่งนี้บน Terminal เพื่อสร้างชุดรหัสสุ่มที่มีความปลอดภัยสูง
    openssl rand -base64 32
    (คัดลอกข้อความสตริงผลลัพธ์ยาว ๆ ที่ได้จากหน้าจอเอาไว้)
  2. นำไปเติมในไฟล์คอนฟิกเสริมของระบบ
    เปิดไฟล์ที่เก็บคีย์ความปลอดภัย
    sudo nano /var/lib/phpmyadmin/blowfish_secret.inc.php
    นำคีย์ที่คัดลอกมาวางไว้ภายในเครื่องหมายคำพูดเดี่ยว
    <?php
    $cfg['blowfish_secret'] = 'YOUR_GENERATED_OPENSSL_RANDOM_STRING';
    
  3. ผูก Path โฟลเดอร์เสริมเข้ากับไฟล์คอนฟิกหลัก
    เปิดไฟล์คอนฟิกหลักของ phpMyAdmin
    sudo 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';
    
  4. สร้างไดเรกทอรีจริงและส่งมอบสิทธิ์ให้ 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

  1. ติดตั้งเครื่องมือช่วยเข้ารหัสรหัสผ่าน
    sudo apt install apache2-utils -y
  2. สุ่มสร้างไฟล์เก็บรหัสลับ
    ใช้คำสั่งด้านล่างนี้สร้างรหัสผ่านโดยกำหนดชื่อผู้ใช้ (Username) เช่น phpmyadmin_secure_admin (คุณสามารถเปลี่ยนเป็นชื่ออื่นที่ต้องการได้) จากนั้นระบบจะให้คุณตั้งรหัสผ่านและเข้ารหัสเก็บไว้ในไฟล์ /etc/nginx/.pma_passwd
    sudo htpasswd -c /etc/nginx/.pma_passwd phpmyadmin_secure_admin
    (กรอกรหัสผ่านที่ต้องการล็อกหน้าบ้านจำนวน 2 ครั้ง)

🌐 ขั้นตอนที่ 4: การตั้งค่าคอนฟิก Nginx ร่วมกับ Subdomain ลับ

แทนที่จะติดตั้งไว้ภายใต้โฟลเดอร์ของโดเมนหลักปกติ เราจะหันมาใช้สถาปัตยกรรม Dedicated Subdomain แบบสุ่มสายยาว เพื่อตัดช่องทางการค้นหาของบอทภายนอกออกไปโดยสิ้นเชิง
สร้าง Subdomain ลับ
openssl rand -hex 24
(คัดลอกข้อความสตริงผลลัพธ์ยาว ๆ 24 ตัวที่ได้จากหน้าจอเอาไว้) เช่น
kl3gxpezqqzerk3kvprec57bgdvwwwuh

สร้างไฟล์คอนฟิกบล็อกเซิร์ฟเวอร์ของ Nginx
sudo 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% ครับ

อ่านเพิ่มเติม