5、用户身份与权限
5.1、用户身份与能力
管理员 UID 为 0:系统的管理员用户。
系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提 权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏 范围。
普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。 需要注意的是,UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)
5.1.1、id命令
- id命令用于显示用户的详细信息,语法格式为“id 用户名”
[root@chen home]# id chen
uid=1000(chen) gid=1000(chen) groups=1000(chen)
[root@chen home]#
5.1.2、useradd命令
- useradd 命令用于创建新的用户,格式为“useradd [选项] 用户名”
- 使用useradd命令创建用户时,默认的家目录会被存放在/home目录中
useradd 命令中的用户参数以及作用
参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为YYYY-MM-DD
-u 指定该用户的默认UID
-g 指定一个初始的用户基本组(已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户默认的Shell解释器
- 使用useradd创建一个名称为zj的用户,并使用id命令确认信息
[root@chen home]# useradd zj
[root@chen home]# id zj
uid=1001(zj) gid=1001(zj) groups=1001(zj)
[root@chen home]#
- 创建一个普通用户并指定家目录、用户的UID以及Shell解释器
- /sbin/nologin解释器一旦被设置,则代表该用户不能登录到系统中
[root@chen home]# useradd -d /home/linuxcool -u 8888 -s /sbin/nologin linux
[root@chen home]# id linux
uid=8888(linux) gid=8888(linux) groups=8888(linux)
[root@chen home]#
5.1.3、groupadd命令
-
groupadd命令用于创建新的用户组,语法格式为”groupadd[参数] 群组名”
- -g: 指定新建工作组的id
- -r: 创建系统工作组,系统工作组的组ID小于500
- -k: 覆盖配置文件”/etc/login.defs”
- -o: 允许添加ID号不唯一的工作组
- 为了更加高效的指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一组里面,这样便可以针对一类用户统一安排权限
[root@chen ~]# groupadd ronny
[root@chen ~]#
5.1.4、usermod命令
- usermod命令用于修改用户的属性,英文全称为“user modify“,语法格式为”usermod [参数] 用户名“
- 用户信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改配置
usermod命令中的参数以及作用
参数 作用
-d<登入目录> 修改用户登入时的目录
-e<有效期限> 修改账号的有效期限
-f<缓冲天数> 修改在密码过期后多少天即关闭该账号格式为:YYYY-MM-DD
-g<群组> 修改用户所属的群组
-G<群组> 修改用户所属的附加群组
-l<账号名称> 修改用户账号名称
-L 锁定用户密码,使密码无效
-s<shell> 修改用户登入后所使用的shell
-u<uid> 修改用户ID
-U 解除密码锁定
-d -m 参数-m与参数-d连用,可重新指定用户家目录并自动把就的数据转移过去
-c<备注> 修改用户账号的备注文字
# 查看linux用户的信息
[root@chen ~]# id linux
uid=8888(linux) gid=8888(linux) groups=8888(linux)
# 将用户linux加入到ronny用户组中去
[root@chen ~]# usermod -G ronny linux
[root@chen ~]# id linux
uid=8888(linux) gid=8888(linux) groups=8888(linux),8889(ronny)
# 修改linux用户的UID号码值
[root@chen ~]# usermod -u 8889 linux
[root@chen ~]# id linux
uid=8889(linux) gid=8888(linux) groups=8888(linux),8889(ronny)
# 把用户的解释器终端由默认的/bin/bash修改为/sbin/nologin
[root@chen ~]# usermod -s /sbin/nologin linux
usermod: no changes
[root@chen ~]# su - linux
This account is currently not available.
5.1.5、passwd命令
- passwd命令用于修改用户的密码、过期时间等信息,英文全称为”password”,语法格式为”passwd [参数] 用户名”
- 普通用户只能使用passwd命令修改自己的系统密码,root管理员则有权限修改其他所有人的密码
passwd命令中的参数以及作用
参数 作用
-l 锁定用户密码,无法被用户自行修改
-u 解开已锁定用户密码,允许用户自行修改
-e 密码立即过期,下次登陆强制修改密码
-k 保留即将过期的用户在期满后能仍能使用
-S 查询密码状态,以及密码所采用的加密算法的名称
-d 使该用户可用空密码登录系统
--stdin 通过标准输入修改用户密码,如echo"NewPassword" \| passwd --stdin Username
# 修改自己的密码
[root@chen ~]# passwd
Changing password for user root.
New password: 此处输入密码值
BAD PASSWORD: The password is shorter than 7 characters
Retype new password: 再次输入进行确认
passwd: all authentication tokens updated successfully.
# 修改其他人的密码,需要先判断是否为root用户
[root@chen ~]# passwd linux
Changing password for user linux.
New password: 此处输入密码值
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 再次输入进行确认
passwd: all authentication tokens updated successfully.
[root@chen ~]#
# 假设您有位同事正在度假,而且假期很长,那么可以使用 passwd 命令禁止该用户登录系统,等假期结束回归工作岗位时,再使用该命令允许用户登录系统,而不是将其删除
[root@chen ~]# passwd -l linux
Locking password for user linux.
passwd: Success
[root@chen ~]# passwd -S linux
linux LK 2022-04-23 0 99999 7 -1 (Password locked.)
# 在解锁时也要使用管理员身份
[root@chen ~]# passwd -u linux
Unlocking password for user linux.
passwd: Success
[root@chen ~]# passwd -S linux
linux PS 2022-04-23 0 99999 7 -1 (Password set, SHA512 crypt.)
5.1.6、userdel
- userdel 命令用于删除用户,格式为“userdel [选项] 用户名”
userdel 命令的参数以及作用
参数 作用
-r 删除用户主目录及其中的任何文件
-h 显示命令的帮助信息
-f 强制删除用户
# 在删除一个用户时,一般不建议删除他的家目录,使用userdel不加参数就行
[root@chen ~]# userdel linux
[root@chen ~]# id linux
id: linux: no such user
# 现在用户虽被删除了,但家目录数据会继续存放在/home目录中
[root@chen ~]# cd /home
[root@chen home]# ls
chen linux linuxcool readme.txt workdir zj
5.2、文件权限与归属
尽管在 Linux 系统中一切都是文件,但是每个文件的类型不尽相同,因此 Linux 系统使 用了不同的字符来加以区分,常见的字符如下所示。
- -:普通文件。
- d:目录文件。
- l:链接文件。
- b:块设备文件。
- c:字符设备文件。
- p:管道文件。
在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、 所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
这里给大家详细讲解一下目录文件的权限设置。对目录文件来说,“可读”表 示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可 执行”则表示能够进入该目录。
可读、可写、可执行权限对应的命令在文件和目录上是有区别的
文件的可读、可写、可执行权限的英文全称分别是read、write、execute,可以简写为r、w、x,亦可分别用数字4、2、1来表示,文件所有者、文件所属组及其他用户权限之间无关联
这里以rw-r-x-w-权限为例来介绍如何将字符表示的权限转换为数字表示的权限。首先,要将各个位上的字符替换为数字
数字6是由4+2得到的,不可能是4+1+1(因为每个权限只会出现一次,不可能同时有两个x执行权限);数字5则是4+1得到的;数字2是本身,没有权限即是空值0。接下来按照上表所示的格式进行书写,得到420401020这样一串数字。有了这些信息就好办了,就可以把这串数字转换成字母了,如图5-2所示。
大家一定要心中牢记,文件的所有者、所属组和其他用户的权限之间无关联。一定不要写成rrwwx—-的样子,一定要把rwx权限位对应到正确的位置,写成rw-r-x-w-
5.3、文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
下面具体解释这3个特殊权限位的功能以及用法
5.3.1、SUID
- SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)
[root@chen ~]# ls -l /etc/shadow
----------. 1 root root 1307 Apr 24 17:19 /etc/shadow
[root@chen ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr 1 2020 /bin/passwd
[root@chen ~]#
注意:
/bin/passwd用来告诫用户一定要小心这个权限,因为一旦某个命令文件被设置了SUID权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将SUID权限设置到vim、cat、rm等命令上面!!!
5.3.2、SGID
- SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限
#用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
[root@chen ~]# su - chenhao
[chenhao@chen ~]$ cd /tmp
[chenhao@chen tmp]$ mkdir testdir
[chenhao@chen tmp]$ ls -ald testdir
drwxrwxr-x. 2 chenhao chenhao 4096 Apr 25 20:16 testdir
[chenhao@chen tmp]$ chmod -R 777 testdir
[chenhao@chen tmp]$ ls -ald testdir
drwxrwxrwx. 2 chenhao chenhao 4096 Apr 25 20:16 testdir
[chenhao@chen tmp]$
# 在使用上述命令设置好目录的777权限(确保普通用户可以向其中写入文件),并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称
[chenhao@chen ~]$ cd /tmp/testdir/
[chenhao@chen testdir]$ echo "linux.com" > test
[chenhao@chen testdir]$ ls -al test
-rw-rw-r--. 1 chenhao chenhao 10 Apr 25 20:19 test
[chenhao@chen testdir]$
- 再介绍两个与本节内容相关的命令:chmod和chown
- chmod命令用于设置文件的一般权限及特殊权限
语法格式: chmod [参数 文件]
- 常用参数:
-c 若该文件权限确实已经更改,才显示其更改动作
-f 若该文件权限无法被更改也不显示错误讯息
-v 显示权限变更的详细资料
-R 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
参考实例
将档案 file1.txt 设为所有人皆可读取:
[root@chen ~]# mkdir file.txt
[root@chen ~]# chmod a+r file.txt
将目前目录下的所有文件与子目录皆设为任何人可读取 :
[root@chen ~]# chmod -R a+r *
将 file.txt 设定为只有该文件拥有者可以执行:
[root@chen ~]# chmod u+x file.txt
- chown命令 – 改变文件或目录用户和用户组
语法格式:chown [参数]
常用参数:
-R 对目前目录下的所有文件与子目录进行相同的拥有者变更
-c 若该文件拥有者确实已经更改,才显示其更改动作
-f 若该文件拥有者无法被更改也不要显示错误讯息
-h 只对于连结(link)进行变更,而非该 link 真正指向的文件
-v 显示拥有者变更的详细资料
--help 显示辅助说明
--version 显示版本
参考实例
将test.txt文件用户组与用户都改为bin:
[root@chen ~]# ll test.txt.bz2
-rw-r--r-- 1 root root 56 Jul 22 20:17 test.txt.bz2
[root@chen ~]# chown bin:bin test.txt.bz2
[root@chen ~]# ll test.txt.bz2
-rw-r--r-- 1 bin bin 56 Jul 22 20:17 test.txt.bz2
显示改动动作:
[root@chen ~]# ll test.txt
-rw-r--r-- 1 root root 45 Jul 22 21:11 test.txt
[root@chen ~]# chown -c bin:bin test.txt
changed ownership of `test.txt' to bin:bin
将当前目录下所有文件的拥有者都改为 chen,用户组改为 chengroup:
[root@chen ~]# chown -R chen:chengroup *
5.3.3、SBIT
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他用户权限部分的x执行权限就会被替换成t或者T—原本有x执行权限则会写成t,原本没有x执行权限则会被写成T 。
/tmp目录上的SBIT权限默认已经存在,这体现为“其他用户”权限字段的权限变为rwt:
[root@chen ~]# ls -ald /tmp
drwxrwxrwt. 75 root root 12288 Apr 25 20:38 /tmp
文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。为了避免现在很多读者不放心,所以下面的命令还是赋予了这个test文件最大的777权限(rwxrwxrwx) :
[root@chen ~]# cd /tmp
[root@chen tmp]# echo "Welcome to linux" > test
[root@chen tmp]# chmod 777 test
[root@chen tmp]# ls -al test
-rwxrwxrwx. 1 root root 17 Apr 25 20:41 test
[root@chen tmp]#
随后,切换到一个普通用户身份下,尝试删除这个由其他人创建的文件,这时就会发现,即便读、写、执行权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件:
[root@chen tmp]# su - linux
[linux@chen ~]$ cd /tmp
[linux@chen tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted
[linux@chen tmp]$
- SUID、SGID、SBIT特殊权限的设置参数
参数 作用
u+s 设置SUID权限
u-s 取消SUID权限
g+s 设置SGID权限
g-s 取消SGID权限
o+t 设置SBIT权限
o-t 取消SBIT权限
5.4、文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉
既然叫隐藏权限,那么使用常规的ls命令肯定不能看到它的真面目。隐藏权限的专用设置命令是chattr,专用查看命令是lsattr
5.4.1、chattr命令
-
chattr命令用于设置文件的隐藏权限,英文全称为change attributes,语法格式为”chattr [参数] 文件名称”。
-
想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。chattr命令中可供选择的隐藏权限参数非常丰富
-
chattr命令中的参数及其作用
参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
x 可以直接访问压缩文件中的内容
- 我们新建一个普通文件,然后立即尝试删除
[root@chen ~]# echo "for Test" > test
[root@chen ~]# rm test
rm: remove regular file ‘test’? y
[root@chen ~]#
- 接下来再次新建一个普通文件,并为其设置“不允许删除与覆盖”(+a参数)权限,然后再尝试将这个文件删除
[root@chen ~]# echo "for Test" > test
[root@chen ~]# chattr +a test
[root@chen ~]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted
[root@chen ~]#
5.4.2、lsattr命令
-
lsattr命令用于查看文件的隐藏权限,英文全称为“list attributes”,语法格式为“lsattr [参数] 文件名称”
-
Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令则看不出 :
[root@chen ~]# ls -al test
-rw-r--r--. 1 root root 9 Apr 25 21:05 test
- 一旦使用lsattr命令后,文件上被赋予的隐藏权限马上就会原形毕露:
[root@chen ~]# lsattr test
-----a-------e-- test
- 此时按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉:
[root@chen ~]# chattr -a test
[root@chen ~]# lsattr test
-------------e-- test
[root@chen ~]# rm test
rm: remove regular file ‘test’? y
[root@chen ~]# ls
chen linux test1 下载 公共 图片 文档 桌面 模板 视频 音乐
[root@chen ~]#
5.5、文件访问控制列表
不知道大家是否发现,前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准地派发权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL权限;若针对文件设置了ACL,则文件不再继承其所在目录的ACL权限。
为了更直观地看到ACL对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户为root管理员的家目录设置ACL之前,其执行结果如下所示:
[root@chen ~]# su - linux
Last login: Mon Apr 25 20:43:27 CST 2022 on pts/0
[linux@chen ~]$ cd /root
-bash: cd: /root: Permission denied
[linux@chen ~]$ exit
logout
[root@chen ~]#
5.5.1、setfacl命令
- setafacl命令用于管理文件的ACL权限规则,英文名称为”set file ACL”,语法格式为”setfacl [参数] 文件名称”
setfacl命令中的参数以及作用
参数 作用
- m 修改权限
- M 从文件中读取权限
- x 删除某个权限
- b 删除全部权限
- R 递归子目录
# 原来我们无法进入/root目录中,下面来设置用户在/root 目录上的权限:
[root@chen ~]# setfacl -Rm u:linux:rwx /root
[root@chen ~]# su - linux
Last login: Fri Apr 29 21:15:34 CST 2022 on pts/0
[linux@chen ~]$ cd /root
[linux@chen root]$ ls
chen linux test1 下载 公共 图片 文档 桌面 模板 视频 音乐
[linux@chen root]$ exit
logout
[root@chen ~]# ls -ld /root
dr-xrwx---+ 18 root root 4096 Apr 29 21:15 /root
[root@chen ~]#
我们如何查看文件是否设置了ACL呢?常用的ls命令时看不到ACL信息的,但是却可以看到文件权限的最后多了一个点(.)变成了加号(+),这就意味着文件已设置了ACL。
5.5.2、getfacl命令
- getfacl 命令用于显示文件上设置的 ACL 信息,格式为“getfacl 文件名称”
下面使用 getfacl 命令显示在 root 管理员家目录上设置的所有 ACL 信息
[root@chen ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linux:rwx
group::r-x
mask::rwx
other::---
ACL权限还可以针对某个用户组进行设置
# 允许某个组的用户都可以读写/etc/fstab文件
[root@chen ~]# setfacl -m g:linux:rw /etc/fstab
[root@chen ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:linux:rw-
mask::rw-
other::r--
设置错了想删除,清空所有的ACL权限,用-b参数;要删除某一条指定的权限按,就用-x参数:
[root@chen ~]# clear
[root@chen ~]# setfacl -x g:linux /etc/fstab
[root@chen ~]# getfacl /etc//fstab
getfacl: Removing leading '/' from absolute path names
# file: etc//fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
ACL权限的设置都是立即且永久生效的,这也有安全隐患,如果我们不小心设置错了权限,就会覆盖掉文件原始的权限信息,并且找不回来。
操作前备份一下。
# 例如在备份/home目录上的ACL权限时,可使用-R递归参数,这样不仅能够把目录本身的权限进行备份,还能将里面的文件权限也自动备份
[root@chen ~]# cd /
[root@chen /]# getfacl -R home > backup.acl
[root@chen /]# ls -l
total 108
-rw-r--r--. 1 root root 22209 Apr 29 22:53 backup.acl
ACL权限的恢复也简单,使用–restore参数1
[root@chen /]# setfacl --restore backup.acl
5.6、su 命令与 sudo 服务
- su命令可以解决切换用户的问题
# 从root管理员切换到普通用户
[root@chen /]# cd ~
[root@chen ~]# su - linux
Last login: Fri Apr 29 21:16:26 CST 2022 on pts/0
[linux@chen ~]$ id
uid=1002(linux) gid=1002(linux) groups=1002(linux) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[linux@chen ~]$
细心的读者一定会发现,上面的 su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)
# 普通用户切换成 root管理员就需要进行密码验证了
[linux@chen ~]$ su - root
Password:
Last login: Fri Apr 29 22:29:12 CST 2022 from 192.168.200.1 on pts/1
[root@chen ~]#
- sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为“sudo [参数] 命令名称”
- sudo 服务中的可用参数以及作用
参数 作用
-k 强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
-b 将要执行的指令放在背景执行
-p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称,%h 会显示主机名称
-s 执行环境变数中的SHELL 所指定的shell ,或是 /etc/passwd 里所指定的 shell command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
-v 因为 sudo 在第一次执行时或是在 N分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过N分钟,也会问密码
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
总结来说,sudo 命令具有如下功能:
- 限制用户执行指定的命令:
- 记录用户执行的每一条命令;
- 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
- 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码