Mysqlがデータベースに接続するときのホストとユーザーのマッチングルールについての簡単な説明

Mysqlがデータベースに接続するときのホストとユーザーのマッチングルールについての簡単な説明

--データベースに接続するとき、ホストとユーザーのマッチングルール

公式ドキュメント: https://dev.mysql.com/doc/refman/5.7/en/connection-access.html

--ホストとユーザーの一致ルールは次のとおりです。

--ホストが明確な場合は、最初に一致します。ホストが % で曖昧な場合は、最後に一致します。ただし、ホストが '' (空) の場合は、% の後に一致します。

--ホストが同じ場合、明確な名前を持つユーザーが最初に一致し、'' (空) を持つユーザーが最後に一致します。

--ホストとユーザーが同じ場合、ソートは不確実です

複数の一致が考えられる場合、サーバーはどれを使用するかを決定する必要があります。この問題は次のように解決されます。 
サーバーはユーザー テーブルをメモリに読み込むたびに、行をソートします。 
クライアントが接続を試みると、サーバーはソートされた順序で行を検索します。 
サーバーは、クライアントのホスト名とユーザー名に一致する最初の行を使用します。 
サーバーは、最も具体的な Host 値を持つ行を最初に並べる並べ替えルールを使用します。リテラルのホスト名と IP アドレスが最も具体的です。(リテラル IP アドレスの具体性は、ネットマスクがあるかどうかによって影響されないため、198.51.100.13 と 198.51.100.0/255.255.255.0 は、同様に具体性が高いと見なされます。) パターン '%' は「任意のホスト」を意味し、具体性が最も低いです。空の文字列 '' も「任意のホスト」を意味しますが、'%' の後に並べ替えられます。同じ Host 値を持つ行は、最も具体的な User 値が最初に並べられます (空の User 値は「任意のユーザー」を意味し、具体性が最も低いです)。同様に具体性の高い Host 値と User 値を持つ行の場合、順序は非決定的です。

--現在のホストとユーザー情報のマッチング順序を確認します。最初にホスト順序のマッチング、次にユーザー順序のマッチングを行います。

mysql> SELECT authentication_string、host、user、account_locked FROM mysql.USER ORDER BY host desc 、user desc;
+------------------------------------------+--------------+--------------+--------------+-----------------
| 認証文字列 | ホスト | ユーザー | アカウントロック |
+------------------------------------------+--------------+--------------+--------------+-----------------
| *511C0A408C5065XXEC90D60YYA1AB9437281AF28 | ローカルホスト | ルート | N |
| *THISISNOTAVALIXXASSWORDYYATCANBEUSEDHERE | localhost | mysql.sys | Y |
| *THISISNOTAVALIXXASSWORDYYATCANBEUSEDHERE | localhost | mysql.session | Y |
| *485CE31BA547A4XXC047659YY10DF200F361CD4E | ローカルホスト | bkpuser | N |
| *7B502777D8FF69XX4B56BC2YY2867F4B47321BA8 | 192.168.56.% | 再現 | N |
| *AECCE73463829AXX3968838YYF6F85E43C3F169​​C | % | フライリモート | N |
| *566AC8467DAAAEXXE247AE7YY0A770E9B97D9FB0 | | フライローカル | N |
+------------------------------------------+--------------+--------------+--------------+----------------+
セット内の行数は 8 です (0.00 秒)
 

--特別な例を挙げてみましょう。

-- 次のように 2 つの特別なユーザーを作成します。1 つはユーザー名が '' (空)、もう 1 つはユーザー名とホストが両方とも '' (空) です。

mysql> 「Kong123$」で識別される ''@'localhost' ユーザーを作成します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒) 
mysql> 「doubleKong123$」で識別されるユーザー ''@'' を作成します。   
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

--現在のホストとユーザー情報のマッチング順序を確認します。最初にホスト順序のマッチング、次にユーザー順序のマッチングを行います。

