- 论坛徽章:
- 3
|
回复 8# kerryxi
我觉得你可以搞混了。 MLS是属于MAC机制,不属于DAC机制。 DAC本身就没有安全级别这一说。它只由文件拥有者决定其他用户的权限(当然root用户是个特例)。
SELinux起源于自1980年开始的微内核和操作系统安全的研究,最终形成一个叫做分布式信任计算机(Distribute Trusted Mach(DTMach))的项目。美国过安全局的研究组织参与了DTMach项目,付出了巨大努力,并且参与了大量的后续安全微内核研究。最终,这些工作和努力导致了一个新项目的诞生,那就是Flask。
MLS只定位于数据保密性而并不关心数据完整性和最小权能原则(Least Privilege),以及对进程的能力进行分类.
我从资料上看到,MLS远在80年代就开始研究了,比SELinux, FLASK要早得多。开始针对于对进程能力进行分类,应该是FLASK架构的出现。 所以我觉得MLS是最初通过和DAC配合一起实现的。当然只是我的猜想。
如果你系统上使用的安全策略打开了MLS选项,你查看进程或者是文件的security context应该是这种形式:
system_u:object_r:bin_t:s0 ---- s0就是和MLS有关的敏感度。
Reference policy打开MLS的选项在源码树/build.conf中。
至于安全级别的实现可以查看这个函数:
security/selinux/ss/context_struct_compute_av()
649 avkey.target_class = tclass;
650 avkey.specified = AVTAB_AV;
651 sattr = flex_array_get(policydb.type_attr_map_array, scontext->type - 1);
652 BUG_ON(!sattr);
653 tattr = flex_array_get(policydb.type_attr_map_array, tcontext->type - 1);
654 BUG_ON(!tattr);
655 ebitmap_for_each_positive_bit(sattr, snode, i) {
656 ebitmap_for_each_positive_bit(tattr, tnode, j) {
657 avkey.source_type = i + 1;
658 avkey.target_type = j + 1;
659 for (node = avtab_search_node(&policydb.te_avtab, &avkey);
660 node;
661 node = avtab_search_node_next(node, avkey.specified)) {
662 if (node->key.specified == AVTAB_ALLOWED)
663 avd->allowed |= node->datum.data;
664 else if (node->key.specified == AVTAB_AUDITALLOW)
665 avd->auditallow |= node->datum.data;
666 else if (node->key.specified == AVTAB_AUDITDENY)
667 avd->auditdeny &= node->datum.data;
668 }
669
670 /* Check conditional av table for additional permissions */
671 cond_compute_av(&policydb.te_cond_avtab, &avkey, avd);
672
673 }
674 }
675
676 /*
677 * Remove any permissions prohibited by a constraint (this includes
678 * the MLS policy).
679 */
680 constraint = tclass_datum->constraints;
681 while (constraint) {
682 if ((constraint->permissions & (avd->allowed)) &&
683 !constraint_expr_eval(scontext, tcontext, NULL,
684 constraint->expr)) {
685 avd->allowed &= ~(constraint->permissions);
686 }
687 constraint = constraint->next;
这个函数是内核用来检测是否有个授权规则是否存在(也就是一次存取操作是否合法)。
655-668行就是检测 是否存在匹配source type/targe type/class/permission的allow规则
如果匹配,还需要经过constraint的检测。 constraint权力比allow大,即使你定义了allow规则,允许init_t域访问bin_t类型的文件,
但constraint禁止了,allow规则就无效了。
constraint的信息来源于policy language的constraint语句和mls_constraint(顾名思义,这个就和MLS有关).
安全级别的检测就是通过mls_constraint语句实现的。
|
|