본문 바로가기

데이터 베이스

Ch.11 보안과 권한 관리 [데이터베이스 개론]

728x90

보안


데이터베이스의 보안을 유지하여 데이터를 보호하는 방법은 크게 세 가지 유형으로 구분된다.

물리적 환경에 대한 보안

자연재해처럼 데이터베이스에 물리적으로 손실을 발생시키는 위험으로부터 보호한다.

권한 관리를 통한 보안

접근이 허락된 사용자만 부여된 권한 내에서 데이터베이스를 사용할 수 있도록 한다.

계정이 발급된 사용자만 데이터베이스에 접근할 수 있도록 통제하고, 사용자별로 데이터베이스의 사용 범위와 수행 가능한 작업 내용을 제한할 수 있다.

운영 관리를 통한 보안

접근이 허락된 사용자들이 부여된 권한 내에서 데이터베이스를 사용하고, 정의된 제약조건을 위반하지 않도록 통제한다.

 

권한 관리를 통한 보안은 권한이 없는 사용자로부터 데이터베이스를 보호하는 것이고, 운영 관리를 통한 보안은 무결성 유지를 통해 권한이 있는 사용자로부터 데이터베이스를 보호한다는 차이가 있다.

권한 관리


권한 관리의 개념


DBMS는 데이터베이스의 보안 유지를 위해 접근 제어(access control) 기능을 이용한다. 모든 사용자는 자신에게 발급된 계정으로 로그인해야 데이터베이스에 접근할 수 있다.

 

로그인을 통해 데이터베이스에 접근할 수 있더라도 데이터베이스 안에 있는 모든 데이터를 사용할 수 있는 것은 아니다. 보안을 위한 데이터 단위는 데이터베이스 전체부터 특정 테이블의 특정 행과 열 위치에 있는 특정 데이터 값까지 다양한다. 따라서 각 사용자는 자신에게 허용된 권한 내에서만 데이터베이스를 사용할 수 있다.

 

 

테이블이나 뷰와 같이 데이터베이스에 존재하는 모든 객체는 기본적으로 해당 객체를 생성한 사용자만 사용 권한을 가진다. 그래서 데이터베이스 객체의 소유자는 필요에 따라 다른 사용자에게 자신이 소유한 객체에 대한 사용 권한을 부여할 수 있다. SQL 문을 이용해 권한을 부여, 취소할 수 있다.

 

권한의 부여


객체의 소유자가 다른 사용자에게 객체에 대한 사용 권한을 부여하기 위해 GRANT 문을 사용한다.

 

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

 

테이블과 관련하여 다른 사용자에게 부여할 수 있는 주요 권한으로는 INSERT, DELETE, UPDATE, SELETE, REFERENCES 가 있다. 여러 권한을 한 번에 동시에 부여할 수도 있다.

 

REFERENCES외래키 제약조건을 정의할 수 있는 권한이다.

해당 권한을 부여받은 사용자는 권한 부여 대상인 테이블의 기본키를 참조하는 외래키를 자신이 생성하는 테이블에 포함할 수 있다. 

 

UPDATESELETE 는 테이블을 구성하는 속성들 중 일부 속성에만 권한을 부여할 수 있다. 일부 속성만 권한을 부여하려면 권한과 함께 권한을 부여하고 싶은 속성의 이름을 ( ) 안에 나열하면 된다. 

 

GRANT 문으로 부여받은 권한은 기본적으로 다른 사용자에게 부여할 수 없다. 하지만 WITH GRANT OPTION을 포함하면 권한을 부여받은 사용자가 자신이 부여받은 권한을 다른 사용자에게도 부여할 수 있다.

 

예를 들어,

 

"고객 테이블에 대한 검색 권한을 사용자 Hong에게 부여하자"

->   GRANT  SELETE  ON  고객  TO  Hong  ;

 

"고객 테이블에 대한 삽입과 삭제 권한을 모든 사용자에게 부여하자"

->   GRANT  INSERT, DELETE  ON  고객  TO  PUBLIC  ;

 

"고객 테이블을 구성하는 속성 중 등급과 적립금 속성에 대한 수정 권한을 사용자 Park에게 부여하자"

->   GRANT UPDATE(등급, 적립금)  ON  고객  TO  Park  ;

 

"고객 테이블에 대한 검색 권한을 WITH GRANT OPTION을 포함하여 사용자 Lee에게 부여하자"

->   GRANT SELETE  ON  고객  TO  Lee  WITH GRANT OPTION  ;

 

 

보안을 강화하기 위해 뷰를 이용할 수도 있다. 뷰를 이용하면 사용자가 테이블에 직접 접근하지 못하게 하면서 사용자에게 필요한 테이블 일부만 제공할 수 있다. 따라서 사용자와 관련 없는 테이블의 다른 부분을 숨겨 보안을 유지하는 데 도움이 된다. 

 

테이블에서 사용자가 업무를 수행하는 데 필요한 테이블의 일부분을 뷰로 생성한 후 사용자에게 이 뷰에 대한 권한을 부여하는 것도 보안을 유지하는데 도움이 된다.

 

 

객체에 대한 권한은 해당 객체의 소유자가 부여한다.

그러나 시스템 권한은 데이터베이스 관리자가 부여할 수 있다. 이것도 GRANT 문으로 가능하다. 단, 특정 객체에 대한 권한을 부여하는 것이 아니므로 시스템 권한을 부여할 때는 객체를 지정할 필요가 없다.

 

"테이블을 생성할 수 있는 시스템 권한을 사용자 Song에게 부여하자"

