一、用户和组管理
Linux中的用户和组分类
1、Linux的用户分为三类:
- 超级用户:root,它具有一切权限,只有进行系统维护或者其他必要的情形下才以超级用户登录,避免系统出现安全问题
- 系统用户:是Linux系统正常工作所必须的用户,主要是为了满足相应的系统进程对文件属主的要求而建立的,系统用户不能用来登录
- 普通用户:为了使用者能够使用Linux资源而建立的,大多数用户属于这类
2、Linux的组分为两类:
- 基本组:建立账户时,若没有指定账户的属组,系统会建立一个和用户名相同的组,这个就是基本组
- 附加组:可以容纳多个用户,组中的用户都具有组所拥有的权利
3、Linux中用户和组的配置文件
文件名称 | 功能 |
---|---|
/etc/passwd | 用户账号文件 |
/etc/shadow | 用户密码文件 |
/etc/group | 用户组账号文件 |
/etc/gshadow | 用户组密码文件 |
(1)用户账号文件
passwd是一个文本文件,用于定义系统的用户账号,所有用户对passwd有读权限,所以该文件只定义用户账号,不保存口令
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2539 Oct 16 17:19 /etc/passwd
/etc/passwd文件中的字段说明:
每行定义一个账户信息,每行7个字段,字段之间用“ :”分隔
[root@localhost ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
- 账户名称:用户登录Linux系统时使用的名称
- 密码:密码保存在/etc/shadow中,此处的密码是占位符。若为“x”说明密码受到shadow的保护
- UID:用户的标识,是一个数值,用来区分不同的用户,每个用户都有一个UID:
UID | 用户类型 |
---|---|
0 | 超级用户 |
1-999 | 系统用户 |
=>1000 | 普通用户 |
- GID:用户所在基本组的标识,是一个数值,用它来区分不同的组,相同的组具有相同的GID
- 个人资料:记录用户的完整姓名,地址等信息
- 主目录:通常是/home/username
- shell:定义用户登录后激活的shell,默认是bash shell
(2)用户密码文件
[root@localhost ~]# cat /etc/shadow
root:$6$7tutbKj5oC339amQ$m5uaEV2tWoQ7nc1DPBoet9TBX2QLQ1LaCmjxy7lewrtjRynGU1x1fxpzfF6BkgtoTXhzwNF.UghHoASxpbNTr/::0:99999:7:::
(3)用户组账户文件
系统中的每个组,在/etc/group文件中有一行记录,任何用户均可以读取用户组账户信息配置文件。
[root@localhost ~]# head -1 /etc/group
root:x:0:
字段 | 说明 |
---|---|
groupname | 组的名字 |
passwd | 组的加密口令 |
GID | 系统区分不同组的ID |
userlist | 是用“,”分开的用户名,列出的成员以该组为附加组 |
用户管理
1、添加用户 useradd [选项] <username>
选项:
- -c 注释信息:设置与用户相关的说明信息
- -d 目录:设置用户的家目录
- -e yyy-mm-dd:设置用户的失效日期,此日期后账号不能使用
- -f 天数:指定密码到期后多少天账号被禁用,若指定为0,表示账号到期后立即禁用,若指定为-1,表示密码永不过期
- -g 组名:为用户指定所属的基本组,该组在指定时必须已经存在
- -G 组名:为用户指定所属的附加组,各组在指定时已经存在,附加组可以有多个,组之间用“ ,”分割
- -M:不创建用户家目录
- -N:不创建与用户同名的基本组
- -p 密码:指定用户的登陆密码
- -s shell名:指定用户登录后使用的shell,默认是bash
- -u:用户号:设置账号的UID
示例1:新建一个用户q,查看passwd、shadow文件中的变化,并确认该用户的家目录中的初始配置文件
[root@localhost ~]# useradd q
[root@localhost ~]# tail -1 /etc/passwd
[root@localhost ~]# tail -1 /etc/shadow
[root@localhost ~]# ll /home/
[root@localhost ~]# ls -A /home/q
示例2:新建一个用户wang5,指定其UID为1005、登录Shell为/bin/bash,账号永不过期
[root@localhost ~]# useradd -u 1005 -s /bin/bash -e -1 wang5
示例3:新建一个辅助管理员用户admin,将其用户家目录指定为/admin,基本组指定为wheel,附加组同时属于adm组和root组
[root@localhost ~]# useradd -d /admin -g wheel -G adm,root admin
示例4:新建一个用于访问FTP的zhao6用户,禁止其登录且不创建家目录。
[root@localhost ~]# useradd -M -s /sbin/nologin zhao6
2、修改用户信息usermod 选项 username
常用的选项包括 -c,-d,-m,-g,-G,-s,-u 等,这些选项的意义与useradd命令中的选项一样,还可使用以下选项:
- -l 新用户名:更改账户名称,必须在该用户未登录的情况下才能使用
- -L:锁定用户账户,使其不能登录使用
- -U:解锁用户账户
3、为账户设置密码passwd 账户名
常用选项:
- -d:——清空指定用户的口令。这与未设置口令的账户不同,未设置口令的账户无法登录系统,而口令为空的账户可以。
- -e——使用户的账号密码立即过期,强迫用户下次登录时必须修改口令。
- -i——口令过期后多少天停用账户。
- -l——锁定(停用)用户账户。
- -n——指定口令的最短存活期。
- -x——指定密码的最长使用期限。
- -u——解锁用户账户。
4、删除用户账户
命令格式:userdel [-r] 账户名
-r:在删除账户的同时删除该账户对应的主目录
5、用户间切换su
命令
命令格式:su 用户名
从root用户切换到任何普通用户不需要密码验证,而普通用户切换到root用户或者其他用户需要输入目标用户的密码验证
su和su -命令的区别是加载的配置文件不一样:
su 切换方式加载的文件: ~/.bashrc,/etc/bashrc
su - 切换方式加载的文件: /etc/bashrc,/etc/profile,~ /.bashrc,~/.bash_profile
用户组管理
1、创建用户组groupadd [-r] 用户组名称
选项:
- -g GID:指定新的用户组的GID,默认值已有的GID加1
- -r:建立一个系统组账户,与-g不同时使用时,分配一个1-999的GID
示例:向系统中添加一个组ID为1100,组名为group1的新组
[root@localhost ~]# groupadd -g 1100 group1
[root@localhost ~]# tail -1 /etc/group
group1:x:1100:
2、修改用户组属性
命令格式:groupmod 选项 用户组
选项:
- -g GID:为用户组指定新的组标识号
- -n 新用户组:将用户组的名字改为新名字,修改用户组的名字和GID值
示例:将组group1的GID修改为2000,组名修改为group11
[root@localhost ~]# groupmod -g 2000 -n group11 group1
[root@localhost ~]# tail -1 /etc/group
group11:x:2000:
3、添加删除组成员
命令格式:gpasswd 选项 用户 组
只有root用户和组管理员才能够使用此命令
选项:
- -r:删除组密码
- -a:把用户加入组
- -d:把用户从组中删除
- -M:同时添加多个用户
- -A:给组指派管理员
示例:将wang5,q用户同时加入group11组,并指派wang5为管理员
[root@localhost ~]# gpasswd -M wang5,q -A wang5 group11
[root@localhost ~]# tail -1 /etc/group
group11:x:2000:wang5,q
4、删除组账户
命令格式:groupdel 用户组名
被删除的组若是基本组,则必须先删除引用该基本组的用户,然后再删除该基本组。
示例:从系统中删除组group11
[root@localhost ~]# groupdel group11
查询用户和组信息
1、显示某个账户的详细信息
[root@localhost ~]# id w uid=1000(w) gid=1000(w) groups=1000(w)
2、显示用户的属组信息
[root@localhost ~]# groups w w : w
查看用户登录系统的情况
1、查看当前登录系统的用户users
2、last:列出目前与过去登入系统的用户相关信息,该命令默认读取/var/log/wtmp文件,并把该文件记录的登入系统的用户名单全部显示出来
[root@localhost ~]# last -2
root pts/0 192.168.24.1 Tue Oct 18 10:26 still logged in
reboot system boot 4.18.0-348.el8.x Tue Oct 18 09:25 still running
3、w:显示登录到系统的用户信息
[root@localhost ~]# w
17:51:08 up 8:26, 1 user, load average: 0.03, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.24.1 10:26 2.00s 0.26s 0.01s w
5、显示目前登录到系统的用户,who通常通过/var/run/utmp文件来获取信息
[root@localhost ~]# whoami
root
[root@localhost ~]# who am i
root pts/0 2022-10-18 10:26 (192.168.24.1)
二、Linux文件系统权限
文件的一般权限
文件的权限针对三类对象进行定义:
- owner:属主,u
- group:属组,g
- other:其他,o
每个文件针对每类访问者定义了三种主要权限:
root账户不受文件权限的读写限制,执行权限受限制
- r:read读
- w:write写
- x:execute执行
1、修改文件或目录的权限
命令格式:chmod [选项] [ugoa] [+-=][rwx] 文件或目录
命令格式:chmod [选项] nnn 文件或目录
常用的选项 -R ,递归修改指定目录下所有文件、子目录的权限
ugoa :表示权限设置所针对的用户类别,可以是其中字母中的一个或组合,u表示文件或目录的属主;g表示属组内的用户;o表示其他用户;a表示所有用户(即u+g+o)。
+或-或= :表示设置权限的操作动作,+代表添加某个权限;-代表取消某个权限;=表示只赋予给定
的权限,并取消原有的权限。
rwx :用字符形式表示的所设置的权限,可以是其中一个字母或组合。
nnn :用三位八进制数字表示的权限。
2、修改文件或目录的属主和属组
(1)修改文件或目录的属主
命令格式:chown [选项] 新属主[:[新属组]] 文件或目录
选项: -R 可递归设置指定目录下的全部文件(包括子目录和子目录中的文件)的所属关系。
(2)修改文件或目录的属组
命令格式: chown [选项] :新属组 文件或目录
命令格式: chgrp [选项] 新属组 文件或目录
文件和目录的特殊权限
1、SUID权限的含义:是为了让一般用户在执行某些程序的时候,在程序运行的时候,暂时获得该程序文件属主的权限
注:
- suid仅对二进制文件有效
- 在执行过程中,调用者会暂时获得文件属主的权限
- 该权限只在程序执行的过程中有效
2、SGID 权限
SGID 可以用在两个方面:
- 文件: 如 果 SGID 设置在二进制文件上, 则不论用户是谁,在执行该程序的时候,程序的所属组将会变成该程序文件的所属组。
- 目录, 如 果 SGID 是设置在 A 目录上, 则在 A 目录内所建立的文件或目录的所属组, 将会是此 A目录的所属组
ACL权限
ACL权限分配:给指定的用户指定的目录分配指定的权限
1、ACL权限管理命令
-
查看ACL权限:
getfacl 文件名
-
设置ACL权限:
setfacl 选项 文件名
选项: -
-m:设定ACL权限,如果是给予用户ACL权限,则使用
u:用户名:权限
格式赋予,如果是给予组ACL权限,则使用g:组名:权限
格式赋予
选项 | 说明 |
---|---|
-x | 删除指定的ACL权限 |
-b | 删除所有的ACL权限 |
-d | 设定默认的ACL权限,只对目录生效,指目录中新建的文件拥有此默认权限 |
-k | 删除默认权限 |
-R | 递归设置ACL权限 |
权限掩码umask
1、设置新建文件或目录的默认权限
在Linux系统中,当用户创建一个新的文件或者目录时,系统都会为新建的文件或者目录分配默认的权限,该默认权限与umask值有关:
- 新建文件的默认权限=0666 -umask值
- 新建目录的默认权限=0777-umask值
2、查看,修改用户当前默认的umask值
查看umask值:
[root@localhost /]# umask
0022
修改:
临时修改:
[root@localhost /]# umask 000
[root@localhost /]# umask
0000
永久修改:
[root@localhost /]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
[root@localhost ~]# source /etc/profile