Loading...
MySQL 9.5 Reference Manual 9.5의 8.2.11 Account Categories의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL은 SYSTEM_USER 권한을 기반으로 한 사용자 계정 카테고리 개념을 포함합니다.
MySQL은 사용자 계정 카테고리 개념을 포함하며, 시스템 사용자와 일반 사용자는 SYSTEM_USER 권한 보유 여부에 따라 구분됩니다:
SYSTEM_USER 권한을 가진 사용자는 시스템 사용자입니다.
SYSTEM_USER 권한을 가지지 않은 사용자는 일반 사용자입니다.
SYSTEM_USER 권한은 특정 사용자가 자신의 다른 권한을 어떤 계정에 적용할 수 있는지, 그리고 그 사용자가 다른 계정으로부터 보호되는지 여부에 영향을 미칩니다:
시스템 사용자는 시스템 계정과 일반 계정 둘 다를 수정할 수 있습니다.
즉, 일반 계정에 대해 특정 작업을 수행할 적절한 권한을 가진 사용자는 SYSTEM_USER를 보유함으로써 해당 작업을 시스템 계정에도 수행할 수 있습니다. 시스템 계정은 적절한 권한을 가진 시스템 사용자만 수정할 수 있으며 일반 사용자는 수정할 수 없습니다.
적절한 권한을 가진 일반 사용자는 일반 계정은 수정할 수 있지만 시스템 계정은 수정할 수 없습니다. 일반 계정은 적절한 권한을 가진 시스템 사용자와 일반 사용자 모두가 수정할 수 있습니다.
사용자가 일반 계정에 대해 특정 작업을 수행할 적절한 권한을 가지고 있는 경우, SYSTEM_USER는 해당 사용자가 시스템 계정에 대해서도 그 작업을 수행할 수 있도록 허용합니다. SYSTEM_USER는 다른 어떠한 권한도 내포하지 않으므로, 특정 계정 작업을 수행할 수 있는 능력은 여전히 필요한 다른 권한 보유 여부에 달려 있습니다. 예를 들어, 사용자가 일반 계정에 SELECT와 UPDATE 권한을 부여할 수 있다면, SYSTEM_USER를 함께 보유할 경우 시스템 계정에도 SELECT와 UPDATE를 부여할 수 있습니다.
시스템 계정과 일반 계정의 구분은 SYSTEM_USER 권한을 가진 계정을 그렇지 않은 계정으로부터 보호함으로써 특정 계정 관리 이슈에 대한 더 나은 제어를 가능하게 합니다.
예를 들어, CREATE USER 권한은 새로운 계정 생성뿐만 아니라 기존 계정의 수정 및 제거도 가능하게 합니다. 시스템 사용자 개념이 없으면, CREATE USER 권한을 가진 사용자는 root 계정을 포함한 모든 기존 계정을 수정하거나 drop할 수 있습니다. 시스템 사용자 개념은 root 계정(자체가 시스템 계정임)에 대한 수정이 오직 시스템 사용자만 수행할 수 있도록 제한할 수 있게 해 줍니다. CREATE USER 권한을 가진 일반 사용자도 여전히 기존 계정을 수정하거나 drop할 수 있지만, 일반 계정에 대해서만 가능합니다.
SYSTEM_USER 권한은 다음 작업에 영향을 미칩니다:
계정 조작에는 계정 생성 및 삭제, 권한 부여 및 회수, 자격 증명이나 인증 플러그인과 같은 계정 인증 속성 변경, 비밀번호 만료 정책과 같은 기타 계정 속성 변경이 포함됩니다.
SYSTEM_USER 권한은 CREATE USER 및 GRANT와 같은 계정 관리 문장을 사용하여 시스템 계정을 조작하는 데 필요합니다. 계정이 이런 방식으로 시스템 계정을 수정하지 못하도록 하려면, 해당 계정에 SYSTEM_USER 권한을 부여하지 않아 일반 계정으로 만드십시오. (그러나 시스템 계정을 일반 계정으로부터 완전히 보호하려면 일반 계정에 대해 mysql 시스템 스키마의 수정 권한도 부여하지 않아야 합니다. Protecting System Accounts Against Manipulation by Regular Accounts를 참조하십시오.)
SYSTEM_USER 권한을 가지고 실행 중인 세션이나 문장을 kill하려면, 자신의 세션도 SYSTEM_USER 권한을 가져야 하며, 추가로 필요한 다른 권한(CONNECTION_ADMIN 또는 더 이상 사용되지 않는 SUPER 권한)을 함께 가져야 합니다.
서버를 오프라인 모드로 전환하는 사용자가 SYSTEM_USER 권한을 가지고 있지 않은 경우, SYSTEM_USER 권한을 가진 연결된 클라이언트 사용자들도 disconnect되지 않습니다. 그러나 이러한 사용자들은 CONNECTION_ADMIN 또는 SUPER 권한을 함께 가지고 있지 않는 한, 서버가 오프라인 모드인 동안 서버에 대한 새로운 커넥션을 시작할 수 없습니다. 종료되지 않는 것은 이들의 기존 커넥션뿐이며, 그 커넥션을 종료하는 데는 SYSTEM_USER 권한이 필요하기 때문입니다.
DEFINER 속성 설정.SYSTEM_USER 권한을 가진 계정으로 저장 객체의 DEFINER 속성을 설정하려면, 다른 필요한 권한과 더불어 SYSTEM_USER 권한을 보유해야 합니다.
SYSTEM_USER 권한을 가진 role은 mandatory_roles 시스템 변수 값에 포함될 수 없습니다.
SYSTEM_USER 권한을 가진 계정에는 AUDIT_ABORT_EXEMPT 권한이 자동으로 부여되어, 감사 로그 필터의 “abort” 항목이 쿼리를 block하더라도 해당 계정으로부터의 쿼리는 항상 실행됩니다. 따라서 SYSTEM_USER 권한을 가진 계정은 감사 설정 오류 이후 시스템에 대한 액세스를 회복하는 데 사용할 수 있습니다. Section 8.4.6, “MySQL Enterprise Audit”을 참조하십시오.
서버 내에서 실행 중인 세션은 시스템 세션과 일반 세션으로 구분되며, 이는 시스템 사용자와 일반 사용자의 구분과 유사합니다:
SYSTEM_USER 권한을 가진 세션은 시스템 세션입니다.
SYSTEM_USER 권한을 가지지 않은 세션은 일반 세션입니다.
일반 세션은 일반 사용자에게 허용된 작업만 수행할 수 있습니다. 시스템 세션은 추가로 시스템 사용자에게만 허용된 작업도 수행할 수 있습니다.
세션이 보유한 권한은 그 세션의 기반 계정에 직접 부여된 권한과, 현재 세션 내에서 활성화된 모든 role에 부여된 권한의 합입니다. 따라서 세션은 그 계정에 SYSTEM_USER 권한이 직접 부여되어 있기 때문에 시스템 세션일 수도 있고, 세션이 SYSTEM_USER 권한을 가진 role을 활성화했기 때문에 시스템 세션일 수도 있습니다. 계정에 부여되었지만 세션 내에서 활성화하지 않은 role은 세션 권한에 영향을 주지 않습니다.
role의 활성화 및 비활성화는 세션이 보유한 권한을 변경할 수 있으므로, 세션은 일반 세션에서 시스템 세션으로, 또는 그 반대로 변경될 수 있습니다. SYSTEM_USER 권한을 가진 role을 세션이 활성화하거나 비활성화하는 경우, 해당 세션에 대해서만 일반 세션과 시스템 세션 사이의 적절한 변경이 즉시 발생합니다:
일반 세션이 SYSTEM_USER 권한을 가진 role을 활성화하면, 해당 세션은 시스템 세션이 됩니다.
시스템 세션이 SYSTEM_USER 권한을 가진 role을 비활성화하면, SYSTEM_USER 권한을 가진 다른 role이 여전히 활성 상태로 남아 있지 않는 한, 해당 세션은 일반 세션이 됩니다.
다음 작업들은 기존 세션에는 아무런 영향을 주지 않습니다:
SYSTEM_USER 권한이 계정에 부여되거나 회수되더라도, 해당 계정의 기존 세션은 일반 세션과 시스템 세션 사이에서 변경되지 않습니다. 부여 또는 회수 작업은 그 계정의 이후 커넥션에 대한 세션에만 영향을 줍니다.
세션 내에서 호출된 저장 객체가 실행하는 문장은, 해당 객체의 DEFINER 속성이 시스템 계정을 가리키더라도 부모 세션의 시스템 또는 일반 상태로 실행됩니다.
role 활성화는 계정이 아니라 세션에만 영향을 주므로, SYSTEM_USER 권한을 가진 role을 일반 계정에 부여하더라도 그 계정 자체는 일반 사용자로부터 보호되지 않습니다. 그 role은 오직 해당 role이 활성화된 계정의 세션만 보호하며, 또한 그 세션을 일반 세션이 kill하는 것으로부터만 보호합니다.
계정 조작에는 계정 생성 및 삭제, 권한 부여 및 회수, 자격 증명이나 인증 플러그인과 같은 계정 인증 속성 변경, 비밀번호 만료 정책과 같은 기타 계정 속성 변경이 포함됩니다.
계정 조작은 두 가지 방법으로 수행될 수 있습니다:
CREATE USER 및 GRANT와 같은 계정 관리 문장을 사용하는 방법. 이것이 선호되는 방법입니다.
INSERT 및 UPDATE와 같은 문장을 사용하여 grant 테이블을 직접 수정하는 방법. 이 방법은 권장되지 않지만, grant 테이블을 포함하는 mysql 시스템 스키마에 대해 적절한 권한을 가진 사용자는 사용할 수 있습니다.
특정 계정으로부터 시스템 계정을 완전히 보호하려면, 해당 계정을 일반 계정으로 만들고 mysql 스키마에 대한 수정 권한을 부여하지 마십시오:
계정 관리 문장을 사용하여 시스템 계정을 조작하려면 SYSTEM_USER 권한이 필요합니다. 계정이 이러한 방식으로 시스템 계정을 수정하지 못하게 하려면, 해당 계정에 SYSTEM_USER를 부여하지 않아 일반 계정으로 만드십시오. 여기에는 계정에 부여된 어떤 role에도 SYSTEM_USER를 부여하지 않는 것이 포함됩니다.
mysql 스키마에 대한 권한은, 수정하는 계정이 일반 계정이더라도 grant 테이블을 직접 수정하여 시스템 계정을 조작할 수 있게 합니다. 일반 계정이 시스템 계정을 무단으로 직접 수정하는 것을 제한하려면, 해당 계정(또는 그 계정에 부여된 어떤 role)에도 mysql 스키마에 대한 수정 권한을 부여하지 마십시오. 일반 계정이 모든 스키마에 적용되는 global 권한을 반드시 가져야 한다면, partial revoke를 사용해 부과되는 권한 제한을 통해 mysql 스키마 변경을 방지할 수 있습니다. Section 8.2.12, “Privilege Restriction Using Partial Revokes”를 참조하십시오.
참고
SYSTEM_USER 권한을 부여하지 않는 것과 달리, 이는 계정이 시스템 계정은 수정하지 못하지만 일반 계정은 수정할 수 있도록 허용하는 반면, mysql 스키마 권한을 부여하지 않으면 계정은 시스템 계정뿐 아니라 일반 계정도 수정할 수 없게 됩니다. direct grant-table 수정은 앞서 언급했듯이 권장되지 않으므로, 이는 문제가 되지 않아야 합니다.
예를 들어, 모든 스키마에 대해 모든 권한을 가지지만 시스템 계정을 수정할 수 없는 일반 사용자 u1을 생성하고자 한다고 가정합니다. partial_revokes 시스템 변수가 활성화되어 있다고 할 때, u1을 다음과 같이 구성합니다:
1CREATE USER u1 IDENTIFIED BY 'password'; 2 3GRANT ALL ON *.* TO u1 WITH GRANT OPTION; 4-- GRANT ALL includes SYSTEM_USER, so at this point 5-- u1 can manipulate system or regular accounts 6 7REVOKE SYSTEM_USER ON *.* FROM u1; 8-- Revoking SYSTEM_USER makes u1 a regular user; 9-- now u1 can use account-management statements 10-- to manipulate only regular accounts 11 12REVOKE ALL ON mysql.* FROM u1; 13-- This partial revoke prevents u1 from directly 14-- modifying grant tables to manipulate accounts
특정 계정의 mysql 시스템 스키마 access를 모두 차단하려면, 위에서 보여준 것처럼 그 계정의 mysql 스키마에 대한 모든 권한을 회수하십시오. 또한 mysql 스키마에 대한 읽기 전용 access와 같은 부분적 access를 허용하는 것도 가능합니다. 다음 예제는 모든 스키마에 대해 global하게 SELECT, INSERT, UPDATE, DELETE 권한을 가지지만, mysql 스키마에 대해서는 SELECT만 가지는 계정을 생성합니다:
1CREATE USER u2 IDENTIFIED BY 'password'; 2GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u2; 3REVOKE INSERT, UPDATE, DELETE ON mysql.* FROM u2;
또 다른 방법은 mysql 스키마 권한을 모두 회수하되, 특정 mysql 테이블이나 컬럼에 대한 access만 허용하는 것입니다. 이는 mysql에 대한 partial revoke가 있는 상태에서도 가능합니다. 다음 문장은 mysql 스키마 내에서 u1에게 읽기 전용 access를 부여하지만, 이는 db 테이블과 user 테이블의 Host 및 User 컬럼에만 해당됩니다:
1CREATE USER u3 IDENTIFIED BY 'password'; 2GRANT ALL ON *.* TO u3; 3REVOKE ALL ON mysql.* FROM u3; 4GRANT SELECT ON mysql.db TO u3; 5GRANT SELECT(Host,User) ON mysql.user TO u3;
8.2.10 Using Roles
8.2.12 Privilege Restriction Using Partial Revokes