>  기사  >  데이터 베이스  >  MySQL은 권한 관리를 어떻게 수행합니까?

MySQL은 권한 관리를 어떻게 수행합니까?

青灯夜游
青灯夜游앞으로
2019-02-26 11:00:234147검색

이 글의 내용은 MySQL이 권한 관리를 어떻게 수행하는지 소개하는 것인가요? 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

MySQL의 권한 테이블은 데이터베이스가 시작될 때 메모리에 로드됩니다. 사용자가 신원 인증을 통과하면 메모리에서 해당 권한에 액세스할 수 있습니다. 데이터베이스 권한 범위 내의 다양한 작업. [동영상 튜토리얼 추천 : MySQL tutorial]

1. 권한 테이블 접근

권한 접근의 두 가지 과정에서 시스템은 "mysql" 데이터베이스(MySQL 설치 시 생성됨, 데이터베이스 이름은 "mysql")에 있는 사용자, 호스트, db의 가장 중요한 세 가지 권한 테이블이 사용됩니다.

이 3개의 테이블 중 가장 중요한 테이블은 user 테이블이고, 그 다음이 db 테이블입니다. 대부분의 경우 호스트 테이블은 사용되지 않습니다.

user의 열은 크게 사용자 열, 권한 열, 보안 열, 리소스 제어 열의 4부분으로 나뉩니다.

보통 가장 일반적으로 사용되는 열은 사용자 열과 권한 열이며, 그 중 권한 열은 일반 권한과 관리 권한으로 구분됩니다. select_privsuper_priv 등과 같은 데이터베이스 작업에는 일반 권한이 사용됩니다.

사용자가 접속할 때 권한 테이블의 접근 과정은 다음 두 가지 과정으로 진행됩니다.

  • 먼저, user 테이블, 사용자 및 비밀번호의 세 필드는 연결된 IP, 사용자 이름 및 비밀번호가 테이블에 존재하는지 여부를 결정합니다. 존재하면 인증이 통과되고, 그렇지 않으면 연결이 거부됩니다.

  • 신원 인증을 통과하면 다음 권한 테이블의 순서로 데이터베이스 권한을 얻습니다. user -> columns_priv.

이러한 권한 표에서는 권한 범위가 순서대로 줄어들고 전역 권한에는 로컬 권한이 포함됩니다. 위의 첫 번째 단계는 이해하기 쉽도록 두 번째 단계를 예를 들어 자세히 설명하겠습니다.
테스트를 용이하게 하려면 sql_mode

// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

1 변수를 수정해야 합니다. zj@localhost 사용자를 만들고 모든 테이블에 선택 권한을 부여해야 합니다. Databases#🎜 🎜#
MySQL [mysql]> grant select on *.* to zj@localhost;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

MySQL [mysql]> select * from user where user="zj" and host='localhost' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
...

2. db 테이블을 확인합니다

MySQL [mysql]> select * from db where user='zj' \G ;
Empty set (0.00 sec)

user 테이블의 select_priv 열이 "Y"인데 db 테이블에 레코드가 없는 것을 확인할 수 있습니다. 즉, 모든 데이터베이스에 대해 동일한 권한을 가진 사용자는 db 테이블에 기록할 필요가 없으며 사용자 테이블의 select_priv를 "Y"로 변경하기만 하면 됩니다. 즉, 사용자 테이블의 모든 권한은 모든 데이터베이스에 대한 권한을 나타냅니다.

3. zj@localhost에 대한 권한을 변경하여 t2 데이터베이스의 모든 테이블에 대한 권한만 선택하세요.

MySQL [mysql]> revoke select on *.* from zj@localhost;
Query OK, 0 rows affected, 1 warning (0.02 sec)

MySQL [mysql]> grant select on t2.* to zj@localhost;
Query OK, 0 rows affected, 1 warning (0.04 sec)

MySQL [mysql]> select * from user where user='zj' \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
...

