Database Server เป็นเป้าหมายหลักของการโจมตีทางไซเบอร์ เพราะเก็บข้อมูลที่มีมูลค่าสูง ไม่ว่าจะเป็นข้อมูลลูกค้า ข้อมูลทางการเงิน หรือข้อมูลธุรกิจ การตั้งค่า Firewall ที่รัดกุมเป็นด่านแรกในการป้องกันการเข้าถึงที่ไม่ได้รับอนุญาต บทความนี้รวบรวมวิธีตั้งค่า Firewall Rules สำหรับฐานข้อมูลยอดนิยมทั้ง MySQL, PostgreSQL และ MongoDB ครอบคลุมตั้งแต่ UFW, firewalld, iptables ไปจนถึง Cloud Security Groups
ทำไมต้องตั้ง Firewall สำหรับ Database Server
ฐานข้อมูลจำนวนมากถูกโจมตีเพราะเปิด Port ให้เข้าถึงได้จากทุก IP โดยไม่จำเป็น การตั้งค่า Firewall อย่างถูกต้องช่วยจำกัดการเข้าถึงเฉพาะ IP หรือ Subnet ที่จำเป็นจริง ๆ ลดพื้นผิวการโจมตี (Attack Surface) และเพิ่มความปลอดภัยให้ระบบอย่างมีนัยสำคัญ
Port มาตรฐานของฐานข้อมูลที่ต้องควบคุมการเข้าถึง ได้แก่ MySQL/MariaDB ใช้ Port 3306, PostgreSQL ใช้ Port 5432 และ MongoDB ใช้ Port 27017 นอกจากนี้ยังมี Port อื่น ๆ ที่เกี่ยวข้อง เช่น MySQL Group Replication ใช้ Port 33061, PostgreSQL Replication อาจใช้ Port เดียวกัน และ MongoDB Shard Router ใช้ Port 27018
ตั้งค่า Firewall ด้วย UFW (Ubuntu/Debian)
UFW (Uncomplicated Firewall) เป็นเครื่องมือจัดการ Firewall ที่ใช้งานง่ายบน Ubuntu และ Debian เหมาะสำหรับเซิร์ฟเวอร์ที่ต้องการตั้งค่าอย่างรวดเร็ว
ตั้งค่าพื้นฐาน UFW
# ตรวจสอบสถานะ UFW
sudo ufw status verbose
# เปิดใช้งาน UFW (ถ้ายังไม่เปิด)
sudo ufw enable
# ตั้ง Default Policy — ปิดทุกอย่างก่อน แล้วเปิดเฉพาะที่จำเป็น
sudo ufw default deny incoming
sudo ufw default allow outgoing
# อนุญาต SSH ก่อน (สำคัญมาก — ถ้าลืมจะล็อคตัวเอง)
sudo ufw allow 22/tcp
อนุญาต MySQL (Port 3306) เฉพาะ IP ที่กำหนด
# อนุญาตจาก Application Server เครื่องเดียว
sudo ufw allow from 10.0.1.10 to any port 3306 proto tcp
# อนุญาตจาก Subnet ทั้ง Block
sudo ufw allow from 10.0.1.0/24 to any port 3306 proto tcp
# อนุญาตจากหลาย IP (ทำทีละบรรทัด)
sudo ufw allow from 10.0.1.10 to any port 3306 proto tcp
sudo ufw allow from 10.0.1.11 to any port 3306 proto tcp
sudo ufw allow from 10.0.1.12 to any port 3306 proto tcp
# ห้ามเปิด Port 3306 ให้ทุก IP — อันตรายมาก
# sudo ufw allow 3306/tcp ← ห้ามใช้คำสั่งนี้
อนุญาต PostgreSQL (Port 5432)
# อนุญาตจาก Application Server
sudo ufw allow from 10.0.1.10 to any port 5432 proto tcp
# อนุญาตจาก Subnet
sudo ufw allow from 10.0.1.0/24 to any port 5432 proto tcp
# อนุญาต Replication จาก Standby Server
sudo ufw allow from 10.0.2.20 to any port 5432 proto tcp
อนุญาต MongoDB (Port 27017)
# อนุญาตจาก Application Server
sudo ufw allow from 10.0.1.10 to any port 27017 proto tcp
# อนุญาตจาก Subnet
sudo ufw allow from 10.0.1.0/24 to any port 27017 proto tcp
# อนุญาต Replica Set Communication (Port 27017-27019)
sudo ufw allow from 10.0.2.0/24 to any port 27017:27019 proto tcp
ตรวจสอบและจัดการ Rules
# ดู Rules ทั้งหมดพร้อมหมายเลข
sudo ufw status numbered
# ลบ Rule ตามหมายเลข
sudo ufw delete 3
# ลบ Rule ตามเงื่อนไข
sudo ufw delete allow from 10.0.1.10 to any port 3306 proto tcp
# Reset ทั้งหมด (ใช้ด้วยความระวัง)
sudo ufw reset
ตั้งค่า Firewall ด้วย firewalld (CentOS/RHEL/AlmaLinux)
firewalld เป็น Firewall Manager มาตรฐานของ CentOS, RHEL และ AlmaLinux รองรับการจัดการผ่าน Zone ที่แยกระดับความเชื่อถือได้
ตั้งค่าพื้นฐาน firewalld
# ตรวจสอบสถานะ
sudo systemctl status firewalld
# เปิดใช้งาน
sudo systemctl enable --now firewalld
# ดู Zone ปัจจุบัน
sudo firewall-cmd --get-active-zones
# ดู Rules ทั้งหมดใน Zone ปัจจุบัน
sudo firewall-cmd --list-all
สร้าง Zone เฉพาะสำหรับ Database
การสร้าง Zone แยกสำหรับฐานข้อมูลช่วยให้จัดการ Rules ได้ง่ายขึ้น และแยกออกจาก Rules ของบริการอื่น
# สร้าง Zone ใหม่สำหรับ Database Traffic
sudo firewall-cmd --permanent --new-zone=database
sudo firewall-cmd --reload
# เพิ่ม Source IP ที่อนุญาต
sudo firewall-cmd --permanent --zone=database --add-source=10.0.1.10/32
sudo firewall-cmd --permanent --zone=database --add-source=10.0.1.0/24
# เพิ่ม Port ที่อนุญาตใน Zone นี้
# MySQL
sudo firewall-cmd --permanent --zone=database --add-port=3306/tcp
# PostgreSQL
sudo firewall-cmd --permanent --zone=database --add-port=5432/tcp
# MongoDB
sudo firewall-cmd --permanent --zone=database --add-port=27017/tcp
# Apply การเปลี่ยนแปลง
sudo firewall-cmd --reload
# ตรวจสอบ
sudo firewall-cmd --zone=database --list-all
ใช้ Rich Rules สำหรับการควบคุมละเอียด
Rich Rules ให้ความยืดหยุ่นมากกว่า Rules ปกติ สามารถกำหนด Source, Destination, Port และ Action ได้ในคำสั่งเดียว
# อนุญาต MySQL จาก IP เฉพาะ
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.1.10/32"
port protocol="tcp" port="3306"
accept'
# อนุญาต PostgreSQL จาก Subnet
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.1.0/24"
port protocol="tcp" port="5432"
accept'
# อนุญาต MongoDB จาก Subnet พร้อม Log
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.1.0/24"
port protocol="tcp" port="27017"
log prefix="mongodb-access " level="info"
accept'
# บล็อค IP ที่พยายามเข้าถึง Database Port
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.100.50/32"
port protocol="tcp" port="3306"
reject'
sudo firewall-cmd --reload
ตั้งค่า Firewall ด้วย iptables
iptables เป็นเครื่องมือจัดการ Firewall ระดับต่ำที่ทำงานได้บน Linux ทุก Distribution ให้ความยืดหยุ่นสูงสุดแต่ต้องเขียน Rules เอง
Rules สำหรับ MySQL
# อนุญาต MySQL จาก IP เฉพาะ
sudo iptables -A INPUT -p tcp -s 10.0.1.10 --dport 3306 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.1.11 --dport 3306 -j ACCEPT
# อนุญาตจาก Subnet
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 3306 -j ACCEPT
# บล็อคการเข้าถึง MySQL จาก IP อื่นทั้งหมด
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
# อนุญาต MySQL Group Replication
sudo iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 33061 -j ACCEPT
Rules สำหรับ PostgreSQL
# อนุญาต PostgreSQL จาก Application Subnet
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 5432 -j ACCEPT
# อนุญาต Replication จาก Standby Servers
sudo iptables -A INPUT -p tcp -s 10.0.2.20 --dport 5432 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.2.21 --dport 5432 -j ACCEPT
# บล็อคจาก IP อื่น
sudo iptables -A INPUT -p tcp --dport 5432 -j DROP
Rules สำหรับ MongoDB
# อนุญาต MongoDB จาก Application Subnet
sudo iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 27017 -j ACCEPT
# อนุญาต Replica Set จาก DB Subnet
sudo iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 27017 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 27018 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.0.2.0/24 --dport 27019 -j ACCEPT
# บล็อคจาก IP อื่น
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP
sudo iptables -A INPUT -p tcp --dport 27018 -j DROP
sudo iptables -A INPUT -p tcp --dport 27019 -j DROP
บันทึก iptables Rules ให้คงอยู่หลัง Reboot
# Ubuntu/Debian — ติดตั้ง iptables-persistent
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
# CentOS/RHEL — ใช้ iptables-services
sudo yum install iptables-services -y
sudo systemctl enable iptables
sudo service iptables save
# ตรวจสอบ Rules ที่บันทึกไว้
sudo iptables -L -n -v --line-numbers
ตั้งค่า nftables (ตัวแทน iptables รุ่นใหม่)
nftables เป็นตัวแทนของ iptables ใน Linux Kernel รุ่นใหม่ มี Syntax ที่อ่านง่ายกว่าและรองรับ IPv4/IPv6 ในชุดคำสั่งเดียวกัน Distribution ใหม่ ๆ อย่าง Debian 11+ และ RHEL 9+ ใช้ nftables เป็นค่าเริ่มต้น
# สร้าง Table และ Chain สำหรับ Database
sudo nft add table inet db_filter
sudo nft add chain inet db_filter input { type filter hook input priority 0 \; policy drop \; }
# อนุญาต SSH
sudo nft add rule inet db_filter input tcp dport 22 accept
# อนุญาต Established Connections
sudo nft add rule inet db_filter input ct state established,related accept
# อนุญาต Loopback
sudo nft add rule inet db_filter input iifname "lo" accept
# อนุญาต MySQL จาก Subnet
sudo nft add rule inet db_filter input ip saddr 10.0.1.0/24 tcp dport 3306 accept
# อนุญาต PostgreSQL จาก Subnet
sudo nft add rule inet db_filter input ip saddr 10.0.1.0/24 tcp dport 5432 accept
# อนุญาต MongoDB จาก Subnet
sudo nft add rule inet db_filter input ip saddr 10.0.1.0/24 tcp dport 27017 accept
# บันทึก Rules
sudo nft list ruleset > /etc/nftables.conf
# ตรวจสอบ Rules
sudo nft list ruleset
Database-level Access Control เสริม Firewall
นอกจาก Firewall ระดับ OS แล้ว ฐานข้อมูลแต่ละตัวยังมีระบบควบคุมการเข้าถึงในตัวเอง ควรตั้งค่าทั้งสองระดับเพื่อป้องกันแบบ Defense in Depth
MySQL — Bind Address และ User Host
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# ฟังเฉพาะ IP ที่กำหนด (ไม่ฟัง 0.0.0.0)
bind-address = 10.0.1.5
# หรือฟังหลาย IP (MySQL 8.0+)
bind-address = 10.0.1.5,127.0.0.1
# สร้าง User ที่เข้าถึงได้เฉพาะจาก IP ที่กำหนด
CREATE USER 'appuser'@'10.0.1.10' IDENTIFIED BY 'StrongPassword';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'10.0.1.10';
# สร้าง User สำหรับ Subnet
CREATE USER 'appuser'@'10.0.1.%' IDENTIFIED BY 'StrongPassword';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'appuser'@'10.0.1.%';
# ตรวจสอบ User และ Host ที่อนุญาต
SELECT user, host FROM mysql.user WHERE user NOT IN ('mysql.sys','mysql.session','mysql.infoschema');
FLUSH PRIVILEGES;
PostgreSQL — pg_hba.conf
ไฟล์ pg_hba.conf ควบคุมว่า IP ใดสามารถเข้าถึงฐานข้อมูลใดด้วยวิธี Authentication แบบใด ทำหน้าที่เหมือน Firewall ภายในของ PostgreSQL
# /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# Local connections
local all postgres peer
# Application Server — เข้าถึง mydb เท่านั้น
host mydb appuser 10.0.1.10/32 scram-sha-256
# Application Subnet
host mydb appuser 10.0.1.0/24 scram-sha-256
# Replication จาก Standby
host replication repluser 10.0.2.20/32 scram-sha-256
host replication repluser 10.0.2.21/32 scram-sha-256
# บล็อคทุก IP อื่น (Default)
host all all 0.0.0.0/0 reject
# ตั้งค่า listen_addresses ใน postgresql.conf
# /etc/postgresql/16/main/postgresql.conf
listen_addresses = '10.0.1.5,localhost'
# Reload เพื่อ Apply การเปลี่ยนแปลง
sudo systemctl reload postgresql
MongoDB — bindIp และ Network Configuration
# /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,10.0.1.5
security:
authorization: enabled
# Restart เพื่อ Apply
sudo systemctl restart mongod
Firewall Script อัตโนมัติ
การเขียน Script สำหรับตั้งค่า Firewall ช่วยให้สร้างเซิร์ฟเวอร์ใหม่ได้เร็วขึ้น และมั่นใจว่าทุกเครื่องใช้ Rules เดียวกัน ตัวอย่าง Script ด้านล่างเป็นสำหรับ UFW ที่รองรับฐานข้อมูลหลายตัว
#!/bin/bash
# setup_db_firewall.sh — Database Firewall Setup Script (UFW)
set -euo pipefail
# === Configuration ===
APP_SERVERS=("10.0.1.10" "10.0.1.11" "10.0.1.12")
DB_SUBNET="10.0.2.0/24"
ADMIN_IP="203.0.113.50"
# Database Ports
MYSQL_PORT=3306
PGSQL_PORT=5432
MONGO_PORT=27017
# === ตรวจสอบว่ารันด้วย root ===
if [ "$EUID" -ne 0 ]; then
echo "ERROR: ต้องรันด้วย root หรือ sudo"
exit 1
fi
echo "=== Database Firewall Setup ==="
# === Reset UFW ===
echo "[1/5] Resetting UFW..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
# === SSH ===
echo "[2/5] Allowing SSH..."
ufw allow from "$ADMIN_IP" to any port 22 proto tcp
# === Database Ports ===
echo "[3/5] Allowing Database Ports..."
for ip in "${APP_SERVERS[@]}"; do
echo " Allowing $ip -> MySQL, PostgreSQL, MongoDB"
ufw allow from "$ip" to any port "$MYSQL_PORT" proto tcp
ufw allow from "$ip" to any port "$PGSQL_PORT" proto tcp
ufw allow from "$ip" to any port "$MONGO_PORT" proto tcp
done
# === Replication Subnet ===
echo "[4/5] Allowing Replication Subnet..."
ufw allow from "$DB_SUBNET" to any port "$MYSQL_PORT" proto tcp
ufw allow from "$DB_SUBNET" to any port 33061 proto tcp
ufw allow from "$DB_SUBNET" to any port "$PGSQL_PORT" proto tcp
ufw allow from "$DB_SUBNET" to any port "$MONGO_PORT":"$((MONGO_PORT+2))" proto tcp
# === Enable UFW ===
echo "[5/5] Enabling UFW..."
ufw --force enable
echo ""
echo "=== Firewall Setup Complete ==="
ufw status numbered
Monitoring และ Logging
การตั้ง Firewall อย่างเดียวไม่เพียงพอ ต้องตรวจสอบ Log เป็นประจำเพื่อดูว่ามีความพยายามเข้าถึงจาก IP ที่ไม่ได้อนุญาตหรือไม่
เปิด UFW Logging
# เปิด Logging ระดับ medium
sudo ufw logging medium
# ดู Log ที่ถูกบล็อค
sudo grep "UFW BLOCK" /var/log/ufw.log | tail -20
# นับจำนวนการเข้าถึงที่ถูกบล็อคแยกตาม IP
sudo grep "UFW BLOCK" /var/log/ufw.log | grep "DPT=3306" | \
awk '{for(i=1;i<=NF;i++) if($i ~ /SRC=/) print $i}' | \
sort | uniq -c | sort -rn | head -10
เปิด firewalld Logging
# เปิด Log สำหรับ Denied Packets
sudo firewall-cmd --set-log-denied=all
# ดู Log
sudo journalctl -u firewalld --no-pager | tail -20
# ตรวจสอบการเข้าถึงที่ถูก Reject
sudo journalctl -k | grep "REJECT" | tail -20
Script ตรวจสอบ Firewall Status
#!/bin/bash
# check_db_firewall.sh — Database Firewall Health Check
echo "=== Firewall Status Check ==="
echo ""
# ตรวจสอบว่า Firewall ทำงานอยู่
if command -v ufw &> /dev/null; then
echo "[UFW]"
sudo ufw status | head -5
elif command -v firewall-cmd &> /dev/null; then
echo "[firewalld]"
sudo firewall-cmd --state
fi
echo ""
echo "=== Open Database Ports ==="
# ตรวจสอบ Port ที่เปิดฟัง
for port in 3306 5432 27017; do
result=$(ss -tlnp | grep ":$port " || true)
if [ -n "$result" ]; then
echo "Port $port: LISTENING"
echo " $result"
else
echo "Port $port: NOT LISTENING"
fi
done
echo ""
echo "=== Recent Blocked Attempts ==="
# ดู Log 24 ชั่วโมงล่าสุด
if [ -f /var/log/ufw.log ]; then
blocked=$(grep "UFW BLOCK" /var/log/ufw.log | \
grep -E "DPT=(3306|5432|27017)" | \
wc -l)
echo "Database port blocks (last log): $blocked attempts"
fi
echo ""
echo "=== Active Connections to Database Ports ==="
for port in 3306 5432 27017; do
count=$(ss -tn | grep ":$port " | wc -l)
if [ "$count" -gt 0 ]; then
echo "Port $port: $count active connections"
ss -tn | grep ":$port " | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
fi
done
Cloud Security Groups
หากรัน Database Server บน Cloud Platform ควรตั้ง Security Groups เพิ่มเติมจาก OS Firewall เพื่อป้องกันสองชั้น ตัวอย่างด้านล่างใช้ AWS CLI แต่แนวคิดเดียวกันใช้ได้กับทุก Cloud Provider
# สร้าง Security Group สำหรับ Database
aws ec2 create-security-group \
--group-name db-firewall \
--description "Database Server Security Group" \
--vpc-id vpc-0abc123def
# อนุญาต MySQL จาก Application Security Group
aws ec2 authorize-security-group-ingress \
--group-id sg-0db123456 \
--protocol tcp \
--port 3306 \
--source-group sg-0app789012
# อนุญาต PostgreSQL จาก IP เฉพาะ
aws ec2 authorize-security-group-ingress \
--group-id sg-0db123456 \
--protocol tcp \
--port 5432 \
--cidr 10.0.1.10/32
# อนุญาต MongoDB จาก Subnet
aws ec2 authorize-security-group-ingress \
--group-id sg-0db123456 \
--protocol tcp \
--port 27017 \
--cidr 10.0.1.0/24
# ตรวจสอบ Rules
aws ec2 describe-security-groups \
--group-ids sg-0db123456 \
--query "SecurityGroups[0].IpPermissions"
Best Practices สำหรับ Database Firewall
การตั้งค่า Firewall ให้มีประสิทธิภาพสูงสุดต้องคำนึงถึงหลายปัจจัย ตั้งแต่หลักการออกแบบ Rules ไปจนถึงการบำรุงรักษาระยะยาว
- ใช้หลัก Least Privilege — เปิดเฉพาะ Port และ IP ที่จำเป็นจริง ๆ อย่าเปิด Port ฐานข้อมูลให้ทุก IP เด็ดขาด
- ป้องกันสองชั้น (Defense in Depth) — ตั้ง Firewall ทั้งระดับ OS และระดับ Database เช่น ใช้ UFW ร่วมกับ pg_hba.conf
- เปลี่ยน Port เริ่มต้น — พิจารณาเปลี่ยน Port จากค่ามาตรฐาน เช่น MySQL จาก 3306 เป็น Port อื่น เพื่อลดการถูก Scan อัตโนมัติ
- บันทึก Rules เป็น Script — เขียน Firewall Rules เป็น Shell Script เพื่อให้สร้างเซิร์ฟเวอร์ใหม่ได้ง่ายและไม่ผิดพลาด
- ตรวจสอบ Rules เป็นประจำ — Review Firewall Rules อย่างน้อยเดือนละครั้ง ลบ Rules ที่ไม่ใช้แล้วออก
- ตรวจสอบ Log — ดู Firewall Log เป็นประจำเพื่อจับพฤติกรรมที่น่าสงสัย เช่น การพยายามเข้าถึงจาก IP ที่ไม่รู้จัก
- ทดสอบ Rules หลังเปลี่ยนแปลง — ทุกครั้งที่แก้ไข Firewall Rules ให้ทดสอบว่า Application ยังเชื่อมต่อฐานข้อมูลได้ปกติ
- แยก Database ออกจาก Public Network — วาง Database Server ใน Private Subnet ที่ไม่มี Public IP แล้วให้ Application Server เชื่อมต่อผ่าน Internal Network
สรุป
การตั้งค่า Firewall สำหรับ Database Server เป็นขั้นตอนพื้นฐานที่สำคัญที่สุดในการรักษาความปลอดภัย ไม่ว่าจะใช้ UFW, firewalld, iptables หรือ nftables หลักการเดียวกันคือเปิดเฉพาะ Port และ IP ที่จำเป็น ป้องกันสองชั้นทั้งระดับ OS และระดับ Application ตรวจสอบ Log เป็นประจำ และทดสอบ Rules ทุกครั้งหลังเปลี่ยนแปลง การลงทุนเวลาตั้งค่า Firewall ให้ถูกต้องตั้งแต่แรกจะช่วยป้องกันปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นในอนาคต
แนะนำบริการ DE
การรันฐานข้อมูลในระบบ Production ต้องการเซิร์ฟเวอร์ที่ควบคุมได้เต็มที่เพื่อตั้งค่า Firewall และ Network Security ตามต้องการ Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อม Private Network สำหรับแยก Database Server ออกจากเครือข่ายสาธารณะ รองรับ UFW, firewalld และ iptables ได้อิสระ
สำหรับโปรเจกต์ที่ต้องการความสะดวกและไม่ต้องจัดการ Firewall เอง Cloud Hosting ของ DE มีระบบรักษาความปลอดภัยพื้นฐานให้พร้อมใช้งาน เหมาะกับเว็บแอปพลิเคชันที่ใช้ฐานข้อมูลร่วมกัน

