1

ユーザーを作成し、「CREATE USER」権限を付与しました。ユーザーは、ルートを含む他のユーザーを削除できることがわかりました。どうすればそれを防ぐことができますか?

実際、AWS の RDS のように Mysql をサービスとして実装しています。システム管理で使用されるスーパーユーザーを作成します。私たちの顧客には、「CREATE USER」を含むほとんどの権限を持つ別のユーザーがいて、アカウントを自分で管理できます。それを得るためにMysqlの通常の権限以外のアプローチを見つけたい

AWS RDS がある場合、RDS には「rdsadmin」ユーザー アカウントがあることがわかります。DROP USER 'rdsadmin'@'localhost' を実行すると、次のエラーが表示されます: ERROR 1396 (HY000): Operation DROP USER failed for 'rdsadmin'@'localhost'. それをどのように実装するのか興味があります。

ユーザーがテーブルから 'rdsadmin' を削除したときにエラーをスローするトリガーを mysq.user テーブルに追加しようとしました。しかし、トリガーはDELETE FROM USER ...SQLではなくDROP USER. 原因はわかりますか、それとも直す方法はありますか?

4

3 に答える 3

1

指定したユーザーに権限を付与することはできません。CREATE USER はグローバル権限です。

たとえば、MySQL ユーザーを分離することをお勧めします。管理者用 (root 権限を使用)、開発者用 (データベース オブジェクトとテーブル データにアクセスして変更するため) など、いくつかのユーザーが存在する可能性があります...

于 2015-08-21T11:20:24.493 に答える
1

データベース API を作成することで、この回避策を使用できます。SQL コードが役に立ちます。

CREATE TABLE mysql.`created_users` (
  `user_name` varchar(255) DEFAULT NULL,
  `owner` varchar(255) DEFAULT NULL
)

テーブルには、ユーザー名とユーザーが作成したものが保持されます。 root アカウントでプロシージャを作成することに注意してください

mysql ユーザーを作成する手順。

DROP PROCEDURE IF EXISTS mysql.createUser;

DELIMITER //
CREATE PROCEDURE mysql.createUser(IN userName VARCHAR(255), IN userPassword VARCHAR(255))
 BEGIN

  SET @createUserQuery = CONCAT('
        CREATE USER "',userName,'"@"localhost" IDENTIFIED BY "',userPassword,'" '
        );
  PREPARE stmt FROM @createUserQuery;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;


  SET @createcreatedUserQuery = CONCAT('
        INSERT INTO mysql.created_users (user_name, owner) VALUE("',userName,'", "',USER(),'")'
        );
  PREPARE stmt FROM @createcreatedUserQuery;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

 END //
DELIMITER ;

削除する手順とcreated_usersテーブルをチェックして、ユーザーが存在することを確認し、正しいチェックを削除します。

DROP PROCEDURE IF EXISTS mysql.dropUser;

DELIMITER //
CREATE PROCEDURE mysql.dropUser(IN userName VARCHAR(255))
 BEGIN  

  SET @canDeleteUser = 0;   

  SET @createCountUserQuery = CONCAT('
        SELECT COUNT(*) FROM mysql.created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'" INTO @canDeleteUser'
        );

  PREPARE stmt FROM @createCountUserQuery;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;  

  IF @canDeleteUser = 0 THEN

      SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'The user is not known on the server or you dont have rights to delete this user';
  END IF;

  IF @canDeleteUser = 1 THEN
      SET @createDropUserQuery = CONCAT('
        DROP USER "',userName,'"@"localhost"'
        );
      PREPARE stmt FROM @createDropUserQuery;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;

      SET @createDeleteUserQuery = CONCAT('
        DELETE FROM created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'"'
        );
      PREPARE stmt FROM @createDeleteUserQuery;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;    
  END IF;

 END //
DELIMITER ;

そして、これらを実行する権利を与えるために

GRANT EXECUTE ON PROCEDURE mysql.createUser TO '[user]'@'localhost';
GRANT EXECUTE ON PROCEDURE mysql.dropUser TO '[user]'@'localhost';

また、ユーザーに mysql.proc の select priv を与えて、プロシージャの背後にあるソース コードを表示し、パラメーターを認識できるようにすることもできます。

このようにデータベース API を使用できます。

CALL mysql.createUser('user', 'password');
CALL mysql.dropUser('user');

root アカウントは、所有者が root@localhost である mysql.dropUser を持つユーザーのみを削除できることに注意してください。

于 2015-08-21T14:02:22.770 に答える
0

Devart が言ったように、CREATE USER の権限を変更することはできません。

ただし、あなたが行っているように見えるのは、mysql インスタンスをユーザーにプロビジョニングして、自分で制御できるようにすることです。そのために、サーバー管理ツールはいかがでしょうか。froxlor Server Management Studio (無料でオープンソース) を含めると、たくさんあります: https://www.froxlor.org/

それはただの考えです。

于 2015-08-21T14:09:08.920 に答える