MySQL [mysql]> select * from db where user='zj' \G;
*************************** 1. row ***************************
                 Host: localhost
                   Db: t2
                 User: zj
          Select_priv: Y
          Insert_priv: N
          Update_priv: N
          Delete_priv: N
          Create_priv: N
            Drop_priv: N
           Grant_priv: N

이때, user 테이블의 select_priv가 "N"으로 변경되었고, db 테이블에 db t2라는 레코드가 추가된 것이 발견되었습니다. 즉, 특정 권한이 데이터베이스의 일부에만 부여된 경우 사용자 테이블의 해당 권한 열은 "N"으로 유지되고 특정 데이터베이스 권한이 db 테이블에 기록됩니다. 테이블과 열의 권한 메커니즘은 db의 권한 메커니즘과 유사합니다.

위의 예에서 볼 수 있듯이 사용자가 권한 인증을 통과하고 권한이 할당되면 user -> tables_priv -> 즉, 첫 번째 전역 권한 테이블 사용자를 확인합니다. 사용자의 해당 권한이 "Y"이면 모든 데이터베이스에 대한 이 사용자의 권한은 "Y"이고, "이면 db, tables_priv 및 columns_priv가 더 이상 확인되지 않습니다. N", db 테이블로 이동 이 사용자에 해당하는 특정 데이터베이스를 확인하고 db에서 "Y"로 권한을 얻습니다. db에서 해당 권한이 "N"인 경우 tables_priv 및 columns_priv에서 차례로 권한을 확인합니다. 모두 "N"이면 허가가 없다고 판단됩니다.

2. 계정 관리

에는 주로 계정 생성, 권한 변경, 계정 삭제가 포함됩니다.

1 계정을 만듭니다.

승인 구문을 사용하여 만듭니다. 예:

(1) 모든 사용자에 대한 실행 권한이 있는 사용자 zj를 만듭니다. 데이터베이스 모든 권한은 로컬에서만 연결할 수 있습니다.
MySQL [mysql]> grant all privileges on *.* to zj@localhost;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
user 테이블에서 grant_priv 권한을 제외한 모든 권한이 "Y"인 것을 확인할 수 있습니다.

(2) (1)에 따라 zj에 대한 부여 권한을 높입니다
MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
...
(3) (2)에 따라 비밀번호를 "123"으로 설정합니다# 🎜 🎜#
MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ;
*************************** 1. row ***************************
                  Host: localhost
                  User: zj
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
......  
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:29:42
     password_lifetime: NULL
비밀번호는 암호화된 문자열 묶음으로 되어 있는 것을 확인할 수 있습니다.

(4) 모든 IP에서 연결할 수 있는 새 사용자 zj2를 생성합니다. 권한은 t2 데이터베이스의 모든 테이블에 대한 작업을 선택, 업데이트, 삽입 및 삭제하는 것입니다. 초기 비밀번호는 "123입니다. "#🎜🎜 #

MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [mysql]> select * from user where user='zj2' and host="%" \G;
*************************** 1. row ***************************
                  Host: %
                  User: zj2
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
......
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
      password_expired: N
 password_last_changed: 2017-09-25 20:37:49
     password_lifetime: NULL

MySQL [mysql]> select * from db where user="zj2" and host='%' \G;
*************************** 1. row ***************************
                 Host: %
                   Db: t2
                 User: zj2
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
......
user 테이블의 권한은 모두 "N"이고, db 테이블에 추가된 레코드의 권한은 모두 "Y"입니다. 일반적으로 과도한 권한을 부여하지 않고 사용자에게 적절한 권한만 부여하세요.
이 예제의 IP는 연결할 수 있는 모든 IP로 제한되어 있으므로 "*"로 설정되어 있습니다. mysql 데이터베이스는 user 테이블의 호스트 필드를 통해 제어됩니다. 과제 유형.

Host 값은 호스트 이름이나 IP 번호일 수 있으며, "localhost"는 로컬 호스트를 나타냅니다.
  • 호스트 열 값
  • Host에 와일드카드 문자 "%" 및 "_"를 사용할 수 있습니다. value" %"는 모든 호스트 이름과 일치합니다. 빈 호스트 값은 "%"와 동일합니다. 해당 의미는 like 연산자의 패턴 일치 작업과 동일합니다.