mysql> SELECT authentication_string、host、user、account_locked FROM mysql.USER ORDER BY host desc 、user desc;
+------------------------------------------+--------------+--------------+--------------+----------------+
| 認証文字列 | ホスト | ユーザー | アカウントロック |
+------------------------------------------+--------------+--------------+--------------+-----------------
| *511C0VVV8C5065CBEC90D6TTTT1AB9437281AF28 | ローカルホスト | ルート | N |
| *THISIVVVTAVALIDPASSWORTTTTTCANBEUSEDHERE | localhost | mysql.sys | Y |
| *THISIVVVTAVALIDPASSWORTTTTTCANBEUSEDHERE | localhost | mysql.session | Y |
| *485CEVVVA547A48CC04765TTTT0DF200F361CD4E | ローカルホスト | bkpuser | N |
| *256D7VVV91F7363EBDADEFTTTTB74B2B318746FC | ローカルホスト | | N |
| *7B502VVVD8FF69164B56BCTTTT867F4B47321BA8 | 192.168.56.% | 再現 | N |
| *AECCEVVV63829A5F396883TTTT6F85E43C3F169​​C | % | フライリモート | N |
| *566ACVVV7DAAAE79E247AETTTTA770E9B97D9FB0 | | フライローカル | N |
| *AE162VVV68403D1D98A4C9TTTT50A508B8C56F3F | | | N |
+------------------------------------------+--------------+--------------+--------------+-----------------
セット内の行数は 9 です (0.00 秒)

--この方法では、flyremote ユーザーにローカルでログインするときにエラーが報告されます。これは、上記の順序では、flyremote ユーザーではなく、ホスト localhost とユーザー '' (空) のユーザーが最初に一致するためです (ユーザー '' (空) のユーザーは任意のユーザー名と一致する可能性があるため)。

[root@hostmysql-m mysql]# mysql -uflyremote -pFlyremote123$
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
エラー 1045 (28000): ユーザー 'flyremote'@'localhost' のアクセスが拒否されました (パスワード使用: YES)

--つまり、flyremoteユーザーにローカルでログインする場合、一致するホストをlocalhost、ユーザーを''(空)、パスワードをKong123$として正常にログインできます。

[root@hostmysql-m mysql]# mysql -uflyremote -pKong123$
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは15です
サーバーバージョン: 5.7.23-log MySQL コミュニティサーバー (GPL) 
Copyright (c) 2000, 2018, Oracle およびその関連会社。無断複写・転載を禁じます。 
OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。 
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。

--現在のユーザー接続方法と現在のユーザー認証方法を表示します

mysql> ユーザー()、CURRENT_USER() を選択します。
+---------------------+----------------+
| ユーザー() | CURRENT_USER() |
+---------------------+----------------+
| flyremote@localhost | @localhost |
+---------------------+----------------+
セット内の1行(0.06秒)

--IPをインポートしてflyremoteユーザーにログインする場合、IPが%と一致し、ユーザーがflyremoteと一致すると問題はありません。

[root@hostmysql-m mysql]# mysql -uflyremote -pFlyremote123$ -h127.11.22.33 
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは12です
サーバーバージョン: 5.7.23-log MySQL コミュニティサーバー (GPL) 
Copyright (c) 2000, 2018, Oracle およびその関連会社。無断複写・転載を禁じます。 
OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。 
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。 
マイSQL>

--現在のユーザー接続方法と現在のユーザー認証方法を表示します

mysql> ユーザー()、CURRENT_USER() を選択します。
+------------------------+----------------+
| ユーザー() | CURRENT_USER() |
+------------------------+----------------+
| [email protected] | flyremote@% |
+------------------------+----------------+
セット内の 1 行 (0.00 秒)

--任意のユーザー、任意のホスト、パスワードが作成された2番目の空のユーザーと空のホスト「doubleKong123$」のパスワードと一致している限り、mysqlに入力できます。

