보안과 권한 관리

보안과 권한 관리

보안과 권한 관리

데이터베이스 보안의 유형과 SQL을 이용한 권한 관리, 역할(Role) 기반 접근 제어를 다룬다.


1. 데이터베이스 보안

1.1 보안의 목표

조직에서 허가한 사용자만 데이터베이스에 접근할 수 있도록 통제하여 데이터를 보호하는 것이다.

1.2 보안의 유형

┌─────────────────────────────────────────────────────────────────────────┐
│                      데이터베이스 보안 유형                              │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   ┌─────────────────┐   ┌─────────────────┐   ┌─────────────────┐       │
│   │  물리적 환경    │   │   권한 관리     │   │   운영 관리     │       │
│   │     보안        │   │     보안        │   │     보안        │       │
│   └────────┬────────┘   └────────┬────────┘   └────────┬────────┘       │
│            │                     │                     │                │
│            ▼                     ▼                     ▼                │
│   ┌─────────────────┐   ┌─────────────────┐   ┌─────────────────┐       │
│   │ • 자연재해      │   │ • 접근 제어     │   │ • 무결성 제약   │       │
│   │ • 화재/침수     │   │ • 계정 관리     │   │ • 데이터 검증   │       │
│   │ • 물리적 침입   │   │ • 권한 부여/취소│   │ • 감사 로그     │       │
│   └─────────────────┘   └─────────────────┘   └─────────────────┘       │
│            │                     │                     │                │
│            ▼                     ▼                     ▼                │
│      외부 위협으로부터     권한 없는 사용자로부터   권한 있는 사용자의   │
│         DB 보호               DB 보호              실수로부터 DB 보호   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
보안 유형보호 대상주요 방법
물리적 환경 보안자연재해, 물리적 손상백업, 이중화, 재해 복구 센터
권한 관리 보안권한 없는 사용자접근 제어, 계정 관리, GRANT/REVOKE
운영 관리 보안권한 있는 사용자의 실수무결성 제약조건, 감사 로그

2. 권한 관리

2.1 권한 관리의 개념

┌─────────────────────────────────────────────────────────────────────────┐
│                        접근 제어 흐름                                    │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   사용자                                                                │
│     │                                                                   │
│     ▼                                                                   │
│   ┌─────────────────┐                                                   │
│   │   로그인 시도   │                                                   │
│   │ (계정 + 암호)   │                                                   │
│   └────────┬────────┘                                                   │
│            │                                                            │
│            ▼                                                            │
│   ┌─────────────────┐    실패    ┌─────────────────┐                    │
│   │   접근 제어     │ ─────────► │   접근 거부     │                    │
│   │ (Access Control)│            └─────────────────┘                    │
│   └────────┬────────┘                                                   │
│            │ 성공                                                       │
│            ▼                                                            │
│   ┌─────────────────┐                                                   │
│   │  권한 확인      │                                                   │
│   │  (Authorization)│                                                   │
│   └────────┬────────┘                                                   │
│            │                                                            │
│            ▼                                                            │
│   ┌─────────────────┐                                                   │
│   │ 허용된 작업만   │                                                   │
│   │   수행 가능     │                                                   │
│   └─────────────────┘                                                   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

2.2 객체 권한의 종류

권한설명적용 대상
SELECT데이터 조회테이블, 뷰
INSERT데이터 삽입테이블, 뷰
UPDATE데이터 수정테이블, 뷰 (속성 지정 가능)
DELETE데이터 삭제테이블, 뷰
REFERENCES외래키로 참조테이블
ALL모든 권한테이블, 뷰

2.3 권한 부여 (GRANT)

GRANT 권한 ON 객체 TO 사용자 [WITH GRANT OPTION];

기본 예제

-- 특정 사용자에게 SELECT 권한 부여
GRANT SELECT ON 고객 TO user1;

-- 여러 권한 동시 부여
GRANT SELECT, INSERT, UPDATE ON 주문 TO user2;

