権限 - MySQL/MariaDB: ,GRANT ... IDENTIFIED BY と ,CREATE USER とその後の ,GRANT, の違いは何ですか?

okwaves2024-01-25  9

DB を設定するときは、通常次のユーザーを作成します。

CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';

次に、ユーザーに DB に対するいくつかの権限を付与します。

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';

これを行う方法として、この 2 つのコマンド シーケンスがあちこちで見られます。ただし、CREATE USER コマンドをスキップして GRANT で開始すると、ユーザーは自動的に作成され、正常に動作するようです。 GRANT の前に CREATE USER を使用する必要がある理由はありますか?それとも、下位互換性のための古い慣例なのでしょうか?



------------------------

MySQL は、ユーザーに権限を付与するだけで暗黙的なユーザーの作成をサポートしていました。この使用法により、GRANT が可能になりました。冪等でレプリケーションが安全です。たとえば、ユーザーがレプリカに存在する場合と存在しない場合がある場合、ユーザーがまだ存在しない場合、GRANT はユーザーを作成します。ユーザーが存在した場合でも、GRANT は機能し、必要に応じて権限を追加します。

この方法で GRANT を使用した場合、IDENTIFIED BY 句を使用してパスワードを設定することはオプションでした。ユーザーがすでに存在する場合、ユーザーはすでにパスワードを持っているため、IDENTIFIED BY は必要ありません。ユーザーが存在しない場合、IDENTIFIED BY を省略すると暗黙的にユーザーが作成されますが、パスワードはありません (つまり、誰でもパスワードを入力せずにそのユーザーとしてログインできます)。

これはセキュリティ上のリスクであると考えられました。たとえば、誰かが IDENTIFIED BY なしで GRANT を使用し、ユーザー名のスペルを間違えた場合、誤って権限を持つがパスワードを持たない新しいユーザーを作成します。

GRANT ALL ON *.* TO 'ruhnett'@'%';  -- misspelled username creates new user

これにより、誰でも新しいユーザーとしてログインし、特権アクセスを取得できるようになります。

そのため、MySQL 5.7 では、GRANT を使用して暗黙的にユーザーを作成することは非推奨になりました。

CREATE USER ... IF NOT EXISTS 構文は、冪等のユーザー作成の代わりに使用されます。これにより、開発者は、いつユーザーを作成するのか、いつ既存のユーザーに権限を付与するのかをより明確にすることが奨励されます。



------------------------

ここで行っていることは MySQL 8.0 では機能しません。 GRANT コマンドでユーザーを自動的に作成する機能には、次のような機能があります。削除した場合は、最初に CREATE USER を使用する必要があります。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。