Chap5. 무결성과 보안

Dora·2020년 12월 4일
0

무결성 제약

무결성 제약의 유형

무결성(integrity)
: 저장된 데이터가 실제 세계에 존재하는 정보들을 모순 없이 반영하는 성질.
= 갖추어야 할 제약 조건을 항상 만족하도록 보장하는 성질.
= 무결성 제약(constraint) 또는 무결성 규칙(rule)

Q. 데이터 베이스에서 이러한 무결성 제약 조건들을 만족시키려면 어떻게 해야할까?
A1. 데이터 삽입, 삭제, 수정시 수동으로 검증한다.
-> 데이터 양이 방대하거나 변경 빈도가 높을 경우 거의 불가능하다.

A2. DBMS가 자동으로 보장해준다.

대략적인 무결성 제약 유형

기본적 무결성 제약

: 관계형 데이터 모델의 정의로부터 규정된 제약들.
(기본키와 외래키를 정의할 때 반드시 지켜져야 할 규칙으로부터 시작)

기본키 무결성 제약 (primary key integrity constraint)

: 테이블에서 레코드들은 반드시 유일하게 식별될 수 있어야 한다.

  • 정의 : 기본키는 널 값을 가질 수 없으며 기본키의 값이 동일한 레코드가 하나의 테이블에 동시에 두 개 이상 존재할 수 없다.

  • 사용자가 기본키를 정의하여 테이블을 생성하면 기본키 무결성 제약은 DBMS에서 자동적으로 검증된다. (제약을 위반하는 레코드가 입력되면 자동적으로 거부됨)

참조 무결성 제약 (referential integrity constraint)

: 한 테이블의 레코드가 다른 테이블을 참조할 때, 참조되는 테이블에 해당 레코드가 반드시 존재하거나, 참조할 레코드가 없는 경우 널 값을 가져야 한다는 제약이다. (== 외래키 조건)

  • 실제 존재하지 않는 잘못된 값이 저장되지 않도록 보정하는 수단.

  • 참조 무결성 제약은 삽입, 삭제, 수정 등의 연산에 의해 위배될 수 있는데, 위배 시 해당 연산을 DBMS에서 실행 거부한다.

테이블 무결성 제약

NOT NULL

사용 : 특정 필드에 대해서 널 값의 입력을 허용하지 않아야 하는 경우.

ex. 주민등록번호처럼 반드시 존재해야 하는 값.

create table student
(
	stu_id	varchar2(10),
	resident_id	 varchar2(14)	 not null
)
  • not null로 지정된 필드에 널 값이 입력되면 해당 연산을 거부한다.

  • 기본키로 정의된 필드는 명시적으로 not null 조건을 굳이 설정하지 않아도 된다. (내부적으로 허용하지 않기 때문)

UNIQUE

: 테이블 내에서 중복된 값을 갖지 않고 유일하게 식별되도록 하는 제약 조건.

  • 기본키의 개념과 유사

  • 결국 unique조건을 부여할 수 있는 필드들은 해당 테이블의 후보키를 의미한다.

  • 널 값의 입력을 허용한다.

  • 두 개 이상의 필드에 동시 설정 가능하다.

constraint <제약식명> unique (<필드리스트>)

ex1. 기본적인 부여 : resident_id의 중복을 허용하지 않음

create table student
(
	stu_id	varchar2(10),
	resident_id	varchar2(14),
	constraint  uc_rid  unique  (resident_id)
)

ex2. 간단하게 표현 가능

create table student
(
	stu_id	varchar2(10),
	resident_id	varchar2(14) unique
)

ex3. 두 개 이상의 필드
: family_name과 given_name이 동시에 중복되는 경우를 허용하지 않음.

create table student
(
	stu_id	varchar2(10),
	resident_id	varchar2(14),
	family_name	varchar2(10),
	given_name	varchar2(10),
	constraint  uc_rid  unique  (family_name, given_name)
)

CHECK

  • 도메인 제약 : 각 필드의 값은 정의된 도메인에 속한 값만 허용된다. (테이블을 생성할 때 지정한 데이터 타입이 도메인이 된다)

사용 : 도메인 제약 이외에도 좀 더 세부적으로 허용할 값의 범위를 지정할 때.

constraint <제약식명> check (<조건식>)

