0%

Debian 10、CentOS8、Rocky8等linux系统配置普通用户sudo权限

配置 linux 权限是熟悉 linux 所必须的。各大linux发行版的默认软件仓库对各软件包配置了详细而严格的权限限制。如果不能熟悉 linux 的权限控制,就会因此出现很多问题。
直接使用 root 用户管理系统是非常方便的,但也是非常危险的。标准的做法是使用具有 sudo 权限的普通用户管理系统。这里记录一下在 Debian 10 系统下手动配置一个具有 sudo 权限的linux 普通用户的过程。
sudo 是较为通用的软件包,其他的 linux 发行版与 Debian 基本相同,甚至没有任何区别。可以直接参考本文

原文链接: http://blog.ryjer.com/posts/a158220239.html

1、准备工作——安装sudo

sudo 是 super user do 的意思,表示临时借用超级用户(super user)的权限执行(do)一次命令。

但官方的 debian 系统可能默认没有安装 sudo 软件,因而也没有sudo命令的配置文件 /etc/sudoers。其他发行版一般都会默认安装sudo。

Debian 需要切换到 root 用户后用apt-get手动安装 sudo 软件。

1
apt install sudo

RHEL 系的发行版(CentOS Rocky)则需要切换到 root 用户后用dnf手动安装 sudo ,但通常 RHEL系会预装 sudo

1
dnf install sudo

接下来,其他用户就可以使用 sudo 命令了。

2、原理

2.1 sudo配置文件—debian10

sudo 命令使用 /etc/sudoers 配置文件管理 用户用户组 的sudo权限。Debian 10 中 sudo 默认的配置文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification # 用户权限
root ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command # 用户组权限
%sudo ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

其中,第20行开始为 用户sudo权限 ,这里为root用户提供了sudo权限(虽然root用户并不需要)。第23行以 % 开始的为 用户组权限,这里创建了 sudo 用户组,该组中的用户将拥有sudo权限。

为了方便管理,我们可以将普通用户添加 sudo 附加用户组,便可以使其拥有 sudo 权限。如果单独为一个个用户添加 sudo 权限会非常难以管理。

2.2 sudo配置文件—Rocky8

rocky8 的sudo是默认安装的,其配置文件与 debian10 有所不同,我刚装完一个rocky8后的配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
##
## This file must be edited with the 'visudo' command.

## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2

## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem


## Command Aliases
## These are groups of related commands...

## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb

## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification

#
# Refuse to run if unable to disable echo on the tty.
#
Defaults !visiblepw

#
# Preserving HOME has security implications since many programs
# use it when searching for configuration files. Note that HOME
# is already set when the the env_reset option is enabled, so
# this option is only effective for configurations where either
# env_reset is disabled or HOME is present in the env_keep list.
#
Defaults always_set_home
Defaults match_group_by_gid

# Prior to version 1.8.15, groups listed in sudoers that were not
# found in the system group database were passed to the group
# plugin, if any. Starting with 1.8.15, only groups of the form
# %:group are resolved via the group plugin by default.
# We enable always_query_group_plugin to restore old behavior.
# Disable this option for new behavior.
Defaults always_query_group_plugin

Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

#
# Adding HOME to env_keep may enable a user to run unrestricted
# commands via sudo.
#
# Defaults env_keep += "HOME"

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## 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

## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

## Allows members of the users group to mount and unmount the
## cdrom as root
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

从 107 行可看出,其默认sudo用户组为 wheel 而不是 debian 10中的 sudo ,而且格式也不相同

查看一下拥有sudo权限的用户 me 的群组看看

1
2
~# groups me
me : me wheel

可见确实是 wheel 群组授予了其 sudo 权限

3、添加用户—useradd命令

可以使用 useradd 命令创建新用户,系统会自动创建一个同名组(me用户组)。其格式如下:

1
2
3
useradd 选项 用户名
# 多个选项,用户名要在最后
useradd 选项1 选项2 选项3 选项4 用户名

常用参数:

  • -s 指定用户登录 shell,这里指定为 bash
  • -d 指定一个已经存在的目录为主目录
  • -m 指定并创建主目录(main),这里指定为 /home/me
  • -g 指定用户所属用户组(group)。
  • -G 指定附加用户组
1
2
# 添加新用户 me,指定登录shell为 /bin/bash,主目录为 /home/me
useradd -s /bin/bash -m /home/me me

如果你想同时指定不同命的用户组和附加组,可以这样。

1
useradd -s /bin/bash -g we –G adm,root me

该命令创建了用户 me 。使用 -s 参数指定了其登录 shell 为 /bin/bash;使用 -g 参数指定属于不同名的 we 用户组;并用 -G 参数指定了两个附加组 admroot,指定多个附加组时用逗号 “,” 分割各个附加组名。

如果你想偷下懒,可以使用adduser命令,该命令是useradd的简化版(但可以满足90%的需求)。该命令会自动配置 /home 下的用户同名主目录和默认 shell

1
adduser me

执行完该命令后,会在配置文件 /etc/passwd 中添加me用户的记录。并在 /etc/group 配置文件中添加一个me用户组记录。在 /etc/shadow 配置文件中记录加密密码(说是密码不太准确)。

4、 修改密码—passwd命令

刚刚创建的新用户没有密码,不太安全。可以使用passwd 命令为其修改密码。以下为修改用户 me 的密码:

1
passwd me

然后就会提示你输入密码进行修改了

5、 修改账号—usermod命令

添加附加用户组,授予 sudo 权限

修改用户账号就是更改用户的有关属性记录,如用户号、主目录、用户组、登录Shell等。这些记录信息分散在各个配置文件中(/etc/passwd 用户信息, /etc/shadow 加密密码信息, /etc/group 用户组信息),使用usermod 可以统一管理修改这几个配置文件。usermod 命令格式如下:

1
usermod 选项 用户名

其常用选项参数与 useradd 相同,有些版本的usermod命令还会提供额外功能选项(如修改用户名等):

  • -s 指定用户登录 shell,这里指定为 bash
  • -d 指定一个已经存在的目录为主目录
  • -m 指定并创建主目录(main),这里指定为 /home/me
  • -g 指定用户所属用户组(group)。
  • -a 把用户追加(append)到某些组中,仅与-G选项一起使用
  • -G 指定附加用户组(Group)

注意,usermod 修改用户账户前。需保证该用户下没有任何进程执行,特别注意shell进程(这意味着对应用户需要退出所有登录)。

为普通用户添加 sudo 权限可以通过将对应用户添加到拥有sudo权限的用户组中实现,比如在debian10 中的 sudo 用户组:

1
2
3
4
# 将me用户 添加到 sudo 用户组
usermod -a -G sudo me
# 你要是比较闲的话,再添加一个 adm 伪用户组,注意这不是必须的
usermod -aG adm me

或者说 rocky8 中的 wheel 群组

1
2
# 将me用户 添加到 wheel 用户组
usermod -a -G wheel me

执行完后,使用 groups命令检查

1
groups me

该命令会显示 me 用户所属的多个用户组(可能有很多),debian10中应该有 sudo 和 adm,rocky8中应该有 wheel

6、删除用户——userdel命令

与 useradd 命令向对应,有一个 userdel 命令用于删除用户。其使用格式如下:

1
userdel 选项 用户名

常用的选项参数是 -r ,这是递归的意思。表示将该用户的所有的配置信息(主要是/etc/passwd, /etc/shadow, /etc/group等)以及用户主目录全部删除。这基本上已经是算是清除干净了。

7、 参考资料

菜鸟教程用户管理