首页 > 技术文章 > Linux:用户身份与文件权限

trafalgar999 2020-05-08 16:44 原文

用户身份与文件权限

本章内容:

用户身份与能力;

文件权限与归属;

文件的特殊权限;

文件的隐藏权限;

文件访问控制列表;

su 命令与 sudo 服务

用户身份与能力

管理员 UID 为 0:系统的管理员用户。

系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提 权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏 范围。

普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。

管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。

为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用 户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方 便为组中的用户统一规划权限或指定任务

在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且 这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户 组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满 足日常的工作需要

useradd

useradd 命令用于创建新的用户,格式为“useradd [选项] 用户名”

可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会 被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名 的基本用户组

参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为 YYYY-MM-DD.
-u 指定该用户的默认 UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认 Shell 解释器

下面我们创建一个普通用户并指定家目录的路径、用户的 UID 以及 Shell 解释器。在下 面的命令中,请注意/sbin/nologin,它是终端解释器中的一员,与 Bash 解释器有着天壤之别。 一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中:

[root@localhost ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin sttop
[root@localhost ~]# id sttop
uid=8888(sttop) gid=8888(sttop) 组=8888(sttop)

groupadd

groupadd 命令用于创建用户组,格式为“groupadd [选项] 群组名”。

创建用户组的步骤非常简单,例如使 用如下命令创建一个用户组 ronny:

# groupadd ronny 

usermod

usermod 命令用于修改用户的属性,格式为“usermod [选项] 用户名”。

用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用 户参数项目,也可以用 usermod 命令修改已经创建的用户信息,诸如用户的 UID、基本/扩展 用户组、默认终端等。

参数 作用
-c 填写用户账户的备注信息
-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为 YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的 UID

passwd

passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]” 。

普通用户只能使用 passwd 命令修改自身的系统密码,而 root 管理员则有权限修改其他 所有人的密码。更酷的是,root 管理员在 Linux 系统中修改自己或他人的密码时不需要验证旧 密码,这一点特别方便。既然 root 管理员可以修改其他用户的密码,就表示完全拥有该用户 的管理权限

参数 作用
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码,如 echo "NewPassWord"
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称

如何修改用户自己的密码,以及如何修改其他人的密码(修改他 人密码时,需要具有 root 管理员权限):

# passwd 
Changing password for user root. New password:  Retype new password:  passwd: all authentication tokens updated successfully. 

# passwd linuxprobe
Changing password for user linuxprobe. New password:  Retype new password:  passwd: all authentication tokens updated successfully. 

userdel

userdel 命令用于删除用户,格式为“userdel [选项] 用户名”。

如果我们确认某位用户后续不再会登录到系统中,则可以通过 userdel 命令删除该用户的 所有信息。在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r 参数将其删 除。

参数 作用
-f 强制删除用户
-r 同时删除用户及用户家目录

文件权限与归属

linux中的文件类型:

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件
  • p:管道文件

在 Linux 系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、 所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文 件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编 辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。

对目录文件来说,“可读”表 示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可 执行”则表示能够进入该目录。

文件的读、写、执行权限可以简写为 rwx,亦可分别用数字 4、2、1 来表示,文件所有 者,所属组及其他用户权限之间无关联

文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。 例如,若某个文件的权限为 7 则代表可读、可写、可执行(4+2+1);若权限为 6 则代表可读、 可写(4+2)。

文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能

SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有 属主的权限(仅对拥有执行权限的二进制程序有效)。

例如,所有用户都可以执行 passwd 命 令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发 现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件 的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得 程序所有者的身份,把变更的密码信息写入到 shadow 文件中。

查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着 该文件被赋予了 SUID 权限

如果原先权 限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S

SGID

SGID 主要实现如下两种功能:

  • 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
  • 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文 件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部 门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共 享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文 件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是 SGID 的 第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

[root@linuxprobe ~]# cd /tmp [root@linuxprobe tmp]# mkdir testdir [root@linuxprobe tmp]# ls -ald testdir/ drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/ [root@linuxprobe tmp]# chmod -Rf 777 testdir/ [root@linuxprobe tmp]# chmod -Rf g+s testdir/ [root@linuxprobe tmp]# ls -ald testdir/ drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/ 
在使用上述命令设置好目录的 777 权限(确保普通用户可以向其中写入文件),并为该目 录设置了 SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件, 并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称: 
[root@linuxprobe tmp]# su - linuxprobe Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0 [linuxprobe@linuxprobe ~]$ cd /tmp/testdir/ [linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test [linuxprobe@linuxprobe testdir]$ ls -al test -rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test 

chmod和chown

chmod 命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、 所属组可读可写、其他人没有任何权限,则相应的字符法表示为 rwxrw----,其对应的数字法 表示为 760。

除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,这里使用的 命令为 chown,其格式为“chown [参数] 所有者:所属组 文件或目录名称”。

chmod 和 chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共 性,就是针对目录进行操作时需要加上大写参数-R 来表示递归操作,即对目录内所有的文件 进行整体操作

SBIT

SBIT 特殊权限位可确保用户只能删除自己的文件,而 不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录 中的文件就只能被其所有者执行删除操作了。

与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文 件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原 本没有 x 执行权限则会被写成 T。

要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的 参数 o+t 代表设置 SBIT 粘滞位权限:


文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起 来的权限,默认情况下不能直接被用户发觉

chattr
chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏 功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件, 则需要追加“-参数”

[root@linuxprobe ~]# echo "for Test" > linuxprobe [root@linuxprobe ~]# chattr +a linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y rm: cannot remove ‘linuxprobe’: Operation not permitted 

lsattr
lsattr 命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在 Linux 系统中,文 件的隐藏权限必须使用 lsattr 命令来查看,平时使用的 ls 之类的命令则看不出端倪


文件访问控制列表

如果希望对某个指定的用户进行单独的权限控制,就需要用到文件 的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置 ACL 其实就是针对指定的 用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了 ACL,则目录中 的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

setfacl

setfacl 命令用于管理文件的 ACL 规则,格式为“setfacl [参数] 文件名称”。文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令 可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录 文件需要使用-R 递归参数;针对普通文件则使用-m 参数;如果想要删除某个文件的 ACL, 则可以使用-b 参数

[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root [root@linuxprobe ~]# su - linuxprobe Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1 [linuxprobe@linuxprobe ~]$ cd /root [linuxprobe@linuxprobe root]$ ls anaconda-ks.cfg Downloads Pictures Public [linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg [linuxprobe@linuxprobe root]$ exit

常用的 ls 命令是看不到 ACL 表信息的,但是却可以看到文件的权限最后一个点(.)变 成了加号(+),这就意味着该文件已经设置了 ACL 了。

getfacl

getfacl 命令用于显示文件上设置的 ACL 信息,格式为“getfacl 文件名称”。


su命令与sudo服务

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切 换到其他用户,比如从 root 管理员切换至普通用户

su 命令与用户名之间有一个减号(-)这意味着完全切 换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强 烈建议在切换用户身份时添加这个减号(-)。

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为“sudo [参数] 命令名称”。

总结来说,sudo 命令具有如下功能:

  • 限制用户执行指定的命令:
  • 记录用户执行的每一条命令;
  • 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
  • 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。

当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令 来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还 可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错(仅root可用)


感谢刘遄老师提供的开源优秀教材《Linux就该这么学》www.linuxprobe.com

推荐阅读