Habr├й рдкрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА
рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ MySQL рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд▓рдЧрдЗрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдерд╛ред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдореЗрдВ, рдЖрдк
mysql.user рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ MySQL рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо /
рдкрд╛рд╕рд╡рд░реНрдб рдпреЛрдЬрдирд╛ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрдХрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордирдорд╛рдиреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдУрд░реЗрдХрд▓ рдиреЗ рдПрдХ
рдкреАрдПрдПрдо рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд▓рдЧрдЗрди рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рд░реНрд╡рд░
mysql.user рдореЗрдВ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЦреЛрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛рд░реНрдп рдХреЛ
PAM рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рдЪреАрд▓реЗ рдХрд╕реНрдЯрдо рдирд┐рдпрдо рдФрд░ рдордХреНрдЦреА рдкрд░ рдкреНрд▓рдЧ-рдЗрди рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреЗрд╡рд▓ MySQL рдХреЗ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкрд╛рдо-рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрднрд╡ рд╣реИред
рдЬреЛ, рдЬреИрд╕рд╛ рднреА рдерд╛, рдкреВрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдорд╛рд░рддрд╛ рд╣реИред"рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ ..." рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред "рдореИрдВ рдЕрдкрдирд╛ рдкреАрдПрдПрдо-рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреВрдВрдЧрд╛, рд▓рд╛рдареА рдФрд░ рд╡реЗрд╢реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде!"
рдореБрдЭреЗ MySQL рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рдЖрджрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ 5.5 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓
mysql-devel рдкреИрдХреЗрдЬ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЕрдм рдореИрдВ рдЦреБрдж рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
mysql-5.5.17 $ mkdir рдкреНрд▓рдЧрдЗрди / pam_auth
mysql-5.5.17 $ cd plugin / pam_auth
рд╕рдЪ рдЬреЗрдбреА рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ
Cort_socket.c рд▓рд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ
рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдпрд╣ рдХрд╣реАрдВ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:
#include <mysql/plugin_auth.h> static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) { } static struct st_mysql_auth pam_auth_handler = { MYSQL_AUTHENTICATION_INTERFACE_VERSION, "dialog", pam_auth }; mysql_declare_plugin(pam_auth) { MYSQL_AUTHENTICATION_PLUGIN, &pam_auth_handler, "pam_auth", "Sergei Golubchik", "PAM based authentication", PLUGIN_LICENSE_GPL, NULL, NULL, 0x0100, NULL, NULL, NULL, 0, } mysql_declare_plugin_end;
рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдкреНрд▓рдЧрдЗрди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдкреНрд▓рдЧрдЗрди рдХрд╛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЬреНрдпрд╛рджрд╛ рдЦрд╛рд▓реА рдлрдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВ pam рдХрд╣реВрдВрдЧрд╛ред
рдЪреВрдВрдХрд┐ рдЗрд╕ рдкреИрдо-рдкреНрд▓рдЧрдЗрди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╢реНрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЙрддреНрддрд░ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, MySQL рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ - рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░
libmysqlclient рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред рдореБрдЭреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд▓рдЧрдЗрди рд╕реЗ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕реЛрдЯрд┐рдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдмрд╕ рд╕рд░реНрд╡рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рд╢реНрди / рдЙрддреНрддрд░ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ - "рдбрд╛рдпрд▓реЙрдЧ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣, рдХрд╛рдлреА рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ, рдбрд╛рдпрд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ
st_mysql_auth рд╕рдВрд░рдЪрдирд╛ рдХреЗ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕реЗ
рдбрд╛рдпрд▓реЙрдЧ рдХреЛ рд▓реЛрдб
рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрд╕реЗ рд╡рд╣ рд╕рдм рдХреБрдЫ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдореЗрд░рд╛ рдкреНрд▓рдЧрдЗрди рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдореИрдВ
CMakeLists.txt рдмрдирд╛рддрд╛
рд╣реВрдВ (рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдореИрдВ рджреВрд╕рд░реЗ рдкреНрд▓рдЧрдЗрди рд╕реЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд░рддрд╛ рд╣реВрдВ), рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рд╣реИ:
MYSQL_ADD_PLUGIN(pam_auth pam_auth.c LINK_LIBRARIES pam)
рдФрд░ рд╕рдВрдХрд▓рди рдХрд░реЗрдВ
mysql-5.5.17 $ рд╕реЗрдореАред && рдореЗрдХ
рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдм рдпрд╣ рд╕рдордп рд╣реИ рдХрд┐
рдЖрджрдореА рдкреАрдПрдПрдо рдзреВрдореНрд░рдкрд╛рди рдХрд░реЗред MySQL рдореЗрдВ, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд▓рдЧрдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░
vio рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
Vio рдореЗрдВ
write_packet рдФрд░
read_packet рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд╛рдпрд▓реЙрдЧ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде)ред рдкреИрдо рдореЗрдВ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВ
write_packet рдФрд░
read_packet рдХрд╣реВрдВрдЧрд╛ ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
- рдЖрд░рдВрднреАрдХрд░рдг - pam_start (рдпрд╣рд╛рдВ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ)
- рдкреНрд░рдорд╛рдгреАрдХрд░рдг - pam_authent рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ (рдХрд╣реАрдВ рдЕрдВрджрд░ рдФрд░ рд╣рдорд╛рд░реЗ рдХреЙрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- pam_acct_mgmt рдЦрд╛рддрд╛ рд╕рддреНрдпрд╛рдкрди
- рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЪреЗрдХ рдХрд░рдирд╛ (рдпрджрд┐ pam рдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ) - pam_get_item (PAM_USER)
- pam_end рдкреВрд░рд╛ рдХрд░рдирд╛
рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЕрдВрддрд┐рдо рдЪрд░рдг -
pam_end рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрд╣рд╛рдВ рдРрд╕рд╛ рд╕рдорд╛рд░реЛрд╣ рдорд┐рд▓рд╛:
#include <string.h> #include <security/pam_modules.h> #include <security/pam_appl.h> static int conv(int n, const struct pam_message **msg, struct pam_response **resp, void *data) { } #define DO_PAM(X) \ do { \ status = (X); \ if (status != PAM_SUCCESS) \ goto ret; \ } while(0) static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) { pam_handle_t *pamh = NULL; int status; const char *new_username; struct param param; struct pam_conv c = { &conv, ┬╢m }; const char *service = info->auth_string ? info->auth_string : "mysql"; param.ptr = param.buf + 1; param.vio = vio; DO_PAM(pam_start(service, info->user_name, &c, &pamh)); DO_PAM(pam_authenticate (pamh, 0)); DO_PAM(pam_acct_mgmt(pamh, 0)); DO_PAM(pam_get_item(pamh, PAM_USER, (const void**)&new_username)); if (new_username) strncpy(info->authenticated_as, new_username, sizeof(info->authenticated_as)); ret: pam_end(pamh, status); return status == PAM_SUCCESS ? CR_OK : CR_ERROR; }
рдпрд╣ рдПрдХ
рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ - рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдкреИрдо рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрдм рд╡рд╣ рдХреБрдЫ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдкрдо рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреЗрдЬреЗрдЧрд╛, рдФрд░ рдпрд╣ рдЗрд╕реЗ рдЙрддреНрддрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрд╢рд╛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рдПрдХ рд╕реВрдЪрдХ рд╣реИ рдФрд░ рдХрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ:
struct param { unsigned char buf[10240], *ptr; MYSQL_PLUGIN_VIO *vio; };
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ "рд╕рдВрд╡рд╛рдж" рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реИ "рдЗрд╕ рдкрд╛рда рдХреЛ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХреА рдЧрдИ рд▓рд╛рдЗрди рдкрдврд╝реЗрдВ, рдФрд░ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреЗрдВ"ред рд▓реЗрдХрд┐рди рдкреИрдо рдХреЗ рдкрд╛рд╕ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛рддреНрдордХ рд╣реИрдВ рдФрд░ "рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕реЗ, рдХреБрдЫ рднреА рджрд░реНрдЬ рди рдХрд░реЗрдВ" рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдореЗрдВ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрдм рддрдХ рдореБрдЭреЗ рдХреБрдЫ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:
static int conv(int n, const struct pam_message **msg, struct pam_response **resp, void *data) { struct param *param = (struct param *)data; unsigned char *end = param->buf + sizeof(param->buf) - 1; int i; for (i= 0; i < n; i++) { if (msg[i]->msg) { int len = strlen(msg[i]->msg); if (len > end - param->ptr) len = end - param->ptr; memcpy(param->ptr, msg[i]->msg, len); param->ptr+= len; *(param->ptr)++ = '\n'; } if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF || msg[i]->msg_style == PAM_PROMPT_ECHO_ON) { int pkt_len; unsigned char *pkt; if (*resp == 0) { *resp = calloc(sizeof(struct pam_response), n); if (*resp == 0) return PAM_BUF_ERR; } param->buf[0] = msg[i]->msg_style == PAM_PROMPT_ECHO_ON ? 2 : 4; if (param->vio->write_packet(param->vio, param->buf, param->ptr - param->buf - 1)) return PAM_CONV_ERR; pkt_len = param->vio->read_packet(param->vio, &pkt); if (pkt_len < 0) return PAM_CONV_ERR; (*resp)[i].resp= strndup((char*)pkt, pkt_len); param->ptr = param->buf + 1; } } return PAM_SUCCESS; }
рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред рдореИрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реВрдВ, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ - рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдмрдЧ
60745 рдХреЗ рдХрд╛рд░рдг
, рдХреНрд▓рд╛рдЗрдВрдЯ "рд╕рдВрд╡рд╛рдж" рдкреНрд▓рдЧрдЗрди рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЦреИрд░, рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ
mv dif.so рдбрд╛рдпрд▓реЙрдЧ .so
рдФрд░ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MySQL рдореЗрдВ S / Key рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ mysql
рдЪреБрдиреМрддреА otp-md5 99 th91334
рдкрд╛рд╕рд╡рд░реНрдб:
(рдЧреВрдВрдЬ рдЪрд╛рд▓реВ)
pasword: OMEN US HORN OMIT BACK AHOY
mysql>