l15.Linux文件核心属性知识(一)

1,024 阅读17分钟

“ 本文正在参加「金石计划 . 瓜分6万现金大奖」 ”

9.1 回顾Linux文件属性知识

前文已经讲解过,Linux系统中的文件或目录的属性主要包括:索引节点(Inode)、文件类型、权限属性、连接数、所归属的用户和组、最近的修改时间等内容,更多内容请读者回顾第8章,此处不再讲述。

本章将为大家讲解剩余文件属性的含义,以及相关的重要Linux基础知识。

9.2 用户及用户组

用户和用户组是Linux系统中很重要的知识,本节将介绍Linux相关的基础知识,后文会进行更详细的讲解。用户和用户组的属性对于命令ll -hi /data结果中的第4列和第5列,示例如下:

[root@centos7 ~]# ll -hi /data
33914868 -rw-r--r--. 1 root root   0 Oct  8 00:19 neteagle.txt

说明: 命令中带有不同颜色底纹的root字符串的第4列表示用户(也叫属主),第5列表示用户组列。

9.2.1 Linux多用户多任务介绍

Linux是一个多用户、多任务的操作系统,在讲解Linux用户及用户组之前,我们先来简单了解下多用户、多任务操作系统的概念。

9.2.1.1 Linux单用户多任务

鉴于大家对Windows系统比较熟悉,因此这里先以Windows系统为例进行阐述。假设我们在以管理员账号administrator登录Windows系统之后,需要编辑word文档里的内容,但是在编辑文件的过程中,又想打开音乐播放器听音乐;同时还打开了微信或QQ。那么这其中编辑word文档、打开播放器、登录微信或QQ,这些操作每种都是一项任务。因此,在以上过程中我们同时执行了若干个任务,也就是说,一个administrator用户,为了完成工作和相关的任务,同时执行了若干个服务或进程。事实上,Linux也是这样的一个操作系统,当你登录后,你也可以同时开启很多服务任务和进程,而各个服务都会运行得很好,且对其他任务没有任何影响,这种一个用户登录系统执行多个服务任务和进程的情况,就称为单用户多任务。

9.2.1.2 Linux多用户多任务

有时可能是很多用户同时使用同一个系统,如笔者所在公司的机器,每台机器都可以被若干个运维人员登录部署或解决相关的故障问题,但并不是所有的运维人员都要做同一件事情,所以这就存在多用户、多任务的情况。

举个例子,比如neteagles.cn服务器,上面有系统管理员root用户、Apache用户、常规普通用户等。在同一时刻,可能有的人正在上传软件包部署Apache服务;有的正在查看服务器日志,有的人正在登录编写Shell程序;不同的维护人员对系统的维护或查看,所用的账号即可以是不同的普通账号,也可以是超级账号root;不同用户所具有的权限也不同,不同的任务由不同的维护人员来完成,也可以说是不同的用户。

值得注意的是,多用户、多任务并不是指大家同时挤到一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程登录到服务器上来进行的,比如对服务器的远程控制,只要具有相关用户的权限,任何人都可以访问服务器。

9.2.2 用户(user)介绍

通过前文的讲述,相信大家已经知道,Linux是一个多用户、多任务的分时操作系统。如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。这个账户和用户是同一个概念,可以通过建立不同属性的用户来实现不同的作用或权限,一方面,可以合理利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。

每个用户都拥有一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能等人系统和相应的目录(除了密码验证之外,还可以是密钥验证)。

在生产环境中,我们一般会为每个有权限管理服务器的运维人员分配一个独立的普通用户账号及8位(包含数字、字母、特殊字符)以上的密码,如neteagle。该人员只能通过这个账号登录到系统中进行维护,当需要超级用户权限时,可以通过“sudo 命令名”的方式来执行仅root用户才允许执行的权限。当然sudo权限要尽量地小。此外,当运维人数不多时(如两三个),也可以直接通过su -命令切换到超级用户root下执行相应的维护工作。在这里需要特别提醒大家注意的是,维护时,如果不需要root权限,就不用进入root用户下操作,以减少误操作对系统带来的故障风险,请读者切记。