--存在しないユーザーをテストするハハハ

[root@hostmysql-m ~]# mysql -uhahaha -pdoubleKong123$ -h127.11.22.33
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
MySQL モニターへようこそ。コマンドは ; または \g で終わります。
MySQL接続IDは6です
サーバーバージョン: 5.7.23-log MySQL コミュニティサーバー (GPL) 
Copyright (c) 2000, 2018, Oracle およびその関連会社。無断複写・転載を禁じます。 
OracleはOracle Corporationおよびその関連会社の登録商標です。
その他の名称は各社の商標である場合があります。
所有者。 
ヘルプを表示するには、「help;」または「\h」と入力します。現在の入力ステートメントをクリアするには、「\c」と入力します。 
マイSQL>

--現在のユーザー接続方法と現在のユーザー認証方法を表示します

mysql> ユーザー()、CURRENT_USER() を選択します。
+---------------------+----------------+
| ユーザー() | CURRENT_USER() |
+---------------------+----------------+
| ハハハ@127.11.22.33 | @ |
+---------------------+----------------+
セット内の1行(0.01秒)

- 解決:

1. セキュリティを確保するために、空のユーザーと空のホストユーザーを手動で削除します。

または

2. セキュリティ設定にはmysql_secure_installationを使用する

--セキュリティ構成は以下のとおりです。匿名ユーザーの削除操作も含まれます

このプログラムを使用すると、次の方法で MySQL インストールのセキュリティを強化できます。
 ルートアカウントのパスワードを設定できます。
 ローカル ホストの外部からアクセス可能なルート アカウントを削除できます。
 匿名ユーザー アカウントを削除できます。
 テスト データベース (デフォルトでは匿名ユーザーも含めすべてのユーザーがアクセスできます) と、名前が test_ で始まるデータベースに誰でもアクセスできるようにする権限を削除できます。

-- 次のようにして、匿名ユーザーのソース コード mysql_secure_installation.cc を削除します。

 //匿名ユーザーを削除する
 匿名ユーザーを削除します。 
/**
 セキュリティを強化するために、すべての匿名ユーザーを削除します。
*/
void 匿名ユーザーを削除します。
{
 応答の整数;
 reply = get_response((const char *) "デフォルトでは、MySQL インストールには "
      「匿名ユーザー、\n誰でもログインできます」
      「ユーザーなしでMySQLに\na」
      「彼らのためにアカウントが作成されました。これは意図されたものです」
      「テストのためだけに、そして「
      「インストールが少しスムーズになります。\nそうすべきです」
      "本番環境に移行する前に削除してください\n"
      "環境\n\n匿名ユーザーを削除しますか? "
      "(はいの場合は y|Y を、いいえの場合は他のキーを押してください): ", 'y');
 
 if (返信 == (int) 'y' || 返信 == (int) 'Y')
 {
 const char *クエリ;
 クエリ = "USER、HOST FROM mysql.user WHERE USER = ''";
 if (!execute_query(&query, strlen(query)))
  DBUG_PRINT("info", ("クエリ成功!"));
 MYSQL_RES *結果 = mysql_store_result(&mysql);
 (結果)の場合
  drop_users(結果);
 mysql_free_result(結果);
 fprintf(stdout, "成功。\n\n");
 }
 それ以外
 fprintf(stdout, "\n ... スキップします。\n\n");
}

補足: MySQL ユーザーテーブル内の複数のホストのマッチングルール

MySQL データベースのユーザー テーブルのホスト フィールドは、データベースにアクセスするためのユーザーの「権限」を制御するために使用されます。

すべてのネットワーク セグメントを示すには、「%」を使用できます。

特定の IP アドレスを使用することもできます。その場合、その IP アドレスを持つクライアントだけが MySQL サーバーにログインできるようになります。

あいまい一致に「_」を使用することもできます。これは、特定のネットワーク セグメント内のクライアントが MySQL サーバーにログインできることを示します。