-- 모든 권한 부여
GRANT ALL ON 제품 TO user3;

-- 모든 사용자에게 권한 부여
GRANT SELECT ON 공지사항 TO PUBLIC;

속성별 권한 부여

-- 특정 속성에만 UPDATE 권한 부여
GRANT UPDATE(전화번호, 주소) ON 고객 TO user1;

-- 특정 속성에만 SELECT 권한 부여
GRANT SELECT(고객명, 이메일) ON 고객 TO user2;

WITH GRANT OPTION

-- 권한을 다른 사용자에게 전파할 수 있는 권한 부여
GRANT SELECT ON 고객 TO user1 WITH GRANT OPTION;
┌─────────────────────────────────────────────────────────────────────────┐
│                  WITH GRANT OPTION 권한 전파                             │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│                      ┌─────────┐                                        │
│                      │  DBA    │ (객체 소유자)                          │
│                      └────┬────┘                                        │
│                           │                                             │
│           GRANT ... WITH GRANT OPTION                                   │
│                           │                                             │
│                           ▼                                             │
│                      ┌─────────┐                                        │
│                      │  user1  │ ← 권한 전파 가능                       │
│                      └────┬────┘                                        │
│                           │                                             │
│                     GRANT ...                                           │
│              ┌────────────┼────────────┐                                │
│              │            │            │                                │
│              ▼            ▼            ▼                                │
│         ┌─────────┐  ┌─────────┐  ┌─────────┐                           │
│         │  user2  │  │  user3  │  │  user4  │                           │
│         └─────────┘  └─────────┘  └─────────┘                           │
│                                                                         │
│   user1이 권한을 다른 사용자에게 부여할 수 있음                         │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

2.4 권한 취소 (REVOKE)

REVOKE 권한 ON 객체 FROM 사용자 CASCADE | RESTRICT;
옵션설명
CASCADE연쇄적으로 권한 취소 (전파된 권한도 함께 취소)
RESTRICT전파된 권한이 있으면 취소 거부

기본 예제

-- 특정 사용자의 SELECT 권한 취소
REVOKE SELECT ON 고객 FROM user1;

-- 여러 권한 동시 취소
REVOKE INSERT, UPDATE ON 주문 FROM user2;

-- 연쇄적 권한 취소 (user1이 부여한 권한도 함께 취소)
REVOKE SELECT ON 고객 FROM user1 CASCADE;

-- 전파된 권한이 있으면 취소 거부
REVOKE SELECT ON 고객 FROM user1 RESTRICT;

CASCADE vs RESTRICT

┌─────────────────────────────────────────────────────────────────────────┐
│                    CASCADE vs RESTRICT 비교                              │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   [초기 상태]                                                           │
│   DBA ──GRANT──► user1 ──GRANT──► user2 ──GRANT──► user3               │
│                                                                         │
│   ─────────────────────────────────────────────────────────────────     │
│                                                                         │
│   [CASCADE: REVOKE ... FROM user1 CASCADE]                              │
│   DBA           user1           user2           user3                   │
│    │              ✗               ✗               ✗                     │
│    │         권한 취소        연쇄 취소       연쇄 취소                 │
│                                                                         │
│   ─────────────────────────────────────────────────────────────────     │
│                                                                         │
│   [RESTRICT: REVOKE ... FROM user1 RESTRICT]                            │
│   → user1이 다른 사용자에게 권한을 부여했으므로 취소 거부 (에러)        │
│   → 먼저 user2, user3의 권한을 취소해야 함                              │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

2.5 시스템 권한

시스템 권한은 DDL 관련 작업에 대한 권한으로, DBA가 부여한다.

시스템 권한설명
CREATE TABLE테이블 생성 권한
CREATE VIEW뷰 생성 권한
CREATE INDEX인덱스 생성 권한
CREATE USER사용자 생성 권한
DROP ANY TABLE모든 테이블 삭제 권한
-- 시스템 권한 부여 (DBA가 수행)
GRANT CREATE TABLE TO user1;
GRANT CREATE VIEW, CREATE INDEX TO user2;

