본문 바로가기
MySQL

MySQL 정적 및 동적 권한

by 타마마임팩트_쫀 2021. 7. 29.

MySQL 8에서 정적 권한과 동적 권한 간의 상호 작용에 대해 더 자세히 알아야 할 때 Security Threat Tool 스크립트를 작성하고 있었습니다 .

동적 권한은 권한 정의를 쉽게 확장하는 동시에 더 세분화된 기능을 제공하기 위해 MySQL 8에 추가된 "새로운" 기능입니다. 예를 들어 FLUSH 작업에는 이제 범위별로 전용 권한이 있습니다. 

동적 권한은 런타임에 할당됩니다. 대부분은 서버가 시작될 때 활성화됩니다. 그러나 활성화되면 구성 요소 또는 플러그인과 관련하여 변경할 수도 있습니다. ( https://dev.mysql.com/doc/mysql-security-excerpt/8.0/en/privileges-provided.html#privileges-provided-dynamic )

정적 권한은 MySQL에서 사용할 수 있는 고전적인 권한입니다. ( https://dev.mysql.com/doc/mysql-security-excerpt/8.0/en/privileges-provided.html#privileges-provided-static )

그것들은 서버에 내장되어 있으며 변경할 수 없습니다.

 

먼저 사용자를 생성하겠습니다.

MySQL

1
2
3
4
5
6
7
create user secure_test@'localhost' identified by 'secret';
(secure_test@localhost) [(none)]>show grants for current_user();
+-------------------------------------------------+
| Grants for secure_test@localhost                |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO `secure_test`@`localhost` |
+-------------------------------------------------+

보시다시피 연결할 수 있지만 권한이 없습니다.

관리 계정이 있는 다른 터미널에서 DBA를 생성하는 고전적인 작업을 수행해 보겠습니다.

 

MySQL

1 GRANT ALL on *.* to secure_test@'localhost' WITH GRANT OPTION;

 

MySQL

1
2
3
4
5
(secure_test@localhost) [(none)]>show grants for current_user()\G
*************************** 1. row ***************************
Grants for secure_test@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 `secure_test`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for secure_test@localhost: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `secure_test`@`localhost` WITH GRANT OPTION

보시다시피 저에게는 많은 권한이 할당되어 있습니다. 

각 권한이 수행하는 작업과 다른 권한과 상호 작용하는 방식을 정확히 식별하는 것은 어렵습니다.

super_read_only 변수를 수정 통해 SUPER 권한을 제거하면 어떻게 동작하는지 확인 봅니다.

 

MySQL

1 revoke SUPER on *.* from secure_test@'localhost';

 

MySQL

1
2
3
4
5
(secure_test@localhost) [(none)]>show grants for current_user()\G
*************************** 1. row ***************************
Grants for secure_test@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, 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 `secure_test`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for secure_test@localhost: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `secure_test`@`localhost` WITH GRANT OPTION

보시다시피 SUPER는 사라졌습니다. 

 

MySQL

1
2
(secure_test@localhost) [(none)]>set global super_read_only=0;
Query OK, 0 rows affected (0.00 sec)

그리고 여전히 전역 변수를 수정할 수 있습니다.

매뉴얼에 따르면 동적 권한의 SYSTEM_VARIABLES_ADMIN 을 통해 " 런타임 시 시스템 변수 변경 활성화 "를 수정할 수 있습니다 .

SYSTEM_VARIABLES_ADMIN 권한을 회수 합니다.

 

MySQL

1
2
3
4
revoke SYSTEM_VARIABLES_ADMIN on *.* from  secure_test@'localhost';


(secure_test@localhost) [(none)]>set global super_read_only=0;
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation

super를 실제로 제거/제한하려면 SYSTEM_VARIABLES_ADMIN 도 제거해야 합니다 .

 

메뉴얼을 확인하면 SUPER가 이 모든 것에 영향을 미치고 있음을 알 수 있습니다.

  • BINLOG_ADMIN,
  • CONNECTION_ADMIN,
  • ENCRYPTION_KEY_ADMIN,
  • GROUP_REPLICATION_ADMIN,
  • REPLICATION_SLAVE_ADMIN,
  • SESSION_VARIABLES_ADMIN,
  • SET_USER_ID,
  • SYSTEM_VARIABLES_ADMIN

리고 활성 플러그인에 따라 다른 플러그인을 사용할 수도 있습니다. 

따라서 모든 SUPER 관련 권한을 제거하려면 다음을 수행해야 합니다.

 

MySQL

1 REVOKE SUPER, BINLOG_ADMIN, CONNECTION_ADMIN, ENCRYPTION_KEY_ADMIN, GROUP_REPLICATION_ADMIN, REPLICATION_SLAVE_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SYSTEM_VARIABLES_ADMIN on *.* from secure_test@'localhost';

이렇게 하면 SUPER가 없는 사용자와 비슷한 권한만 남게 됩니다.

 

MySQL

1
2
3
4
5
DC2-2(secure_test@localhost) [(none)]>show grants for current_user()\G
*************************** 1. row ***************************
Grants for secure_test@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, 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 `secure_test`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for secure_test@localhost: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SHOW_ROUTINE,SYSTEM_USER,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `secure_test`@`localhost` WITH GRANT OPTION

 

결론

SUPER 권한을 제거 했지만, 위의 목록은 여전히 SHUTDOWN, RELOAD 또는 FILE이 있으며 모두 안전하지 않으므로 신중하게 할당해야 합니다. 

'MySQL' 카테고리의 다른 글

pt-query-digest  (0) 2021.08.03
MySQL 정적 및 동적 권한 2  (0) 2021.07.30
MySQL 8.0 strage engine  (0) 2021.07.21
binlog2sql: Binlog를 이용한 Point In Time Recovery  (0) 2020.08.04
mysql 벤치 마크 툴 sysbench  (0) 2020.04.16