《Linux就该这么学》培训笔记_ch05_用户身份与文件权限

《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

  1. 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);-->用的不多,因为设计原理和目的跟SUID差不多,所以基本上干脆用SUID。
  2. 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置);-->常用。在目录设置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,可以执行

书本笔记

-----/*看过许多光怪陆离的风景,才知俗世中最可畏是人心*/-----
原文地址:https://www.cnblogs.com/kaminwu/p/10893228.html