深入理解Linux文件系统与日志分析

158 阅读20分钟

临时关闭防火墙

[root@localhost ~]#systemctl stop firewalld   //临时关闭防火墙
[root@localhost ~]#systemctl disable firewalld    //关闭防火墙的自启功能
[root@localhost ~]#setenforce 0   //对文件的修改进行严重

永久关闭重启以后也不会打开selinux

[root@localhost ~]#vim /etc/sysconfig/selinux   修改配置文件


# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled    修改一下写入配置文件即可
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

一台Linux系统初始化环境后需要做一些什么安全工作?

1、添加普通用户登陆,禁止 root用户登陆,更改SSH端口号。修改SSH端口不一定绝对哈。当然,如果要暴露在外网,建议改下。
2、服务器使用密钥登陆,禁止密码登陆。
3、开启防火墙,关闭SElinux ,根据业务需求设置相应的防火墙规则。
4、装fail2ban这种防止SSH 暴力破击的软件。
5、设置只允许公司办公网出口IP能登陆服务器(看公司实际需要),也可以安装VPN等软件,只允许连接VPN到服务器上。
6、修改历史命令记录的条数为10条。
7、只允许有需要的服务器可以访问外网,其它全部禁止。
8、做好软件层面的防护。
(1)设置nginx_waf模块防止SQL 注入。
(2)把 web 服务使用www 用户启动。更改网站目录的所有者和所厘组为www

inode和block

  • 文件数据包括元信息与实际数据。
  • 文件存储在硬盘上,硬盘最小存储单位是“扇区”,每个扇区存储512字节。
  • block(块)
    • 连续的八个扇区组成一个block
    • 是文件存取的最小单位
  • inode(索引节点)
    • 中文译名为“索引节点”,也叫 i 节点
    • 用于存储文件元信息
  • 一个文件必须占用一个inode ,至少占用一个block

inode和block关系

  1. 文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。

  2. 一般连续八个扇区组成一个"块”(block),一个块是4K大小,是文件存取的最小单位。操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一个块一个块的读取的。

  3. 文件数据包括实际数据与元信息(类似文件属性)。文件数据存储在“块"中,存储文件元信息(比如文件的创建者、创建日期、文件大小、文件权限等)的区域就叫做inode。 因此,一个文件必须占用一个inode,并且至少占用一个block。

  4. inode不包含文件名。文件名是存放在目录文件夹当中的。Linux 系统中一切皆文件,因此目录也是一种文件。

  5. 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称,文件名和inode号码是一一对应关系,每个inode号码对应一个或多个文件名。

  6. 所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找自己文件夹中的目录项,之后找到对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据。

inode

  • inode包含文件元信息 (不包含文件名)
    • 文件的字节数
    • 文件拥有者的User ID
    • 文件的Group ID
    • 文件的读,写,执行权限
    • 文件的时间戳
  • 用stat命令可以查看到某个文件的inode信息
    QQ截图20220814155656.png
  • Linux系统文件三个主要的时间属性
  • atime(access time):最近访问
    • 最后一次访问文件的时间
  • mtime(modify):最近更改
    • 最后一次更改文件内容的时间
  • ctime(change time):最近改动
    • 最后一次改变文件元信息的时间
不打开文件,atime不变。例如使用echo追加内容,atime不会变,因为文件没有被打开访问。

修改文件内容的话,mtime会变,ctime也会变。

如果只修改文件的权限,ctime变,mtime不变。
  • 目录文件的架构
    • 目录也是一种文件
    • 目录文件的架构

QQ截图20220814162416.png

  • 每个icode都有一个号码,操作系统用inode号码来识别用不同的文件
  • Linux 系统内部不使用文件名,而使用inode号码来识别文件
  • 对于用户,文件名只是inode号码便于识别的别称

