一些大学讲义声称
在Unix系统中,操作系统中写入了一些功能只能由用户访问
root
:修改密码、访问用于通信协议的网络端口、与硬件交互等。
这个描述正确吗?这到底是在“操作系统”的哪里实现的?非root用户如果不能写,如何更改自己的密码/etc/passwd
?
据我所知,有像SELinux这样基于UNIX的系统,root用户没有无限的权力?
答案1
这个描述正确吗?
是的,也不是,这些陈述充其量是不完整的。更确切地说:
- 修改密码:用户可以修改自己的密码,但只能
root
修改其他用户的密码。这是通过 的访问权限强制执行的/etc/shadow
。该passwd(1)
二进制文件可以绕过权限,/etc/shadow
因为passwd
setuid 为root
,因此它可以获得root
写入权限/etc/shadow
。 - 访问通信协议使用的网络端口:只能
root
绑定1024以下的TCP和UDP端口,其他端口大家都可以绑定。这是由内核强制执行的。也只能root
使用原始套接字(特别是这就是为什么ping
需要设置uid才能root
运行)。但访问原始套接字的细节取决于操作系统,并且有时可以通过各种非标准 ACL 机制授予访问权限。 - 与硬件交互:原则上只有
root
进程可以向硬件发送原始命令。这主要是通过对设备的权限来强制执行的/dev
。然而,大多数系统都有允许用户绕过这些权限的机制,例如挂载 USB 磁盘、写入 CD、使用音频硬件等。
这到底是在“操作系统”的哪里实现的?
有一个由内核实现的权限系统。大多数操作系统都通过各种其他机制来补充该系统,例如 OpenBSD 的pledge
,或 Linux 的SELinux
.
据我所知,有像SELinux这样基于UNIX的系统,root用户没有无限的权力?
是的。
答案2
让我们回到最初的说法,因为我认为这里与 Linux 进行比较是不正确的,因为 Linux 不是 Unix。
Unix 上的 passwd 命令手册明确指出只有 root 可以使用该实用程序。
http://man.cat-v.org/unix-1st/5/passwd
同样,开放端口仅允许特权进程更改为某些端口。 sys/socket.h 是在 Unix 下定义的。 http://pubs.opengroup.org/onlinepubs/7908799/xns/syssocket.h.html
如下所述:
http://man7.org/linux/man-pages/man7/ip.7.html
这样做的权限相当于需要 root。
与硬件的交互稍微更广泛甚至模糊。但可能指的是 /dev/ 接口(例如 mknod)需要 root 权限。
所以这个说法基本上是准确的。