နားလည်ထားရမယ့် အချက်
Database security ဆိုတာ setting တစ်ခုတည်း ဖွင့်ရုံနဲ့ မပြီးပါဘူး — layer တွေ အတူတကွရှိတဲ့ stack တစ်ခုပါ၊ layer တစ်ခုတည်းမှာ အားနည်းချက်ရှိရင် ကျန်တဲ့ layer တွေကို ဖျက်ဆီးနိုင်ပါတယ်။
Authentication က 'သင်ဘယ်သူလဲ' ဆိုတာကို ဖြေပါတယ် — password, certificate, cloud IAM role, (သို့) token။ Authorization ကတော့ အဲဒီ identity ဘာလုပ်ခွင့်ရှိလဲ ဆုံးဖြတ်ပေးတဲ့ သီးခြား၊ အလားတူလိုအပ်တဲ့ layer ပါ။
| Account အမျိုးအစား | ရှိသင့်သောအရာ |
|---|---|
| Read-only analytics | SELECT တစ်ခုတည်း၊ တခြားဘာမှ မလိုပါ။ |
| Application account | Self table ပေါ်မှာ ဖတ်/ရေးခွင့်၊ DROP (သို့) role ဖန်တီးခွင့် မလိုပါ။ |
| Migration tool | Migration လုပ်နေချိန်တစ်ခုတည်းသာ permission မြင့်မားပေးပြီး နေ့စဉ် identity အဖြစ် မဟုတ်ပါ။ |
နောက် layer ကတော့ network access ပါ — production database ကို public internet ကနေ လုံးဝ မရောက်သင့်ပါ။ Private network ပေါ်မှာ ရှိသင့်ပြီး သိထားတဲ့ application server တွေကိုသာ ခွင့်ပြုတဲ့ firewall နောက်မှာ ရှိသင့်ပါတယ်။
TLS တစ်ခုတည်းနဲ့ မလုံလောက်ပါ
TLS က connection ကို encrypt လုပ်ပေးပါတယ်၊ ဒါပေမယ့် ဘယ်သူမဆို ရောက်နိုင်ပြီး shared superuser password တစ်ခုတည်းနဲ့ ကာကွယ်ထားတဲ့ database ပေါ်က TLS ဟာ ဘာမှ အရေးမကြီးပါဘူး။ Stack တစ်ခုလုံး ခိုင်ခံ့ဖို့ layer တိုင်း ခိုင်ခံ့ရပါမယ်။
DATABASE SECURITY LAYER STACK
-----------------------------
+---------------------------------------+
| Monitoring (detect unusual activity) |
+---------------------------------------+
| Backups (recover from disaster) |
+---------------------------------------+
| Secrets (credentials never in git) |
+---------------------------------------+
| TLS (encrypt data in transit) |
+---------------------------------------+
| Network Access (private, firewalled) |
+---------------------------------------+
| Least Privilege (minimum permissions) |
+---------------------------------------+
| Authorization (what can this do?) |
+---------------------------------------+
| Authentication (who is connecting?) |
+---------------------------------------+
A gap in any single layer weakens
every layer stacked above it.လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
ဒါကို deployment အစစ်တစ်ခုပေါ် အသုံးချရင် database ကို ရောက်နိုင်တဲ့ account တိုင်းကို audit လုပ်တာပါ — application ရဲ့ runtime connection၊ analytics tool၊ admin၊ migration run တဲ့ CI/CD job။
Team အများစုက အသုံးပြုနေတာထက် access ပိုများနေတဲ့ account အနည်းဆုံးတစ်ခု တွေ့ရပါတယ်။ ဒါကို ပြင်ဖို့ expertise နက်နက်နဲသေးမလိုပါ — account ဆက်လိုနေသလား ပုံမှန် ပြန်မေးရမယ့် စည်းကမ်းတစ်ခုသာ လိုအပ်ပါတယ်။
- Permission command အစစ်တွေအတွက်: PostgreSQL ရဲ့ roles-privileges-and-row-security နှင့် connections-pooling-and-security lesson များ။
- ACL နှင့် TLS configuration လက်တွေ့အတွက်: Redis ရဲ့ security-acl-tls lesson။
Database Security အခြေခံများ
အတူတူ စမ်းရေးကြည့်မယ်
function checkLeastPrivilege(accountName, granted, needed) {
const excess = granted.filter((perm) => !needed.includes(perm));
return {
account: accountName,
grantedCount: granted.length,
neededCount: needed.length,
excessPermissions: excess,
isOverPrivileged: excess.length > 0
};
}
const appAccount = checkLeastPrivilege(
"app_service",
["SELECT", "INSERT", "UPDATE", "DELETE", "DROP TABLE", "CREATE ROLE"],
["SELECT", "INSERT", "UPDATE"]
);
const analyticsAccount = checkLeastPrivilege(
"analytics_readonly",
["SELECT"],
["SELECT"]
);
console.log(JSON.stringify(appAccount, null, 2));
console.log(JSON.stringify(analyticsAccount, null, 2));App_service (SELECT, INSERT, UPDATE, DELETE, DROP TABLE, CREATE ROLE ရထားပေမယ့် SELECT, INSERT, UPDATE သာ လိုအပ်) အတွက် checker က excessPermissions: ["DELETE", "DROP TABLE", "CREATE ROLE"] နဲ့ isOverPrivileged: true လို့ ပြန်ပါတယ်။ Analytics_readonly (SELECT တစ်ခုတည်း ရထားပြီး လိုအပ်တာလည်း SELECT တစ်ခုတည်း) အတွက် excessPermissions array အလွတ်နဲ့ isOverPrivileged: false ပြန်ပါတယ် — properly-scoped case အတိအကျပါပဲ။၅ မိနစ် စမ်းကြည့်
["SELECT", "INSERT", "UPDATE", "DELETE", "CREATE TABLE", "ALTER TABLE", "SUPERUSER"] ရထားပေမယ့် ["CREATE TABLE", "ALTER TABLE", "SELECT"] သာ လိုအပ်တဲ့ CI/CD migration account တစ်ခုအတွက် checkLeastPrivilege ကို ခေါ်ကြည့်ပါ။ isOverPrivileged ဘယ်လို ပြန်လာလဲ၊ ရထားခွင့်ပြုနေတဲ့ permission ထဲက ဘယ်ဟာက အအန္တရာယ်အများဆုံးလဲ။
သတိလေးတစ်ချက်
Setup အချိန်မှာ application ရဲ့ database account ကို permission ကျယ်ကျယ်ပြန့်ပြန့်နဲ့ တစ်ခါဖန်တီးပြီး app ရဲ့ လိုအပ်ချက်တွေ ပုံသေနေတဲ့တိုင် access ချဲ့ထွင်လာနေတာကို ပြန်မကြည့်တာပါ။
TLS တစ်ခုတည်းကို လုံလောက်တဲ့ security အဖြစ် သဘောထားပြီး database ကို public internet ကနေ weak (သို့) shared credential နဲ့ ရောက်နိုင်နေခဲ့ခြင်းပါ။
OWASP: Database Security Cheat Sheet — How Databases Work