用户和组的控制是Linux系统管理的核心要素。本文介绍如何在命令行中添加,管理和删除用户和组,并介绍高级主题,例如创建组目录。
尽管用户既可以是人员(意味着与物理用户绑定的帐户),也可以是供特定应用程序使用的帐户,但组是组织的逻辑表达,将用户捆绑在一起,具有共同的目标。组中的用户共享相同的权限来读取
,写入
或执行
该组拥有的文件。
每个用户都与一个称为用户ID(UID
)的唯一数字标识号相关联。同样,每个组都与一个组ID(GID
)相关联。创建文件的用户也是该文件的所有者和组所有者。为文件所有者
,组
和其他所有人
分配了单独的读取,写入和执行权限。只能由root用户更改文件所有者
,并且root用户和文件所有者均可更改访问权限。
另外,Linux支持文件和目录的访问控制列表(ACL
),允许设置所有者以外的特定用户的权限。
CentOS 7 为系统用户和组保留小于1000
的用户和组ID。 默认情况下,用户管理器不显示系统用户。 保留的用户名和组ID记录在安装程序包
中。 要查看文档,请使用以下命令:
[root@iZerb5rob3dcf6Z ~]# cat /usr/share/doc/setup-2.8.71/uidgid
建议的做法是分配从5000开始的尚未保留的ID,因为将来保留的范围可能会增加。 默认情况下,要使ID分配给新用户,请从以下位置开始5000,更改/etc/login.defs
文件中的UID_MIN
和GID_MIN
指令:
[root@iZerb5rob3dcf6Z ~]# cat /etc/login.defs
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000
UID_MAX 60000
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512
即使使用以5000开头的新用户和组ID,也建议不要将系统保留的ID增加到1000以上,以免与保留1000限制的系统发生冲突。
红帽Linux使用用户专用组(UPG
)方案,这使UNIX组更易于管理。 每当将新用户添加到系统时,都会创建一个用户私有组。 它具有与用户相同的名称,并且该用户是用户私有组的唯一成员。
用户专用组可以安全地为新创建的文件或目录设置默认权限,从而允许该用户和该用户组都可以对该文件或目录进行修改。
确定将什么权限应用于新创建的文件或目录的设置称为umask
,并在/ etc / bashrc
文件中进行配置。 传统上,在基于UNIX的系统上,umask
设置为022
,仅允许创建文件或目录的用户进行修改。 在此方案下,所有其他用户(包括创建者组的成员)均不得进行任何修改。 但是,在UPG
方案下,此“组保护”不是必需的,因为每个用户都有自己的私有组。
所有组的列表存储在/ etc / group
配置文件中。
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
在具有多个用户的环境中,使用shadow-utils
软件包提供的影子密码来提高系统身份验证文件的安全性非常重要。 因此,安装程序默认情况下启用影子密码。以下列出了影子密码相对于在基于UNIX的系统上存储密码的传统方式的优势:
哈希密码
从全局可读的/ etc / passwd
文件移动到/ etc / shadow
(仅由root用户可以读取)来提高系统安全性。/etc/login.defs
文件中设置的某些安全策略。[root@localhost ~]# cat /etc/shadow
root:$6$DDI7ZiT9QSKpzpOI$PUJfTcBFisrcboDV2ABrEcCEjA7zD9Ya.DW07Ob4fEeCLnCXtaz8DCDzZzyLR/OQ.iVe2aj86Tszy3NazCx1t.::0:99999:7:::
bin:*:17834:0:99999:7:::
无论是否启用了影子密码,shadow-utils
软件包提供的大多数实用程序都可以正常工作。 但是,由于密码时效信息仅存储在/ etc / shadow
文件中,因此某些实用程序和命令在未启用影子密码的情况下无法工作:
chage
实用程序,用于设置密码老化参数。gpasswd
实用程序,用于管理/ etc / group
文件。usermod
命令。useradd
命令。要将新用户添加到系统,请在shell提示符下以root身份键入以下内容:
useradd options username
默认情况下,useradd
命令创建一个锁定的用户帐户。 要解锁该帐户,请以超级用户身份运行以下命令以分配密码:
passwd username
(options
)可以设置密码时效策略。
现在的CentOS (7及以上)
版本中,已更改了系统用户和普通用户的默认ID范围。 以前,UID 1-499
用于系统用户,而上面的值用于普通用户。 现在系统用户的默认范围为1-999
。
创建用户:
[root@localhost ~]# useradd google
以下步骤说明了在启用了影子密码的系统上发出 useradd google
命令会发生什么情况:
/ etc / passwd
中为google
创建新行:google:x:1001:1001::/home/google:/bin/bash
该行具有以下特征:
google
开头。x
,指示系统正在使用影子密码。GECOS
信息保留为空白。 GECOS
字段可用于提供有关用户的其他信息,例如其全名或电话号码。google
的主目录设置为/ home / google /
。/ bin / bash
。/ etc / shadow
中创建了google
的新行:google:!!:18427:0:99999:7:::
该生产线具有以下特征:
google
开头。/ etc / shadow
文件的密码字段中会出现两个感叹号(!!
),它会锁定该帐户。注意
如果使用-p标志传递了加密密码,则该密码将位于用户新行的/ etc / shadow文件中。
/ etc / group
中创建了一个名为google
的组的新行:google:x:1001:
与用户同名的组称为用户专用组。,在/ etc / group
中创建的行具有以下特征:
google
开头。x
,表示系统正在使用影子组密码。GID
与在/ etc / passwd
中为google的主组列出的组匹配。/ etc / gshadow
中创建了一个名为google
的组的新行:google:!::
该行具有以下特征:
google
开头。!
)出现在/ etc / gshadow
文件的密码字段中,用于锁定组。/ home
目录中创建了google
用户的目录:drwx------. 3 google google 78 6月 14 22:00 /home/google/
该目录由用户google
和group google
拥有。 它仅对用户google
具有读取,写入和执行特权。 其他所有权限均被拒绝。
6./ etc / skel /
目录中的文件(包含默认用户设置)被复制到新的/ home / google /
目录中:
[root@localhost skel]# ll -a
总用量 24
drwxr-xr-x. 3 root root 78 6月 14 17:37 .
drwxr-xr-x. 119 root root 8192 6月 15 09:51 ..
-rw-r--r--. 1 root root 18 8月 8 2019 .bash_logout
-rw-r--r--. 1 root root 193 8月 8 2019 .bash_profile
-rw-r--r--. 1 root root 231 8月 8 2019 .bashrc
drwxr-xr-x. 4 root root 39 6月 14 17:37 .mozilla
[root@localhost ~]# ls -la /home/google/
总用量 12
drwx------. 3 google google 78 6月 14 22:00 .
drwxr-xr-x. 4 root root 35 6月 14 22:00 ..
-rw-r--r--. 1 google google 18 8月 8 2019 .bash_logout
-rw-r--r--. 1 google google 193 8月 8 2019 .bash_profile
-rw-r--r--. 1 google google 231 8月 8 2019 .bashrc
drwxr-xr-x. 4 google google 39 6月 14 17:37 .mozilla
此时,系统上存在一个名为google
的锁定帐户。 要激活它,管理员必须接下来使用passwd
命令为该帐户分配密码
,并可以选择设置密码有效期等。
要将新组添加到系统,请在shell提示符下以超级用户身份键入以下内容:
groupadd options group_name
使用usermod
将现有用户添加到现有组中。usermod
的各种选项对用户的主组及其补充组有不同的影响。要覆盖用户的主组,请以root用户身份运行以下命令:
〜]#usermod -g group_name username
[root@localhost ~]# tail -2 /etc/group
xiaohong:x:1002:
xiaolv:x:1003:
[root@localhost ~]# tail -2 /etc/passwd
google:x:1001:1001::/home/google:/bin/bash
[root@localhost ~]# usermod -g xiaohong google
[root@localhost ~]# tail -1 /etc/passwd
google:x:1001:1002::/home/google:/bin/bash
要覆盖用户的补充组,请以root用户身份运行以下命令:
〜]#usermod -G group_name1,group_name2,... user_name
[root@localhost ~]# usermod -G xiaolan,xiaohua google
[root@localhost ~]# tail -5 /etc/group
google:x:1001:
xiaohong:x:1002:
xiaolv:x:1003:
xiaohua:x:1004:google
xiaolan:x:1005:google
请注意,在这种情况下,用户的所有先前补充组都将被新组或几个新组替换
。要将一个或多个组添加到用户的补充组
,请以超级用户身份运行以下命令之一:
〜]#usermod -aG group_name1,group_name2,... user_name
〜]#usermod --append -G group_name1,group_name2,... user_name
[root@localhost ~]# usermod -aG xiaohong,xiaolv google
[root@localhost ~]# tail -5 /etc/group
google:x:1001:
xiaohong:x:1002:google
xiaolv:x:1003:google
xiaohua:x:1004:google
xiaolan:x:1005:google
请注意,在这种情况下,新组将附加到用户当前的补充组中
。
系统管理员通常喜欢为每个主要项目
创建一个组,并在需要访问该项目文件时将人员分配给该组
。使用这种传统方案,当某人创建文件时,该文件与他们所属的主要组相关联。当一个人从事多个项目时,很难将正确的文件与正确的组相关联。但是,使用UPG
方案时,会将组自动分配给在setgid位置
的目录中创建的文件。setgid位
使共享一个公用目录的组项目的管理非常简单,因为用户在该目录中创建的任何文件都归拥有该目录的组所有。
例如,一群人需要处理/ opt / myproject /
目录中的文件。可以信任某些人修改此目录的内容,但并非所有人都可以。
/ opt / myproject /
目录:[root@localhost ~]# mkdir /opt/myproject
project
组添加到系统:[root@localhost ~]# groupadd project
/ opt / myproject /
目录的内容与project
组相关联:[root@localhost ~]# chown root:project /opt/myproject/
设置setgid位
:[root@localhost ~]# chomod 2775 /opt/myproject/
此时,project
组的所有成员都可以在/ opt / myproject /
目录中创建和编辑文件,而管理员不必在用户每次写入新文件时更改文件许可权。要验证权限设置是否正确,请运行以下命令:
[root@localhost ~]# ll -d /opt/myproject/
drwxrwsr-x. 2 root project 6 6月 14 22:41 /opt/myproject/
5.将用户添加到project
组:
usermod -aG myproject username
[root@localhost ~]# usermod -aG project google
[root@localhost ~]# tail -1 /etc/group
project:x:1006:google
[google@localhost ~]$ cd /opt/myproject/
[google@localhost myproject]$ > my_first_project
[google@localhost myproject]$ ll my_first_project
-r--r-----. 1 google project 0 6月 15 10:15 my_first_project
进程创建文件时,该文件具有某些默认权限,例如-rw-rw-r--
。这些初始权限部分由文件模式创建掩码(也称为文件权限掩码或umask
)定义。每个进程都有自己的umask
。例如,bash
默认情况下具有umask 0022
。进程umask
可以更改。
umask
由与标准文件权限相对应的位组成。例如,对于umask 0137
,这些数字表示:
umask不影响特殊位
)Umask
可以二进制
,八进制
或符号表示法
表示。例如,八进制表示形式0137
等于符号表示形式u = rw-,g = r-,o = ---
。符号表示法规范与八进制表示法规范相反:它显示允许的权限,而不是禁止的权限。Umask禁止为文件设置权限
:
下图显示了umask 0137
如何影响创建新文件。
出于安全原因,默认情况下,常规文件不能具有执行权限。 因此,即使umask
为0000
(不禁止任何权限),新的常规文件仍然没有执行权限。 但是,可以使用执行权限创建目录:
[root@localhost tmp]# umask 0000
[root@localhost tmp]# > file
[root@localhost tmp]# mkdir direct
[root@localhost tmp]# ls -lh
总用量 4.0K
drwxrwxrwx. 2 root root 6 6月 14 23:00 direct
-rw-rw-rw-. 1 root root 0 6月 14 22:59 file
对于流行的shell,例如bash,ksh,zsh和tcsh,使用内置的umask shell管理umask。从shell启动的进程继承其umask。显示当前掩码要以八进制表示法显示当前umask,请执行以下操作:
[root@localhost ~]# umask
0000
要以符号表示法显示当前的umask
:
[root@localhost ~]# umask -S
u=rwx,g=rwx,o=rwx
使用umask在shell中设置mask,要使用八进制符号为当前的shell会话设置umask,请运行:
umask octal_mask
用从0到7的四个或更少的数字替换octal_mask
。提供三个或更少的数字时,将权限设置为好像命令包含前导零。 例如,umask 7转换为0007。
使用八进制表示法设置umask
要禁止新文件拥有所有者和组的写入和执行权限,以及拥有其他所有者的权限:
[root@localhost ~]# umask 0337
# or
[root@localhost ~]# umask 337
使用默认的shell umask
,shell 通常都有一个配置文件,其中设置了默认的umask。对于bash,它是/ etc / bashrc
。要显示默认的bash umask
:
[root@localhost ~]# grep -i -B 1 umask /etc/bashrc
# By default, we want umask to get set. This sets it for non-login shell.
--
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
使用特定用户的默认Shell umask
默认情况下,新用户的bash umask
默认为/ etc / bashrc
中定义的umask
。要为特定用户更改bash umask
,请在该用户的$ HOME / .bashrc
文件中添加对umask命令的调用。 例如,要将用户google的bash umask
更改为0227:
[google@localhost ~]$ umask
0022
[google@localhost ~]$ echo 'umask 227'>> /home/google/.bashrc
[google@localhost ~]$ source ./.bashrc
[google@localhost ~]$ umask
0227
[google@localhost ~]$ mkdir ubash
[google@localhost ~]$ ll -d ubash/
dr-xr-x---. 2 google google 6 6月 15 10:26 ubash/
为新创建的主目录设置默认权限,要更改用于创建用户主目录的权限,请更改/etc/login.defs
文件中的UMASK
变量:
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077
more and more.