Mysql

阻止使用者訪問某些表

  • January 5, 2020

DBMS 允許管理員使用以下方式向使用者授予表訪問權限:

GRANT ALL ON mydb.mytbl1, mydb.mytbl2 TO 'someuser'@'somehost';

但是,是否可以將所有表授予使用者並顯式阻止對其中一些表的訪問?例如(BLOCK 關鍵字是假的,僅用於說明。):

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
BLOCK ALL ON mydb.mytbl3 TO 'someuser'@'somehost';

另一個想法是在 GRANT 語句中添加 where 子句。但是,似乎 GRANT 語句語法不允許這樣做(http://dev.mysql.com/doc/refman/5.1/en/grant.html)。

如果管理員在大多數情況下信任使用者(例如 1000 個表)並且只想阻止對少數最敏感的表的訪問,這種訪問控制可能會很方便。

你能告訴我這種機制是否存在嗎?

我不得不解決這個特定的問題,並意識到沒有辦法說“除了這些之外的所有表”。

我為解決這個問題所做的是創建一個內部數據庫,restricted_tables。

它有幾個簡單的表模式:

CREATE TABLE `tables` (
 `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
 `TABLE_NAME` varchar(64) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE `authorized_users` (
 `authorization_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `user` char(16) NOT NULL,
 `table_schema` char(64) NOT NULL,
 `table_name` char(64) NOT NULL,
 `authorization_ticket` char(16) NOT NULL,
 `authorization_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `authorization_expiration` date DEFAULT NULL,
 PRIMARY KEY (`authorization_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

您看到的tables表只是您希望為“除這些之外的所有內容”列表排除的一對錶架構(數據庫名稱)和表名。

授權使用者表在第二次迭代中出現,以允許某些使用者訪問其他預設受限表。那裡的其他一些列包括一個工單列,該列是對我們用於審計跟踪目的的內部工單系統的引用,以及幾個用於創建和過期的日期列。

然後我有一個使用者維護腳本,它執行如下查詢

$q="select i.table_schema, i.table_name from information_schema.tables i left outer join
            restricted_tables.tables r using(table_schema, table_name)
                                                where
           i.table_schema not in (".buildEscapedList($db,$excludedDbs).") and r.table_schema is null
       union
       select table_schema, table_name from restricted_tables.authorized_users where user=?";

(如果有幫助,這是一個用 PHP 編寫的 perrepared 語句)。$excludedDbs 只是一個完全忽略的模式列表,如 mysql、information_schema 等。

然後它首先為使用者執行“撤銷所有權限”(這只是留下由 ’’ 條目標識的使用 user@host。

然後,它循環並在該查詢返回的每個表上授予選擇權限。

這有效地實現了你的一切,但這些

爛事

添加新表時,它不會像 db.* 那樣明確包含在使用者中。為了緩解腳本版本在 cron 上執行以定期讀取這些使用者的授權。

它使查看 user@host 的節目授權有點令人生畏,以快速了解使用者可以訪問或無法訪問的內容(但沒有什麼是 grep 解決不了的)

已知限制

該腳本是專門為這樣的場景而建構的

替代解決方案

如果 mydb 中有一部分錶受到限制,則僅將這些表移動到 mydb_restricted 數據庫中。然後只能保留 db.* 樣式的授權,授予 mydb_restricted.* 對特權帳戶的訪問權限。

引用自:https://dba.stackexchange.com/questions/68957