用户与组的概念
linux多用户,多任务的特性
Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响,例如某台linux服务器上有4个用户,分别是root、www、ftp和mysql,在同一时间内,root用户可能在查看系统日志,管理维护系统,www用户可能在修改自己的网页程序,ftp用户可能在上传软件到服务器,mysql用户可能在执行自己的SQL查询,每个用户互不干扰,有条不紊的进行着自己的工作,而每个用户之间不能越权访问,比如www用户不能执行mysql用户的SQL查询操作,ftp用户也不能修改www用户的网页程序,因此可知,不同用户具有不同的权限,每个用户是在权限允许的范围内完成不同的任务,linux正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
linux下用户的角色分类
-
超级用户:拥有对系统的最高管理权限,默认是root用户。
-
普通用户:只能对自己目录下的文件进行访问和修改,具有登录系统的权限,例如上面提到的www用户、ftp用户等。
-
虚拟用户:也叫“伪”用户,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。
用户和组的概念
Linux是一个多用户多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是一个概念,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
每个用户都用一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能进入系统和自己的主目录。
用户组是具有相同特征用户的逻辑集合,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有10个用户的话,就需要授权10次,显然这种方法不太合理;另一种方法是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中,那么所有用户就具有了和组一样的权限。这就是用户组,将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。
用户和组的关系
用户和用户组的对应关系有:一对一、一对多、多对一和多对多;下图展示了这种关系:
-
一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。
-
一对多:即一个用户可以存在多个用户组中。那么此用户具有多个组的共同权限。
-
多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限。
-
多对多:多个用户可以存在多个组中。其实就是上面三个对应关系的扩展。
用户和组相关的配置文件
/etc/passwd
系统用户配置文件,是用户管理中最重要的一个文件。这个文件记录了Linux系统中每个用户的一些基本属性,并且对所有用户可读。/etc/passwd中每一行记录对应一个用户,每行记录又被冒号分割:
root:x:0:0:root:/root:/bin/bash
其格式和具体含义如下:
用户名:口令:用户标识号:组标识号:注释性描述:主目录:默认shell
下面是每个字段的详细含义:
-
用户名:是代表用户账号的字符串。
-
口令:存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 版本都使用了shadow技术,把真正加密后的用户口令存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如用“x”或者“*”来表示。
-
用户标识号:就是用户的UID,每个用户都有一个UID,并且是唯一的,通常UID号的取值范围是0~65535,0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。而在Linux系统中,普通用户UID默认从500开始。UID是linux下确认用户权限的标志,用户的角色和权限都是通过UID来实现的,因此多个用户公用一个UID是非常危险的,会造成系统权限和管理的混乱,例如将普通用户的UID设置为0后,这个普通用户就具有了root用户的权限,这是极度危险的操作。因此要尽量保持用户UID的唯一性。
-
组标识号:就是组的GID,与用户的UID类似,这个字段记录了用户所属的用户组。它对应着/etc/group文件中的一条记录。
-
注释性描述:字段是对用户的描述信息,比如用户的住址、电话、姓名等等。
-
主目录:也就是用户登录到系统之后默认所处的目录,也可以叫做用户的主目录、家目录、根目录等等。
-
默认shell:就是用户登录系统后默认使用的命令解释器,shell是用户和linux内核之间的接口,用户所作的任何操作,都是通过shell传递给系统内核的。linux下常用的shell有sh、bash、csh等,管理员可以根据用户的习惯,为每个用户设置不同的shell。
/etc/shadow
用户影子文件,由于/etc/passwd文件是所有用户都可读的,这样就导致了用户的密码容易出现泄露,因此,linux将用户的密码信息从/etc/passwd中分离出来,单独的放到了一个文件中,这个文件就是/etc/shadow,该文件只有root用户拥有读权限,从而保证了用户密码的安全性。文件内容如下:
root:$6$emgTqM1yDRLpi3ll$ZggDBxugFnv5KpB/V6/Kii.mX9pD.TRb6QYOtMifuw.SE0fQ2YUFsMJzKZTlZDEKp3okwCTKETsSIXl7hilf0.::0:99999:7:::
文件内容的格式:
用户名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段
每个字段的详细含义:
-
用户名:与/etc/passwd文件中的用户名有相同的含义。
-
加密口令:存放的是加密后的用户口令字串,如果此字段是“*”、“!”、“x”等字符,则对应的用户不能登录系统。
-
最后一次修改时间:表示从某个时间起,到用户最近一次修改口令的间隔天数。可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化。
-
最小时间间隔:表示两次修改密码之间的最小时间间隔。
-
最大时间间隔:表示两次修改密码之间的最大时间间隔,这个设置能增强管理员管理用户的时效性。
-
警告时间:表示从系统开始警告用户到密码正式失效之间的天数。
-
不活动时间:此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统不再让此用户登录,也不会提示用户过期,是完全禁用。
-
失效时间:表示该用户的帐号生存期,超过这个设定时间,帐号失效,用户就无法登录系统了。如果这个字段的值为空,帐号永久可用。
-
保留字段:linux的保留字段,目前为空,以备linux日后发展之用。
/etc/group
用户组配置文件,用户组的所有信息都存放在此文件中,文件内容如下:
root:x:0:
文件内容的格式:
组名:口令:组标识号:组内用户列表
每个字段的含义:
-
组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的用户名一样,组名不能重复。
-
口令:存放的是用户组加密后的口令字串,密码默认设置在/etc/gshadow文件中,而在这里用“x”代替,linux系统下默认的用户组都没有口令,可以通过gpasswd来给用户组添加密码。
-
组标识号:就是GID,与/etc/passwd中的组标识号对应。
-
组内用户列表: 显示属于这个组的所有用户,多个用户之间用逗号分隔。
/etc/login.defs
用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。下面是CentOS 6系统的信息:
# egrep -v "^$|^#" /etc/login.defs
MAIL_DIR /var/spool/mail
当创建用户时,同时在目录/var/spool/mail中创建一个用户mail文件
PASS_MAX_DAYS 99999
#指定密码保持有效的最大天数
PASS_MIN_DAYS 0
表示自从上次密码修改以来多少天后用户才被允许修改口令
PASS_MIN_LEN 5
指定密码的最小长度
PASS_WARN_AGE 7
表示在口令到期前多少天系统开始通知用户口令即将到期
UID_MIN 500
指定最小UID为500 ,也就是说添加用户时,用户的UID 从500开始
UID_MAX 60000
指定最大UID为60000
GID_MIN 500
指定最小GID为500,也就是添加组时,组的GID从500开始。
GID_MAX 60000
指定最大GID为60000
CREATE_HOME yes
此项是指定是否创建用户主目录,yes为创建,no为不创建。
UMASK 077
权限掩码初始化为此值。 如果未指定,则权限掩码将初始化为022。
USERGROUPS_ENAB yes
这使得userdel可以删除用户组(如果没有成员)。
ENCRYPT_METHOD SHA512
使用SHA512加密密码。
下面是CentOS 7 系统的信息:
# egrep -v "^$|^#" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
通过CentOS 6 和CentOS 7的配置文件我们可以看到两者的差别:
-
CentOS 6 中系统的用户UID和GID是从 500开始,而CentOS 7 是从1000开始。
-
CentOS 7 中增加了系统用户的ID最小值和最大值以及系统组的ID的最大值和最小值。
/etc/default/useradd
当我们通过useradd命令不加任何参数创建一个用户后,用户默认的主目录一般位于/home下,默认使用的shell是/bin/bash,这是为什么呢,看看/etc/default/useradd这个文件的内容就完全明白了。
# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
此项表示将新建用户的主目录放在/home目录下
INACTIVE=-1
此项表示是否启用帐号过期禁用,-1表示不启用
EXPIRE=
此项表示帐号过期日期,不设置表示不启用
SHELL=/bin/bash
此项指定了新建用户的默认shell类型
SKEL=/etc/skel
此项用来指定用户主目录默认文件的来源,也就是说新建用户主目录下的文件都是从这个目录下复制而来的
CREATE_MAIL_SPOOL=yes
是否创建用户的邮件收件箱
/etc/default/useradd文件定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值。改变此文件有两种方法,一种是通过文本编辑器方式更改,另一种是通过useradd命令来更改。这里介绍一下第二种方法:
Useradd命令加“-D”参数后,就可以修改配置文件/etc/default/useradd,useradd –D不加任何参数时,显示/etc/default/useradd文件的当前设置,使用的一般格式为:
useradd -D [-g group] [-b base] [-s shell] [-f inactive] [-e expire ]
每个选项详细含义如下:
-
-g default_group :表示新建用户的起始组名或者GID,组名必须为已经存在的用户组名称,GID也必须是已经存在的用户组GID。与/etc/default/useradd文件中“GROUP”行对应。
-
-b default_home :指定新建用户主目录的上级目录,也就是所有新建用户都会在此目录下创建自己的主目录。与/etc/default/useradd文件中HOME行对应。
-
-s default_shell :指定新建用户默认使用的shell,与/etc/default/useradd文件中“SHELL”行对应。
-
-f default_inactive :指定用户帐号过期多长时间后就永久停用,与/etc/default/useradd文件中“INACTIVE”行对应。
-
-e default_expire_date :指定用户帐号的过期时间。与/etc/default/useradd文件中“EXPIRE”行对应。
/etc/skel
在创建一个新用户后,会在新用户的主目录下看到类似.bash_profile, .bashrc, .bash_logout等文件,这些文件是怎么来的呢,如果我想让新建立的用户在主目录下默认拥有自己指定的配置文件,该如何设置呢? /etc/skel目录就是解决这个问题的,/etc/skel目录定义了新建用户在主目录下默认的配置文件,更改/etc/skel目录下的内容就可以改变新建用户默认主目录的配置文件信息。
# ls -lah /etc/skel/
总用量 28K
drwxr-xr-x. 4 root root 4.0K 3月 13 14:25 .
drwxr-xr-x. 79 root root 4.0K 4月 5 22:39 ..
-rw-r--r--. 1 root root 18 10月 16 2014 .bash_logout
-rw-r--r--. 1 root root 176 10月 16 2014 .bash_profile
-rw-r--r--. 1 root root 124 10月 16 2014 .bashrc
用户与组的相关命令
useradd
用户账号的管理工作主要涉及到用户账号的添加、修改和删除。 添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。下面就添加用户命令useradd的使用。
语法
useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]
useradd -D [-b][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>]
参数
-
-c:加上备注文字,备注文字保存在passwd的备注栏中。
-
-d:指定用户登入时的启始目录。
-
-D:变更预设值。
-
-e:指定账号的有效期限,缺省表示永久有效。
-
-f:指定在密码过期后多少天即关闭该账号。
-
-g:指定用户所属的群组。
-
-G:指定用户所属的附加群组。
-
-m:自动建立用户的登入目录。
-
-M:不要自动建立用户的登入目录。
-
-n:取消建立以用户名称为名的群组。
-
-r:建立系统账号。
-
-s:指定用户登入后所使用的shell。
-
-u:指定用户ID号。
usermod
usermod命令可用来修改用户帐号的各项设定。
语法
usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]
参数
-
-c<备注> 修改用户帐号的备注文字。
-
-d登入目录> 修改用户登入时的目录。
-
-e<有效期限> 修改帐号的有效期限。
-
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-
-g<群组> 修改用户所属的群组。
-
-G<群组> 修改用户所属的附加群组。
-
-l<帐号名称> 修改用户帐号名称。
-
-L 锁定用户密码,使密码无效。
-
-s<shell> 修改用户登入后所使用的shell。
-
-u<uid> 修改用户ID。
-
-U 解除密码锁定。
userdel
userdel 是一个底层用于删除用户的工具。userdel 会查询系统账户文件,例如 /etc/password 和 /etc/group。那么它会删除所有和用户名相关的条目。在我们删除它之前,用户名必须存在。由于 userdel 会修改系统账户文件,那么我们需要root特权来运行它。不然我们会遇到一个报错信息“只有root权限才能执行这项操作”或者类似的信息。在我们得到特权后,我们可以通过输入 userdel 从你的控制台删除用户。
参数
-
-r 删除用户登入目录以及目录中所有文件。
-
-f 强制删除用户
说明:在用userdel删除用户的时候不带选项只会删除用户,而用户的家目录并不会删除,若想删除就用-r选项,但是这么操作很危险,容易产生误删除,而删除用户在还原时会有点麻烦,在这建议要是今后那个用户还有可能使用就在/etc/passwd文件中把此用户的开头给注释掉,今后在想使用就可以取消注释就行了。
passwd
passwd 命令普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被root用户锁定;如果root用户运行passwd ,可以设置或修改任何用户的密码;
参数
-
-k, --keep-tokens :保持身份验证令牌不过期
-
-d, --delete:删除已命名帐号的密码(只有根用户才能进行此操作)
-
-l, --lock:锁住用户无权更改其密码,仅能通过root权限操作;
-
-u, --unlock :解除锁定;
-
-f, --force:强制操作;
-
-x, --maximum=DAYS :密码的最长有效时限(只有根用户才能进行此操作)
-
-n, --minimum=DAYS:密码的最短有效时限(只有根用户才能进行此操作)
-
-w, --warning=DAYS :在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
-
-i, --inactive=DAYS :当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
-
-S, --status:报告已命名帐号的密码状态(只有根用户才能进行此操作)
-
--stdin:从标准输入读取令牌(只有根用户才能进行此操作)
说明:passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码;如果是普通用户执行passwd 只能修改自己的密码; 如果新建用户后,要为新用户创建密码,则用 passwd 用户名 ,注意要以root用户的权限才能创建;而上面这种创建和修改密码都是交互试的,而我们要是写脚本就不是很合适了下面就用echo命令加上管道来一条命令搞定密码的修改创建,但是这种创建很容易会让人看到密码所以还是谨慎使用。
# echo password | passwd --stdin root
# echo -e "password
password" |passwd root
groupadd
groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
参数
-
-g gid:指定组ID号。
-
-o:允许组ID号,不必惟一。
-
-r:创建系统工作组,系统工作组的组ID小于500;
-
-f:加入已经有的组时,发展程序退出。
-
-K:覆盖配置文件“/ect/login.defs”;
groupmod
groupmod命令用于更改群组识别码或名称。 需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。
参数
-
-g <群组识别码> 设置欲使用的群组识别码。
-
-o 重复使用群组识别码。
-
-n <新群组名称> 设置欲使用的群组名称。
groupdel
groupdel命令用于删除指定的工作组,此命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。 如果有任何一个群组的使用者在线上的话就不能移除该群组。最好先移除使用者后再移除群组。
gpasswd
gpasswd命令用于管理/ etc / group和/ etc / gshadow。 每个组都可以有管理员,成员和密码。
参数
除了 -A 和 -M 选项,其它选项不能联合使用。
-
-a, --add USER 向组 GROUP 中添加用户 USER
-
-d, --delete USER 从组 GROUP 中添加或删除用户
-
-h, --help 显示此帮助信息并推出
-
-Q, --root CHROOT_DIR 要 chroot 进的目录
-
-r, --delete-password remove the GROUP's password
-
-R, --restrict 向其成员限制访问组 GROUP
-
-M, --members USER,... 设置组 GROUP 的成员列表
-
-A, --administrators ADMIN,... 设置组的管理员列表
如何使用:
如系统有个peter账户,该账户本身不是groupname群组的成员,使用newgrp需要输入密码即可 让使用者暂时加入成为该组成员,之后peter建立的文件group也会是groupname。所以该方式可以暂时让peter建立文件时使用其他的组,而不是peter本身所在的组。 所以使用gpasswd groupname设定密码,就是让知道该群组密码的人可以暂时切换具备groupname群组功能的。
gpasswd -A peter users
gpasswd -a mary users
gpasswd -a allen users
给组账号设置完密码以后,用户登陆系统,使用newgrp命令,输入给组账号设置的密码,就可以临时添加到指定组,可以管理组用户,具有组权限。
newgrp
newgrp命令用于登入另一个群组。 newgrp指令类似login指令,当它是以相同的帐号,另一个群组名称,再次登入系统。欲使用newgrp指令切换群组,您必须是该群组的用户,否则将无法登入指定的群组。实际使用中单一用户要同时隶属多个群组,需利用交替用户的设置。若不指定群组名称,则newgrp指令会登入该用户名称的预设群组。若切换到其他用户组来执行一些操作,就用到newgrp命令切换当前登录所在组。
chage
chage命令更改密码更改与最后一次密码更改日期之间的天数。 该信息由系统使用以确定用户何时必须更改其密码。
参数
-
-d, --lastday 最近日期 将最近一次密码设置时间设为“最近日期”
-
-E, --expiredate 过期日期 将帐户过期时间设为“过期日期”
-
-h, --help 显示此帮助信息并推出
-
-I, --inactive INACITVE 过期 INACTIVE 天数后,设定密码为失效状态
-
-l, --list 显示帐户年龄信息
-
-m, --mindays 最小天数 将两次改变密码之间相距的最小天数设为“最小天数”
-
-M, --maxdays 最大天数 将两次改变密码之间相距的最大天数设为“最大天数”
-
-R, --root CHROOT_DIR chroot 到的目录
-
-W, --warndays 警告天数 将过期警告天数设为“警告天数”
id
id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它,只需要在你的控制台输入id。不带选项输入id会显示如下。结果会使用活跃用户。 当我们想知道某个用户的UID和GID时id命令是非常有用的。一些程序可能需要UID/GID来运行。id使我们更加容易地找出用户的UID以GID而不必在/etc/group文件中搜寻。
参数
-Z, --context 仅显示当前用户的安全环境
-g, --group 仅显示有效的用户组ID
-G, --groups 显示所有组的ID
-n, --name 显示组名称而非数字,不与-ugG 一起使用
-r, --real 显示真实ID 而非有效ID,与-ugG 一起使用
-u, --user 仅显示有效用户ID