CodeGym /행동 /SQL SELF /접근 제어와 보안

접근 제어와 보안

SQL SELF
레벨 47, 레슨 0
사용 가능

상상해봐, 진짜 악몽이야: 네가 데이터베이스 관리자고, 중요한 고객 데이터 테이블이 갑자기... 사라졌어. 누가 그랬지? 왜? 아마도 실수로 DROP TABLE을 쓴 초보 인턴일 수도 있고, 아니면 권한이 있는 악의적인 사용자가 일부러 그랬을 수도 있지... 뭐가 됐든, 이미 늦었어! 이제 깨어나서 정신 차리고 데이터베이스 보안 공부를 시작해야지. 보안 없는 데이터베이스는 기초 없는 집이랑 똑같으니까.

데이터베이스에서는 이런 위협을 막으려면 보안이 진짜 중요해:

  • 무단 접근: 누군가 권한 없는 데이터를 볼 수 있게 되는 거야.
  • 데이터 유출: 비밀번호, 신용카드, 또는 민감한 정보가 엉뚱한 사람 손에 들어가는 거지.
  • SQL 인젝션: 허술한 쿼리를 통해 해커가 네 데이터베이스를 조작할 수 있는 교활한 방법이야.
  • 사람 실수: 실수로 데이터를 지우거나, 돌이킬 수 없는 변경을 하는 거지.

PostgreSQL에서는 여러 단계에서 보안을 구현해: 역할 생성과 권한 관리부터 네트워크 접근 제한까지. 이 덕분에 누가 뭘 할 수 있는지 유연하게 설정할 수 있어.

PostgreSQL의 주요 보안 레벨

PostgreSQL에는 접근 제어를 할 수 있는 세 가지 주요 레벨이 있어:

1. 데이터베이스 레벨에서의 접근 제어. 여기서는 누가 네 데이터베이스에 접속할 수 있는지, 그리고 접속한 후에 뭘 할 수 있는지 결정해. 예를 들어, 어떤 사용자는 아예 접속을 못 하게 막을 수도 있고, 어떤 사용자는 읽기만 가능하게 할 수도 있어. 이때 핵심 도구가 바로 역할(roles)이야.

2. 테이블, 행, 컬럼 레벨에서의 접근 제어.

PostgreSQL에서는 데이터를 아주 세밀하게 제한할 수 있어. 예를 들면:

  • 특정 컬럼만 읽을 수 있게 허용할 수 있어.
  • 테이블에서, 사용자가 해당 행의 소유자일 때만 데이터를 읽을 수 있게 할 수도 있어. 이걸 ROW LEVEL SECURITY (RLS)라고 하고, 다음 강의에서 자세히 다룰 거야.
  • 중요한 데이터가 있는 데이터베이스의 일부(스키마)에만 접근을 제한할 수도 있어.

3. 네트워크 접근 설정. 데이터베이스는 신뢰할 수 있는 클라이언트의 요청만 받도록 설정할 수 있어. 이건 PostgreSQL의 pg_hba.conf라는 설정 파일에서 해. 이 파일을 통해 예를 들어, 로컬 머신이나 특정 IP에서만 접속을 허용할 수 있지.

PostgreSQL 보안 도구

이제 PostgreSQL이 제공하는 보안 도구들이 실제로 어떻게 동작하는지 알아보자.

먼저 역할과 권한부터 시작할게 — 이게 접근 제어 시스템의 기본이야. PostgreSQL에서 역할은 단순한 사용자가 아니라 더 유연한 개념이야. 한 사람일 수도 있고, 그룹 전체일 수도 있어. 예를 들어, manager라는 역할을 만들어서 주문 테이블에 대한 모든 권한을 주고, 인턴에게는 intern 역할을 줘서 읽기만 가능하게 할 수 있어 — 실수로 망치지 않게 말이야.

역할은 꽤 유연하게 설정할 수 있어: 어떤 사람에게는 더 많은 권한을, 어떤 사람에게는 적게, 그리고 한 역할이 다른 역할의 권한을 상속받게 할 수도 있어. 이걸로 누가 데이터베이스에 접속할 수 있는지, 어떤 스키마와 테이블에 접근할 수 있는지, 심지어 어떤 행을 볼 수 있고 수정할 수 있는지도 정할 수 있지.

