DB 보안 정리 :: VIEW 접근 제어와 SSL 암호화
기본 개념
테이블 전체가 아니라, 미리 정의한 쿼리 결과를 마치 테이블처럼 볼 수 있게 만든 가상의 테이블이 뷰(VIEW)
민감한 컬럼(주민번호, 비밀번호 등)은 빼고, 필요한 컬럼만 보여주는 뷰를 만들어서 그 뷰에만 권한을 주면 됨
기본 문법
CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2 FROM 테이블 WHERE 조건;
실습 흐름 예시
민감한 컬럼이 포함된 원본 테이블 준비
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
department VARCHAR(50),
salary INT,
ssn VARCHAR(20)
);
salary(급여)와 ssn(주민번호)처럼 민감한 정보가 섞여 있는 상태

공개해도 되는 컬럼만 뷰로 만들기
CREATE VIEW public_employees AS
SELECT id, name, department FROM employees;

뷰 조회해보기
SELECT * FROM public_employees;
salary, ssn 컬럼은 애초에 뷰 구조에 없어서 아예 조회 자체가 불가능

일반 계정에는 뷰에만 권한 부여
CREATE USER ‘staff_user’@‘localhost’ IDENTIFIED BY ‘Test1234!’;
GRANT SELECT ON practice_db.public_employees TO ‘staff_user’@‘localhost’;

이 계정은 employees 원본 테이블에는 접근 권한이 아예 없고, public_employees 뷰만 조회 가능
설령 SELECT * FROM employees;를 시도해도 권한 거부됨.

급여나 주민번호 컬럼 자체가 이 계정 입장에서는 “존재하지 않는” 것처럼 완전히 차단됨
조건까지 걸어서 부서별로 제한하는 뷰도 가능
CREATE VIEW it_dept_view AS
SELECT id, name, salary FROM employees WHERE department = ‘IT’;

이렇게 하면 특정 부서 데이터만 보여주는 것도 가능. 컬럼 단위뿐 아니라 행 단위 제한도 뷰로 구현 가능
핵심 포인트
뷰는 “권한을 컬럼 단위로 세밀하게 쪼갤 수 없는” DB의 한계를 실무적으로 우회하는 방법
GRANT는 테이블 전체 단위로 권한을 주는 게 기본이라, “이 컬럼만 보여주고 저 컬럼은 숨기고 싶다”는 요구를 GRANT만으로는 구현하기 어려움. 뷰가 그 틈을 메워줌
━━━━━━━━━━━━━━━━━━
SSL 적용으로 DB 통신 암호화
왜 필요한가
기본적으로 DB 클라이언트와 서버 사이의 통신은 암호화가 안 되어 있으면 평문으로 오감
같은 네트워크에 있는 공격자가 스니핑하면 SQL 쿼리 내용, 심지어 로그인 비밀번호까지 그대로 노출될 수 있음(암호학 노트와 네트워크 가로채기형 노트에서 다룬 스니핑 위협이 여기서 실제로 적용됨)
기본 흐름
MariaDB/MySQL 서버용 SSL 인증서와 키 생성(자체 서명 인증서로 실습 가능)
서버 설정 파일에 SSL 인증서 경로 등록
클라이언트가 접속할 때 SSL을 사용하도록 강제하는 계정 설정
인증서 생성 (자체 서명, 실습용)
mkdir ~/mysql_ssl && cd ~/mysql_ssl
CA(인증기관 역할) 키와 인증서 생성
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem
서버용 키와 인증서 생성
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
서버 설정에 SSL 등록
/etc/mysql/mariadb.conf.d/50-server.cnf 파일에 [mysqld] 섹션 아래 추가
ssl-ca=/home/사용자명/mysql_ssl/ca-cert.pem
ssl-cert=/home/사용자명/mysql_ssl/server-cert.pem
ssl-key=/home/사용자명/mysql_ssl/server-key.pem

서버 재시작
sudo systemctl restart mariadb
SSL 적용 확인
sudo mysql
SHOW VARIABLES LIKE ‘%ssl%’;
have_ssl 값이 YES로 나오면 SSL이 활성화된 상태

특정 계정에 SSL 접속 강제하기
CREATE USER ‘secure_user’@‘localhost’ IDENTIFIED BY ‘Test1234!’ REQUIRE SSL;
이 계정은 SSL 연결이 아니면 접속 자체가 거부됨


접속 시 SSL 상태 확인
mysql -u secure_user -p –ssl-mode=REQUIRED
접속 후
STATUS;
Cipher 항목에 암호화 방식이 표시되면 SSL로 연결된 것