inode的号码

  • 用户通过文件名打开文件时,系统内部的过程
  1. 系统找到这个文件名对应的inode号码
  2. 通过inode号码,获取inode信息
  3. 根据inode信息,找到文件数据所在的block,读出数据
  • 查看inode号码的方法
    • ls -i 命令查看文件名对应的inode号码 QQ截图20220814162942.png - stat命令查看文件inode信息中的inode号码 QQ截图20220814155656.png
文件存储
  • 硬盘分区后的架构

QQ截图20220814163604.png

QQ截图20220814163821.png 补充:

  • 用户通过文件名查找到对应的inode号
  • 根据inode好找到对应的inode信息
  • 根据inode信息判断是否具有访问权限
  • 如果有访问权限指向对应的数据块
  • 如果权限不够拒绝访问
inode大小

inode也会消耗硬盘空间

  • 每个inode的大小一般是128字节或256字节

格式化文件系统时确定inode的总数

  • 如果磁盘还有空间,但inode号被全部占用,也无法创建新文件。
  • inode号在同一个文件系统内唯一,在不同的文件系统中可以重复。

执行df-i命令可以查看每个磁盘分区对应的inode 总数和已经使用的inode数量

[root@localhost ~]#df -i  
文件系统                   Inode 已用(I)  可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 31457280  123302 31333978       1% /
devtmpfs                  250009     407   249602       1% /dev
tmpfs                     253989       1   253988       1% /dev/shm
tmpfs                     253989     572   253417       1% /run
tmpfs                     253989      16   253973       1% /sys/fs/cgroup
/dev/sda1                2097152     327  2096825       1% /boot
tmpfs                     253989       9   253980       1% /run/user/42
tmpfs                     253989       1   253988       1% /run/user/0

由于_inode号码与文件名分离,导致Linx系统具备以下几种特有的现象:

  1. 文件名包含特殊字符,可能无法正常删余。这时直接删除inode,能够起到删除文件的作用;
[root@localhost ~]#touch '#abc001'  //新建一个带有特殊符号的文件
[root@localhost ~]#ls -il  //查看inode号
 67170393 -rw-r--r--. 1 root root       0 814 16:55 #abc001
[root@localhost ~]#find ./ -inum 67170393 -delete  //通过inode号删除文件
[root@localhost ~]#find ./ -inum 67170393 -exec rm -f {} \;    //通过inode号删除文件
[root@localhost ~]#find ./ -inum 67170393 |xargs rm -f     //通过inode号删除文件

QQ截图20220814170826.png QQ截图20220814170836.png QQ截图20220814170844.png

  1. 移动文件或重命名文件,只是改变文件名,不影响inode号码
[root@localhost data]#ls -i
34680227 123
[root@localhost data]#mv 123 /root/321
[root@localhost ~]#ls -i
34680227 321

QQ截图20220814195346.png

  1. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。4.使用vi编辑器修改文件数据保存后,会生成一个新的inode号码。
[root@localhost data]#ls -i
34680227 123
[root@localhost ~]#vi 321
[root@localhost ~]#ls -i
67170415 321      
[root@localhost ~]#echo 1235 >321  //不会改变inode号
[root@localhost ~]#ls -i
67170415 321

QQ截图20220814201239.png QQ截图20220814201511.png

inode号特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象

  1. 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
  2. 移动或重命名文件时,只改变文件名,不影响inode号码
  3. 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名

cp命令和inode:

  • 分配一个空闲的inode号,在inode表中生成新条目
  • 在目录中创建一个目录项,将名称与inode编号关联
  • 拷贝数据生成新的文件

rm命令和inode:

  1. 链接数递减,从而释放的inode号可以被重用
  2. 把数据块放在空闲列表中
  3. 删除目录项
  4. 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖 mv和inode
  • 如果mv命令的目标和源在同一设备,
  • 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
  • 删除旧的目录对应关系新建目录对应关系

软链接与硬链接

