关于 root 和 wheel:在 Linux 中创建管理员账号(root 权限)的正确方式

Posted by sysin on 2021-03-04
Estimated Reading Time 11 Minutes
Words 3k In Total
Viewed Times

请访问原文链接:关于 root 和 wheel:在 Linux 中创建管理员账号(root 权限)的正确方式,查看最新版。原创作品,转载请保留出处。

作者:gc(at)sysin.org,主页:www.sysin.org

unix-linux

为什么 root 用户所在的群组叫 wheel?

在 Unix 中 root 用户所属组就是 wheel

在 Unix 系统(例如:常见的 macOS 和 FreeBSD),root 用户所在的组称之为 wheel

1
2
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 发行版本中,仍然保留了 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.

1
2
3
4
5
id root
uid=0(root) gid=0(root) groups=0(root)

cat /etc/group | grep wheel
wheel:x:10

将新建用户加入到 wheel 组中即可获得 root 权限,即通过 sudo 命令执行 root 权限的操作(默认需要输入当前用户的密码):

1
usermod -G wheel user1  #一般使用 -G 修改附加数组即可

Ubuntu 中没有 wheel 组

注:这里的 Ubuntu 也适用于其他 Debian 系发行版,例如 KALI 等。

Ubuntu 中并没有 wheel 组,使用 sudo 组替代(可以理解为),GID 为 27。

1
2
cat /etc/group | grep sudo
sudo:x:27:

将新建用户加入到 sudo 组中即可获得 root 权限,即通过 sudo 命令执行 root 权限的操作(默认需要输入当前用户的密码):

1
usermod -G sudo user1  #一般使用 -G 修改附加数组即可

创建管理员账号的正确姿势(默认配置)

在 visudo (/etc/sudoers)默认配置下,创建管理员账号的命令如下:

CentOS:

1
2
useradd -m -s /bin/bash -G wheel user1  #user1 为用户名
passwd user1 #为 user1 设置密码

Ubuntu:

1
2
useradd -m -s /bin/bash -G sudo user1  #user1 为用户名
passwd user1 #为 user1 设置密码

备注:

-m 创建同名 home 目录

-s 指定 shell

-G 修改附加属组

Linux 添加 root 权限用户的方法详解

测试环境:CentOS 8,Ubuntu 20.04

添加用户,首先用 adduser 命令添加一个普通用户,命令如下:

1
2
3
4
5
6
adduser user1 #添加一个名为 user1 的用户,交互提示
## 或者使用 useradd 命令
useradd -m -s /bin/bash user1
passwd user1
# -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

1
2
3
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
# CentOS 8 中已经默认

然后修改用户,使其属于 wheel 组(注意并非 root 组),命令如下:

1
2
3
4
5
6
7
8
9
10
11
#usermod -g wheel user1  # 修改所属组,默认所属组与用户名同名
usermod -G wheel user1 # 修改附加组,用户所属组不变(推荐)

## 测试
su user1
visudo #提示输入 user1 密码,然后提示没有权限。
sudo visudo #提示输入密码,可以正常编辑。

## 恢复原有宿组
#usermod -g user1 -G user1 user1 #所有组
usermod -G user1 user1 #附加组

修改完毕,现在可以用 user1 帐号登录,然后用 sudo + 命令,即可获得 root 权限进行操作。

sudo 不需要密码请修改这里,取消下面一行注释:

1
2
## 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 文件中定义的组:

1
2
3
$ sudo grep ^% /etc/sudoers
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL

虽然上面有 admin 组,实际上 Ubuntu 系统默认并没有 admin 组,所以可以忽略,当然也可以手动创建 admin 组,将用户加入 admin 组来获得管理员权限。

修改 /etc/sudoers 文件(或者使用命令 visudo),找到下面一行,把前面的注释(#)去掉。

然后修改用户,使其属于 sudo 组(注意并非 admin 组),命令如下:

1
2
3
4
5
6
7
8
9
10
#usermod -g wheel user1  # 修改所属组,默认所属组与用户名同名
usermod -G sudo user1 # 修改附加组,用户所属组不变

## 测试
su user1
visudo #提示输入 user1 密码,然后提示没有权限。
sudo visudo #提示输入密码,可以正常编辑。

## 恢复原有宿组
usermod -G user1 user1 #附加组

修改完毕,现在可以用 user1 帐号登录,然后用 sudo + 命令,即可获得 root 权限进行操作。

sudo 不需要密码请修改如下(也可以直接新增一行如下):

1
2
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL

方法二: 添加用户权限

该方法在 Linux 中通用。

修改 /etc/sudoers 文件(visudo),找到下面一行,在 root 下面添加一行。

也可以在文件尾部添加(比如用 shell 处理的时候)。

1
2
3
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
user1 ALL=(ALL) ALL

修改完毕,现在可以用 user1 帐号登录,然后用命令 sudo 命令,即可获得 root 权限进行操作。

sudo 不需要密码修改如下(只需要这一行即可生效):

1
user1   ALL=(ALL)   NOPASSWD: ALL

直接切换:

1
2
sudo su
sudo -i

方法三: 修改用户 ID(UID)(不推荐)

该方法在 Linux 中通用。

修改 /etc/passwd 文件,找到如下行,把用户 ID 修改为 0

因为 UID 与 root 相同,无法区分用户,等同于使用 root 账号的效果。

1
user1:x:500:500:user1:/home/user1:/bin/bash

修改后如下:

1
user1:x:0:500:user1:/home/user1:/bin/bash

保存,用 user1 账户登录后,直接获取的就是 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 rootsudo - rootsudo -sudo root 效果相同。

  • sudo su 等于 su root,运行 sudo 命令给 su 命令提权,运行 su 命令。 要求执行该命令的用户必须在 sudoers 中才可以。sudo su 运行结果 PWD=/home/用户名(当前用户主目录)。

  • sudo su - 等于 su - root,其实也就是 sudo -i,有点绕了。。。。。。


捐助本站 ❤️ Donate


如果文章中使用的内容或图片侵犯了您的版权,请联系作者删除。如果您喜欢这篇文章或者觉得它对您有所帮助,欢迎您发表评论,也欢迎您分享这个网站,或者赞赏一下作者,谢谢!


支付宝打赏 微信打赏

赞赏一下



1000000