FiveM Database User และ Permissions คืออะไร? วิธีสร้าง MariaDB User แยกจาก root และกำหนดสิทธิ์ให้ oxmysql อย่างปลอดภัย

 FiveM Database User คือบัญชีที่ oxmysql ใช้ Login เข้า MySQL/MariaDB เพื่อให้ Resources อ่านและเขียนข้อมูล เช่น Characters, Vehicles, Settings และข้อมูลถาวรอื่นของ Server

แม้ตัวอย่างติดตั้งหลายแห่งจะใช้ root เพื่อให้ตั้งค่าได้ง่าย แต่สำหรับ Production Server แนวทางที่ปลอดภัยกว่าคือสร้าง Database User แยกสำหรับ FiveM และให้เฉพาะ Privileges ที่ Application จำเป็นต้องใช้ ตามหลัก Least Privilege โดย MariaDB แนะนำไม่ให้ใช้ root สำหรับงาน Application ตามปกติ และให้สร้าง Dedicated User ที่มีสิทธิ์จำกัดแทน.

ตัวอย่าง Architecture:

FXServer
↓
oxmysql
↓
FiveM Database User
↓
MariaDB
↓
fivem Database

แทน:

FXServer
↓
oxmysql
↓
root
↓
สิทธิ์ทุกอย่างบน Database Server

① MariaDB User คืออะไร

MariaDB ใช้ Account ในรูปแบบ:

'user'@'host'

ตัวอย่าง:

'fivem_app'@'localhost'

หรือ:

'fivem_app'@'10.0.0.20'

MariaDB เก็บทั้ง User และ Host เป็นส่วนหนึ่งของ Identity ของ Account ดังนั้น User ชื่อเดียวกันแต่เชื่อมจาก Host ต่างกันสามารถเป็นคนละ Account ได้.

② ทำไม FiveM ไม่ควรใช้ root ตลอด

root เป็น Administrative Account ที่มักมี Privileges สูงมาก

ถ้า Connection String ของ FiveM ใช้:

root

แล้ว Credential รั่ว ผลกระทบอาจกว้างกว่าการรั่วของ User ที่เข้าถึงได้เฉพาะ Database ของ FiveM

MariaDB Security Guidance แนะนำหลัก Least Privilege และระบุให้หลีกเลี่ยงการใช้ root สำหรับงาน Application ทั่วไป.

③ Least Privilege คืออะไร

หลักคิดคือ:

ให้สิทธิ์เท่าที่ Application จำเป็นต้องใช้จริง และไม่มากกว่านั้น

ตัวอย่าง:

FiveM Resource ต้องใช้
SELECT
INSERT
UPDATE
DELETE

ไม่จำเป็นต้องใช้
CREATE USER
DROP USER
GRANT OPTION
SUPER/Admin privileges

MariaDB แนะนำให้ Grant เฉพาะ Privileges ขั้นต่ำที่ User ต้องใช้ในการทำงาน.

④ วิธีสร้าง Database User สำหรับ FiveM

ตัวอย่าง:

CREATE USER
    'fivem_app'@'localhost'
IDENTIFIED BY
    'CHANGE_THIS_PASSWORD';

CREATE USER เป็นคำสั่งมาตรฐานของ MariaDB สำหรับสร้าง Account ใหม่ และ Account ที่สร้างใหม่จะยังไม่มี Application Privileges จนกว่าจะมีการ GRANT.

⑤ อย่าใช้ Password จากตัวอย่างจริง

ตัวอย่าง:

CHANGE_THIS_PASSWORD

ต้องเปลี่ยนเป็น Password ที่แข็งแรงและไม่ซ้ำกับ Account อื่น

และอย่าโพสต์ Password จริงใน:

Discord
GitHub
Forum
Screenshot
Log

MariaDB Security Guidance แนะนำ Strong และ Unique Passwords สำหรับ Database Accounts.

⑥ Host ใน CREATE USER สำคัญอย่างไร

ตัวอย่าง:

CREATE USER
    'fivem_app'@'localhost'
IDENTIFIED BY
    'PASSWORD';

หมายถึง Account สำหรับ Connection ที่ Match กับ Host localhost

MariaDB Account ถูกระบุจากคู่:

User + Host

ไม่ใช่ Username อย่างเดียว.

⑦ FXServer กับ Database อยู่เครื่องเดียวกัน

สามารถออกแบบ User เช่น:

CREATE USER
    'fivem_app'@'localhost'
IDENTIFIED BY
    'PASSWORD';

แล้ว Connection String ใช้ Local Database Host ตาม Environment จริง

แนวคิดคือจำกัด Account ให้ใช้จาก Host ที่จำเป็นแทนเปิดกว้างโดยไม่มีเหตุผล

⑧ FXServer กับ Database อยู่คนละเครื่อง

สมมติ:

FXServer
10.0.0.20

MariaDB
10.0.0.30

Database Account อาจต้องอนุญาต Host ของ FXServer ตาม Network Design เช่น:

