在发现几个常用命令(例如read)实际上是 Bash 内置命令(并且在提示符下运行它们时,我实际上正在运行一个两行的 shell 脚本,它只是转发到内置命令),我想看看是否相同对于true和是真的false。
好吧,它们绝对是二进制文件。
sh-4.2$ which true
/usr/bin/true
sh-4.2$ which false
/usr/bin/false
sh-4.2$ file /usr/bin/true
/usr/bin/true: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=2697339d3c19235
06e10af65aa3120b12295277e, stripped
sh-4.2$ file /usr/bin/false
/usr/bin/false: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=b160fa513fcc13
537d7293f05e40444fe5843640, stripped
sh-4.2$
Run Code Online (Sandbox Code Playgroud)
然而,我发现最令人惊讶的是它们的大小。我希望他们只是每一字节数,因为true基本上是exit 0和false是exit 1。
sh-4.2$ true …Run Code Online (Sandbox Code Playgroud) 在我的/etc/passwd文件中,我可以看到www-dataApache 使用的用户,以及各种系统用户,都拥有/usr/sbin/nologin或/bin/false作为他们的登录 shell。例如,这里是选择的行:
Run Code Online (Sandbox Code Playgroud)daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin syslog:x:101:104::/home/syslog:/bin/false whoopsie:x:109:116::/nonexistent:/bin/false mark:x:1000:1000:mark,,,:/home/mark:/bin/bash
因此,如果我尝试切换到这些用户中的任何一个(有时我想这样做以检查我对他们权限的理解,并且可能还有其他至少一半合理的原因),我失败了:
mark@lunchbox:~$ sudo su www-data
This account is currently not available.
mark@lunchbox:~$ sudo su syslog
mark@lunchbox:~$
Run Code Online (Sandbox Code Playgroud)
当然,这并没有太大的不便,因为我仍然可以通过这样的方法为他们启动一个shell:
mark@lunchbox:~$ sudo -u www-data /bin/bash
www-data@lunchbox:~$ Run Code Online (Sandbox Code Playgroud)
但这只是让我想知道拒绝这些用户登录 shell 的目的是什么。环顾互联网寻求解释,许多人声称这与安全性有关,并且每个人似乎都同意更改这些用户的登录外壳在某种程度上是一个坏主意。以下是引用的集合:
将 Apache 用户的 shell 设置为非交互式通常是一种很好的安全实践(实际上,所有不必以交互方式登录的服务用户都应该将其 shell 设置为非交互式)。
-- https://serverfault.com/a/559315/147556
用户 www-data 的 shell 设置为 /usr/sbin/nologin,这是有充分理由的。
-- https://askubuntu.com/a/486661/119754
[系统帐户]可能是安全漏洞,特别是如果它们启用了 shell:
坏的
Run Code Online (Sandbox Code Playgroud)bin:x:1:1:bin:/bin:/bin/sh好的
Run Code Online (Sandbox Code Playgroud)bin:x:1:1:bin:/bin:/sbin/nologin
-- https://unix.stackexchange.com/a/78996/29001
出于安全原因,我创建了一个没有登录 shell …
如果用户loginShell=/sbin/nologin仍然可以
ssh user@machine [command]
Run Code Online (Sandbox Code Playgroud)
假设用户在其主目录中有适当的 ssh 密钥可用于进行身份验证?
我的目标是保持用户作为 nologin,但仍然能够在网络上的其他几台机器上执行命令(类似于通过 'sudo -u' 使用),我想知道这是否是一个合理的过程。
为了防止滥用 root 帐户(在我的 macOS 上,单用户)机器上,我是否应该始终将rootshell设置为/usr/bin/false(或/sbin/nologin)?
例如,我应该总是:
sudo /usr/bin/dscl . -create /Users/root UserShell /usr/bin/false
Run Code Online (Sandbox Code Playgroud)
或者是否有不这样做的常见原因(除了明显和可避免的)?
如果您使用在 Arch Linux 上创建一个没有主目录的用户useradd -M test,则会在 中创建如下所示的条目/etc/passwd:
test:x:1001:1001::/home/test:/bin/bash
Run Code Online (Sandbox Code Playgroud)
但因为/home/test不存在,这会导致shadow.service失败。将主目录留空会产生相同的错误。我发现一个旧线程建议使用/dev/null,但我不确定这是否是最好的解决方案。ATM,忽略它似乎是最好的解决方案,但也许还有更好的方法。
shadow.service归结为pwck和grpck:
### [...]
ExecStart=/bin/sh -c '/usr/bin/pwck -r || r=1; /usr/bin/grpck -r && exit $r
### [...]
Run Code Online (Sandbox Code Playgroud)