可加载的身份验证插件
除了默认的内置插件,MySQL 还提供了几个可加载的插件:
- 测试身份验证插件 (test_plugin_server) 使用本机或者旧密码身份验证进行身份验证,旨在用于测试和开发目的。
- Socket Peer-Credential (auth_socket) 插件允许用户通过 UNIX 套接字文件进行连接,前提是他们的 Linux 用户名与他们的 MySQL 帐户匹配。
- PAM 身份验证插件 (authentication_pam) 是一个企业版插件,允许我们使用外部身份验证机制登录。 MySQL 不存储密码,而是使用 UNIX PAM(可插拔身份验证模块)机制来传输客户端提供的用户名和密码,以便操作系统进行身份验证。
我们可以开发自己的身份验证插件。
测试身份验证插件旨在供开发人员使用以创建自己的插件;它的源代码作为 MySQL 源代码分发的一部分提供。
通过在命令行或者 my.cnf 文件中使用 plugin-load 选项启动服务器来加载可加载的身份验证插件,如下例所示:
[mysqld] plugin-load=authentication_pam.so
PAM 认证插件
PAM 身份验证插件是一个企业版插件,可根据操作系统对 MySQL 帐户进行身份验证。
PAM 定义了配置身份验证的服务。
这些存储在 /etc/pam.d 中。
PAM 在 /etc/pam.d 中查找它验证的服务。
例如,要创建名为 mysql-pam 的 PAM 服务,请使用以下内容创建文件 /etc/pam.d/mysql-pam:
#%PAM-1.0 auth include password-auth account include password-auth
除了 MySQL 身份验证之外,PAM 还与其他身份验证方法(包括 LDAP 和 Active Directory)集成,因此我们可以使用 PAM 针对网络中的单个存储验证许多服务(包括 MySQL)。
要创建直接映射到操作系统用户的 MySQL 用户,请使用如下语句:
CREATE USER bob@localhost IDENTIFIED WITH authentication_pam AS 'mysql-pam';
当 bob 登录时,MySQL 将从客户端收到的用户名和密码传递给 PAM,PAM 会针对操作系统进行身份验证。
客户端必须以明文形式发送密码。
启用客户端明文身份验证插件以实现此目的:
shell> mysql --enable-cleartext-plugin -ubob -p Enter password: bob’s_OS_password
要使用 PAM 身份验证插件启用基于组的登录,请创建一个启用 PAM 的匿名代理帐户,该帐户不匹配任何用户,但指定一组从操作系统组到 MySQL 用户的映射:
CREATE USER ''@'' IDENTIFIED WITH authentication_pam AS 'mysql-pam, sales=m_sales, finance=m_finance';
前面的示例假设我们有销售和财务操作系统组以及 m_sales 和 m_finance MySQL 用户。
然后,我们必须向匿名代理帐户授予 PROXY 权限,使其有权以 m_sales 和 m_finance MySQL 用户身份登录:
GRANT PROXY ON m_sales@localhost TO ''@''; GRANT PROXY ON m_finance@localhost TO ''@'';
作为销售和财务组成员的用户现在可以在 mysql 命令行提示符下提供他们的操作系统凭据,分别以 m_sales 或者 m_finance MySQL 用户身份登录,授予他们授予这些帐户的所有权限。
例如,如果 peter 是销售组的成员,他可以按如下方式登录:
shell> mysql --enable-cleartext-plugin -upeter -p Enter password: peter’s_OS_password Welcome to the MySQL monitor. Commands end with ; or \g. ... mysql> SELECT CURRENT_USER(); +-------------------+ | CURRENT_USER() | +-------------------+ | m_sales@localhost | +-------------------+ 1 row in set (0.01 sec)
客户端明文身份验证插件
某些身份验证方法,例如 PAM(可插拔身份验证模块)身份验证,要求客户端向服务器发送纯文本密码,以便服务器可以正常形式处理密码。
mysql_clear_password 插件启用此行为。
MySQL 客户端库包括一个内置的明文身份验证插件 mysql_clear_password。
该插件用于向服务器发送纯文本密码——密码通常是散列的。
该插件由 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN 环境变量启用,并在运行 MySQL 客户端应用程序(如 mysql 和 mysqladmin)时指定 -enable-cleartext-plugin。
mysql_options() C API 函数的 MYSQL_ENABLE_CLEARTEXT_PLUGIN 选项也可用于启用插件。
MySQL 支持多种身份验证机制,这些机制可通过可插入身份验证获得。
MySQL 使用多种算法来加密存储在用户表中的密码:
- mysql_native_password 插件实现了标准密码格式,一个 41 字节宽的散列。
- mysql_old_password 插件实现了一种较旧的格式,该格式的安全性较低,为 16 字节宽。
- sha256_password 插件实现了广泛用于安全计算的 SHA-256 哈希算法。
old_passwords 系统变量的值指定了 PASSWORD() 函数用于创建密码的算法,如下所示:
- 0 :标准算法,自 MySQL 4.1.1 起使用
- 1 : 旧算法,在 MySQL 4.1.1 之前使用
- 2:SHA-256算法
将 default-authentication-plugin 选项设置为 sha256_password 启动服务器以对所有新用户使用 SHA-256 密码,或者使用带有 IDENTIFIED WITH sha256_password 子句的 CREATE USER 为特定用户指定 SHA-256 密码。