CREATE USER
    'fivem_app'@'10.0.0.20'
IDENTIFIED BY
    'PASSWORD';

การกำหนด Host ที่แคบกว่าช่วยจำกัดว่า Account สามารถ Authenticate มาจากไหนตามระบบ Account ของ MariaDB.

⑨ ใช้ '%' ได้ไหม

MariaDB สามารถใช้ Wildcard ใน Host Matching ได้ในระบบ Account/Privilege

แต่:

'fivem_app'@'%'

หมายถึงอนุญาต Host กว้างมากกว่าการระบุ FXServer Host โดยตรง

สำหรับ Production ถ้ารู้ Source Host อยู่แล้ว ควรใช้ Host Constraint ที่แคบเท่าที่ Infrastructure อนุญาต แทนเปิดกว้างโดยไม่จำเป็น ตามหลัก Least Privilege.

⑩ GRANT คืออะไร

GRANT ใช้เพิ่ม Privileges หรือ Roles ให้ MariaDB Account

MariaDB ระบุว่า GRANT สามารถใช้กำหนดสิทธิ์ให้ Account และสามารถใช้ SHOW GRANTS ตรวจสิทธิ์ที่ Account มีอยู่.

ตัวอย่าง:

GRANT
    SELECT,
    INSERT,
    UPDATE,
    DELETE
ON
    `fivem`.*
TO
    'fivem_app'@'localhost';

⑪ fivem.* หมายถึงอะไร

ตัวอย่าง:

ON `fivem`.*

หมายถึง Privileges ภายใน Database:

fivem

ทุก Table ที่อยู่ภายใต้ Scope นั้น

MariaDB มี Privilege หลายระดับ เช่น Global, Database และ Table Level ดังนั้นสามารถจำกัดสิทธิ์ไว้เฉพาะ Database ของ FiveM แทน *.* ทั้ง Server ได้.

⑫ ทำไม *.* ต้องระวัง

ตัวอย่าง:

GRANT ALL PRIVILEGES
ON *.*
TO 'fivem_app'@'localhost';

Scope:

*.*

=
ทุก Database
ทุก Object ที่เกี่ยวข้องตาม Privilege

กว้างกว่า:

fivem.*

อย่างมาก

Application Account จึงควรถูก Scope เท่าที่จำเป็น.

⑬ FiveM ต้องใช้ ALL PRIVILEGES ไหม

ไม่จำเป็นสำหรับทุก Server

ให้ดูว่า Resources ต้องทำอะไรจริง

ถ้าระหว่าง Gameplay ใช้เพียง:

SELECT
INSERT
UPDATE
DELETE

ก็ไม่ควรให้ Administrative Privileges เพิ่มโดยไม่มี Requirement

แต่ Resource บางตัวอาจมี Auto Migration และต้อง:

CREATE
ALTER
INDEX

ช่วงติดตั้งหรือ Update

ดังนั้น Permissions ต้องออกแบบตาม Resource Stack จริง ไม่ควร Copy ชุดเดียวให้ทุก Server

⑭ SELECT Permission คืออะไร

ใช้อนุญาตอ่านข้อมูล

ตัวอย่าง:

SELECT
    `id`,
    `firstname`
FROM
    `characters`;

หาก FiveM Resource ต้อง Load Character Records ก็ต้องมี Read Permission ที่สอดคล้องกับ Query

MariaDB รองรับ Privilege Assignment ผ่าน GRANT ใน Scope ต่างๆ.

⑮ INSERT Permission คืออะไร

ใช้เพิ่มข้อมูลใหม่

เช่น:

INSERT INTO `player_settings`
    (`identifier`, `theme`)
VALUES
    (?, ?);

Resource ที่สร้าง Persistent Records ต้องมี Permission ที่อนุญาต Operation นั้น

⑯ UPDATE Permission คืออะไร

ใช้แก้ข้อมูลที่มีอยู่

เช่น:

UPDATE `player_settings`
SET `theme` = ?
WHERE `identifier` = ?;

Resource ที่ Save Player State หรือ Settings จึงมักต้องใช้ UPDATE

⑰ DELETE Permission คืออะไร

ใช้ลบ Rows

เช่น:

DELETE FROM `temporary_data`
WHERE `id` = ?;

ถ้า Resource ไม่เคย Delete Records ก็ไม่จำเป็นต้อง Grant DELETE เพียงเพราะเห็น Server อื่นให้

ใช้ Requirement จริงเป็นหลัก

⑱ CREATE Permission คืออะไร

อนุญาตสร้าง Database Objects ตาม Scope ที่ได้รับ

Resource ที่ Auto-create Tables ตอนติดตั้งอาจต้องใช้

แต่ Gameplay Resource ที่ Schema ถูกสร้างเรียบร้อยแล้วอาจไม่ต้องใช้ CREATE ตลอด Runtime

⑲ ALTER Permission คืออะไร

อนุญาตแก้โครงสร้าง Table เช่น:

ALTER TABLE ...

