한양과학기술고등학교

에듀테크 프로젝트 대시보드

보안

최소 권한 scram-sha-256 SSL RLS search_path

핵심은 '앱은 필요한 만큼만' — 슈퍼유저로 앱을 돌리지 않는 것부터 시작합니다.

1. 최소 권한

-- 앱 역할은 로그인 + 자기 스키마 권한만
CREATE ROLE school LOGIN PASSWORD '...';
REVOKE ALL ON DATABASE school FROM PUBLIC;
GRANT CONNECT ON DATABASE school TO school;
GRANT USAGE ON SCHEMA app TO school;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO school;
-- DDL 은 마이그레이션 전용 역할로 분리

2. 인증·전송

체크리스트
  • password_encryption = scram-sha-256 (md5 금지)
  • pg_hba.conf 는 DB·유저·CIDR 를 좁게, 마지막 줄 reject
  • 원격 연결은 hostssl + 클라이언트 sslmode=verify-full
  • .env·.pgpass 는 chmod 600, git 제외

3. Row-Level Security

ALTER TABLE notes ENABLE ROW LEVEL SECURITY;

CREATE POLICY note_owner ON notes
USING (owner_id = current_setting('app.user_id')::bigint);

-- 앱이 트랜잭션마다 주입
SET LOCAL app.user_id = '42';
SELECT * FROM notes;   -- 42 의 행만 보임

4. SQL 인젝션·search_path

함정
  • 쿼리 문자열 조립 금지 — 항상 파라미터 바인딩($1, %s). 자세히는 SQL 인젝션
  • 함수는 SET search_path = pg_catalog, pg_temp 를 명시(하이재킹 방지)
  • SECURITY DEFINER 함수는 특히 주의
"트랜잭션은 짧게, 잠금은 더 짧게"