数据库安全专家面临的主要威胁之一就是如何消除推理功能。简单而言,推理就是从已知的信息推出新的信息,当用户能够在低的安全级别下进行数据拼凑从而推导出在高安全级别保护下的数据时,推理功能便构成了对数据库的严重威胁。我们最好还是通过实例来了解什么是推理吧。
假设你是一个军队交通运输系统的数据库管理员,你的数据库里有一份名为运输货物的数据表,包含了每条出货航班上大量的货舱信息。表中的每一行都代表了单次发货信息,并列出了发货的内容和航班号。航班号被其他的数据表交叉引用,以确定发货地、目的地、飞行时间和类似的数据。运输货物表内容如下:
航班号 |
货舱 |
货品 |
安全分类 |
1254 |
A A |
Boots靴子 |
Unclassified未分类 |
1254 |
B B |
Guns枪 |
Unclassified未分类 |
1254 |
CCC |
Atomic Bomb原子弹 |
Top Secret绝密 |
1254 |
D D |
Butter牛油 |
Unclassified未分类 |
假设赵将军(具有查看最高安全机密信息的权限)来要求查看关于1254航班运载的货物信息。赵将军将会看到所有四次发货信息。另一方面,小兵张三(没有查看最高安全机密信息的权限)也要了这份数据,不过他只能看到下面这个数据表:
航班号 |
货舱 |
货品 |
安全分类 |
1254 |
A A |
Boots靴子 |
Unclassified未分类 |
1254 |
B B |
Guns枪 |
Unclassified未分类 |
1254 |
D D |
Butter牛油 |
Unclassified未分类 |
上面的操作过程都正确贯彻了安全规则,禁止没有相应安全权限的人看到比他不应该看到的分类数据。然而,假设对于航班号和货舱的排列有一个不能重复输入信息的限制条件,这样可以避免把两次出货任务安排到同一个货舱。当小兵张三看到看到1254航班的C货舱没有安排任何货物时,他很可能试图为该航班插入一条运输蔬菜的新记录。不过,当他试图插入这条记录时,当唯一对应的限制条件起作用时,他的插入操作就会失败。这时,这个小兵张三完全可以根据上面这些数据来推理出1254航班上将要运送一批机密货物。然后,他可能会交叉引用航班信息表,找到这次秘密运输任务的发货地、目的地和其他更多信息。
这自然引出了一个问题:你要怎么做才能防止这种推理问题的发生?基本上,你有两个选择。第一,你可以把安全列纳入到唯一性的约束条件中。这种技术,我们称之为多实例(polyinstantiation),使同一张表格中的不同记录处于不同的安全级别上。这样小兵张三就永远不会知道最高机密运输任务的任何信息了。第二,你可以处理对货舱的双预约请求,把小兵张三要运的一卡车蔬菜就搁置在机场。第二个选择只是简单的保持表格的原样。小兵张三可能知道有一个安全分类的运输任务要执行,但不会有机会获取运输内容的任何信息。无论哪一个解决方案都很理想,但都要求对安全和实用之间的平衡做出某种意义上的取舍。