注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

(5) 授予 super、process、file 权限给用户 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
Query OK, 0 rows affected, 1 warning (0.00 sec)

因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(6) 只授予登录权限给 zj4@localhost
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

MySQL [mysql]> exit
Bye

zj@bogon:~$ mysql -uzj4 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78
Server version: 5.7.18-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.02 sec)

usage 权限只能用于数据库登录,不能执行任何操作

2. 查看账号权限

账号创建好后,可以通过如下命令查看权限:

show grants for user@host;

示例:

MySQL [(none)]> show grants for zj@localhost;
+-------------------------------------------------------------------+
| Grants for zj@localhost                                           |
+-------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------+
1 row in set (0.01 sec)

3. 更改账号权限

可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

示例:
(1) zj4@localhost 目前只有登录权限
MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)
(2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+------------------------------------------+
| Grants for zj4@localhost                 |
+------------------------------------------+
| GRANT SELECT ON *.* TO 'zj4'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)
(3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
MySQL [(none)]> show grants for 'zj4'@'localhost';
+--------------------------------------------------+
| Grants for zj4@localhost                         |
+--------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)

revoke 语句可以回收已经赋予的权限,对于上面的例子,这里决定要收回 zj4@localhost 上的 insert 和 select 权限:

MySQL [(none)]> revoke select,insert on *.* from zj4@localhost;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> show grants for zj4@localhost;
+-----------------------------------------+
| Grants for zj4@localhost                |
+-----------------------------------------+
| GRANT USAGE ON *.* TO 'zj4'@'localhost' |
+-----------------------------------------+
1 row in set (0.00 sec)

usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

4. 修改账号密码

(1) 可以用 mysqladmin 命令在命令行指定密码。
shell> mysqladmin -u user_name -h host_name password "123456"
(2) 执行 set password 语句。
mysql> set password for 'username'@'%' = password('pwd');

如果是更改自己的密码,可以省略 for 语句

