6.3.9 프록시 사용자
인증 플러그인을 사용하여 MySQL 서버에 인증이 발생하면 연결된 (외부) 사용자를 권한 확인을 위해 다른 사용자로 처리하도록 플러그인에서 요구 될 수 있습니다. 이렇게하면 외부 사용자를 두 번째 사용자의 프록시 할 수 있습니다. 즉, 두 번째 사용자의 권한을 가질 수 있습니다. 즉, 외부 사용자는 "프록시 사용자"(가장 할 사용자 또는 다른 사용자와 불리게되는 사용자)이며, 두 번째 사용자는 "프록시 대상 '(프록시 사용자가 수행 할 수있는 정체성을 가진 사용자) 입니다.
이 섹션에서는 프록시 사용자 기능의 작동에 대해 설명합니다. 인증 플러그인에 대한 일반적인 정보는 섹션 6.3.7 "플러그 인증" 을 참조하십시오. 프록시 사용자가 지원되는 자체 인증 플러그인을 작성하는 것에 관심이 있다면, 섹션 24.2.4.9.4 "인증 플러그인에서 프록시 사용자 지원 구현" 을 참조하십시오.
프록시 처리를 발생 시키려면 다음 조건을 충족해야합니다.
연결된 클라이언트가 프록시 사용자로 처리 될 때 플러그인은 프록시 대상 사용자의 이름을 표시하기 위해 다른 이름을 반환해야합니다.
프록시 사용자 계정이 플러그인으로 인증되도록 설정해야합니다.
CREATE USER
또는GRANT
문을 사용하여 계정을 플러그인에 연결합니다.프록시 사용자 계정은 프록시 대상 계정
PROXY
권한을 가지고 있어야합니다. 이를 위해서는GRANT
문을 사용합니다.
다음과 같은 정의에 대해 검토합니다.
CREATE USER 'empl_external'@ 'localhost' IDENTIFIED WITH auth_plugin AS 'auth_string'; CREATE USER 'employee'@ 'localhost' IDENTIFIED BY 'employee_pass'; GRANT PROXY ON 'employee'@ 'localhost' TO 'empl_external'@ 'localhost';
클라이언트가 로컬 호스트에서 empl_external
로 연결하면 MySQL은 auth_plugin
을 사용하여 인증을 수행합니다. auth_plugin
가 ( 'auth_string'
의 내용에 따라 아마도 일부 외부 인증 시스템을 참조하여) 서버에 employee
라는 사용자 이름을 반환하는 경우이 클라이언트를 권한 확인을 위해, employee
로컬 사용자로 처리 하라는 서버에 대한 요청으로 작동합니다.
이 경우 empl_external
프록시 사용자 employee
는 프록시 대상입니다.
서버는 empl_external
이 employee
에 대한 PROXY
권한이 있는지 여부를 확인하여 empl_external
사용자에게 employee
프록시 인증을 수행 할 수 있는지 확인합니다. (이 권한이 부여되지 않은 경우 오류가 발생합니다.)
프록시가 발생했을 때 USER()
및 CURRENT_USER()
함수를 사용하면 연결된 사용자와 현재 세션 중에 권한이 적용되는 계정의 차이점을 확인할 수 있습니다. 앞서 설명한 예에서는 이러한 함수는 다음 값을 반환합니다.
mysql> SELECT USER(), CURRENT_USER();
+-------------------------+--------------------+
| USER() | CURRENT_USER() |
+-------------------------+--------------------+
| empl_external@localhost | employee@localhost |
+-------------------------+--------------------+
인증 플러그인의 이름을 지정하는 IDENTIFIED WITH
절 다음에 사용자의 접속시에 서버가 플러그인에 전달되는 문자열을 지정하는 AS
절이 뒤에 올 수도 있습니다. AS
절이 필요한지 여부는 각 플러그인에 의존합니다. 필요한 경우 인증 문자열의 형식은 플러그인을 사용하는 목적에 따라 다릅니다. 허용되는 인증 문자열 값은 특정 플러그인에 대한 문서를 참조하십시오.
프록시 권한 부여
외부 사용자가 다른 사용자로 연결하고 그 권한을 가질 수 있도록하려면 특별한 PROXY
권한이 필요합니다. 이 권한을 부여하려면 GRANT
문을 사용합니다. 예 :
GRANT PROXY ON ' proxied_user
'TO' proxy_user
';
proxy_user
연결시 외부에서 인증 된 유효한 MySQL 사용자를 표시해야합니다. 그렇지 않으면 연결 시도가 실패합니다. proxied_user
연결시 로컬에서 인증 된 유효한 사용자를 표시해야합니다. 그렇지 않으면 연결 시도가 실패합니다.
해당 REVOKE
구문은 다음과 같습니다.
REVOKE PROXY ON ' proxied_user
'FROM' proxy_user
';
MySQL GRANT
및 REVOKE
구문의 확장 기능은 정상적으로 작동합니다. 예 :
GRANT PROXY ON 'a'TO 'b', 'c', 'd'; GRANT PROXY ON 'a'TO 'd'IDENTIFIED BY ...; GRANT PROXY ON 'a'TO 'd'WITH GRANT OPTION; GRANT PROXY ON 'a'TO '@' '; REVOKE PROXY ON 'a'FROM 'b', 'c', 'd';
위의 예에서는 ''@''
는 기본 프록시 사용자이며, "모든 사용자"를 의미합니다. 기본 프록시 사용자는이 섹션의 뒷부분에서 설명합니다.
다음과 같은 경우 PROXY
권한을 부여 할 수 있습니다.
스스로
proxied_user
에 따르면 : 계정 이름의 사용자 이름과 호스트 이름의 두 부분에서USER()
의 값이CURRENT_USER()
및proxied_user
과 정확히 일치해야합니다.proxied_user
대한GRANT PROXY ... WITH GRANT OPTION
을 가진 사용자에 의한 다.
MySQL 설치시 기본적으로 생성 된 root
계정은 ''@''
(즉, 모든 사용자)에 대한 PROXY ... WITH GRANT OPTION
권한을 가지고 있습니다. 이렇게하면 root
프록시 사용자를 설정하거나 프록시 사용자를 설정하기위한 권한을 다른 계정에 위임 할 수 있습니다. 예를 들어, root
는 다음 작업을 수행 할 수 있습니다.
CREATE USER 'admin'@ 'localhost'IDENTIFIED BY 'test'; GRANT PROXY ON '@' 'TO'admin '@'localhost 'WITH GRANT OPTION;
이 시점에서 admin
사용자는 특정 모든 GRANT PROXY
매핑을 관리 할 수 있습니다. 예를 들어, admin
은 다음 작업을 수행 할 수 있습니다.
GRANT PROXY ON sally TO joe;
기본 프록시 사용자
일부 또는 모든 사용자가 특정 외부 플러그인을 사용하여 연결하도록 지정하려면 "빈"MySQL 사용자를 만들고 플러그인을 사용하여 인증하도록 설정하고 ( 빈 사용자와 다른 경우) 플러그인이 인증 된 실제 사용자 이름을 반환 할 수 있도록합니다. 예를 들어, LDAP 인증을 구현하는 ldap_auth
라는 임시 플러그인이 존재한다고 가정합니다.
CREATE USER ''@ ''IDENTIFIED WITH ldap_auth AS 'O = Oracle, OU = MySQL'; CREATE USER 'developer'@ 'localhost'IDENTIFIED BY 'developer_pass'; CREATE USER 'manager'@ 'localhost'IDENTIFIED BY 'manager_pass'; GRANT PROXY ON 'manager'@ 'localhost'TO '@' '; GRANT PROXY ON 'developer'@ 'localhost'TO '@' ';
여기서 클라이언트가 다음과 같이 연결을 시도합니다.
mysql --user = myuser --password = 'myuser_pass'...
서버는 MySQL 사용자로 정의 된 myuser
가 없습니다. 그러나 클라이언트의 사용자 이름과 호스트 이름과 일치하는 빈 사용자 계정 ( ''@''
)이 있기 때문에 서버 계정과 비교하여 클라이언트를 인증합니다. 서버는 ldap_auth
를 호출 해, 그것을 사용자 이름과 암호로 myuser
및 myuser_pass
에 전달합니다.
ldap_auth
플러그인은 myuser_pass
가 myuser
의 올바른 암호가 아닌 것이 LDAP 디렉토리에서 감지 된 경우, 인증에 실패하고 서버는 연결을 거부합니다.
암호가 제대로 ldap_auth
의해 myuser
가 개발자임을 감지 된 경우, MySQL 서버에 myuser
대신 developer
라는 사용자 이름을 반환합니다. 서버 (실행하기위한 PROXY
권한을 가지고 있기 때문에) ''@''
가 developer
로 인증 할 수 있는지 확인하고 연결을 허용합니다. 세션은 developer
권한을 가지고 myuser
에서 계속됩니다. (이러한 권한은 DBA가 GRANT
문을 사용하여 설정해야하지만 표시되지 않습니다.) USER()
및 CURRENT_USER()
함수는 다음 값을 반환합니다.
mysql> SELECT USER(), CURRENT_USER();
+------------------+---------------------+
| USER() | CURRENT_USER() |
+------------------+---------------------+
| myuser@localhost | developer@localhost |
+------------------+---------------------+
대신 플러그인에 의해 myuser
가 매니저 인 것이 LDAP 디렉토리에서 감지 된 경우, 사용자 이름으로 manager
가 반환 세션은 manager
권한을 가진 myuser
에서 계속됩니다.
mysql> SELECT USER(), CURRENT_USER();
+------------------+-------------------+
| USER() | CURRENT_USER() |
+------------------+-------------------+
| myuser@localhost | manager@localhost |
+------------------+-------------------+
단순하게하기 위해 외부 인증은 다단계에서 실행할 수 없습니다. 위의 예에서는 developer
인증서도 manager
인증서도 고려되지 않습니다. 그러나 클라이언트가 developer
또는 manager
계정과 일치하여 직접 인증을 시도하는 경우는 계속 사용됩니다 (따라서 이러한 계정에 암호를 할당해야합니다).
기본 프록시 계정은 모든 호스트와 일치하는 ''
호스트 부분에 사용합니다. 기본 프록시 사용자를 설정하는 경우 호스트 부분에 '%'
를 포함한 계정도 체크하도록주의하십시오. 그 이유는 이러한 계정은 모든 호스트와 일치하지만, 서버 내부에서 계정 행을 정렬하는 데 사용되는 규칙은 ''
보다 우선되기 때문입니다 ( 섹션 6.2.4 "액세스 제어 1 단계 : 연결 확인 " 을 참조하십시오).
MySQL 설치에 다음의 2 개의 계정이 포함되어 있다고 가정합니다.
CREATE USER ''@ ''IDENTIFIED WITH some_plugin; CREATE USER ''@ '%'IDENTIFIED BY 'some_password';
첫 번째 계정의 목적은 그렇지 않으면 더 구체적인 계정과 일치하지 않는 사용자 연결을 인증하는 데 사용되는 기본 프록시 사용자 역할을하는 것입니다. 두 번째 계정은 예를 들어 익명 사용자로 자신의 계정을 가지고 있지 않은 사용자를 활성화하기 위해 작성 될 수 있습니다.
그러나이 구성에서는 일치 규칙에 의해 ''@''
보다 먼저 ''@'%'
가 정렬되기 때문에 첫 번째 계정은 사용되지 않습니다. 보다 구체적 같은 계정에 일치하지 않는 계정의 경우, 서버는 ''@''
대신 ' ''@'%'
와 대조하여 인증을 시도합니다.
기본 프록시 사용자를 만들 때 기본 프록시 사용자보다 우선되기 때문에, 사용자가 원하는대로 작동하는 것을 방해 기타 기존의 "모든 사용자에 일치한다"계정이 있는지 체크합니다. 이러한 계정을 삭제해야하는 경우도 있습니다.
프록시 사용자의 시스템 변수
다음 2 개의 시스템 변수는 프록시 로그인 프로세스를 추적하는 데 도움이됩니다.
proxy_user
: 프록시가 사용되지 않은 경우,이 값은NULL
입니다. 그렇지 않으면 프록시 사용자 계정을 나타냅니다. 예를 들어, 클라이언트가 기본 프록시 계정을 사용하여 인증하는 경우,이 변수는 다음과 같이 설정됩니다.mysql>
SELECT @@proxy_user;
+--------------+ | @@proxy_user | +--------------+ | ''@'' | +--------------+external_user
: 인증 플러그인은 외부 사용자를 사용하여 MySQL 서버에 대한 인증을 할 수 있습니다. 예를 들어, 기본 Windows 인증을 사용하는 경우 Windows API를 사용하여 인증하는 플러그인에 로그인 ID를 전달해야합니다. 그러나 인증은 계속 Windows 사용자 ID가 사용됩니다. 이 플러그인은 읽기 전용 세션 변수external_user
를 사용하여이 외부 사용자 ID (또는 첫 번째 512 UTF-8 바이트)를 서버에 반환 할 수 있습니다. 플러그인이 변수를 설정하지 않으면, 그 값은NULL
입니다.