提示: sudo和su是两个重要的切换用户角色的命令,后文会详细讲解。

9.2.3 Linix系统中用户角色的划分

在Linux系统中用户是分角色的,由于用户角色不同,权限和所完成的任务也不同;值得注意的是,对于Linux系统来说,用户的角色通过UID和GID来识别的。

特别是UID,在Linux系统运维工作中,一个UID可以唯一标识一个系统用户的账号(相当于我们的身份证)。用户系统账号的名称(如neteagle)其实是给人(管理员)看的,Linux系统能够识别的仅仅是UID和GID这样的数字。

  • UID(User Identify):用户ID,相当于各位的身份证,在系统中是唯一的。
  • GID(Group Identify):组ID,相当于各位的家庭住址或者你们的学校ID,户口本的“号码”等。

9.2.3.1 超级用户:root(皇帝)

若将root比喻为皇帝,那么root的家目录就是皇宫,操作系统就是整个国家。

默认是root用户,它的UID和GID均为0。root用户在每台Unix/Linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中的任何文件和命令,拥有最高的管理权限。

在生产环境中,一般会禁止root账号通过SSH远程连接服务器(保护好皇帝),当然了,也会更改默认的SSH端口(保护好皇宫),以加强系统安全。

在企业工作中,如果没有特殊需求,应该尽量在普通用户下操作任务,而不是root账户下。

在Linux系统中,UID为0的用户就是超级用户。但是通常不会将用户的UID改为0,而是通过sudo命令管理提权,可以细分到每个命令的权限分配。

9.2.3.2 普通用户(老百姓)

这类用户一般是由具备系统管理员root权限的运维或系统管理人员添加的。例如,neteagle这类用户可以登录系统,但仅具备操作自己家目录中的文件及目录的权限,除此之外,还可以进入或浏览相关目录(如/etc、/var/log),但是无法创建、修改和删除任何文件。

普通用户可比喻成皇帝的臣民或贫民,别干坏事,国家有法律管束你。若为普通用户授权权限(sudo),就相当于为臣民封官。

普通用户可通过命令su -或su - root切换到root用户角色,这种切换类似于农民起义,推翻了皇帝,自己当皇帝。

sudo ls命令表示授权相关用户在执行ls命令时,具有sudo配置的权限,一般是在执行ls命令的过程中才具有root用户的权限,可将sudo理解为尚方宝剑,可通过它为皇帝办事,有一点的权限,但还是自己。

9.2.3.3 虚拟用户(傀儡)

要将虚假用户与真实的普通用户区分开来,这类用户最大的特点是安装系统后会默认存在,且默认情况下大多数不能登录系统,但是,它们是系统正常运行不可缺少的,它们的存在主要是为了方便系统管理,满足相应的系统进程对文件属主的要求。例如,系统默认的bin、adm、nobody、mail用户等。由于服务器业务角色的不同,一部分用不到的系统服务会被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务所对应的虚拟用户也可以处理掉(删除或注释)。

Linux安全优化注意事项

  • 安装系统后可以删除用不到的虚拟用户,但最好不要删除而是注释掉,万一出现问题还可以恢复回来。
  • 在部署服务的时候,一般需要创建虚拟用户,满足服务启动的属主需求!例如,在部署Apache、Nginx、MySQL、NFS、Rsync、Zabbix、Redis等服务时就需要预先创建好对应的虚拟用户,然后再部署服务。

9.2.4 Linux系统中不同用户角色对应的UID说明

下面的表9-1针对Linux用户进行了分类说明。

表9-1 有关Linux用户的分类说明

b9-1.png

9.2.5 多用户操作系统的安全

从实际应用来看,多用户系统使得系统管理变得更为方便了;从安全角度来说,多用户系统也更为安全,比如普通用户neteagle下的某个文件不想让其他用户看到,只需设置一下该文件的权限为只有普通用户neteagle一个用户可读可写可编辑(后文会详细讲解权限相关的内容)就行了,这样一来就只有普通用户neteagle一个用户可以对其私有文件进行操作,从而保护了每个用户私有数据的安全性。