-- 시스템 권한 취소
REVOKE CREATE TABLE FROM user1;

3. 역할 (Role)

3.1 역할의 개념

역할(Role) 은 여러 권한을 그룹으로 묶어놓은 것으로, 권한 관리를 효율적으로 수행할 수 있다.

┌─────────────────────────────────────────────────────────────────────────┐
│                      역할 기반 권한 관리                                 │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   [개별 권한 부여 방식]              [역할 사용 방식]                    │
│                                                                         │
│   권한1 ────► user1                 권한1 ─┐                            │
│   권한2 ────► user1                 권한2 ─┼──► ROLE ──┬──► user1       │
│   권한3 ────► user1                 권한3 ─┘           ├──► user2       │
│   권한1 ────► user2                                    └──► user3       │
│   권한2 ────► user2                                                     │
│   권한3 ────► user2                                                     │
│   권한1 ────► user3                                                     │
│   권한2 ────► user3                 ✓ 한 번에 여러 권한 부여            │
│   권한3 ────► user3                 ✓ 권한 변경 시 자동 반영            │
│                                     ✓ 관리 용이                         │
│   ✗ 반복 작업 필요                                                      │
│   ✗ 변경 시 모두 수정                                                   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

3.2 역할 관리 명령어

역할 생성 (DBA)

CREATE ROLE 역할이름;

역할에 권한 추가 (객체 소유자)

GRANT 권한 ON 객체 TO 역할이름;

역할을 사용자에게 부여 (DBA)

GRANT 역할이름 TO 사용자;

역할 취소 (DBA)

REVOKE 역할이름 FROM 사용자;

역할 삭제 (DBA)

DROP ROLE 역할이름;

3.3 역할 활용 예제

-- 1. 역할 생성 (DBA)
CREATE ROLE sales_role;
CREATE ROLE manager_role;

-- 2. 역할에 권한 추가 (객체 소유자)
GRANT SELECT ON 고객 TO sales_role;
GRANT SELECT ON 주문 TO sales_role;
GRANT INSERT ON 주문 TO sales_role;

GRANT SELECT, INSERT, UPDATE, DELETE ON 고객 TO manager_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON 주문 TO manager_role;
GRANT SELECT, INSERT, UPDATE ON 제품 TO manager_role;

-- 3. 역할을 사용자에게 부여 (DBA)
GRANT sales_role TO kim, lee, park;
GRANT manager_role TO choi;

-- 4. 역할에 권한 추가 (자동으로 모든 사용자에게 반영)
GRANT SELECT ON 제품 TO sales_role;
-- → kim, lee, park 모두 제품 테이블 조회 가능

-- 5. 역할 취소
REVOKE sales_role FROM park;

-- 6. 역할 삭제
DROP ROLE sales_role;
-- → sales_role을 가진 모든 사용자의 권한도 취소됨

3.4 역할 계층 구조

┌─────────────────────────────────────────────────────────────────────────┐
│                       역할 계층 구조 예시                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│                        ┌──────────────┐                                 │
│                        │   DBA_ROLE   │ ← 모든 권한                     │
│                        └──────┬───────┘                                 │
│                               │                                         │
│              ┌────────────────┼────────────────┐                        │
│              │                │                │                        │
│              ▼                ▼                ▼                        │
│   ┌──────────────┐  ┌──────────────┐  ┌──────────────┐                  │
│   │ MANAGER_ROLE │  │ ANALYST_ROLE │  │  DEV_ROLE    │                  │
│   │              │  │              │  │              │                  │
│   │ • 전체 CRUD  │  │ • SELECT ALL │  │ • 개발 DB    │                  │
│   │ • 사용자관리 │  │ • 리포트생성 │  │   접근권한   │                  │
│   └──────┬───────┘  └──────────────┘  └──────────────┘                  │
│          │                                                              │
│          ▼                                                              │
│   ┌──────────────┐                                                      │
│   │  STAFF_ROLE  │ ← 기본 조회/입력 권한                                │
│   └──────────────┘                                                      │
│                                                                         │
│   역할에 다른 역할을 부여하여 계층 구조 생성 가능                       │
│   GRANT STAFF_ROLE TO MANAGER_ROLE;                                     │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

