Linux 受限的特权

点击访问 Linux 命令大全 >>

前面章节介绍了 su 命令提升到 root 权限,避免了输入 root 帐号和密码,这确实能让系统安全了不少。

但是,使用 su 命令提升到 root 用户后,将拥有 root 的所有权限。这不是我们所希望的,我们希望某些用户只拥有部分命令的执行权限。此时,sudo 命令就可以帮我们完成。

sudo 命令语法:

[snow@localhost ~]$ sudo --help
sudo - 以其他用户身份执行一条命令

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s]
            [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...

选项:
  -A, --askpass                 使用助手程序进行密码提示
  -b, --background              在后台运行命令
  -C, --close-from=num          关闭所有 >= num 的文件描述符
  -E, --preserve-env            在执行命令时保留用户环境
      --preserve-env=list       保留特定的环境变量
  -e, --edit                    编辑文件而非执行命令
  -g, --group=group             以指定的用户组或 ID 执行命令
  -H, --set-home                将 HOME 变量设为目标用户的主目录。
  -h, --help                    显示帮助消息并退出
  -h, --host=host               在主机上运行命令(如果插件支持)
  -i, --login                   以目标用户身份运行一个登录 shell;可同时指定一条命令
  -K, --remove-timestamp        完全移除时间戳文件
  -k, --reset-timestamp         无效的时间戳文件
  -l, --list                    列出用户权限或检查某个特定命令;对于长格式,使用两次
  -n, --non-interactive         非交互模式,不提示
  -P, --preserve-groups         保留组向量,而非设置为目标的组向量
  -p, --prompt=prompt           使用指定的密码提示
  -r, --role=role               以指定的角色创建 SELinux 安全环境
  -S, --stdin                   从标准输入读取密码
  -s, --shell                   以目标用户运行 shell;可同时指定一条命令
  -t, --type=type               以指定的类型创建 SELinux 安全环境
  -T, --command-timeout=timeout 在达到指定时间限制后终止命令
  -U, --other-user=user         在列表模式中显示用户的权限
  -u, --user=user               以指定用户或 ID 运行命令(或编辑文件)
  -V, --version                 显示版本信息并退出
  -v, --validate                更新用户的时间戳而不执行命令
  --                            停止处理命令行参数

sudo 程序接受命令作为参数,并以 root 身份(或者也可以是其他用户)执行它。在执行命令之前,sudo 命令首先需要用户输入口令(如果以 root 身份运行,则输入 root 的口令;如果以其他用户身份运行,则输入其他用户的口令)。处于安全性和方便性,sudo 口令只需要输入一次即可。如果太久没有使用sudo(一般为5分钟),则再次使用需要再次输入口令。

如果系统在刚刚安装好后,没有做任何 sudo 配置,则执行 sudo 将抛出如下错误提示:

[snow@localhost ~]$ sudo ls

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] snow 的密码:
snow 不在 sudoers 文件中。此事将被报告。

在使用 sudo 之前,管理员通过配置 /etc/sudoers 指定用户可以执行的特权命令,下面是 CentOS7 的 sudoers 文件的默认值。

[root@localhost snow]# cat /etc/sudoers
## 省略了
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

下面以“root    ALL=(ALL)       ALL”配置为例,这段配置指定 root 用户可以使用 sudo 在任何机器上(第1个 ALL)以任何用户身份(第2个 ALL)执行任何命令(第3个 ALL)。最后一行用“%wheel”替代了所有属于 wheel 用户组的用户。如下图:

下面来看一段稍微复杂的配置,该配置涉及 3 个用户,并为他们设置了不同的权限:

Host_Alias        STATION = web1, web2, databank
Cmnd_Alias        DUMP = /sbin/dump, /sbin/restore

lewis         STATION = ALL
mike          ALL = (ALL) ALL
john          ALL = (operator) DUMP

上面配置开头两行使用关键字 Host_Alias 和 Cmnd_Alias 分别定义了主机组和命令组。在配置文件后面,可以使用 STATION 替代主机 web1、web2 和 databank;用 DUMP 替代命令 /sbin/dump 和 /sbin/restore。

上面配置的最后三行配置了用户的权限。详细说明如下:

  • lewis         STATION = ALL”行设置 lewis 可以在 STATION 组的计算机上(web1, web2, databank)执行任何命令。由于在等号“=”后面没有使用小括号“()”指定用户,因此 lewis 将以 root 身份执行这些命令。

  • mike          ALL = (ALL) ALL”行设置 mike 用户在所有的计算机上可以运行任何命令。由于小括号“()”中的用户列表使用了关键字 ALL,因此 mike 可以用 sudo 以任何用户身份执行命令。sudo 命令可以使用 -u 选项改变用户身份。例如:sudo -u snow touch new_file

  • john          ALL = (operator) DUMP”行设置 john 可以在所有主机上执行 /sbin/dump 和 /sbin/restore 两个命令(必须以 operator 的身份执行)。为此,john 必须像下面这样使用 dump 命令。例如:sudo -u operator /sbin/dump backup /dev/sdb1

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号