// 조건식에는 앞서 말한 필드에 대한 더 세부적인 조건이 들어간다.
// 간단한 표현도 가능하다.

ex. year는 1부터 4까지의 정수이고, address는 {'서울','부산'} 하나여야 한다는 조건이 추가된 student 테이블

create table student
(
	stu_id	varchra2(10),
	year	int,
	address	varchar2(10),
	constraint  chk1  check  (year >= 1 and
    				  year <= 4 and
        			  address in ('서울', '부산'))

DEFAULT

사용 : 레코드를 삽입할 때 필드에 대한 값이 정해지지 않았을 경우 사전에 정해놓은 값으로 입력하도록 지정할 때.

  • 값이 정해지지 않으면 일반적으로는 널 값이 입력되지만 default로 사전에 입력될 값을 정해놓으면 그 값이 입력된다.

ex1. year의 default값을 1로 지정

create table student
(
	year	int	default 1
)

ex2. alter table문을 이용할 경우

alter table student
alter column year set default 1

//default 해제는 alter column year drop default

+) alter column~ 문법은 대부분의 DBMS에서 지원하지만
오라클에서는 지원하지 않는다.
오라클에서는
modify (year int default 1)
modify (year int deault null) 을 사용해야 한다.

제약에 대해서

  • 장점
    잘못된 데이터들이 존재할 가능성을 원천적으로 막을 강력한 수단.

  • 단점
    예외적인 데이터가 발생했을 때 처리하기 까다로움.
    무결성 제약을 검사하는 DBMS의 전체적인 성능저하 가능성.

기타 무결성 제약

데이터 자체의 유효성을 검증하는 것이 아닌 제약 조건일 경우 주장이나 트리거와 같은 명령을 통해 무결성을 보장할 수 있다.

주장(assertion)

create assertion <주장이름> check <조건식>

ex. "교수는 한 학기에 3강좌 이상을 강의할 수 없다"

create assertion assert1 check
	(not exists (select	count(*)
		     from	class
		     group by	year, semester, prof_id) > 3)
	)

// not exists는 검색결과에 최소한 하나 이상의 레코드가 존재하는지의 여부를 표현할 수 있다. (하나라도 존재하면 거짓)

  • 주장 명령문 실행 시 데이터베이스는 현재 저장된 데이터들에 대해 해당 조건이 만족되는지 검증한다.

  • 이후 발생되는 데이터에 대해서도 주장의 조건이 만족되는지 감시하는 역할도 한다.

  • 주장의 조건이 복잡할 경우 시스템 부하의 원인이 된다.

응용 프로그램에서의 무결성 제약

앞서 소개한 무결성 제약 방법을 사용하지 않을 땐,
응용 프로그램에서 직접 무결성을 보장하는 코드를 삽입하는 방법이 있다.

  • DBMS에서 제공하는 방법을 사용하는 것이 가장 간단하고 편리한 방법이지만, DBMS만으로 제어가 불가능한 복잡한 제약을 구현할 때 사용.

  • 응용 프로그램에서 직접 검증함으로써 데이터베이스에 집중된 부하를 분산하는 효과를 얻을 수도 있다.

데이터베이스 보안

이론적으로 100% 완벽한 보안은 불가능하기 때문에, 데이터의 중요도에 따라 다양한 수준에서의 보안 정책이 이루어져야 한다.

사용자의 권한 제어는 가장 낮은 수준의 보안이지만, 반대로 가장 핵심적이고 기초적안 보안 방법이다.

데이터베이스에서의 사용 권한

데이터베이스의 사용 권한이란?
: 사용자가 특정 객체에 대해 특정 연상을 실행할 수 있는 권리.
(특정 객체 : 테이블, 뷰, 필드 등)

권한 제어가 가능한 연산의 종류

  • 데이터 접근 관련 연산 (DML)
    : 데이터룰 변경 또는 참조하는 모든 행위.
    ex. SQL의 select, insert, delete, update연산

  • 스키마 관련 연산 (DDL)
    : 스키마를 수정하는 연산.
    ex. SQL의 create table, alter table, drop table, create index 등

데이터베이스의 사용자 부류

  • 데이터베이스 관리자
    : DBMS내의 모든 객체에 대해 모든 종류의 권한을 갖고, 일반 사용자에게 일부 또는 모든 권한을 부여하거나 회수할 수 있다.

  • 객체 소유자(owner)
    : 특정 사용자가 객체를 생성했으면 그 사용자가 해당 객체의 소유자가 된다. 소유자는 해당 객체에 대해 DBA와 같이 모든 권한을 갖는다.

  • 기타 사용자
    : 기본적으로 객체에 대한 일체의 사용권한이 없다.
    DBA나 객체 소유자로부터 권한을 부여받을 수 있다.

+) 실제 권한이 부여되는 연산의 종류는 매우 다양하며 DBMS마다 별도로 정의.

SQL에서의 권한 제어

GRANT

: SQL의 권한 부여 명령문.

grant <권한리스트> on <객체명> to <사용자리스트>

  • <권한리스트> : 권한의 종류에 대한 리스트
    ; 한 개 이상의 권한을 포함할 수 있다.
    ex. select, insert, delete, update, references

  • <객체명> : 대상이 되는 객체

  • <사용자리스트> : 권한을 부여받는 사용자들의 리스트

= <사용자리스트>에게 <객체명>에 대한 <권한리스트>를 실행할 권리를 부여.

ex1. 기본형

grant select, delete on student to kim

ex2. 특정 필드 제한 허용

grant select (stu_id) on student to kim

select, update는 특별히 테이블 내의 특정 필드에 대해서만 연산을 허용할 수 있다. 위 코드는 stu_id에 대해서만 select연산을 허용한다는 의미.

ex3. references

grant references (dept_id) on department to kim

전제상황 :
department (lee소유)
kim이 department의 dept_id를 참조하는 student테이블을 만들고자 함.
이 때 kim은 department에 대한 권한이 없으므로 외래키 정의가 불가함.
그래서 lee는 kim에게 department를 참조할 수 있는 권한을 주고자 함.

reference는 lee가 kim에게 department 참조 권한을 줄 때 사용가능.

ex4. public

grant select on student to public

모든 사용자에게 <권한리스트>의 권한 부여.

ex5. all privileges

grant all privileges on student to lee

모든 종류의 권한을 하나의 명령으로 부여하는 키워드.

+) grant문은 데이터 접근에 관련한 권한을 제어할 수 있음을 알았다.
일부 DBMS들은 스키마 관련 연산도 grant문으로 부여할 수 있다.
(뒤에 나오는 오라클에서의 사용자 권한 제어)

WITH GRANT OPTION

: 부여받은 권한을 다른 사용자에게 전파할 수 있는 옵션.
(GRANT는 부여 받은 명령을 실행만 할 수 있는 자격을 얻는다)

ex. 기본형

grant select on student to kim with grant option

// select권한을 부여받은 kim은

grant select on student to chang

// chang에게 select권한을 부여할 수 있다.
// chang은 다른 사용자에게 권한 부여를 할 수 없다.

  • 남용될 경우 권한 부여에 대한 추적이 매우 어려워져 보안문제 야기가능.
  • 사용이 권장되진 않음.

REVOKE

: 다른 사용자에게 부여한 권한을 회수하는 명령. (revoke : 취소)

revoke <권한리스트> on <객체명> from <사용자리스트>

  • revoke문은 연쇄적인 권한 회수로 이어질 수 있다는 점을 주의!
    ex. lee에게 with grant option으로 권한을 부여받은 kim이 chang에게 부여한 권한도 kim의 권한이 회수되면 같이 회수된다.

롤(role)

: 권한에 따른 사용자 그룹.
; 원칙적으로 데이터베이스 관리자만이 생성할 수 있다.

권한별로 사용자 그룹을 만들어 그룹에 권한을 부여하는 방법은 권한 부여에서 단순히 반복되는 작업을 줄여준다.

  • 롤 생성

    create role <롤이름>

	ex. create role employee
  • 사용자에 롤 배정

    grant <롤리스트> to <사용자리스트>

	ex. grant employee, manager to park

// <롤리스트>에는 하나 이상의 롤들이 사용될 수 있다. 즉, 사용자는 하나 이상의 롤에 배정 될 수 있다.

  • 롤에 권한 부여
ex. grant select on student to employee
  • 배정된 롤에서 특정 사용자 배제

    revoke <롤리스트> from <사용자리스트>

	ex. revoke manager from choi
  • 롤 자제를 삭제

    drop role manager


뷰를 이용한 권한 제어

