MySQL では、mysql
データベースの
user
テーブルにアカウントが格納されます。アカウントは、ユーザー名およびユーザーがサーバーに接続できるクライアントホスト
(複数の場合あり)
に関して定義されます。アカウントはパスワードを持っている場合もあります。user
テーブルでのアカウントの表示については、セクション6.2.2「権限システム付与テーブル」を参照してください。MySQL
5.6
では、認証プラグインがサポートされているため、アカウントは一部の外部認証方式を使用して認証できます。セクション6.3.7「プラガブル認証」を参照してください。
ユーザー名とパスワードが MySQL で使用される方法と、オペレーティングシステムで使用される方法との間には、いくつかの違いがあります。
MySQL で認証目的に使用されるユーザー名と、Windows または Unix で使用されるユーザー名 (ログイン名) とには、まったく関係がありません。Unix では、ほとんどの MySQL クライアントがデフォルトで、現在の Unix ユーザー名を MySQL ユーザー名として使用してログインを試みますが、これは便宜上の目的に過ぎません。クライアントプログラムでは、
-u
または--user
オプションを使用して任意のユーザー名を指定することが許可されているため、簡単にデフォルトをオーバーライドできます。これは、ユーザー名を使用すればだれでもサーバーへの接続を試みることができることを意味するため、すべての MySQL アカウントがパスワードを持っていなければ、どのような方法でもデータベースをセキュアにすることはできません。パスワードを持っていないアカウントにユーザー名を指定するユーザーはだれでも、正常にサーバーに接続できます。-
MySQL ユーザー名は、最大で 16 文字の長さまで指定できます。オペレーティングシステムのユーザー名は、MySQL ユーザー名とは完全に無関係であるため、最大長が異なる可能性があります。たとえば、Unix ユーザー名は通常、8 文字までに制限されています。
警告MySQL サーバーおよびクライアントでは、MySQL ユーザー名の長さの制限がハードコードされているため、
mysql
データベース内のテーブル定義を変更してこれを回避しようとしても、効果がありません。セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」で説明する手順を使用する以外は、どのような方法でも
mysql
データベース内のテーブルは変更するべきではありません。その他の方法で MySQL のシステムテーブルを再定義しようとすると、未定義 (および未サポート) の動作が発生します。 -
サーバーは (
mysql.user
テーブルに格納されたパスワードと照合する) MySQL ネイティブ認証を使用してクライアント接続を認証する際に、user
テーブルに格納された MySQL パスワードを使用します。これらのパスワードと、オペレーティングシステムにログインするためのパスワードとには、まったく関係がありません。Windows または Unix マシンにログインする際に使用される「外部」パスワードと、そのマシン上の MySQL サーバーにアクセスする際に使用されるパスワードとの間には、必要な関係はありません。サーバーがプラグインを使用してクライアントを認証する場合は、プラグインで実装されている認証方式で、
user
テーブル内のパスワードが使用される場合と、使用されない場合があります。この場合、MySQL サーバーへの認証を行う際に、外部パスワードも使用される可能性があります。 -
MySQL では独自アルゴリズムを使用して、
user
テーブルに格納されたパスワードが暗号化されます。この暗号化は、PASSWORD()
SQL 関数で実装されたものと同じですが、Unix のログインプロセス時に使用されるものとは異なります。Unix のパスワード暗号化は、ENCRYPT()
SQL 関数で実装されたものと同じです。PASSWORD()
およびENCRYPT()
関数については、セクション12.13「暗号化関数と圧縮関数」を参照してください。MySQL バージョン 4.1 以降では、旧バージョンよりも強固な認証方式が採用され、接続プロセス時のパスワード保護が改善されています。TCP/IP パケットが盗聴されたり、
mysql
データベースが乗っ取られたりしてもセキュアです。(旧バージョンでは、パスワードが暗号化された形式でuser
テーブルに格納されますが、MySQL サーバーに接続する際に、暗号化されたパスワード値を知っていることが利用される可能性があります。)セクション6.1.2.4「MySQL でのパスワードハッシュ」では、パスワードの暗号化について詳細に説明します。 -
ユーザー名およびパスワードに ASCII 文字のみが含まれている場合は、文字セットの設定に関係なく、サーバーに接続できます。ユーザー名またはパスワードに ASCII 文字以外が含まれているときに接続するには、クライアントは
MYSQL_SET_CHARSET_NAME
オプションと引数として適切な文字セット名を指定して、mysql_options()
C API 関数を呼び出すようにしてください。これにより、指定された文字セットを使用した認証が実行されます。それ以外の場合、サーバーのデフォルト文字セットが認証のデフォルトエンコーディングと同じでなければ、認証に失敗します。標準の MySQL クライアントプログラムでは、先ほど説明したように、
mysql_options()
が呼び出される--default-character-set
オプションがサポートされています。さらに、セクション10.1.4「接続文字セットおよび照合順序」で説明したように、文字セットの自動検出もサポートされています。C API に基づいていないコネクタを使用するプログラムでは、mysql_options()
と同等のものがコネクタで提供されている場合があり、それを代わりに使用できます。コネクタのドキュメントを確認してください。前述の注は、クライアントの文字セットとして許可されていない
ucs2
、utf16
、およびutf32
には適用されません。
MySQL
をインストールすると、付与テーブルにアカウントの初期セットが移入されます。これらのアカウントの名前およびアクセス権限については、セクション2.10.2「最初の MySQL アカウントのセキュリティー設定」で説明されています。ここでは、パスワードを割り当てる方法についても説明されています。そのあと、通常は
CREATE
USER
、GRANT
、および
REVOKE
などのステートメントを使用して、MySQL
アカウントを設定、変更、および削除します。セクション13.7.1「アカウント管理ステートメント」を参照してください。
コマンド行クライアントを使用して MySQL サーバーに接続する場合は、使用するアカウントでの必要に応じて、ユーザー名とパスワードを指定します。
shell> mysql --user=monty --password=password db_name
短いオプションを好む場合は、コマンドは次のようになります。
shell> mysql -u monty -ppassword db_name
-p
オプションとそれに続くパスワード値との間には、空白文字を入れないでください。
コマンド行で --password
または -p
オプションに続く
password
値を省略した場合は、値を 1
つ指定するように求めるプロンプトがクライアントに表示されます。
コマンド行でパスワードを指定することは、セキュアでないと考えるべきです。セクション6.1.2.1「パスワードセキュリティーのためのエンドユーザーガイドライン」を参照してください。オプションファイルを使用すれば、コマンド行でパスワードを指定することを回避できます。
ユーザー名、パスワード、およびその他の接続パラメータの指定に関する追加情報については、セクション4.2.2「MySQL サーバーへの接続」を参照してください。