跳转至

思考题解答

nobody 用户

提示

我们提到,为什么要对网络服务创建用户?

解答

所有的网络服务放在同一个用户来执行显然是不明智的选择:如果有一个服务被攻击,那么其他同用户的服务也同时会被攻击者控制。

系统用户的默认 Shell

提示

尝试执行一下系统用户的 Shell,可以看到什么?

解答
$ /usr/sbin/nologin
This account is currently not available.
$ /bin/false
$ echo $?
1

以它们作为系统用户的默认 Shell,也就实现了「无法登录」的效果,提高了系统用户的安全性。以下是一个能够说明其「安全性」的例子:

假设某个(运行在某系统用户上的)服务被攻击者发现可以任意以某系统用户的权限写入文件。假设 SSH 开启,攻击者可以把自己的公钥写入 ~/.ssh/authorized_keys,然后使用自己的私钥登录此用户,得到 shell。

但是,如果系统用户的 shell 设置为了 /usr/sbin/nologin 或者 /bin/false,那么即使发生了这种情况,攻击者也无法使用 SSH 连接到 shell,或者执行其他命令。这就提高了系统的安全性。

启用 root 用户

解答

/etc/shadow 第二列(记录密码哈希的那一列)的 !* 表明这个用户不允许使用密码登录。那么我们再用 passwd 设置个密码就可以了。

如果要重新禁止使用密码登录 root 用户的话,passwd -l root 即可。

文件的可执行权限

解答

可以被执行,但是执行显然会出错。Linux 下的可执行文件一般有两类:第一类是 ELF 二进制文件,它的文件开头的十六进制是 7F 45 4C 46(这一串有特征的字符被称为「文件标识 (Signature)」,方便程序判断文件的格式信息);第二类是脚本,脚本的开头一般有 #! (Shebang) 标明文件由什么程序解析。

显然,Linux 不会认为一个 MP3 音频文件是 ELF(文件标识不一致),也不是脚本,那么直接执行,就会报出 cannot execute binary file: Exec format error 的错误。

sudo cd?

提示

cd 是一个「程序」吗?

解答

如果你真的去执行 sudo cd,那么会看到:

$ sudo cd a
sudo: cd: command not found

这是因为,cd 是 shell 的内建命令,而不是某个具体的程序,而 sudo 的功能,是以其他用户 (一般是 root) 的身份执行程序。

那么 cd 可以实现成(外置的)程序吗?答案是不能:因为切换工作目录的系统调用 (chdir()) 只能切换当前的程序的工作目录。如果实现成了外置的程序,那么切换完退出之后,shell 的工作目录仍然不会变化。