为什么 root 用户所在的群组叫 wheel?
在 Unix 中 root 用户所属组就是 wheel
在 Unix 系统(例如:常见的 macOS 和 FreeBSD),root
用户所在的组称之为 wheel
:
id root
uid=0(root) gid=0(wheel) groups=0(wheel)
Wheel 来源于 “big wheel” 这个俚语,指有强大 “威力” 或 “影响力” 的人。随之而来的就是 TENEX 操作系统发明了 wheel bit,一个允许处理器做一些限制性的操作的“特权 bit”。Unix 操作系统则在上世纪八十年代引入 wheel,这就是为什么 root 用户所在的组称之为 wheel 的来历。
参考资料: Wheel (computing)。
Wheel 组概念
Wheel 组是 Unix 系统一个遗留物。当服务器需要做比日常例行维护更高级的工作的时候,就经常需要用到 root 权限了。而这个 wheel 组就是建立用来归纳一些特殊的系统用户用的,这其中的用户都或多或少地拥有 root 的部分功能和权限。也就是说如果你不是 wheel 组成员,那就没有 root 身上任何的特权。也因为这样,使用 wheel 组成员用户的话,会尽量减少对系统 “摧毁性” 破坏的概率和风险。如今大多数的 Linux 发行版本中 (sysin),仍然保留了 wheel 这个组,虽然它已经不像当初设计出来的那样必要了,但是有些老玩家还是忠于这种旧式经典风格的,所以他们经常还是依旧让 wheel 组发挥着以往的作用。他们是这样做的:在建立他们自己的用户时,将其添加入 wheel 组中(用 wheel 组作为用户的主组),或者使用 vigr 来编辑 /etc/group 文件,将他们的用户名追加到 wheel 组那行的末尾。
但是在 Linux 各发行版中有所差异。
实际上 Debian 系发行版,包括 Ubuntu 等,并没有 wheel 组。wheel 组主要存在与 Redhat 系发行版(RHEL/Fedora/CentOS)中。
简单的说,在 Linux 上 root 账号所属的组是 root,并不是 wheel,部分 Linux 发行版使用 wheel 组获取 root 权限是通过 sudo 配置实现的,以下会有详细描述。
CentOS 中的 wheel 组
注:这里的 CentOS 也适用于其他 Redhat 发行版,下同。
root GID 为 0,Wheel GID 为 10,不同于 Unix 中 Wheel GID 为 0.
id root
uid=0(root) gid=0(root) groups=0(root)
cat /etc/group | grep wheel
wheel:x:10
将新建用户加入到 wheel 组中即可获得 root 权限,即通过 sudo 命令执行 root 权限的操作(默认需要输入当前用户的密码):
usermod -G wheel sysin #一般使用 -G 修改附加数组即可
Ubuntu 中没有 wheel 组
注:这里的 Ubuntu 也适用于其他 Debian 系发行版,例如 KALI 等。
Ubuntu 中并没有 wheel 组,使用 sudo 组替代(可以理解为),GID 为 27。
cat /etc/group | grep sudo
sudo:x:27:
将新建用户加入到 sudo 组中即可获得 root 权限,即通过 sudo 命令执行 root 权限的操作(默认需要输入当前用户的密码):
usermod -G sudo sysin #一般使用 -G 修改附加数组即可
创建管理员账号的正确姿势(默认配置)
在 visudo (/etc/sudoers)默认配置下,创建管理员账号的命令如下:
CentOS:
useradd -m -s /bin/bash -G wheel sysin #sysin 为用户名
passwd sysin #为 sysin 设置密码
Ubuntu:
useradd -m -s /bin/bash -G sudo sysin #sysin 为用户名
passwd sysin #为 sysin 设置密码
备注:
-m 创建同名 home 目录
-s 指定 shell
-G 修改附加属组
Linux 添加 root 权限用户的方法详解
测试环境:CentOS 8,Ubuntu 20.04
添加用户,首先用 adduser 命令添加一个普通用户,命令如下:
adduser sysin #添加一个名为 sysin 的用户,交互提示
## 或者使用 useradd 命令
useradd -m -s /bin/bash sysin
passwd sysin
# -m:自动建立用户的登入目录
# -s:指定用户登入后所使用的 shell
赋予 root 权限可以分别使用以下方法:
方法一:使用系统默认组权限(推荐)
wheel 组适用于 CentOS,Ubuntu 中并没有 Wheel 组。
- CentOS
修改 /etc/sudoers 文件(或者使用命令 visudo),找到下面一行,把前面的注释(#)去掉(现在已经是默认配置,无需修改):
直接使用命令
visudo
或者vi /etc/sudoers
,保存时使用 x! 覆盖,或者添加写入权限chmod +w /etc/sudoers
修改完毕恢复权限chmod -w /etc/sudoers
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
# CentOS 8 中已经默认
然后修改用户,使其属于 wheel 组(注意并非 root 组),命令如下:
#usermod -g wheel sysin # 修改所属组,默认所属组与用户名同名
usermod -G wheel sysin # 修改附加组,用户所属组不变(推荐)
## 测试
su sysin
visudo #提示输入 sysin 密码,然后提示没有权限。
sudo visudo #提示输入密码,可以正常编辑。
## 恢复原有宿组
#usermod -g sysin -G sysin sysin #所有组
usermod -G sysin sysin #附加组
修改完毕,现在可以用 sysin 帐号登录,然后用 sudo + 命令,即可获得 root 权限进行操作。
sudo 不需要密码请修改这里,取消下面一行注释:
## Same thing without a password
%wheelALL=(ALL) NOPASSWD: ALL
注意:将用户数组修改为 root 并无法获得管理员权限,因为 /etc/sudoers 文件中并没有定义 root 组。在 Linux 中 root 组(id 0)和 wheel 组(id 10)并不等价。
备注:Unix 中没有 root 组,root 组就是 wheel,id 0。
备注:修改 sudo 需要输入密码的超时时间,下文会说明。
- Ubuntu
查看 /etc/sudoers 文件中定义的组:
$ sudo grep ^% /etc/sudoers
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
虽然上面有 admin 组,实际上 Ubuntu 系统默认并没有 admin 组,所以可以忽略,当然也可以手动创建 admin 组,将用户加入 admin 组来获得管理员权限。
修改 /etc/sudoers 文件(或者使用命令 visudo),找到下面一行,把前面的注释(#)去掉。
然后修改用户,使其属于 sudo 组(注意并非 admin 组),命令如下:
#usermod -g wheel sysin # 修改所属组,默认所属组与用户名同名
usermod -G sudo sysin # 修改附加组,用户所属组不变
## 测试
su sysin
visudo #提示输入 sysin 密码,然后提示没有权限。
sudo visudo #提示输入密码,可以正常编辑。
## 恢复原有宿组
usermod -G sysin sysin #附加组
修改完毕,现在可以用 sysin 帐号登录,然后用 sudo + 命令,即可获得 root 权限进行操作。
sudo 不需要密码请修改如下(也可以直接新增一行如下):
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
方法二:添加用户权限
该方法在 Linux 中通用。
修改 /etc/sudoers 文件(visudo),找到下面一行,在 root 下面添加一行。
也可以在文件尾部添加(比如用 shell 处理的时候)。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
sysin ALL=(ALL) ALL
修改完毕,现在可以用 sysin 帐号登录,然后用命令 sudo 命令
,即可获得 root 权限进行操作。
sudo 不需要密码修改如下(只需要这一行即可生效):
sysin ALL=(ALL) NOPASSWD: ALL
直接切换:
sudo su
sudo -i
方法三:修改用户 ID(UID)(不推荐)
该方法在 Linux 中通用。
修改 /etc/passwd 文件,找到如下行,把用户 ID 修改为 0
因为 UID 与 root 相同,无法区分用户,等同于使用 root 账号的效果。
sysin:x:500:500:sysin:/home/sysin:/bin/bash
修改后如下:
sysin:x:0:500:sysin:/home/sysin:/bin/bash
保存,用 sysin 账户登录后,直接获取的就是 root 帐号的权限,不需要使用 sudo 命令。
sudo 和 su
sudo 简介
sudo:SuperUser DO,以超级用户(root)执行指令。
来源:百度百科
sudo 是 Linux 系统管理指令,是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具,如 halt,reboot,su 等等。这样不仅减少了 root 用户的登录 和管理时间,同样也提高了安全性。sudo 不是对 shell 的一个代替,它是面向每个命令的。
它的特性主要有这样几点:
- sudo 能够限制用户只在某台主机上运行某些命令。
- sudo 提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
- sudo 使用时间戳文件来执行类似的 “检票” 系统。当用户调用 sudo 并且输入它的密码时,用户获得了一张存活期为 5 分钟的票(这个值可以在编译的时候改变)。之后的一段时间内(默认为 5 分钟,可在 /etc/sudoers 自定义),使用 sudo 不需要再次输入密码。
- sudo 的配置文件是 sudoers 文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在 /etc/sudoers,属性必须为 0440。
在 sudo 于 1980 年前后被写出之前,一般用户管理系统的方式是利用 su 切换为超级用户。但是使用 su 的缺点之一在于必须要先告知超级用户的密码
由于不需要超级用户的密码,部分类 Unix 系统甚至利用 sudo 使一般用户取代超级用户作为管理帐号,例如 macOS、Ubuntu等。
修改 sudo 输入密码时间限制
在 Linux 系统,sudo 会话时间限制,比如 Ubuntu 为 15 分钟(CentOS 据说是 5 分钟),即超过这个时间执行 sudo 指令需要重新输入密码,可以修改时间:
sudo visudo
或者 sudo vi /etc/sudoers
(当然 root 账号无需 sudo)
找到 Defaults env_reset
修改为
Defaults env_reset, timestamp_timeout=xx
比如:
Defaults env_reset, timestamp_timeout=30
30 表示 30 分钟
另外也可以设置为 -1 ,这样当你在注销或退出 terminal 之前,都会记住密码。此时可以使用 sudo -K
强制退出会话。
sudo 不需要密码配置上述部分有所描述。
su 简介
su:su(英文:switch user,中译:切换用户),普通用户切换至超级用户、其他用户或临时拥有切换用户的权限,切换需要输入密码;超级用户也可切换至普通用户,以临时低权限身份处理事务,此时无需输入密码。
sudo su 用法
su 用户名
:输入密码后切换到该用户但是 pwd 目录不变(root 切换到其他用户无需输入密码)su - 用户名
:输入密码后切换该用户但是 pwd 目录变为该用户的 home 目录(root 切换到其他用户无需输入密码)sudo 要执行的命令
:输入密码后执行要求 root 权限的命令sudo -i
:为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout”。要求执行该命令的用户必须在sudoers中。与sudo -i root
,sudo - root
,sudo -
,sudo root
效果相同。sudo su
等于su root
,运行 sudo 命令给 su 命令提权,运行 su 命令。要求执行该命令的用户必须在 sudoers 中才可以。sudo su 运行结果 PWD=/home/用户名(当前用户主目录)。sudo su -
等于su - root
,其实也就是sudo -i
,有点绕了。。。。。。