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;