mysql> set password=password('pwd');
(3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

5. 删除账号

要彻底的删除账号,可以使用 drop user :

drop user zj@localhost;

6. 账号资源限制

创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

  • max_queries_per_hour count : 单个账号每小时执行的查询次数

  • max_upodates_per_hour count : 单个账号每小时执行的更新次数

  • max_connections_per_hour count : 单个账号每小时连接服务器的次数

  • max_user_connections count : 单个账号并发连接服务器的次数







권한 제어

# 🎜🎜#


~                          -                                                                                                                                                                                                                                                                                                                                          

사용자가 신원 인증을 통과하면 MySQL의 권한 테이블이 메모리에 로드됩니다. 이러한 방식으로 사용자는 권한 내에서 작업을 수행할 수 있습니다. 다양한 작업을 수행합니다. 1. 권한 테이블에 대한 액세스 권한 액세스의 두 프로세스에서 시스템은 사용자, 호스트 및 db에서 "mysql" 데이터베이스(MySQL 설치 시 생성됨, 데이터베이스 이름은 "mysql")를 사용합니다. 가장 중요한 3개의 권한 테이블. 이 3개의 테이블 중 가장 중요한 것은 user 테이블이고, 그 다음이 db 테이블이며, 대부분의 경우 호스트 테이블은 사용되지 않습니다. 사용자 열은 주로 사용자 열, 권한 열, 보안 열, 리소스 제어 열의 4개 부분으로 나뉩니다. 등의 데이터베이스 작업에는 일반 권한이 사용됩니다.

사용자가 접속하면 권한 테이블의 접근 과정은 다음 두 가지 과정으로 진행됩니다.

먼저 사용자의 호스트, 사용자, 비밀번호 3개 필드에서 연결의 IP, 사용자 이름, 비밀번호를 결정합니다. table 테이블에 존재합니까? 그렇다면 인증하고, 그렇지 않으면 연결을 거부하십시오.

신원 인증이 통과되면 user -> db -> columns_priv 순서대로 데이터베이스 권한을 얻게 됩니다.

이 권한 표에서는 권한 범위가 순서대로 줄어들고 전역 권한이 로컬 권한을 포함합니다. 위의 첫 번째 단계는 이해하기 쉽도록 두 번째 단계를 예를 통해 자세히 설명하겠습니다.

select_privsuper_priv테스트를 용이하게 하려면 sql_mode

// sql_mode 默认值中有 NO_AUTO_CREATE_USER (防止GRANT自动创建新用户,除非还指定了密码)
SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
1 변수를 수정해야 합니다. 사용자 zj@localhost를 생성하고 모든 데이터베이스의 모든 테이블에 선택 권한을 부여하세요
    MySQL [mysql]> grant select on *.* to zj@localhost;
    Query OK, 0 rows affected, 2 warnings (0.00 sec)
    
    MySQL [mysql]> select * from user where user="zj" and host='localhost' \G;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: Y
               Insert_priv: N
               Update_priv: N
               Delete_priv: N
               Create_priv: N
                 Drop_priv: N
               Reload_priv: N
    ...
  • 2. db 테이블을 볼 수 있습니다

    MySQL [mysql]> select * from db where user='zj' \G ;
    Empty set (0.00 sec)
    user 테이블의 select_priv 컬럼이 "Y"인데 db 테이블에 기록이 없음을 확인합니다. 즉, 모든 데이터베이스에 대해 동일한 권한을 가진 사용자는 db 테이블에 기록될 필요가 없고, 사용자 테이블의 select_priv를 "Y"로 변경해야 합니다.” 그게 전부입니다. 즉, 사용자 테이블의 모든 권한은 모든 데이터베이스에 대한 권한을 나타냅니다.
  • 3. zj@localhost의 권한을 변경하여 t2 데이터베이스의 모든 테이블에 대한 권한만 선택하세요.

    MySQL [mysql]> revoke select on *.* from zj@localhost;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
    MySQL [mysql]> grant select on t2.* to zj@localhost;
    Query OK, 0 rows affected, 1 warning (0.04 sec)
    
    MySQL [mysql]> select * from user where user='zj' \G;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: N
               Insert_priv: N
               Update_priv: N
               Delete_priv: N
               Create_priv: N
                 Drop_priv: N
               Reload_priv: N
    ...
    
    MySQL [mysql]> select * from db where user='zj' \G;
    *************************** 1. row ***************************
                     Host: localhost
                       Db: t2
                     User: zj
              Select_priv: Y
              Insert_priv: N
              Update_priv: N
              Delete_priv: N
              Create_priv: N
                Drop_priv: N
               Grant_priv: N
    이때, user 테이블의 select_priv가 "N"으로 변경되었고, db 테이블에 db t2라는 레코드가 추가된 것이 발견되었습니다. 즉, 특정 권한이 데이터베이스의 일부에만 부여된 경우 사용자 테이블의 해당 권한 열은 "N"으로 유지되고 특정 데이터베이스 권한이 db 테이블에 기록됩니다. 테이블과 열의 권한 메커니즘은 db의 권한 메커니즘과 유사합니다.
  • 위의 예에서 볼 수 있듯이 사용자가 권한 인증을 통과하고 권한이 할당되면 user -> db -> tables_priv -> columns_priv 순서로 권한이 할당됩니다. 권한 테이블 사용자가 먼저 확인됩니다. 사용자의 해당 권한이 "Y"이면 모든 데이터베이스에 대한 이 사용자의 권한이 "Y"이고, "N"이면 db, tables_priv 및 columns_priv가 더 이상 확인되지 않습니다. 이 사용자에 해당하는 특정 권한은 db 테이블에서 확인되고, db의 해당 권한이 "N"이면 tables_priv 및 columns_priv에서 권한을 차례로 확인합니다. 모두 "N"이면 권한을 보유하지 않은 것으로 판단됩니다.


    2. 계정 관리 에는 주로 계정 생성, 권한 변경, 계정 삭제가 포함됩니다.

    1. 계정을 생성합니다

    grant 구문을 사용하여 생성합니다. 예:

    (1) 모든 데이터베이스에 대해 모든 권한을 실행할 수 있고 로컬에서만 연결할 수 있는 권한을 가진 사용자 zj를 생성합니다.

    MySQL [mysql]> grant all privileges on *.* to zj@localhost;
    Query OK, 0 rows affected, 2 warnings (0.00 sec)
    
    MySQL [mysql]> select * from user where user="zj" and host="localhost" \G;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: Y
               Insert_priv: Y
               Update_priv: Y
               Delete_priv: Y
               Create_priv: Y
                 Drop_priv: Y
               Reload_priv: Y
             Shutdown_priv: Y

    user 테이블에서 grant_priv 권한을 제외한 모든 권한이 "Y"인 것을 확인할 수 있습니다.

    (2) (1)을 기준으로 부여 권한을 zj

    MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    MySQL [mysql]> select * from user where user="zj" and host='localhost' \G ;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: Y
               Insert_priv: Y
               Update_priv: Y
               Delete_priv: Y
               Create_priv: Y
                 Drop_priv: Y
               Reload_priv: Y
             Shutdown_priv: Y
              Process_priv: Y
                 File_priv: Y
                Grant_priv: Y
    ...

    로 높인다(3) (2)를 기준으로 비밀번호를 "123"으로 설정

    MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    MySQL [mysql]> select * from user where user="zj" and host="localhost" \G ;
    *************************** 1. row ***************************
                      Host: localhost
                      User: zj
               Select_priv: Y
               Insert_priv: Y
               Update_priv: Y
               Delete_priv: Y
               Create_priv: Y
                 Drop_priv: Y
               Reload_priv: Y
    ......  
     authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
          password_expired: N
     password_last_changed: 2017-09-25 20:29:42
         password_lifetime: NULL

    비밀번호가 잔뜩 암호화된 것을 확인할 수 있다 그 이후의 문자열.

    (4) 创建新用户 zj2,可以从任何 IP 连接,权限为对 t2 数据库里的所有表进行 select 、update、insert 和 delete 操作,初始密码为“123”
    MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    MySQL [mysql]> select * from user where user='zj2' and host="%" \G;
    *************************** 1. row ***************************
                      Host: %
                      User: zj2
               Select_priv: N
               Insert_priv: N
               Update_priv: N
               Delete_priv: N
               Create_priv: N
                 Drop_priv: N
    ......
     authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257
          password_expired: N
     password_last_changed: 2017-09-25 20:37:49
         password_lifetime: NULL
    
    MySQL [mysql]> select * from db where user="zj2" and host='%' \G;
    *************************** 1. row ***************************
                     Host: %
                       Db: t2
                     User: zj2
              Select_priv: Y
              Insert_priv: Y
              Update_priv: Y
              Delete_priv: Y
              Create_priv: N
                Drop_priv: N
    ......

    user 表中的权限都是“N”,db 表中增加的记录权限则都是“Y”。一般的,只授予用户适当的权限,而不会授予过多的权限。

    本例中的 IP 限制为所有 IP 都可以连接,因此设置为 “*”,mysql 数据库中是通过 user 表的 host 字段来进行控制,host 可以是以下类型的赋值。

    • Host 值可以是主机名或IP号,或 “localhost” 指出本地主机。

    • 可以在 Host 列值使用通配符字符 “%” 和 “_”

    • Host 值 “%” 匹配任何主机名,空 Host 值等价于 “%”,它们的含义与 like 操作符的模式匹配操作相同。

    注意: mysql 数据库的 user 表中 host 的值为 “*” 或者空,表示所有外部 IP 都可以连接,但是不包括本地服务器 localhost,因此,如果要包括本地服务器,必须单独为 localhost 赋予权限。

    (5) 授予 super、process、file 权限给用户 zj3@%
    MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%';
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    因为这几个权限都是属于管理权限,因此不能够指定某个数据库,on 后面必须跟 “.”,下面语法将提示错误

    MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%';
    ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
    (6) 只授予登录权限给 zj4@localhost
    MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost';
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    MySQL [mysql]> exit
    Bye
    
    zj@bogon:~$ mysql -uzj4 -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 78
    Server version: 5.7.18-log Source distribution
    
    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    +--------------------+
    1 row in set (0.02 sec)

    usage 权限只能用于数据库登录,不能执行任何操作

    2. 查看账号权限

    账号创建好后,可以通过如下命令查看权限:

    show grants for user@host;

    示例:

    MySQL [(none)]> show grants for zj@localhost;
    +-------------------------------------------------------------------+
    | Grants for zj@localhost                                           |
    +-------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION |
    +-------------------------------------------------------------------+
    1 row in set (0.01 sec)

    3. 更改账号权限

    可以进行权限的新增和回收。和创建账号一样,权限变更也有两种方法:使用 grant(新增) 和 revoke (回收) 语句,或者更改权限表。

    示例:
    (1) zj4@localhost 目前只有登录权限
    MySQL [(none)]> show grants for zj4@localhost;
    +-----------------------------------------+
    | Grants for zj4@localhost                |
    +-----------------------------------------+
    | GRANT USAGE ON *.* TO 'zj4'@'localhost' |
    +-----------------------------------------+
    1 row in set (0.00 sec)
    (2) 赋予 zj4@localhost 所有数据库上的所有表的 select 权限
    MySQL [(none)]> grant select on *.* to 'zj4'@'localhost';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    MySQL [(none)]> show grants for zj4@localhost;
    +------------------------------------------+
    | Grants for zj4@localhost                 |
    +------------------------------------------+
    | GRANT SELECT ON *.* TO 'zj4'@'localhost' |
    +------------------------------------------+
    1 row in set (0.00 sec)
    (3) 继续给 zj4@localhost 赋予 select 和 insert 权限,和已有的 select 权限进行合并
    MySQL [(none)]> show grants for 'zj4'@'localhost';
    +--------------------------------------------------+
    | Grants for zj4@localhost                         |
    +--------------------------------------------------+
    | GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' |
    +--------------------------------------------------+
    1 row in set (0.00 sec)

    revoke 语句可以回收已经赋予的权限,对于上面的例子,这里决定要收回 zj4@localhost 上的 insert 和 select 权限:

    MySQL [(none)]> revoke select,insert on *.* from zj4@localhost;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    MySQL [(none)]> show grants for zj4@localhost;
    +-----------------------------------------+
    | Grants for zj4@localhost                |
    +-----------------------------------------+
    | GRANT USAGE ON *.* TO 'zj4'@'localhost' |
    +-----------------------------------------+
    1 row in set (0.00 sec)

    usage 权限不能被回收,也就是说,revoke 用户并不能删除用户。

    4. 修改账号密码

    (1) 可以用 mysqladmin 命令在命令行指定密码。
    shell> mysqladmin -u user_name -h host_name password "123456"
    (2) 执行 set password 语句。
    mysql> set password for 'username'@'%' = password('pwd');

    如果是更改自己的密码,可以省略 for 语句

    mysql> set password=password('pwd');
    (3) 可以在全局级别使用 grant usage 语句(在“.”)来指定某个账户的密码而不影响账户当前的权限。
    mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

    5. 删除账号

    要彻底的删除账号,可以使用 drop user :

    drop user zj@localhost;

    6. 账号资源限制

    创建 MySQL 账号时,还有一类选项称为账号资源限制,这类选项的作用是限制每个账号实际具有的资源限制,这里的“资源”主要包括:

    • max_queries_per_hour count : 单个账号每小时执行的查询次数

    • max_upodates_per_hour count : 单个账号每小时执行的更新次数

    • max_connections_per_hour count : 单个账号每小时连接服务器的次数

    • max_user_connections count : 单个账号并发连接服务器的次数


    • MySQL은 권한 관리를 어떻게 수행합니까?



    你可能感兴趣的



    评论                                                    

    默认排序                        时间排序



    载入中...

    显示更多评论



    위 내용은 MySQL은 권한 관리를 어떻게 수행합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제