• GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

前情介绍:

我们都知道登录MySQL数据库时,连接层接入数据库需要经过mysql.user表中,用户名密码的验证才能登录数据库。

如果mysql.user中不存在此用户或者密码不正确,则会返回错误提示。假如mysql.user数据库表中没有对应的账号,我们能不能登录数据库呢?

今天我们来介绍一下如何来使用Linux操作系统用户,通过验证插件映射MySQL内的账号,登录数据库管理的方法。

操作环境:

操作系统:centos 7.6

MySQL版本:MySQL Enterprise Server 8.0.27

我们边操作边介绍其工作过程。

1、首先建立对应的PAM文件

PAM验证文件配置目录在linux上的/etc/pam.d/ 目录下

[root@localhost ~]# ls /etc/pam.d/
atd crond gdm-autologin gdm-pin mysql-pam password-auth postlogin rhn_register smartcard-auth subscription-manager su-l vlock
chfn cups gdm-fingerprint gdm-smartcard mysql-pam2 password-auth-ac postlogin-ac runuser smartcard-auth-ac subscription-manager-gui system-auth vmtoolsd
chsh fingerprint-auth gdm-launch-environment liveinst other pluto ppp runuser-l sshd sudo system-auth-ac xserver
config-util fingerprint-auth-ac gdm-password login passwd polkit-1 remote setup su sudo-i systemd-user

编辑文件内容如下:

[root@localhost ~]#touch  /etc/pam.d/mysql-pam
[root@localhost ~]# vim/etc/pam.d/mysql-pam
#%PAM-1.0
auth include password-auth
account include password-auth

1.1 什么是PAM?

PAM全称Pluggable Authentication Modules可插入的验证模块,其用途是能够使应用程序与认证机制分离。

MySQL默认登录校验一般是通过内部的mysql.user表进行用户名、密码的匹配验证,而PAM则是通过配置系统/etc/pam.d/下的配置文件,进行身份识别和验证的。

用户调用某个应用程序,比如MySQL客户端登录时,PAM应用程序调用后台的PAM库进行验证工作,接着PAM库在目录/etc/pam.d/目录下面查找相应的mysql中对应配置文件,该文件告诉PAM应用程序使用何种验证机制以便PAM库装在所需要的验证模块,这些模块可以让PAM库与应用程序中的转换函数进行通信

1.2 其中共有四个模块:

模块 作用
auth(验证模块) 用于验证用户或设置/销毁凭证
account(账户管理模块) 执行访问、账户及凭证有效期、密码限制/规则等操作
session(会话管理模块) 初始化或终止会话
passwd(密码模块) 执行密码更改或更新操作

比如我们经常连接Linux系统所用的ssh协议,其验证配置文件就使用了上述的验证、账户、会话以及密码四部分,内容如下:

[root@localhost pam.d]# cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions
-session optional pam_reauthorize.so prepare
[root@localhost pam.d]#

1.3 其验证的流程是:

应用程序MySQL客户端--->PAM API--->读取PAM配置文件---->配置文件中模块鉴别--->鉴别成功--->将权限授予用户--->执行操作

或者->鉴别失败--->拒绝服务,阻止操作

而我们此次配置MySQL的pam认证方式,仅用四个模块中的auth和account两个模块,做身份鉴别和验证

[root@localhost ~]# cat /etc/pam.d/mysql-pam
#%PAM-1.0
auth include password-auth
account include password-auth

2、创建操作系统用户rsmith 、aa 用于做登录验证PAM

2.1第一个系统用户rsmith

[root@localhost ~]# useradd rsmith
[root@localhost ~]# id rsmith
uid=1002(rsmith) gid=1002(rsmith) 组=1002(rsmith)
[root@localhost ~]#

为系统用户rsmith设置操作系统密码:

[root@localhost ~]# passwd rsmith
更改用户 rsmith 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

2.2 第二个系统用户aa

[root@localhost ~]# useradd aa
[root@localhost ~]# passwd aa
更改用户 aa 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#

3、安装用于PAM验证插件authentication_pam

