用户和权限对于操作系统来说有着非比寻常的重要意义,可以说能够在一个操作系统中完成的几乎所有的操作都是与用户和权限相关。因此,Linux系统中的用户与权限的管理工作也就显得相当重要了。
Linux系统认为一切皆是文件,而文件具有一系列的属性信息来标识它,例如表示文件名、文件类型、文件的创建者、创建时间、读取时间、权限等等都是对一个文件进行标识的信息。其中,用户和权限作为与使用者直接相关的属性在Linux系统进行资源分派的过程中起着举足轻重的作用。
1. 用户与用户组
1.1 资源分派
系统资源的调度与分配是一个计算机运行过程中不可或缺的必要管理技术手段,用户和权限在计算机资源的调度过程中通常与认证(Authentication)、授权(Authorization)、审计(Accounting)相关。而计算机系统也正是利用这种访问控制机制来满足计算机资源的合理使用、合理调度、合法访问等需求。例如,进程是运行中的程序,而进程所能访问的所有资源的权限取决于进程发起者的身份,也就是用户。
1.2 用户分类
Linux系统中的每个用户都有一个用户名(username),并且通过UID来标识不同的用户。在Linux系统中创建一个新用户时,管理员(root)为新用户指定一个username(一个字符串,便于人类记忆),在未指定UID时,系统会自动为其添加UID,并且将其与新用户的username绑定。可以说username是用户登陆时使用的,UID是Linux系统用于标识用户的。
Linux作为一个多用户操作系统,用户的分类主要依据UID来分类:
管理员:root,UID为0
普通用户:UID为1~65535,其中1~499用于系统用户,500~65535用于可登陆用户。
1.3 用户组分类
用户组的概念其实可以类比一个部门的员工的形式,属于同一个部门的人往往都是完成相同工作的一个团队。那么Linux中的用户组其实也可以为同一个组中的用户对系统中的资源赋予相同的访问权限,便于该组人员的工作开展。用户组的分类与用户的分类类似,是基于GID进行的分类:
管理员组:root,GID为0
普通组:GID为1~65535,其中1~499用于系统组,500~65535用于普通用户组。
除此之外,用户组还存在基本组和附加组:
基本组也称为主组,通常是在Linux系统创建新用户时,系统会在指定给该用户一个UID的同时,也指定给该用户一个GID。此时该用户就拥有主组,并且用户的这个主组与用户名同名,UID和GID编号也相同。主组中仅包含与组名同名的一个用户,是该用户的私有组。
附加组是在用户加入自己的主组之外的用户组,通常会存在多个用户,一般由root用户指定并分配相应权限。属于同一个附加组的用户对该组的相关文件具有相同的访问权限。
1.4 文件所属关系
对于Linux中的文件来说,一般创建该文件的用户是文件所有者(user),文件所属的组是文件所属组(group),除此之外的其他所有用户称为其他用户(Others)。注意,root用户不受此限制。文件所有者通常只有一个,通常是创建该文件的用户,也可以由root进行手动更改文件所有者。所属组中的用户通常对该文件具有相同的访问权限。除root之外的用户,既不是文件所有者,也不是文件所属组中的用户,默认只具有其他用户(Others)的访问权限。
root用户可以不受用户所属关系的权限限制,几乎能够进行Linux系统中的99.99%的操作。但是,从系统安全的角度来看,使用root用户来完成各项操作并非最佳选择,因为当所掌握的权限越大时,也越容易对Linux系统进行破坏,或者由于操作不慎而导致无法挽回的严重事件。也正是处于对Linux系统安全的考虑,通常使用Linux时建议以普通用户来完成各项操作,如果碰见权限不够等问题出现时,可以使用比如sudo等方式进行处理,尽最大可能的保证系统的正常运作。
1.5 用户配置文件
Linux系统的用户和密码信息分别存储在/etc/passwd和/etc/shadow文件中。系统启动后,会加载一个login的登录进程,提供给用户来登录操作系统。当用户输入用户名和密码后,该进程会根据/etc/passwd和/etc/shadow文件中所存储的与用户登录信息相关的内容进行比对,以确定用户输入的信息是否正确。
在/etc/passwd文件中存放的是Linux系统的用户信息,文件所有者是root用户,可以对其进行读写以及其他操作。对普通用户和其他用户来说,该文件仅是可读的,此处使用cat来查看其中的内容(仅列出一部分):
ubuntu@localhost:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
/etc/passwd文件中以行为单位存储一个用户的相关信息,每行有7个字段,用冒号分隔,说明如下:
用户名:口令:UID:GID:描述信息:主目录:默认shell
含义如下:
用户名:用户登陆系统使用的名称,是一个便于用户辨识的字符串,用户名不可重复。
口令:即密码,现在该字段的内容是x,以前的Linux系统是用该字段来存储明文密码,现在真正的密码采用哈希值的形式存在于/etc/shadow文件中,所以此字段在这里仅仅用作占位符。
UID:Linux系统分配的User ID值,可在创建时手工指定。
GID:Linux系统分配给用户组的GroupID值,可在创建时手工指定。
描述信息:该字段中存放相关用户的额外描述信息,如电话,住址等。
主目录:也称为家目录,用户登录系统后的默认工作目录。root用户的主目录是/root,普通用户的主目录通常都是在/home目录下以用户名作为家目录名,同时也可以在创建时指定。
默认shell:用户登录系统后使用的shell环境。
在/etc/shadow文件中存放的是用户的密码相关信息,同样也是采用冒号为分隔,密码存储格式采用哈希值的形式。这个文件仅root用户具有读写权限,普通用户和其他用户都不可读写。此处使用cat来查看文件内容(仅列出一部分):
ubuntu@localhost:~# sudo cat /etc/shadow
ubuntu:$6$wWuyiyzOJ5oUywUU5fsWP.:17997:0:99999:7:::
格式如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
含义如下:
用户名:用户登陆系统使用的名称。
加密密码:若该字段为空,则该用户未设置密码;若该字段为*,则账户被锁定;若该字段以“!”开始,则表示密码被锁定,感叹号之后为原有密码;所有伪用户的密码都是 “!!” 或"*",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是"!!",代表这个用户没有密码,不能登录。另外,若以
6
6
6开头表示使用SHA-512加密;以
1
1
1开头表示用MD5加密;以
2
2
2开头表示使用Blowfish加密;以
5
5
5开头表示使用SHA-256加密。
最后一次修改时间:指最近一次修改密码的时间,时间以天为单位,Linux计算日期的时间是以1970 年 1 月 1 日作为 1 不断累加得到的时间。0表示用户下次登录需要修改密码,空串表示禁用该功能。
最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
密码有效期:表示保持当前密码有效的最长时间。管理服务器时,通过这个字段强制用户定期修改密码。经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。该字段的默认值为 99999,也就是 273年,可认为是永久生效。如果改为 90,则表示密码被修改 90天之后必须再次修改,否则该用户即将过期。到期之后,用户在登录时会被要求更改密码,但用户仍然可以通过当前密码登录,空串表示没有限制。如果最大时间间隔小于最小时间间隔,则用户将无法修改密码。
密码需要变更前的警告天数:密码过期之前,发出警告的天数。与第 5字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户"再过n天你的密码就要过期了,请尽快重新设置你的密码!"。该字段的默认值是7,也就是说,距离密码有效期的第7天开始,每次登录系统都会向该账户发出"修改密码" 的警告信息。0或空串表示无警告时间。
密码过期后的宽限时间:密码过期之后,仍然接受改密码的最长天数。在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用,空串表示无限制。
账户失效时间:账户的有效期。自1970年1月1日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用,空串表示永不过期。该字段通常被使用在具有收费服务的系统中。
保留字段:这个字段目前没有使用,等待新功能的加入。
1.6 用户组配置文件
Linux系统的用户组和组密码信息分别存储在/etc/group和/etc/gshadow文件中。/etc/group文件是记录GID和组名相对应的文件,同样是以冒号为分割,共四个字段,使用cat查看如下(仅列出一部分):
ubuntu@localhost:~# cat /etc/group
root:x:0:
bin:x:1:bin,daemon
每个字段对应的含义为:
组名:组密码:GID:该用户组中的用户列表
含义如下:
组名:用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。
组密码:和 /etc/passwd 文件一样,这里的 "x"仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。
GID:Linux 系统就是通过 GID来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。此处的GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID对应的群组名,就是通过此文件对应得到的。
该用户组中的用户列表:列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的主组,则该用户不会写入这个字段,所以,该字段显示的用户都是这个用户组的附加用户。每个用户都可以加入多个附加组,但是只能属于一个主组。
组用户的密码信息存储在/etc/gshadow文件中,同样以冒号为分隔,共四个字段,使用cat查看如下(仅列出一部分):
ubuntu@localhost:~# sudo cat /etc/gshadow
root:::
bin:::bin, daemon
格式如下:
组名:组密码:组管理员:组附加用户列表
含义如下:
组名:与/etc/group 文件中的组名相对应。
组密码:对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为"!",指的是该群组没有组密码,也不设有群组管理员。
组管理员:从系统管理员的角度来说,/etc/gshadow文件最大的功能就是创建群组管理员。考虑到 Linux 系统中账号太多,而超级管理员 root可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦root 了。不过,由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用了。
组附加用户列表:显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。
1.7 /etc/login.defs文件详解
/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID的范围,用户的过期时间,密码的最大长度,等等。但是,该文件的默认配置对 root 用户无效。并且,当该文件中的配置与 /etc/passwd 和/etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。
设置项 | 含义 |
---|---|
MAIL_DIR /var/spool/mail | 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。 |
PASS_MAX_DAYS 99999 | 密码有效期,99999是自1970年1月1日起密码有效的天数,相当于273年,可理解为密码始终有效。 |
PASS_MIN_DAYS 0 | 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。 |
PASS_MIN_LEN 5 | 指定密码的最小长度,默认不小于5位,但是现在用户登录时验证已经被PAM模块取代,所以这个选项并不生效。 |
PASS_WARN_AGE 7 | 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。 |
UID_MIN 500 | 指定最小UID为500,也就是说,添加用户时,默认UID从500开始。注意,如果手工指定了一个用户的 UID是550,那么下一个创建的用户的UID就会从551开始,哪怕500~549之间的UID没有使用。 |
UID_MAX 60000 | 指定用户最大的UID为60000。 |
GID_MIN 500 | 指定最小GID为500,也就是在添加组时,组的 GID从500开始。 |
GID_MAX 60000 | 用户GID最大为60000。 |
CREATE_HOME yes | 指定在创建用户时,是否同时创建用户主目录,yes表示创建,no 则不创建,默认是 yes。 |
UMASK 077 | 用户主目录的默认权限默认设置为077。 |
USERGROUPS_ENAB yes | 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。 |
ENCRYPT_METHOD SHA512 | 指定用户密码采用的加密规则,默认采用SHA512,这是新的密码加密模式,原先的Linux只能用 DES或MD5加密。 |
2. 用户及用户组配置管理
用户配置管理即是对用户的增删改查等操作,涉及的相关命令有useradd、adduser、su、usermod、passwd、userdel、groupadd、groupmod、groupdel、gpasswd、chpasswd、newgrp、chage、chsh等,注意以下操作均使用root用户登录。
2.1 useradd添加用户
在Linux系统中创建用户时使用useradd命令完成,格式如下:
useradd [options] USERNAME
常用参数如下:
-c<备注> 加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录> 指定用户登入时的起始目录。
-D 查看用户环境变量默认配置。
-e<有效期限> 指定帐号的有效期限。
-f<缓冲天数> 指定在密码过期后多少天即关闭该帐号。
-g<群组> 指定用户所属的主组,用户组要存在才可以。
-G<群组> 指定用户所属的附加组,用户组要存在才可以。
-m 自动建立用户的登入目录。
-M 不要自动建立用户的登入目录。
-n 取消建立以用户名称为名的群组.
-r 建立系统用户,创建后的用户UID会比/etc/login.defs文件中定义的UID_MIN小。默认此种方式创建的用户UID取值范围为100~999,且不会为新用户创建主目录。
-s 指定用户登入后所使用的shell,若不手工指定,则会根据/etc/default/useradd中的预设值设置。
-u 指定用户ID,必须是唯一的。
useradd命令的整体执行流程如下:
1.如果不加任何参数,后面直接跟所添加的用户名,那么系统首先会读取/etc/login.defs(用户默认属性设置文件)和/etc/default/useradd(添加用户默认配置)中定义的参数和规则。
2.然后根据所设置的规则添加用户,同时还会向/etc/passwd和/etc/group文件内添加新用户和新用户组记录。再向/etc/shadow和/etc/gshadow中添加新用户和用户组对应的密码信息记录。
3.最后,Linux系统还会根据/etc/default/useradd文件所配置的信息建立用户的主目录,并将/etc/skel中的所有文件(包括隐藏配置文件)都复制到新用户的主目录中。
例如:
添加一个新用户并指定主目录:
root@localhost:~# mkdir /home/workdir
root@localhost:~# useradd -d /home/workdir/ testUser
root@localhost:~# cat /etc/passwd
testUser:x:1001:1005::/home/workdir/:/bin/sh
添加新用户并指定UID和登陆shell:
root@localhost:~# useradd -u 1100 -s /bin/bash testuser2
root@localhost:~# cat /etc/passwd
testuser2:x:1100:1100::/home/testuser2:/bin/bash
2.2 adduser添加用户
Ubuntu Linux中支持的adduser命令是一个Perl脚本文件,会有一系列的提示信息便于对新用户相关信息的设置。在添加用户时如果不加参数选项,则会进入一个交互式的命令行,根据提示填写相关信息,若不需要填写时,可以直接按Enter键。使用格式如下:
adduser [options] user
选项说明:
–disabled-login 不为新用户设置密码。这意味着用户不能登录系统,除非为它设置密码。
–disabled-password 用户不能使用密码认证,但可以通过其他方式认证,如RSA密钥。
–uid 指定新用户的UID。
–gid 指定新用户组的GID。
–home 指定用户的主目录。
–shell 指定用户默认的登录shell。
例如:
使用adduser创建用户时指定UID,进入交互式操作命令行:
root@localhost:~# adduser --uid 2000 test2020
Adding user `test2020' ...
Adding new group `test2020' (2000) ...
Adding new user `test2020' (2000) with group `test2020' ...
Creating home directory `/home/test2020' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test2020
Enter the new value, or press ENTER for the default
Full Name []: tesetadsf
Room Number []: 2020202020
Work Phone []: 1293432344
Home Phone []: 123434234
Other []: email
Is the information correct? [Y/n] y
You have new mail in /var/mail/root
root@localhost:~# cat /etc/passwd
test2020:x:2000:2000:tesetadsf,2020202020,1293432344,123434234,email:/home/test2020:/bin/bash
2.3 查看用户信息相关小命令
查看用户相关信息的命令主要有:
id:显示用户的ID相关信息。常用参数有:
-g 显示用户组GID。
-G 显示所有的GID号,包括附加组的GID。
-u 显示用户UID。
例如:
root@localhost:~# id
uid=0(root) gid=0(root) groups=0(root)
root@localhost:~# id ubuntu
uid=1000(ubuntu) gid=1004(ubuntu) groups=1004(ubuntu)
w:显示当前系统已登录用户的信息
root@localhost:~# w
04:20:48 up14:12, 2 users, load average: 0.01, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ubuntu tty1 - 08Apr20 3:50m 1.46s 1.41s -bash
ubuntu pts/1 192.168.254.1 02:44 0.00s 0.70s 0.05s sshd: ubuntu [priv]
whoami:显示当前用户的身份
root@localhost:~# whoami
root
last:显示用户登录列表与时长
root@localhost:~# last
ubuntu pts/1 192.168.254.1 Wed Apr 29 02:44 still logged in
ubuntu pts/1 192.168.254.1 Wed Apr 29 00:30 - 00:33 (00:03)
ubuntu pts/2 192.168.254.1 Tue Apr 28 00:17 - 00:36 (00:18)
2.4 su切换用户
使用su命令能够实现在不同用户身份之间的切换。格式如下:
su [option] [user]
选项如下:
-f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
-m -p 或 --preserve-environment 执行 su 时不改变环境变数
-c command 或 --command=command 变更为帐号为 USER的使用者并执行指令(command)后再变回原来使用者
-s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为/etc/passwd 内的该使用者(USER) shell
–help 显示说明文件
–version 显示版本资讯
–l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOMESHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
USER 欲变更的使用者帐号
ARG 传入新的 shell 参数
例如:
普通用户之间的切换:
ubuntu@localhost:~$ whoami
ubuntu
ubuntu@localhost:~$ su - testuser
Password:
testuser@localhost:~$ whoami
testuser
注:若要退出某个用户可以输入exit,或按Ctrl+d退出。
普通用户切换到root用户:
ubuntu@localhost:~$ whoami
ubuntu
ubuntu@localhost:~$ sudo su - root
[sudo] password for ubuntu:
root@localhost:~# whoami
root
root@localhost:~# logout
ubuntu@localhost:~$ whoami
ubuntu
2.5 usermod更改用户信息
usermod命令来修改已存在用户的各种信息,格式如下:
usermod [options] username
选项如下:
-c<备注> 修改用户帐号的备注文字。
-d <登入目录> 修改用户主目录。
-e<有效期限> 修改帐号的有效期限。
-f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。
-g<群组> 修改用户所属的主组。
-G<群组> 修改用户所属的附加组。
-l<帐号名称> 修改用户帐号名称。
-L 锁定用户密码,使密码无效。
-s 修改用户登入后所使用的shell。
-u 修改用户ID。
-U 解除密码锁定。
-a 将用户加入到指定的附加组,只能和-G一起使用。
例如:
将testuser用户加入到ubuntu附加组中:
root@localhost:~# usermod -G ubuntu testUser
root@localhost:~# cat /etc/group
ubuntu:x:1004:testUser
修改testuser2的shell为不可登陆shell:
root@localhost:~# cat /etc/passwd
testuser2:x:1100:1100::/home/testuser2:/bin/bash
root@localhost:~# usermod -s /usr/bin/nologin testuser2
testuser2:x:1100:1100::/home/testuser2:/usr/bin/nologin
root@localhost:~# su - testuser2
No directory, logging in with HOME=/
Cannot execute /usr/bin/nologin: No such file or directory
锁定后再解锁ubuntu用户密码(锁定后密码字段开始会有一个感叹号):
root@localhost:~# usermod -L ubuntu
root@localhost:~# cat /etc/shadow
ubuntu:!$6$AXNpTfmQ4I0nG4g.$ZX28Rmtl.n1/iosbmXgQ1FNnVeM1M55k9FS32RjA7qVtnEKm/13uL5dvYh.2DVkbysP7Es08qUoKjDys.76w/0:18226:0:99999:7:::
root@localhost:~# usermod -U ubuntu
root@localhost:~# cat /etc/shadow
ubuntu:$6$AXNpTfmQ4I0nG4g.$ZX28Rmtl.n1/iosbmXgQ1FNnVeM1M55k9FS32RjA7qVtnEKm/13uL5dvYh.2DVkbysP7Es08qUoKjDys.76w/0:18226:0:99999:7:::
2.6 passwd更改密码
passwd命令用来修改用户密码以及对用户登录的相关设置。root用户可使用此命令修改Linux系统中任何用户的密码,普通用户只可以更改自己的密码。使用格式如下:
passwd [option] [username]
选项如下:
-d 清除用户密码
-f 强制执行
-k 更新只能发送在过期之后
-l 锁定用户
-S 显示密码信息
-u 解锁用户
-x 设置密码的有效期
-g 修改附加组密码
-i 过期后停止用户账号
-e 设置用户密码立即过期
-j 设置用户密码过期后指定天数禁用该账户
例如:
root更改指定用户的密码:
root@localhost:~# passwd ubuntu
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
普通用户更改自己的密码:
ubuntu@localhost:~$ passwd
Changing password for ubuntu.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
显示用户密码相关信息(/etc/shadow中的字段):
root@localhost:~# passwd -S ubuntu
ubuntu P 04/29/2020 0 99999 7 -1
2.7 userdel删除用户
userdel命令是将一个用户从Linux系统中删除,使用格式如下:
userdel [options] login
选项如下:
-r 删除用户主目录以及目录中所有文件
-f 强制删除指定用户,即使该用户处于登录状态
例如,将用户testuser从当前系统删除,但保留其主目录:
root@localhost:~# userdel testUser
root@localhost:~# ll/home/
drwxr-xr-x 2 1001 1001 4096 Apr 2904:02 testUser/
将用户testuser2从当前系统删除,并且删除主目录:
root@localhost:~# userdel -r testuser2
root@localhost:~# ll/home/
2.8 groupadd添加用户组
groupadd 命令用于对用户组进行配置,语法格式如下:
groupadd [options] groups
参数说明:
-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件"/ect/login.defs";
-o:允许添加组 ID号不唯一的工作组。
-f,–force:如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。
例如:
创建用户组是指定GID:
root@localhost:~# groupadd -g 4000 grouptest
root@localhost:~# cat /etc/group
grouptest:x:4000:
2.9 groupmod修改用户组信息
groupmod类似于usermod命令,用于修改用户组的相关信息,格式如下:
groupmod [options] GROUPNAME
常用选项如下:
-g <群组识别码> 设置欲使用的群组识别码。
-o 重复使用群组识别码。
-n <新群组名称> 设置欲使用的群组名称。
2.10 groupdel删除用户组
groupdel命令用于删除用户组,例如:
root@localhost:~# groupdel grouptest
2.11 gpasswd管理组密码
gpasswd 是 Linux下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除。格式如下:
gpasswd [options] GROUPNAME
选项如下:
-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
例如:
为用户组ubuntu设置密码,让知道该组密码的人可以暂时切换具备ubuntu用户组的功能:
root@localhost:~# gpasswd ubuntu
Changing the password for group ubuntu
New Password:
Re-enter new password:
为用户组设置管理员:
root@localhost:~# gpasswd -A ubuntu test2020
添加用户到指定组(组管理员视角):
ubuntu@localhost:~$ gpasswd -a testuser2 test2020
Adding user testuser2 to group test2020
ubuntu@localhost:~$ tail -1 /etc/group
test2020:x:2000:testuser2
2.12 chpasswd批量修改密码
chpasswd用于批量修改用户密码,从标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令。使用格式如下:
chpasswd [options]
密码格式如下:
username:password
选项如下:
-c 指定加密方式,支持DES, MD5,NONE, SHA256 ,SHA512等方式加密
-e 指定密文加密,后接将密码加密后的密文字符串
-m 以md5方式加密
-s 以SHA方式加密,可选项有SHA256 和SHA512两种方式
-R 指定chroot可以切换的根目录
例如:
指定加密方式为SHA512,批量更改用户密码:
root@localhost:~# chpasswd -c SHA512
ubuntu:linuxasdp
testuser2:linuxasdp
test2020:linuxabc
Ctrl+d结束
从标准输入流更改密码:
root@localhost:~# echo ubuntu:linux123 |chpasswd
从文件批量读入密码:
root@localhost:~# cat passfile
ubuntu:linuxabc
testuser2:linux123
root@localhost:~# chpasswd < passfile
为确保安全性,采用openssl passwd命令生成密文密码,再使用chpasswd修改:
root@localhost:~# openssl passwd -6 123456 > passfile
root@localhost:~# cat passfile
$6$TRY/e/gUGzjsOfkG$.x/wbL9iK.Xbjrmffcflks4/tsT2/ZjPPMmVrdCQyvm1ljvQKfNuXXK2KTHSPbQZjMC8jesVbE/k.76jC.ahs0
root@localhost:~# vim passfile
root@localhost:~# cat passfile
ubuntu:$6$TRY/e/gUGzjsOfkG$.x/wbL9iK.Xbjrmffcflks4/tsT2/ZjPPMmVrdCQyvm1ljvQKfNuXXK2KTHSPbQZjMC8jesVbE/k.76jC.ahs0
root@localhost:~# chpasswd -e < passfile
2.13 其他命令
Linux系统中用于管理的命令还有很多,例如newgrp用于切换用户组,chage用于修改用户属性信息,chsh用于修改用户的默认登陆shell,chfn用于修改用户的描述信息,等等。更多的命令读者可以查阅此链接中的内容https://www.runoob.com/linux/linux-command-manual.html。
3. 权限管理
3.1 所属关系与权限
在1.4节中提到了文件的所属关系,即一个文件的创建者一般是文件所有者(User),文件所属的用户组是文件所属组(Group),除过这两类和root用户之外的称为其他用户(Others)。这三者表明了与文件相关的用户身份属性,相对应的为每种身份角色都有与之对应的访问控制权限,作为对不同身份人员访问控制,以保证Linux系统的安全。
Linux系统对于每个文件都定义了三种类型的权限,即r(读)、w(写)、x(执行),这三者对于文件和目录来说具有不同的含义:
对于文件来说,r表示可以利用工具读取文件内容,w表示可以利用工具编辑修改文件内容,x表示可以让其在Linux系统中启动为一个进程。
对于目录来说,r表示可以使用ls查看目录下的文件列表,w表示可以增、删、改目录下的文件或子目录,x表示可以使用ls -l查看文件列表,并且cd可以进入该目录。
在权限表示时,r、w、x依次排开,用三位二进制数表示,具有该权限则为1,不具有则为0。如rw-表示为110,r-x表示为101,如此换算为10进制数,即可从0~7依次表示三种权限的所有组合形式,如下所示:
权限表示 | 二进制表示 | 十进制数表示 |
---|---|---|
- - - | 000 | 0 |
- - x | 001 | 1 |
- w - | 010 | 2 |
- w x | 011 | 3 |
r - - | 100 | 4 |
r - x | 101 | 5 |
r w - | 110 | 6 |
r w x | 111 | 7 |
如此以来,文件所有者、所属组、其他用户等三个用户身份都定义了这三种r、w、x权限,所以当我们使用ls -l查看文件权限时显示如下:
ubuntu@localhost:/tmp$ ll
drwxrwxr-x 2 ubuntuubuntu 4096 Apr 30 04:07 dir1/
-rw-rw-r-- 1 ubuntuubuntu 0 Apr 30 04:07 file1
drwxrwxr-x的格式分别表示,文件类型、所有者权限、所属组权限、其他用户权限,该目录的权限为rwxrwxr-x,表示为十进制则为775。
3.2 权限配置
chmod命令用于修改权限,使用格式如下:
chmod [option] [file]
选项如下:
-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更
–help : 显示辅助说明
–version : 显示版本
chmod可以使用两种方式修改权限,一个是使用权限字符方式修改,其中u表示文件所有者、g表示所属组、o表示其他用户,a表示三种身份都生效。例如:
给所属者添加执行权限:
ubuntu@localhost:/tmp$ touch testfile
ubuntu@localhost:/tmp$ ll testfile
-rw-rw-r-- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile
ubuntu@localhost:/tmp$ chmod u+x testfile
ubuntu@localhost:/tmp$ ll testfile
-rwxrw-r-- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
对组用户无写权限,其他用户不可读:
ubuntu@localhost:/tmp$ ll testfile
-rwxrw-r-- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
ubuntu@localhost:/tmp$ chmod g-w,o-r testfile
ubuntu@localhost:/tmp$ ll testfile
-rwxr----- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
对所有用户都添加执行权限:
ubuntu@localhost:/tmp$ ll testfile
-rw-r----- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile
ubuntu@localhost:/tmp$ chmod a+x testfile
ubuntu@localhost:/tmp$ ll testfile
-rwxr-x--x 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
指定为特定权限:
ubuntu@localhost:/tmp$ ll testfile
-rwxr-x--x 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
ubuntu@localhost:/tmp$ chmod u=rw,g=rx,o=w testfile
ubuntu@localhost:/tmp$ ll testfile
-rw-r-x-w- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
chmod修改权限的另一种方式是采用前面提到的数字表示法,即三位二进制数表示一个身份的权限,可用一位十进制数表示,那么三个身份共需要九个二进制数表示,也就是使用三个十进制数表示。修改实例如下:
修改权限为666:
ubuntu@localhost:/tmp$ ll testfile
-rw-r-x-w- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
ubuntu@localhost:/tmp$ chmod 666 testfile
ubuntu@localhost:/tmp$ ll testfile
-rw-rw-rw- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile
修改权限为755:
ubuntu@localhost:/tmp$ ll testfile
-rw-rw-rw- 1 ubuntu ubuntu 0 Apr 30 04:42 testfile
ubuntu@localhost:/tmp$ chmod 755 testfile
ubuntu@localhost:/tmp$ ll testfile
-rwxr-xr-x 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
修改当前目录以及子目录下文件的权限(使用-R选项):
ubuntu@localhost:/tmp$ mkdir -p testdir/testdir2
ubuntu@localhost:/tmp$ touch testdir/testfile2
ubuntu@localhost:/tmp$ touch testdir/testdir2/testfile3
ubuntu@localhost:/tmp$ ls -ld testdir/
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 30 04:59 testdir/
ubuntu@localhost:/tmp$ ll testdir/
drwxrwxr-x 2 ubuntuubuntu 4096 Apr 30 04:59 testdir2/
-rw-rw-r-- 1 ubuntuubuntu 0 Apr 30 04:59 testfile2
ubuntu@localhost:/tmp$ ll testdir/testdir2/
-rw-rw-r-- 1 ubuntu ubuntu 0 Apr 30 04:59 testfile3
可以看到目录权限都是775,文件权限都是664,将其均修改为500:
ubuntu@localhost:/tmp$ chmod -R 500 testdir/
ubuntu@localhost:/tmp$ ls -ld testdir/
dr-x------ 3 ubuntu ubuntu 4096 Apr 30 04:59 testdir/
ubuntu@localhost:/tmp$ ll testdir/
dr-x------ 2 ubuntuubuntu 4096 Apr 30 04:59 testdir2/
-r-x------ 1 ubuntuubuntu 0 Apr 30 04:59 testfile2*
ubuntu@localhost:/tmp$ ll testdir/testdir2/
-r-x------ 1 ubuntu ubuntu 0 Apr 30 04:59 testfile3*
chown命令修改文件所属身份,格式如下:
chown [option] [file]
身份设置格式:
USER:GROUP
USER
:GROUP
选项如下:
user : 新的文件拥有者的使用者ID
group :新的文件拥有者的使用者组(group)
-c : 显示更改的部分的信息
-f : 忽略错误信息
-h :修复符号链接
-v : 显示详细的处理信息
-R :处理指定目录以及其子目录下的所有文件
–help : 显示辅助说明
–version : 显示版本
例如:
修改文件所有者:
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 ubuntu ubuntu 0 Apr 30 04:42 testfile*
root@localhost:/tmp# chown testuser2 testfile
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 testuser2 ubuntu 0 Apr 30 04:42 testfile*
修改文件所有者和所属组:
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 testuser2 ubuntu 0 Apr 30 04:42 testfile*
root@localhost:/tmp# chown test2:testuser2 testfile
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 test2 testuser2 0 Apr 30 04:42 testfile*
只修改文件所属组:
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 test2 testuser2 0 Apr 30 04:42 testfile*
root@localhost:/tmp# chown :ubuntu testfile
root@localhost:/tmp# ll testfile
-rwxr-xr-x 1 test2 ubuntu 0 Apr 30 04:42 testfile*
当然,chown命令中使用的冒号也可以用点号代替
3.3 sudo的使用
通常情况下,对于普通用户来说,不可避免的会碰见需要使用某些只有root用户才能够执行的命令,此时就需要用到sudo命令。sudo命令以系统管理者的身份执行指令,在5分钟内使用sudo可以直接执行命令,不用输入密码,超时以后,用户必须重新输入密码。
一般情况下创建的普通用户无法直接使用sudo,需要由root使用visudo命令对/etc/sudoers文件进行配置。使用visudo的原因是能够防止两个用户同时修改它和进行有限的语法检查。
以root用户登录,在命令行中直接输入visudo会打开/etc/sudoers文件,具体提升权限配置说明如下:
待授权用户或用户组 | 授权角色 | 可执行命令 |
---|---|---|
user | host=(user:group) | (举例)/usr/sbin/useradd |
group | host=(user:group) | (举例)/usr/sbin/useradd |
例如,使用visudo进行配置:
root@localhost:~# visudo
…
ubuntu ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
sudo使用格式如下:
sudo [option] command
选项如下:
-V 显示版本编号
-h会显示版本编号及指令的使用方式说明
-l 显示出自己(执行sudo使用者)的权限,列出当前用户可以执行的命令。
-v 因为 sudo在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
-k 将会强迫使用者在下一次执行sudo 时问密码(不论有没有超过 N 分钟)
-b 在后台执行指定命令
-p prompt可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
-u username/uid 以指定用户身份执行命令
-s 执行环境变量中的 SHEL指定的 shell ,或 /etc/passwd 里所指定的shell
-H 将环境变量中的HOME(家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
-i 切换到root用户
command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
例如:
以指定用户创建文件:
ubuntu@localhost:/tmp$ sudo -u sshd touch testsshfile
ubuntu@localhost:/tmp$ ll testsshfile
-rw-r--r-- 1 sshd nogroup 0 Apr 30 08:55 testsshfile
注意:上面的命令中,sudo -u的使用需要保证指定的用户在对应目录下具有写入权限。
显示当前用户所拥有的的sudo权限:
ubuntu@localhost:~$ sudo -l
Matching Defaults entries for ubuntu on localhost:
env_reset,mail_badpass,secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User ubuntu may run the following commands on localhost:
(ALL : ALL) ALL
切换到root用户:
ubuntu@localhost:~$ sudo -i
[sudo] password for ubuntu:
root@localhost:~#
3.4 权限掩码
umask命令指定在建立文件时预设的权限掩码。权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
在Linux系统创建一个文件或目录都会有其默认权限,并且普通用户和root创建的文件或目录时的默认权限是不同的。例如,普通用户创建文件时默认权限为664,创建目录时默认权限为775,而root用户创建文件时默认权限是644,创建目录时默认权限为755。在这些默认权限背后,是由权限掩码umask来控制的。普通用户的umask为002,root用户的umask为022。一般关于umask权限掩码建议读者不要做任何修改,但却需要知道该功能的存在,以下配置仅为示例,实验完毕请记得改回原来的值。
例如:
ubuntu的默认权限掩码为002,以ubuntu用户先分别创建一个文件和目录,查看其默认权限,使用umask修改权限掩码为022后,再创建一个文件和目录查看其默认权限(先不必关注umask的第一个0的含义):
ubuntu@localhost:~$ umask
0002
ubuntu@localhost:~$ touch testfile
ubuntu@localhost:~$ ll testfile
-rw-rw-r-- 1 ubuntu ubuntu 0 8月 1815:08 testfile
ubuntu@localhost:~$ mkdir testDir
ubuntu@localhost:~$ ll -d testDir/
drwxrwxr-x 2 ubuntu ubuntu 4096 8月 1815:08 testDir//
ubuntu@localhost:~$ umask 0022
ubuntu@localhost:~$ touch testfile3
ubuntu@localhost:~$ mkdir testDir2
ubuntu@localhost:~$ ll testfile3 -d testDir2
drwxr-xr-x 2 ubuntu ubuntu 4096 8月 1815:10 testDir2/
-rw-r--r-- 1 ubuntu ubuntu 0 8月 18 15:10 testfile3
3.5 特殊权限
在使用umask命令配置时发现,共有4位数值,如上小节例子中,使用umask查看ubuntu用户的权限掩码为0002。在其中,234位表示的是八进制对应的所属者、所属组以及其他用户的权限,而第1为在对文件或目录设置时具有特殊作用。这也是本小节所要阐述的扩展权限。
关于扩展权限分为三种,分别为SUID、SGID、SBIT。基本含义如下:
SUID:也称强制位UID,当一个文件(仅对二进制文件有效)设置了SUID时,则所有用户在执行该文件时,都以这个文件的所有者的权限来执行,设置必须有x执行权限才能生效。
SGID:也称强制位GID,只对目录设置,在设置SGID的目录中任何人建立的文件的所属组都会是该目录的所属组,设置必须有x执行权限才能生效。
SBIT:也称冒险位,对目录设置后,在相应目录下的文件只有文件所属者和root用户才能删除,设置必须有x执行权限才能生效。
以上三种扩展权限的修改也是使用chmod命令配置的,当存在该权限时用二进制表示为1,不存在时用二进制表示为0,所以转换为八进制后,同样以0~7的取值范围表示。这也就是使用umask查看权限掩码时四位八进制数中的第1位数。这三种扩展权限在文件或目录的属性中标识时,其具体位置与基本权限的所属者、所属组、其他用户权限叠加。其中,若设置了SUID,则所属者的x位表示为s;若设置了SGID,则所属组的x位表示为s;若设置了SBIT,则其他用户的x位表示为t。若不存在x权限,那么在相应位置上会以S或T来表示,且由于没有执行权限,该扩展权限不生效。
例如:
创建目录设置SGID位,验证该扩展权限:
Step1:创建一个share用户组,用做共享组
ubuntu@localhost:~$ sudo groupadd share
Step2:创建目录,将其加入share组,并查看属性
ubuntu@localhost:~$ mkdir sgidTestDir
ubuntu@localhost:~$ sudo chown :share sgidTestDir/
ubuntu@localhost:~$ ll -d sgidTestDir/
drwxr-xr-x 2 ubuntu share 4096 8月 1816:12 sgidTestDir//
Step3:在上面新创建的目录中再创建一个文件和一个目录,用做与后面设置SGID后的对比
ubuntu@localhost:~/sgidTestDir$ touch file1
ubuntu@localhost:~/sgidTestDir$ mkdir noSgidir
ubuntu@localhost:~/sgidTestDir$ ll
-rw-r--r-- 1 ubuntu ubuntu 0 8月 1816:30 file1
drwxr-xr-x 2 ubuntu ubuntu 4096 8月 18 16:30 noSgidir/
注:在未设置SGID时,创建的文件和目录都是属于创建者ubuntu用户所在的ubuntu组的。
Step4:为看到明显的现象,所以先去掉所有用户的x权限
ubuntu@localhost:~$ sudo chmod -x sgidTestDir/
ubuntu@localhost:~$ ll -d sgidTestDir/
drw-r--r-- 2 ubuntu share 4096 8月 1816:12 sgidTestDir//
Step5:为创建的目录添加SGID
ubuntu@localhost:~$ sudo chmod g+s sgidTestDir/
ubuntu@localhost:~$ ll -d sgidTestDir/
drw-r-Sr-- 2 ubuntu share 4096 8月 1816:12 sgidTestDir//
注:此时可以看到,在所属组的x位置上出现一个大写S,但由于没有x权限,所以该设置并不生效。包括此时由于所有用户都没有x权限,会出现如下现象,以至于ubuntu用户都无法进入该目录:
ubuntu@localhost:~$ cd sgidTestDir/
bash: cd: sgidTestDir/: Permission denied
Step6:为所有用户加入x权限
ubuntu@localhost:~$ sudo chmod +x sgidTestDir/
ubuntu@localhost:~$ ll -d sgidTestDir/
drwxr-sr-x 2 ubuntu share 4096 8月 1816:12 sgidTestDir//
注:加入x权限后,ubuntu可以进入该目录,并且在所属组的x位置上变为一个小写s。
Step7:再次进入设置SGID的目录中,分别创建一个文件和目录
ubuntu@localhost:~$ cd sgidTestDir/
ubuntu@localhost:~/sgidTestDir$ touch file2
ubuntu@localhost:~/sgidTestDir$ mkdir Sgidir
ubuntu@localhost:~/sgidTestDir$ ll
-rw-r--r-- 1 ubuntu ubuntu 0 8月 1816:30 file1
-rw-r--r-- 1 ubuntu share 0 8月 1816:35 file2
drwxr-xr-x 2 ubuntu ubuntu 4096 8月 18 16:30 noSgidir/
drwxr-sr-x 2 ubuntu share 4096 8月 1816:35 Sgidir/
注:可以看到,设置了SGID之后创建的文件和目录的所属组都默认是share,不再是ubuntu用户。
查看设置SUID的文件
保证passwd命令能够使用的是/usr/bin/passwd文件,而该文件是属于root用户的,那么不知读者是否思考过为何普通用户可以用它来更改密码,并且/etc/passwd还仅仅是可读,/etc/shadow不可读。其原因就在于/usr/bin/passwd文件设置了SUID位,如下所示:
ubuntu@localhost:~$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 3月 2703:34 /usr/bin/passwd*
当普通用户通过passwd命令更改密码时,由于/usr/bin/passwd文件的其他用户(others)具有x权限,所以passwd命令可以被普通用户执行。那么在执行之后,要成功的修改自己的密码需要修改/etc/shadow文件的内容,此时就是SUID发挥作用的时候了。普通用户修改自己的密码时,由于SUID的设置,/usr/bin/passwd文件以root用户身份执行,从而修改密码成功。
参考资料:
-
《shell脚本实战(第2版)》
-
http://c.biancheng.net/view/840.html
-
http://c.biancheng.net/view/841.html
-
http://c.biancheng.net/view/3059.html
-
https://www.runoob.com/linux/linux-comm-useradd.html
-
https://www.runoob.com/linux/linux-comm-su.html
-
https://blog.youkuaiyun.com/gzhouc/article/details/50637565
-
https://www.runoob.com/linux/linux-command-manual.html
博客与公众号同步发文,欢迎关注: