Linux学习之用户身份与文件权限
1 用户身份及能力
Linux系统的管理员之所以是root,并不是因为其名叫root,而是该用户身份号码数值(UID)为0.
管理员UID为0:系统的管理员用户
系统用户UID为1-999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整个服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。
在Linux系统中创建每个用户时,将自动创建一个同名的基本用户组,且该用户组只有用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称为扩展用户组。一个用户只有一个基本用户组,但可以有多个扩展用户组。
1.1 useradd命令
用于创建新的用户,格式为“useradd [选项] 用户名”
常用参数及作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为“2018-10-01”
-u 指定该用户的默认UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认shell解释器
% useradd -d /home/linux -u -s /sbin/nologin linuxprobe #一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中。
1.2 groupadd命令
用于创建用户组,格式为“groupadd [选项] 群组名”
Linux中没有直接根据组名查询GID的命令
可用如下方法
% grep eric /etc/group #群组文件放置在/etc/group中
1.3 usermod 命令
用于修改创建用户组,格式为“usermod [选项] 用户名”
常用参数及作用:
-c 填写用户账户的备注信息
-d -m 参数-m与-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为“2018-10-01”
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的UID
1.4 passwd命令
用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”
普通用户只能使用此命令修改自己的密码,而root则有权限修改其他所有人的密码
常用参数及作用:
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码,如'echo "NewPassWord" | passwd --stdin Username'
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
1.5 userdel 命令
用于删除用户,格式为“userdel [选项] 用户名”
常用参数及作用:
-f 强制删除用户
-r 同时删除用户及用户家目录
2 文件权限及归属
Linux文件类型:
- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件
对于目录文件来说,“可读”表示能够读取目录内的文件列表,“可写”表示能够在目录内新增、删除、重命名文件,“可执行”则表示能够进入该目录。
r—4 w—2 x—1
权限:rwxrw-r-- 764 #必须对应权限项,无权限位置用-
1 2 3 4 5 6 7 8
1:文件类型
2:文件访问权限
3:文件数
4:文件拥有者
5:文件所属组
6:文件大小
7:文件修改时间
8:文件名
输出第N列信息
例:上文中依据组名查询GID,只输出GID
原输出为: eric:x::
% grep eric /etc/group | awk -F: '{print $3}' #-F参数是用来分割原字符串,后加分割标识符,后面{print $3}必须加大括号
输出为10000
3 文件的特殊权限
3.1 SUID
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
设置SUID:(u+s)
% chmod u+s filename
设置SUID后,执行位x替换为s,若无执行权限,则该位为S
3.2 SGID
主要实现两种功能:一是让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);二是在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置,如部门的共享目录)。SGID的第一种功能是参考SUID设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。
设置SGID:(g+s)
% chmod -Rf g+s filename # -R 递归处理 -f 不显示错误信息
3.3 chmod命令
用于设置文件或目录的权限,格式为“chmod [参数] 权限”
3.4 chown命令
用于设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”
% chown root:bin test
3.5 SBIT(粘滞位或保护位)
SBIT特殊权限可以确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,设置了SBIT,该目录中的文件就只能被其所有者执行删除操作了。设置了SBIT后,执行位x替换为t,若无执行权限则为T。
设置SBIT(o+t)
% chmod -R o+t /root
特殊权限更多内容:https://www.jianshu.com/p/b390688a7af8
4 文件的隐藏属性
4.1 chattr命令
用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。添加隐藏功能,需“+参数”,移除隐藏功能,则为“-参数”。
常用参数及作用:
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)感觉类似于flush
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件中的内容
4.2 lsattr命令
用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”,Linux系统中隐藏权限必须用lsattr查看。
5 文件访问控制列表(ACL)
一般权限、特殊权限、隐藏权限共性:针对某一类用户
文件访问控制列表:针对某一个用户
若对某个目录设置了ACL,该目录内文件会继承其ACL;若对文件设置了ACL,则文件不再继承其所在目录的ACL。
5.1 setfacl命令
用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的rwx权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行rwx权限的控制。
常用参数及作用:
-R 对目录进行递归设置ACL
-m 对普通文件设置ACL
-b 删除某个文件/目录的ACL
% setfacl -Rm u:linuxprobe:rwx /root #u为user的简写,也可写user、g(group)、mask、other
ACL要素:
ACL_USER_OBJ:相当于Linux里file_owner的permission
ACL_USER:定义了额外的用户可以对此文件拥有的permission
ACL_GROUP_OBJ:相当于Linux里group的permission
ACL_GROUP:定义了额外的组可以对此文件拥有的permission
ACL_MASK:定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限
ACL_OTHER:相当于Linux里other的permission
5.2 getfacl命令
用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”,可加--omit-header省略掉前三行。
[root@localhost ~]# getfacl ./test.txt
# file: test.txt
# owner: root
# group: admin
user::rw- #1
user:john:rw- #2
group::rw- #3
group:dev:r-- #4
mask::rw- other::r-- #5
1:文件拥有者权限,ACL_USER_OBJ
2:用户john权限,ACL_USER
3:文件所属组权限,ACL_GROUP_OBJ
4:用户组dev权限,ACL_GROUP
5:MASK权限(ACL中最大权限,其他用户/用户组权限均不得大于此,否则按此权限执行)
设置ACL后 ls查看文件权限的最后一位由“.”变成了“+”
见到设置了ACL的文件/目录,不能单单依靠ls查看所有者、所属组及其他人的权限,如设置ACL时定义了MASK,则MASK权限替代GROUP权限显示,需使用getfacl命令查看。
6 su命令与sudo服务
6.1 su命令
用于切换用户身份,格式为“su - 用户名”,-表示完全切换到新用户,即把环境变量信息也变更为新用户。
6.2 sudo命令
用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务(指定提权),格式为“sudo [参数] 命令名称”。
主要参数及作用:
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语
6.3 visudo命令
类似于vim,用于配置用户权限,此命令执行时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。只有root管理员才可以用visudo命令编辑sudo服务的配置文件。
填写规则:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令列表(命令必须为绝对路径,用whereis查看)
例 在99行加入:linuxprobe ALL=(ALL) ALL #linuxprobe可执行root权限的所有命令
在99行加入:linuxprobe ALL=(root) /usr/bin/cat #linuxprobe可查看/root(root管理员家目录)中的文件信息
% sudo cat /etc/shadow
linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff #“NOPASSWD:”参数使得用户执行sudo命令时不需密码验证,不要忘了:否则报错