共计 3611 个字符,预计需要花费 10 分钟才能阅读完成。
作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。善于 MySQL、PostgreSQL、MongoDB 等开源数据库相干的备份复原、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相干技术支持、MySQL 相干课程培训等工作。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
有客户在编写后期数据库安全标准时,就如何更平安的在 Linux Shell 端操作 MySQL 这一块,让咱们帮忙出一份详尽的阐明文档。其中有一项内容就是如何在 Linux Shell 下调用 MySQL 各种命令行工具时屏蔽掉烦人的告警信息输入,诸如上面这样:
root@ytt-ubuntu18:/home/ytt# mysql -uytt -proot -e "select version()"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| version() |
+-----------+
| 8.0.29 |
+-----------+
其实这是一个十分古老的问题!百度轻易一搜,各种解决办法都有,但都写的不是很欠缺。
这样的告警信息对命令执行后果的输入十分不敌对,那么咱们如何屏蔽掉它?上面我来列举下几种我能想到的办法,以供参考。
1、给用户空明码(不举荐)
给用户赋予空明码尽管能够屏蔽掉正告信息,然而极不平安,相似于 MySQL 服务初始化时的 –initialize-insecure 选项。
root@ytt-ubuntu18:/home/ytt# mysql -u ytt_no_pass -e "select user()"
+-----------------------+
| user() |
+-----------------------+
| ytt_no_pass@localhost |
+-----------------------+
2、配置文件不同块退出用户名明码(不举荐)
MySQL 的配置文件有 my.cnf、mysql.cnf、mysqld.cnf 等等,只有在这些配置文件里的不同块下增加对应的用户名和明码即可。
root@ytt-ubuntu18:/home/ytt# cat /etc/mysql/conf.d/mysql.cnf
[mysql]
prompt=mysql:\d:\v>
user=ytt
password=root
port=3340
[mysqldump]
user=ytt
password=root
port=3340
[mysqladmin]
user=ytt
password=root
port=3340
以上 [mysql] 块下的内容示意对 mysql 命令行失效,[mysqldump]块下的内容示意对 mysqldump 工具失效,[mysqladmin]块下的内容示意对 mysqladmin 工具失效。
或者写简略点,对立加到【client】 里,示意对所有客户端失效。留神只能把共享的局部内容加到这里。
root@ytt-ubuntu18:/home/ytt# cat /etc/mysql/conf.d/mysql.cnf
[mysql]
prompt=mysql:\d:\v>
[client]
user=ytt
password=root
port=3340
因为这些块都是针对客户端设置,不须要重启 MySQL 服务,可立刻失效。
root@ytt-ubuntu18:/home/ytt# mysql -e "select user()"
+---------------+
| user() |
+---------------+
| ytt@localhost |
+---------------+
3、设置 MySQL 环境变量(不举荐)
MySQL 有一些内置环境变量,对所有客户端失效。官网的环境变量列表如下:
https://dev.mysql.com/doc/ref…
给以后用户设置所需的环境变量,之后再调用命令行工具即可。比方设置明码环境变量 MYSQL_PWD、传统 TCP 端口环境变量 MYSQL_TCP_PORT 等。
root@ytt-ubuntu18:/home/ytt# export MYSQL_PWD=root MYSQL_TCP_PORT=3340
root@ytt-ubuntu18:/home/ytt# mysql -uytt -e "select user()"
+---------------+
| user() |
+---------------+
| ytt@localhost |
+---------------+
此办法也不举荐应用,环境变量 MYSQL_PWD 容易被其余用户获取。比方间接用 ps 命令就能够轻易获取 MYSQL_PWD 的值。
用户 1 执行如下命令:
root@ytt-ubuntu18:/home/ytt# mysql -uytt -e "select sleep(1000)"
用户 2 执行 ps aex 就能够打印出环境变量 MYSQL_PWD 和 MYSQL_TCP_PORT 的值:
root@ytt-ubuntu18:/home/ytt# ps aex| grep MYSQL_PWD| grep -v 'grep'
7592 pts/0 S+ 0:00 mysql -uytt -e select sleep(1000) LS_COLORS=rs=0:... MYSQL_PWD=root ...MYSQL_TCP_PORT=3340 ...
4、屏蔽规范谬误输入内容,重定向到空设施文件(举荐)
root@ytt-ubuntu18:/home/ytt# mysql -uytt -proot -P3340 -e"select version()" 2>/dev/null
+-----------+
| version() |
+-----------+
| 8.0.29 |
+-----------+
这里利用 Linux 零碎自身的个性来重定向 MySQL 错误信息,其中数字 2 代表谬误输入的文件描述符;/dev/null 代表空设施。也就是说把执行这条命令的错误信息重定向到空设施而不是规范输入,这样就能够变相的把正告信息屏蔽掉。
5、应用 mysql_config_edit 工具生成不同的 login_path(举荐)
mysql_config_edit 是 MySQL 官网公布的一款工具,专门解决这类必须裸露用户明码的问题,能够进行一次设置,屡次平安应用。
应用办法如下:设置一个 login_path,名字为 user_ytt,明码按提醒输出即可。
root@ytt-ubuntu18:/home/ytt# mysql_config_editor set -G user_ytt -S /var/run/mysqld/mysqld.sock -u ytt -p
Enter password:
接下来,调用任何 MySQL 命令行工具只须要带上 –login-path 选项即可应用。
root@ytt-ubuntu18:/home/ytt# mysql --login-path=user_ytt -e 'select user()'
+---------------+
| user() |
+---------------+
| ytt@localhost |
+---------------+
root@ytt-ubuntu18:/home/ytt# mysqladmin --login-path=user_ytt ping
mysqld is alive
mysql_config_editor 工具也有一个毛病:同样的 login_path 不能分享给所有零碎用户,其余用户得从新增加本人的 login_path 能力失常应用。
6、应用 Unix socket 插件(举荐,仅限本地)
auth_socket 插件只依据本地 OS 登录用户名和本地 linux socket 文件来受权认证。比方批改用户 ytt@localhost 插件为 auth_socket:
mysql> alter user ytt@localhost identified with auth_socket ;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye
切换到 OS 用户 ytt:
root@ytt-pc-big:/home/ytt# su ytt
ytt@ytt-pc-big:~$ mysql -e "select user(),current_user()"
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| ytt@localhost | ytt@localhost |
+---------------+----------------+