ホームページ >データベース >mysql チュートリアル >MySQL セキュリティ ガイド (3) (リダイレクト)
MySQL セキュリティ ガイド (3)
2.4
GRANT を使用しないユーザーのセットアップ
MySQL バージョン 3.22.11 より前の場合、GRANT (または REVOKE) ステートメントを使用してユーザーとそのアクセス権を設定することはできませんが、認可テーブルの内容を直接変更することはできます。 GRANT ステートメントが付与テーブルをどのように変更するかを理解していれば、これは簡単です。その後、INSERT ステートメントを手動で発行することで、同じことを自分で行うことができます。
GRANT ステートメントを発行するときは、ユーザー名とホスト名、場合によってはパスワードを指定します。このユーザーに対してユーザー テーブル レコードが生成され、これらの値が User、Host、および PassWord 列に記録されます。 GRANT ステートメントでグローバル権限を指定すると、これらの権限はレコードの [権限] 列に記録されます。 GRANT ステートメントではパスワードが暗号化されますが、INSERT ではパスワードを暗号化するために PASSWORD() 関数を使用する必要がないことに注意してください。
データベースレベルの権限を指定すると、ユーザー名とホスト名が db テーブルの User 列と Host 列に記録されます。承認したデータベースは [Db] 列に記録され、付与したアクセス許可は [Permissions] 列に記録されます。
テーブルレベルと列レベルの権限の場合、効果は同様です。 tables_PRiv テーブルと columns_priv テーブルにレコードを作成して、ユーザー名、ホスト名、データベース、および関連するテーブルと列を記録します。付与された権限は、「権限」列に記録されます。
前の紹介を覚えていれば、GRANT ステートメントなしで GRANT の動作を実行できるはずです。認可テーブルを直接変更する場合は、サーバーに認可テーブルをリロードするように指示することになります。そうしないと、サーバーは変更を認識できません。 mysqladminを実行できます
フラッシュ特権または mysqladmin
reload コマンドはリロードを強制します。これを忘れると、なぜサーバーが期待通りの動作をしないのか疑問に思うことになります。
次の GRANT ステートメントは、所有権を持つスーパーユーザーを作成します。他の人に委任する機能を含む:
GRANT
"passwd" によって識別された anyname@localhost に対して *.* をすべてオンにします
(許可付き)
OPTION
このステートメントは、user テーブルに anyname@localhost のレコードを作成し、すべての権限を開きます。これは、ここにスーパー ユーザー (グローバル) 権限が保存されるためです。INSERT ステートメントで同じことを行うには、ステートメントは次のようになります。
に挿入
ユーザー VALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y" ,"Y","Y","Y","Y","Y","Y")
MySQLのバージョンによっては動作しない場合があります。権限テーブルの構造が変更されたため、ユーザー テーブルに 14 個の権限列が存在しない可能性があります。ショーを使用する
COLUMNS 付与テーブルに含まれる各権限列を確認し、それに応じて INSERT ステートメントを調整します。 次の GRANT ステートメントでも、スーパーユーザー ステータスを持つユーザーが作成されますが、権限は 1 つだけです。
GRANT RELOAD ON *.* TO flash@localhost IDENTIFIED BY
"flushpass"
この例の INSERT ステートメントは前のステートメントよりも単純で、列名を簡単にリストし、権限列を 1 つだけ指定します。他のすべての列はデフォルトの「N」に設定されます。
ユーザーに挿入 (ホスト、パスワード、リロード)
VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
データベースレベルの権限には ON を使用します
認可のための ON *.* の代わりに db_name.* 句:
GRANT ALL ON サンプル.* TO boris@localhost
識別者
"ruby"
これらの権限はグローバルではないため、ユーザー テーブルに保存されません (ユーザーが接続できるように) が、db テーブル レコードも作成する必要があります。データベースセットの権限を記録するには、次のようにします。
ユーザーに挿入 (ホスト、ユーザー、パスワード)
VALUES("localhost","boris",PASSWORD("ruby"))
データベースに挿入
VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y", "Y")
"N" 列は、最後のデータベース レベルの WITH を伴う GRANT 権限を表します。
付与
OPTION の GRANT ステートメントの場合、列を "Y" に設定する必要があります。
テーブルレベルまたは列レベルの権限を設定するには、tables_priv または columns_priv で INSERT ステートメントを使用します。もちろん、GRANT ステートメントがない場合、これらのテーブルはすべて MySQL に同時に表示されるため、これらのテーブルは存在しません。これらのテーブルがあり、何らかの理由でそれらを手動で操作したい場合は、個々の列に対して権限を有効にできないことに注意してください。
tables_priv.Table_priv または columns_priv.Column_priv 列を設定して、有効にする権限の値を含めます。たとえば、テーブルに対する SELECT および INSERT 権限を有効にするには、関連する tables_priv レコードで Table_priv を「Select,Insert」に設定します。
MySQL アカウントを持つユーザーの権限を変更する場合は、権限を追加するか取り消すかに関係なく、INSERT ではなく UPDATE を使用してください。ユーザーを完全に削除するには、ユーザーが使用しているすべてのテーブルからレコードを削除します。
全権限テーブルを直接変更するクエリを発行したくない場合は、MySQL に付属の mysqlaccess スクリプトと mysql_setpermissions スクリプトを参照してください。
付録 1
クイズ
MySQL サーバーをインストールし、MySQL への接続を許可されたユーザーを追加した後、次のステートメントを使用します:
GRANT ALL ON
samp_db.* 宛先 fred@*.snake.net 識別されました
"cocoa"
そして、fred はたまたまサーバー ホストにアカウントを持っていたため、サーバーに接続しようとしました:
%mysql -u fred -pcocoa
samp_db
エラー 1045: ユーザーのアクセスが拒否されました: 'fred@localhost' (使用パスワード:
はい)
なぜですか?
その理由は次のとおりです。
まず、mysql_install_db が初期権限テーブルを確立する方法と、サーバーが顧客の接続を照合するためにユーザー テーブル レコードを使用する方法を検討します。 mysql_install_db でデータベースを初期化すると、次のようなユーザー テーブルが作成されます:
Host
ユーザー
localhost
pit.snake.net
localhost
pit.snake.net
root
root
最初の 2 つのレコードでは、root がローカル サーバーに接続するための localhost またはホスト名を指定でき、最後の 2 つのレコードでは、匿名ユーザーがローカルから接続できるようになります。 fred ユーザーを追加した後、
ホスト
ユーザー
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net
ルート
ルート
フレッド
サーバーが起動すると、レコードを読み取って並べ替えます (最初はホストごと、次にホスト上のユーザーごと)。具体的であるほど上位にランクされます:
ホスト ユーザー
ローカルホスト
ローカルホスト
pit.snake.net
pit.snake.net
%.snake.net
ルート
ルート
フレッド
localhost のレコードは 2 つ一緒にランク付けされていますが、root のレコードは null よりも具体的であるため、最初にランク付けされています。 pig.snake.net の記録も同様です。これらはすべて、ワイルドカードを含まないリテラルのホスト値であるため、fred のレコードの前、特に匿名ユーザーは fred の前にランク付けされます。
その結果、fred が localhost から接続しようとすると、[Host] 列に空のユーザー名を持つレコードが、%.snake.net を含むレコードの前に一致します。デフォルトの匿名ユーザーにはパスワードがないため、このレコードのパスワードは空です。 fred が接続時にパスワードを指定したため、不一致が発生し、接続に失敗しました。
ここで覚えておくべきことは、ユーザーが接続できるホストを指定するにはワイルドカードを使用すると便利ですが、ということです。ただし、テーブルに匿名ユーザー レコードを保持している限り、localhost からの接続に問題が発生します。
一般に、匿名ユーザー レコードを削除することをお勧めします。
mysql>
ユーザーの場所から削除
User="";
さらに進んで、他の認可テーブルにある匿名ユーザーを削除します。User 列を持つテーブルは db、tables_priv、columns_priv です。
付録 2
新しい MySQL インストールをより安全にする
新しい MySQL サーバーを自分でインストールした後、MySQL root ユーザーのディレクトリを指定する必要があります (デフォルトではパスワードなし)。これを忘れると、MySQL が非常に危険な状態で失われます。 (少なくともしばらくの間は)。
Unix (linux) では、マニュアルの指示に従って MySQL をインストールした後、mysql_install_db スクリプトを実行して、認可テーブルと初期権限を含む mysql データベースを確立する必要があります。 Windows では、ディストリビューション内のセットアップ プログラムを実行して、データ ディレクトリと mysql データベースを初期化します。サーバーも稼働していると想定されます。
初めて MySQL をマシンにインストールすると、mysql データベース内の認証テーブルが次のように初期化されます:
パスワードを指定せずにローカルホスト (localhost) から root として接続できます。 root ユーザーはすべての権限 (管理者権限を含む) を持ち、何でもできます。 (ちなみに、MySQL のスーパーユーザーは Unix のスーパーユーザーと同じ名前であり、まったく関係ありません。)
匿名アクセスは、test という名前のデータベースおよび名前が test_ で始まるデータベースにローカルに接続できるユーザーに付与されます。匿名ユーザーはデータベースに対して何でも行うことができますが、管理権限はありません。
接続ユーザーがローカルホストのホスト名を使用するか実際のホスト名を使用するかに関係なく、ローカルホストから複数のサーバーへの接続が許可されます。例:
% mysql -h
localhost テスト
% mysql -h pig.snake.net
テスト
パスワードを指定せずに root として MySQL に接続しているという事実は、初期インストールが安全ではないことを意味するだけです。そのため、管理者として最初に行うべきことは、root パスワードを設定し、その後、パスワードに応じてパスワードを設定することです。パスワードの設定に使用するメソッドに加えて、サーバーにこの変更を認識させるために認可テーブルをリロードするように指示することもできます。 (サーバーが起動すると、テーブルがメモリに再ロードされるため、テーブルが変更されたことが認識されない可能性があります。)
MySQL の場合
バージョン 3.22 以降の場合、mysqladmin を使用してパスワードを設定できます:
% mysqladmin -u root パスワード
yourpassword
MySQL のどのバージョンでも、mysql プログラムを使用して、mysql データベース内のユーザー認証テーブルを直接変更できます:
%
mysql -u root mysql
mysql>UPDATE user SET
パスワード=PASSWORD("あなたのパスワード") WHERE
User="root";
古いバージョンの MySQL を使用している場合は、mysql と UPDATE を使用してください。
パスワードを設定した後、次のコマンドを実行して、サーバーに認証テーブルをリロードするように指示する必要があるかどうかを確認します:
%
mysqladmin -u root ステータス
サーバーがパスワードを指定せずに root として接続できる場合は、認可テーブルをリロードします:
%
mysqladmin -u root
reload
root パスワードを設定した後 (必要に応じて認証テーブルをリロードした後)、root としてサーバーに接続するときは必ずパスワードを指定する必要があります。
上記は MySQL セキュリティ ガイド (3) (再版) の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。