概述
用户一般来说是指系统的使用者,使用者可以使用这些名称来登录计算机,除了使用者之外,一些系统服务也需要含有部分特权的用户账户运行,因此出于安全考虑,用户管理应运而生,它加以明确限制各个用户账户的权限,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
[root@localhost ~]# useradd harry
[root@localhost ~]# tail -1 /etc/passwd
harry:x:1001:1001::/home/harry:/bin/bash
harry:x:1001:1001::/home/harry:/bin/bash
harry | 用户名 |
x | 密码占位符 |
1001 | 用户的UID,使用正整数表示,范围可以是0-65535 |
1001 | 用户所属组的GID |
用户描述信息 | 对用户的功能或其他来进行简要的描述 |
/home/harry | 用户家目录 |
/bin/bash | 用户登录系统后使用的shell |
-u 指定UID
[root@localhost ~]# useradd -u 1100 may
[root@localhost ~]# id may
uid=1100(may) gid=1100(may) groups=1100(may)
-d 指定家目录
[root@localhost ~]# useradd -d /opt/may may
[root@localhost ~]# id may
uid=1001(may) gid=1001(may) groups=1001(may)
[root@localhost ~]# ls /home
zhangsan
[root@localhost ~]# ls /opt
may rh
-g 指定基本组
[root@localhost ~]# useradd -g zhangsan mayday
[root@localhost ~]# id mayday
uid=1002(mayday) gid=1000(zhangsan) groups=1000(zhangsan)
[root@localhost ~]#
-G 指定附加组
[root@localhost ~]# useradd -G zhangsan,may,root fbi
[root@localhost ~]# id fbi
uid=1003(fbi) gid=1003(fbi) groups=1003(fbi),0(root),1000(zhangsan),1001(may)
-M 不建立宿主目录
[root@localhost ~]# useradd -M fba
[root@localhost ~]# ls /home
fbi mayday zhangsan
-s 指定用户登录的shell
[root@localhost ~]# useradd -s /sbin/nologin fbb
[root@localhost ~]# tail -1 /etc/passwd
fbb:x:1005:1005::/home/fbb:/sbin/nologin
2.删除用户命令userdel
-r 将宿主目录一起删除
[root@localhost ~]# userdel -r fbi
[root@localhost ~]# ls /home
fbb mayday zhangsan
3.密码管理passwd命令
命令格式:passwd [选项]...... 用户名
-d 清空指定用户的密码,仅使用用户名即可登录系统
-l 锁定用户账户
-S 查看用户账户的状态(是否锁定)
-u 解锁用户账户
[root@localhost ~]# passwd mayday
Changing password for user mayday.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
例:无交互设置密码
2、用户文件位置
1./etc/passwd
存放保存用户名称,宿主目录,登录shell等基本信息
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
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] 组账号名
[root@localhost aaa]# groupadd xiaoyu #添加组账号
[root@localhost aaa]# tail -1 /etc/group
xiaoyu:x:1006:
[root@localhost aaa]# groupadd -g 77 xiaoyue #指定组ID
[root@localhost aaa]# tail -1 /etc/group
xiaoyue:x:77:
3、组内管理
gpasswd命令 -----添加,设置,删除组成员
-a 向组内添加一个用户
-d 从组内删除一个用户成员
-M 定义组成员列表,以逗号分隔
[root@localhost aaa]# gpasswd -a mayday xiaoyu #组内加入新成员
Adding user mayday to group xiaoyu
[root@localhost aaa]# gpasswd -d mayday xiaoyu #删除成员mayday
Removing user mayday from group xiaoyu
[root@localhost aaa]# gpasswd -M mayday,fbb xiaoyu #在xiaoyu组加入
[root@localhost aaa]# tail -2 /etc/group mayday和fbb
xiaoyu:x:1006:mayday,fbb
xiaoyue:x:77:
groupdel命令:删除组账号
[root@localhost aaa]# groupdel xiaoyu
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
当前登录用户
[root@localhost aaa]# users
root root
四、文件的基本权限
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:
[root@localhost aaa]# touch aa.txt
[root@localhost aaa]# ll aa.txt
-rw-r--r--. 1 root root 0 Oct 2 02:38 aa.txt
[root@localhost aaa]# chmod 755 aa.txt
[root@localhost aaa]# ll aa.txt
-rwxr-xr-x. 1 root root 0 Oct 2 02:38 aa.txt
例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--
[root@localhost opt]# touch a.txt
[root@localhost opt]# ll a.txt
-rw-r--r--. 1 root root 0 Oct 2 05:35 a.txt
[root@localhost opt]# setfacl -m u:zhangsan:rwx /opt/a.txt
[root@localhost opt]# getfacl /opt/a.txt
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
user:zhangsan:rwx
group::r--
mask::rwx
other::r--
[root@localhost opt]# ll a.txt
-rw-rwxr--+ 1 root root 0 Oct 2 05:35 a.txt