MySQL アカウント名はユーザー名とホスト名で構成されます。これにより、別々のホストから接続可能な同じ名前を持つユーザーのためのアカウントを作成できます。このセクションでは、特殊な値やワイルドカードルールを含む、アカウント名の記述方法について説明します。
CREATE USER
、GRANT
、SET PASSWORD
などの SQL ステートメントでは、次のルールを使用してアカウント名を記述してください。
アカウント名の構文は
'
です。user_name
'@'host_name
'ユーザー名のみで構成されるアカウント名は、
'
と同等です。たとえば、user_name
'@'%''me'
は'me'@'%'
と同等です。ユーザー名およびホスト名は、それらが引用符なしの識別子として有効な場合、引用する必要はありません。引用符が必要なのは、
user_name
文字列が特殊文字 (「-
」 など) を含んでいたり、host_name
文字列が特殊文字またはワイルドカード文字 (「%
」 など) を含んでいたりする場合で、たとえば'test-user'@'%.com'
のようになります。ユーザー名およびホスト名は、逆引用符 (「
`
」)、単一引用符 (「'
」)、または二重引用符 (「"
」) のいずれかを使用して、識別子または文字列として引用符で囲みます。ユーザー名およびホスト名の部分が引用符で囲まれる場合、別々に囲んでください。つまり、
'me'@'localhost'
と記述し、'me@localhost'
とは記述しません。後者は'me@localhost'@'%'
と解釈されます。CURRENT_USER
またはCURRENT_USER()
関数への参照は、現行クライアントのユーザー名およびホスト名の文字を指定することと同等です。
MySQL は、mysql
データベースの付与テーブルにアカウント名を格納するとき、ユーザー名とホスト名の部分に別々のカラムを使用します。
user
テーブルにはアカウントごとに 1 行が格納されます。User
およびHost
カラムはユーザー名およびホスト名を格納します。このテーブルには、アカウントが持つグローバル権限も指定されます。ほかの付与テーブルには、データベースおよびデータベース内のオブジェクトに対してアカウントが持つ権限が示されます。これらのテーブルにはアカウント名を格納するための
User
およびHost
カラムがあります。これらのテーブルの各行は、同じUser
およびHost
の値を持つuser
テーブル内のアカウントに関連付けられています。
付与テーブル構造に関する追加の詳細については、セクション6.2.2「権限システム付与テーブル」を参照してください。
ユーザー名およびホスト名は、次に示すような特殊な値が使用されたりワイルドカード規則が適用されたりします。
ユーザー名は、入接続を試行するユーザー名と文字が一致するブランクでない値であるか、あらゆるユーザー名と一致するブランク値 (空の文字列) です。ブランクのユーザー名を持つアカウントは匿名ユーザーです。SQL ステートメントで匿名ユーザーを指定するには、''@'localhost'
のように引用符で囲んだ空のユーザー名部分を使用します。
アカウント名のホスト名部分は多くの形式を持つことができ、ワイルドカードが許可されます。
ホスト値はホスト名または IP アドレス (IPv4 または IPv6) とすることができます。
'localhost'
という名前はローカルホストを示します。IP アドレス'127.0.0.1'
は IPv4 ループバックインタフェースを示します。IP アドレス'::1'
は、IPv6 ループバックインタフェースを示します。-
ワイルドカード文字 「
%
」 および 「_
」 を、ホスト名または IP アドレスの値に使用できます。これらはLIKE
演算子で実行されるパターンマッチング演算と同じ意味を持ちます。たとえば、ホスト値'%'
はあらゆるホスト名に一致し、'%.mysql.com'
という値はmysql.com
ドメイン内のすべてのホストに一致し、'192.168.1.%'
は 192.168.1 のクラス C ネットワークのあらゆるホストに一致します。IP ワイルドカード値をホスト値に使用できるため (サブネット上のすべてのホストに一致する
'192.168.1.%'
など)、一部のユーザーがホスト192.168.1.somewhere.com
を指定することによって、この機能を悪用しようとする可能性があります。このような試みを阻止するために、MySQL では、数字およびドットで始まるホスト名との一致が許可されていません。したがって、1.2.example.com
のような名前を持つホストがある場合、その名前はアカウント名のホスト部分と決して一致しません。IP ワイルドカード値は、ホスト名でなく IP アドレスのみと一致することができます。 -
IPv4 アドレスで指定されるホスト値について、ネットワーク番号に使用するアドレスビットの数を示すネットマスクを指定することができます。ネットマスク表記は IPv6 アドレスについては使用できません。
構文は
です。例:host_ip
/netmask
CREATE USER 'david'@'192.58.197.0/255.255.255.0';
これにより
david
は、次の条件が true となる IP アドレスclient_ip
を持つすべてのクライアントホストから接続できます。client_ip & netmask = host_ip
つまり、次のような
CREATE USER
ステートメントがあるとします。client_ip & 255.255.255.0 = 192.58.197.0
この条件を満たし、MySQL サーバーに接続できる IP アドレスは、
192.58.197.0
から192.58.197.255
までの範囲のものです。ネットマスクは、8、16、24、または 32 ビットのアドレスを使用するようサーバーに指示するためにのみ使用できます。例:
192.0.0.0/255.0.0.0
: 192 のクラス A ネットワーク上のすべてのホスト192.168.0.0/255.255.0.0
: 192.168 のクラス B ネットワーク上のすべてのホスト192.168.1.0/255.255.255.0
: 192.168.1 のクラス C ネットワーク上のすべてのホスト192.168.1.1
: この特定の IP アドレスを持つホストのみ
次のネットマスクは 28 ビットをマスクしますが、28 は 8 の倍数でないため機能しません。
192.168.0.1/255.255.255.240
サーバーは、クライアントホスト名または IP アドレス用のシステム DNS リゾルバによって返された値を使用して、アカウント名のホスト値の突き合わせをクライアントホストに対して実行します。アカウントホスト値がネットマスク記法を使用して指定される場合を除き、この比較は IP アドレスとして指定されるアカウントホスト値であっても文字列の突き合わせとして実行されます。つまり、DNS によって使用されるのと同じ形式でアカウントホスト値を指定しなければならないということを意味します。留意するべき問題の例を次に示します。
ローカルネットワーク上のホストの完全修飾名が
host1.example.com
だとします。DNS がこのホストの名前参照をhost1.example.com
として返す場合、アカウントホスト値にこの名前を使用します。ただし、DNS がhost1
のみを返す場合、代わりにhost1
を使用します。DNS が特定のホストの IP アドレスとして
192.168.1.2
を返す場合、これはアカウントホスト値192.168.1.2
と一致しますが192.168.01.2
とは一致しません。同様に、これは192.168.1.%
のようなアカウントホストパターンに一致しますが192.168.01.%
には一致しません。
このような問題を避けるために、DNS がホスト名およびアドレスを返す際の形式を確認し、同じ形式の値を MySQL アカウント名に使用するようにすることをお勧めします。