24.2.4.9 Authentication 플러그인 작성
MySQL에서는 플러그 인증을 지원하고 있으며, 플러그인은 클라이언트 연결을 인증하기 위해 호출됩니다. 인증 플러그인을 사용하면
mysql.user
테이블에 저장되어있는 암호 내장 방식이 아닌 인증 방식을 사용할 수 있습니다. 예를 들어, 외부 인증 방식에 액세스하는 플러그인을 만들 수 있습니다. 또한 인증 플러그인은 프록시 사용자 기능을 지원하므로 연결하는 사용자가 다른 사용자의 프록시하고 (액세스 제어를 위해) 다른 사용자의 권한을 가진 사용자로 처리 할 수 있습니다. 자세한 내용은 섹션 6.3.7 "플러그 인증" 및 섹션 6.3.9 "프록시 사용자" 를 참조하십시오. 인증 플러그인은 서버 측 및 클라이언트 측의 플러그인을 만듭니다. 서버 측 플러그인은 텍스트 파서 플러그인 감사 플러그인 등 다른 종류의 서버 플러그인에서 사용되는 것과 동일한 플러그인 API를 사용합니다 (그러나 유형별 기술자는 다릅니다). 클라이언트 플러그인은 클라이언트 플러그인 API를 사용합니다.
어떤 헤더 파일에 인증 플러그인에 대한 정보가 포함되어 있습니다.
plugin.h
:MYSQL_AUTHENTICATION_PLUGIN
서버 플러그인 타입을 정의합니다.client_plugin.h
: 클라이언트 플러그인 API를 정의합니다. 여기에는 클라이언트 플러그인 기술자 및 클라이언트 플러그인 C API를 호출하기위한 함수 프로토 타입이 포함되어 있습니다 ( 섹션 23.8.14 "C API 클라이언트 플러그인 함수" 를 참조하십시오).plugin_auth.h
: 인증 플러그 인에 고유의 서버 플러그인 API의 일부를 정의합니다. 여기에는 서버 측 인증 플러그인 유형별 기술자와MYSQL_SERVER_AUTH_INFO
구조가 포함됩니다.plugin_auth_common.h
: 클라이언트 인증 플러그인과 서버 인증 플러그인의 공통 요소가 포함됩니다. 여기에는 반환 값의 정의와MYSQL_PLUGIN_VIO
구조가 포함됩니다.
인증 플러그인을 작성하려면 플러그인의 소스 파일에 다음 헤더 파일을 포함합니다. 플러그인의 기능 및 요구 사항에 따라 다른 MySQL의 헤더 파일이나 일반적인 헤더 파일이 필요할 수도 있습니다.
서버 인증 플러그인을 구현하는 소스 파일의 경우 다음 파일을 포함합니다.
#include <mysql/plugin_auth.h>
클라이언트 인증 플러그인을 구현하거나 클라이언트 플러그인과 서버 플러그인을 모두 구현하는 소스 파일의 경우 다음 파일을 포함합니다.
#include <mysql/plugin_auth.h> #include <mysql/client_plugin.h> #include <mysql.h>
plugin_auth.h
는 plugin.h
및 plugin_auth_common.h
을 포함하기 때문에 후자의 파일을 명시 적으로 포함 할 필요가 없습니다.
이 섹션에서는 함께 작동하는 서버 인증 플러그인 및 클라이언트 인증 플러그인 쌍을 생성하는 방법을 설명합니다.
이러한 플러그인은 비어 있지 않은 모든 암호를 받아 암호는 일반 텍스트로 전송됩니다. 이것은 안전하지 않기 때문에이 플러그인은 프로덕션 환경에서 사용하지 마십시오.
여기에서 생성하는 서버 측 플러그인 및 클라이언트 플러그인의 이름은 모두 auth_simple
입니다. 섹션 24.2.4.2 "플러그인 데이터 구조" 에서 설명한 바와 같이, 플러그인 라이브러리 파일은 클라이언트 플러그인과 같은 기본 이름을 가질 필요가 있기 때문에 소스 파일 이름은 auth_simple.c
이며, auth_simple.so
라는 라이브러리가 생성됩니다 (시스템에 라이브러리 파일의 접미사로 .so
가 사용되는 것을 상정하고 있습니다).
MySQL 소스 배포판에서는 인증 플러그인의 소스가 plugin/auth
디렉토리에 다른 인증 플러그인을 만들 때 가이드로 참조 할 수 있습니다. 또한 내장 인증 플러그인이 구현되는 방법을 확인하려면 MySQL 서버에 통합되는 플러그인은 sql/sql_acl.cc
및 libmysqlclient
클라이언트 라이브러리에 통합되는 플러그인은 sql-common/client.c
를 참조하십시오. (기본 클라이언트 플러그인의 경우 사용되는 auth_plugin_t
구조는 일반적으로 클라이언트 플러그인 선언 매크로에서 사용되는 구조와 다릅니다. 특히 첫 번째 두 멤버는 선언 매크로에 의해 설정되는 것이 아니라 명시 적으로 지정되어 있습니다.)
24.2.4.9.1 서버 측 인증 플러그인 작성
모든 서버 플러그 인 타입에 사용되는 보통의 일반 기술자 형식을 사용하여 서버 측 플러그인을 선언합니다 ( 섹션 24.2.4.2.1 "서버 플러그인 라이브러리 및 플러그인 기술자" 를 참조하십시오 ). auth_simple
플러그인의 경우 기술자는 다음과 같이됩니다.
mysql_declare_plugin(auth_simple) { MYSQL_AUTHENTICATION_PLUGIN, &auth_simple_handler, /* type-specific descriptor */ "auth_simple", /* plugin name */ "Author Name", /* author */ "Any-password authentication plugin", /* description */ PLUGIN_LICENSE_GPL, /* license type */ NULL, /* no init function */ NULL, /* no deinit function */ 0x0100, /* version = 1.0 */ NULL, /* no status variables */ NULL, /* no system variables */ NULL, /* no reserved information */ 0 /* no flags */ } mysql_declare_plugin_end;
name
멤버 ( auth_simple
)는 INSTALL PLUGIN
, UNINSTALL PLUGIN
등의 문에서 플러그인을 참조하는 데 사용할 이름을 지정합니다. 이것은 SHOW PLUGINS
또는 INFORMATION_SCHEMA.PLUGINS
에 의해 표시되는 이름이기도합니다.
일반 기술자의 auth_simple_handler
회원 유형별 디스크립터를 가리 킵니다. 인증 플러그인의 경우 유형별 기술자는 st_mysql_auth
구조 ( plugin_auth.h
에서 정의됩니다)의 인스턴스입니다.
struct st_mysql_auth { int interface_version; const char *client_auth_plugin; int (*authenticate_user)(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info); };
st_mysql_auth
구조는 세 멤버 (유형별 API 버전 번호 클라이언트 플러그인 이름 및 클라이언트와 통신하는 기본 플러그인 함수 포인터)가 있습니다. client_auth_plugin
회원은 특정 플러그인이 필요한 경우 클라이언트 플러그인의 이름을 같이합니다. NULL
값은 "어떤 플러그인"을 의미합니다. 후자의 경우, 클라이언트는 어떤 플러그인을 사용할 수 있습니다. 이것은 클라이언트 플러그인 및 클라이언트 플러그인이 보내는 사용자 이름 또는 암호가 서버 플러그인의 처리에 관여하지 않는 경우에 도움이됩니다. 예를 들어, 서버 플러그인이 로컬 클라이언트 만 인증하고 클라이언트 플러그인을 통해 전송되는 정보가 아닌 운영 체제의 일부 특성을 사용하는 경우입니다.
auth_simple
의 경우 유형별 기술자는 다음과 같이됩니다.
static struct st_mysql_auth auth_simple_handler = { MYSQL_AUTHENTICATION_INTERFACE_VERSION, "auth_simple", /* required client-side plugin name */ auth_simple_server /* server-side plugin main function */ };
메인 함수는 I / O 구조 및 MYSQL_SERVER_AUTH_INFO
구조를 나타내는 두 개의 인수를받습니다. 이 구조체의 정의는 plugin_auth.h
에 있습니다. 이것은 다음과 같은 정의입니다.
typedef struct st_mysql_server_auth_info { char *user_name; unsigned int user_name_length; const char *auth_string; unsigned long auth_string_length; char authenticated_as[MYSQL_USERNAME_LENGTH+1]; char external_user[512]; int password_used; const char *host_or_ip; unsigned int host_or_ip_length; } MYSQL_SERVER_AUTH_INFO;
문자열 멤버의 문자 세트는 UTF-8입니다. 문자열과 관련된 _length
멤버가있는 경우, 이것은 바이트 단위의 문자열 길이를 나타냅니다. 문자열을 NULL로 끝납니다.
서버에서 인증 플러그인이 호출되면 MYSQL_SERVER_AUTH_INFO
구조체 멤버가 다음과 같이 해석됩니다. 이 부분은 설명 된대로 클라이언트 세션의 SQL 함수 또는 시스템 변수의 값을 설정하는 데 사용됩니다.
user_name
: 클라이언트가 전송 된 사용자 이름입니다. 이 값은USER()
함수의 값입니다.user_name_length
:user_name
의 바이트 단위 길이.auth_string
:mysql.user
테이블에 일치하는 계정 이름의 행 (즉, 클라이언트 사용자 이름과 호스트 이름이 일치하고 클라이언트를 인증하는 방법을 판별하기 위해 서버에서 사용되는 행)의authentication_string
열 값.다음 문을 사용하여 계정을 만들려고합니다.
CREATE USER 'my_user'@'localhost' IDENTIFIED WITH my_plugin AS 'my_auth_string';
my_user
가 로컬 호스트에서 연결하는 경우 서버는my_plugin
를 호출하여'my_auth_string'
을auth_string
값으로 전달합니다.auth_string_length
:auth_string
의 바이트 단위 길이.authenticated_as
: 서버는이를 사용자 이름 (user_name
값)로 설정합니다. 플러그인은 클라이언트가 다른 사용자의 권한을 가지는 것을 같이 변경할 수 있습니다. 예를 들어, 플러그인에서 프록시 사용자가 지원되는 경우 기본값은 연결 (프록시) 사용자 이름이지만, 플러그인이 멤버 프록시 설정되는 사용자 이름을 변경할 수 있습니다. 그런 다음 서버는 프록시 설정되는 사용자 권한이있는 것으로 프록시 사용자를 처리합니다 (프록시 사용자 지원을위한 하나의 조건이 충족되어 있다고 가정합니다. 섹션 24.2.4.9.4 "인증 플러그인에서 프록시 사용자 지원 구현" 을 참조하십시오). 이 값은 최대MYSQL_USER_NAME_LENGTH
바이트의 길이를 가진 문자열 및 종단의 NULL로 표시됩니다. 이 값은CURRENT_USER()
함수의 값입니다.external_user
: 서버는 빈 문자열 (NULL로 끝납니다)을 이에 설정합니다. 이 값은external_user
시스템 변수의 값입니다. 플러그인이 시스템 변수가 다른 값을 갖게하려면 플러그인 그렇게이 멤버를 설정하십시오 (예를 들어, 연결된 사용자 이름을 설정합니다). 이 값은 최대 511 바이트 길이의 문자열 및 종단의 NULL로 표시됩니다.password_used
:이 멤버는 인증에 실패 할 경우에 적용됩니다. 플러그인은 이것을 설정하거나 무시할 수 있습니다. 이 값은Authentication fails. Password used: %s
라는 실패 오류 메시지를 생성하는 데 사용됩니다.password_used
값은 다음 표와 같이%s
의 처리 방법을 결정합니다.password_used
%s
Handling0 NO
1 YES 2 There will be no %s
host_or_ip
: 해결할 수있는 경우 클라이언트의 호스트 이름 또는 확인할 수없는 경우 IP 주소.host_or_ip_length
:host_or_ip
의 바이트 단위 길이.
auth_simple
의 메인 함수 auth_simple_server()
는 클라이언트의 암호 (NULL로 끝나는 문자열)를 읽고 암호가 비어 있지 않은 (선두 바이트가 NULL이 아닌 경우)에 성공합니다.
static int auth_simple_server (MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) { unsigned char *pkt; int pkt_len; /* read the password as null-terminated string, fail on error */ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0) return CR_ERROR; /* fail on empty password */ if (!pkt_len || *pkt == '\0') { info->password_used= PASSWORD_USED_NO; return CR_ERROR; } /* accept any nonempty password */ info->password_used= PASSWORD_USED_YES; return CR_OK; }
주요 기능은 다음 표에 나열된 중 하나의 오류 코드를 돌려줍니다.
오류 코드 | 의미 |
---|---|
CR_OK | 성공 |
CR_OK_HANDSHAKE_COMPLETE | 상태 패킷을 클라이언트로 전송하지 |
CR_ERROR | 오류 |
CR_AUTH_USER_CREDENTIALS | 인증 오류 |
CR_AUTH_HANDSHAKE | 인증 핸드 셰이크 오류 |
CR_AUTH_PLUGIN_ERROR | 내부 플러그인 오류 |
핸드 셰이크가 작동하는 방법의 예는 plugin/auth/dialog.c
소스 파일을 참조하십시오.
CR_ERROR
에 계속 오류 코드는 MySQL 5.6.5에서 사용할 수 있습니다. 서버는 MySQL 5.6.5 이후에 사용할 수있는 성능 스키마 host_cache
테이블의 플러그인 오류를 계산합니다.
auth_simple_server_main()
는 매우 기본적인 것이기 때문에 암호를 받았는지 여부를 나타내는 멤버를 설정하는 것을 제외하고, 인증 정보 구조를 사용하지 않습니다.
프록시 사용자를 지원하는 플러그인은 프록시 설정되어있는 사용자 (클라이언트 사용자가 얻을 수있는 권한이있는 MySQL 사용자)의 이름을 서버에 반환해야합니다. 이렇게하려면 플러그인은 프록시 설정되는 사용자 이름을 info->authenticated_as
멤버로 설정해야합니다. 프록시 설정 내용은 섹션 6.3.9 "프록시 사용자" 및 섹션 24.2.4.9.4 "인증 플러그인에서 프록시 사용자 지원 구현" 을 참조하십시오.
24.2.4.9.2 클라이언트 인증 플러그인 작성
mysql_declare_client_plugin()
매크로 및 mysql_end_client_plugin
매크로를 사용하여 클라이언트 플러그인 디스크립터를 선언합니다 ( 섹션 24.2.4.2.3 "클라이언트 플러그인 기술자" 를 참조하십시오). auth_simple
플러그인의 경우 기술자는 다음과 같이됩니다.
mysql_declare_client_plugin(AUTHENTICATION) "auth_simple", /* plugin name */ "Author Name", /* author */ "Any-password authentication plugin", /* description */ {1,0,0}, /* version = 1.0.0 */ "GPL", /* license type */ NULL, /* for internal use */ NULL, /* no init function */ NULL, /* no deinit function */ NULL, /* no option-handling function */ auth_simple_client /* main function */ mysql_end_client_plugin;
플러그인 이름에서 옵션 처리 함수까지 기술자 멤버는 모든 클라이언트 플러그인 유형에서 공통적 있습니다. (설명은 섹션 24.2.4.2.3 "클라이언트 플러그인 기술자" 를 참조하십시오.) 일반 회원에 따라,이 기술자는 인증 플러그 인에 고유의 추가 멤버가 있습니다. 이것은 '기본'함수이며, 서버와의 통신을 처리합니다. 이 함수는 I / O 구조와 연결 처리기를 나타내는 2 개의 인수를 취합니다. 임의 암호를 지정할 수이 간단한 플러그인은 메인 함수는 사용자가 지정한 암호를 서버에 쓸뿐입니다.
static int auth_simple_client (MYSQL_PLUGIN_VIO *vio, MYSQL *mysql) { int res; /* send password as null-terminated string in clear text */ res= vio->write_packet(vio, (const unsigned char *) mysql->passwd, strlen(mysql->passwd) + 1); return res ? CR_ERROR : CR_OK; }
주요 기능은 다음 표에 나열된 중 하나의 오류 코드를 돌려줍니다.
오류 코드 | 의미 |
---|---|
CR_OK | 성공 |
CR_OK_HANDSHAKE_COMPLETE | 성공 클라이언트 완료 |
CR_ERROR | 오류 |
CR_OK_HANDSHAKE_COMPLETE
는 클라이언트가 자신의 역할을 성공적으로 완료하고 마지막 패킷을 읽은 것을 나타냅니다. 인증 프로토콜 왕복 횟수가 사전에 알려져 있지 않고, 인증이 완료되었는지 여부를 판별하기 위해 플러그인이 다른 패킷을 읽을 필요가있는 경우 클라이언트 플러그인이 CR_OK_HANDSHAKE_COMPLETE
을 반환 할 수 있습니다.
24.2.4.9.3 인증 플러그인 사용
플러그인 라이브러리의 오브젝트 파일을 컴파일 및 설치하려면 섹션 24.2.4.3 "플러그인 라이브러리의 컴파일 및 설치" 단계를 참조하십시오. 라이브러리 파일을 사용하려면 라이브러리 파일이 플러그인 디렉토리 ( plugin_dir
시스템 변수에 지정된 디렉토리)에 설치되어 있어야합니다.
서버 측 플러그인을 서버에 등록합니다. 예를 들어, 플러그인 서버 시작시로드하려면 --plugin-load=auth_simple.so
옵션을 사용합니다 (시스템에서 필요한 경우 라이브러리 지원 설비를 변경합니다).
서버가 인증을 위해 auth_simple
플러그인을 사용하려는 사용자를 만듭니다.
mysql>CREATE USER 'x'@'localhost'
->IDENTIFIED WITH auth_simple;
클라이언트 프로그램을 사용하여 사용자 x
로 서버에 연결합니다. 서버 측의 auth_simple
플러그인은 클라이언트 측 auth_simple
플러그인을 사용하는 클라이언트 프로그램과 통신, 후자는 서버에 암호를 보냅니다. 서버는 빈 암호를 보내 연결을 거부하고 비어 있지 않은 암호를 전송하는 연결을 허용합니다. 이를 검증하기 위해 각각의 방식으로 클라이언트 프로그램을 시작합니다.
shell>mysql --user=x --skip-password
ERROR 1045 (28000): Access denied for user 'x'@'localhost' (using password: NO) shell>mysql --user=x --password=abc
mysql>
이 서버 플러그인은 비어 있지 않은 암호를 모두 허용하므로 안전하지 않은 것으로 간주됩니다. 플러그인을 테스트하고 플러그인이 작동하는지 확인한 후 모르고 안전하지 않은 인증 플러그인이로드 된 상태에서 서버가 실행됩니다 계속 않도록 --plugin-load
옵션을 지정하지 않고 서버를 다시 시작합니다. 또한 DROP USER 'x'@'localhost'
를 사용하여 사용자를 삭제합니다.
인증 플러그인로드 및 사용에 대한 자세한 내용은 섹션 5.1.8.1 "플러그인 설치 및 제거" 및 섹션 6.3.7 "플러그 인증" 을 참조하십시오.
인증 플러그인의 사용을 지원하는 클라이언트 프로그램을 작성하는 경우, 일반적으로 이러한 프로그램은 mysql_options()
를 호출 MYSQL_DEFAULT_AUTH
옵션 및 MYSQL_PLUGIN_DIR
옵션을 설정하여 플러그인을로드합니다.
char *plugin_dir = "path_to_plugin_dir
"; char *default_auth = "plugin_name
"; /* ... process command-line options ... */ mysql_options(&mysql, MYSQL_PLUGIN_DIR, plugin_dir); mysql_options(&mysql, MYSQL_DEFAULT_AUTH, default_auth);
일반적으로 프로그램은 사용자가 기본값을 대체 할 수있는 --plugin-dir
및 --default-auth
옵션도 사용할 수 있습니다.
클라이언트 프로그램에서 낮은 수준의 플러그인 관리가 필요한 경우 클라이언트 라이브러리에 st_mysql_client_plugin
인수를 함수를 포함합니다. 섹션 23.8.14 "C API 클라이언트 플러그인 함수" 를 참조하십시오.
24.2.4.9.4 인증 플러그인에서 프록시 사용자 지원 구현
플러그 인증에서 사용할 수있게되는 기능 중 하나는 프록시 사용자입니다 ( 섹션 6.3.9 "프록시 사용자" 를 참조하십시오). 서버 측 인증 플러그인에서 프록시 사용자가 지원되도록하려면 다음의 조건을 충족해야합니다.
연결하는 클라이언트를 프록시 사용자로 취급 경우 플러그인은
MYSQL_SERVER_AUTH_INFO
구조authenticated_as
회원에 다른 이름을 돌려 프록시 설정되는 사용자 이름을 표시해야합니다.external_user
시스템 변수의 값을 설정하기 위해 필요한external_user
멤버를 구성 할 수 있습니다.프록시 사용자 계정은 플러그인에 의해 인증되도록 설치해야합니다. 계정을 플러그인에 연결하려면
CREATE USER
문 또는GRANT
문을 사용합니다.프록시 사용자 계정에 프록시 설정되는 계정에 대한
PROXY
권한이 있어야합니다. 이 권한을 부여하려면GRANT
문을 사용합니다.
즉, 플러그인에 필요한 프록시 사용자 지원의 특성은 프록시 설정되는 사용자 이름을 authenticated_as
에 설정할뿐입니다. 다른 옵션인지 ( external_user
설정) SQL 문을 사용하여 DBA가합니다.
인증 플러그인은 프록시 사용자가 접속했을 때 반환 프록시 설정되어있는 사용자를 어떻게 결정하는 것일까 요. 이것은 플러그인에 따라 다릅니다. 일반적으로 플러그인은 서버에서 전달 된 인증 문자열에 따라 클라이언트를 프록시 설정되어있는 사용자에 매핑합니다. 이 문자열은 인증 플러그인을 사용하도록 지정하는 CREATE USER
문 IDENTIFIED WITH
절 AS
부분에 지정됩니다.
플러그인 개발자는 인증 문자열의 구문 규칙을 결정하고 이러한 규칙에 따라 플러그인을 구현합니다. 외부 사용자를 MySQL 사용자에 매핑하는 쉼표로 구분 된 목록의 쌍을 플러그인을받을합니다. 예 :
CREATE USER ''@'%.example.com' IDENTIFIED WITH my_plugin AS 'extuser1=mysqlusera, extuser2=mysqluserb' CREATE USER ''@'%.example.org' IDENTIFIED WITH my_plugin AS 'extuser1=mysqluserc, extuser2=mysqluserd'
서버 플러그인을 시작하여 클라이언트를 인증 할 때 적절한 인증 문자열을 플러그인에 전달합니다. 플러그인은 다음 역할이 있습니다.
문자열을 구문 분석하고 구성 요소로 분해하고 사용할 매핑을 결정하는
클라이언트 사용자 이름과 매핑을 비교
적절한 MySQL 사용자 이름을 반환
예를 들어, example.com
호스트에서 extuser2
연결하는 경우 서버는 'extuser1=mysqlusera, extuser2=mysqluserb'
를 플러그인에 전달 플러그인은 mysqluserb
종단의 NULL 바이트를 부가 해 authenticated_as
에 복사합니다. example.org
호스트에서 extuser2
연결하는 경우 서버는 'extuser1=mysqluserc, extuser2=mysqluserd'
을 전달 플러그인 대신 mysqluserd
를 복사합니다.
매핑에 일치하는 것이없는 경우의 조치는 플러그인에 따라 다릅니다. 일치하는 것이있을 필요가있을 때, 많은 경우 플러그인은 오류를 반환합니다. 또는 플러그인이 단순히 클라이언트 이름을 반환 할 수 있으며,이 경우 플러그인은 authenticated_as
을 변경하지 않고, 서버는 클라이언트를 프록시로 처리하지 않습니다.
다음 예제에서는 auth_simple_proxy
라는 플러그인을 사용하여 프록시 사용자를 처리하는 방법을 보여줍니다. 앞에서 언급 한 auth_simple
플러그인처럼 auth_simple_proxy
는 비어 있지 않은 모든 암호를 유효한 것으로 받아들입니다 (따라서 프로덕션 환경에서 사용하지 마십시오). 이것은 또한 auth_string
인증 문자열 멤버를 검사하고 다음 매우 간단한 규칙을 사용하여이를 해석합니다.
문자열이 비어 있으면 플러그인은 지정된 사용자 이름을 반환 프록시 설정되지 않습니다. 즉, 플러그인
authenticated_as
값을 변경하지 않고 그대로 있습니다.문자열이 비어 있지 않은 경우 플러그인은이를 프록시 설정되어있는 사용자의 이름으로 취급 프록시 설정이 이루어 지도록이를
authenticated_as
에 복사합니다.
테스트를 위해 위의 규칙에 따라 프록시 설정되지 않은 하나의 계정 및 프록시 설정되는 하나의 계정을 설정합니다. 이것은 하나의 계정에 AS
절이없이 다른 계정에 프록시 설정되어있는 사용자를 지정하는 AS
절이 있다는 것을 의미합니다.
CREATE USER 'plugin_user1'@'localhost' IDENTIFIED WITH auth_simple_proxy; CREATE USER 'plugin_user2'@'localhost' IDENTIFIED WITH auth_simple_proxy AS 'proxied_user';
또한 프록시 설정되는 사용자 계정을 만들고 해당 계정에 대한 PROXY
권한을 plugin_user2
에 부여합니다.
CREATE USER 'proxied_user'@'localhost' IDENTIFIED BY 'proxied_user_pass'; GRANT PROXY ON 'proxied_user'@'localhost' TO 'plugin_user2'@'localhost';
서버는 인증 플러그인을 호출하기 전에 authenticated_as
클라이언트 사용자 이름을 설정합니다. 사용자가 프록시임을 표시하기 위해 플러그인은 프록시 설정되는 사용자 이름을 authenticated_as
로 설정합니다. auth_simple_proxy
의 경우 이것은 auth_string
값을 검사하여 값이 비어 있지 않은 경우 값을 authenticated_as
멤버에 복사하여 프록시 설정되어있는 사용자의 이름으로 그것을 돌려 줄 필요가 있다는 것을 의미합니다. 또한 프록시 설정을하는 경우 플러그인은 external_user
회원 클라이언트 사용자 이름을 설정하고 이것이 external_user
시스템 변수의 값입니다.
static int auth_simple_proxy_server (MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) { unsigned char *pkt; int pkt_len; /* read the password as null-terminated string, fail on error */ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0) return CR_ERROR; /* fail on empty password */ if (!pkt_len || *pkt == '\0') { info->password_used= PASSWORD_USED_NO; return CR_ERROR; } /* accept any nonempty password */ info->password_used= PASSWORD_USED_YES; /* if authentication string is nonempty, use as proxied user name */ /* and use client name as external_user value */ if (info->auth_string_length > 0) { strcpy (info->authenticated_as, info->auth_string); strcpy (info->external_user, info->user_name); } return CR_OK; }
연결이 성공하면 USER()
함수는 연결된 클라이언트 사용자와 호스트 이름을 나타내고, CURRENT_USER()
는 세션에 적용되는 권한을 가진 계정을 나타냅니다. 후자의 값은 프록시 설정이되지 않는 경우 연결 사용자 계정 및 프록시 설정이 이루어진 경우 프록시 설정되는 계정입니다.
플러그인을 컴파일 및 설치하여 테스트합니다. 첫째, plugin_user1
로 연결합니다.
shell> mysql --user=plugin_user1 --password=x
이 경우 프록시 설정되지 않습니다.
mysql> SELECT USER(), CURRENT_USER(), @@proxy_user, @@external_user\G
*************************** 1. row ***************************
USER(): plugin_user1@localhost
CURRENT_USER(): plugin_user1@localhost
@@proxy_user: NULL
@@external_user: NULL
그런 plugin_user2
로 연결합니다.
shell> mysql --user=plugin_user2 --password=x
이 경우 plugin_user2
는 proxied_user
에 대해 프록시 설정됩니다.
mysql> SELECT USER(), CURRENT_USER(), @@proxy_user, @@external_user\G
*************************** 1. row ***************************
USER(): plugin_user2@localhost
CURRENT_USER(): proxied_user@localhost
@@proxy_user: 'plugin_user2'@'localhost'
@@external_user: 'plugin_user2'@'localhost'