4. 데이터 암호화

4.1 암호화 개념

용어설명
평문(Plaintext)암호화되지 않은 원본 데이터
암호문(Ciphertext)암호화된 데이터
암호화(Encryption)평문 → 암호문 변환
복호화(Decryption)암호문 → 평문 변환
키(Key)암호화/복호화에 사용되는 비밀 값
┌─────────────────────────────────────────────────────────────────────────┐
│                        암호화/복호화 과정                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   ┌─────────┐      암호화       ┌─────────┐      복호화       ┌─────────┐
│   │  평문   │ ─────────────────► │ 암호문  │ ─────────────────► │  평문   │
│   │ "Hello" │      + 키         │ "Xk2#p" │      + 키         │ "Hello" │
│   └─────────┘                   └─────────┘                   └─────────┘
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

4.2 암호화 방식 비교

┌─────────────────────────────────────────────────────────────────────────┐
│                  대칭 암호화 vs 비대칭 암호화                            │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   [대칭 암호화]                    [비대칭 암호화 (공개키)]              │
│                                                                         │
│   암호화 키 = 복호화 키            공개키 ≠ 개인키                       │
│                                                                         │
│   ┌──────┐  동일 키  ┌──────┐      ┌──────┐  공개키   ┌──────┐          │
│   │ 송신 │ ◄───────► │ 수신 │      │ 송신 │ ────────► │ 수신 │          │
│   └──────┘           └──────┘      └──────┘  암호화   └──────┘          │
│                                                         │               │
│   예: DES, AES                                          ▼               │
│                                                    개인키로 복호화      │
│   장점: 빠른 속도                                                       │
│   단점: 키 공유 문제                 예: RSA                            │
│                                                                         │
│                                    장점: 키 공유 불필요                 │
│                                    단점: 느린 속도                      │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
구분대칭 암호화비대칭 암호화
키 구성동일한 키 사용공개키 + 개인키
속도빠름느림
키 관리키 공유 필요 (보안 문제)공개키 배포 가능
대표 알고리즘DES, AESRSA
용도대용량 데이터 암호화키 교환, 전자서명

4.3 주요 암호화 알고리즘

알고리즘유형키 크기특징
DES대칭56비트구식, 보안 취약
AES대칭128/192/256비트현재 표준, 빠름
RSA비대칭1024~4096비트산업 표준, 전자서명

4.4 MySQL 암호화 함수

-- AES 암호화/복호화
SET @key = 'my_secret_key_123';

-- 암호화
INSERT INTO 사용자 (아이디, 비밀번호)
VALUES ('user1', AES_ENCRYPT('password123', @key));

-- 복호화
SELECT 아이디, AES_DECRYPT(비밀번호, @key) AS 비밀번호
FROM 사용자
WHERE 아이디 = 'user1';

-- SHA2 해시 (단방향 - 복호화 불가)
INSERT INTO 사용자 (아이디, 비밀번호)
VALUES ('user2', SHA2('password123', 256));

-- 비밀번호 검증
SELECT * FROM 사용자
WHERE 아이디 = 'user2'
  AND 비밀번호 = SHA2('password123', 256);

5. 실무 예제

5.1 사용자 및 권한 관리 (MySQL)

-- 1. 사용자 생성
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'secure_password';
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'readonly_pass';

-- 2. 데이터베이스 레벨 권한 부여
GRANT ALL PRIVILEGES ON shop_db.* TO 'app_user'@'localhost';
GRANT SELECT ON shop_db.* TO 'readonly_user'@'%';

-- 3. 테이블 레벨 권한 부여
GRANT SELECT, INSERT ON shop_db.orders TO 'sales_user'@'localhost';
GRANT UPDATE(status) ON shop_db.orders TO 'sales_user'@'localhost';

