超级用户不能侵犯哪些访问权限?


23

神父 Br。乔治在他的一次演讲中(用俄语)告诉人们,有些访问权限是超级用户不能侵犯的。那就是有些访问权限可以禁止超级用户做某事。

我无法在Internet上找到此信息,并且很好奇它们是什么。这可能与系统的核心执行有关,不是吗?也许他无法停止某些系统进程?也许他不能在实模式下运行进程?

这个问题与SELinux没有关系(George在问题之前就在谈论它)。


2
“特权”或“许可”是做某事的权利,可以授予特定用户帐户的权利。在UNIX和Linux(不包括SELinux之类的强化版本)中,root具有所有权利。没有授予的root权利,因此也没有可以剥夺的权利root
MSalters 2015年

1
@MSalters,对不起?人们当然可以保持UID 0,同时仍然取消进程功能。
查尔斯·达菲

... set SECBIT_NOROOT和uid 0不再自动授予一项功能。
查尔斯·达菲

这么多的答案-将其转变为社区Wiki是否有意义,还是应该有人编写摘要答案?
西蒙·里希特

1
@SimonRichter我也将以George的身份告诉我们他在演讲中的意思。
Kolyunya

Answers:


24

拒绝root

root可以拒绝直接网络访问。这在连接Internet的主机上非常有用,因为它要求您先输入smith,然后按sudo

某些根目录无法执行的操作

这不是缺乏特权。我看不到root不能做的任何事情,但是某些技术问题可能会被视为“禁止”。

我是root用户,为什么我不能创建/删除此文件,而普通用户却可以?

您正在使用NFS / samba共享,并且没有提供特定的(access=)授权。普通用户无法遵循普通法。(请参见下面的本地根目录与远程根目录)

我是根,为什么我不能杀死这个过程?

有一个暂挂的I / O,并且物理驱动器/远程LUN已断开连接,只能通过重新引导杀死进程。

我是root,如何获取始祖密码?

您可以在su - archemar不知道前一个密码的情况下更改它的密码,也可以更改它的密码,但是您无法读取它(缺少按键记录器),因为密码是使用单向哈希值存储的。

本地与远程根

  • 您可以以您的工作站/ PC为根,并使用公司/学院/大学/提供商NFS共享。
  • 接下来,您只能在导出NFS的计算机上具有非root用户登录名。

现在

cp /bin/bash /nfs/home/me/bash
chown root /nfs/home/me/bash
chmod u+s /nfs/home/me/bash

只需登录NFS服务器./bash并运行,您便是公司/大学服务器的超级用户。


情况1基本上是一个错误,因为您只是root本地用户,不一定在其他系统上。情况2和3不是特权(它们不能授予任何人)。因此+1,您的第一句话似乎是正确的。
MSalters 2015年

从技术上讲,root在本地计算机上可以执行任何与本地用户相同的特权的操作,su - username即使没有其他操作。我永远无法确定为什么他们会烦于root无法写入这样的网络共享;似乎毫无意义。
汤姆·亨特

4
这是一个古老的问题,“ root即使他无法访问也可以创建密码吗?”
corsiKa 2015年

5
@TomHunt,不授予root对NFS共享访问权限的原因之一是,防止在远程服务器上创建“ suid root”二进制文件,这可以用于对服务器的完全远程访问。
2015年

1
在我看来,在不间断的等待中终止进程似乎并不正确。这是您做不到的。就像写一个完整的文件系统。
Blacklight Shining 2015年

11

在通常情况下,这是不正确的-超级用户具有系统提供的任何功能的特权/权限(1)。当您将SELinux投入使用时,该规则就失效了。使用SELinux,甚至可以限制root的特权以禁止某些操作。但是,不允许的特定操作在很大程度上取决于本地计算机的SELinux配置,因此即使使用SELinux,也无法从一般意义上回答此问题。

(1)-如果系统未提供给定功能,例如,没有实时内核功能,那么我认为“ root无法访问此功能”语句是错误的,因为该语句依赖于错误的假设(即该系统上的任何人都可以使用该给定功能)


1
约翰,谢谢您的回答!但他明确表示,这个问题与SELinux不相关...
Kolyunya 2015年

