阻止使用者訪問某些表
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.* 對特權帳戶的訪問權限。