-- 4. 권한 적용
FLUSH PRIVILEGES;

-- 5. 권한 확인
SHOW GRANTS FOR 'app_user'@'localhost';

-- 6. 권한 취소
REVOKE INSERT ON shop_db.orders FROM 'sales_user'@'localhost';

-- 7. 사용자 삭제
DROP USER 'readonly_user'@'%';

5.2 역할 관리 (MySQL 8.0+)

-- 1. 역할 생성
CREATE ROLE 'app_read', 'app_write', 'app_admin';

-- 2. 역할에 권한 부여
GRANT SELECT ON shop_db.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON shop_db.* TO 'app_write';
GRANT ALL PRIVILEGES ON shop_db.* TO 'app_admin';

-- 3. 사용자에게 역할 부여
GRANT 'app_read' TO 'user1'@'localhost';
GRANT 'app_read', 'app_write' TO 'user2'@'localhost';
GRANT 'app_admin' TO 'admin'@'localhost';

-- 4. 기본 역할 설정
SET DEFAULT ROLE 'app_read' TO 'user1'@'localhost';
SET DEFAULT ROLE ALL TO 'user2'@'localhost';

-- 5. 현재 세션에서 역할 활성화
SET ROLE 'app_read';
SET ROLE ALL;

-- 6. 역할 삭제
DROP ROLE 'app_read';

5.3 뷰를 통한 접근 제어

-- 민감한 정보를 제외한 뷰 생성
CREATE VIEW 고객_공개정보 AS
SELECT 고객ID, 고객명, 가입일
FROM 고객;
-- 주민번호, 연락처 등 민감 정보 제외

-- 특정 조건의 데이터만 노출하는 뷰
CREATE VIEW _주문 AS
SELECT * FROM 주문
WHERE 고객ID = CURRENT_USER();

-- 뷰에 대한 권한 부여
GRANT SELECT ON 고객_공개정보 TO 'public_user'@'localhost';

6. 핵심 요약

┌─────────────────────────────────────────────────────────────────────────┐
│                      보안과 권한 관리 요약                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│   보안 유형                                                             │
│   ├── 물리적 환경 보안: 자연재해, 물리적 손상으로부터 보호              │
│   ├── 권한 관리 보안: 권한 없는 사용자로부터 보호 (GRANT/REVOKE)        │
│   └── 운영 관리 보안: 권한 있는 사용자의 실수로부터 보호 (무결성)       │
│                                                                         │
│   권한 관리                                                             │
│   ├── GRANT: 권한 부여                                                  │
│   │   └── WITH GRANT OPTION: 권한 전파 허용                             │
│   ├── REVOKE: 권한 취소                                                 │
│   │   ├── CASCADE: 연쇄 취소                                            │
│   │   └── RESTRICT: 전파된 권한 있으면 거부                             │
│   └── 권한 종류: SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALL        │
│                                                                         │
│   역할 (Role)                                                           │
│   ├── CREATE ROLE: 역할 생성                                            │
│   ├── GRANT 권한 TO 역할: 역할에 권한 추가                              │
│   ├── GRANT 역할 TO 사용자: 사용자에게 역할 부여                        │
│   ├── REVOKE 역할 FROM 사용자: 역할 취소                                │
│   └── DROP ROLE: 역할 삭제                                              │
│                                                                         │
│   암호화                                                                │
│   ├── 대칭 암호화: 동일 키 (DES, AES) - 빠름                            │
│   └── 비대칭 암호화: 공개키/개인키 (RSA) - 안전                         │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
작업명령어수행자
권한 부여GRANT 권한 ON 객체 TO 사용자객체 소유자
권한 취소REVOKE 권한 ON 객체 FROM 사용자객체 소유자
역할 생성CREATE ROLE 역할명DBA
역할 부여GRANT 역할 TO 사용자DBA
역할 삭제DROP ROLE 역할명DBA