暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

揭秘一条select语句,在MySQL中权限访问控制内幕

落叶说Mysql数据库运维 2020-10-19
706

在MySQL数据库中,权限访问控制实际上有两大模块。
第一:用户管理模块
第二:用户访问动作控制模块,用户访问动作最常见就是DML,DDL


其中用户管理模块的作用,就是验证用户能否合法登录mysql数据库,而用户访问动作控制模块,则控制这合法用户能做动作。

其实这么说还是有些抽象,那来看看mysql数据库中关于权限访问控制的4张表。


    mysql.user
    mysql.db
    mysql.tables_priv
    mysql.columns_priv

    用户管理模块由mysql.user控制,用户访问动作控制模块由mysql.db,mysql.tables_priv,mysql.columns_priv三张表一起控制。

    其权限验证大概流程如下所示

    举一个select语句的例子

      select id,name
      from test.t4
      where status='delete'

      用户要执行这个select语句整个流程
      第一步:应用首先需要连接mysql数据库,连接时验证host,user,password,如果不满足,则连接被拒绝,例如:用户名不正确,密码不正确,host主机被限制在特殊网段(192.168.2.%),或者限制本地登录(localhost)


      第二步:验证global级别是否有select权限,即验证mysql.user表中的select权限,如果Select_priv为Y,则不做后续验证


        mysql>  select * from mysql.user where user='abc'\G;
        *************************** 1. row ***************************
        Host: %
        User: abc
        Select_priv: N
        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:
        x509_issuer:
        x509_subject:
        max_questions: 0
        max_updates: 0
        max_connections: 0
        max_user_connections: 0
        plugin: mysql_native_password
        authentication_string: *0D3CED9BEC10A777AEC23CCC353A8C08A633045E
        password_expired: N
        password_last_changed: 2020-09-01 00:52:37
        password_lifetime: NULL
        account_locked: N
        1 row in set (0.00 sec)

        第三步:验证db级别select权限,如果有,则后续不验证

          mysql> select * from mysql.db where user='abc'\G;
          *************************** 1. row ***************************
          Host: %
          Db: test
          User: abc
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
          Drop_priv: N
          Grant_priv: N
          References_priv: N
          Index_priv: N
          Alter_priv: N
          Create_tmp_table_priv: N
          Lock_tables_priv: N
          Create_view_priv: N
          Show_view_priv: N
          Create_routine_priv: N
          Alter_routine_priv: N
          Execute_priv: N
          Event_priv: N
          Trigger_priv: N
          1 row in set (0.00 sec)

          第四步:验证表级别权限,如果有,则后续不验证

            mysql> select * from mysql.tables_priv where user='abc'\G;
            *************************** 1. row ***************************
            Host: %
            Db: test
            User: abc
            Table_name: t4
            Grantor: root@localhost
            Timestamp: 0000-00-00 00:00:00
            Table_priv: Select
            Column_priv:
            1 row in set (0.00 sec)

            第五步:验证列级别权限,如果有,则后续不验证

              mysql> select * from columns_priv;
              +------+------+------+------------+-------------+---------------------+-------------+
              | Host | Db | User | Table_name | Column_name | Timestamp | Column_priv |
              +------+------+------+------------+-------------+---------------------+-------------+
              | % | test | abc | t4 | id | 0000-00-00 00:00:00 | Select |
              | % | test | abc | t4 | name | 0000-00-00 00:00:00 | Select |
              | % | test | abc | t4 | status | 0000-00-00 00:00:00 | Select |
              +------+------+------+------------+-------------+---------------------+-------------+
              3 rows in set (0.00 sec)

              如果以上都验证都通过,则拒接执行select语句,上述详细流程图如下所示

              这个mysql权限访问控制内幕,你get了吧。


              文章转载自落叶说Mysql数据库运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论