MySQL에서 SHOW DATABASES 권한은 사용자가 SHOW DATABASES 명령어를 통해 서버의 모든 데이터베이스 목록을 조회할 수 있도록 허용하는 권한입니다. 보안상의 이유로 특정 사용자에게서 이 권한을 제거해야 할 때가 있는데, 이때는 REVOKE 문을 사용하면 됩니다.
1. SHOW DATABASES 권한 회수 문법
특정 사용자의 데이터베이스 조회 권한을 회수하는 기본 문법은 다음과 같습니다.
revoke show databases on *.* from 'yourUserName'@'yourHostName';
*.*는 모든 데이터베이스와 모든 테이블에 대한 전역(global) 범위를 의미합니다.
2. 등록된 사용자 및 호스트 확인하기
권한을 회수하기 전에 시스템에 등록된 사용자 계정과 호스트 정보를 먼저 확인하는 것이 좋습니다. 아래 쿼리를 실행해 보겠습니다.
mysql> select user,host from mysql.user;
실행 결과 예시는 다음과 같습니다.
+------------------+-----------+ | user | host | +------------------+-----------+ | Bob | % | | Charlie | % | | Robert | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | @UserName@ | localhost | | Adam | localhost | | Adam Smith | localhost | | Chris | localhost | | David | localhost | | James | localhost | | John | localhost | | John Doe | localhost | | Michael | localhost | | Mike | localhost | | User1 | localhost | | am | localhost | | hbstudent | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | +------------------+-----------+ 23 rows in set (0.00 sec)
호스트 값이 %인 경우 어디서든 접속 가능한 계정을, localhost인 경우 로컬 서버에서만 접속 가능한 계정을 의미합니다.
3. 특정 사용자의 현재 권한 조회하기
권한을 변경하기 전에 해당 사용자가 어떤 권한을 가지고 있는지 SHOW GRANTS 명령으로 확인할 수 있습니다. 여기서는 'John'@'localhost' 사용자를 예로 들어 보겠습니다.
mysql> show grants for 'John'@'localhost';
실행 결과는 다음과 같습니다.
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for John@localhost | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `John`@`localhost` | | GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `John`@`localhost` | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 rows in set (0.07 sec)
결과를 보면 John 사용자에게 SHOW DATABASES 권한이 포함되어 있는 것을 확인할 수 있습니다.
4. 실제로 권한 회수 실행하기
이제 앞서 소개한 REVOKE 문법을 적용하여 John 사용자의 데이터베이스 조회 권한을 회수해 보겠습니다.
mysql> revoke show databases on *.* from 'John'@'localhost'; Query OK, 0 rows affected (0.18 sec)
명령이 성공적으로 실행되면, 이후 John 사용자가 SHOW DATABASES를 실행해도 자신에게 권한이 부여된 데이터베이스만 표시됩니다.
정리
- REVOKE SHOW DATABASES ON *.* FROM '사용자'@'호스트'; 구문으로 전역 데이터베이스 조회 권한을 회수할 수 있습니다.
- SELECT user, host FROM mysql.user;로 계정 목록을 확인할 수 있습니다.
- SHOW GRANTS FOR '사용자'@'호스트';로 특정 사용자의 권한을 검증한 후 작업하는 것이 안전합니다.