mysql> install plugin authentication_pam soname 'authentication_pam.so';

# 查看插件状态是否可用
3.1 mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%pam%';
+--------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+--------------------+---------------+
| authentication_pam | ACTIVE |
+--------------------+---------------+

4、创建操作系统映射的MySQL数据库用户

[root@localhost ~]# mysql -uroot -p -hlocalhost -S /usr/local/mysql/data/mysql.sock

4.1 创建 accounting@localhost数据库用户,指定使用 /etc/pam.d/mysql-pam 文件

mysql> create user accounting@localhost identified with authentication_pam  AS 'mysql-pam';
Query OK, 0 rows affected (0.00 sec) # 授权accounting@localhost只读权限
mysql> grant select on *.* to accounting@localhost ;
Query OK, 0 rows affected (0.00 sec)

4.2 创建 user1@localhost数据库用户

mysql> create user user1@localhost identified with mysql_no_login; --禁止直接登录,# 只允许通过代理用户登录
Query OK, 0 rows affected (0.00 sec) # 授权user1@localhost可进行DML的增删改操作
mysql> grant insert,delete,update on test.* to user1@localhost;
Query OK, 0 rows affected (0.00 sec) mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4.3 创建匿名账号代理

其次,我们可以创建一个匿名代理账号,仅限代理用户,具有 PAM 组映射。

对于这种情况,创建一个或多个定义不同权限集的 MySQL 帐户。建议将其设置为no_login即不允许直接使用这些帐户进行数据库连接。

然后定义一个通过 PAM 进行身份验证的默认用户,该用户使用某种映射方案(通常基于用户所属的外部 PAM 组)将所有外部用户名映射到少数 MySQL拥有权限集的帐户。

任何连接客户端都会映射到其中一个 MySQL 帐户并使用其权限。

mysql> create user ''@'%' identified with authentication_pam as 'mysql-pam,rsmith=accounting,aa=user1';
Query OK, 0 rows affected (0.00 sec)

解释:其中mysql-pam为pam执行的密码身份验证,rsmith=accounting是将系统rsmith用户组的用户映射数据库accounting用户。

所有rsmith系统用户组的用户均已可使用accounting的权限操作数据库,系统aa用户组映射数据库user1,其aa组的用户可以使用user1的权限进行数据库操作.

授proxy user匿名账户

mysql> grant proxy on  accounting@localhost to ''@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> grant proxy on user1@localhost to ''@'%';

5、客户端使用明文验证登录

[root@localhost ~]# mysql --enable-cleartext-plugin -ursmith -p   -S /usr/local/mysql/data/mysql.sock
Enter password: <----输入rsmith的操作系统密码登录
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 8.0.27-commercial MySQL Enterprise Server - Commercial
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

5.1 查看当前登录账号信息

mysql> select user(),current_user(),@@proxy_user;
+------------------+----------------------+--------------+
| user() | current_user() | @@proxy_user |
+------------------+----------------------+--------------+
| rsmith@localhost | accounting@localhost | ''@'%' |
+------------------+----------------------+--------------+
1 row in set (0.00 sec)

5.2验证用户权限

尝试创建数据库

mysql> create database testpam;
ERROR 1044 (42000): Access denied for user 'accounting'@'localhost' to database 'testpam' mysql> select * from mysql.user where user like '%accoun%'\G
*************************** 1. row ***************************
Host: localhost
User: accounting
Select_priv: Y --->只读权限
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher: 0x
x509_issuer: 0x
x509_subject: 0x
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: authentication_pam ---> 验证插件
authentication_string: mysql-pam --->验证文件
password_expired: N
password_last_changed: NULL
password_lifetime: NULL
account_locked: N
Create_role_priv: N
Drop_role_priv: N
Password_reuse_history: NULL
Password_reuse_time: NULL
Password_require_current: NULL
User_attributes: NULL
1 row in set (0.00 sec) mysql>

我们可以看到操作系统用户rsmith以accounting@localhost连接到数据库,因只具有accounting只读select权限,所以create database失败。

5.3登录aa系统账号,验证其权限

