본문 바로가기

정보보안/애플리케이션 보안

[애플리케이션 보안] 데이터베이스 보안

데이터베이스 보안 위협과 통제

① 데이터베이스 보안 위협

  • 집성(Aggregation) : 낮은 보안 등급의 정보를 조합해 높은 보안 등급의 정보를 알아내는 것. 
    • (중요등급: 개별데이터항목 < 종합데이터정보) -> 심각한 기밀정보 유출문제 발생
    •  (ex) 매장 개별매출보다 모든 매장 매출 조합시, 매장의 총 매출 정보 계산 가능
  • 추론(Inference) : 보안등급이 없는 일반 사용자가 보안으로 분류되지 않은 정보를 정당하게 접근해 기밀 정보를 유추해내는 행위
    • 통계정보로부터 발생 -> 개개의 개체에 대한 정보를 통계로부터 추론 못하게 해야함.
    • (ex) (공개정보) 계약직 직원의 평균 연봉과 인원수 -> 계약직 직원 수가 1명이라면 결국 평균=총계. ->추론가능

 

② 데이터베이스 보안 통제

  1. 접근 통제 : 데이터베이스 사용자가 가진 접근 권한의 범위 내에서 데이터 접근을 허용하는 기술적 방법
    • DBA는 접근 통제를 위해 사용자/역할/그룹별로 다음과 같은 사항 결정
      • 접근 가능 데이터
      • 데이터의 접근 수준(필드 수준/레코드 수준 등)
      • 데이터에 허용할 작업(읽기/변경/삽입/추가/삭제 등)
    • 체계적으로 정책 확립 및 수행 필요
  2. 추론 통제 : 통계 정보 등 간접적으로 노출된 데이터를 통해 민감/기밀데이터가 유추되어 공개되는 것을 방지하는 것
    • (완벽한 해결책은 존재 x) 일반적인 추론 방지 방법
      • 허용 가능한 질의 제한
      • 질의의 응답으로 제공되는 데이터 한정
      • 데이터가 숫자인 경우 반올림/일관성 없는 질의 결과 제공
  3. 흐름 통제 : 접근이 가능한 객체 간의 정보의 흐름을 조정하는 것
    • 정보의 흐름 : a테이블의 데이터가 b 테이블에 기록이 되었다면 이를 'a에서 b로 흐름이 발생했다' 라고 정의
    • 정보의 흐름으로 볼 때 보안 등급이 높은 객체에서 보안 등급이 낮은 개체로의 정보 흐름을 제어해야함.

 

DBMS 보안 통제

① SQL 문 분류

분류명 종류 정의
DML
(Data Manipulation Language)
데이터 조작어
SELECT,UPDATE,INSERT,DELETE 원하는 데이터를 조작(조회,수정,삽입,삭제) 하는 SQL문
DDL
(Data Definition Language)
데이터 정의어
CREATE,DROP,ALTER 객체를 정의하거나 삭제/변경할때 사용하는 SQL문
DCL
(Data Control Language)
데이터 제어어
GRANT,REVOKE (관리목적) 권한부여,권한제거할 때 사용하는 SQL문
TCL
(Transaction Control Language)
트랜잭션 제어어
COMMIT,ROLLBACK 논리적인 작업의 단위를 묶어 DML에 의해 처리된 결과를 작업단위(트랜젝션)로 제어하는 명령어

 

② 접근 통제 종류

뷰(View) 기반 접근통제
  • 뷰는 실행시간에 구체화된다. 그래서 그 정의 자체를 권한 부여 기법으로 사용할 수 있다. 기본 테이블에서 허용하는 일부 컬럼에 대해서만 뷰를 통해 제공함으로써 권한없는 사용자로부터 민감한 데이터를 은닉시킨다.
  • (뷰 생성 명령어) CREATE VIEW [뷰 이름] AS SELECT 컬럼명1,컬럼명2 FROM 중요정보테이블;
SQL 기반 접근통제
  • 뷰 기반은 중요 데이터가 노출되는 것은 막을 수 있찌만 데이터베이스 객체에서 수행하는 작업(DML/DDL)에 대해 제한할 수 잇는 방법은 아니다.
  • DCL(GRANT/REVOKE)를 이용해 데이터베이스 객체에 대한 작업 권한을 제어.
  • (권한 부여 명령어)  GRANT [부여할 권한] ON [데이터베이스 객체(테이블 등)] TO [사용자] [WITH GRANT OPTION]
    • WITH GRANT OPTION : 사용자가 부여받은 권한을 다른 사용자에게 또다시 부여할 수 있는 권한
      • CREATE,ALTER,DROP : 객체 생성,변경삭제 권한
      • SELECT,INSERT,UPDATE,DELETE : 레코드 조회,입력,수정,삭제 권한
      • ALL : 모든 권한
      • USAGE : 계정만 생성된 상태로 부여된 권한 없음
    • 해당 권한을 부여받은 사용자는 다른 사용자에게도 그 권한을 부여할 수 있다. (그 권한에 한정하여)
  • (권한 확인 명령여) : (mysql) SHOW GRANTS FOR [계정명]
  • (권한 해제 명령어) : (mysql) REVOKE [해제할 권한] ON [데이터베이스 객체(테이블 등)] FROM [사용자]

 

