管理用户和组、文件权限和属性以及启用账户的 sudo 访问 - 第 8 部分
去年 8 月,Linux 基金会启动了LFCS认证(Linux 基金会认证系统管理员),这是一项全新的计划,其目的是让世界各地的个人参加考试,以获得 Linux 系统基础到中级运营支持的认证,包括支持正在运行的系统和服务,以及整体监控和分析,以及智能决策,以便能够决定何时需要将问题上报给更高级别的支持团队。
请快速观看以下视频,其中介绍了 Linux 基金会认证计划。
本文是 10 个教程系列的第 8 部分,在本节中,我们将指导您如何管理 Linux 系统中的用户和组权限,这是 LFCS 认证考试所必需的。
由于 Linux 是一个多用户操作系统(它允许不同计算机或终端上的多个用户访问单个系统),因此您需要知道如何执行有效的用户管理:如何添加、编辑、暂停或删除用户帐户,以及授予他们执行分配任务所需的权限。
添加用户帐户
要添加新用户帐户,您可以以 root 身份运行以下两个命令之一。
# adduser [new_account] # useradd [new_account]
当系统添加新的用户账户时,执行以下操作。
1.创建他/她的主目录(默认为/home/username )。
2.以下隐藏文件被复制到用户的主目录中,并将用于为其用户会话提供环境变量。
.bash_logout .bash_profile .bashrc
3.在 /var/spool/mail/ username为用户创建邮件池。
4.创建一个组并赋予与新用户帐户相同的名称。
理解 /etc/passwd
完整的帐户信息存储在/etc/passwd文件中。此文件包含每个系统用户帐户的记录,格式如下(字段以冒号分隔)。
[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell]
- 字段[用户名]和[评论]是不言自明的。
- 第二个字段中的x表示该帐户受影子密码(在/etc/shadow中)保护,需要该密码才能以[用户名]身份登录。
- [ UID ]和[GID]字段是整数,分别代表[用户名]所属的用户标识和主要组标识。
- [主目录]表示[用户名]主目录的绝对路径,并且
- [默认shell ]是此用户登录系统时可用的 shell。
了解 /etc/group
组信息存储在/etc/group文件中。每条记录的格式如下。
[Group name]:[Group password]:[GID]:[Group members]
- [群组名称]为群组的名称。
- [组密码]中的x表示未使用组密码。
- [GID]:与 /etc/passwd 中的相同。
- [组成员] :以逗号分隔的[组名]成员用户列表。
添加账户后,您可以使用usermod命令编辑以下信息(仅举几个字段),usermod的基本语法如下。
# usermod [options] [username]
设置帐户的到期日期
使用–expiredate标志,后跟YYYY-MM-DD格式的日期。
# usermod --expiredate 2014-10-30 example
将用户添加到附加组
使用组合的-aG或–append –groups选项,后跟以逗号分隔的组列表。
# usermod --append --groups root,users example
更改用户主目录的默认位置
使用-d或–home选项,后跟新主目录的绝对路径。
# usermod --home /tmp example
更改用户默认使用的 shell
使用–shell,后跟新 shell 的路径。
# usermod --shell /bin/sh example
显示用户所属的组
# groups example # id example
现在让我们一次性执行上述所有命令。
# usermod --expiredate 2014-10-30 --append --groups root,users --home /tmp --shell /bin/sh example
在上面的示例中,我们将示例用户帐户的到期日期设置为2014 年 10 月 30 日。我们还将把该帐户添加到root和 users 组。最后,我们将sh
其设置为默认 shell,并将主目录的位置更改为/tmp:
另请阅读:
对于现有的账户,我们还可以执行以下操作。
通过锁定密码禁用帐户
使用-L(大写 L)或–lock选项来锁定用户密码。
# usermod --lock example
解锁用户密码
使用–u或–unlock选项来解锁之前被阻止的用户密码。
# usermod --unlock example
为需要多个用户访问的文件创建一个新的组,用于读写访问
运行下面一系列命令来实现目标。
# groupadd common_group # Add a new group # chown :common_group common.txt # Change the group owner of common.txt to common_group # usermod -aG common_group user1 # Add user1 to common_group # usermod -aG common_group user2 # Add user2 to common_group # usermod -aG common_group user3 # Add user3 to common_group
删除群组
您可以使用以下命令删除一个组。
# groupdel [group_name]
如果有文件归group_name所有,则不会删除这些文件,但组所有者将被设置为被删除组的GID 。
Linux 文件权限
除了我们在本系列的归档工具和设置文件属性 - 第 3 部分中讨论的基本读、写和执行权限之外,还有其他较少使用(但同样重要)的权限设置,有时称为“特殊权限”。
与前面讨论的基本权限一样,它们是使用八进制文件或通过表示权限类型的字母(符号表示法)来设置的。
删除用户帐户
您可以使用带有–remove选项的userdel命令删除一个帐户(如果它归用户所有,则还删除它的主目录以及其中的所有文件以及邮件假脱机)。
# userdel --remove [username]
群组管理
每次将新用户帐户添加到系统时,都会创建一个同名的组,该用户名是其唯一成员。其他用户可以稍后添加到该组中。组的目的之一是通过设置对这些资源的正确权限来实现对文件和其他系统资源的简单访问控制。
例如,假设您有以下用户。
- 用户1(主组:用户1)
- 用户2(主组:用户2)
- 用户3(主组:用户3)
他们都需要对位于本地系统某处或user1创建的网络共享上的名为 common.txt 的文件具有读写权限。您可能会想这样做,
# chmod 660 common.txt OR # chmod u=rw,g=rw,o= common.txt [notice the space between the last equal sign and the file name]
但是,这只会为文件所有者和文件组所有者(本例中为user1 )的成员提供读写访问权限。同样,您可能想将user2和user3添加到组user1中,但这也会让他们访问用户user1和组user1拥有的其余文件。
这时团体就派上用场了,以下是您在这种情形下应该做的事情。
理解 Setuid
当setuid权限应用于可执行文件时,运行该程序的用户将继承程序所有者的有效权限。由于这种方法可能会引起安全问题,因此必须将具有 setuid 权限的文件数量保持在最低限度。当系统用户需要访问 root 拥有的文件时,您可能会发现设置了此权限的程序。
总结一下,用户不仅可以执行二进制文件,还可以以 root 权限执行。例如,让我们检查一下/bin/passwd的权限。此二进制文件用于更改帐户的密码,并修改/etc/shadow文件。超级用户可以更改任何人的密码,但所有其他用户只能更改自己的密码。
因此,任何用户都应该有权限运行/bin/passwd,但只有 root 才能指定账户。其他用户只能更改其相应的密码。
理解 Setgid
设置setgid位后,实际用户的有效GID将成为组所有者的有效 GID。因此,任何用户都可以在授予该文件组所有者的权限下访问该文件。此外,在目录上设置 setgid 位后,新创建的文件将继承与目录相同的组,新创建的子目录也将继承父目录的 setgid 位。无论文件所有者的主要组是什么,只要某个组的成员需要访问目录中的所有文件,您很可能会使用此方法。
# chmod g+s [filename]
要以八进制形式设置setgid,请将数字2添加到当前(或所需)基本权限的前面。
# chmod 2755 [directory]
在目录中设置 SETGID
理解粘滞位
当在文件上设置“粘滞位”时,Linux 会忽略它,而对于目录,它会阻止用户删除甚至重命名其中包含的文件,除非用户拥有该目录、文件或为 root 用户。
# chmod o+t [directory]
要以八进制形式设置粘滞位,请将数字1添加到当前(或所需)基本权限的前面。
# chmod 1755 [directory]
如果没有粘性位,任何有权限写入目录的人都可以删除或重命名文件。因此,粘性位通常位于全球可写的目录(例如/tmp )上。
特殊 Linux 文件属性
还有其他属性可以进一步限制对文件允许的操作。例如,防止文件被重命名、移动、删除甚至修改。它们是使用chattr 命令设置的,可以使用lsattr工具查看,如下所示。
# chattr +i file1 # chattr +a file2
执行这两个命令后,file1将变得不可变(这意味着它不能被移动、重命名、修改或删除),而file2将进入仅追加模式(只能以追加模式打开进行写入)。
访问 root 帐户并使用 sudo
用户获取 root 帐户访问权限的方法之一是通过键入。
$ su
and then entering root’s password.
If authentication succeeds, you will be logged on as root with the current working directory as the same as you were before. If you want to be placed in root’s home directory instead, run.
$ su -
and then enter root’s password.
The above procedure requires that a normal user knows root’s password, which poses a serious security risk. For that reason, the sysadmin can configure the sudo command to allow an ordinary user to execute commands as a different user (usually the superuser) in a very controlled and limited way. Thus, restrictions can be set on a user so as to enable him to run one or more specific privileged commands and no others.
Read Also: Difference Between su and sudo User
To authenticate using sudo, the user uses his/her own password. After entering the command, we will be prompted for our password (not the superuser’s) and if the authentication succeeds (and if the user has been granted privileges to run the command), the specified command is carried out.
To grant access to sudo, the system administrator must edit the /etc/sudoers file. It is recommended that this file is edited using the visudo command instead of opening it directly with a text editor.
# visudo
This opens the /etc/sudoers file using vim (you can follow the instructions given in Install and Use vim as Editor – Part 2 of this series to edit the file).
These are the most relevant lines.
Defaults secure_path="/usr/sbin:/usr/bin:/sbin" root ALL=(ALL) ALL example ALL=/bin/yum update gacanepa ALL=NOPASSWD:/bin/updatedb %admin ALL=(ALL) ALL
Let’s take a closer look at them.
Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/usr/local/bin"
This line lets you specify the directories that will be used for sudo, and is used to prevent using user-specific directories, which can harm the system.
The next lines are used to specify permissions.
root ALL=(ALL) ALL
- The first ALL keyword indicates that this rule applies to all hosts.
- The second ALL indicates that the user in the first column can run commands with the privileges of any user.
- The third ALL means any command can be run.
example ALL=/bin/yum update
If no user is specified after the = sign, sudo assumes the root user. In this case, user example will be able to run yum update as root.
gacanepa ALL=NOPASSWD:/bin/updatedb
The NOPASSWD directive allows user gacanepa to run /bin/updatedb without needing to enter his password.
%admin ALL=(ALL) ALL
The % sign indicates that this line applies to a group called “admin”. The meaning of the rest of the line is identical to that of an regular user. This means that members of the group “admin” can run all commands as any user on all hosts.
To see what privileges are granted to you by sudo, use the “-l” option to list them.
PAM (Pluggable Authentication Modules)
Pluggable Authentication Modules (PAM) offer the flexibility of setting a specific authentication scheme on a per-application and / or per-service basis using modules. This tool present on all modern Linux distributions overcame the problem often faced by developers in the early days of Linux, when each program that required authentication had to be compiled specially to know how to get the necessary information.
For example, with PAM, it doesn’t matter whether your password is stored in /etc/shadow or on a separate server inside your network.
For example, when the login program needs to authenticate a user, PAM provides dynamically the library that contains the functions for the right authentication scheme. Thus, changing the authentication scheme for the login application (or any other program using PAM) is easy since it only involves editing a configuration file (most likely, a file named after the application, located inside /etc/pam.d
, and less likely in /etc/pam.conf
).
Files inside /etc/pam.d
indicate which applications are using PAM natively. In addition, we can tell whether a certain application uses PAM by checking if it the PAM library (libpam) has been linked to it:
# ldd $(which login) | grep libpam # login uses PAM # ldd $(which top) | grep libpam # top does not use PAM
In the above image we can see that the libpam has been linked with the login application. This makes sense since this application is involved in the operation of system user authentication, whereas top does not.
Let’s examine the PAM configuration file for passwd – yes, the well-known utility to change user’s passwords. It is located at /etc/pam.d/passwd:
# cat /etc/passwd
The first column indicates the type
of authentication to be used with the module-path
(third column). When a hyphen appears before the type, PAM will not record to the system log if the module cannot be loaded because it could not be found in the system.
The following authentication types are available:
account
: this module type checks if the user or service has supplied valid credentials to authenticate.auth
: this module type verifies that the user is who he / she claims to be and grants any needed privileges.password
: this module type allows the user or service to update their password.session
: this module type indicates what should be done before and/or after the authentication succeeds.
The second column (called control
) indicates what should happen if the authentication with this module fails:
requisite
: if the authentication via this module fails, overall authentication will be denied immediately.required
与 requisite 类似,但在拒绝身份验证之前将调用此服务的所有其他列出的模块。sufficient
:如果通过此模块的身份验证失败,即使之前标记为必需的身份验证失败,PAM 仍将授予身份验证。optional
:如果通过此模块的身份验证失败或成功,则不会发生任何事情,除非这是为该服务定义的唯一此类模块。include
意味着应该从另一个文件中读取给定类型的行。substack
与包含类似,但身份验证失败或成功不会导致整个模块退出,而只会导致子堆栈退出。
第四列(如果存在)显示要传递给模块的参数。
/etc/pam.d/passwd中的前三行(如上所示)加载system-auth模块以检查用户是否提供了有效的凭据(帐户)。如果是,则允许他/她通过授予使用 passwd ( auth )的权限来更改身份验证令牌(密码)。
例如,如果你附加
remember=2
到下面一行
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
在/etc/pam.d/system-auth中:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=2
每个用户的最后两个散列密码保存在/etc/security/opasswd中,因此不能重复使用:
概括
有效的用户和文件管理技能是任何系统管理员的必备工具。在本文中,我们介绍了基础知识,希望您能将其作为良好的起点。请随时在下面留下您的评论或问题,我们会迅速回复。