mysql|ユーザー管理
MySQL ユーザー管理
[Yanzi] http://clyan.hongnet.com/index.html
MySQL 管理者は、MySQL ユーザー アカウントの設定方法、サーバーに接続できるユーザー、接続元の指定方法を知っておく必要があります。 、接続後に何をするか。 MySQL 3.22.11 では、この作業を容易にするために 2 つのステートメントが導入され始めました。GRANT ステートメントは MySQL ユーザーを作成してその権限を指定し、REVOKE ステートメントは権限を削除します。 2 つのステートメントは MySQL データベースのフロントエンドとして機能し、これらのテーブルの内容を直接操作する代替手段を提供します。 CREATE ステートメントと REVOKE ステートメントは 4 つのテーブルに影響します: 認可テーブル
コンテンツ ユーザー サーバーに接続できるユーザーと、そのユーザーが持つグローバル権限 db データベース レベルの権限 tables_priv テーブル レベルの権限 columns_priv 列レベルの権限
5 番目の認可テーブル (ホスト) もあります, ただし、GRANT や REVOKE の影響を受けません。
GRANT ステートメントをユーザーに発行すると、ユーザー テーブルにそのユーザーのレコードが作成されます。ステートメントでグローバル権限 (管理権限またはすべてのデータベースに適用される権限) が指定されている場合、これらもユーザー テーブルに記録されます。データベース、テーブル、列レベルの権限を指定すると、それらはそれぞれ db、tables_priv、columns_priv テーブルに記録されます。
GRANT と REVOKE を使用することは、認可テーブルを直接変更するよりも簡単ですが、「MySQL セキュリティ ガイド」を読むことをお勧めします。これらのテーブルは非常に重要であり、管理者は、これらのテーブルが GRANT ステートメントと REVOKE ステートメントの機能レベルをどのように超えているかを理解する必要があります。
次の章では、MySQL ユーザー アカウントを設定して認証する方法を紹介します。権限を取り消し、権限テーブルからユーザーを削除する方法についても説明します。
MySQL ディストリビューションの一部である mysqlaccess スクリプトと mysql_setpermission スクリプトの使用を検討することもできます。これらは、ユーザー アカウントを設定するための GRANT ステートメントの代替手段を提供する Perl スクリプトです。 mysql_setpermission には DBI サポートがインストールされている必要があります。
1 ユーザーを作成し、認可します
GRANT ステートメントの構文は次のようになります:
GRANT <i>privileges</i> (<i>columns</i>) ON <i>what</i> TO <i>user</i> IDENTIFIED BY "<i>password</i>" WITH GRANT OPTION
ログイン後にコピー
このステートメントを使用するには、次のセクションに入力する必要があります:
ユーザーに付与される権限、次の表は、GRANT で利用できる権限を示しています。 ステートメントの権限指定子:
権限指定子 権限によって許可される操作 ALTER テーブルとインデックスの変更 CREATE データベースとテーブルの作成 DELETE テーブル内の既存のレコードの削除 DROP データベースとテーブルの破棄 (削除) INDEX インデックスの作成または破棄 INSERT テーブルに新しい行を挿入 REFERENCE 未使用 SELECT テーブル内のレコードを取得 UPDATE 既存のテーブル レコードを変更 FILE サーバー上のファイルの読み取りまたは書き込み PROCESS サーバーで実行されたスレッド情報の表示またはスレッドの強制終了 RELOAD 認可テーブルの再ロードまたは、ログ、ホスト キャッシュ、またはテーブル キャッシュをクリアします。 SHUTDOWN サーバーをシャットダウンします。 ALL ALL; ALL PRIVILEGES 同義語 USAGE 特別な「権限なし」権限
上の表は、権限指定子の最初のグループがデータベース、テーブル、列に適用され、2 番目のグループが権限を管理することを示しています。一般に、これらはユーザーがサーバーの操作に影響を与えることができるため、比較的厳密に許可されています。 3 番目の権限グループは特別で、ALL は「すべての権限」を意味し、UASGE は権限なし、つまりユーザーを作成するが権限を付与しないことを意味します。
権限が適用される列。これはオプションであり、列固有の権限のみを設定できます。コマンドに複数の列がある場合は、カンマで区切る必要があります。
許可申請のレベル。権限は、グローバル (すべてのデータベースとすべてのテーブルに適用)、データベース固有 (データベース内のすべてのテーブルに適用)、またはテーブル固有にすることができます。 columns 句を指定することで、権限を列固有に設定できます。
権限が付与されるユーザー。ユーザー名とホスト名で構成されます。 MySQL では、誰が接続できるかだけでなく、どこに接続できるかも指定します。これにより、同じ名前を持つ 2 人のユーザーが異なる場所から接続できるようになります。 MySQL では、これらを区別して、相互に独立して権限を付与できます。
MySQL のユーザー名は、サーバーに接続するときに指定するユーザー名です。この名前は、Unix ログイン名または Windows 名にリンクされている必要はありません。デフォルトでは、名前を明示的に指定しない場合、クライアント プログラムはログイン名を MySQL ユーザー名として使用します。これは単なる合意です。認可テーブル内の名前を「nobody」に変更し、nobody 接続を使用してスーパーユーザー権限を必要とする操作を実行できます。
ユーザーに与えられるパスワード。これはオプションです。新しいユーザーに IDENTIFIED BY 句を指定しない場合、ユーザーにはパスワードが割り当てられません (安全ではありません)。既存のユーザーの場合は、指定したパスワードが古いパスワードを置き換えます。パスワードを指定しない場合、古いパスワードは変更されません。IDENTIFIED BY を使用すると、パスワード文字列はパスワードの文字通りの意味を使用し、password() 関数を使用しないでください。パスワードを設定してください。
WITH GRANT OPTION 句はオプションです。これを含めると、ユーザーは GRANT ステートメントを介して他のユーザーに権限を付与できます。この句を使用すると、承認された機能を他のユーザーに付与できます。
認可テーブルのレコードでは、ユーザー名、パスワード、データベース名、テーブル名は大文字と小文字が区別されますが、ホスト名と列名は区別されません。
一般地,你可以通过询问几个简单的问题来识别GRANT语句的种类:
- 谁能连接,从那儿连接?
- 用户应该有什么级别的权限,他们适用于什么?
- 用户应该允许管理权限吗?
下面就讨论一些例子。
1.1 谁能连接,从那儿连接?
你可以允许一个用户从特定的或一系列主机连接。有一个极端,如果你知道降职从一个主机连接,你可以将权限局限于单个主机:
GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY "quartz"
ログイン後にコピー
(samp_db.*意思是“samp_db数据库的所有表)另一个极端是,你可能有一个经常旅行并需要能从世界各地的主机连接的用户max。在这种情况下,你可以允许他无论从哪里连接:
GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"
ログイン後にコピー
“%”字符起通配符作用,与LIKE模式匹配的含义相同。在上述语句中,它意味着“任何主机”。所以max和max@%等价。这是建立用户最简单的方法,但也是最不安全的。
取其中,你可以允许一个用户从一个受限的主机集合访问。例如,要允许mary从snake.net域的任何主机连接,用一个%.snake.net主机指定符:
GRANT ALL ON samp_db.* TO mary@.snake.net IDENTIFIED BY "quartz";
ログイン後にコピー
如果你喜欢,用户标识符的主机部分可以用IP地址而不是一个主机名来给定。你可以指定一个IP地址或一个包含模式字符的地址,而且,从MySQL 3.23,你还可以指定具有指出用于网络号的位数的网络掩码的IP号:
GRANT ALL ON samp_db.* TO boris@192.168.128.3 IDENTIFIED BY "ruby" GRANT ALL ON samp_db.* TO fred@192.168.128.% IDENTIFIED BY "quartz" GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIED BY "ruby"
ログイン後にコピー
第一个例子指出用户能从其连接的特定主机,第二个指定对于C类子网192.168.128的IP模式,而第三条语句中,192.168.128.0/17指定一个17位网络号并匹配具有192.168.128头17位的IP地址。
如果MySQL抱怨你指定的用户值,你可能需要使用引号(只将用户名和主机名部分分开加引号)。
GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"
ログイン後にコピー
1.2 用户应该有什么级别的权限和它们应该适用于什么?
你可以授权不同级别的权限,全局权限是最强大的,因为它们适用于任何数据库。要使ethel成为可做任何事情的超级用户,包括能授权给其它用户,发出下列语句:
GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION
ログイン後にコピー
ON子句中的*.*意味着“所有数据库、所有表”。从安全考虑,我们指定ethel只能从本地连接。限制一个超级用户可以连接的主机通常是明智的,因为它限制了试图破解口令的主机。
有些权限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理权限并且只能用"ON *.*"全局权限指定符授权。如果你愿意,你可以授权这些权限,而不授权数据库权限。例如,下列语句设置一个flush用户,他只能发出flush语句。这可能在你需要执行诸如清空日志等的管理脚本中会有用:
GRANT RELOAD ON *.* TO flushl@localhost IDENTIFIED BY "flushpass"
ログイン後にコピー
一般地,你想授权管理权限,吝啬点,因为拥有它们的用户可以影响你的服务器的操作。
数据库级权限适用于一个特定数据库中的所有表,它们可通过使用ON db_name.*子句授予:
GRANT ALL ON samp_db TO bill@racer.snake.net INDETIFIED BY "rock" GRANT SELECT ON samp_db TO ro_user@% INDETIFIED BY "rock"
ログイン後にコピー
第一条语句向bill授权samp_db数据库中所有表的权限,第二条创建一个严格限制访问的用户ro_user(只读用户),只能访问samp_db数据库中的所有表,但只有读取,即用户只能发出SELECT语句。
你可以列出一系列同时授予的各个权限。例如,如果你想让用户能读取并能修改现有数据库的内容,但不能创建新表或删除表,如下授予这些权限:
GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db TO bill@snake.net INDETIFIED BY "rock"
ログイン後にコピー
对于更精致的访问控制,你可以在各个表上授权,或甚至在表的每个列上。当你想向用户隐藏一个表的部分时,或你想让一个用户只能修改特定的列时,列特定权限非常有用。如:
GRANT SELECT ON samp_db.member TO bill@localhost INDETIFIED BY "rock"GRANT UPDATE (expiration) ON samp_db. member TO bill@localhost
ログイン後にコピー
第一条语句授予对整个member表的读权限并设置了一个口令,第二条语句增加了UPDATE权限,当只对expiration列。没必要再指定口令,因为第一条语句已经指定了。
如果你想对多个列授予权限,指定一个用逗号分开的列表。例如,对assistant用户增加member表的地址字段的UPDATE权限,使用如下语句,新权限将加到用户已有的权限中:
GRANT UPDATE (street,city,state,zip) ON samp_db TO assistant@localhost
通常,你不想授予任何比用户确实需要的权限宽的权限。然而,当你想让用户能创建一个临时表以保存中间结果,但你又不想让他们在一个包含他们不应修改内容的数据库中这样做时,发生了要授予在一个数据库上的相对宽松的权限。你可以通过建立一个分开的数据库(如tmp)并授予开数据库上的所有权限来进行。例如,如果你想让来自mars.net域中主机的任何用户使用tmp数据库,你可以发出这样的GRANT语句:
GRANT ALL ON tmp.* TO ""@mars.net
在你做完之后,用户可以创建并用tmp.
tbl_name形式引用tmp中的表(在用户指定符中的""创建一个匿名用户,任何用户均匹配空白用户名)。
1.3 用户应该被允许管理权限吗?
你可以允许一个数据库的拥有者通过授予数据库上的所有拥有者权限来控制数据库的访问,在授权时,指定WITH GRANT OPTION。例如:如果你想让alicia能从big.corp.com域的任何主机连接并具有sales数据库中所有表的管理员权限,你可以用如下GRANT语句:
GRANT ALL ON sales.* TO alicia@%.big.corp.com INDETIFIED BY "applejuice" WITH GRANT OPTION
在效果上WITH GRANT OPTION子句允许你把访问授权的权利授予另一个用户。要注意,拥有GRANT权限的两个用户可以彼此授权。如果你只给予了第一个用户SELECT权限,而另一个用户有GRANT加上SELECT权限,那么第二个用户可以是第一个用户更“强大”。
2 撤权并删除用户
要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句:
REVOKE
privileges (
columns) ON
what FROM
useruser部分必须匹配原来GRANT语句的你想撤权的用户的
user部分。
privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。
REVOKE语句只删除权限,而不删除用户。即使你撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。要完全删除一个用户,你必须用一条DELETE语句明确从user表中删除用户记录:
%mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name";mysql>FLUSH PRIVILEGES;
ログイン後にコピー
DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是。)