PostgreSQL / Хэрэглэгч ба эрх

Хэрэглэгч ба эрх

Бодит системд өгөгдлийн санд нэг хүн л холбогддоггүй — хөгжүүлэгчид, read-only тайлангийн хэрэгслүүд, автомат backup систем, application server гэх мэт олон тал байдаг. Тус бүрд зөвхөн шаардлагатай эрхийг олгох нь аюулгүй байдлын үндэс юм. PostgreSQL-д энэ зорилгоор role ашигладаг.

Role гэж юу вэ?

PostgreSQL-д хэрэглэгч болон бүлэг хоёулаа ROLE юм. LOGIN эрхтэй role нь нэвтрэх боломжтой хэрэглэгч болдог.

sql
-- Нэвтрэх эрхтэй хэрэглэгч үүсгэх
CREATE ROLE app_user LOGIN PASSWORD 'нууцүг123';

-- Нууц үггүй, зөвхөн бүлгийн role
CREATE ROLE readonly;

-- Хэрэглэгч устгах
DROP ROLE app_user;

-- Байгаа role-уудыг харах
SELECT rolname, rolcanlogin, rolsuper
FROM pg_roles
WHERE rolname NOT LIKE 'pg_%'
ORDER BY rolname;

GRANT — эрх олгох

GRANT командаар тодорхой объектод эрх олгоно:

sql
-- readonly role-д бүх хүснэгтийг унших эрх
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

-- app_user-д зөвхөн тодорхой хүснэгтэд бичих эрх
GRANT SELECT, INSERT, UPDATE ON employees TO app_user;
GRANT SELECT, INSERT, UPDATE ON departments TO app_user;

-- sequence ашиглах эрх (SERIAL-д шаардлагатай)
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;

-- app_user-д readonly бүлгийн эрхийг нэмэх
GRANT readonly TO app_user;
sql
-- Шинэ хүснэгт үүсгэх үед автоматаар эрх олгох
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO readonly;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE ON TABLES TO app_user;

ALTER DEFAULT PRIVILEGES нь ирээдүйд үүсгэгдэх хүснэгтэд автоматаар эрх тавьдаг тул гараар давтан GRANT хийх шаардлагагүй болдог.

REVOKE — эрх хасах

sql
-- Тодорхой эрхийг хасах
REVOKE INSERT, UPDATE ON employees FROM app_user;

-- Бүх эрхийг хасах
REVOKE ALL ON employees FROM app_user;

-- Бүлгийн эрхийг хасах
REVOKE readonly FROM app_user;

Хэрэглээний жишээ — олон давхаргат эрх

Бодит системд ихэвчлэн эрхийн давхарга тавьдаг:

sql
-- 1. Бүлгийн role-уудыг үүсгэх
CREATE ROLE readonly;
CREATE ROLE readwrite;
CREATE ROLE admin_role;

-- 2. Бүлэгт эрх олгох
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO readwrite;

GRANT ALL ON ALL TABLES IN SCHEMA public TO admin_role;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO admin_role;

-- 3. Бодит хэрэглэгчдийг үүсгэж бүлэгт нэгтгэх
CREATE ROLE report_bot LOGIN PASSWORD 'pass1';
CREATE ROLE backend_app LOGIN PASSWORD 'pass2';
CREATE ROLE dba_john    LOGIN PASSWORD 'pass3';

GRANT readonly    TO report_bot;
GRANT readwrite   TO backend_app;
GRANT admin_role  TO dba_john;
sql
-- Хэрэглэгчийн эрхийг шалгах
SELECT grantee, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE grantee = 'backend_app'
ORDER BY table_name, privilege_type;

Хэрэглэгч тус бүрд шууд эрх олгохоос илүүтэй бүлгийн role-д эрх тавьж, хэрэглэгчдийг тухайн бүлэгт нэмэх нь удирдахад хамаагүй хялбар.

Row Level Security (RLS)

PostgreSQL нь мөр тус бүрийн эрхийг (RLS) дэмждэг — Supabase үүнийг идэвхлэн ашигладаг:

sql
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;

-- Хэрэглэгч зөвхөн өөрийн хэлтсийнхийг харна
CREATE POLICY dept_isolation ON employees
    FOR SELECT
    USING (department_id = current_setting('app.current_dept_id')::INT);

Дараагийн хичээлд:

PostgreSQL-д JSON ба JSONB өгөгдлийн төрлийг хэрхэн хадгалж, хайж, шинэчлэх — уян хатан бүтэцгүй өгөгдлийг SQL дотор ажиллуулах аргыг сурна.