有关数据库的权限
存储在数据库中的数据对于一个商务活动来说是非常重要的。不仅要通过备份和制作日志来保证数据的不丢失,还要通过设置不同的访问权限来防止来自用户的善意的或恶意的破坏。一个公司不可能总是使用一个完全独立的数据库系统来保存雇员的工资信息。工资信息可能是与是保存在通常的数据库中,这样你就不需要两台机器和两个数据库服务软件包。即使你在一台服务中使用了两个完全独立的数据库,针对每个用户确定其访问数据库、数据表以及数据字段的权限还是很必要的。
而目前众多的数据库管理系统总是更习惯于将用户权限的管理完全交给Application来完成。而真正操作数据库的往往是诸如DBA这样的拥有超级权限的数据库用户。我不能说这样的系统就一定会出安全性问题,但是至少这种做法会带来有关安全性的隐患。对于数据库用户权限的设置,绝大多数成熟的数据库都提供了一种大同小异的做法。我们这里以Informix为例,仅仅是因为我在使用Informix时发现网上对于Informix的用户权限设置缺少详实的资料。希望这份文档能对Informix的应用者有所帮助(尽管现在Informix的市场占有率是出奇的低。)
有关我们的系统
我们使用的数据库数据服务器上的操作系统是SCO UNIX 5.05,数据库选用Informix 7.3。由于选用操作系统和数据库的不同,以下的操作可能会用细微的差别。
创建新用户
在我们使用的平台上,Informix的数据库用户对应于UNIX的系统用户,因此创建新用户的过程也就是创建UNIX系统用户的过程,我们可以用root登录后使用如下命令创建三个新的用户:
#useradd mydba
#useradd myuser1
#useradd myuser2
|
然后使用passwd给这三个用户设置相应的口令,我们可以看到由于我们的useradd命令没有采用完整的格式,因此这三个用户并不能真正用来登录到我们的UNIX主机,而只能作为数据库用户来使用。
数据库级别的用户权限
对于所有的有权使用(这里的有权使用可能意味着该用户只能浏览该数据库中某一数据表的某一字段)该数据库的数据库用户都必须赋予其数据库级别的用户权限。在Informix中,数据库级别的用户权限有三种,按权限的大小依次是connect、resource和DBA。
这是级别最低的一种数据库级别的用户权限。拥有该权限的用户可以执行select、insert、update和delete语句,针对数据表执行存储过程,创建数据表的视图,创建临时表(这样的临时表可以有索引,也可以没有索引)。
拥有该权限的用户除拥有connect的全部权限以外,他还可以创建新的表,并可以对它自己所创建的表执行alter和drop操作,并可以对这些表创建索引。
数据库的建立者和拥有者被自动赋予这种权限。拥有该权限的用户除拥有resource的全部权限以外,他还可以对其他用户赋予或解除connect、resource和DBA权限,可以对其它用户创建的表的视图执行drop和alter操作。甚至他还可以对数据库执行drop、start、stop和recover操作。
新数据库的建立并为各用户赋予相应的数据库级别的权限
使用有权登录到UNIX主机的用户创建一个新的数据库(create database databasename命令)。如上所述,现在该用户将对新创建的databasename数据库拥有DBA的权限。连接到这个库后,采用GRANT命令可以对其它用户赋予相应的数据库级别的权限。(事实上这是一个真正意义上的超级用户,换言之也是最危险的用户,在我们下面赋予了mydba以该表的DBA权限以后,我们将不再使用这个用户)。
赋予用户相应的数据库级别的权限的格式是:
于是,我们可以使用下面的三个命令给我们新创建的用户赋予相应的数据库级别的权限。
GRANT DBA TO mydba;/*赋予mydba以DBA的权限*/
GRANT CONNECT TO myuser1,myuser2;/*赋予myuser1,myuser2以CONNECT的权限*/
|
在这里,我们有必要介绍一个特殊的用户public,如果使用GRANT ... TO PUBLIC,这将意味着赋予所有用户某种权限,当然,这种做法也许并不可取。
用户数据库级别权限的解除
解除用户相应的数据库级别的权限的格式是:
对于拥有DBA、RESOURCE权限的用户,解除其相应的DBA、RESOURCE权限将自动将其降格为CONNECT权限。
而对于只拥有CONNECT权限的用户,解除其CONNECT权限实际上也就意味着删除该数据库用户。
示例:
REVOKE DBA FROM mydba;/*将mydba降格为CONNECT权限*/
REVOKE CONNECT FROM myuser1;/*解除myuser1对该数据库的访问权限*/
|
表级别和字段级别的权限
当一个用户访问数据库时,DBA可以限制其对指定表和表中指定字段的访问。任何resource级别或DBA级别的用户都可以创建表。表的拥有者或任何DBA级别的用户都可以对其它用户赋予或解除针对该数据表的表级别和字段级别的权限。这样的权限共有八种:insert、delete、select、update、references、index、alter和all。
该权限表示用户可以向表中增添新的数据。
该权限表示用户可以删除表中的数据。
该权限可以扩展到指定字段,表示用户可以查询表中的记录或指定字段。
该权限可以扩展到指定字段,表示用户可以修改表中的记录或指定字段。
该权限可以扩展到指定字段,表示用户可以针对表中的记录或指定字段制定参考性约束条件。参考性约束条件用来执行诸如多级删除和字段之间关联的工作。赋予该权限的用户应该首先至少是resource级别的用户。
该权限表示用户可以建立或删除与表有关的索引。赋予该权限的用户应该首先至少是resource级别的用户。一个connect级别的用户即使被赋予该权限也不能建立索引。该权限不能扩展到指定字段,这是因为索引是建立在表的所有行的基础上的。
该权限表示用户可以改变表的结构。所谓改变表的结构是指增加、删除和改变字段或改变字段的数据类型。该权限只能针对数据表。一般来说,只有对于具备数据库系统知识并知道如何保护数据库系统的人,我们才会赋予此项权限。
该权限包含上面的所有七种权限。
创建新表
使用mydba登录到数据库,并使用如下语句创建一个新的数据表:
CREATE TABLE customer_table (
customer_id char(2) not null,
balance decimal(16, 2) not null,
primary key(customer_id));
|
在创建新表后,系统将对public赋予该表All的权限。也就是说所有可以访问该数据库的用户都可以对该表执行select、insert、update和delete语句,这显然不是我们想要看到的。
用户表级别和字段级别权限的解除
解除用户相应的数据库级别的权限的格式是:
REVOKE 权限[,权限] [(字段名[,字段名])] ON 表名 FROM 用户名[,用户名]
|
我们首先需要解除public在该表上的All权限:
REVOKE ALL ON customer_table FROM PUBLIC;
|
其它示例:
REVOKE INSERT ON customer_table FROM PUBLIC;/*解除所有用户对该表的INSERT权限*/
REVOKE SELECT ON customer_table FROM myuser1;/*解除myuser1对该表的SELECT权限*/
REVOKE UPDATE (customer_id, balance)
ON customer_table FROM myuser1; /*解除myuser1对该表中customer_id, balance字段的UPDATE权限*/
|
用户表级别和字段级别权限的赋予
赋予用户相应的数据库级别的权限的格式是:
GRANT 权限[,权限] [(字段名[,字段名])] ON 表名 TO 用户名[,用户名]
|
我们赋予myuser1以更改该表中balance字段的权限:
GRANT UPDATE (balance) ON customer_table TO myuser1;
|
赋予myuser2以浏览该表的权限:
GRANT SELECT ON customer_table TO myuser2;
|
多种权限的同时赋予和解除
从上面的REVOKE和GRANT的格式,我们可看到,其实我们可以使用一条命令同时针对某一用户赋予或解除多种表级别或字段级别的权限。例如:
GRANT INSERT, DELETE, UPDATE ON customer_table TO PUBLIC;/*同时赋予所有用户对该表的INSERT、DELETE和UPDATE权限*/
GRANT SELECT, UPDATE (balance)
ON customer_table TO myuser2; /*同时赋予myuser2对该表中balance字段的SELECT和UPDATE权限*/
REVOKE INDEX, ALTER ON customer_table FROM myuser1; /*同时解除myuser1对该表的INDEX和ALTER权限*/
|
你也可以在一条语句中同时针对某一用户赋予或解除表级别和字段级别的权限,这时字段级别的权限使用指定的字段,而表级别的权限使用指定的数据表。例如:
GRANT INSERT, DELETE, SELECT, UPDATE (balance) ON customer_table TO myuser2;
/*同时赋予myuser2对该表的INSERT、DELETE权限以及对字段balance的SELECT和UPDATE权限*/
REVOKE INDEX, SELECT, ALTER (balance) ON customer_table FROM myuser1;
/*同时赋予myuser1对该表的INDEX、ALTER权限以及对字段balance的SELECT权限*/
|
其它关键词
在GRANT命令中,还可以使用其它两个关键词,首先是WITH GRANT OPTION关键词。在GRANT语句中使用这个关键词表示相关用户可以将同样的权限赋予其它用户。
在下面的示例中,myuser1不仅对customer_table具有insert、delete、select和update的权限,而且他可以将这些权限中的几个或全部赋予其它用户。
GRANT INSERT, DELETE, SELECT, UPDATE ON customer_table TO myuser1 WITH GRANT OPTION;
如果myuser1的权限中的一个或全部被解除,所有经myuser1授权的用户的相关权限也自动被解除。
另一个关键词是AS关键词。AS关键词允许你在执行一个授权时就象是在使用其它用户进行授权。而当这个用户的权限中的一个或全部被解除时,此次授权的用户的的相关权限也自动被解除。
回到我们上面的例子,myuser1已经被赋予了customer_table的insert、delete、select和update权限,并且可以对这些权限进行授权。一个DBA,数据表的拥有者或是给myuser1授权的用户可以扮演myuser1给其它用户授权:
GRANT INSERT, DELETE, SELECT, UPDATE ON customer_table TO myuser2 AS myuser1;
|
现在myuser2和myuser1具有了同样的权限。要同时解除两者的权限,只要解除myuser1的权限就行了:
REVOKE ALL ON customer_table FROM myuser1;
|
|