ユーザー テーブルに、ユーザーに対して異なるホスト値を持つ 2 つのレコードがある場合、MySQL サーバーはどのようにしてユーザーの権限を一致させるのでしょうか?

mysql が使用する戦略は、サーバーがユーザー テーブルを読み取るときに、最初に最も具体的なホスト値 (ホスト名と IP 番号が最も具体的) で並べ替えることです。同じホスト値を持つエントリは、最も具体的なユーザーと最初に一致します。

例:

以下に示すように、root ユーザーは 2 人いるので、localhost の root クライアントだけが mysql サーバーにログインできます。

| ルート | ローカルホスト | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| ルート | % | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • Mysql接続数の設定と取得方法
  • PHP を MySQL データベースに接続する 3 つの方法
  • Navicat Premiumを使用してMySQLデータベースにリモート接続する方法
  • IDEA を使用して Tomcat を設定し、MySQL データベース (JDBC) に接続するための詳細な手順
  • DBeaver を MySQL バージョン 8 以降に接続し、起こりうる問題を解決する方法の詳細な説明
  • docker で mysql に接続できない場合の解決策
  • NavicatでMySQLにリモート接続する際のエラー10038の問題を解決する
  • MySQL データベースへの接続、読み取り、書き込みのための PHP 共通コード
  • MySQLへのリモート接続認証方法の詳しい説明
  • C# で MySql データベースに接続する方法
  • MySQLの不合理なMaxIdleConnsにより接続が短くなる

<<:  HTML テーブル マークアップ チュートリアル (29): セルのライト境界線の色属性 BORDERCOLORLIGHT

>>:  Docker のタイムゾーンの問題とデータ移行の問題

推薦する

Linux サーバーのステータスとパフォーマンスに関連するコマンドの詳細な説明

サーバーステータス分析Linux サーバーの CPU の詳細を表示する#CPU情報を表示[root@...

Nginx の動的および静的分離実装ケースのコード分析

静的と動的の分離動的リクエストと静的リクエストはミドルウェアを通じて分離され、不要なリクエストの消費...

CSS3 で Taobao に空白スペースを実装する方法

Taobao用の空白スペースを作成します。 ブラウザページを縮小すると、コンテンツ領域は縮小されませ...

ReactにおけるuseRefの具体的な使い方

React の経験がある人なら、コンポーネントインスタンスオブジェクトや DOM オブジェクトを取得...

Linux で rsync を使用する方法

目次1. はじめに2. インストール3. 基本的な使い方3.1、-rパラメータ3.2、-aパラメータ...

Nginxドメイン名転送の実装

Nginx の紹介Nginx (「エンジン x」) は、ロシアのプログラマー Igor Sysoev...

Vue ドラッグ アンド ドロップのシンプルな実装

この記事では、主に次のような Vue ドラッグ アンド ドロップの簡単な実装を紹介します。レンダリン...

XHTMLコードの一般的なアプリケーション問題をまとめる

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

目次1. はじめに:この場合、通常は 2 つのアプローチがあります。 2. CancelToken ...

React と Threejs を使用して VR パノラマ プロジェクトを作成する詳細なプロセス

最近、 Three.jsでReactを使用して、720 度のパノラマ写真を閲覧できるプロジェクトを構...

ミニプログラムは、カスタムのマルチレベル単一選択と複数選択を実装します

この記事では、参考のために、ミニプログラムでカスタムのマルチレベル単一選択および複数選択機能を実装す...

HTML で JavaScript の全選択/全選択解除操作を実行するサンプル コード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <m...

MySQL 結合クエリの原則の知識ポイント

MySQL 結合クエリ1. 基本概念2 つのテーブルの各行をペアで水平に接続して、すべての行の結果を...

Vue カードスタイルのクリックして切り替える画像コンポーネントの使用方法の詳細な説明

この記事では、vueカードスタイルのクリックして切り替える画像コンポーネントを参考までに紹介します。...