데이터베이스 암호화 기술
컬럼 암호화 & 블록 암호화

 

① 컬럼 암호화 방식 : 테이블의 컬럼 단위로 데이터를 암호화하여 저장하는 방식

  1. API 방식 : (응용 프로그램 자체 암호화 방식) 암/복호화 모듈이 API 라이브러리 형태로 각 애플리케이션 서버에 설치되어 응용 프로그램에서 해당 암/복호화 모듈을 호출하는 방식
    • (장점) DB 서버에 영향을 주지 않아 DB 서버 성능 저하가 적고(빠르고) 암호화된 데이터 통신을 보장(암호화 구간이 길다)한다.
    • (단점) 구축 시 응용 프로그램 전체 또는 일부 수정이 필요하며 적용된 미들웨어 패치에 영향을 받는다.
    • (권장) 기존 운영중인 시스템보단 차세대 시스템 개발 등 기존 애플리케이션에 대한 전면적인 수정이 가능한 경우 적용하면 효과적이다.
  2. Plug-In 방식 : (DB 서버 암호화 방식) 암/복호화 모듈이 DB 서버에 설치되고 DB서버에서 플러그인으로 연결된 암/복호화 모듈을 호출하는 방식
    • (장점) 구축 시 응용 프로그램의 수정을 최소화하면서 DB서버의 암호화를 보장한다.
    • (단점) 기존 DB 스키마에 대응하는 뷰를 생성하고 암호화할 테이블을 추가하는 등의 작업이 필요하며, 대용량 처리 시 암/복호화 처리에 따른 DB 서버의 부하가 크다. 또한, DB 서버 패치에 영향을 받고 암호화 구간이 짧다.
      • 플러그인 방식의 구성에서 테이블/컬럼을 암호화하게 된면 기존 테이블 이름과 동일한 뷰와 변경된 이름의 암호화된 테이블이 생성되고 암호화 전 원본 테이블은 삭제된다.
      • 뷰는 암호화된 테이블에 저장된 데이터를 복호화해서 보여주는 통로역할을 수행하며, 데이터 변경이 발생하는 DML 요청이 발생하면 트리거를 통해 암호화하여 암호화된 테이블에서 처리한다. 기존 테이블명과 동일한 이름으로 뷰를 생성하기 때문에 원본테이블을 사용하던 기존 애플리케이션의 질의변경을 최소화할 수 있다.
    • (권장) DB서버에서 암/복호화 모듈을 플러그인으로 호출할 때 추가적인 부하가 발생하여 성능이 저하될 수 있으므로 트랜잭션 처리량이 많지 않아 성능에 대한 민감성이 낮은 시스템에 적용하기 적합한 방식이다.
  3. Hybrid(혼합) 방식 : API 방식 + Plug-In 방식
    • 대용량 트랜잭션 처리와 같이 Plug-In 방식을 사용하면 성능 저하가 발생할 수 있는 부분은 API 방식을 사용해 최적의 성능을 보장하도록 하고, 나머지 부분들은 Plug-In 방식을 사용해 애플리케이션의 수정을 최소화하는 방식

 

② 블록 암호화 방식 : DBMS 블록 또는 파일 블록 단위로 암호화하여 저장하는 방식

  1. TDE(Transparent Data Encryption) : (DBMS 자체 암호화 방식) DBMS에 내장된 암호화 기능을 이용해 DB 내부에서 데이터 파일 저장 시 암호화하고 파일에 저장된 내용을 메모리 영역으로 가져올 때 DBMS에 의해 자동으로 복호화되는 방식
    • (장점) DBMS 커널 수준에서 처리되므로 기존 으용 프로그램의 수정이나 DB 스키마의 변경이 거의 필요하지 않고 DBMS 엔진에 최적화된 성능 제공 
    • (단점) DBMS에 의존하게 되어 DBMS 종류 및 버전에 따라 기능 지원 여부가 결정된다.
  2. 파일 암호화 방식: (운영체제 암호화 방식) 운영체제(OS)에서 파일을 암호화하는 방식
    • (장점) 파일에 대해 암호화를 수행하므로 DB 파일뿐만 아니라 로그파일, 이미지파일, 음성/영상 등 다양한 비정형 데이터에 대한 암호화 적용이 가능하다.
    • (장점) 응용 프로그램이나 DB 스키마의 수정이 필요하지 않으며, 거의 모든 DBMS에 적용할 수 있다.
    • (단점) 파일 전체를 암호화는 데 따른 DB 서버에 추가적인 부하가 발생하며, 운영체제에 따라 지원여부가 달리질 수 있다.

 

