使用Shell脚本进行MySql权限修改的实现教程


    目录
  • 背景:
  • 问题
    • 1、能否直接通过将%@root替换成白名单中ip@root权限?
    • 2、WITH GRANT OPTION 参数使用
    • 3、执行 REVOKE ALL PRIVILEGES ON . FROM ‘root’@‘%’;后,为什么查询user表依然包含此用户信息?
    • 4、部分细节参考

    背景:
    原先数据配置文件中有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


    到此这篇关于使用Shell脚本进行MySql权限修改的实现教程的文章就介绍到这了,更多相关Shell脚本修改MySql权限内容请搜索电脑手机教程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持电脑手机教程网!