Resource ที่มี Automatic Migration อาจต้องใช้ ALTER

แต่ ALTER เป็นสิทธิ์ที่กว้างกว่า CRUD ปกติ จึงควรให้เมื่อ Architecture ต้องการจริง

⑳ DROP Permission ต้องระวังมาก

DROP สามารถลบ Objects เช่น Table ตาม Scope/สิทธิ์ที่กำหนด

สำหรับ Runtime Application User ถ้า Resource ไม่ต้อง Drop Tables ก็ไม่ควรเพิ่ม Privilege นี้โดยไม่มีเหตุผล

หลัก Least Privilege มีประโยชน์มากกับสิทธิ์ประเภท Destructive Operations.

㉑ GRANT OPTION คืออะไร

MariaDB ระบุว่าผู้ที่จะ GRANT Privileges ให้ Account อื่นต้องมี GRANT OPTION และมี Privileges ที่กำลัง Grant อยู่เอง.

FiveM Application User ทั่วไปไม่จำเป็นต้องมี:

GRANT OPTION

เพราะ Resource ไม่ควรไปสร้างหรือแจก Permissions ให้ Database Users อื่นระหว่าง Gameplay

㉒ CREATE USER Permission จำเป็นกับ FiveM ไหม

ปกติไม่จำเป็นสำหรับ Gameplay Resources

MariaDB ระบุว่า CREATE USER ใช้สร้าง Database Accounts ใหม่.

FiveM Resource ส่วนใหญ่ต้องจัดการ Gameplay Data ไม่ใช่ Database Administrative Accounts

㉓ ชุด Permission แบบ Runtime

ตัวอย่างเชิงหลักการ:

GRANT
    SELECT,
    INSERT,
    UPDATE,
    DELETE
ON
    `fivem`.*
TO
    'fivem_app'@'localhost';

เหมาะเป็นจุดเริ่มคิดสำหรับ Resource Stack ที่ Schema ถูกติดตั้งเรียบร้อยแล้วและ Gameplay ต้องทำ CRUD เท่านั้น

แต่ต้องตรวจ Resources ของ Server จริงก่อนนำไปใช้

㉔ ชุด Permission สำหรับ Migration

ถ้า Resource ต้อง Migration Schema อัตโนมัติ อาจต้องเพิ่มสิทธิ์ เช่น:

CREATE
ALTER
INDEX

เฉพาะที่ Migration ต้องใช้

อีกแนวทางหนึ่งคือแยก:

Admin/Migration User

กับ:

Runtime FiveM User

เพื่อให้ Runtime Credential ไม่มี Schema-changing Privileges หลัง Migration เสร็จ

㉕ แยก Migration User ดีอย่างไร

Architecture:

Database Administrator
↓
Migration User
↓
ALTER / CREATE / INDEX

FiveM Runtime
↓
fivem_app
↓
SELECT / INSERT / UPDATE / DELETE

ช่วยลดสิทธิ์ของ Credential ที่ FiveM ใช้ทุกวัน

นี่เป็นการประยุกต์หลัก Least Privilege กับ Deployment Workflow.

㉖ SHOW GRANTS คืออะไร

ใช้ดูว่า MariaDB User มี Privileges อะไร

ตัวอย่าง:

SHOW GRANTS
FOR
    'fivem_app'@'localhost';

MariaDB ระบุว่า SHOW GRANTS แสดง GRANT Statements/Privileges ของ Account หรือ Role ที่ระบุ.

㉗ ตรวจ Permissions ก่อนแก้ Access Denied

เมื่อ FiveM ขึ้น:

Access denied

อย่าเริ่มด้วย:

GRANT ALL PRIVILEGES ON *.* ...

ทันที

ให้ใช้:

SHOW GRANTS
FOR 'fivem_app'@'localhost';

แล้วตรวจว่าขาด Permission ไหนจริง

㉘ REVOKE คืออะไร

REVOKE ใช้ถอน Privileges ที่เคยให้ Account

MariaDB มีคำสั่ง REVOKE สำหรับลบ Privileges และมีรูปแบบถอน Privileges หลาย Scope.

ตัวอย่าง:

REVOKE DROP
ON `fivem`.*
FROM 'fivem_app'@'localhost';

เหมาะเมื่อพบว่า Runtime User มีสิทธิ์เกินความจำเป็น

㉙ ลด Permission หลัง Migration ได้ไหม

ได้ และเป็นแนวทางที่ดี

ตัวอย่าง:

ก่อน Migration
CREATE
ALTER
INDEX
SELECT
INSERT
UPDATE
DELETE

หลัง Migration
SELECT
INSERT
UPDATE
DELETE

ใช้ REVOKE ถอน Schema-changing Privileges ที่ไม่จำเป็นหลัง Update.

㉚ ต้อง FLUSH PRIVILEGES หลัง GRANT ไหม

เมื่อจัดการ Accounts/Privileges ผ่าน Account Management Statements เช่น CREATE USER, GRANT และ REVOKE ควรใช้คำสั่งเหล่านี้โดยตรงแทนแก้ Grant Tables เอง

