GNU/Linux >> Linux の 問題 >  >> Linux

MySQL ユーザー管理の初心者向けガイド

MySQL でユーザーを管理すると、ユーザーができることとできないことを制御できます。

  • 職務に適したさまざまな権限を持つユーザー アカウントを作成する
  • root アカウントの使用を避ける – 侵害されたアプリケーションを制限し、定期メンテナンス中のミスから保護します。
  • 個々のユーザー権限を適切に割り当てることにより、データの整合性を確保します。許可されたユーザーに作業を許可します。権限のないユーザーが権限を超えてデータにアクセスできないようにする

ユーザー アカウントの確認

MySQL サーバーに接続してクエリを実行すると、ユーザーが認証され、アクティビティが承認されます。

  • 認証 :ユーザーの身元を確認します。これは、アクセス制御の最初の段階です。接続するたびに認証に成功する必要があります。認証に失敗すると、接続が失敗し、クライアントが切断されます。
  • 承認 :ユーザーの権限を確認します。このアクセス制御の第 2 段階は、認証が成功したアクティブな接続で要求ごとに行われます。リクエストごとに、MySQL は実行する操作を決定し、それを実行するのに十分な権限があるかどうかをチェックします。

ユーザー アカウント設定の表示

– mysql データベースにクエリを実行して、ユーザー識別情報を表示します:

mysql> SELECT user, host, password
-> FROM mysql.user WHERE user='root'; 
+------+-----------+-------------------------------------------+ 
| user | host      | password                                  | 
+------+-----------+-------------------------------------------+ 
| root | localhost | *2447D497B9A6A15F2776055CB2D1E9F86758182F | 
| root | 127.0.0.1 | *2447D497B9A6A15F2776055CB2D1E9F86758182F | 
| root | ::1       | *2447D497B9A6A15F2776055CB2D1E9F86758182F |
+------+-----------+-------------------------------------------+ 
3 rows in set (0.00 sec)

権限を含むすべてのユーザー情報を表示:

mysql> SELECT * FROM mysql.user\G 
***************** 1. row ***************** 
...
   Select_priv: Y
   Insert_priv: Y
   Update_priv: Y
   Delete_priv: Y
...

mysql データベースには、サーバー上のすべてのユーザー アカウントの情報が含まれています。この情報を表示するには、上記の SELECT ステートメントを実行します。値 Y *_priv で フィールドは、権限が有効であることを示します。 root アカウントにはフル アクセスがあります。すべての特権列の値は Y です。

権限だけでなく、user テーブルには、認証プロセスに役立つその他の情報が含まれています。たとえば、次の出力で、テスター ユーザーが次のことを確認できます:

  • パスワードがあり ([パスワード] 列に暗号化された形式で表示されます)、このパスワードの有効期限が切れていません (password_expired 列の N で示されます)
  • リソース制限が定義されていません (max_* 列の 0 で示されます)
  • SSL または x509 の設定がありません (ssl_* 列と x509_* 列の空白の値で示されます)
  • mysql_native_password プラグインを使用して認証します (プラグイン名はプラグインの列に表示されます)。
*************************** 1. row ***************************
                  Host: localhost
                  User: testuser
              Password: *14E65567ABDB5135D0CFD9A70B3032C179A49EE7
           Select_priv: Y
           Insert_priv: N
...
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string:
      password_expired: N

ネイティブ認証

ネイティブのパスワード認証プラグイン (デフォルトの認証メカニズム) を使用して MySQL サーバーに接続すると、指定したユーザー名、接続元のホスト、パスワードが mysql.user テーブルの行と照合され、接続してアクションを実行できます。

mysql クライアントを使用してローカル サーバーに接続するには、使用するアカウントのユーザー名とパスワードを指定します。

shell> mysql -u[username] -p[password]
注意 mysql.user テーブルでユーザーに関連付けられているホスト名は、サーバー ホストではなく、接続元のホストの名前を参照していることに注意してください。

クライアントのローカル ホストにインストールされていないサーバーに接続するには、接続先のサーバーのホスト名を指定します。

shell> mysql -u[username] -p[password] -h[server_host]

ユーザー アカウントの作成

アカウント名は、ユーザー名と、ユーザーがサーバーに接続する必要があるクライアント ホストの名前で構成されます。アカウント名の形式は「user_name'@'host_name」です '。ユーザー名の長さは最大 16 文字です。ユーザー名とホスト名にダッシュなどの特殊文字が含まれている場合は、それらを一重引用符で囲む必要があります。値が引用符なしの識別子として有効な場合、引用符はオプションです。ただし、いつでも引用符を使用できます。

たとえば、CREATE USER…IDENTIFIED BY ステートメントを使用してアカウントを作成します。
– jim という名前のユーザーの場合
– localhost から接続するには
– パスワード Abc123 を使用

CREATE USER 'jim'@'localhost' IDENTIFIED BY 'Abc123';

アカウント作成時のセキュリティ リスクの可能性を回避:

  • パスワードなしでアカウントを作成しないでください。
  • 匿名のアカウントを作成しないでください。
  • 可能であれば、アカウントのホスト名を指定するときにワイルドカードを使用しないでください。

ホスト名のパターン

% を含むホスト パターンを使用する または _ ワイルドカード文字を使用して、ユーザーがドメインまたはサブネット全体の任意のホストから接続できるようにするアカウントを設定します。アカウント管理ステートメントを記述するときにアカウント名のホスト部分を省略した場合、MySQL はホスト名を % と見なします。

