使用Shell脚本进行MySql权限修改

背景:原先数据配置文件中有bind-address=127.0.0.1,注释掉此配置后,原数据库中默认带%root的权限,现在需要通过脚本实现白名单列表中的ip添加权限允许访问数据库,白名单之外的ip没有权限访问数据库。
以下是过程中记录的一些问题。

1、能否直接通过将%@root替换成白名单中ip@root权限?

答:不能。

在 MySQL 中,无法将 %@root 直接更新为 whitelisted_ip@root 的权限。权限授予是基于用户和主机的,而不是根据特定的用户和权限项。这意味着不能直接更改权限项的主机部分。
相反,应该创建一个新的用户,并仅授予该用户特定主机的访问权限。然后,撤销原始的 %@root 用户的权限,以确保只有指定白名单中的 IP 地址能够访问数据库。
因此,在 MySQL 中创建新用户并设置仅限白名单 IP 地址访问数据库,然后删除默认的 %root 用户权限,是最安全和推荐的做法。

2、WITH GRANT OPTION 参数使用

WITH GRANT OPTION 是 MySQL 权限系统中的一种选项,它允许授予的用户将他们拥有的权限授予其他用户,即委派权限。具体而言,当你向用户授予权限时,可以选择是否包括 WITH GRANT OPTION,其含义如下:

授予权限:授予权限意味着该用户可以执行被授予的操作(例如 SELECT、INSERT、UPDATE 等)。
WITH GRANT OPTION:如果同时指定了 WITH GRANT OPTION,则被授予权限的用户除了可以执行这些操作外,还可以将相同的权限授予其他用户,即委派权限。

换句话说,具有 WITH GRANT OPTION 权限的用户可以再次使用 GRANT 命令将他们拥有的权限授予给其他用户,而不需要直接访问权限的所有者。这样的设置可以在需要委派权限给其他用户时非常有用。但同时也要注意,授予 WITH GRANT OPTION 权限可能增加安全风险,因为权限可能会被滥用或误用。
因此,在为用户分配权限时,应谨慎考虑是否使用 WITH GRANT OPTION,并确保了解委派权限可能带来的安全影响。

3、执行 REVOKE ALL PRIVILEGES ON . FROM ‘root’@‘%’;后,为什么查询user表依然包含此用户信息?

当使用 REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%'; 命令来撤销 root@% 用户的所有权限时,这只是取消了该用户对数据库的访问权限,并没有删除该用户的账户信息。因此,即使撤销了 root@% 的权限,仍然可以在 mysql.user 表中查询到该用户的记录。
要完全删除 root@% 用户的账户信息,可以使用以下步骤:

-- 使用 REVOKE 命令撤销 root@% 用户的所有权限:
REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%';
FLUSH PRIVILEGES;
--- 删除 root@% 用户的账户:
DROP USER 'root'@'%';

通过上述步骤,可以撤销 root@% 用户的所有权限,并从 mysql.user 表中删除该用户的账户信息。
请注意,删除 root@% 用户可能会影响到数据库的管理和维护,因此在执行此操作之前,请确保有其他具备管理员权限的用户账户。

4、部分细节参考

添加用户权限时如果用户权限不存在才添加;
删除用户权限时如果用户权限存在则删除;
不做添加删除判断,可能会执行报错。
数据连接相关信息存储在一个配置文件中test_config.sh;

test_config.sh文件参考

#!/bin/bash

export DBCMD=/usr/local/Test/database/bin/mysql
export DBUSER=root
export DBPWD=123456
export DBHOST=127.0.0.1
export DBPORT=3306
export WHITEIP=192.168.22.1

test_permission.sh文件参考

#!/bin/bash
pushd `dirname $0` >/dev/null 2>&1

. test_config.sh

# 检查白名单用户权限是否存在
existing_user=`$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -Ns -e "SELECT user FROM mysql.user WHERE user='root' AND host='${WHITEIP}'"`
if [ -z "$existing_user" ]; then
	# 如果用户权限不存在,则添加权限
	$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -e "create user 'root'@'${WHITEIP}' identified by '123456';grant all privileges on *.* to 'root'@'${WHITEIP}' identified by '123456' with GRANT OPTION;flush privileges;"
	# 记录时间、输出到日志文件
	echo `date "+%F %T"` "${WHITEIP} grant all privileges" >> ../test.log
else
	echo `date "+%F %T"` "${WHITEIP} is exist, no need to add" >> ../test.log
fi

# 检查root@%用户权限是否存在
existing_user=`$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h $DBHOST -Ns -e "SELECT user FROM mysql.user WHERE user='root' AND host='%'"`
if [ -z "$existing_user" ]; then
	echo `date "+%F %T"` "root@% is not exist, no need to del" >> ../test.log
else
	# 如果用户权限存在,则删除权限
	$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -e "REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'root'@'%';DROP USER 'root'@'%';flush privileges;"
	echo `date "+%F %T"` "root@% rmvoke all privileges" >> ../test.log
fi

popd >/dev/null 2>&1

相关推荐

  1. 使用Shell脚本进行MySql权限修改

    2024-03-29 21:56:01       24 阅读
  2. shell_结束进程脚本

    2024-03-29 21:56:01       13 阅读
  3. 学习使用shell脚本获取进程号并杀死进程

    2024-03-29 21:56:01       28 阅读
  4. shell脚本初始化mysql密码

    2024-03-29 21:56:01       27 阅读
  5. 列出使用挂载点的进程,并结束进程 shell脚本

    2024-03-29 21:56:01       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-29 21:56:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-29 21:56:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-29 21:56:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-29 21:56:01       20 阅读

热门阅读

  1. 我的创作纪念日

    2024-03-29 21:56:01       24 阅读
  2. Leetcode 1143:最长公共子序列

    2024-03-29 21:56:01       22 阅读
  3. SQL注入攻击与防御详细讲解

    2024-03-29 21:56:01       21 阅读
  4. 服务器硬件基础知识

    2024-03-29 21:56:01       21 阅读
  5. 牛客的一道题(C)序列中删除指定数字

    2024-03-29 21:56:01       22 阅读
  6. 数据关联_3.7

    2024-03-29 21:56:01       17 阅读
  7. 基于Python的高考志愿辅助填报系统

    2024-03-29 21:56:01       16 阅读
  8. Spring

    Spring

    2024-03-29 21:56:01      21 阅读