MariaDB Documentation ระบุว่าระบบ Privileges ควรจัดการผ่าน Statements ที่เกี่ยวข้อง เช่น GRANT มากกว่าการแก้ System Tables โดยตรง.

จึงไม่ควรสร้าง Workflow โดยแก้ mysql.* Tables ด้วย SQL UPDATE แบบตรงๆ

㉛ อย่าแก้ mysql.user ด้วยมือ

MariaDB ระบุว่า System Privilege Tables สามารถ Query ได้ แต่แนะนำใช้ GRANT และ Account Management Statements ในการจัดสิทธิ์แทน.

ใช้:

CREATE USER
GRANT
REVOKE
SHOW GRANTS

อ่านง่ายและปลอดภัยกว่า

㉜ Connection String ใช้ Dedicated User อย่างไร

เดิม:

set mysql_connection_string "mysql://root:PASSWORD@127.0.0.1:3306/fivem"

เปลี่ยนเป็น:

set mysql_connection_string "mysql://fivem_app:PASSWORD@127.0.0.1:3306/fivem"

oxmysql Documentation ระบุให้กำหนด mysql_connection_string ก่อน Start Resources และใช้ set สำหรับ Configuration นี้.

㉝ ตัวอย่าง Connection String แบบ Key/Value

set mysql_connection_string "user=fivem_app;password=PASSWORD;host=127.0.0.1;port=3306;database=fivem"

oxmysql รองรับทั้ง URI และ Key/Value Connection String Formats.

㉞ เปลี่ยนจาก root เป็น User ใหม่ต้อง Restart อะไร

หลังแก้ mysql_connection_string ควรให้ oxmysql/FiveM Database Layer Initialize ด้วย Credential ใหม่ตาม Maintenance Procedure

อย่าเปลี่ยน Credential กลาง Production โดยไม่มี Test

Flow ที่ปลอดภัยกว่า:

Create User
↓
Grant
↓
Test Connection
↓
Backup Config
↓
Maintenance
↓
เปลี่ยน Connection String
↓
Start/Restart ตาม Dependency
↓
ตรวจ Console

㉟ ทดสอบ User ใหม่ก่อนใช้จริง

ก่อนเปลี่ยน FiveM ให้ลอง Login Database ด้วย Account นั้นจาก Host ที่ FXServer ใช้

จากนั้นทดสอบ:

SELECT
INSERT
UPDATE
DELETE

ใน Test Table/Environment ตาม Permissions ที่ตั้งไว้

ถ้า Login ไม่ได้ อย่าเพิ่งเปลี่ยน Production Connection String

㊱ Access Denied หลังเปลี่ยนจาก root

ตรวจ 3 ส่วน:

① User ถูกไหม
② Host Match ไหม
③ Privileges ถูกไหม

เพราะ MariaDB Account Identity ประกอบด้วยทั้ง User และ Host.

㊲ 'fivem_app'@'localhost' กับ 'fivem_app'@'%' เหมือนกันไหม

ไม่

เป็น Account Definitions ที่มี Host Scope ต่างกัน

MariaDB ใช้คู่ User/Host เป็น Identity ของ Account.

ดังนั้น:

fivem_app@localhost

อาจมี Privileges คนละชุดกับ:

fivem_app@%

㊳ Database อยู่ Remote แล้ว Access Denied

อาจเกิดจาก:

User มีเฉพาะ @localhost

แต่ FXServer เชื่อมมาจาก:

10.0.0.20

MariaDB จึง Match Account ตาม Host Rules ไม่ตรง

ต้องสร้าง/Grant Account ที่ตรงกับ Network Architecture แทนการเปิด % โดยอัตโนมัติ

㊴ Security Layer มีมากกว่า Database User

Database User เป็นเพียงหนึ่งชั้น

Production Security ยังมี:

Firewall
Network Binding
Database Authentication
User Host Scope
Privileges
Connection String Protection
Server File Permissions

การใช้ Dedicated User ไม่ได้แทน Firewall หรือ Network Security

㊵ Database Port ไม่ควรเปิดทั้งโลก

แม้ Account มี Password แข็งแรง การจำกัด Network Access ยังสำคัญ

ตัวอย่าง:

Internet
X
↓
Database

FXServer IP
✓
↓
Database

ช่วยลด Surface ที่ Database ต้องรับ Connection Attempts

㊶ Connection String เป็น Secret

ไฟล์:

server.cfg

อาจมี:

Database Username
Database Password
Host
Database Name

ดังนั้นอย่าเผย Config ทั้งไฟล์ต่อสาธารณะโดยไม่ Mask Secrets

㊷ Git Repository ต้องระวัง

หลีกเลี่ยง Commit:

server.cfg
.env
database config

ที่มี Production Password ลง Public Repository

ถ้าต้องแชร์ Configuration Example ให้ใช้:

CHANGE_ME

แทน Credential จริง