%.example.com のホスト値は、example.com ドメイン内の任意のホストと一致します。ホスト値 192.168.% は、192.168 サブネット内の任意のホストと一致します。 % のホスト値は任意のホストに一致し、ユーザーは任意のホストから接続できます。 IP アドレスとサブネット マスクを使用して、ユーザーがそのサブネット内のアドレスを持つ任意のホストから接続できるようにします。たとえば、値 10.0.0.0/255.255.255.0 は、IP アドレスの最初の 24 ビットが 10.0.0 の任意のホストに一致します。

乱用や偶発的な露出を避けるために厳密に必要であり、適切に監査されている場合を除き、ホスト名にワイルドカードを使用しないでください。次のように定期的なチェックを実行します:

mysql> SELECT User, Host FROM mysql.user WHERE Host LIKE '%\%%';

ユーザー名とホスト名の例:

  • [email protected]
  • john@'10.20.30.%'
  • john@'%.ourdomain.com'
  • john@'10.20.30.0/255.255.255.0'

匿名ユーザー アカウント (つまり、任意のユーザー名に一致するアカウント) を指定するには、アカウント名のユーザー名部分に空の文字列を指定します。

mysql> CREATE USER ''@'localhost';

匿名のアカウント、特にパスワードのないアカウント (上記の例のように) を作成しないでください。これにより、MySQL インストールへのアクセスを開くことによるセキュリティ リスクを回避できます。ホストが 2 つ以上のパターンに一致する場合、MySQL は最も具体的なパターンを選択します。

アカウント パスワードの設定

権限を変更せずに既存のアカウントのパスワードを変更する最も一般的な方法は、SET PASSWORD を使用することです。 声明。たとえば、ローカル ホストの jim のパスワードを NewPass に設定するには、次のステートメントを使用します。

mysql> SET PASSWORD FOR jim@localhost = PASSWORD('NewPass');

root 以外のユーザーとしてログインしていて、そのユーザーが mysql データベースに対する UPDATE 権限を持っていない場合は、自分のパスワードのみを変更できます。 FOR 句なしで SET PASSWORD ステートメントを使用して、これを行います。

mysql> SET PASSWORD = PASSWORD('NewPass');

SET PASSWORD を使用する場合は、PASSWORD() を使用します パスワードを暗号化する機能。 CREATE USER ステートメントは、指定したパスワードを自動的に暗号化するため、CREATE USER でユーザーを作成するときに PASSWORD() 関数を使用する必要がないことに注意してください。

次の mysqladmin コマンドを使用して、シェルからパスワードを設定します:

shell> mysqladmin -u root password 'rootpass'
shell> mysqladmin -u root -h host_name password 'rootpass'

上記の例で、「rootpass」は root パスワードを表し、「host_name」は root アカウントが MySQL サーバーにアクセスするホストの名前です。

パスワードの確認

すべてのユーザー アカウントに強力で一意のパスワードを割り当てます。簡単に推測できるパスワードは避けてください。次の SELECT ステートメントを使用して、
パスワードなしでアカウントを一覧表示します:

SELECT Host, User FROM mysql.user WHERE Password = '';

重複したパスワードを特定するには:

SELECT User FROM mysql.user GROUP BY password HAVING count(user)>1;

ユーザーのパスワードを期限切れにするには、以下のクエリを使用します:

ALTER USER jim@localhost PASSWORD EXPIRE;

上記の例の SELECT ステートメントを発行するには、mysql スキーマまたは mysql.user テーブルに対する SELECT 権限を持つユーザー アカウントに接続する必要があります。特定のユーザー名に適用される複数のアカウントを持つことができます。たとえば、ユーザー jim が 2 つの場所からログインし、各場所に jim@localhost と jim@'192.168.14.38' などのアカウントを設定した場合、jim として識別される両方のアカウントが同じパスワードを持つ可能性があります。

ALTER USER…PASSWORD EXPIRE ステートメントを使用して、ユーザーのパスワードを期限切れにすることができます。パスワードの有効期限が切れた場合は、次回のログイン時に SET PASSWORD ステートメントを使用してパスワードを変更する必要があります。次の例のように、SET で始まらないステートメントを実行すると、パスワードを変更するまでエラーが返されます。

mysql> SELECT * FROM City WHERE 1=2;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql> SET PASSWORD = PASSWORD('new_pwd'); 
Query OK, 0 rows affected (0.01 sec) 

mysql> SELECT * FROM City WHERE 1=2;
Empty set (0.00 sec)

ユーザー アカウントの操作

RENAME USER を使用する ユーザー アカウントの名前を変更するステートメント:

RENAME USER 'jim'@'localhost' TO 'james'@'localhost';

上記のクエリは、既存のアカウントのアカウント名を変更するか、アカウント名のユーザー名またはホスト名の部分、あるいはその両方を変更します。

ユーザー アカウントを削除するには、DROP USER ステートメントを使用します。

DROP USER 'jim'@'localhost';

上記のクエリは、既存のアカウントのすべての権限を取り消してから、アカウントを削除します。また、アカウントのすべてのレコードが存在する付与テーブルからも削除されます。

MySQL プラガブル認証について
MySQL 権限について


Linux
  1. MySQLユーザーとデータベースの基本

  2. SELinux 初心者向けガイド

  3. yum 設定の初心者向けガイド

  1. オープンソースのドキュメント管理?

  2. 基本的なLinuxユーザー管理

  3. Linux でのユーザーおよびグループ管理の初心者向けガイド

  1. MySQLデータベースにリモートで接続する

  2. RPM を使用した Linux ソフトウェア管理の初心者向けガイド

  3. Linux でのスワップ領域管理の初心者向けガイド