อินสแตนซ์ Adminer ที่ปล่อยให้ทำงานบนที่อยู่แบบเปิดนั้นเป็นหนึ่งในวิธีที่เงียบที่สุดในการสูญเสียฐานข้อมูล มีคนนำไฟล์ PHP ไฟล์เดียวไปใช้เพื่อตรวจสอบตาราง URL ทำงาน และไฟล์ยังอยู่ที่นั่นเป็นเวลาหลายเดือนจนกว่าสำเนาที่ล้าสมัยจะกลายเป็นพื้นผิวการโจมตี นั่นคือเหตุผลที่คู่มือการติดตั้ง Adminer บน Linux VPS นี้ให้ความสำคัญกับการล็อกเครื่องมือมากพอๆ กับการทำให้ใช้งานได้
Adminer คือไฟล์ PHP ไฟล์เดียว (ประมาณ 503 KB ในบิลด์เต็ม) ที่รองรับ MySQL, MariaDB, PostgreSQL, SQLite และฐานข้อมูลอื่นๆ อีกหลายตัว การติดตั้งง่ายมาก ซึ่งนั่นคือสาเหตุที่มักถูกติดตั้งอย่างไม่ระมัดระวัง
คุณจะติดตั้งบน VPS Ubuntu หรือ Debian รุ่นใหม่พร้อม Nginx และ PHP-FPM เพิ่มการพิสูจน์ตัวตน HTTP รายการ IP ที่อนุญาต และ HTTPS ด้วย Let's Encrypt และสรุปด้วยกฎที่ชัดเจนว่าเมื่อใดควรข้ามการตั้งค่าสาธารณะทั้งหมดและเข้าถึง Adminer ผ่านอุโมงค์ SSH แทน
TL;DR (สรุปย่อ)
- Adminer คือไฟล์ PHP ไฟล์เดียวที่คุณดาวน์โหลดลงใน webroot ด้วย
wget; Nginx และ PHP-FPM ให้บริการไฟล์นั้น - อินสแตนซ์ Adminer สาธารณะต้องการทั้งสาม: ชั้นการพิสูจน์ตัวตน HTTP รายการ IP ที่อนุญาต และ HTTPS ไม่มีอันใดอันหนึ่งเพียงอย่างเดียวที่เพียงพอ
- สำหรับฐานข้อมูลที่ละเอียดอ่อนที่สุด อย่าเปิดเผย Adminer เลย: ผูกไว้กับ
localhostและเข้าถึงผ่านอุโมงค์ SSH - การอัปเดตเป็นคำสั่งเดียว: เรียกใช้คำสั่ง
wgetดาวน์โหลด การเปิดตัวด้านความปลอดภัยล่าสุดทำให้การอัปเดตให้ทันสมัยกลายเป็นงานด้านการดำเนินงานจริง ไม่ใช่แค่สิ่งที่ทำได้ตามอำเภอใจ
ข้อกำหนดเบื้องต้น: สิ่งที่คุณต้องการก่อนติดตั้ง
คู่มือนี้มุ่งเป้าไปที่ Ubuntu 26.04 และ 24.04 บวกกับ Debian 13 พร้อมบันทึกความเข้ากันได้สำหรับ Ubuntu 22.04 และ Debian 12 เวอร์ชัน PHP-FPM เริ่มต้นคือ 8.5 บน Ubuntu 26.04, 8.3 บน Ubuntu 24.04, 8.4 บน Debian 13, 8.2 บน Debian 12 และ 8.1 บน Ubuntu 22.04
- Linux VPS ที่รัน Ubuntu 22.04, Ubuntu 24.04, Ubuntu 26.04, Debian 12 หรือ Debian 13 พร้อมผู้ใช้ที่มี
sudoการเข้าถึง - เซิร์ฟเวอร์ฐานข้อมูล (MySQL, MariaDB หรือ PostgreSQL) ที่ทำงานอยู่แล้ว ไม่ว่าจะบน VPS นี้หรือบนเซิร์ฟเวอร์ที่ Adminer เข้าถึงได้ผ่านเครือข่าย คู่มือนี้ไม่ได้ติดตั้งฐานข้อมูล แต่ติดตั้งเครื่องมือที่คุณใช้ในการดูแลระบบฐานข้อมูล
- PHP-FPM จากที่เก็บที่รองรับโดยระบบปฏิบัติการ แม้ว่าไฟล์ที่คอมไพล์ของ Adminer จะรองรับ PHP 5.3+ แต่ให้ใช้เวอร์ชันที่จัดทำโดย distro ที่ระบุไว้ข้างต้นแทนการติดตั้งเวอร์ชัน PHP ที่ล้าสมัย
- สำหรับการตั้งค่า HTTPS สาธารณะ คุณต้องการชื่อโฮสต์ที่ชี้ไปยัง VPS และพอร์ต TCP ขาเข้า 80 และ 443 ที่พร้อมใช้งาน เวิร์กโฟลว์ Certbot Nginx ใช้การตรวจสอบ HTTP-01 บนพอร์ต 80 ขณะนี้ Let's Encrypt รองรับ ใบรับรองที่อยู่ IP อายุสั้น แต่ Certbot ไม่ได้ติดตั้งโดยอัตโนมัติผ่านเวิร์กโฟลว์ Nginx ดังนั้นคู่มือนี้จึงใช้ชื่อโฮสต์
หมายเหตุ: คู่มือนี้ใช้ Nginx โดยเจตนา หากคุณใช้ Apache ตรรกะการดาวน์โหลดและการเสริมความแข็งแกร่งยังคงใช้ได้ แต่การกำหนดค่า server block ด้านล่างไม่ได้ใช้
ติดตั้ง Nginx และ PHP-FPM
เริ่มต้นด้วยการรีเฟรชดัชนีแพ็กเกจและติดตั้ง Nginx และ PHP-FPM พร้อมกับส่วนขยายฐานข้อมูล PHP ที่เซิร์ฟเวอร์ของคุณต้องการ:
sudo apt update
sudo apt install -y nginx php-fpm php-mysql
สำหรับ backend PostgreSQL ให้ติดตั้ง php-pgsql แทนที่หรือพร้อมกับ php-mysql:
sudo apt install -y php-pgsql
ยืนยันว่า PHP-FPM socket มีอยู่:
ls /run/php/
จับคู่ชื่อไฟล์ socket กับเวอร์ชันที่ระบุไว้ข้างต้น เช่น php8.5-fpm.sock บน Ubuntu 26.04, php8.3-fpm.sock บน Ubuntu 24.04 หรือ php8.4-fpm.sock บน Debian 13 หาก socket ที่คาดหวังหายไป ให้ตรวจสอบบริการที่ตรงกันด้วย systemctl status php8.5-fpmโดยแทนที่ 8.5 ด้วยเวอร์ชันที่ติดตั้งบนระบบปฏิบัติการของคุณ
เคล็ดลับจากผู้เชี่ยวชาญ: การไม่ตรงกันของ socket เป็นสาเหตุที่เป็นไปได้ของ
502 Bad Gateway. ตรวจสอบว่าfastcgi_passกับชื่อไฟล์ภายใต้/run/php/ยืนยันว่าบริการ PHP-FPM ที่เกี่ยวข้องกำลังทำงาน และตรวจสอบ/var/log/nginx/error.logหากข้อผิดพลาดยังคงอยู่
ดาวน์โหลด Adminer
สร้างไดเรกทอรีสำหรับให้บริการ Adminer จากนั้นดาวน์โหลดไฟล์เดียวลงไป latest.php URL จะชี้ไปยังเวอร์ชันเสถียรปัจจุบันเสมอ:
sudo mkdir -p /var/www/adminer
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
หากคุณทำงานกับ MySQL หรือ MariaDB เท่านั้น บิลด์สำหรับ MySQL เท่านั้นจะมีขนาดเล็กกว่า (ประมาณ 406 KB) และดาวน์โหลดในลักษณะเดียวกัน:
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest-mysql.php
เก็บไดเรกทอรี Adminer ให้เป็นเจ้าของโดย root ขณะที่ให้ PHP-FPM มีสิทธิ์อ่าน:
sudo chown -R root:root /var/www/adminer
sudo chmod 755 /var/www/adminer
sudo chmod 644 /var/www/adminer/adminer.php
You do not need to track the version number: the latest.php URL หมายความว่าการเรียกใช้การดาวน์โหลดซ้ำเป็นเส้นทางการอัปเดตของคุณด้วย ซึ่งส่วนการบำรุงรักษาจะกลับมาพูดถึง
กำหนดค่า Nginx Server Block
สร้าง server block ที่ให้บริการไดเรกทอรี Adminer และส่งผ่านคำขอ .php คำขอไปยัง PHP-FPM socket ที่คุณระบุก่อนหน้า เปิดไฟล์ไซต์ใหม่:
sudo nano /etc/nginx/sites-available/adminer
วางข้อความต่อไปนี้ โดยแทนที่ db.example.com ด้วยชื่อโฮสต์ที่ชี้ไปยัง VPS ของคุณแล้ว และยืนยันว่า fastcgi_pass socket ตรงกับเวอร์ชัน PHP ของคุณ:
# /etc/nginx/sites-available/adminer
server {
listen 80;
server_name db.example.com;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
เปิดใช้งานไซต์โดยสร้าง symlink ไปยัง sites-enabledจากนั้นทดสอบการกำหนดค่าโดยยังไม่ต้องโหลด Nginx ซ้ำ:
sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/
sudo nginx -t
nginx -t ควรรายงานว่าไวยากรณ์ถูกต้องและการทดสอบสำเร็จ อย่าโหลด Nginx ซ้ำเพราะไซต์ยังไม่มีการพิสูจน์ตัวตนหรือการจำกัด IP ดำเนินการต่อในสองขั้นตอนการเสริมความแข็งแกร่งนั้น โดยขั้นตอนการจำกัด IP จะทำการโหลดซ้ำครั้งแรกหลังจากการป้องกันทั้งสองอยู่ในที่แล้ว
ล็อกการเข้าถึง: การพิสูจน์ตัวตน การจำกัด IP และ HTTPS
อินสแตนซ์ Adminer สาธารณะนั้นนั่งอยู่ตรงหน้าข้อมูลประจำตัวฐานข้อมูลของคุณ ดังนั้นจึงต้องการการป้องกันหลายชั้นแทนที่จะเป็นล็อคชั้นเดียว สามชั้นด้านล่างทำงานต่างกัน: การพิสูจน์ตัวตน HTTP หยุดทุกคนที่ไม่มีรหัสผ่านที่เว็บเซิร์ฟเวอร์ รายการ IP ที่อนุญาตหยุดทุกคนที่เชื่อมต่อจากที่อยู่ที่คุณไม่ได้อนุมัติ และ HTTPS ป้องกันข้อมูลประจำตัวที่คุณพิมพ์ไม่ให้ข้ามเครือข่ายในรูปแบบข้อความธรรมดา เพิ่มทั้งสาม ไม่มีอันใดที่แทนที่อันอื่นได้
เพิ่มการพิสูจน์ตัวตน HTTP แบบ Basic
ติดตั้ง htpasswd ยูทิลิตี้ที่มาพร้อมกับแพ็กเกจ apache2-utils แพ็กเกจบน Ubuntu และ Debian:
sudo apt install -y apache2-utils
สร้างไฟล์รหัสผ่านและผู้ใช้ (คุณจะถูกขอรหัสผ่าน):
sudo htpasswd -B -C 10 -c /etc/nginx/.htpasswd adminuser
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd
เพิ่มคำสั่งไปยังตำแหน่ง PHP ของ Adminer อย่างแม่นยำเพื่อให้คำขอ PHP เองได้รับการป้องกัน:
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
ทั้งสองคำสั่งได้รับการบันทึกใน เอกสารอ้างอิงโมดูล Nginx HTTP auth_basic. วิ่ง sudo nginx -t เพื่อตรวจสอบการกำหนดค่า แต่อย่าโหลด Nginx ซ้ำเพราะรายการ IP ที่อนุญาตจะถูกเพิ่มถัดไป อย่าส่งข้อมูลประจำตัว Basic Auth ผ่าน HTTP ธรรมดา รอจนกว่า HTTPS จะเปิดใช้งานด้านล่าง
จำกัดการเข้าถึงตามที่อยู่ IP
การพิสูจน์ตัวตนแบบ Basic ปิดกั้นผู้ใช้ที่ไม่ได้รับการพิสูจน์ตัวตน แต่ Nginx ยังคงรับคำขอจากทุกแหล่ง แทนที่ตำแหน่ง PHP ของ Adminer ที่มีอยู่ด้วย block รวมต่อไปนี้เพื่อให้กฎ IP และคำสั่ง Basic Auth อยู่ในที่เดียว:
location = /adminer.php {
satisfy all;
allow 203.0.113.10;
allow 203.0.113.0/28;
deny all;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
แทนที่ที่อยู่ตัวอย่างด้วยที่อยู่ IP สาธารณะจริงหรือช่วงเครือข่ายที่เชื่อถือได้ของคุณ เก็บเฉพาะรายการ allow ที่คุณต้องการและลบตัวอย่างที่ไม่ได้ใช้ รายการแรกแสดงถึงที่อยู่เดียว ในขณะที่รายการที่สองแสดงถึงช่วง CIDR Nginx ส่งคืน 403 Forbidden ไปยังที่อยู่ที่ไม่ตรงกับกฎ allow กฎ allow เอกสารอ้างอิงโมดูลการเข้าถึง Nginx บันทึกไวยากรณ์ของคำสั่ง ทดสอบและโหลด Nginx ซ้ำ:
sudo nginx -t && sudo systemctl reload nginx
เปิดใช้งาน HTTPS ด้วย Let's Encrypt
เมื่อมีโดเมนที่ชี้ไปยัง VPS แล้ว ให้ติดตั้ง Certbot และปลั๊กอิน Nginx จากนั้นขอใบรับรอง:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d db.example.com
Certbot แก้ไข server block ของคุณเพื่อให้บริการ HTTPS บนพอร์ต 443 และเสนอให้เปลี่ยนเส้นทาง HTTP เป็น HTTPS ยอมรับการเปลี่ยนเส้นทาง มันยังติดตั้งตัวจับเวลาการต่ออายุ ดังนั้นใบรับรองจึงต่ออายุโดยอัตโนมัติก่อนหมดอายุ คุณสามารถยืนยันเส้นทางการต่ออายุด้วย sudo certbot renew --dry-runซึ่งควรเสร็จสิ้นโดยไม่มีข้อผิดพลาด
ตอนนี้เยี่ยมชม https://db.example.com/adminer.php จากที่อยู่ที่ได้รับอนุญาต และยืนยันว่า Nginx ขอข้อมูลประจำตัว Basic Auth ก่อนที่ Adminer จะโหลด
เลือกรูปแบบการเข้าถึงของคุณ: HTTPS สาธารณะ เทียบกับ SSH Tunnel
การตั้งค่าข้างต้นเหมาะสมเมื่อคุณต้องการเข้าถึงฐานข้อมูลผ่านเบราว์เซอร์จากหลายเครื่องหรือเมื่อการเปิดเซสชัน SSH ไม่สะดวก ไม่ใช่โมเดลเดียวและสำหรับฐานข้อมูลที่ละเอียดอ่อนก็ไม่ใช่โมเดลที่ป้องกันมากที่สุด
สำหรับการตั้งค่าที่ละเอียดอ่อน อย่าเปิดเผย Adminer ต่อสาธารณะ คำแนะนำด้านความปลอดภัยอย่างเป็นทางการของ Adminer แนะนำให้ทำให้ไม่สามารถเข้าถึงได้จากอินเทอร์เน็ตสาธารณะเมื่อเป็นไปได้ หากคุณเลือกการเข้าถึงผ่านอุโมงค์เท่านั้น ให้แทนที่ server block Nginx สาธารณะด้วยการกำหนดค่า loopback เท่านั้น และข้ามการตั้งค่า HTTPS สาธารณะ:
# /etc/nginx/sites-available/adminer
server {
listen 127.0.0.1:8080 default_server;
server_name _;
root /var/www/adminer;
location = / {
return 302 /adminer.php;
}
location = /adminer.php {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location / {
return 404;
}
}
ทดสอบและโหลดการกำหนดค่าทดแทนซ้ำ:
sudo nginx -t && sudo systemctl reload nginx
จากนั้นเปิดอุโมงค์จากเครื่องของคุณเอง:
ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip
เมื่ออุโมงค์ทำงาน ให้เปิด http://127.0.0.1:8080/adminer.php. Nginx ยอมรับการเชื่อมต่อ Adminer เฉพาะผ่านอินเทอร์เฟซ loopback ของ VPS ในขณะที่ SSH ส่งการจราจรผ่านการเชื่อมต่อที่เข้ารหัส นี้ใช้พฤติกรรมที่อธิบายใน เอกสาร OpenSSH local-forwarding.
ใช้การตั้งค่า HTTPS สาธารณะ Basic Auth และรายการ IP ที่อนุญาตเมื่อคุณต้องการเข้าถึงเบราว์เซอร์โดยตรงจากหลายเครื่อง เลือกใช้การตั้งค่า SSH แบบ loopback เท่านั้นเมื่อการเข้าถึงสาธารณะไม่จำเป็น
ประเด็นสำคัญ: Adminer ที่ปลอดภัยที่สุดคือตัวที่ไม่สามารถเข้าถึงได้จากอินเทอร์เน็ตสาธารณะ
รักษา Adminer ให้อัปเดต
อินสแตนซ์ที่ลืมไปคือความเสี่ยงที่แท้จริงที่นี่ และคุ้มค่าที่จะปฏิบัติเป็นงานตามกำหนดการแทนที่จะเป็นความคิดหลัง การอัปเดต Adminer เป็นคำสั่งเดียว คำสั่งเดิม wget คำสั่งที่คุณใช้ติดตั้ง เพราะ latest.php ดึงข้อมูลเวอร์ชันปัจจุบันเสมอ:
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php
นี่ไม่ใช่ความกังวลเชิงทฤษฎี Adminer 5.4.3ที่เผยแพร่เมื่อ 9 กรกฎาคม 2026 ได้แก้ไขคำแนะนำด้านความปลอดภัย GitHub เจ็ดรายการในการเผยแพร่ครั้งเดียว คำแนะนำก่อนหน้าสำหรับ CVE-2026-25892 แสดงให้เห็นว่าแม้แต่ endpoint การตรวจสอบเวอร์ชันของ Adminer ก็สามารถถูกเปลี่ยนเป็นเวกเตอร์ DoS ที่ไม่ต้องพิสูจน์ตัวตนได้ ปัญหานี้ได้รับการแก้ไขในเวอร์ชัน 5.4.2 สำเนาที่ล้าสมัยสะสมช่องโหว่ที่บันทึกไว้สาธารณะ ดังนั้นการอัปเดตควรเป็นการบำรุงรักษาตามปกติ
หมายเหตุ: ใช้เวอร์ชัน Adminer อย่างเป็นทางการปัจจุบัน ที่เก็บข้อมูล AdminerEvo ถูกเก็บถาวรในเดือนมกราคม 2025 และไม่ใช่ทางเลือกที่ได้รับการดูแลอย่างแข็งขัน
การปรับใช้บน VPS
หากคุณต้องการข้ามขั้นตอนด้วยตนเอง Adminer มีให้ใช้งานเป็นการติดตั้งด้วยคลิกเดียวใน มาร์เก็ตเพลส Cloudzy บน Cloudzy Linux VPS. ภาพ marketplace ใช้ Apache, Basic Auth และใบรับรองที่ลงนามตัวเอง ดังนั้นจึงแตกต่างจาก stack Nginx, รายการ IP ที่อนุญาต และ Let's Encrypt ด้านบน ตรวจสอบความแตกต่างด้านความปลอดภัยก่อนป้อนข้อมูลรับรองฐานข้อมูลการผลิต
ขนาดของ Adminer เองนั้นไม่สำคัญ ฐานข้อมูลเป็นตัวกำหนดขนาด เลือก CPU หน่วยความจำ และพื้นที่จัดเก็บตามขนาดข้อมูลและดัชนีของฐานข้อมูล ภาระงานของ query จำนวนการเชื่อมต่อ การสำรองข้อมูล และการเติบโตที่คาดหวัง ไม่ใช่ Adminer เอง
คำถามที่พบบ่อย
การเปิดเผย Adminer ต่อสาธารณะบน VPS ปลอดภัยหรือไม่?
ไม่ใช่เพียงลำพัง หากคุณต้องเปิดเผย Adminer ต่อสาธารณะ วางไว้หลัง HTTP Basic Authentication รายการ IP ที่อนุญาต และ HTTPS ร่วมกัน การควบคุมเหล่านี้ลดความเสี่ยงแต่ไม่ทำให้การเปิดเผยต่อสาธารณะปราศจากความเสี่ยง สำหรับฐานข้อมูลที่ละเอียดอ่อน ให้ผูก Adminer กับ localhost และเข้าถึงผ่าน SSH tunnel แทน
ฉันจะเข้าถึง Adminer โดยไม่เปิดเผยต่ออินเทอร์เน็ตได้อย่างไร?
กำหนดค่า server block Nginx ที่ใช้เฉพาะ loopback ที่แสดงด้านบนเพื่อให้ Adminer รับฟัง 127.0.0.1:8080 แล้วรัน ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip บนเครื่องของคุณเอง เปิด http://127.0.0.1:8080/adminer.php ขณะที่อุโมงค์กำลังทำงาน
Adminer สามารถเชื่อมต่อกับ PostgreSQL รวมถึง MySQL ได้หรือไม่?
ใช่ Adminer รองรับ MySQL, MariaDB, PostgreSQL, SQLite, MS SQL และ Oracle แบบ out of the box พร้อมฐานข้อมูลเพิ่มเติมผ่านปลั๊กอิน ติดตั้ง PHP extension ที่ตรงกันสำหรับฐานข้อมูลของคุณ เช่น php-pgsql สำหรับ PostgreSQL เพื่อให้ PHP สามารถติดต่อกับมันได้
ฉันจะรักษา Adminer ให้อัปเดตได้อย่างไร?
รันคำสั่งดาวน์โหลดอีกครั้ง: sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php. ที่ latest.php URL มักจะส่งคืนรุ่นเสถียรปัจจุบัน ดังนั้นนี่จะเขียนทับสำเนาของคุณด้วยเวอร์ชันใหม่ล่าสุด การเผยแพร่ความปลอดภัยล่าสุดทำให้คุ้มค่าที่จะทำตามกำหนดการแทนที่จะทำเฉพาะเมื่อคุณจำได้
ควรติดตั้ง Adminer ผ่าน apt แพ็กเกจหรือดาวน์โหลดโดยตรง?
ดาวน์โหลดไฟล์เดียวโดยตรง ให้เวอร์ชันปัจจุบันทันทีและทำให้การอัปเดตเป็นคำสั่งบรรทัดเดียว ในขณะที่แพ็กเกจการกระจายอาจล้าหลังการเผยแพร่อย่างเป็นทางการ ไฟล์โดยตรงคือเครื่องมือเดิมที่มีเส้นทางสั้นกว่าไปยังการแก้ไขความปลอดภัยล่าสุด