DB에서의 사용자 권한 관리
DB에서의 사용자 관리는 데이터베이스의 보안과 운영에 중요한 역할을 한다. 적절한 권한 관리를 통하여 데이터의 무결성을 유지하고, 불필요한 접근을 제한할 수 있다.
DB를 처음 설치하고 접속할 경우 기본적으로 주어지는 계정은 root
계정이기 때문에, 이를 그대로 서비스 운영에 사용하는 것은
보안상 매우 위험한 선택이 될 수 있다. 따라서, 개발자는 서비스 별로 적절한 권한을 가진 사용자를 생성하여 사용하는 것이 보안적인 측면에서 바람직하다.
사용자 생성
권한을 부여하기에 앞서 사용자를 생성해야 한다. 사용자를 생성하는 방법은 다음과 같다.
CREATE USER '사용자명'@'호스트' IDENTIFIED BY '비밀번호';
- 사용자명: 사용자명
- 호스트: 접속을 허용할 호스트
- 비밀번호: 비밀번호
기본적인 구성은 위와 같으며, 사용자명과 호스트는 필수로 입력해야 한다. 비밀번호는 선택적으로 입력할 수 있다. 만약 비밀번호를 입력하지 않을 경우, 사용자 생성 후에 비밀번호를 설정할 수 있다.
#ex1) 내부 접근을 허용하는 사용자 추가
create user 'test'@'localhost' identified by '0000';
#ex2) 외부 접근을 허용하는 사용자 추가
create user 'test'@'%' identified by '0000';
#ex3) 특정 ip만 접근을 허용하는 사용자 추가
create user 'test'@'123.456.789.100' identified by '0000';
#ex4) 특정 ip 대역을 허용하는 사용자 추가
create user 'test'@'192.168.%' identified by '0000';
위는 사용자를 생성하는 예시이다.
사용자 삭제
위 방법으로 생성한 사용자를 삭제하는 명령어는 다음과 같다.
DROP USER '사용자명';
# 혹은
DROP USER '사용자명'@'호스트';
- 사용자명: 사용자명
- 호스트: 접속을 허용한 호스트
권한 부여
사용자에게 권한을 부여하는 방법은 다음과 같다.
GRANT '권한' ON '데이터베이스.테이블' TO '사용자명'@'호스트';
- 권한: 사용자에게 부여할 권한(
SELECT
,INSERT
,UPDATE
,DELETE
등) - 데이터베이스: 권한을 부여할 데이터베이스
- 테이블: 권한을 부여할 테이블
- 사용자명: 권한을 부여할 사용자
- 호스트: 권한을 부여할 호스트
# 모든 데이터베이스의 모든 테이블에 모든 권한을 줌
grant all privileges on *.* to '사용자'@'localhost';
# 특정 데이터베이스의 모든 테이블에 모든 권한을 줌
grant all privileges on 'DB이름'.* to '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 모든 권한을 줌
grant all privileges on 'DB이름.테이블명' to '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 select 권한을 줌
grant select on 'DB이름.테이블명' to '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 select, insert 권한을 줌
grant select, insert on 'DB이름.테이블명' to '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블의 컬럼1과 컬럼2의 update 권한을 줌
grant update('컬럼1', '컬럼2') on 'DB이름.테이블명' to '사용자'@'localhost';
권한 취소
만일 사용자에게 부여해야 하는 권한보다 더 많은 권한을 부여했을 경우, 권한을 취소할 수 있다.
REVOKE '권한' ON '데이터베이스.테이블' FROM '사용자명'@'호스트';
- 권한: 취소할 권한
- 데이터베이스: 권한을 취소할 데이터베이스
- 테이블: 권한을 취소할 테이블
- 사용자명: 권한을 취소할 사용자
- 호스트: 권한을 취소할 호스트
# 모든 데이터베이스의 모든 테이블에 대한 모든 권한을 회수
revoke all privileges on *.* from '사용자'@'localhost';
# 특정 데이터베이스의 모든 테이블에 대한 모든 권한을 회수
revoke all privileges on 'DB이름'.* from '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 대한 모든 권한을 회수
revoke all privileges on 'DB이름.테이블명' from '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 대한 select 권한을 회수
revoke select on 'DB이름.테이블명' from '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블에 대한 select, insert 권한을 회수
revoke select, insert on 'DB이름.테이블명' from '사용자'@'localhost';
# 특정 데이터베이스의 특정 테이블의 컬럼1과 컬럼2에 대한 update 권한을 회수
revoke update('컬럼1', '컬럼2') on 'DB이름.테이블명' from '사용자'@'localhost';
권한 확인
사용자에게 부여된 권한을 확인하는 방법은 다음과 같다.
SHOW GRANTS FOR '사용자명'@'호스트';
- 사용자명: 권한을 확인할 사용자
- 호스트: 권한을 확인할 호스트
DB 반영
권한을 부여하거나 취소한 후에는 FLUSH PRIVILEGES;
명령어를 통해 변경사항을 DB에 반영해야 한다.
FLUSH PRIVILEGES;