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

推薦する

Navicatをサーバー上のdockerデータベースに接続する方法

dokekrでmysqlコンテナを起動するコマンドを使用します: docker run -p 330...

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...

複数サーバーの負荷分散を実現するためのNginx構成

Nginx ロード バランシング サーバー: IP: 192.168.0.4 (Nginx-Serv...

CSS で div にスクロールを追加し、スクロール バーを非表示にする

CSS は div にスクロールを追加し、スクロール バーを非表示にします。具体的なコードは次のとお...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

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

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

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

Linux プロセスの CPU 使用率が 700% に達し、終了できない場合の解決策

目次1. 問題の発見2. プロセスの詳細情報を表示する3. 解決策4. 大法を再開する1. 問題の発...

Reactドラッグフックを実装するための100行以上のコード

序文ソースコードは合計で 100 行強しかありません。これを読めば、react-dnd などの成熟し...

自分のブログを構築しながら学んだこと

<br />ブログを始めて 1 年、私はブログの内外で多くのことを個人的に学びました。ま...

Docker ベースの Selenium 分散環境の構築

1.画像をダウンロードするdocker pull selenium/hub docker pull ...

JavaScript で 24 以上の配列メソッドを手動で実装する

目次1. トラバーサルクラス1. 各2. 地図3. すべての4. いくつか5. フィルター6. 減ら...

Linux でシステム ディスクを初期化した後にデータ ディスクを再マウントする方法

Linuxインスタンスでシステムディスクを初期化した後、データディスクを再マウントするLinux イ...

CSS で overflow-y: visible; が機能しない理由の分析と解決

シナリオ最近の要件は、モバイル デバイス用の h5 ページです。これには、選択可能なカードの行が必要...