9.2.6 用户组(group)介绍

简单地说,Linux系统中的用户组(group)就是具有相同特征的用户(user)集合;为了便于大家理解,这里打个比方:一个公司、一个家庭就是一个集合,类似于这里的用户组,公司的员工和家庭中的成员就相当于这里的用户。

有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件或目录,如果不用用户组,那么这种需求在授权时就会很难实现。有了用户组就方便多了,只需要将授权的用户都加入同一用户组里,然后修改与该文件或目录对应的用户组的权限,即让用户组具有符合需求的操作权限即可。这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。

将用户分组是Linux系统(Windows中也是一样的)中对用户进行管理及控制访问权限的一种手段,定义用户组,可以在很大程度上简化运维管理的工作。

实际上,在日常生活中,对人类的分组也是无处不在的,达到国家,小到公司、家庭、学校、班级等都是类似于Linux中用户组的概念,而其中的成员就类似于Linux用户组中用户的概念。

用户和用户组的对应关系有:一对一、一对多、多对一和多对多。为了方便大家理解,下面通过图9-1更形象地来展示这种关系。

t9-1.png

图9-1 用户和用户组关系

用户和用户组的对应关系具体说明如下。

  • 一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员(如:root)。
  • 一对多:即一个用户可以存在于多个用户组中。比如,图9-1中普通用户oldboy可以是sa组成员,也可以是Java用户组成员,还可以是tech用户组成员,这里的oldboy用户具有sa、Java、tech等多个组的共同权限。
  • 多对一:多个用户可以存在于一个组中,这些用户具有与组相同的权限,这条已在上文中讲解过。
  • 多对多:多个用户可以存在于多个组中,并且几个用户可以归属于相同的组。其实多对多的关系是前面三条的扩展,理解了上面的三条,这条也就好理解了。

9.2.7 创建用户及用户组的命令

要想创建Linux用户,就需要useradd命令,具体操作如下:

[root@centos7 ~]# useradd neteagle  #添加用户neteagle,会默认创建一个neteagle用户组,人必须属于家庭,所以用户创建也必须要属于一个组,默认就属于与用户同名的组。
[root@centos7 ~]# id neteagle   #查看neteagle用户、组及ID信息。
uid=1001(neteagle) gid=1001(neteagle) groups=1001(neteagle)
[root@centos7 ~]# groupadd sa   #添加sa用户组,用户组可以单独存在,而没有用户属于组。
[root@centos7 ~]# su - neteagle #从root用户切换到neteagle用户下。
[neteagle@centos7 ~]$ touch test.txt    #创建文件,注意提示符变成了$。
[neteagle@centos7 ~]$ mkdir inca    #创建目录
[neteagle@centos7 ~]$ ls -l
total 0
drwxrwxr-x. 2 neteagle neteagle 6 Oct  8 01:45 inca
#目录默认属于创建它的用户和组。
-rw-rw-r--. 1 neteagle neteagle 0 Oct  8 01:45 test.txt
#文件默认属于创建它的用户和组。
#文件生产一定是由用户创建的,因此文件一生成也必须要属于一个用户及组,默认就是属于创建它的用户的和组。

更多有关用户及用户组的知识,请阅读后文的相关章节。

9.3 文件的权限列

文件的权限是Linux系统极其重要的知识,本节将介绍相关的基本知识,后文还会有更详细的讲解。文件的权限列属性对应于命令ll -hi /data结果中的第2列中间的9位字符串,示例代码如下:

[root@centos7 ~]# ll -hi /data
33914868 -rw-r--r--. 1 root root   0 Oct  8 00:19 neteagle.txt

对于文件权限列的说明具体如下。

1)代码中带有不同颜色底纹的rw-r--r--字符串就表示文件对应的访问权限。

2)第二列权限的结尾多了个点号,大家看到了吗?当系统的SELinux功能开启时,这个地方就会多一个点号,这个点号是与SELinux(企业里大多会将SELinux功能停止掉)相关联的,木上面实际用途,有关点号的作用仅在此提及,其他地方不再讲述。

文件权限说明

在Linux中,文件或目录的权限与用户及用户组的关联很大,要理解这部分内容,需要先链接一下Linux系统中用户管理方面的知识。前文已经详细讲解过这部分内容,更多用户管理文档的细节请参考后面的章节。

在Linux中,每个文件或目录都有一组工9个基础权限位,每三位字符分为一组,它们分别是属主(也成用户)权限位(占开头的三个字符,如rw-)、用户组权限位(占中间的三个字符,如r--)、其他用户权限位(占结尾的三个字符,如r--)。最终形式如“rw-r--r--”。Linux正式通过这9个权限(更多权限位后面会提到)位来控制文件用户(或称属主,即Owner/User)、用户组(或称属组,即Group)以及其他用户(Other)对文件的访问权限的,不同组的权限位说明如图9-2所示。

t9-2.png

图9-2 9位权限位对应功能说明

不同权限位对应的用户组和组权限控制的详细图解如图9-3所示。

t9-3.png

图9-3 不同权限位对应的用户和组权限控制的具体图解

其中,表示权限的字符r、w、x、“-”分别代表了特定的含义,具体说明如下。

  • r(read):可读权限,对应数字4。
  • w(write):可写权限,对应数字2。
  • x(Execute):可执行权限,对应数字1。
  • -:木任何权限,对应数字0。

后文还会提到一些特殊的权限位t、T、s、S、x、X、"+",暂时忽略不表。

在图9-3中,oldboyfile所属的用户为root,即root用户对oldboyfile文件的访问权限对应于前3个字符。因为这里的前3个字符为rwx,所以root用户对oldboyfile有读、写和执行的权限。

而oldboyfile所属的用户组为root,即root用户组内的成员对oldboyfile文件的访问权限对应于中间3个字符。因为这里中间的3个字符为r-x,所以root用户组的任意成员对oldboyfile有读和执行的权限,但没有写权限。

同理,非root用户和root用户组的成员对oldboyfile文件的访问权限对应于最后3个字符。因为这里的最后3个字符为r-x,所以其他用户和组队oldboyfile有读和执行的权限,没有写的权限。

有关文件权限的更多内容,请参见后面章节的详解。

9.4 文件的修改时间属性列

文件的时间戳是Linux系统中不太重要的知识,读者了解即可。文件的最后修改时间列属性对应于命令ll -hi /data结果中的第7~9列,示例代码如下:

[root@centos7 ~]# ll -hi /data
33914868 -rw-r--r--. 1 root root   0 Oct  8 00:19 neteagle.txt

说明:

代码中带有不同颜色底纹的Oct 8 00:19字符串就是表示文件对应的最后修改时间。

文件的时间戳属性具体包含3中类型,即访问时间(access)、修改时间(modify)、改变时间(change),详细描述如下:

[root@centos7 ~]# stat /data/neteagle.txt 
  File: ‘/data/neteagle.txt’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d  Inode: 33914868    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2020-10-08 00:19:23.787073041 +0800 #文件最后被访问的时间。
Modify: 2020-10-08 00:19:23.787073041 +0800 #文件最后被修改的时间。
Change: 2020-10-08 00:19:23.787073041 +0800 #文件状态最后被改变的时间。
 Birth: -

对应ls命令,查看上述时间戳的选项,详细描述如下:

mtime:最后修改时间(ll -t) #修改文件内容,文件的修改时间(modify time)会改变。
[root@centos7 ~]# ll -t /data/neteagle.txt  
-rw-r--r--. 1 root root 0 Oct  8 00:19 /data/neteagle.txt
​
ctime:状态改变时间(ll -c) #修改文件内容、移动文件或改变文件属性等,文件的change时间会改变。
[root@centos7 ~]# ll -c /data/neteagle.txt
-rw-r--r--. 1 root root 0 Oct  8 00:19 /data/neteagle.txt

当执行ls -l命令时,显示的是文件的最后修改时间,有关更改时间戳的知识,可以参考前文的touch、ls命令章节。