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 のタイムゾーンの問題とデータ移行の問題

推薦する

MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します

デフォルトでは、MySQL は日付に 0 値を挿入することを受け入れますが、実際には日付の 0 値に...

CSS3 はドラッグ可能なルービックキューブの 3D 効果を実現します

主に使用される知識ポイント: •css3 3D変換 •ネイティブjsマウスドラッグイベント•表示:グ...

HTML マークアップ言語 - フォーム

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

フロントエンド Vue ユニットテストを始める

目次1. ユニットテストはなぜ必要なのでしょうか? 2. ユニットテストの書き方3. テストツール4...

JSインターセプト文字列の3つの方法の詳細な説明

JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...

Javascript配列の重複排除のいくつかの方法の詳細な説明

目次アレイ重複排除1 2層forループ(バブルソートの2層ループ記述に類似) 2 ループとインデック...

after疑似要素を使用して中空の三角矢印とXアイコンを実装する例

フロントエンドのデザイン案では、「X」や「>」の形をした閉じるボタンや、他の 3 方向の白抜き...

Ubuntu16.04はphp5.6ウェブサーバー環境を構築します

Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...

最新の超詳細な VMware 仮想マシンのダウンロードとインストールのグラフィック チュートリアル

目次1. 仮想マシンをダウンロードする2. 仮想マシンのインストールVMware のダウンロードとイ...

グリッドはページのレイアウトプランです

<br /> 英語原文: http://desktoppub.about.com/od/...

MySQL マスタースレーブ同期遅延の原因と解決策

歴史的な理由により、MySQL レプリケーションは、REDO ログではなく論理バイナリ ログに基づい...

Nginx 正規表現関連のパラメータとルールの紹介

序文最近、私はクライアントのサーバー構成を支援しており、Nginx 構成ファイルを頻繁に変更していま...

Springboot プロジェクトの Docker-compose イメージリリースプロセス分析

導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...

MySQLのインデックス設計の原則と一般的なインデックスの違いについて簡単に説明します。

インデックス定義: ディスク上に保存される個別のデータベース構造であり、データ テーブル内のすべての...

Tomcat が非同期サーブレットを実装する方法の詳細な説明

序文これまでの Tomcat シリーズの記事を通じて、私のブログを読んでいる学生は Tomcat に...