1. 问题复现:明明有“x”权限,为何还是“权限不够”?
很多刚接触银河麒麟操作系统的开发者,包括我自己在内,都踩过这个坑。你兴致勃勃地写了个“Hello World”,用 gcc 编译,生成的可执行文件 a.out 明明显示着 -rwxrwxr-x,那个醒目的 x 就代表可执行权限,对吧?结果满怀期待地输入 ./a.out,终端却冷冰冰地甩给你一句:bash: ./a.out: 权限不够。
那一刻的困惑和挫败感,我太懂了。你会下意识地检查权限,用 ls -l 看了又看,甚至怀疑是不是自己眼花了。接着,你可能会尝试 sudo chmod +x a.out,或者直接用 sudo ./a.out 来运行。但你会发现,即使使用 root 权限,这个错误依然存在。这就奇怪了,在传统的 Linux 发行版里,这几乎是不可能发生的事情。文件有执行权限,用户有足够权限,凭什么不让执行?
这正是银河麒麟操作系统引入的 Kysec(麒麟安全)机制 在“作祟”。它是一套在传统 Linux 自主访问控制(DAC,就是我们熟悉的 rwx 权限)之上,额外增加的一层强制访问控制(MAC)。你可以把它理解为你家小区的门禁系统。传统的 rwx 权限就像是你家的门锁,你有钥匙(权限)就能进。而 Kysec 就像是小区大门的人脸识别闸机,即使你有家里的钥匙,如果闸机系统不认识你(你的程序不在它的白名单里),你也进不了小区大门,更别提回家开门了。
所以,当你遇到“权限不够”的报错时,首先要明白:问题很可能不在传统的文件权限上,而在于 Kysec 安全标记(label)没有放行。这个安全标记是文件的一个扩展属性,它决定了文件是否被 Kysec 机制信任为可执行。我们自己编译生成的程序,在 Kysec 看来,属于“外来文件”,默认是不被信任的,因此即使有 x 权限也会被拦截。
2. 深入原理:Kysec 安全机制到底在保护什么?
要解决问题,不能只知其然,更要知其所以然。Kysec 机制的设计初衷是为了提升系统的安全性,特别是在一些对安全有较高要求的场景中。它主要对四类文件进行管控:可执行程序、脚本文件、共享库(.so文件)和内核模块。
这套机制的核心逻辑是“白名单”制度。系统在出厂时,会为所有预装的可信软件(如系统自带的 ls、bash、gcc 等)打上受信任的安全标记。任何在此之后通过拷贝、下载、移动,或者像我们这样自己编译生成的文件,都不会自动获得这个标记。Kysec 会在程序执行的最后一道关卡——execve 系统调用时——检查这个安全标记。如果标记不符合要求,即便前面的所有权限检查都通过了,内核也会拒绝执行,并返回“权限不够”的错误。
Kysec 的安全标记主要包含几个部分,其中与我们当前问题最相关的是 exectl(执行控制) 部分。这个部分可以标记文件的“出身”和可信等级,常见的值有:
unknown: 未知文件,默认状态,不允许执行。original: 原始系统文件,最高信任。</

425

被折叠的 条评论
为什么被折叠?



