mysql|ユーザー管理
MySQL 管理者は、どのユーザーがサーバーに接続できるか、どこから接続するか、接続後に何ができるかを示す、MySQL ユーザー アカウントのセットアップ方法を知っておく必要があります。 MySQL 3.22.11 では、この作業を容易にするために 2 つのステートメントが導入され始めました。GRANT ステートメントは MySQL ユーザーを作成してその権限を指定し、REVOKE ステートメントは権限を削除します。 2 つのステートメントは MySQL データベースのフロントエンドとして機能し、これらのテーブルの内容を直接操作する代替手段を提供します。 CREATE ステートメントと REVOKE ステートメントは、次の 4 つのテーブルに影響します。 認可テーブル
コンテンツ
user サーバーに接続できるユーザーと、そのユーザーが持つグローバル権限
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 権限 (列) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
このステートメントを使用するには、次のセクションに入力する必要があります:
権限
ユーザーに付与された権限。次の表に、GRANT ステートメントで使用できる権限指定子のリストを示します。
権限指定子
権限によって許可される操作
ALTER テーブルとインデックスを変更する
CREATE データベースとテーブルを作成する
DELETE テーブル内の既存のレコードを削除する
DROP データベースとテーブルをドロップ(削除)する
INDEX インデックスを作成または破棄する
INSERT 新規挿入テーブルに行を追加
REFERENCE 使用されません
SELECT テーブル内のレコードを取得します
UPDATE 既存のテーブルレコードを変更します
FILE サーバー上のファイルを読み書きします
PROCESS サーバーで実行されたスレッド情報を表示します
kill スレッド
RELOAD 認可テーブルをリロードするか、ログ、ホスト キャッシュ、またはテーブル キャッシュをクリアします。
SHUTDOWN サーバーをシャットダウンします
ALL すべて; ALL PRIVILEGES 同義語
USAGE 特別な「権限なし」権限
上の表は、最初のグループの権限指定子がデータベース、テーブル、列に適用されることを示しています。 2 番目のグループ番号管理権限。一般に、これらはユーザーがサーバーの操作に影響を与えることができるため、比較的厳密に許可されています。 3 番目の権限グループは特別で、ALL は「すべての権限」を意味し、UASGE は権限なし、つまりユーザーを作成するが権限を付与しないことを意味します。
columns
権限が適用される列。これはオプションであり、列固有の権限のみを設定できます。コマンドに複数の列がある場合は、カンマで区切る必要があります。
許可申請の
レベル。権限は、グローバル (すべてのデータベースとすべてのテーブルに適用)、データベース固有 (データベース内のすべてのテーブルに適用)、またはテーブル固有にすることができます。 columns 句を指定することで、権限を列固有に設定できます。
user
権限が付与されるユーザーは、ユーザー名とホスト名で構成されます。 MySQL では、誰が接続できるかだけでなく、どこに接続できるかも指定します。これにより、同じ名前を持つ 2 人のユーザーが異なる場所から接続できるようになります。 MySQL では、これらを区別して、相互に独立して権限を付与できます。
MySQL のユーザー名は、サーバーに接続するときに指定するユーザー名です。この名前は、Unix ログイン名または Windows 名にリンクされている必要はありません。デフォルトでは、名前を明示的に指定しない場合、クライアント プログラムはログイン名を MySQL ユーザー名として使用します。これは単なる合意です。認可テーブル内の名前を「nobody」に変更し、nobody 接続を使用してスーパーユーザー権限を必要とする操作を実行できます。
パスワード🎜🎜🎜ユーザーに割り当てられたパスワード。これはオプションです。新しいユーザーに IDENTIFIED BY 句を指定しない場合、ユーザーにはパスワードが割り当てられません (安全ではありません)。既存のユーザーの場合は、指定したパスワードが古いパスワードを置き換えます。パスワードを指定しない場合、古いパスワードは変更されません。IDENTIFIED BY を使用すると、パスワード文字列はパスワードの文字通りの意味を使用し、password() 関数を使用しないでください。パスワードを設定してください。
WITH GRANT OPTION 句はオプションです。これを含めると、ユーザーは GRANT ステートメントを介して他のユーザーに権限を付与できます。この句を使用すると、承認された機能を他のユーザーに付与できます。
認可テーブルのレコードでは、ユーザー名、パスワード、データベース名、テーブル名は大文字と小文字が区別されますが、ホスト名と列名は区別されません。
一般に、いくつかの簡単な質問をすることで GRANT ステートメントのタイプを特定できます:
誰が、どこから接続できますか?
ユーザーはどのレベルの権限を持つ必要がありますか?また、それらは何に適用されますか?
ユーザーに管理者権限を許可する必要がありますか?
いくつかの例を以下で説明します。
1.1 誰がどこから接続できますか?
ユーザーが特定のホストまたは一定範囲のホストから接続することを許可できます。極端な例として、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 データベースのすべてのテーブル" を意味します) 逆の極端な場合、頻繁に旅行し、ホストから接続できる必要がある最大ユーザーがいる可能性がありますこの場合、彼がどこからでも接続できるようにすることができます:
GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"
"%" 文字はワイルドカードとして機能し、 LIKE パターンの意味 同じです。つまり、max と max@% は同じです。これはユーザーを設定する最も簡単な方法ですが、最も安全性が低くなります。たとえば、制限されたホストのセットからのユーザー アクセスを許可するには、snake.net ドメイン内の任意のホストからの接続を Mary に許可します。 %.snake.net ホスト指定子:
GRANT ALL ON samp_db。 * TO mary@.snake .net IDENTIFIED BY "quartz";
必要に応じて、ユーザー識別子のホスト部分をホスト名の代わりに 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"
最初の例は、からの特定のホストを示しています2 番目のステートメントはクラス C サブネット 192.168.128 の IP パターンを指定し、3 番目のステートメントでは 192.168.128.0/17 は 17 桁のネットワーク番号を指定し、IP アドレスをその最初の 17 ビットと照合します。 192.168.128。指定したユーザー値に関して MySQL がエラーを起こす場合は、引用符を使用する必要がある場合があります (ユーザー名とホスト名の部分を引用符で区切るだけです)。
samp_db.president のすべてを "my friends"@"boa.snake.net" に許可します
1.2 ユーザーはどのレベルの権限を持つ必要があり、何を適用する必要がありますか?
さまざまなレベルの権限を付与できます。グローバル権限は、あらゆるデータベースに適用されるため、最も強力です。 ethel を、他のユーザーに権限を付与するなど、何でもできるスーパーユーザーにするには、次のステートメントを発行します:
GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION
ON 句 The * .* は「すべてのデータベース、すべてのテーブル」を意味します。セキュリティ上の理由から、ethel はローカルでのみ接続できるように指定しています。スーパーユーザーが接続できるホストを制限することは、パスワードの解読を試みることができるホストを制限するため、多くの場合賢明です。
一部の権限 (FILE、PROCESS、RELOAD、SHUTDOWN) は管理権限であり、「ON *.*」グローバル権限指定子を使用してのみ承認できます。必要に応じて、データベース権限を付与せずにこれらの権限を付与することもできます。たとえば、次のステートメントは、flush ステートメントのみを発行できるフラッシュ ユーザーを設定します。これは、ログのクリアなどのタスクを実行する必要がある管理スクリプトで役立つ場合があります:
GRANT RELOAD ON *.* TO flashl@localhost IDENTIFIED BY "flushpass"
一般的に、管理者権限を付与したい場合は、ケチってください。 , それを所有しているユーザーがサーバーの動作に影響を与える可能性があるためです。
データベース レベルの権限は、特定のデータベース内のすべてのテーブルに適用され、ON db_name.* 句を使用して付与できます:
GRANT ALL ON samp_db TO bill@racer.snake.net INDETIFIED BY "rock" GRANT SELECT samp_db から ro_user@% まで「rock」で特定されました
最初のステートメントは、bill に samp_db データベース内のすべてのテーブルに対する権限を付与します。2 番目のステートメントは、samp_db データベース内のすべてのテーブルにアクセスできる、読み取り専用の、厳密に制限されたアクセス ユーザー ro_user (読み取り専用ユーザー) を作成します。つまり、ユーザーは 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
最初のステートメントは、メンバー テーブル全体に読み取り権限を付与し、パスワードが追加され、2 番目のステートメントは有効期限列にのみ UPDATE 権限を追加します。パスワードは最初のステートメントですでに指定されているため、指定する必要はありません。
複数の列に権限を付与する場合は、カンマ区切りのリストを指定します。たとえば、アシスタント ユーザーのメンバー テーブルのアドレス フィールドに 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 権限を持つ 2 人のユーザーが相互に認証できることに注意してください。最初のユーザーに SELECT 権限のみを与え、別のユーザーが GRANT と SELECT 権限を持っている場合、2 番目のユーザーは最初のユーザーよりも「強力」になる可能性があります。
2 権限を取り消してユーザーを削除する
ユーザーの権限を取り消すには、REVOKE ステートメントを使用します。 REVOKE の構文は GRANT ステートメントとよく似ていますが、TO が FROM に置き換えられ、INDETIFED BY および WITH GRANT OPTION 句がない点が異なります:
REVOKE 権限 (列) ON の内容 FROM ユーザー
user 部分は一致する必要があります元の GRANT ステートメントに必要なもの 取り消されたユーザーのユーザー部分。権限部分は一致する必要はありません。GRANT ステートメントを使用して許可し、REVOKE ステートメントを使用して権限の一部のみを取り消すことができます。
REVOKE ステートメントは権限のみを削除し、ユーザーは削除しません。すべての権限を取り消しても、ユーザー テーブル内のユーザー レコードは引き続き保持されます。つまり、ユーザーは引き続きサーバーに接続できます。ユーザーを完全に削除するには、DELETE ステートメントを使用してユーザー テーブルからユーザー レコードを明示的に削除する必要があります:
%mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name" ; mysql>FLUSH PRIVILEGES; DELETE ステートメントはユーザー レコードを削除し、FLUSH ステートメントはサーバーに認可テーブルを再ロードするように指示します。 (テーブルは GRANT および REVOKE ステートメントを使用すると自動的に再ロードされますが、許可テーブルを直接変更する場合は再ロードされません。)