다음은 설정 파일들이야. PostgreSQL에는 보안에 중요한 역할을 하는 두 개의 주요 설정 파일이 있어.

첫 번째는 pg_hba.conf야. 이 파일은 데이터베이스에 대한 네트워크 접근을 담당해. 여기서 누가 서버에 접속할 수 있는지, 어떤 IP에서 접속하는지, 인증 방식은 뭔지 설정해. 특정 머신이나 사용자만 접근하게 하고 싶으면 여기서 설정하면 돼.

두 번째 파일은 postgresql.conf야. 이건 서버의 전체 설정을 관리하고, 그중에서도 로깅과 감사(audit) 관련 파라미터를 지정해. 이걸로 누가 뭘 했는지 추적하고, 수상한 활동을 빨리 발견해서 필요하면 자세히 조사할 수 있어.

마지막으로 로깅과 감사야. "로그는 너의 베프다". 좀 이상하게 들릴 수 있지만, 데이터베이스 관리자에게는 이게 1번 원칙이야. PostgreSQL에서는 모든 쿼리와 사용자 행동을 로깅할 수 있어. 뭔가 잘못됐을 때 누가 뭘 했는지 파악하는 데 진짜 도움돼.

예시: SQL 인젝션으로부터 데이터 보호

SQL 인젝션은 데이터베이스 공격 방법 중에서 제일 흔한 거야. 그래서 꼭 방어할 줄 알아야 해. 예를 들어, 사용자가 자신의 계정 ID를 입력해서 프로필을 보는 앱이 있다고 해보자. 앱이 이런 쿼리를 실행해:

SELECT * FROM users WHERE id = 123;

근데 사용자가 숫자 대신 123 OR 1=1을 입력하면 어떻게 될까? 그럼 쿼리가 이렇게 바뀌어:

SELECT * FROM users WHERE id = 123 OR 1=1;

그리고 한 줄만 나와야 할 users 테이블 전체가 다 노출돼버려.

어떻게 막을까? PostgreSQL에서는 파라미터화된 쿼리나 준비된 명령(PREPARE와 EXECUTE)을 써서, 사용자 입력이 SQL 코드랑 섞이지 않게 할 수 있어. 예시는 이래:

PREPARE get_user_by_id (int) AS
SELECT * FROM users WHERE id = $1;

EXECUTE get_user_by_id(123);

실제 위협 사례 더 보기

보안이 왜 중요한지 확실히 알 수 있게, 실제 시나리오 두 개를 들어볼게:

예시 1: "직원이 테이블 전체를 삭제함"

어느 회사에서 (사실 이런 일은 여러 번 있었고, 회사도 많아...) 인턴이 실수로 콘솔에 이런 명령을 쳤어:

DROP TABLE employees;

그리고 10년치 직원 데이터가 한순간에 사라졌지. 이런 걸 어떻게 막을까?

  • 권한을 잘 관리해야 해! 예를 들어, intern 역할에는 읽기만 허용해.
  • 감사(audit)를 설정해! 로그를 보면 누가 치명적인 쿼리를 실행했는지 알 수 있어.

예시 2: "암호화되지 않은 연결로 인한 데이터 유출"

만약 사용자가 PostgreSQL 서버에 암호화 없이 접속하면, 로그인과 비밀번호가 해커에게 노출될 수 있어. SSL을 꼭 설정하고, 연결이 안전한지 확인해.

관리자를 위한 핵심 과제

이 입문 강의의 마지막으로, PostgreSQL 관리자가 꼭 해야 할 세 가지 핵심 과제를 정리할게:

  • 접근 권한 분리. 권한 있는 사용자만 특정 작업을 할 수 있게 해.
  • 암호화. 민감한 데이터는 항상 암호화해서 저장하고 전송해야 해.
  • 모니터링. 감사(audit)를 설정하고, 로그에서 수상한 활동을 꼭 체크해.

다음 강의에서는 역할 생성, GRANT와 REVOKE로 접근 제어, 행 레벨 접근 제어, 그리고 데이터 보호를 위한 암호화 방법까지 배울 거야.

2
과제
SQL SELF, 레벨 47, 레슨 0
잠금
pgAdmin을 사용한 트랜잭션 모니터링
pgAdmin을 사용한 트랜잭션 모니터링
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION