网站搜索

管理用户和组、文件权限和属性以及启用帐户的 sudo 访问 - 第 8 部分


去年八月,Linux 基金会启动了LFCS认证(Linux Foundation Certified Sysadmin),这是一个全新的计划,其目的是让世界各地的个人能够通过考试,获得 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/用户名 处为用户创建邮件假脱机。

4. 创建一个组并指定与新用户帐户相同的名称。

了解/etc/passwd

完整的帐户信息存储在 /etc/passwd 文件中。该文件包含每个系统用户帐户的一条记录,并具有以下格式(字段由冒号分隔)。

[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell]
  1. 字段[用户名][评论]是不言自明的。
  2. 第二个字段中的 x 表示该帐户受影子密码保护(在 /etc/shadow 中),需要以 [用户名] 身份登录
  3. [UID][GID] 字段是整数,分别表示 [username] 所属的用户标识和主要组标识。
  4. [主目录]表示[用户名]的主目录的绝对路径,并且
  5. [默认 shell] 是该用户登录系统时可用的 shell。
了解/etc/group

组信息存储在/etc/group文件中。每条记录都具有以下格式。

[Group name]:[Group password]:[GID]:[Group members]
  1. [组名称]是组的名称。
  2. [组密码] 中的x 表示未使用组密码。
  3. [GID]:与 /etc/passwd 中的相同。
  4. [组成员][组名称]成员的逗号分隔用户列表。

添加帐户后,您可以使用 usermod 命令编辑以下信息(仅举几个字段),usermod 的基本语法如下。

usermod [options] [username]
设置帐户的到期日期

使用 –expiredate 标志,后跟 YYYY-MM-DD 格式的日期。

usermod --expiredate 2014-10-30 tecmint
将用户添加到补充组

使用组合的 -aG-append -groups 选项,后跟逗号分隔的组列表。

usermod --append --groups root,users tecmint
更改用户主目录的默认位置

使用 -d-home 选项,后跟新主目录的绝对路径。

usermod --home /tmp tecmint
更改用户默认使用的 shell

使用 –shell,后跟新 shell 的路径。

usermod --shell /bin/sh tecmint
显示用户所属的组
groups tecmint
id tecmint

现在让我们一次性执行以上所有命令。

usermod --expiredate 2014-10-30 --append --groups root,users --home /tmp --shell /bin/sh tecmint

在上面的示例中,我们将howtoing用户帐户的到期日期设置为2014年10月30日。我们还将将该帐户添加到root和用户组中。最后,我们将 sh 设置为其默认 shell,并将主目录的位置更改为 /tmp

另请阅读

  1. Linux 中的 15 个 useradd 命令示例
  2. Linux 中的 15 个 usermod 命令示例

对于现有帐户,我们还可以执行以下操作。

通过锁定密码禁用帐户

使用-L(大写L)或-lock选项来锁定用户的密码。

usermod --lock tecmint
解锁用户密码

使用 –u–unlock 选项解锁之前被阻止的用户密码。

usermod --unlock tecmint

创建一个新组,用于对需要多个用户访问的文件进行读写访问

运行以下一系列命令来实现目标。

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 部分中讨论的基本读取、写入和执行权限之外,还有其他较少使用(但并非不那么重要)的权限设置,有时称为“特殊”权限”。

与前面讨论的基本权限一样,它们是使用八进制文件或通过指示权限类型的字母(符号表示法)来设置的。

删除用户帐户

您可以使用 userdel 命令和 –remove 来删除帐户(连同其主目录,如果它属于用户所有,以及其中驻留的所有文件,以及邮件假脱机) 选项。

userdel --remove [username]

集团管理

每次将新用户帐户添加到系统时,都会创建一个同名的组,并将用户名作为其唯一成员。稍后可以将其他用户添加到该组中。组的目的之一是通过对文件和其他系统资源设置正确的权限来实现对这些资源的简单访问控制。

例如,假设您有以下用户。

  1. user1(主要组:user1)
  2. 用户2(主要组:用户2)
  3. user3(主要组:user3)

它们都需要对位于本地系统某处或网络共享上的名为 common.txt 的文件进行访问权限user1 已创建。您可能会想做类似的事情,

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 在这种情况下)。同样,您可能会想将 user2user3 添加到组 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

然后输入root的密码。

如果身份验证成功,您将以 root 身份登录,当前工作目录与之前相同。如果您想放置在 root 的主目录中,请运行。

su -

然后输入root的密码。

上述过程要求普通用户知道root的密码,存在严重的安全风险。因此,系统管理员可以配置 sudo 命令,以允许普通用户以非常受控和有限的方式作为不同用户(通常是超级用户)执行命令。因此,可以对用户设置限制,以使他能够运行一个或多个特定特权命令,而不能运行其他命令。

另请阅读:su 和 sudo 用户之间的区别

要使用 sudo 进行身份验证,用户使用他/她自己的密码。输入命令后,系统将提示我们输入密码(不是超级用户的密码),如果身份验证成功(并且如果用户已被授予运行该命令的权限),则执行指定的命令。

