案例分享-删除MySQL的默认root用户

需求分析:

  1. root密码在多个地方出现过,比如分享的技术文档,邮件,截图.

  2. MySQL默认安装的管理员帐号名称root,众所周知.为了增强安全性,需要更换一个用户名称,例如换成superuser,或者有公司特色的.例如xxx_admin.

应对策略:
  1. 首先创建一个与root用户权限一样的用户.
    GRANT ALL PRIVILEGES ON *.* TO 'x_admin'@'127.0.0.1' IDENTIFIED BY 'xxxx';

  2. 删除默认的root用户.
    drop user root@'127.0.0.1';
    drop user root@'localhost';
    drop user root@'::1';

注意问题:
  1. 视图
    曾经用root帐号为DEFINER的视图,如果将root删除,将提示该视图无法使用,没有权限.所以要注意提前查看是否存在视图,存在的话,需要修改该视图的DEFINER属性.
    修改视图,是瞬间就能完成的操作,除非该视图被其他sql语句占用,处于锁定的状态.

    1. 查看视图

    2. select TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, DEFINER from information_schema.VIEWS;


    3. 修改视图(非root的暂不修改)

    4. ALTER DEFINER=`x_admin`@`127.0.0.1` SQL SECURITY DEFINER VIEW v_name AS...



  2. 存储过程/函数
    情况与视图类似

    1. 查看存储过程/视图

    2. select ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE,DEFINER from information_schema.ROUTINES;

    3. 或者

    4. select db,name,type,definer from mysql.proc;



    5. 修改存储例程,可直接修改mysql.proc

    6. update mysql.proc set definer='[email protected]'where db='db_name';

    7. 如果修改所有库

    8. update mysql.proc set definer='[email protected]';



  3. 用root用户连接MySQL的脚本
    此类问题比较好解决,可单独为脚本创建帐号用来执行脚本中指定的操作,该用户名可用script_,或者脚本名命名.权限够用就行,不要分配过多的权限.

  4. 方法:一个增加用户的脚本.(配合批量执行)


    1. #!/usr/bin/python

    2. #-*- coding: UTF-8 -*-

    3. # ########################################################################

    4. # This program

    5. # Version: 2.0.0 (2012-10-10)

    6. # Authors: [email protected]

    7. # History:

    8. # ########################################################################


    9. import os

    10. import socket

    11. import subprocess

    12. import sys

    13. import traceback

    14. from ConfigParser import ConfigParser


    15. class Finger(object):

    16.    'finger.py'


    17.    def __init__ (self):

    18.        print '---- %s, %s' % (socket.gethostname(), self.__doc__)


    19.    def load_config (self, file="finger.ini"):

    20.        if not os.path.exists(file):

    21.            print file,"is not exists, but is created, please fix it"

    22.            temp_ini = '''[conn_db]

    23. login_pwd =

    24. exec_sql =

    25. '''

    26.            open(file, 'w').write(temp_ini)

    27.            os.chmod(file, 0600)

    28.            sys.exit()

    29.        config = ConfigParser()

    30.        config.read(file)

    31.        if config.has_section('conn_db') is True:

    32.            if config.has_option('conn_db', 'login_pwd') is True:

    33.                login_pwd = config.get('conn_db', 'login_pwd')

    34.            if config.has_option('conn_db', 'exec_sql') is True:

    35.                exec_sql = config.get('conn_db', 'exec_sql')

    36.            return (login_pwd, exec_sql)


    37.    def grant_user(self, login_pwd, exec_sql):

    38.        if os.path.exists('/usr/local/bin/mysql'):

    39.            mysql = '/usr/local/bin/mysql'

    40.        elif os.path.exists('/usr/bin/mysql'):

    41.            mysql = '/usr/bin/mysql'

    42.        elif os.path.exists('/bin/mysql'):

    43.            mysql = '/bin/mysql'

    44.        else:

    45.            print "command not fount of mysql"

    46.            sys.exit()


    47.        user = 'xxxx'

    48.        conn_port = [3306,3307,3308,3309,3310]

    49.        for i in conn_port:

    50.            ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    51.            address = ('127.0.0.1', int(i))

    52.            status = ss.connect_ex(address)

    53.            ss.settimeout(3)

    54.            ss.close()

    55.            if status == 0:

    56.                conn_mysql  = '%s -u%s -p%s -h127.0.0.1 -P%d -N -s -e"%s"' % (mysql, user, login_pwd, i, exec_sql)

    57.                p = subprocess.call(conn_mysql, shell=True, stdout=open("/dev/null"))

    58.                if p == 0:

    59.                    print "---- checking port: %s is NORMAL" % i

    60.                else:

    61.                    print "---- checking prot: %s is ERROR" % i


    62. if __name__ == '__main__':

    63.    try:

    64.        process = Finger()

    65.        (login_pwd, exec_sql) = process.load_config()

    66.        process.grant_user(login_pwd, exec_sql)

    67.    except Exception, e:

    68.        print str(e)

    69.        traceback.print_exc()

    70.        sys.exit()



你可能感兴趣的:(案例分享-删除MySQL的默认root用户)