데이터베이스 취약점 점검
mysql 기준

① (mysql)기본생성 테이블 (mysql 설치 시 자동 생성)

  • user : 데이터베이스 전체에 적용되는 사용자 정보와 권한 정보 테이블
  • host : 호스트 전체에 대한 데이터베이스 접근 권한 정보 테이블
  • db : 각각의 데이터베이스에 대한 접근 권한 정보 테이블
  • table_priv : 테이블에 대한 접근 권한 정보 테이블
  • columns_priv : 컬럼에 대한 접근 권한 정보 테이블

 

② (mysql)DBMS 취약점 점검

  1. 디폴트 관리자(root) 패스워드 및 계정명 변경
    1. mysql 디폴트 설치 시 비어있는(NULL) 데이터베이스 관리자(root) 패스워드를 설정한다.
      • user 테이블에 root 사용자의 패스워드가 초기 설치 상태로 비워져있음. (select host,user,password from user;결과)
        host user password
        localhost root  
        localhost.localdomain root  
      • update 구문을 이용하여 root 계정의 패스워드를 변경한다.
        • update user set password=password('암호화할패스워드') where user='root'
        • flush privilieges(사용자 정보의 추가,변경,삭제 등을 수행했을 때 변경사항을 즉시 반영하기 위한 명령)
    2. 디폴트 관리자 계정명 root를 무작위 대입공격 등으로 추측하기 어려운 이름으로 변경한다.
      • update 구문을 이용해 Root 계정 이름 변경
        • update user set user='어려운이름' where user='root'
        • flush privilieges(사용자 정보의 추가,변경,삭제 등을 수행했을 때 변경사항을 즉시 반영하기 위한 명령)
  2. mysql 설치 시 서버에 자동으로 생성되는 mysql 계정의 로그인 차단
    • mysql 설치 시 mysql계정이 자동으로 생성된다. 
    • (로그인 차단)/etc/passwd 파일을 점검해 mysql 계정의 로그인쉘을 로그인 할 수없도록 지정
      • /bin/false
      • /sbin/nologin
  3. 원격에서 mysql 서버로의 접속 차단
    • (포트 차단) mysql의 디폴트 서비스 포트인 3306/tcp 포트를 차단해 로컬에 설치된 애플리케이션(PHP 등)에 의해서만 접근 가능하도록 한다.
      • 설정파일 및 경로 : /var/lib/mysql/my.cnf
      • 추가항목 : [mysqld] 항목에 skip-networking 추가
    • skip-networking을 추가하면 네트워킹 기능을 비활성화해 서비스 포트를 오픈하지 않는다. 네트워킹서비스를 비활성화 하더라도 로컬호스트에서는 애플리케이션 접근이 가능함(mysql.sock이라는 유닉스 도메인 소켓을 이용해 통신하기 때문)
  4. 데이터베이스의 사용자별 접속/권한 설정 확인
    • user 테이블의 host 컬럼 : 해당 사용자가 데이터베이스에 접근할 수 있는 호스트를 지정하는 컬럼
      • localhost : 로컬호스트에서만 접근 가능
      • % : %는 와일드카드 문자로 모든 이름을 의미하며 모든 원격 호스트에서 접근 가능
      • 특정 IP : 특정 IP에서만 접근 가능
      • XXX.XXX.XFXX.% : 특정 IP 대역에서만 접근 가능 (ex.10.10.10.% = 10.10.10.0/24대역)
    • user 테이블에서 명령어 실행 접근권한 확인(각 컬럼의 값 Y/N 여부로 확인한다.)
      • Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv : 각 명령어를 실행할 수 있는 권한
      • File_priv : 파일에 데이터를 읽고 쓸 수 있는 권한
        • select into outfile 출력파일명
        • load data infile 입력파일명
      • Process_priv : mysql 서버 프로세스/스레드 정보를 보거나 중지시킬 수 있는 권한
        • show processlist : 실행중인 질의를 모니터링 할 수 있어 비밀번호와 같은 중요 정보 노출가능.
      • Shutdown_priv "mysqladmin shutdown" 명령을 이용해 mysql 서버를 종료시킬 수 있는 권한
  5. mysql 버전 확인 및 보안패치 적용 여부 점검 : 취약점 발견된 버전이면 적절한 보안 패치를 수행한다.
  6. mysql 데이터 디렉터리 보호 여부 점검
    • mysql 데이터/로그 저장방식: 파일형태로 저장
      • 해당 권한을 잘못 설정할 경우, 일반 사용자 또는 서버를 해킹한 해커에 의해 데이터 및 로그가 삭제되는 사고 발생 가능
    • 디렉터리 위치 확인 : my.cnf > [mysqld] > datadir = "디렉터리위치"
    • 해당 접근권한을 750으로 설정해 mysql 계정(Mysql 서비스 계쩡) 및 그룹 사용자에 대해서만 적절히 접근할 수 있도록 설정