《Linux就该这么学》培训笔记_ch05_用户身份与文件权限
文章最后会post上书本的笔记照片。
文章主要内容:
用户身份与能力
在Linux系统中,用户的身份号码即UID(User IDentification)具有唯一性,因此可通过用户的UID值来判断用户身份。
RHEL7系统的用户身份:
- 管理员UID为0:系统的管理员用户。(Linux系统的管理员之所以是root,是因为该用户的UID为0,与用户名叫什么无关。)
- 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。这些用户默认的Shell解释器都是sbin/nologin,代表这些用户不能登录到系统中。
- 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
管理员创建的普通用户的UID默认是从1000开始的(即使前面有闲置的号码)。
用户组:通过使用用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。即可以针对组而非具体的用户来设置权限。在Linux系统中创建用户时,将自动创建一个与该用户名同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组。
useradd命令:用于创建新的用户,格式:useradd [选项] 用户名。创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。默认设置可以用以下useradd命令参数自行修改。
参数 | 作用 |
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
1 useradd -d /home/SB -u 2222 -s /sbin/nologin liwh #创建用户liwh,指定其家目录路径,UID以及Shell解释器。 2 id liwh #查看用户uid,gid和用户组信息。输出结果:uid=2222(liwh) gid=2222(liwh) groups=2222(liwh)
groupadd命令:用于创建用户组,格式:groupadd [选项] 组名。
1 groupadd SB #创建用户组SB。(为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把一群用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。)
usermod命令:用于修改用户的属性,格式:usermod [选项] 用户名。
修改用户信息,可以直接修改/etc/passwd文件,也可以用usermod修改。不过修改用户名不建议用命令,直接修改/etc/passwd。
参数 | 作用 |
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
1 id liwh #承接上面,输出结果:uid=2222(liwh) gid=2222(liwh) groups=2222(liwh) 2 usermod -G SB liwh #把liwh加入到SB用户组中 3 usermod -u 7777 liwh #修改liwh的uid为7777 4 id liwh #修改过后的liwh用户信息:uid=7777(liwh) gid=2222(liwh) groups=2222(liwh),2223(SB)
passwd命令:用于修改用户密码、过期时间、认证信息等,格式:passwd [选项] [用户名]。
关于passwd命令:
- 普通用户只能使用passwd命令修改自身的系统密码;
- root管理员有权限修改自己和其他所有人的密码,且不需要验证旧密码。root管理员完全拥有所有用户的管理权限。
参数 | 作用 |
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
--stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
1 echo "123456" | passwd --stdin liwh #修改liwh密码为123456 2 passwd -l liwh #锁定liwh,禁止其登录 3 passwd -S liwh #显示用户密码是否被锁定,以及密码采用的加密算法。因为liwh已被锁定,所以输出结果:...(Password locked.) 4 passwd -u liwh #解除锁定liwh,允许其登录 5 passwd -S liwh #再查查看密码是否已经解锁。因为liwh已解锁,所以输出结果:...(Password set,SHA512 crypt.)
userdel命令:用于删除用户。格式:userdel [选项] 用户名。在执行删除操作时,该用户的家目录默认会保留下来,可以用-r参数在删除用户同时把家目录删除。
常用参数:
- -f:强制删除用户
- -r:同时删除用户及用户家目录
1 userdel -rf liwh #强制删除用户liwh,同时删除其家目录
文件权限与归属
文件类型:
- -:普通文件。(最常见)
- d:目录文件。(最常见)
- l:链接文件。
- b:块设备文件。(鼠标键盘)
- c:字符设备文件。
- p:管道文件。
对于文件和目录的权限理解:
文件 | 目录 | |
可读(r) | 能够读取文件的实际内容 | 能够读取目录内的文件列表 |
可写(w) | 能够编辑、增删改文件的实际内容 | 能够在目录内增删以及重命名文件 |
可执行(x) | 能够运行脚本程序 | 能够进入该目录 |
文件权限:可读(r)、可写(w)、可执行(x),也可以分别用数字4、2、1表示。
权限的字符表示和数字表示转换实例:
- rwxrw-r-- --> 421420400 --> 764
- rw--w--wx --> 623
- --xr-x-wx --> 153
- rwx-wx--x --> 731
下图是ls -l命令查到的文件的详细信息及其重要项的意义。
文件的特殊权限
SUID:一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。如果赋予了SUID权限,则所有者中的可执行权限位会从x/-变为s/S(原先权限位上有/没有x执行权限,在被赋予SUID权限后将变成s/S)。
系统自带实例:ls -l命令查看/etc/shadow文件和/bin/passwd命令的详细信息。
- /etc/shadow文件是保存用户密码的文件,默认权限为000,除了管理员外,其他所有用户都没有查看或编辑该文件的权限;
- /bin/passwd命令是修改密码命令,其所有者的执行权限位为s,说明被赋予了suid权限,使得普通用户在执行passwd命令时能临时获取所有者(root)权限,从而通过命令修改/etc/shadow文件;
SGID:如果赋予了SUID权限,则所属组中的可执行权限位会从x/-变为s/S
- 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);-->用的不多,因为设计原理和目的跟SUID差不多,所以基本上干脆用SUID。
- 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置);-->常用。在目录设置SGID,则用户在该目录创建文件,文件的默认的用户组将由用户自己的基本用户组变为目录的所属组,使得同组内的其他用户都能访问该文件。
SBIT:确保用户只能删除自己的文件,而不能删除其他用户的文件。如果赋予了SBIT权限,则其他用户中的可执行权限位会从x/-变为t/T。
chmod命令:用于设置文件或目录的权限。格式:chmod [参数] 权限 文件或目录名称。
常用参数:
- a:所有人
- u:所有者
- g:所有组
- o:其他用户
- r:可读权限
- w:可写权限
- x:可执行权限
- s:suid或sgid权限(一般配合u或g参数使用,如果配合a参数,则代表同时设置suid和sgid)
- t:sbit权限(一般配合o参数使用,配合u或g参数使用无任何效果,配合a参数使用效果等同于配合o参数)
- +:添加权限
- -:移除权限
1 touch test #创建文件,该文件初始权限rw-r--r-- 2 chmod 3760 test #数字法赋予文件权限,第一个数字代表特殊权限3=-st(021),普通权限760=rwxrw----,结合起来就是rwxrwS--T 3 chmod 654 test #数字法赋予文件权限,654=0654,没有赋予特殊权限,654=rw-r-xr-- 4 chmod u+s test #在上述基础之上添加suid,文件权限:rwSr-xr-- 5 chmod g+s test #在上述基础之上添加sgid,文件权限:rwSr-sr-- 6 chmod o+t test #在上述基础之上添加sbit,文件权限:rwSr-sr-T 7 chmod a-s test #在上述基础之上移除suid和sgid,文件权限:rw-r--r-T 8 chmod a+rwx test #在上述基础之上给文件赋予所有人都有读写执行的权限,文件权限:rwxrwxrwt
chown命令:用于设置文件或目录的所有者和所属组。格式:chown [参数] 所有者:所属组 文件或目录名称。
1 chown root:SB test #设置test文件的所有者为root,所属组为SB
文件的隐藏属性(RHCSA)
隐藏权限不能直接被用户发觉,因为隐藏权限用ls -l命令是看不出来的。
chattr命令:用于设置文件的隐藏权限。格式:chattr [参数] 文件。添加隐藏权限用“+参数”,移除隐藏权限用“-参数”。
参数 | 作用 |
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)-->为/var/log/message设置,防止黑客修改日志 |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
lsattr命令:用于显示文件的隐藏权限。格式:lsattr [参数] 文件。
1 touh fuck #创建文件fuck 2 chattr +i fuck #为文件fuck添加隐藏权限,无法修改文件(包括删除) 3 rm -rf fuck #强行删除文件fuck,发现即使是root用户,拥有足够权限,也删除不了,是因为隐藏权限的关系 4 lsattr fuck #查看文件的隐藏权限,只有lsattr命令能查出文件的隐藏权限 5 chattr -i fuck #针对查出来的隐藏权限,把隐藏权限移除 6 rm -rf fuck #现在删除文件就能成功
文件访问控制列表
文件的访问控制列表(ACL):针对指定用户或用户组设置文件或目录的操作权限。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。
若针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
setfacl命令:用于管理文件的ACL规则,格式:setfacl [参数] 文件名称。
常用参数:
- -R:递归参数,针对目录文件时使用;
- -m:针对普通文件时使用;
- -b:删除文件或目录的ACL;
getfacl命令:用于显示文件上设置的ACL信息,格式:getfacl 文件名称。
1 setfacl -Rm u:linuxprobe:rwx /root #为/root目录设置ACL,允许用户linuxprobe进行读写执行操作 2 ls -ld /root #查看/root目录详细信息,会发现平时文件权限的最后一个点(.)变成加号(+),说明该文件或目录设置了ACL 3 su - linuxprobe #完整切换到linuxprobe用户 4 cat /root/anaconda-ks.cfg #/root是root用户的家目录,只有root能访问,但经过设置ACL后,linuxprobe也能访问/root的内容 5 exit #退出linuxprobe登录 6 getfacl /root #查看/root的ACL详细信息 7 setfacl -b /root #删除文件/目录的ACL
su命令与sudo服务
Linux系统为了安全性考虑,使得许多系统命令和服务只能被root管理员来使用,但是这让普通用户受到了更多的权限束缚,从而导致无法顺利完成特定的工作任务。
su命令:可以在当前用户不退出登录的情况下,顺畅地切换到其他用户。从root切换到普通户不用密码验证,但从普通用户切换root需要密码验证,因为这是必要的安全检查。
1 su root #切换到root用户(需要密码验证) 2 su - linuxprobe #减号(-)表示完全切换到新的用户,环境信息也变更为新用户的相应信息
通过切换用户命令使得普通用户可以切换到root用户来完成相应工作(前提是普通用户知道root密码),但这种方式很容易暴露root密码,增大被黑客获取的几率,这种做法不安全。
sudo命令:用于把特定命令的执行权限赋予给指定用户。通过合理配置sudo服务,可以保证普通用户能够完成特定的工作,也可以避免泄露root管理员密码。
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
sudo命令具有以下功能:
- 限制用户执行指定的命令:
- 记录用户执行的每一条命令;
- 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
- 验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
visudo命令:用于配置用户权限。使用该命令配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。只有root管理员才能用visudo命令。
sudo命令的配置文件中。配置用户权限的格式:用户 允许使用的主机=(以什么身份) 允许执行命令的列表 。其中命令列表中的命令要用绝对路径。不知道具体命令的绝对路径可以用whereis命令查看。
1 visudo 2 98 root ALL=(ALL) ALL #98行是已有的配置信息,作一个参考,在99行开始编辑linuxprobe用户的权限信息 3 99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff #NOPASSWD参数使得用户执行sudo命令时无需密码验证
4 su - linuxprobe #完整切换到linuxprobe
5 poweroff #正常执行poweroff命令,普通用户没有权限执行poweroff命令
6 sudo poweroff #通过sudo执行poweroff,可以执行