: 필드뿐만 아니라 레코드 일부에 대해서도 접근제어가 가능해져 더 강력한 보안이 가능하다.

; 특정 테이블에서 일부 필드 혹은 일부 레코드에 대해서만 접근을 허용할 경우 이 부분들을 뷰로 정의하고, 그 다음 사용자에게 정의된 뷰에 대해 접근 권한을 부여하고 실제 테이블에 대한 접근을 차단한다면 사용자에게 감추고 싶은 부분에 대한 보안이 자연스럽게 구현된다.


  • : 논리적 스키마 또는 테이블로부터 정의된 가상 테이블
    ; 복잡한 스키마를 사용자에게 간단한 형태로 보이게 하는 단순화 기능
    ; 강력한 보안의 수단

+) 뷰를 사용하지 않는 단순한 grant문만으로는 필드에 대해서만 접근제어 가능.

오라클에서의 무결성과 보안

오라클에서의 무결성 제약

오라클은 기본 무결성 제약과 테이블의 무결성 제약 기능을 모두 제공한다.

department 테이블을 참조하는 외래키가 정의된 student테이블과 department 테이블을 생성할 때 생성 순서와 레코드 삽입 순서를 주의해야한다. (둘 다 department 먼저)

기본적 무결성 제약의 보장

  • 기본키 무결성 제약
    : 중복되는 레코드 삽입 거부

  • 참조 무결성 제약
    : 참조하는 테이블의 기본키에 존재하지 않는 외래키 삽입 거부.
    ; 이 외에도 참조되는 레코드나 테이블의 삭제 거부.

테이블 무결성 제약의 보장

  • NOT NULL
  • UNIQUE
  • CHECK
  • DEFAULT
    : default가 지정된 필드에 의도적으로 널 값을 삽입할 경우에는 널 값이 입력된다.

오라클에서의 사용자 권한 제어

오라클의 권한 종류

: 시스템 전반에 대한 접근 권한을 제어하는 기능을 갖고 있다.
크게 시스템 권한 / 객체 권한으로 나뉜다.

  • 시스템 권한 (system privileges)
    : 사용자의 생성, 테이블이나 테이블스페이스의 생성 등과 같이 주로 시스템의 자원을 관리할 수 있는 권한.

    ; 오라클에서는 그 종류가 100개가 넘는다.
    ; 기본적으로 DBA 계정인 sys, system은 모든 시스템 권한을 갖고있다.

    ex. create user/drop user, create session(로그인 권한), create table/drop any table/select any table, create view/drop any view, create tablespace/drop tablespace, create role/drop any role

  • 객체 권한 (object privileges)
    : 해당 객체에 대해 select, insert, delete, update등과 같은 DML을 실행할 수 있는 권한.

사용자 계정 생성과 권한 관리

  • 사용자 계정 생성과 GRANT
    오라클에서는 계정을 생성했다고 해서 이 계정으로 로그인이나 테이블 생성이 곧바로 불가능하다.
    -> system계정으로 접속하여 권한을 부여해주어야 한다.

+) 오라클에서 다른 사용자가 소유한 테이블에 대해 테이블 이름을 명시할 때는 '소유자명.테이블명'과 같이 테이블 이름 앞에 소유자명까지 기입해야 한다.

  • WITH GRANT OPTION

  • REVOKE
    : 권한을 회수하고 select를 하게되면 '테이블 또는 뷰가 존재하지 않습니다'라는 에러 메시지가 뜨는데 이는 실제로 존재하지 않는다는 것이 아니라 사용자에게 테이블의 존재를 알리지 않는 것을 의미한다.

+) 오라클의 with admin option
: 시스템 권한을 전파할 때 사용한다. (with grant option은 객체 권한 전파시 사용)

롤의 생성과 관리

  • 오라클의 기본적인 롤 종류
    : 오라클은 설치할 때 기본적으로 정의된 롤들이 있다.
    기본 롤의 종류로는 connect, resource, dba가 있다.

일반적으로 사용자를 생성하면 특별한 제한이 없는 한 connect와 resource롤을 부여한다.

  • 롤의 생성과 사용자 배정
    : 오라클에서 create role문은 DBA또는 DBA로부터 롤을 생성하는 권한을 부여받은 사용자만이 실행할 수 있다.
profile
Lv.1 개발자

0개의 댓글