为什么会有 Root 权限?
因为我在开发程序时,发现即使是单用户系统,也要有用户名密码,这时这个唯一的用户就是 Root 用户了,而这时,我就要在程序里作硬编码处理,或在初次运行时输入(其实也要作硬编码处理),我觉得这样写的代码很难看。
其次多用户系统,拥有 Root 权限的用户会造成可怕的数据风险。
unix 的应用程序(区别于系统程序)都不应该用 root 用户的名义运行。
至于你说的硬编码,这是你自己写程序要处理的问题吧。一般来说你可以做成运行启动时配置,也可以做成编译时配置,这都是细节了~
我感觉我可能没有回答你的问题。但是,目前只能这样~
只要设计一把锁,就必然要有一个拿钥匙的人。
你看有了这个扳机,很不安全,或者有了这把钥匙,很不安全,但没有办法,现实就是不完美的,一切安全问题最终都会落到一个不完美的人类身上。
另外,便利与安全永远对立,想要多一点便利,就必然少一点安全。大多数情况下,客户、用户都会更看重便利性。
但是,一个数据库的 root 账户凭啥会影响到系统?
单用户程序,总得有一个标记用于指定用户的登录吧,这个标记在我看来,也是硬编码的一种。
一把锁上有多个钥匙孔,安全性提高了,理论上是一个更完美的产品,奈何缺少客户、用户的支持啊!
产品做出来,不是裱起来观赏的,要有人用才有价值。
用户、客户、老板的水平低,不重视安全,这是问题的关键所在,是他们让产品不能表现得又简洁又完美。一些非必要的 root 用户的出现,根源就是用户、客户、老板要求要有这个。
你说的这些理由虽然也是理由,但我认为在无 Root 的情况,也是可以解决的。
我只能说用 root 权限写入代码思路不对,或者说高控制代码应该分开写
当一个系统具有 root 用户权限时,应该同时也有普通用户权限,所以常用操作都应该以一般用户权限写,不创设普通用户而直接使用 root,是偷懒了
实际上未越狱的 Android, iOS 在对待应用程序(即把应用程序看作资源访问者)方面,其权限管理比较符合我的期望,但这两个操作系统,都是类 Unix 系统,并没有从根源上移除 Root 权限。NT 系统我不太了解,就你的描述,也是让用户主动授权给访问者吧,看起来也不错。
我们处在一个很奇怪的时代。不管是最新的手机还是最强大的后台集群,跑着的系统都是一个 40 多年前的 UNIX 的复刻+扩展版,还支持那个时代的 API. 我们当然都不是在用 UNIX 的方式去用系统了,我们不会去 fork 进程然后用 pipe 通信,而是发明了各种各样不见得就更好的并发和通讯方式 —— 然而内核还是要支持像 fork 这种超级 tricky 的系统调用。经典的系统体系早已崩塌,我们要么在废墟上架无数层抽象,要么像 epoll 一样在内核上打洞,而未曾建立一个新的系统体系,这有点像罗马帝国崩溃后的中世纪。
https://www.zhihu.com/question/53232010/answer/135346366
root 只是一个所有权限的总集,你总会需要一个“所有权限”的集合吧,而且这必须是一个有限集。
root 只是这个所有权限的集合的名字而已。
至于你说的硬编码,你无法避免硬编码所有权限吧?比如可读可写可执行这种。
新的 SoC 一般都有 TrustZone,敏感操作会放到这里执行。
这样说自然没错,但前提是,在有类继承关系的编程语言下才有效,以组合为主,如 Go, 或非面向对象的语言,如 Shell,则是无效的,因为前提就不成立了。
换回你说的,功能分为底层核心和上层应用这里,操作系统就一定要这么设计么?根据单一设计原则,我可以把做一个函数设计成一个接口,每个接口都是一个服务,每个服务都可以申请引用其他的服务,在这样的关系里,服务就是图形结构了,上下级关系便自然而然的消失了。
这里有两个时间点,A 时间点,Root 这个有限集里有 { “read”, “write”, “delete” } 权限。B 时间点,Root 有限集里有 { “read”, “write”, “delete”, “exec” } 权限。当一个用户在 A 时间点获得 Root 权限后,到了 B 时间点,他就会自动获得 exec 权限。
这样做合理么?为什么呢?
一个业务系统,你可以把管理权限的权限作为一个一般资源,最初的系统管理员可以只是拥有管理权限的权限的一般用户。系统管理员的权限的配置可以通过直接往数据库写入特定的数据来实现。即使错配,也可以通过操作数据库来修正,没啥大不了的。所以 admin 和 user 也没必要两张表,即使 2 张表,该有的问题还是少不了。除非代码写一个超级管理员。我见过很多这种上帝模式的超级管理员,但我认为这就是个超级大后门,弊大于利,不推荐。
但一个操作系统则不行,root 权限必须是先天的,而非可配置的。因为如果错配导致丢失了配置的权限,就没办法通过配置来修复,只能重装系统。这显然不符合我们的预期。
现在的状况,就跟我在 如何评价 Midori ( Operating System )?里写的一样,现在大家只是把 Linux 当成一堆跑在内核态写得巨烂但又勉强能用的底层代码,上面一个深受 Plan 9 影响的 Linux namespace+cgroups container 环境,再上面是 Plan 9 风格的系统抽象和 linux 库+protobuf+stubby 的实现。很不幸,我感觉我们会长期处在这个状态。
https://www.zhihu.com/question/19706063/answer/763200196
一个系统如果想完成自我指涉,那么自我指涉这个代词对象就是 root
类似 this-> operation
操作系统需要一个 get_self_user() -> operation
如果一个系统运行完全不需要自指,那自然不会需要 root 和类似的超级权限
但不需要自指的系统是否是完备的,我 get 不到那层逻辑
#59 说的跟我想表达的很像
但我存在另一个疑问(可能也是 lz 的疑问),为什么自指是必要的,或者什么样的系统是必须能自指的。不知道有没有相关解答
其实完全可以将系统设计成无初始用户,无需硬编码超级用户的样子。但这样的系统初始化时就需要你用其它手段从外部往它的数据库里写一个新用户进去,也就恰恰说明了这个系统是不完备的——这个系统不能只通过系统自己完成所有功能,比如初始化,因此它不完备。
但这种完备性并不是这个系统的必要指标,完全能接受装机时通过另一个程序来生成初始状态,所以这个时候也的确并不需要 root