我已经使用 Linux 一段时间了,每当我输入时,sudo我都以为我正在切换到 root 用户来执行命令。
显然这不是真的,因为我需要的只是我的用户帐户的密码。我猜因为我没有与多个用户一起工作过,所以我在现实世界中并没有真正注意到这一点。
我不确定 Ubuntu 如何设置我的第一个帐户。有root用户吗?我是根吗?我猜我刚刚在安装时创建了一个新用户,但它给了我 root 权限?只是在这里有点困惑......
那么为什么我可以使用我的用户密码运行 root 命令呢?
我之前尝试过配置sudo,但我没有太多运气。它与 有什么不同su -l -c "x"?似乎通过配置文件,可以使用户只能访问某些命令等。我一直认为sudo这是将命令作为另一个用户或组的一种方式。由于像 Ubuntu 和 Mint 这样的发行版本质上通过密码让主用户轻松访问 root 来简化它,因此我不确定它的预期用途是什么。
如何将用户添加到 sudo 文件,授予他们仅在 root 下运行某些命令的权限?我也不想打开任何安全漏洞。
我一直认为“sudo”只是启动另一个登录过程,特别是使用“root”作为用户名并要求输入密码登录。运行某个程序后,它会结束并注销(或:保持打开的会话一段时间然后退出)。不知道我从哪里听说的,但这对我来说似乎是合理的。
但是现在我发现了这个 sudoers 选项:
ALL ALL = (root) NOPASSWD: /my/command
Run Code Online (Sandbox Code Playgroud)
这允许我以 root 身份从任何用户运行任何程序,而无需输入任何密码。这让我想知道:
这是如何运作的?程序如何获得用户权限?sudo 是否需要一个服务器(作为守护进程以 root 身份运行)并连接到该服务器,向它发送应该执行的内容并且该服务器以 root 权限执行它?
其他用户呢?
有什么好的和简单的解释这是如何工作的吗?
我试图了解用户权限在 Linux 中是如何工作的。内核init以 root 身份启动,对吗?然后 Init再次以 root 身份运行启动脚本并运行getty( agetty)。Agetty 只是读取用户名并运行login,我认为仍然以 root 身份运行。还没有什么有趣的。但是登录有什么作用呢?我找不到比“它尝试登录”更好的方法了。假设 login 发现密码匹配(并且我们尝试以普通用户身份登录),它如何更改用户 ID?我认为应该有系统调用,但我找不到它(也许我只是瞎了?)
另外,关于su。su设置了“setuid”位,所以当我们运行它时,它总是以 root 身份运行。但是当我们告诉它以普通用户身份登录时,它又需要更改用户 ID。难道我理解正确的话,同样的“神奇”发生在su和login当他们需要改变用户?如果是这样,为什么有两个不同的程序?运行登录时是否有其他类型的严重事务发生?
$ ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root 136808 Jul 4 2017 /usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)
sosudo可由任何用户运行,并且任何运行的用户都sudo将 root 作为进程的有效用户 ID,因为设置了 set-user-id 位/usr/bin/sudo。
来自https://unix.stackexchange.com/a/11287/674
sudo 和 su 之间最明显的区别是sudo 需要用户的密码,而 su 需要 root 的密码。
sudo要求提供哪个用户的密码?是进程的真实用户ID所代表的用户吗?
如果是,没有任何用户可以通过运行sudo然后提供自己的密码来获得超级用户权限吗?Linux 可以限制某些用户吗?
它是纠正sudo输入密码请求后 execve()开始执行main()的/usr/bin/sudo?
既然进程的euid已经改成root了(因为设置了/usr/bin/sudo的set-user-id位),那么后面sudo要求密码有什么意义呢?
谢谢。
我已阅读https://unix.stackexchange.com/a/80350/674,但它没有回答上述问题。
我有一种感觉setuid,nosuid挂载选项sudo,和su都与它们的名字相关。
但它们如何相互关联?
其中一些是否结合使用?
如果不是,那为什么他们的名字如此相似?
我正在努力为上述问题找到正确的原因。我的理解是:
sudo需要读取/etc/sudoers只有root才能读取的文件,这就是为什么它需要设置-UID rootsu将要创建一个具有不同真实有效 UID 的新 shell,并且需要检查密码。要检查密码,它需要读取/etc/shadow,这就是为什么它需要设置-UID root。检查密码后,它需要调用setuid()分叉进程,并且要使用任意UID参数,其父进程必须具有root作为有效UID,因此这也是另一个原因。以上理由是否正确?