然后,除非另有详细说明,否则我将不得不考虑root不能访问某些功能这一说法是错误的。(我不考虑通过BIOS安全性将操作系统锁定在BIOS或类似系统之外的情况。)
约翰·约翰·约翰(John John

您还具有根控制SELinux配置的复杂性。如果我(以root用户身份)被阻止执行某项操作,则可以修改SELinux以允许该操作,然后再将其更改回。可能会消失,具体取决于日志记录的存储位置。
doneal24

2
不一定正确。带走它的CAP_NET_ADMIN,并且uid 0仍然不允许进程更改网络配置。(与CAP_SYS_ADMIN及其控制的功能类似)。
查尔斯·达菲

5

一方面,有些事情是用户无法做的,例如

  • 硬链接目录(由于文件系统限制)
  • 写入已刻录的CD-ROM(由于物理原因)

但是这些不是特权,因为不能授予它们,对任何人来说都是不可能的。

然后,整个系统或其中部分可以打开或关闭的限制。
例如,在OS X上,有一个选项仅在Apple签名后才允许运行代码。

我也不认为这是实际的特权,因为如果超级用户不能,则没有用户可以拥有它。您只能全局禁用它。

编辑:
您对没有可执行位的文件的想法也将属于此类别,因为从字面上看,没有人能够做到这一点,并且没有人可以被授予该权限。
即使授予其他用户或组执行该文件的权限,但没有root或用户组root所在,root也仍然能够执行该文件(在OS X 10.10、10.11和Ubuntu 15.04服务器上测试)。

除了这些情况,root几乎无法做任何事情。
但是,有一种叫做内核模式(与用户模式相对)的东西。

据我所知,在健全的系统上,只有内核,内核扩展和驱动程序以内核模式运行,而其他所有内容(包括您以root用户身份登录的shell)都以用户模式运行。
因此,您可能会争辩“仅仅扎根是不够的”。但是,在大多数系统上,root用户能够加载内核模块,而内核模块又将以内核模式运行,从而有效地为root提供了一种以内核模式运行代码的方式。

但是,在某些系统(如iOS)中,这是(任意)不可能的,至少在没有充分利用安全性的前提下。这主要是由于提高了安全性,例如强制执行代码签名。
例如,iDevices的处理器内置了AES加密密钥,只能从内核模式访问。内核模块可以访问这些模块,但是这些内核模块中的代码也必须由Apple签名,以使内核能够接受它们。

在OS X上,从10.11版开始(El Capitan),还有一个所谓的“无根模式”(尽管名称具有误导性,因为root仍然存在),它实际上禁止root进行某些安装程序仍然可以执行的操作。
引用关于AskDifferent的一个很好的答案

这是它的限制,甚至从根本上也是如此:

  • 您不能在/ System,/ bin,/ sbin或/ usr中修改任何内容(/ usr / local除外);或任何内置的应用程序和实用程序。只有安装程序和软件更新才能修改这些区域,甚至只有在安装Apple签名的软件包时才可以进行修改。

1
实际上,您可以在不设置执行位的情况下运行可执行文件:gcc -o hello hello.c && chmod 400 hello && /lib64/ld-linux-x86-64.so.2 ./hello提供预期的Hello, World!输出,
doneal24

@ DougO'Neal但是不是/lib64/ld-linux-x86-64.so.2真正的可执行文件,./hello只是它的一个参数?因为这就像将包含PHP代码的文本文件传递给PHP解释器...或像使用bash ./my_script... 运行bash脚本一样
Siguza 2015年

1
@ DougO'Neal曾经可以使用,但是在最新版本的glibc中被禁用(以防止它成为noexec挂载的琐碎旁路)。
2015年

@duskwuff glibc最近版本是什么?在Ubuntu 14.04下仍然可以使用。
doneal24 2015年

1
Apple没有将其添加到ln,但是ln使用的系统类(例如链接)允许此操作,请参见stackoverflow.com/a/4707231/151019。这是Time Machine的工作方式
user151019 2015年

4

您提到的“系统核心执行”处于root的控制之下,例如通过可加载的内核模块。当然,这是假设内核支持加载内核模块,没有人可以执行甚至不可行的操作root

系统进程也是如此。root允许杀死任何进程,但是在不损害内核完整性的情况下不可能停止在内核模式下运行的进程,因此立即停止此类进程根本是不可行的。请注意,root不会拒绝杀死这些进程,杀死自身不会产生任何效果。

最后,实模式:Linux内核不支持它,因此,再也没有人能做到,甚至没有root

@Siguza提到了x未经许可执行文件的情况,这对于root用户来说是完全有可能的:

/lib/ld-linux.so.2 /path/to/executable

...但是uid-0进程可能会/proc/kmem通过功能撤销而失去加载新内核模块(或通过进行热修补)的能力。
查尔斯·达菲,2015年

4

一个例子可能是不可变的文件的修改:您可以设置文件属性ichattr使文件不可变的,甚至根。例如:

# whoami
root
# touch god
# chattr +i god
# rm god
rm: cannot remove ‘god’: Operation not permitted
# touch god
touch: cannot touch ‘god’: Permission denied

请注意,该文件在ls -l输出中显示为普通可写文件:

# ls -l god
-rw-r--r-- 1 root root 0 Oct 26 19:27 god

要查看该i属性,您必须使用lsattr

# lsattr god
----i----------- god

chattr手册页指出有关该i属性的内容:

具有“ i”属性的文件无法修改:无法删除或重命名,无法创建与此文件的链接,也不能向该文件写入数据。只有超级用户或拥有CAP_LINUX_IMMUTABLE功能的进程才能设置或清除此属性。

但是,root可以轻松撤销不变性:

# chattr -i god
# rm -v god
removed ‘god’

Linux内核不再正确地实现BSD安全级别功能,从而使您在不可变属性和仅附加属性上的收益减少。使用securelevel时,一旦系统处于多用户运行级别,就无法重置这些位,因此管理员将不得不关闭并使用本地控制台,这将阻止网络攻击者。
西蒙·里希特

2

在FreeBSD gmirror上,即使在root用户下也不能在已安装的分区上使用:

gmirror标签-v -b更喜欢gm0s1 ad4s1
gmirror:无法在ad4s1上存储元数据:不允许操作。

您必须设置sysctlkern.geom.debugflags=16)才能执行此操作。