㊸ FiveM Resource ควรรู้ Password ไหม

Gameplay Resource ไม่จำเป็นต้องมี Password แยกอยู่ใน Lua File

Resource ควรเรียก:

MySQL.query.await(...)

ผ่าน oxmysql

ส่วน Connection Credential อยู่ใน Server Configuration ที่ Database Layer ใช้

㊹ อย่าใส่ Password ใน client.lua

client.lua ไม่ควรมี Database Secrets

Architecture ที่ถูก:

Client
↓
Server Event
↓
Server Validation
↓
oxmysql
↓
Database

ไม่ใช่ให้ Client มี Database Credential

㊺ Database User ไม่ได้แทน Event Security

ถึง fivem_app จะมี Privileges จำกัด แต่ Network Event ยังต้อง Validate

ตัวอย่าง Player ส่ง:

character_id = 999

Server ยังต้องตรวจ:

Character เป็นของ Player หรือไม่
Request ถูกต้องหรือไม่
Player มี Permission หรือไม่

ก่อน Query

Database Least Privilege ลด Impact ที่ Database Layer แต่ไม่ได้ทำ Gameplay Authorization ให้เอง

㊻ Resource ถูก Exploit แล้ว Limited User ช่วยอย่างไร

สมมติ Resource Bug ทำให้เกิด SQL Operation ที่ไม่ควรเกิด

ถ้า User มีเฉพาะ:

SELECT
INSERT
UPDATE
DELETE

Database Account จะไม่มี Schema/Admin Privileges บางประเภทที่ไม่ได้ Grant

นี่คือประโยชน์เชิง Defense-in-depth ของ Least Privilege.

㊼ แต่ DELETE ยังอันตรายไหม

ใช่

ถ้า Gameplay Resource ต้องใช้ DELETE ก็ยังสามารถลบ Rows ภายใน Scope ที่ได้รับอนุญาตได้

Least Privilege ไม่ได้ทำให้ Bug ไม่มีผล

มันมีหน้าที่จำกัด ขอบเขตสูงสุดของสิทธิ์ ให้แคบลง

㊽ ถ้า Resource ไม่ต้อง DELETE ควรถอนไหม

ควรพิจารณา

หากตรวจ Resources ทั้งหมดแล้วไม่มี Query DELETE ที่จำเป็น การไม่ Grant DELETE เป็น Least-Privilege Design ที่ดีกว่า

แต่ต้องทดสอบก่อน Production เพราะ Framework บางตัวอาจมี Cleanup Logic ที่ต้อง Delete Records

㊾ ตาราง Permissions ที่ควรรู้

Privilegeใช้ทำอะไร
SELECTอ่าน Rows
INSERTเพิ่ม Rows
UPDATEแก้ Rows
DELETEลบ Rows
CREATEสร้าง Objects
ALTERเปลี่ยน Schema
DROPลบ Objects
INDEXจัดการ Index ตาม Scope
GRANT OPTIONให้สิทธิ์ต่อ Accounts อื่น

MariaDB จัดการ Privileges ผ่าน GRANT และอนุญาตให้กำหนด Scope ได้หลายระดับ.

㊿ วิธีตรวจว่า FiveM ต้องการ Permission อะไรจริง

เริ่มจาก:

Resource SQL Files
↓
Queries ใน Server Code
↓
Migration Files
↓
Runtime Queries

แยกเป็น:

Runtime
vs
Deployment/Migration

จากนั้นจึงออกแบบ Grants

อย่าดูแค่ Resource หนึ่งตัวถ้า Database ถูกใช้ร่วมทั้ง Framework

51. Runtime Query Audit

ค้นหา SQL Keywords เช่น:

SELECT
INSERT
UPDATE
DELETE
CREATE
ALTER
DROP

ใน Server-side Resources

แล้วทำรายการ:

Framework A
→ SELECT INSERT UPDATE DELETE

Resource B
→ SELECT UPDATE

Migration C
→ ALTER CREATE INDEX

จะเห็นว่า Runtime User ต้องมีอะไรจริง

52. Auto Migration ทำให้ Permission ซับซ้อนขึ้น

Resource บางตัวอาจตรวจ Schema ตอน Start และสร้าง/แก้ Table เอง

กรณีนี้ถ้า Runtime User ไม่มี:

CREATE
ALTER

Resource อาจ Start ไม่ครบ

ทางเลือกคือ:

ให้สิทธิ์ตาม Requirement

หรือ:

Run Migration ด้วย Administrative Deployment User
แล้วใช้ Runtime User จำกัดสิทธิ์

ต้องดู Architecture ของ Resource จริง

53. SHOW GRANTS หลังตั้งค่า

หลัง Grant ให้ตรวจ:

SHOW GRANTS
FOR 'fivem_app'@'localhost';

อย่าพึ่งจำว่าคำสั่งก่อนหน้ารันอะไรไป

SHOW GRANTS เป็นวิธีมาตรฐานของ MariaDB สำหรับดู Privileges ปัจจุบันของ Account.

