特定のホスト名からのみMySQLデータベースへの接続が許可されるMySQLユーザーを作成しようとしています。
'some_passwd'で識別される 'user_name'@'appserver-lan.mydomain.com'にdb_name。*のすべてを付与します
Mysql dbのユーザーテーブルを確認すると、ユーザーが正常に作成されたことがわかります。
mysqlを使用します。 User = 'user_name'およびHost = 'appserver-lan.mydomain.com'のユーザーから*を選択します
または
'username'@'appserver-lan.mydomain.com'の許可を表示
私が指定したホスト名は、Amazon-ec2名のエイリアスであり、AWS DNSサーバーによって解決されると、LANアドレスになります。
[root @ db_server〜]#ホストappserver-lan.mydomain.com
appserver-lan.mydomain.comはec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.comのエイリアスですec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.comはアドレス10.xxxを持っています.xxx.xxx
問題は、このappserver-lanからデータベースLAN IPに接続しようとすると、パスワードが正しいにもかかわらず、アクセス拒否エラーが発生することです。 奇妙なことこれは、エラーで表示されたホスト名が、ユーザーの作成時に指定したホスト名ではないことを示しています。
エラー1045(28000):ユーザー 'user_name' @ 'appserver.mydomain.com'のアクセスが拒否されました(パスワードを使用:YES)
だから、私の質問は:mysqlはどのようにクライアントのホスト名を決定するのですか?私がチェックしたところ、「appserver.mydomain.com」も「appserver-lan.mydomain.com」も指していないため、逆DNSルックアップではそうならないと思います。さらに、dbサーバーには、/ etc/hosts上のappserverに関連するエントリがありません。
要約すると、ホスト "%"またはLAN IPへの権限の付与は問題なく機能するため、これはホスト名解決の問題だと確信しています。
私が欠けているものについてのアイデアはありますか?
DNS逆引き参照を使用します。クライアントのIPアドレスを取得し、その名前に対して返されたPTRレコードを使用します。
私の意見では、名前に基づいて認証を行うことはまったく役に立ちません。代わりにIPアドレスの使用を検討することをお勧めします。
MysqlがDNS を使用する方法については、このドキュメントを参照してください。
Mysqlサーバーが逆DNSルックアップを誤って実行しているように見える、同様の問題が発生しました。
私が抱えていた問題は、サーバーに 'user'@'reverse.dns'だけでなく 'user'@'1.2.3.4'に対する権限があったことです。 IPアドレスのみを持つユーザーには最小限の権限しかありませんでしたが、mysqlサーバーはホスト名を持つユーザーではなくそのユーザーの権限を使用しており、「ユーザー 'user'@'1.2.3.4'のアクセスが拒否されました」というメッセージを返していました。 IPアドレスを持つユーザーを削除すると問題が解決し、サーバー名でホスト名で他のユーザーを使用するように強制しました。
MySQLはホスト名を取得するためにIPアドレスで逆DNSルックアップを実行します。 AWS EC2で実行している場合は、サーバーにエラスティックIPを割り当て(追加料金はかかりません)、AmazonにエラスティックIPの逆引きDNSをセットアップしてホスト名に移動するように依頼できます。
また、DBサーバーはEC2にもありますか?その場合はインスタンスのプライベートIPアドレスを使用し、そうでない場合はパブリックIPアドレスを使用するためです。あなたはappserver-lanがあなたのサーバーに割り当てられた10.XXX.XXX.XXXプライベートIPであり、putlic IPではないので、あなたが投稿したように見えます。
同じ地域内にサーバーしか持っていなかったので、別の地域と通信する場合にどのIPアドレスが使用されるかわかりません。
また、IPV4とIPV6のホスト名とIPアドレスが一致せず、ホスト名のみがユーザー権限に使用される問題も発生しました。たとえば、IPV6逆引きDNSはあるが、順方向IPV6 DNSがない場合です。