root是特权用户,但这些权限由内核赋予。因此,内核拥有比特权更多的特权root


1

假定来自根用户本身的协作root可以防止访问FUSE挂载(使用allow_otherallow_root选项),但这是因为FUSE设计为以这种方式工作。由于FUSE驻留在虚拟层上,因此它可以基于逻辑返回它喜欢的任何错误,这与那些力求尽可能透明和精简的通用块设备模块相反,将权限委派给另一层。

这不会阻止root用户禁用该选项,或者用一个静默丢弃该选项的FUSE模块替换FUSE模块,除非您将文件系统设为只读。但是,这只会导致“看守谁的人”的情况:您如何验证系统没有在说谎?您的shell甚至可能坐在chroot中,该chroot向您显示一个合法的FUSE模块,而内核实际上正在运行它的恶意版本。


0

我要说的是,无法执行不可执行的文件是一个有限的限制,因为它取决于文件的权限。(可以使用/lib64/ld-linux-x86-64.so.2来处理不可执行的文件,但不能执行非执行挂载的文件来解决此问题)

还存在强制性文件锁定的问题,尽管超级用户可以杀死该进程,但是如果某个进程当前正在使用文件,则该文件将阻止文件编辑。

曾经,超级用户无法在设备繁忙时卸载该设备,但是现在可以使用惰性umount来完成。

其他限制包括:

无法修改不可变文件,并且只能追加到仅追加文件中(Linux允许超级用户在任何运行级别删除不可变且仅追加标志,但是在一定程度上破坏了它们的用途)

无法写入只读安装,或在无执行安装上执行任何操作

无法绑定不可绑定的安装

如果其块设备为只读,则无法将文件系统重新挂载为可读写

除非其他用户拥有的保险丝座上安装了allow-other或allow-root,否则无法声明任何内容

不能违反SELinux设置

系统本身固有的故意限制,这些限制会影响根:

无法直接设置文件的c时间(或生日,如果已实现)

无法以纯文本形式查看密码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.