54. ตัวอย่าง Runtime User แบบจำกัด Database

CREATE USER
    'fivem_app'@'localhost'
IDENTIFIED BY
    'STRONG_PASSWORD';

GRANT
    SELECT,
    INSERT,
    UPDATE,
    DELETE
ON
    `fivem`.*
TO
    'fivem_app'@'localhost';

SHOW GRANTS
FOR
    'fivem_app'@'localhost';

นี่เป็น Template เชิงหลักการ ต้องปรับ Host และ Privileges ให้ตรงกับ Resource Stack จริง.

55. ถ้า Resources ต้อง CREATE/ALTER

อาจเพิ่ม:

GRANT
    CREATE,
    ALTER,
    INDEX
ON
    `fivem`.*
TO
    'fivem_app'@'localhost';

เฉพาะเมื่อ Resource Requirements ยืนยันว่าต้องใช้

หลัง Migration หากไม่จำเป็นอีกแล้วสามารถพิจารณา REVOKE.

56. ตัวอย่างถอน ALTER

REVOKE ALTER
ON
    `fivem`.*
FROM
    'fivem_app'@'localhost';

จากนั้นตรวจ:

SHOW GRANTS
FOR
    'fivem_app'@'localhost';

MariaDB รองรับทั้ง REVOKE และ SHOW GRANTS สำหรับการจัดการ/ตรวจสิทธิ์.

57. DROP USER ใช้เมื่อไร

เมื่อ Database Account ไม่ต้องใช้งานแล้ว สามารถลบ Account ด้วย:

DROP USER
    'old_fivem_user'@'localhost';

MariaDB รองรับ DROP USER สำหรับนำ Account ออกจากระบบ Authentication.

อย่าลบ Account ปัจจุบันก่อนทดสอบว่า FiveM ใช้ User ใหม่ได้สมบูรณ์

58. วิธีเปลี่ยนจาก root ไป Dedicated User

ใช้ Flow:

① Backup server.cfg
② สร้าง fivem_app
③ Grant สิทธิ์ที่ต้องใช้
④ SHOW GRANTS
⑤ Test Login
⑥ Test SELECT
⑦ Test INSERT/UPDATE
⑧ Test Resource บน Staging
⑨ Maintenance
⑩ เปลี่ยน mysql_connection_string
⑪ Start oxmysql/Dependencies
⑫ ตรวจ Console
⑬ ทดสอบ Player Join
⑭ ทดสอบ Save
⑮ ตรวจ Database Error
⑯ ค่อยหยุดใช้ root Credential

59. อย่า Delete root Account เพราะ FiveM ไม่ใช้แล้ว

การเลิกใช้ root ใน FiveM Connection String ไม่ได้หมายความว่าต้องลบ MariaDB Administrative Account

Database Administrator ยังต้องมีวิธีดูแลระบบที่เหมาะสม

เป้าหมายคือ:

FiveM Application
≠
Database Administrator

60. User แยกต่อ Server ดีไหม

ถ้ามีหลาย FiveM Instances:

server_a
server_b
server_test

สามารถพิจารณาแยก:

fivem_a
fivem_b
fivem_test

และแยก Databases/Privileges ตามระบบ

ช่วยลดการที่ Credential ของ Server หนึ่งเข้าถึงข้อมูลอีก Server โดยไม่จำเป็น

61. Production กับ Test ควรใช้ User เดียวกันไหม

ควรหลีกเลี่ยงถ้าต้องการ Separation ที่ชัด

ตัวอย่าง:

Production
fivem_prod_user
→ fivem_prod.*

Test
fivem_test_user
→ fivem_test.*

ช่วยลดความเสี่ยงที่ Test Script เขียน Production Database ผิดตัว

62. Database Name ผิดแต่ User มีสิทธิ์กว้างจะเกิดอะไร

ถ้า User มี:

ALL PRIVILEGES ON *.*

แล้ว Connection String ชี้ผิด Database ก็อาจยังเข้าถึง Database อื่นได้

แต่ถ้า User ถูกจำกัด:

fivem_prod.*

ความผิดพลาดบางประเภทจะถูกจำกัดมากขึ้น

นี่เป็นอีกประโยชน์ของ Scope ที่แคบ

63. SHOW GRANTS ควรเก็บเป็น Documentation ไหม

มีประโยชน์

สามารถบันทึก:

Account
Host
Database Scope
Privileges
Purpose
Last Reviewed

โดยไม่เก็บ Password ลง Documentation

ทำให้เวลา Resource ใหม่ต้อง Permission เพิ่มจะเห็นได้ชัดว่ามีการเปลี่ยน Security Scope อะไร

64. Permission Review ควรทำเมื่อไร

อย่างน้อยเมื่อ:

เพิ่ม Framework
เพิ่ม Resource ใหญ่
เปิด Auto Migration
ย้าย Database
เปลี่ยน Production User
พบ Security Incident