要授予对 sudo 的访问权限,系统管理员必须编辑 /etc/sudoers 文件。建议使用 visudo 命令编辑此文件,而不是直接使用文本编辑器打开它。

visudo

这将使用 vim 打开 /etc/sudoers 文件(您可以按照安装并使用 vim 作为编辑器 - 本系列的第 2 部分中给出的说明来编辑该文件)。

这些是最相关的行。

Defaults    secure_path="/usr/sbin:/usr/bin:/sbin"
root        ALL=(ALL) ALL
tecmint     ALL=/bin/yum update
gacanepa    ALL=NOPASSWD:/bin/updatedb
%admin      ALL=(ALL) ALL

让我们仔细看看它们。

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

此行允许您指定将用于 sudo 的目录,并用于防止使用特定于用户的目录,这可能会损害系统。

接下来的几行用于指定权限。

root        ALL=(ALL) ALL
  1. 第一个 ALL 关键字表示此规则适用于所有主机。
  2. 第二个 ALL 表示第一列中的用户可以使用任何用户的权限运行命令。
  3. 第三个 ALL 表示可以运行任何命令。
tecmint     ALL=/bin/yum update

如果 = 符号后未指定用户,则 sudo 假定为 root 用户。在这种情况下,用户 howtoing 将能够以 root 身份运行 yum update

gacanepa    ALL=NOPASSWD:/bin/updatedb

NOPASSWD 指令允许用户 gacanepa 运行 /bin/updatedb 而无需输入密码。

%admin      ALL=(ALL) ALL

% 符号表示该行适用于名为“admin”的组。该行其余部分的含义与普通用户的含义相同。这意味着“admin”组的成员可以在所有主机上以任何用户身份运行所有命令。

要查看 sudo 授予您哪些权限,请使用“-l”选项列出它们。

PAM(可插拔身份验证模块)

可插入身份验证模块 (PAM) 提供了使用模块在每个应用程序和/或每个服务的基础上设置特定身份验证方案的灵活性。所有现代 Linux 发行版上都有的这个工具克服了 Linux 早期开发人员经常面临的问题,当时每个需要身份验证的程序都必须专门编译才能知道如何获取必要的信息。

例如,使用 PAM,您的密码是存储在 /etc/shadow 中还是存储在网络内的单独服务器上并不重要。

例如,当登录程序需要对用户进行身份验证时,PAM 动态提供包含正确身份验证方案函数的库。因此,更改登录应用程序(或任何其他使用 PAM 的程序)的身份验证方案很容易,因为它只涉及编辑配置文件(很可能是以应用程序命名的文件,位于 /etc/pam.d 内) ,并且在 /etc/pam.conf 中不太可能)。

/etc/pam.d 内的文件指示哪些应用程序本身使用 PAM。此外,我们可以通过检查 PAM 库 (libpam) 是否已链接到某个应用程序来判断该应用程序是否使用 PAM:


ldd $(which login) | grep libpam # login uses PAM
ldd $(which top) | grep libpam # top does not use PAM

在上图中,我们可以看到 libpam 已与登录应用程序链接。这是有道理的,因为该应用程序涉及系统用户身份验证的操作,而 top 则不涉及。

让我们检查一下 PAM 配置文件中的 passwd – 是的,众所周知的用于更改用户密码的实用程序。它位于/etc/pam.d/passwd


cat /etc/passwd

第一列指示与模块路径(第三列)一起使用的身份验证的类型。当类型前面出现连字符时,如果由于在系统中找不到该模块而无法加载该模块,PAM 不会记录到系统日志中。

可以使用以下身份验证类型:

  1. account:此模块类型检查用户或服务是否提供了有效的凭据进行身份验证。
  2. auth:此模块类型验证用户是否是他/她声称的人,并授予任何所需的权限。
  3. password:此模块类型允许用户或服务更新其密码。
  4. session:此模块类型指示身份验证成功之前和/或之后应该执行的操作。

第二列(称为 control)指示如果此模块的身份验证失败会发生什么:

  1. requirement:如果通过该模块的认证失败,则整体认证将立即被拒绝。
  2. required 与 Required 类似,但在拒绝身份验证之前将调用此服务的所有其他列出的模块。
  3. sufficient:如果通过此模块的身份验证失败,即使先前标记为必需的失败,PAM 仍将授予身份验证。
  4. 可选:如果通过此模块进行的身份验证失败或成功,则不会发生任何情况,除非这是为此服务定义的该类型的唯一模块。
  5. include 表示应该从另一个文件读取给定类型的行。
  6. substack 与 include 类似,但身份验证失败或成功不会导致整个模块退出,而只会导致子堆栈退出。

第四列(如果存在)显示要传递给模块的参数。

/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 中,以便它们无法重复使用:

概括

有效的用户和文件管理技能是任何系统管理员的必备工具。在本文中,我们介绍了基础知识,希望您可以将其用作构建的良好起点。请随时在下面留下您的意见或问题,我们会尽快回复。