PlusMagi's Blog By Pitt Phunsanit Cloud Computing,Cybersecurity,Database ðŸ›Ąïļ āļ„āļđāđˆāļĄāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ phpMyAdmin + Nginx āļšāļ™ Ubuntu āđƒāļŦāđ‰āļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļąāđ‰āļ™āļŠāļļāļ” (Enterprise Isolating)

ðŸ›Ąïļ āļ„āļđāđˆāļĄāļ·āļ­āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ phpMyAdmin + Nginx āļšāļ™ Ubuntu āđƒāļŦāđ‰āļ›āļĨāļ­āļ”āļ āļąāļĒāļ‚āļąāđ‰āļ™āļŠāļļāļ” (Enterprise Isolating)

āđƒāļ™āļāļēāļ™āļ° System Architect āļ—āļĩāđˆāļ”āļđāđāļĨāļĢāļ°āļšāļšāļ­āļ‡āļ„āđŒāļāļĢ āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāđˆāļēāļ‡ phpMyAdmin āļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāļĄāļēāļ•āļĢāļāļēāļĢāļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāđ€āļ‚āđ‰āļĄāļ‡āļ§āļ”āļ—āļĩāđˆāļŠāļļāļ” āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļ„āļ·āļ­āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāđƒāļ™āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ phpMyAdmin āļšāļ™ Nginx āļšāļ™ Ubuntu āđ‚āļ”āļĒāđ€āļ™āđ‰āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ PostgreSQL āđāļĨāļ°āļĒāļāļĢāļ°āļ”āļąāļšāļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļ”āļąāļš Enterprise Isolation āđ€āļžāļ·āđˆāļ­āļŠāļāļąāļ”āļāļąāđ‰āļ™āļāļēāļĢāļŠāđāļāļ™āļˆāļēāļāļšāļ­āļ—āđāļĨāļ°āļœāļđāđ‰āļšāļļāļāļĢāļļāļāļ āļēāļĒāļ™āļ­āļāđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž

ðŸ›Ąïļ āļŦāļĨāļąāļāļāļēāļĢāļĢāļąāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļĢāļ°āļ”āļąāļš Enterprise

āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļŦāļĄāļēāļĒāļ–āļķāļ‡āđāļ„āđˆāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļžāđ‡āļāđ€āļāļˆ āđāļ•āđˆāļŦāļĄāļēāļĒāļ–āļķāļ‡āļāļēāļĢāļˆāļģāļāļąāļ”āļ‚āļ­āļšāđ€āļ‚āļ•āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (Least Privilege) āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰ 3 āđ€āļ—āļ„āļ™āļīāļ„āļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™:

  1. HTTP Basic Authentication: āļāļēāļĢāļĨāđ‡āļ­āļāļŠāļąāđ‰āļ™āļŦāļ™āđ‰āļēāļšāđ‰āļēāļ™āļ”āđ‰āļ§āļĒ Username/Password āļ—āļĩāđˆāđ„āļĄāđˆāđ€āļ›āļīāļ”āđ€āļœāļĒāđƒāļ™āđ‚āļ„āđ‰āļ”
  2. Obscurity Subdomain: āļāļēāļĢāļ‹āđˆāļ­āļ™ URL āļˆāļĢāļīāļ‡āļ‚āļ­āļ‡ phpMyAdmin āļ”āđ‰āļ§āļĒ Subdomain āļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒ
  3. open_basedir: āļāļēāļĢāļˆāļģāļāļąāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļĩāđˆāļāļĢāļ°āļšāļ§āļ™āļāļēāļĢ PHP āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāđ„āļ”āđ‰ āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩāđāļšāļš Directory Traversal

⚙ïļ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 1: āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āđ€āļ•āļĢāļĩāļĒāļĄāļĢāļ°āļšāļš PostgreSQL

āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāļŦāļĨāļąāļāļ‚āļ­āļ‡āđ€āļĢāļēāđƒāļŠāđ‰ PostgreSQL āđ€āļĢāļēāļˆāļ°āļ•āđ‰āļ­āļ‡āļĄāļąāđˆāļ™āđƒāļˆāļ§āđˆāļē phpMyAdmin āļ–āļđāļāļāļģāļŦāļ™āļ”āļ„āđˆāļēāđƒāļŦāđ‰āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš PostgreSQL āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ–āļđāļāļ•āđ‰āļ­āļ‡ āđāļĨāļ°āđ€āļĢāļēāļˆāļ°āļŠāļĢāđ‰āļēāļ‡ User āđ€āļ‰āļžāļēāļ°āļāļīāļˆāļ—āļĩāđˆāļ–āļđāļāļˆāļģāļāļąāļ”āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰ phpMyAdmin āđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™

