前言
保護數據需要權衡考慮安全性和訪問能力。如何找到最合適的方法呢?
目前,公司和政府為數據的可審計性和控制制定了嚴格的標準,這使數據庫安全性成為近來的熱點。DBA 必須保證用戶能夠訪問完成工作所需的數據,同時避免數據風險。
絕對保護數據的惟一方法是把服務器關閉,鎖起來,不讓人使用。但是,為了讓數據庫發揮作用,就必須允許訪問數據。IDS 在數據庫、表和列級都應用了安全措施。安全措施還可以應用于視圖中的記錄級。所有安全措施都基于用來連接數據庫的用戶名。
我將解釋 Informix 安全特性如何幫助您保護數據,同時允許適當的用戶訪問數據。
安全建議
每個環境和數據庫開發的每個階段有不同的數據庫安全性需求。開發環境必須讓程序員能夠快速創建和修改數據庫對象。測試和生產環境需要穩定性,需要控制可以對數據庫對象執行哪些操作。有效的數據庫安全模型的一個關鍵部分是,定義和分配 DBA、數據庫安全官(DSO)和對象所有者角色。
對于 DBA 角色,應該創建一個抽象的用戶登錄。DBA 本質上是數據庫超級用戶。建立一個單獨的登錄會減少用戶意外刪除數據庫的風險。這條原則在生產環境中尤其重要。DBA 登錄名應該是數據庫和數據庫中所有表的創建者。DBA 應該是對數據庫中任何表有修改特權的惟一用戶。作為數據庫和數據庫中所有表的創建者,DBA 可以把特權授予其他用戶。
一些生產環境可能需要一個 DSO,這是 DBA 之外的一個單獨職位,他負責數據安全。DSO 也應該是一個單獨的抽象用戶登錄。為了能夠有權在數據庫中添加新用戶,DSO 需要 DBA 數據庫特權。DSO 還需要數據庫中每個表的授予特權,以便把特權授予其他用戶。
為了建立具有 DSO 特權的角色,必須給 DSO 分配用戶對于數據庫中每個表可能需要的所有特權。下面是使用帶 grant option 的 grant 命令的 SQL 語法:
GRANT SELECT, INSERT, UPDATE, DELETE, INDEX ON table_name TO dso_login_name
WITH GRANT OPTION;
Public特權
Informix 使用關鍵字 public 表示應用于所有用戶的特權。public 關鍵字是一個非常強大的工具,可以開放對數據的訪問。同樣,為了防止未經過授權的所有用戶連接數據庫和選擇數據,可以完全撤消 public 特權。
對象所有者特權
創建數據庫或數據庫對象(表、索引、函數、過程等等)的用戶就是這個對象的所有者,他控制這個對象的訪問和特權。對象的所有者擁有所有表級特權,而且這些特權不能撤消。當系統從開發環境轉移到生產環境時,或者表或數據庫原來的所有者離開組織時,這個限制可能會造成問題。任何其他用戶(即使是 DBA)都無法撤消所有者的特權。因此,必須謹慎地決定數據庫或表的所有者。
表的所有者是可以向其他用戶授予這個表的特權的惟一用戶。一些應用程序也使用 owner.tablename 語法來訪問表。在我的一個客戶的數據庫中,表在開發、接收測試和生產階段有不同的所有者。一個表只能有一個所有者。當把應用程序代碼從開發環境轉移到測試環境,然后再轉移到生產環境中時,必須改變表的所有者,這可能會造成問題。在不同的環境中,必須修改應用程序代碼中的 owner.tablename,這會增加風險。
數據庫特權
有三個數據庫特權級別:DBA、Resource 和 Connect。Connect 特權允許用戶訪問數據庫以及添加、修改和刪除數據。Resource 特權授予用戶所有 Connect 特權,還授予創建新的表、索引和過程的特權。DBA 特權包括 Connect 和 Resource 特權,還授予用戶把 Resource、Connect 或 DBA 特權授予其他用戶的權力。具有 DBA 特權的用戶還可以刪除數據庫中的所有對象或完全刪除數據庫。
對于大多數數據庫活動,Connect 特權就足夠了。要創建新對象的程序員或開發人員可能需要 Resource 特權。DBA 特權就像是 Unix 操作系統的 “超級用戶”。授予或撤消數據庫特權的語法是:
grant [ dba | resource | connect ] to [ public | USERS ];
revoke [ dba | resource | connect ] from [ public | USERS ];
數據庫特權存儲在系統表 sysusers 中。可以用 select * from sysusers; 列出所有用戶及其數據庫特權,顯示的信息包括:
◆username,連接數據庫的用戶的登錄名
◆usertype,數據庫特權類型;D 表示 DBA,R 表示 Resource,C 表示 Connect
◆PRiority,這一列沒有正式使用,但它是系統表的一部分(通常,對于所有用戶,這一列是 5;對于數據庫所有者,是 9)
◆passWord,這一列沒有使用,但它是系統表的一部分
數據庫特權
應該避免把 DBA 特權授予 public。我見過一些第三方應用程序把 DBA 特權授予 public,僅僅是因為這樣做非常省事。如果把 DBA 特權授予 public,那么任何用戶都能夠刪除數據庫、撤消所有其他用戶的所有特權和創建新的數據庫用戶。如果把 Resource 特權授予 public,那么就允許任何用戶在數據庫中創建對象(表或視圖)。
撤消用戶的 DBA 或 Resource 特權會使特權轉換為 Connect。如果希望從數據庫中完全刪除一個用戶,還需要撤消 Connect 特權。
在授予數據庫特權時,采用以下原則可以減少很多麻煩:
◆DBA 特權應該只授予一兩個登錄名,這些登錄名不供常規用戶使用。這些登錄名應該只用于數據庫管理(DBA 和 DSO)。
◆Resource 特權應該只授予開發環境中的程序員,以及必須通過運行過程創建索引的用戶。
◆Connect 特權應該只授予需要訪問數據庫的用戶。
表特權
有七種表特權:
◆Select(查看表中的數據)
◆Insert(在表中添加新的數據行)
◆Update(修改現有行)
◆Delete(刪除數據行)
◆Index(在表中添加索引)
◆Alter(修改表結構)
◆Reference(在引用約束中引用列)
用戶必須具有 Resource 數據庫特權和相關的表特權,才能創建索引、修改表結構或引用持久表。
創建表的用戶是所有者,他擁有所有表特權,這些特權無法撤消。with grant option 允許用戶把特權授予其他用戶;應該謹慎地使用這個選項,因為它把控制表特權的過程委托給了其他用戶。使用 as GRANTOR 選項以另一個用戶的身份授予特權。只有 DBA 或具有授予權限的用戶可以使用這個選項。只有授予一個特權的用戶能夠撤消這個特權。
授予和撤消表特權的語法如下:
grant [ all | [ select | insert | update | delete | index | alter | reference ]
on [ TABLE | VIEW | SYNONYM ] to [ public | USERS ]
[ with grant option ][ as GRANTOR ];
revoke [ all | [ select | insert | update | delete | index | alter| reference ]
on [ TABLE | VIEW | SYNONYM ] from [ public | USERS ];
表特權存儲在系統表systabauth中,這個表包含四列:
◆grantor,授予這個特權的用戶
◆grantee,獲得這個特權的用戶
◆tabid,這個表在系統表中的編號
◆tabauth,表特權
使用下面的 SQL 語句列出表和具有表特權的用戶:
select systables.tabname, systabauth.*from systables, systabauth
where systables.tabid = systabauth.tabid and systables.tabid > 99 order by tabname;
這個語句聯結 systabauth 和 systables,從 systables 中獲取表名并顯示用戶。tabauth 列包含特權,需要根據這個列中的位置進行解碼(見圖 1)。
圖 1. tabauth 列包含的特權
tabauth 中的字符表示對于一個表有哪些表級特權。表 1 給出列中的位置與其表示的表和列級特權之間的對應關系。
表1. 表和列級特權之間的對應關系
大寫字母表示用戶可以把這個特權授予其他用戶;- 表示用戶不擁有這個特權。所以在圖 1 中,Sarah 只有 customer 表的 select 特權,而 Robert 有 select、insert、update 和 delete 特權;沒有列級特權。
與數據庫特權一樣,應該謹慎地使用 public??梢猿废粋€用戶的所有表特權,但是這個用戶仍然擁有分配給 public 的特權。在默認情況下,每個表在創建時都有 public 特權,所以需要檢查 public 特權,考慮是否需要修改默認的 public 特權。
在數據倉庫系統中,用戶只需要 select 特權。在 OLTP 數據庫中,應該根據需求把特權限制在 select、update、insert 和 delete。
列特權
兩個列級特權是 select 和 update。具有列級特權的用戶不應該擁有表級的 select 或 update 特權。用戶的表級 select 或 update 特權將覆蓋列級特權。列級特權存儲在 syscolauth 表中,它們限制用戶是否可以查看或修改表中記錄的指定列。
授予列級特權的語法如下:
grant [ select (COLUMN) | update (COLUMN) | reference ( COLUMN ) ]
on [ TABLE | VIEW | SYNONYM ] to [ public | USERS ][ with grant option ][ as GRANTOR ] ;
除非在表級撤消 select 和 update 特權,否則列級特權不起作用。當存在列級特權時,systabauth 表的 tabauth 列的第三個位置上會顯示一個星號(見表 1)。
列級特權在控制對機密信息(比如工資或 SSN)的訪問方面非常有用。
權衡考慮控制和訪問
安全性是 DBA 的一項重要責任。既要保護組織的數據,又要滿足適當的使用需求,這是個難題。關鍵是分配適當的特權級別。
新聞熱點
疑難解答