->   GRANT CREATE  TABLE   TO  Lee  ;

 

"뷰를 생성할 수 있는 시스템 권한을 사용자 Shin에게 부여하자"

->   GRANT CREATE  VIEW   TO  Shin  ;

권한의 취소


다른 사용자에게 부여된 객체의 사용 권한을 취소하기 위해 필요한 SQL 명령어는 REVOKE 다.

 

REVOKE   권한   ON   객체   FROM   사용자   CASCADE   |   RESTRICT ;

 

앞서 WITH GRANT OPTION 을 포함하여 GRANT 문을 수행하면 권한을 부여받은 사용자가 자신이 부여받은 권한을 다른 사용자에게도 부여할 수 있다. 만약 사용자의 권한이 취소되었을 때, 권한이 취소된 사용자가 다른 사용자에게 부여한 권한을 처리하는 방법이 문제가 된다. 

 

 

CASCADE  :  권한이 취소될 경우, 취소된 사람이 전달한 권한을 함께 취소함

RESTRICT  :  사용자의 권한을 취소해도 이어서 권한을 받은 사람의 권한은 그대로 놔둠

 

"Kim 이 Hong 에게 부여한 고객 테이블에 대한 검색 권한을 취소하면서 Hong 이 다른 사용자에게 부여한 고객 테이블에 대한 검색 권한도 함께 삭제하자"

->   REVOKE   SELETE   ON   고객   FROM   Hong   CASCADE  ;

 

 

다른 사용자에게 부여한 시스템 권한을 취소할 때도 REVOKE 문을 이용한다. 단, 특정 객체에 대한 권한을 취소하는 것이 아니므로, 시스템 권한을 취소하자할 때는 객체를 지정할 필요가 없다.

 

"Hong 에게 부여한 테이블 생성 권한을 취소하자"

->   REVOKE   CREATE  TABLE   FROM   Hong  ;

역할의 부여와 취소


데이터베이스 객체의 소유자가 수많은 사람들에게 객체에 대한 권한들을 부여하려면 GRANT 문을 따로 작성해야 한다. 굉장히 많은 GRANT 문을 작성해야 하고, 또 수정할 때도 아주 번거롭기 때문에 일일이 권한을 부여하고 취소하는 건 비효율적이다.

 

여러 사용자에게 동일한 권한들을 부여하고 취소하는 번거로운 작업을 편리하게 수행할 수 있도록 도움을 주는 것이 역할(role)이다.

 

 

권한 부여 작업을 좀 더 편리하게 수행하고 싶을 때는 역할의 개념을 활용할 수 있다. 역할은 여러 권한을 그룹으로 묶어놓은 것으로, 권한들을 넣어둔 바구니로 이해하면 된다.

 

 

즉 사용자에게 부여하고 여러 권한을 역할에 미리 넣어두고 필요할 때 역할을 부여하면 여러 권한을 한 번에 쉽게 부여할 수 있다. 

 

새로운 역할을 생성하는 기능은 데이터베이스 관리자가 담당한다. 역할을 생성하는 데 필요한 SQL 명령어는 CREATE ROLE 이다.

 

CREATE   ROLE   롤이름 ;

 

"role_1 이라는 이름의 역할을 생성하자"

->   CREATE   ROLE   role_1  ;

 

역할을 생성했다면 역할에 권한을 넣는 작업을 수행해야 한다.

 

GRANT   권한   ON   객체   TO   롤이름 ;

 

"고객 테이블에 검색, 삽입, 삭제 권한을 role_1 역할에 넣어보자"

->   GRANT   SELETE, INSERT, DELETE   ON   고객   TO   role_1  ;

 

해당 역할에 권한을 부여하는 것은 테이블의 소유자가 할 수 있는 작업이다. 그러므로 GRANT 문은 테이블의 소유자가 수행해야 한다.

 

역할을 사용자에게 부여하는 것은 데이터베이스 관리자가 담당하며 GRANT 문을 이용한다.

 

GRANT   롤이름   TO   사용자 ;

 

"고객 테이블에 대한 검색, 삽입, 삭제 권한을 포함하고 있는 role_1 역할을 사용자 Hong에게 부여하자"

->   GRANT   role_1   TO   Hong  ;

 

데이터베이스 관리자에게 role_1 역할을 부여받은 사용자는 role_1 역할에 포함된 SELETE, INSERT, DELETE 권한을 모두 부여받아 고객 테이블에 대한 검색, 삽입, 삭제 연산을 수행할 수 있다.

 

 

역할을 이용하면 GRANT 문 하나만으로도 여러 권한을 한 번에 부여할 수 있다.

 

또 새로운 권한의 추가, 기존 권한의 취소 등 역할에 변화가 생기면 해당 역할을 부여받은 모든 사용자에게 변화가 그대로 전달된다. 역할을 부여받은 모든 사용자의 권한도 변경된 역할에 맞게 자동으로 변경되므로 역할을 이용하면 권한을 관리하기가 더 쉬워진다.

 

만약 세 명의 사용자에게 UPDATE 권한을 추가 부여하고 싶으면 각 사용자에게 권한을 따로 부여할 필요가 없고, GRANT 문을 이용해 role_1 역할에 UPDATE 권한을 추가하면 된다.

 

->   GRANT   UPDATE   ON   고객   TO   role_1  ;

 

역할 제거는 데이터베이스 관리자가 담당하며 DROP ROLE 문을 이용한다.

 

DROP   ROLE   롤이름 ;

 

"role_1 역할을 제거해 보자"

->   DROP   ROLE   role_1  ;