概述
用户一般来说是指系统的使用者,使用者可以使用这些名称来登录计算机,除了使用者之外,一些系统服务也需要含有部分特权的用户账户运行,因此出于安全考虑,用户管理应运而生,它加以明确限制各个用户账户的权限,root在计算机中拥有至高的特权,所以一般只作管理用,非特权用户可以通过su或sudo程序来临时获得特权。
Linux系统通过用户和用户组实现访问控制,包括对文件访问,设备使用的控制。
1人可以拥有很多账户,只是彼此名称不同,比如root名称已经占用就不能再用了,此外,任意用户可能从属某个用户组,此用户可以加入某些已经存在的组来获得该组的权限。
每1个文件的属性中都有一个文件拥有者和所属组。此外,还有三种类型的访问权限:读(read),写(write),执行(execute),我们可以针对文件的属主,属组设置相应的访问权限。再次,我们可以通过ls | stat命令查询文件的属主,属组和权限。
一、用户账户
1、用户的分类
Linux用户分为三种:超级用户,普通用户,虚拟用户
超级用户:root 拥有对系统的最高管理权限,UID=0
普通用户:系统用户UID范围:1-999(centos7/8) 1-499(centos6)
本地用户UID范围:1000-60000(centos7/8) 500-60000(centos6)
UID:每个用户的身份标识,类似于每个人的身份证号码
虚拟用户(伪用户):一般不用来登录系统,它主要是用于维持某个服务的正常运行,如:ftp,apache
用户基本信息保存位置:/etc/passwd
用户和组的关系:
一对一:一个用户可以存在一个组中
一对多:一个用户可以存在多个组中
多对一:多个用户可以存在一个组中
多对多:多个用户可以存在多个组中
2、配置文件
名称 |
文件路径 |
说明 |
用户配置文件 |
/etc/passwd |
记录了每个用户的一些基本属性,并且对所以用户可读,每一行记录对应一个用户 |
用户组文件 |
/etc/group |
用户组信息存放文件,并且组名不能重复 |
用户密码信息 |
/etc/shadow |
因为passwd文件对所有用户可读,为安全起见把密码从passwd中分离出来放入这个单独的文件,该文件只有root用户拥有读权限,保证密码安全性 |
二、用户管理
1、用户命令
1.useradd命令
命令格式:useradd [选项] 用户名
选项:
-u 指定用户的UID号,要求该UID号未被其他用户使用
-d 指定用户的宿主目录位置(与-M一起使用时,不生效)
-e 指定用户的账户失效时间,可使用YYYY-MM-DD的日期格式
-g 指定用户的基本组名(或使用GID号),该组必须是存在的,如果没有设置该选项,useradd会根据/etc/login.defs文件中的USERGROUPS_ENAB环境变量进行设置。默认USERGROUPS_ENAB yes,会用和用户相同的名字创建群组。GID等于UID
-G 指定用户的附加组名(或使用GID号),使用逗号分隔多个组,不要添加空格,如果不设置,用户仅仅加入初始组。(一个用户只允许有一个主组,可以有多个附加组)
-M 不建立宿主目录,即使/etc/login.defs系统配置中已设定要建立宿主目录
-s 指定用户的登录Shell /sbin/nologin
harry:x:1001:1001::/home/harry:/bin/bash
harry |
用户名 |
x |
密码占位符 |
1001 |
用户的UID,使用正整数表示,范围可以是0-65535 |
1001 |
用户所属组的GID |
用户描述信息 |
对用户的功能或其他来进行简要的描述 |
/home/harry |
用户家目录 |
/bin/bash |
用户登录系统后使用的shell |
-u 指定UID
-d 指定家目录
-g 指定基本组
-G 指定附加组
-M 不建立宿主目录
-s 指定用户登录的shell
2.删除用户命令userdel
-r 将宿主目录一起删除
3.密码管理passwd命令
命令格式:passwd [选项]...... 用户名
-d 清空指定用户的密码,仅使用用户名即可登录系统
-l 锁定用户账户
-S 查看用户账户的状态(是否锁定)
-u 解锁用户账户
例:无交互设置密码
2、用户文件位置
1./etc/passwd
存放保存用户名称,宿主目录,登录shell等基本信息
root:x:0:0:root:/root:/bin/bash
root |
用户名称 |
:x |
密码占位符 |
:0 |
UID |
:0 |
GID |
:root |
备注信息,描述 |
:/root |
家目录路径 |
:/bin/bash |
使用的shell |
2./etc/shadow
存放保存密码
1:用户名:root
2:密码, 当为*或!!时表示用户不能登录到此系统,若该字段为空,则表示无需密码即可登录
3:上次修改密码时间,最后一次修改密码的时间,1970 年 01 月 01 日这是linux诞生的第一年已他作为元年开始
4:最小修改密码间隔时间,今天下一次间隔天数,才能修改,频繁修改,也就是说,该字段规定了从第3字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是0,则密码可以随时修改;如果是10,则代表密码修改后10天之内不能再次修改密码。此字段是为了针对某些人频繁更改账户密码而设计的安全性考虑
第五字段:密码有效期经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。
第六字段:密码到期提醒(提示密码即将过期时间)7 密码将要过期的前7天会提醒你与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 "再过 n 天你的密码就要过期了,请尽快重新设置你的密码该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 "修改密码" 的警告信息。
第七字段:密码过期后的宽限天数 (密码过期后多少天禁用此用户) 90 这个 也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
第八字段:账号失效时间同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!该字段通常被使用在具有收费服务的系统中。账号无法登录生命值
第九字段:保留字段收费内容
3.查看用户相关命令:
id 用户和组的信息
whoami 查看当前有效用户名
who 显示目前登入系统的用户信息
w 显示已经登录系统的用户列表
users 显示当前登录系统的所有用户的用户列表
3、修改用户信息
命令格式:usermod [参数] 用户名
参数:
-u 修改UID
-d 修改宿主目录
-g 修改基本组 #只能有一个
-G 修改附加组 #可以有多个
-s 登录shell
-L 锁定用户账户
-U 解锁用户账户
-e 修改用户的账户失效时间,可以使用YYYY-MM-DD
4.用户账号的初始配置文件
用户宿主目录下的初始配置文件只对当前用户有效
~/ .bash_profile
#此文件中的命令将在该用户每次登录时被执行,他会设置一些环境变量,并且会调用该用户的~/.bashrc文件
~/.bashrc
#此文件中的命令将在该用户每次打开新的bash shell时(包括登录系统)被执行(登录 切换 新的bash环境)
~/.bash_logout
#此文件中的命令将在该用户每次退出时bash shell时使用
/etc/bashrc
三、组管理
1、组账号文件
/etc/group |
保存组账号基本信息 |
/etc/gshadow |
保存组账号的密码信息 |
2、添加组
groupadd命令
命令格式: groupadd [-g GID] 组账号名
3、组内管理
gpasswd命令 -----添加,设置,删除组成员
-a 向组内添加一个用户
-d 从组内删除一个用户成员
-M 定义组成员列表,以逗号分隔
groupdel命令:删除组账号
4、查询相关命令
1.finger命令查询用户账号的详细信息
命令格式:finger[用户名]
2.w:查询已登录到主机的用户信息
命令格式:w [选项] [用户名]
-h 不显示输出信息的标题
-l 用长格式输出
-s 用短格式输出,不显示登录时间,JCPU和PCPU时间
-V 显示版本信息
标题 |
含义 |
USER |
登录到系统的用户 |
TTY |
登录的终端 |
FROM |
表示用户从哪里登录进来,一般显示远程登录主机的IP地址或者主机名 |
LOGIN@ |
用户登录的日期和时间 |
IDLE |
表示某个程序上次从终端开始执行到现在所持续的时间 |
JCPU |
和该终端连接的所有进程占用的CPU运算时间,这个时间例并不包括过去的后台作业时间,但是包括当前正在运行的后台作用所占用的时间 |
PCPU |
当前进程所占用的CPU运算时间 |
WHAT |
当前用户正在执行的进程名称和选项,换句话说,就是表示用户当前执行的是什么命令 |
3.who
who命令只能显示当前登录的用户信息,但无法知晓每个用户正在执行的命令
命令格式:who [选项] [file]
who命令默认是通过/var/run/utmp文件来获取登录用户信息,但如果通过file
指定另一个文件,则who命令将不再默认读取/var/run/utmp文件,而是读取该指定文件来获取信息
-a |
列出所有信息,相当于所有选项 |
-b |
列出系统最近启动的时间日期 |
-l |
列出所有可登录的终端信息 |
-m |
仅列出关于当前终端的信息,who -m 命令等于who am i |
-q |
列出在本地系统上的用户和用户数的清单 |
-r |
显示当前系统的运行级别 |
-s |
仅显示名称,线路和时间字段信息,这是who命令的默认选项 |
-u |
显示当前每个用户的用户名,登录终端,登录时间,线路活动和进程标识 |
-T或-w |
显示tty终端的状态,+表示对任何人可写,-表示仅对root用户或所有者可写,?表示遇到线路故障 |
4.users
当前登录用户
四、文件的基本权限
1、权限的作用
通过对文件设定权限可以达到以下三种访问限制权限:
只允许用户自己访问
允许一个预先指定的用户组中的用户访问
允许系统中的任何用户访问
2、查看权限
-rw-r--r--. 1 root root 2269 Oct 1 11:23 /etc/passwd
1.文件权限基本解释:
- |
rw- |
r-- |
r-- |
root |
root |
Oct 1 11:23 |
/etc/passwd |
文件类型 |
所有者的权限 |
所属组的权限 |
其他人的权限 |
所有者 |
所属组 |
最后修改时间 |
文件路径 |
注:文件类型可以为p,d,l,s,c,b,-
p表示管道文件
d表示目录文件
l表示符号链接文件
-表示普通文件
s表示套接字文件
c表示字符设备文件
b表示块设备文件
2.权限说明:
对文件来说:
r:读(cat)
w:写(vim , echo)
x:执行(运行命名或者脚本)
对目录来说:
r:读(看目录里面有什么--ls)
w:在目录里面建文件,删除,移动(touch,mkdir,rm,mv,cp)
x:进入目录(cd)目录一定拥有x权限,否则无法进入
3、文件拥有者
UGO:所有者-用户组-其他用户
所有者:创建文件的用户,这个用户拥有对它所创建文件的一切权限,所有者可以允许其所在的用户组可以访问所有者的文件
用户组:用户组是具有相同特征用户的逻辑集合,在组内的所有成员拥有这个组具有的权限
其他用户:系统内的其他所有者用户就是other用户
4、更改文件的属主和属组
chown:用来改变文件或目录的属主
chgrp:用来改变文件或目录的默认属组
如果要对目录进行操作,加参数-R
chown命令格式:
chown user:group file 例:chown may:mayday a.txt 把文件的属主和属组改为may,mayday
chown user file 例:chown may a.txt 把文件的属主改为may
chown :group file 例:chown :mayday a.txt 把文件的属组改为mayday
chgrp mayday a.txt 把文件的属组改为mayday
5、修改权限
方法1:使用字符设定
chmod
作用:修改文件,目录的权限
命令格式:chmod [对谁操作] [操作符] [赋予什么权限] 文件名
对谁操作:
-u 表示文件或目录的所有者
-g 表示文件或目录所属组
-o 表示其他用户
-a 表示所有用户
操作符:
+添加权限
-减少权限
=直接给定一个权限
权限:r w x
方法2:使用八进制0-7数字表示权限法
权限 |
二进制值 |
八进制值 |
描述 |
--- |
000 |
0 |
没有任何权限 |
--x |
001 |
1 |
只有执行权限 |
-w- |
010 |
2 |
只有写入权限 |
-wx |
011 |
3 |
有写入和执行权限 |
r-- |
100 |
4 |
只有读取权限 |
r-x |
101 |
5 |
有读取和执行权限 |
rw- |
110 |
6 |
有读取和写入权限 |
rwx |
111 |
7 |
有全部权限 |
例1:
例2:执行cp /etc/issue /data/dir/所需要的最小权限
执行过程 |
需要的权限 |
/bin/cp |
需要x权限 |
/etc/ |
需要x权限 |
/etc/issue |
需要r权限 |
/data |
需要x权限 |
/data/dir |
需要w,x权限 |
6、权限对文件和目录的影响
权限 |
对文件的影响 |
对目录的影响 |
r |
可以读取文件的内容 |
可以列出目录的内容(文件名) |
w |
可以更改文件的内容 |
可以创建或删除目录中的任意文件 |
x |
可以作为命令执行文件 |
可以访问目录的内容 |
7、umask值
umask 的值可以用来保留在创建文件权限
实现方式:
新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
新建目录的默认权限: 777-umask
非特权用户umask默认是 002
root的umask 默认是 022
我们一般在/etc/profile、[HOME]/.profile中设置umask值,永久生效,编辑用户的配置文件vim .bash_profile
五、文件的特殊权限
文件的特殊权限:suid sgid sticky
1、SUID(set ui 设置用户ID):限定:只能设置在二进制可执行程序上面,对目录设置无效
功能:程序运行时的权限从执行者变更成程序所有者的权限
2、SGID:限定:既可以给二进制可执行程序设置,也可以对目录设置
功能:在设置了SGID权限的目录下建立文件时,新创建的文件所属组会继承上级目录的所属组
3、Stickybit:粘滞位权限是针对目录的,对文件无效,也叫防删除位
三个特殊权限对应的数值为:
SUID |
SGID |
Stickybit |
u+s或u=4 |
g+s或g=2 |
o+t或o=1 |
例1:suid
注:加上suid后在执行less命令的那一瞬间zhangsan用户拥有了文件所有者root的权限
例2:sgid
注:把root用户创建的目录test加上sgid然后改变test的属组为bin,在test下创建一个cc.txt文件,可以看到文件的所属组为上级目录test的bin而不是root
例3:stickybit
注:tmp目录设置的粘滞位,目录下创建的文件只有root,文件创建者,目录所有者才能删除,zhangsan用户无法删除
六、文件扩展权限ACL
扩展ACL:access control list
实现灵活的权限管理,除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify-acl 更改文件的访问控制列表
-M, --modify-file=file 从文件读取访问控制列表条目更改
-x, --remove=acl 根据文件中访问控制列表移除条目
-X, --remove-file=file 从文件读取访问控制列表条目并删除
-b, --remove-all 删除所有扩展访问控制列表条目
-k, --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version 显示版本并退出
-h, --help 显示本帮助信息
例:设置只让用户zhangsan对文件a.txt,拥有rwx权限,zhangsan不属于a.txt的所属主,所属组,other的权限还是r--