[root@localhost ~]# mysql --enable-cleartext-plugin -uaa -p -S /usr/local/mysql/data/mysql.sock

Enter password:  ----输入aa用户的操作系统密码
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> select user(),current_user(),@@proxy_user;
+--------------+-----------------+--------------+
| user() | current_user() | @@proxy_user |
+--------------+-----------------+--------------+
| aa@localhost | user1@localhost | ''@'%' |
+--------------+-----------------+--------------+
1 row in set (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
mysql> insert into test.t1(id,name) values(1,'aa');
Query OK, 1 row affected (0.00 sec)
mysql>

aa映射为数据库的user1@localhost,user1其具备insert,update,delete等权限,所以可以正常执行。

6、新添加系统用户到PAM组同样具备数据库操作权限

6.1创建新操作系统用户

[root@localhost ~]# useradd  bb -g aa
[root@localhost ~]# passwd bb
更改用户 bb 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

6.2登录做PAM身份验证

[root@localhost ~]# mysql --enable-cleartext-plugin -ubb -p -S /usr/local/mysql/data/mysql.sock
Enter password: ----bb用户操作系统密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 48
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user(),current_user(),@@proxy_user;
+--------------+-----------------+--------------+
| user() | current_user() | @@proxy_user |
+--------------+-----------------+--------------+
| bb@localhost | user1@localhost | ''@'%' |
+--------------+-----------------+--------------+
1 row in set (0.00 sec)

可正常登录MySQL数据库,但对应库内不存在rsmith、aa、bb等用户,全部映射为accounting@localhost和user1@localhost用户,并具备其数据库操作权限。

全文总结:

当前的pam验证方式仅在MySQL的企业版中支持,社区版本中暂时不支持authentication_pam.so插件,所以可以下载企业版玩下试试。

其特点和使用场景总结为如下2点:

  • 1、针对不同登录到Linux操作系统用户,将数据库用户授予不同的权限,当外部用户连接时这里指的是操作系统用户,映射具有不同权限的MySQL内部账户进行代理,以达到不同操作系统用户登录数据库时,分配不同的数据库权限,更灵活。

比如上文中的Linux中aa组成员登录MySQL时,映射mysql.user中的user1,并且具有user1的select只读权限进行数据库操作,系统用户rsmith登录时映射MySQL库中accounting数据库用户,且只有只读权限。

  • 2、使 MySQL 服务器能够使用PAM进行身份验证更灵活。使系统能够使用标准接口来访问各种身份验证方法。典型应用场景,支持传统的 Unix 密码和 LDAP(Lightweight Directory Access Protocol轻型目录访问协议),LDAP典型如windows server的AD域。

==end=

Enjoy GreatSQL

文章推荐:

面向金融级应用的GreatSQL正式开源

https://mp.weixin.qq.com/s/cI_wPKQJuXItVWpOx_yNTg

Changes in GreatSQL 8.0.25 (2021-8-18)

https://mp.weixin.qq.com/s/qcn0lmsMoLtaGO9hbpnhVg

MGR及GreatSQL资源汇总

https://mp.weixin.qq.com/s/qXMct_pOVN5FGoLsXSD0MA

GreatSQL MGR FAQ

https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA

在Linux下源码编译安装GreatSQL/MySQL

https://mp.weixin.qq.com/s/WZZOWKqSaGSy-mpD2GdNcA

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/GreatSQL

GitHub:

https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

微信&QQ群:

可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

Linxu用户名验证登录MySQL管理数据库的更多相关文章

  1. MYSQL管理----数据库删除恢复

    (1) 如果备份了,就好解决了.略. (2)如果日志打开,使用mysqlbinlog来恢复. mysqlbinlog工具的使用,大家可以看MySQL的帮助手册.里面有详细的用, 在这个例子中,重点是- ...

  2. Database基础(四):密码恢复及设置、 用户授权及撤销、数据备份与恢复、MySQL管理工具

    一.密码恢复及设置 目标: 本案例要求熟悉MySQL管理密码的控制,完成以下任务操作: 练习重置MySQL管理密码的操作 通过正常途径设置MySQL数据库的管理密码 步骤: 步骤一:重置MySQL管理 ...

  3. 一步一步实现FormsAuthentic验证登录

    本文不讲原理,只讲用法,原理性的东西网上特别多,不过还是会对一些要用到的东西进行解释,不深入讲原理.本文中用的是Vs2012   .net mvc 4.0.原理看这篇文章,看完这个文章绝对受益匪浅. ...

  4. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  5. CentOS 8.3安装MySQL 8.0.21后无法登录管理数据库

    安装mysql后登录不了,提示: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ...

  6. MySQL/MariaDB数据库的用户和权限管理

    MySQL/MariaDB数据库的用户和权限管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.元数据数据库(mysql) 系统授权表(均在mysql数据库中): db hos ...

  7. CentOS下开启mysql远程连接,远程管理数据库

    当服务器没有运行php.没装phpmyadmin的时候,远程管理mysql就显得有必要了.因为在CentOS下设置的,所以标题加上了CentOS,以下的命令在debian等系统下应该也OK. mysq ...

  8. Linux/CentOS下开启MySQL远程连接,远程管理数据库

    当服务器没有运行PHP.没装phpMyAdmin的时候,远程管理MySQL就显得有必要了. 第一步:开启MySQL用户的远程访问权限 mysql -u root -p mysql # 第1个mysql ...

  9. JSP+MySQL验证登录的实现方式

    用IDEA连接MySQL验证登录实现方式核心部分代码 用setString的方法对从数据库中的提取的信息经行比对: try { Class.forName("com.mysql.jdbc.D ...

随机推荐

  1. unity---GL实现案例

    GL C#实现 不管是画任何东西都需要Begin()和End()函数: 画线 using System.Collections; using System.Collections.Generic; u ...

  2. python之部分内置函数与迭代器与异常处理

    目录 常见内置函数(部分) 可迭代对象 迭代器对象 for循环内部原理 异常处理 异常信息的组成部分 异常的分类 异常处理实操 异常处理的其他操作 for循环本质 迭代取值与索引取值的区别 常见内置函 ...

  3. python初识数据类型(字典、集合、元组、布尔)与运算符

    目录 python数据类型(dict.tuple.set.bool) 字典 集合 元组 布尔值 用户交互与输出 获取用户输入 输出信息 格式化输出 基本运算符 算术运算符 比较运算符 逻辑运算符 赋值 ...

  4. 一文学完Linux常用命令

    一.Linux 终端命令格式 1.终端命令格式 完整版参考链接:Linux常用命令完整版 command [-options] [parameter] 说明: command : 命令名,相应功能的英 ...

  5. liunx 服务器下面安装mysql8.0

    闲来无事,准备自己搭建一个服务器高点事情,不可避免的就是需要使用到mysql数据库了.在Linux系统安装MySQL8.0,网上已经有很多的教程了,到自己安装的时候却发现各种各样的问题,现在把安装过程 ...

  6. JAVA - 线程从创建到死亡的几种状态都有哪些?

    JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...

  7. 代码调用Rally的接口介绍

    1. 支持的语言 2. 创建APIKey 3. GetRequest 4. QueryRequest 5. CreateRequest 6. 参考资料 本文链接: https://www.cnblog ...

  8. ExtJS 布局-Anchor 布局(Anchor layout)

    更新记录: 2022年5月30日 发布本篇 1.说明 anchor布局类似auto布局从上到下进行堆叠,但不同的是其可以指定每个元素相对于容器大小的比例. 当调整父容器大小,容器根据指定的规则调整所有 ...

  9. 在生产中部署ML前需要了解的事

    在生产中部署ML前需要了解的事 译自:What You Should Know before Deploying ML in Production MLOps的必要性 MLOps之所以重要,有几个原因 ...

  10. 快速全面了解QT软件界面开发技术

    快速全面了解QT软件界面开发技术     目录 前言 一. 学习QT可能的目的是什么? 只想体验一下QT? 当前的项目选择了用QT. 为将来做QT技术储备. 二. QT的核心技术优势是什么? QT在软 ...