본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

역할·권한·주입을 막는 보안

~14 min · apps, security

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

앱은 superuser로 연결하지 마

앱 전용 역할을 만들고 필요한 스키마와 테이블의 SELECT·INSERT·UPDATE·DELETE만 줘. ALTER DEFAULT PRIVILEGES로 나중에 생길 테이블의 권한도 정해.

RLS로 행의 경계를 데이터베이스에

행 수준 보안 정책은 현재 사용자나 고객에 따라 모든 질의가 볼 수 있는 행을 제한해. 앱이 WHERE를 빠뜨려도 데이터베이스가 마지막 경계를 지켜.

SQL 주입은 매개변수로 끝내

값은 항상 드라이버 매개변수로 보내. 열 이름처럼 매개변수화할 수 없는 식별자는 허용 목록으로 검사하고 quote_ident 계열 도구를 써.

권한 문장을 구체적으로 써

기본 postgres 사용자가 아니라 app 역할에 SELECT, INSERT, UPDATE, DELETE만 줘. GRANT USAGE ON SCHEMA, GRANT SELECT, INSERT ON TABLE, ALTER DEFAULT PRIVILEGES로 현재와 미래 객체의 권한을 정해. 동적 식별자가 꼭 필요하면 허용 목록 뒤 quote_ident를 써.

Code

최소 권한을 가진 앱 역할·sql
-- 앱이 쓰는 role 생성
CREATE ROLE app LOGIN PASSWORD '****';

-- Schema 사용
GRANT USAGE ON SCHEMA public TO app;

-- 테이블 권한
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app;

-- 미래 테이블이 같은 grant 자동
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app;
행 수준 보안 정책·sql
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

CREATE POLICY posts_owner_only
ON posts
FOR ALL
USING (author_id = current_setting('app.current_user_id')::int);

-- 앱이 각 요청 시작에 user id 설정
SET LOCAL app.current_user_id = '7';
SELECT * FROM posts;  -- author_id = 7 인 행만 반환
매개변수화 질의로 SQL 주입 막기·python
# 드라이버가 escape 실수 없음 보장
cur.execute("SELECT * FROM posts WHERE author_id = %s AND status = %s", (user_id, status))

# 동적 식별자 (드뭄): allowlist + quote_ident
ALLOWED_COLUMNS = {'created_at', 'updated_at', 'title'}
if sort_col not in ALLOWED_COLUMNS:
    raise ValueError("invalid sort column")
cur.execute(
    sql.SQL("SELECT * FROM posts ORDER BY {} DESC").format(sql.Identifier(sort_col))
)

External links

Exercise

샌드박스에서 테이블 하나에 INSERT와 SELECT만 할 수 있는 app 역할을 만들어 그 역할로 연결해. DROP TABLE이 실패하는지 확인한 뒤 세션 변수로 행을 거르는 RLS 정책을 추가하고 동작을 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.