รวมถึงหลังเลิกใช้ Resource ที่เคยต้อง Privilege สูง

65. Checklist FiveM Database User

ก่อน Production ตรวจ:

  1. FiveM ไม่ใช้ root ถ้าไม่จำเป็น

  2. มี Dedicated Database User

  3. Password แข็งแรง

  4. Password ไม่ซ้ำ

  5. Host Scope ถูกต้อง

  6. Database Scope ถูกต้อง

  7. ไม่ใช้ *.* ถ้าไม่จำเป็น

  8. ตรวจ SHOW GRANTS

  9. มีเฉพาะ Runtime Privileges ที่จำเป็น

  10. ตรวจ SELECT

  11. ตรวจ INSERT

  12. ตรวจ UPDATE

  13. ตรวจ DELETE

  14. ตรวจว่าต้อง CREATE หรือไม่

  15. ตรวจว่าต้อง ALTER หรือไม่

  16. ตรวจว่าต้อง DROP หรือไม่

  17. ไม่มี GRANT OPTION หากไม่จำเป็น

  18. ไม่มี CREATE USER หากไม่จำเป็น

  19. Connection String ใช้ User ใหม่

  20. Connection String ใช้ set

  21. ไม่เก็บ Password ใน client.lua

  22. ไม่โพสต์ Connection String

  23. ไม่ Commit Secret สู่ Public Repository

  24. Remote Host ถูกจำกัด

  25. Firewall จำกัด Source

  26. Production/Test แยก Credentials

  27. Backup Config ก่อนเปลี่ยน

  28. ทดสอบ Login ก่อน Production

  29. ทดสอบ Player Join

  30. ทดสอบ Character Load

  31. ทดสอบ Save

  32. ทดสอบ Resource Migration

  33. ตรวจ Access Denied Logs

  34. ถอน Privileges ที่ไม่จำเป็น

  35. Review Permissions เมื่อ Stack เปลี่ยน

FiveM Database ใช้ root ดีไหม

ใช้ได้ในบาง Development/Administrative Context แต่ Production Application ควรพิจารณา Dedicated User ที่มี Privileges จำกัด

MariaDB Security Guidance แนะนำไม่ให้ใช้ root สำหรับ Routine Application Operations และให้ใช้ Dedicated Users ตามหลัก Least Privilege.

FiveM oxmysql ต้องมี Permission อะไร

ไม่มีชุดเดียวสำหรับทุก Server

Resource Stack ที่ใช้ CRUD อย่างเดียวอาจต้อง:

SELECT
INSERT
UPDATE
DELETE

ขณะที่ Resource ที่ Auto Migration อาจต้อง:

CREATE
ALTER
INDEX

เพิ่ม

ให้ตรวจ SQL/Documentation ของ Resources จริงก่อน Grant

FiveM สร้าง MariaDB User ยังไง

ตัวอย่าง:

CREATE USER
    'fivem_app'@'localhost'
IDENTIFIED BY
    'STRONG_PASSWORD';

MariaDB ใช้ CREATE USER เพื่อสร้าง Account ใหม่ โดย Account เริ่มต้นไม่ได้รับ Application Privileges จนกว่าจะ Grant เพิ่ม.

FiveM GRANT Permission ยังไง

ตัวอย่าง:

GRANT
    SELECT,
    INSERT,
    UPDATE,
    DELETE
ON
    `fivem`.*
TO
    'fivem_app'@'localhost';

MariaDB ใช้ GRANT สำหรับกำหนด Privileges ให้ Accounts.

FiveM ดู Database Permission ยังไง

ใช้:

SHOW GRANTS
FOR
    'fivem_app'@'localhost';

SHOW GRANTS แสดง Privileges ที่ Account ได้รับ.

FiveM ถอน Permission ยังไง

ใช้:

REVOKE ALTER
ON
    `fivem`.*
FROM
    'fivem_app'@'localhost';

MariaDB รองรับ REVOKE สำหรับถอน Privileges.

FiveM Access Denied หลังสร้าง User ใหม่

ตรวจ:

User
↓
Host
↓
Password
↓
GRANT
↓
Database Scope

เพราะ MariaDB Account ใช้คู่ User/Host เป็น Identity.

FiveM Database อยู่คนละเครื่องควรใช้ '%' ไหม

ไม่จำเป็นถ้ารู้ Host/IP ของ FXServer

การระบุ Source Host ให้แคบกว่ามักสอดคล้องกับ Least Privilege มากกว่าเปิดให้ทุก Host โดยไม่มี Requirement.

FiveM Database User ต้องมี DROP ไหม

ไม่เสมอไป

ถ้า Resources ไม่ Drop Database Objects ก็ไม่มีเหตุผลต้องให้ DROP แก่ Runtime User

ตรวจ Migration Requirements จริงก่อน

FiveM Auto Migration ต้อง ALTER ไหม

ขึ้นกับ Resource

หาก Resource ใช้ SQL:

ALTER TABLE