对比项硬链接软链接
本质本质是同一个文件本质不是同一个文件
inode和源文件相同和源文件不同
链接数创建新的硬链接,链接数会增加;删除硬链接,链接数减少删除新建不会改变
目录不支持给目录创建支持
删除源文件只是链接数减一,但链接文件的访问不受影响无法访问链接文件
文件类型和源文件相同链接文件,和源文件无关
文件大小和源文件相同源文件的路径的长度
能否交叉文件系统不支持支持
对不存在的文件不支持创建硬链接支持创建软链接

软链接与硬链接(必须使用绝对路径)

ln 源文件 目标文件               //创建硬链接文件  
ln -s 源文件或目录 目标文件       //创建软链接文件
软链接硬链接
删除原始文件后失效仍旧可用
使用范围适用于文件或目录只可用于文件
保存位置与原始文件可以位于不同的文件系统中必须与原始文件在同一个文件系统(如一个Linux分区)内

模拟inode节点耗尽实验

添加一个新硬盘

QQ截图20220919191437.png 管理磁盘,创建磁盘

QQ截图20220919191744.png 把文件系统类型格式化为ext3

QQ截图20220919191856.png 创建一个目录用来挂载

QQ截图20220919192046.png 使用touch创建7700个文件,查看超出inode值是否可创建

QQ截图20220919192307.png 经过查看挂载表,发现已用容量仅555k,却无法再创建文件

QQ截图20220919192415.png

文件恢复extundelete

  1. 删除一个文件,实际上并不清除inode节点和block的数据,只是在这个文件的父目录里面的block中,删除这个文件的名字。Linux是通过Link的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被删除。 在Linux系统运维工作中,经常会遇到因操作不慎、操作错误等导致文件数据丢失的情况,尤其对于客户企业中一些新手。当然,这里所指的是彻底删除,即已经不能通过"回收站"找回的情况,比如使用"rm -rf"来删除数据。针对Linux下的EXT文件系统,可用的恢复工具有debugfs、 ext3grep、extundelete等。其中extundelete是一个开源的Linux数据恢复工具,支持ext3文件系统。

  2. 使用extundelete工具如何恢复误删除的文件步骤:

  3. 在编译安装extundelete之前需要先安装两个依赖包e2fsprogs-libs和e2fsprogs-devel,这两个包在系统安装光盘的/Package目录下就有,使用rpm或yum命令将其安装。

[root@localhost ~]# yum install e2fsprogs-devel e2fsprogs-libs -y    先安装2个依赖包
[root@localhost ~]# cd /opt                                      把安装文件拖入/opt下
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar jxvf extundelete-0.2.4.tar.bz2                解压缩该文件
[root@localhost extundelete-0.2.4]# ls
acinclude.m4  config.h.in   depcomp     Makefile.am  README
aclocal.m4    configure     install-sh  Makefile.in  src
autogen.sh    configure.ac  LICENSE     missing
[root@localhost extundelete-0.2.4]# ./configure                          编译安装
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make
[root@localhost extundelete-0.2.4]# make install


验证恢复,只对ext3文件有效
[root@localhost ~]# df -Th|tail -n 2                     创建分区并挂载
/dev/sdb1               ext3      9.8G   23M  9.2G   1% /zy1
/dev/sdb2               ext4      9.8G   37M  9.2G   1% /zy2
[root@localhost zy1]# echo a>a             在只zy1和zy2里建立同样的内容,后证txt4确实不支持
[root@localhost zy1]# echo a>b
[root@localhost zy1]# echo a>c
[root@localhost zy1]# echo a>d
[root@localhost zy1]# ls
a  b  c  d  lost+found
[root@localhost zy1]# rm -rf a d                                   模拟删除a和d
[root@localhost ~]# umount /zy1                                     在家目录下解挂
[root@localhost ~]# extundelete /dev/sdb1 --inode 2            查看分区下存在哪些文件
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
a                                                 12             Deleted
b                                                 13
c                                                 14
d                                                 15             Deleted
[root@localhost ~]# extundelete /dev/sdb1 --restore-all                    使用恢复
[root@localhost ~]# ls                    使用ls查看可以看见多了一个RECOVERED_FILES文件夹
[root@localhost RECOVERED_FILES]# ls                 查看文件夹里的文件可以找到已删除的文件
a  d

xfs文件的恢复

xfsdump命令格式

xfsdump-f   //备份存放位置要备份的路径或设备文件

xfsdump备份级别(默认为0)

0:完全备份

1-9:增量备份

xfsdump常用选项

选项含义
-f指定备份文件目录
-L指定标签session label
-M指定设备标签media label
-S备份单个文件,-s后面不能直接跟路径

xfsrestore命令格式

xfsrestore -f    //恢复文件的位置存放恢复后文件的位置

使用xfsdump时,需要注意以下的几个限制:

  1. 不支持没有挂载的文件系统备份,所以只能备份已挂载的;

  2. 必须使用root的权限才能操作;

  3. 只能备份XFS文件系统;

  4. 备份下来的数据只能让xfsrestore解析;

  5. 不能备份两个具有相同UUID的文件系统(可使用blkid查看)

删除文件后空间不释放的处理方法

删除文件后,如果磁盘空间没有释放,是因为文件正在被其他人打开。 其他人退出使用该文件后空间会被释放。

可以使用 w 命令或 lsof 命令查看是否有人在使用该文件。

QQ截图20220919191055.png 如果确定有人打开了该文件,可以使用三种方法释放空间:

 1.echo " "  > f1.txt        //将被打开的文件变成空文件,依赖shell环境
 ​
 2.cat /dev/null > f1.txt    //导入空文件
 ​
 3.lsof | grep f1.txt        //查看被删除的文件和对应PID,之后杀死该进程
    kill -9 PID

日志文件

日志的功能:

  • 用于记录系统、程序运行中发生的各种事件
  • 通过阅读日志,有助于诊断和解决系统故障

日志文件的分类:

  • 内核及系统日志:

    这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置,决定将内核消息及各种系统程序消息记录到什么位置。日志格式基本相似。

  • 用户日志:

    记录用户登录及退出系统的相关信息,包括用户名、登录的终端、登录时间、来源主机、正在使用的进程操作等。

  • 程序日志:

    有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。记录格式不统一。

日志保存位置:

  • 默认位于:/var/log 目录下

主要日志文件介绍:

日志位置描述
内核及公共消息日志/var/log/messages它是核心系统日志文件,其中包含了系统启动时的引导信息,以及系统运行时的其他状态消息。I/O 错误、网络错误和其他系统错误都会记录到此文件中。其他信息,比如某个人的身份切换为 root,以及用户自定义安装软件的日志,也会在这里列出。
计划任务日志/var/log/cron记录与系统定时任务相关的曰志
系统引导日志/var/log/dmesg记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息。
邮件系统日志/var/log/maillog记录邮件信息的曰志
用户登录日志:/var/log/lastlog记录系统中所有用户最后一次的登录时间的曰志。这个文件是二进制文件.不能直接用 vi 查看,而要使用 lastlog 命令查看。
同上/var/log/secure记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录。比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。
同上/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件,不能直接用 vi 查看,而要使用 last 命令查看。
同上/var/tun/ulmp记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样,这个文件不能直接用 vi 查看,而要使用w、who、users等命令查看。
vim /etc/rsyslog.conf       查看rsyslog。conf配置文件

QQ截图20220919231803.png *.info            #表示info等级及以上的所有等级的信息都写到对应的日志文件里 

mail.none          表示某事件的信息不写到日志文件里(这里比如是邮件)

内核及系统日志

由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf。

  • 软件包:rsyslog-8.24.0-12.el7.x86_64 (可使用 ”rpm -q“ 命令查看)
  • 主要程序:/sbin/rsyslogd
  • 配置文件:/etc/rsyslog.conf (可使用 ”rpm -qc“ 命令查看)

日志消息的级别:

级号消息级别说明
0EMERG紧急会导致主机系统不可用的情况
1ALERT警告必须马上采取措施解决的问题
2CRIT严重比较严重的情况
3ERR错误运行出现错误
4WARNING提醒可能会影响系统功能的事件
5NOTICE注意不会影响系统但值得注意
6INFO信息一般信息
7DEBUG调试程序或系统调试信息等

日志记录的一般格式:

  • 事件产生的时间。
  • 产生事件的服务器的主机名。
  • 产生事件的服务名或程序名。
  • 事件的具体信息。

用户日志分析

保存了用户登录、退出系统等相关信息:

  • /var/log/lastlog:最近都用户登录事件。二进制文件,使用 lastlog 命令查看。
  • /var/log/secure:与用户验证有关的安全性事件。
  • /var/log/wtmp:用户登录、注销,及系统开、关机事件。二进制文件,使用 last 命令查看。
  • /var/run/utmp:当前登录的每个用户的详细信息。二进制文件,使用w、who、users等命令查看。

分析工具:

  • users、who、w、last、lastb

users:查询最近三次登录的用户信息。

users 命令只是简单地输出当前登录的用户名称,每个显示的用户名对应一个登录会话。 如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。

[root@localhost ~]# users
root root

who:查看当前登录的用户、终端、登录时间、IP地址。 who命令用于报告当前登录到系统中的每个用户的信息。使用该命令,系统管理员可

以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who 的默认输出包括用

户名、终端类型、登录日期及远程主机。

[root@localhost ~]# who
root     pts/0        2022-09-19 20:51 (192.168.100.199)
root     pts/1        2022-09-19 23:17 (192.168.100.199)

w:查看当前登录的用户、终端、IP地址、登录时间、占用CPU的情况、进程等。

w 命令用于显示当前系统中的每个用户及其所运行的进程信息,比 users、who 命令的 输出内容要丰富一些。

[root@localhost ~]# w
 23:25:58 up  2:07,  2 users,  load average: 0.00, 0.01, 0.04
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.100.199  20:51    2:34m  0.03s  0.03s -bash
root     pts/1    192.168.100.199  23:17    6.00s  0.03s  0.01s w

last: 读取 /var/log/wtmp 文件,显示登录系统的用户信息。

last 命令用于查询成功登录到系统的用户记录,最近的登录情况将显示在最前面。通过 last 命令可以及时掌握 Linux 主机的登录情况,若发现未经授权的用户登录过,则表示当前 主机可能已被入侵。

[root@localhost ~]# last -n 3   //查看最近3次登录信息
root     pts/1        192.168.100.199  Mon Sep 19 23:17   still logged in   
root     pts/0        192.168.100.199  Mon Sep 19 20:51   still logged in   
reboot   system boot  3.10.0-693.el7.x Mon Sep 19 20:50 - 23:26  (02:35)    

wtmp begins Wed Aug 17 16:50:28 2022


[root@localhost ~]#  last -t 20220305200000 |head -5   //查看2022年3月5日20点之前的登录信息

wtmp begins Wed Aug 17 16:50:28 2022

lastb:读取 /var/log/btmp 文件,显示登入系统失败的用户信息。

lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除 了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。

[root@localhost ~]# lastb

btmp begins Mon Sep 19 20:50:49 2022

程序日志分析

由相应的应用程序独立进行管理:

  • Web服务:/var/log/httpd/

    • access_log、error_log
  • 代理服务:/var/log/squid

    • access.log、cache.log
  • FTP服务:/var/log/xferlog

分析工具:

  • 文本查看、grep过滤检索、Webmin管理套件中查看
  • awk、sed等文本过滤、格式化编辑工具
  • Webalizer、Awstats等专用日志分析工具
日志管理策略
  • 及时做好备份和归档

  • 延长日志保存期限

  • 控制日志访问权限

    • 日志中可能会包含各类敏感信息,如账户、口令等。
  • 集中管理日志

    • 将服务器的日志文件发到统一的日志文件服务器
    • 便于日志信息的统一收集、整理和分析
    • 杜绝日志信息的意外丢失、恶意篡改或删除