การใส่รหัสผ่านในบรรทัดคำสั่ง (Command Line) เช่น mysql -u root -p'password' ไม่ปลอดภัย เพราะปรากฏใน Process List และ History ให้เก็บ Credential ไว้ในไฟล์ my.cnf (Linux/Mac) หรือ my.ini (Windows) แทน
หาตำแหน่งไฟล์ Config
mysql> SELECT @@datadir;
+---------------------------------------------+
| @@datadir |
+---------------------------------------------+
| C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------------------------------------+
1 row in set (0.00 sec)
ไฟล์ Config มักอยู่ที่:
- Windows:
C:\ProgramData\MySQL\MySQL Server X.Y\my.ini - Linux:
/etc/my.cnf,/etc/mysql/my.cnf,~/.my.cnf - macOS (Homebrew):
/usr/local/etc/my.cnf
เพิ่ม Credential ใน my.cnf
[client]
user = root
password = "yourPassword"
[mysql]
user = root
password = "yourPassword"
[mysqldump]
user = root
password = "yourPassword"
[mysqldiff]
user = root
password = "yourPassword"
[mysqladmin]
user = root
password = "yourPassword"
[mysqlcheck]
user = root
password = "yourPassword"
ตั้งค่าสิทธิ์ไฟล์ (Linux/macOS) - สำคัญมาก!
chmod 600 ~/.my.cnf
# หรือ
chmod 600 /etc/my.cnf
ป้องกัน User อื่นอ่านไฟล์ได้
ทดสอบการทำงาน
# ตอนนี้รันคำสั่งโดยไม่ต้องใส่ -p
mysql
mysqldump mydb
mysqlcheck mydb
ใช้ Login Path (MySQL 5.6+) - ทางเลือกที่ปลอดภัยกว่า
# สร้าง Login Path (เข้ารหัสเก็บใน .mylogin.cnf)
mysql_config_editor set --login-path=local --user=root --password
# ใช้งาน
mysql --login-path=local
mysqldump --login-path=local mydb
mysql_config_editor จะเก็บรหัสผ่านเข้ารหัส ไม่ใช่ Plain Text
ตัวเลือกอื่นๆ
- Environment Variables:
MYSQL_PWD=password mysql -u root(ยังมองเห็นใน Process List บาง OS) - Expect Script: สำหรับ Automation ที่ซับซ้อน
- Vault/Secrets Manager: สำหรับ Production (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault)
สรุปแนวทางปฏิบัติที่ดี
- ห้าม Hardcode Password ใน Script / Code / CI/CD Config
- ใช้
mysql_config_editor(Login Path) สำหรับ Local Dev / Admin - ใช้ Secrets Manager สำหรับ Production
- ตั้งค่า
chmod 600สำหรับ Config File - หมุนรหัสผ่านเป็นระยะ (Rotation)