ตอน Start/Upgrade ก็ต้องมี Permission ที่รองรับ Operation นั้น หรือ Run Migration ด้วย User/Admin Workflow แยก

FiveM ใช้ User แยกสำหรับ Migration ได้ไหม

ได้ และเป็น Architecture ที่ดีสำหรับระบบที่ต้องการ Runtime Least Privilege

เช่น:

migration_admin
→ CREATE ALTER INDEX

fivem_app
→ SELECT INSERT UPDATE DELETE

แล้ว Runtime Connection ใช้ fivem_app

FiveM เปลี่ยน mysql_connection_string เป็น User ใหม่ยังไง

ตัวอย่าง:

set mysql_connection_string "mysql://fivem_app:PASSWORD@127.0.0.1:3306/fivem"

oxmysql ระบุให้ตั้ง Connection String ก่อน Start Resources และใช้ set กับค่านี้.

FAQ FiveM Database User และ Permissions

FiveM Database User คืออะไร

คือ MariaDB/MySQL Account ที่ oxmysql ใช้ Authenticate เพื่อให้ Resources เข้าถึง Database

FiveM ควรใช้ root ไหม

Production ควรพิจารณา Dedicated User แทน เพราะ MariaDB แนะนำไม่ให้ใช้ root สำหรับ Routine Application Operations.

CREATE USER ใช้ทำอะไร

ใช้สร้าง MariaDB Account ใหม่.

GRANT ใช้ทำอะไร

ใช้ให้ Privileges หรือ Roles แก่ Account.

SHOW GRANTS ใช้ทำอะไร

ใช้ดู Privileges ที่ User หรือ Role ได้รับ.

REVOKE ใช้ทำอะไร

ใช้ถอน Privileges จาก Account.

FiveM ต้องใช้ ALL PRIVILEGES ไหม

ไม่จำเป็นทุก Server ให้ Grant เท่าที่ Resources ต้องใช้จริง

FiveM ต้องใช้ CREATE USER Permission ไหม

Gameplay Resource ทั่วไปไม่จำเป็นต้องสร้าง MariaDB Accounts จึงไม่ควรให้โดยไม่มี Requirement

FiveM Runtime User ต้องใช้ ALTER ไหม

เฉพาะกรณี Resources ต้องแก้ Schema อัตโนมัติ หาก Migration ทำแยกโดย Administrator Runtime User อาจไม่ต้องมี ALTER

'user'@'localhost' กับ 'user'@'%' ต่างกันไหม

ต่างกัน เพราะ MariaDB Account Identity รวม Host ไว้ด้วย.

Database User จำกัดเฉพาะ FiveM Database ได้ไหม

ได้ MariaDB รองรับ Database-level Privileges เช่น Scope fivem.*.

เปลี่ยนจาก root แล้ว oxmysql ใช้ได้ไหม

ได้ เพียง User ใหม่มี Authentication และ Privileges เพียงพอกับ Resource Stack แล้วตั้ง mysql_connection_string ให้ใช้ Account ใหม่.

ประเด็นสำคัญ

FiveM Database Security ไม่ควรจบแค่:

Database ต่อได้
=
เสร็จ

Architecture ที่เหมาะกว่าคือ:

FXServer
↓
oxmysql
↓
Dedicated FiveM User
↓
เฉพาะ fivem Database
↓
เฉพาะ Privileges ที่จำเป็น

MariaDB แนะนำ Least Privilege และ Dedicated Application Users แทนการใช้ root สำหรับ Routine Operations ขณะที่ CREATE USER, GRANT, REVOKE และ SHOW GRANTS เป็นเครื่องมือหลักสำหรับจัดการ Accounts และ Permissions.

สำหรับ Server ที่ Gameplay Runtime ต้องเพียง CRUD สามารถเริ่มวิเคราะห์จาก:

SELECT
INSERT
UPDATE
DELETE

แล้วเพิ่ม:

CREATE
ALTER
INDEX

เฉพาะเมื่อ Resource/Migration ต้องใช้จริง อย่าให้ ALL PRIVILEGES ON *.* เพียงเพราะ Setup ง่ายกว่า เพราะนั่นขยายขอบเขตสิทธิ์ของ Credential ที่ FiveM ถืออยู่มากเกินความจำเป็น

หาก Resource ต้อง Auto Migration สามารถพิจารณาแยก Migration/Admin User ออกจาก Runtime FiveM User แล้วถอน Schema-changing Privileges หลัง Deployment เพื่อให้ Runtime Account มีสิทธิ์แคบลง

สำหรับผู้อ่าน comsiam ให้จำสูตร “User แยก → Host จำกัด → Database จำกัด → Permission เท่าที่ใช้” และ comsiam แนะนำให้ใช้ SHOW GRANTS ตรวจสิทธิ์จริงทุกครั้งหลังเปลี่ยน Database User เพราะการสร้าง Dedicated User มีประโยชน์ก็ต่อเมื่อ Privileges ของ User นั้นถูกจำกัดอย่างถูกต้องจริง

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด