데이터베이스 보안
데이터베이스 내의 데이터는 조직 내 사용자들이 공유하여 사용한다. 이때 허가되지 않은 외부인이 데이터베이스에 침입하여 데이터에 접근한다면 문제가 생길 것이다. 따라서 조직에서 허가된 사용자만 데이터베이스에 접근하도록 하여 보안을 유지하는 것은 매우 중요하다.
데이터베이스의 보안을 유지하여 데이터를 보호하는 방법은 다음 세 가지 유형으로 분류된다.
- 물리적 환경에 대한 보안: 데이터베이스에 물리적으로 손실을 발생시키는 위험으로부터 데이터베이스를 보호해야 한다.
- 권한 관리를 통한 보안: 접근이 허락된 사용자만 부여된 권한 내에서 데이터베이스를 사용할 수 있도록 보호해야 한다.
- 운영 관리를 통한 보안: 데이터 무결성을 유지하기 위하여 올바른 제약조건을 정의하고, 사용자들이 정의된 제약조건을 위반하지 않도록 통제해야 한다.
권한 관리
데이터베이스 관리 시스템은 데이터베이스의 보안을 유지하기 위하여 접근 제어 기능을 제공한다. 모든 사용자는 자신에게 발급된 계정으로 로그인하여 데이터베이스에 접근 가능하다. 이때 사용자 계정 관리는 데이터베이스 관리자가 담당한다. 로그인을 통하여 데이터베이스에 접근이 가능하다 하더라도 데이터베이스의 모든 데이터를 사용할 수 있는 것은 아니다. 각 사용자는 자신에게 허용된 권한 내에서만 데이터베이스 사용이 가능하다.
데이터베이스에 존재하는 모든 객체는 기본적으로 해당 객체를 생성한 사용자만 사용 권한을 가지게 된다. 그러나, 다른 사용자도 필요에 따라 객체에 접근할 수 있어야 한다. 이를 위해 객체의 소유자는 다른 사용자에게 자신이 소유한 객체에 대한 사용 권한을 부여하거나 취소할 수 있다.
권한 부여
객체의 소유자는 다른 사용자에게 객체에 대한 사용 권한을 부여하기 위하여 SQL문의 `GRANT` 명령어를 사용할 수 있다.
GRANT 권한 ON 객체 TO 사용자 [WITH GRANT OPTION];
-- Example
GRANT SELECT ON 고객 TO Kang;
GRANT INSERT, DELETE ON 고객 TO Kang PUBLIC;
GRANT SELECT ON 고객 TO Kang WITH GRANT OPTION;
GRANT CREATE TABLE TO Kang
데이터베이스에 존재하는 모든 유형의 객체에 다른 사용자 권한을 부여할 수 있다. 테이블과 관련하여 다른 사용자에게 부여할 수 있는 주요 권한으로는 `INSERT`, `DELETE`, `UPDATE`, `SELECT`, `REFERENCES` 등이 있다. `GRANT` 명령어는 기본적으로 테이블을 구성하는 모든 속성에 권한을 부여하지만 일부 속성만 권한을 부여하는 것도 가능하다.
- `REFERENCES`는 외래키 제약조건을 정의할 수 있는 권한이다. 이 권한을 부여받으면 권한 부여 대상인 테이블의 기본키를 참조하는 외래키를 자신이 생성하는 테이블에 포함할 수 있다.
- `PUBLIC` 키워드는 모든 사용자에게 권한을 똑같이 부여하고 싶을 때 사용할 수 있다.
- `WITH GRANT OPTION` 키워드를 사용하여, 권한을 부여받은 사용자가 자신이 부여받은 권한을 다른 사용자에게 부여할 수 있도록 한다.
객체에 대한 권한은 객체의 소유자가 부여하지만, 테이블 생성, 뷰 생성과 같은 데이터 정의(DDL)와 관련된 시스템 권한은 데이터베이스 관리자가 직접 부여할 수 있다.
권한 취소
`GRANT` 명령어를 통해 다른 사용자에게 권한을 부여한 사용자가 자신이 부여한 권한을 취소하는 것도 가능하다. `REVOKE` 명령어는 다른 사용자에게 부여된 객체의 사용 권한을 취소하기 위하여 사용된다.
REVOKE 권한 ON 객체 TO 사용자 CASCADE | RESTRICT;
-- Example
REVOKE SELECT ON 고객 TO Kang CASCADE;
REVOKE SELECT ON 고객 TO Kang RESTRICT;
REVOKE CREATE TABLE FROM Kang;
- `CASCADE` 키워드는 권한 취소 대상자인 사용자 B가 사용자 C에게 권한을 부여한 경우, 권한을 취소할 사용자 A가 사용자 B와 C의 권한을 연쇄적으로 취소할 경우 사용한다.
- `RESTRICT` 키워드는 위의 경우에서 사용자 C의 권한은 취소하지 않을 경우 사용한다.
역할의 정의
데이터베이스 객체 소유자는 자신이 소유한 객체에 대한 권한들을 여러 사용자들에게 부여하는 경우가 많은데, 각 권한마다 `GRANT` 문을 따로 작성하여 부여하는 것은 번거로운 일이다. 권한을 취소할 때도 마찬가지이다. 여러 사용자에게 동일한 권한들을 부여하고 취소하는 번거로운 작업을 편리하게 수행하도록 하는 것이 “역할”이다.
역할은 여러 권한을 그룹으로 묶어놓은 것으로, 부여하고 싶은 여러 권한을 역할에 미리 넣고 필요할 때 역할을 부여하면 여러 권한을 한 번에 부여하거나 취소할 수 있다.
역할 부여
새로운 역할을 생성하는 기능은 데이터베이스 관리자만 가능하며, 역할을 생성할 때는 `CREATE ROLE` 명령어를 사용한다. 그리고 역할을 사용자에게 부여하는 것도 데이터베이스 관리자가 `GRANT` 문을 통해 진행한다.
CREATE ROLE 역할이름;
GRANT 권한 ON 객체 TO 롤이름;
-- Example
CREATE ROLE role_1;
GRANT SELECT, INSERT, DELETE ON 고객 TO role_1;
역할을 이용하면 `GRANT` 문만으로 여러 권한을 한 번에 부여할 수 있고 다른 사용자에게 동일한 권한을 부여해야 할 때도 역할 하나만 부여하면 된다. 만약 역할에 변화가 생기면, 해당 역할을 부여받은 모든 사용자에게 변화가 전달된다.
역할 취소
부여한 역할을 취소하는 작업 또한 데이터베이스 관리자가 담당하며, 부여된 역할을 취소할 때는 `REVOKE` 문을 이용한다.
REVOKE 역할이름 FROM 사용자;
-- Example
REVOKE role_1 FROM Kang;
역할을 아예 제거하는 작업은 `DROP ROLE` 문을 이용한다. 당연히 데이터베이스 관리자가 담당한다. 역할이 제거되면 제거된 역할을 부여받은 모든 사용자도 역할에 속한 권한을 가질 수 없게 된다.
DROP ROLE 역할이름;
-- Example
DROP ROLE role_1;