就这么学Linux 用户身份与文件权限-上

用户身份与能力

在 Linux 系统中,UID 就像我们的身份证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份。在 RHEL 8 系统中,用户身份有下面这些:

➢ 管理员UID为0:系统的管理员用户。
➢ 系统用户UID为1~999:Linux 系统为了避免因某个服务程序出现漏洞而被黑客提
权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏
范围。
➢ 普通用户UID1000~:是由管理员创建的用于日常工作的用户。

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

id

id 命令用于显示用户的详细信息,语法格式为“id 用户名”。

这个 id 命令是一个在创建用户前需要仔细学习的命令,它能够简单轻松地查看用户的基本信息,例如用户 ID、基本组与扩展组 GID,以便于我们判别某个用户是否已经存在,以及
查看相关信息。

下面使用 id 命令查看一个名称为 linuxprobe 的用户信息:

id linuxprobe

useradd

useradd 命令用于创建新的用户账户,语法格式为“useradd [参数] 用户名”。

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

在这里插入图片描述
下面使用 useradd 命令创建一个名称为 linuxcool 的用户,并使用 id 命令确认信息:

useradd linuxcool
id linuxcool

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

useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown
id linuxdown

groupadd

groupadd 命令用于创建新的用户组,语法格式为“groupadd [参数] 群组名”。

为了能够更加高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。例如在工作中成立一个部门组,当有新的同事加入时就把他的账号添加到这个部门组中,这样新同事的权限就自动跟其他同事一模一样了,从而省去了一系列烦琐的操作。

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

groupadd ronny

usermod

usermod 命令用于修改用户的属性,英文全称为“user modify”,语法格式为“usermod [参数] 用户名”。

前文曾反复强调,Linux 系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息,比如用户的 UID、基本/扩展用户组、默认终端等。usermod 命令的参数以及作用如表所示。

在这里插入图片描述
先来看一下账户 linuxprobe 的默认信息:

id linuxprobe
usermod -G root linuxprobe

然后将用户 linuxprobe 加入到 root 用户组中,这样扩展组列表中则会出现 root 用户组的字样,而基本组不会受到影响:

usermod -G root linuxprobe
id linuxprobe

再来试试用-u 参数修改 linuxprobe 用户的 UID 号码值:

usermod -u 8888 linuxprobe
id linuxprobe

把用户的解释器终端由默认的/bin/bash 修改为/sbin/nologin

usermod -s /sbin/nologin linuxprobe
su - linuxprobe

passwd

passwd 命令用于修改用户的密码、过期时间等信息,英文全称为“password”,语法格式为“passwd [参数] 用户名”。

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

在这里插入图片描述
要修改自己的密码,只需要输入命令后敲击回车键即可:

passwd
<输入密码>
<再次输入进行确认>

要修改其他人的密码,则需要先检查当前是否为 root 管理员权限,然后在命令后指定要修改密码的那位用户的名称:

passwd linuxprobe
<输入密码>
<再次输入进行确认>

使用 passwd 命令禁止该用户登录系统

passwd -l linuxpeobe
passwd -S linuxprobe

在解锁时,记得也要使用管理员的身份;否则,如果普通用户也有锁定权限,系统肯定会乱成一锅粥:

passwd -u linuxprobe
passwd -S linuxprobe

userdel

userdel 命令用于删除已有的用户账户,英文全称为“user delete”,语法格式为“userdel [参数] 用户名”。

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

userdel 命令的参数以及作用如表所示。
在这里插入图片描述
在删除一个用户时,一般会建议保留他的家目录数据,以免有重要的数据被误删除。所以在使用 userdel 命令时可以不加参数,写清要删除的用户名称就行:

userdel linuxprobe
id linuxprobe

虽然此时该用户已被删除,但家目录数据会继续存放在/home 目录中,等确认未来不再使用时将其手动删除即可:

cd /home
ls
rm -rf linuxprobe
ls

文件权限与归属

在 Linux 系统中,每个文件都有归属的所有者和所属组,并且规定了文件的所有者、所属组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。

对于一般文件来说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,理解其权限设置就不那么容易了。很多资深 Linux 用户其实也没有真正搞明白。对于目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。

可读、可写、可执行权限对应的命令在文件和目录上是有区别的,具体可参考表。
在这里插入图片描述
文件的可读、可写、可执行权限的英文全称分别是 read、write、execute,可以简写为 r、w、x,亦可分别用数字 4、2、1 来表示,文件所有者、文件所属组及其他用户权限之间无关联,如表所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是 34298 字节,最近一次的修改时间为 4 月 2 日的 0:23,文件的名称为 install.log。

文件的特殊权限

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

SUID

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

查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

ls -l /etc/shadow
ls -l /bin/passwd

加粗显示的字体用来告诫用户一定要小心这个权限,因为一旦某个命令文件被设置了 SUID 权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将 SUID 权限设置到 vim、cat、rm 等命令上面!!!

SGID

每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。

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

cd /tmp
mkdir testdir
ls -ald testdir
chmod -R 777 testdir
chmod -R g+s testdir
ls -ald testdir

在使用上述命令设置好目录的 777 权限(确保普通用户可以向其中写入文件),并为该目录设置了 SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称:

su - linuxprobe
cd /tmp/testdir
echo "linuxprobe.com" > test
ls -al test

除了上面提到的 SGID 的这两个功能,再介绍两个与本节内容相关的命令:chmod 和chown。

chmod 命令用于设置文件的一般权限及特殊权限,英文全称为“change mode”,语法格式为“chmod [参数] 文件名”。

这是一个与文件权限的日常设置强相关的命令。例如,要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为 760。

ls -l anaconda-ks.cfg
chmod 760 anaconda-ls.cfg
ls -l anaconda-ks.cfg 

下面使用“所有者:所有组”的格式把前面那个文件的所属信息轻松修改一下,变更后的效果如下:

chown linuxprobe:linuxprobe anaconda-ks.cfg
ls -l anaconda-ks.cfg

SBIT

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

由下可知,/tmp 目录上的 SBIT 权限默认已经存在,这体现为“其他用户”权限字段的权限变为 rwt:

ls -ald/tmp

为了避免现在很多读者不放心,所以下面的命令还是赋予了这个 test=文件最大的 777 权限(rwxrwxrwx):

cd /tmp
echo "welcome to linuxprobe.com" > test
chmod 777 test
ls -al test

随后,切换到一个普通用户身份下,尝试删除这个由其他人创建的文件,这时就会发现,即便读、写、执行权限全开,但是由于 SBIT 特殊权限位的缘故,依然无法删除该文件:

su - linuxprobe
cd /tmp
rm -f test

在工作中,若能善加使用特殊权限,就能实现很多巧妙的功能。使用 chmod 命令设置特殊权限的参数如表所示。
在这里插入图片描述
切换回 root 管理员的身份下,在家目录中创建一个名为 linux 的新目录,随后为其设置SBIT 权限:

exit
cd~
mkdir linux
chmod -R o+t linux/
ls -ld linux/

猜你喜欢

转载自blog.csdn.net/AdamCY888/article/details/131360132