SQL

-- 1. āļŠāļĢāđ‰āļēāļ‡ User āļŠāļģāļŦāļĢāļąāļš phpMyAdmin āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° (Read-Only Access) 
CREATE USER pma_user WITH PASSWORD 'SecurePassword123';

-- 2. āļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ™āļĩāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ Schema āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāđ„āļ”āđ‰āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ 
GRANT CONNECT ON DATABASE your_database TO pma_user;

-- 3. (Optional) āļˆāļģāļāļąāļ”āļŠāļīāļ—āļ˜āļīāđŒāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Read-Only āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ 
ALTER USER pma_user WITH NOSUPERUSER NOCREATEDB NOCREATEROLE;

🚀 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆ 2: āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Nginx āđāļĨāļ° PHP (The Hardening)

āļŦāļĨāļąāļ‡āļˆāļēāļāļ•āļīāļ”āļ•āļąāđ‰āļ‡ phpMyAdmin āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Nginx Virtual Host āđāļĨāđ‰āļ§ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļĩāđˆāļŠāļļāļ”āļ„āļ·āļ­āļāļēāļĢāđ€āļžāļīāđˆāļĄ Layer āļ‚āļ­āļ‡āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ:

  1. āļāļēāļĢāļˆāļģāļāļąāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆ (open_basedir): āđāļāđ‰āđ„āļ‚āđ„āļŸāļĨāđŒ php.ini āđ€āļžāļ·āđˆāļ­āļāļģāļŦāļ™āļ”āļ„āđˆāļē open_basedir āđƒāļŦāđ‰āļŠāļĩāđ‰āđ€āļ‰āļžāļēāļ° Directory āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āđ„āļŸāļĨāđŒāļ āļēāļĒāļ™āļ­āļ
  2. Basic Auth: āđƒāļŠāđ‰āđ‚āļĄāļ”āļđāļĨ nginx āđ€āļžāļ·āđˆāļ­āļšāļąāļ‡āļ„āļąāļšāđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđˆ Username/Password āļāđˆāļ­āļ™āđ€āļ‚āđ‰āļēāļ–āļķāļ‡ URL āļ‚āļ­āļ‡ phpMyAdmin
  3. Obscurity: āđāļ—āļ™āļ—āļĩāđˆāļˆāļ°āđƒāļŠāđ‰ phpmyadmin.example.com āđƒāļŦāđ‰āđƒāļŠāđ‰ admin-tools.example.com āđ€āļžāļ·āđˆāļ­āļĨāļ”āđ‚āļ­āļāļēāļŠāļ—āļĩāđˆāļšāļ­āļ—āļˆāļ°āļŠāđāļāļ™āđ€āļˆāļ­

✅ āļšāļ—āļŠāļĢāļļāļ›: āļĢāļ°āļšāļšāļ—āļĩāđˆāđāļ‚āđ‡āļ‡āđāļāļĢāđˆāļ‡āđāļĨāļ°āļ›āļĨāļ­āļ”āļ āļąāļĒ

āļ”āđ‰āļ§āļĒāļāļēāļĢāļœāļŠāļēāļ™āļĢāļ§āļĄāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Nginx, PHP, āđāļĨāļ° PostgreSQL āđ€āļ‚āđ‰āļēāļ”āđ‰āļ§āļĒāļāļąāļ™ āļžāļĢāđ‰āļ­āļĄāļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āđ€āļ—āļ„āļ™āļīāļ„āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™āđāļšāļšāļŦāļĨāļēāļĒāļŠāļąāđ‰āļ™ (Multi-Layer Defense) āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļˆāļģāļāļąāļ”āļŠāļīāļ—āļ˜āļīāđŒāļœāļđāđ‰āđƒāļŠāđ‰ (Least Privilege), āļāļēāļĢāļˆāļģāļāļąāļ”āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™ (open_basedir), āđāļĨāļ°āļāļēāļĢāļ‹āđˆāļ­āļ™ URL (Obscurity) āļ—āļģāđƒāļŦāđ‰ phpMyAdmin āļ‚āļ­āļ‡āļ„āļļāļ“āļāļĨāļēāļĒāđ€āļ›āđ‡āļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļˆāļąāļ”āļāļēāļĢāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ—āļĢāļ‡āļžāļĨāļąāļ‡āđāļĨāļ°āļ›āļĨāļ­āļ”āļ āļąāļĒāļ—āļĩāđˆāļŠāļļāļ”āļŠāļģāļŦāļĢāļąāļšāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄāļĢāļ°āļ”āļąāļšāļ­āļ‡āļ„āđŒāļāļĢ (Enterprise Grade) āļ­āļĒāđˆāļēāļ‡āđāļ—āđ‰āļˆāļĢāļīāļ‡