目录
一、文件系统
1. inode表
2. 查看inode号
3. 文件目录
4. 三种时间戳
5. 删除文件空间不释放
6. 文件恢复extundelete
7. xfs类型备份和恢复
二、日志分析
1. 日志的种类
2. 内核和公共日志
3. 用户日志
3.1 查询当前登录的用户情况
3.2 查询用户登录的历史记录
1. 日志记录的内容包括
2. 系统日志服务工具
3. rsyslog管理
3.1 /etc/rsyslog.conf配置文件格式:由三部分组成
3.2 RULES配置格式*:所有级别
3.3 将ssh服务的日志单独设置
3.4 网络日志(远程日志功能)
4. 日志文件
5. 日志管理工具 journalctl
6. logrotate日志转储自动分割日志
6.1 主配置文件
6.2 程序独立的配置文件
一、文件系统
1. inode表
每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data元信息 )元数据是存放在inode(index node)表中。inode表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
2. 查看inode号
可以使用ls -i、stat命令查看
3. 文件目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系。文件引用一个是 inode号,是通过文件名来引用一个文件,一个目录是目录下的文件名和文件inode号之间的映射。
在Linux中使用文件的过程:
根据文件夹的文件名inode号的关系找到对应的inode表,再根据inode表中的指针找到磁盘上的真实数据。文件存储的最小单位为块8个扇区组成为4k。
4. 三种时间戳
最近访问atime:查看文件的时间
最近更改mtime:最近更改文件内容的时间,注意:更改完内容之后,ctime也会改变
最近改动ctime:最近更改文件元信息的时间,比如改变权限等
5. 删除文件空间不释放
[root@localhost ~]# cp /dev/zero /boot/bigfile #模拟写入大文件
cp: 写入"/boot/bigfile" 出错: 设备上没有空间
cp: 扩展"/boot/bigfile" 失败: 设备上没有空间
[root@localhost opt]#lsof | grep deleted
#列出当前系统已打开文件,但是deleted的状态,找到对应的进程kill掉
[root@localhost opt]#echo " " > /boot/bigfile #重新写入空格至文件中
6. 文件恢复extundelete
删除一个文件,实际上并不清除inode节点和 block的数据,只是在这个文件的父目录里面的block 中,删除这个文件的名字。Linux是通过Link(硬链接)的数量来控制文件删除的,只有当一个文件不存在任何Link的时候,这个文件才会被删除。注意extundelete是一个开源的Linux数据恢复工具,支持ext3文件系统。
[root@localhost ~]#yum -y install e2fsprogs-devel e2fsprogs-libs
#安装依赖软件
[root@localhost ~]# tar -jxvf extundelete-0.2.4.tar.bz2 -C /opt
#解压软件
[root@localhost ~]# cd /opt/extundelete-0.2.4
#切换到目录下
[root@localhost ~]# yum -y install gcc gcc-c++ pcre-devel openssl-devel zlib-devel openss1 openss1-deve1
#安装编译工具
[root@localhost extundelete-0.2.4]# ./configure
#编译安装
[root@localhost extundelete-0.2.4]#make #翻译
[root@localhost extundelete-0.2.4]#make install #复制
Making install in src
/usr/bin/install -c extundelete '/usr/local/bin'
[root@localhost extundelete-0.2.4]# cd /usr/local/bin
[root@localhost bin]# ls
extundelete
[root@localhost ~]# mkfs.ext3 /dev/sdb1 #格式化写入ext3类型,新增磁盘过程略
[root@localhost ~]# mkdir /test/
[root@localhost ~]# mount /dev/sdb1 /test/
[root@localhost ~]# cd /test/
[root@localhost test]# echo 123 > a;echo 456 > b
[root@localhost test]# ls
a b lost+found
[root@localhost test]# rm -rf a b #模拟删除
[root@localhost test]# ls
lost+found
[root@localhost test]# cd
[root@localhost ~]# umount /test/ #解挂载
[root@localhost ~]#extundelete /dev/sdb1 --inode 2
# 命令 查看的分区 从2节点开始
#查看该分区下的存在哪些文件,其中--inode 2代表从i节点为2的文件开始查看,一般文件系统格式化挂
载之后,i节点是从2开始的,2代表该文件系统最开始的目录。
[root@localhost ~]# extundelete /dev/sdb1 --restore-all
# 命令 需要恢复的分区设备 恢复选项,全都要
#使用恢复
[root@localhost ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg 公共 视频 文档 音乐
extundelete-0.2.4.tar.bz2 RECOVERED_FILES 模板 图片 下载 桌面
[root@localhost ~]# cd RECOVERED_FILES/
[root@localhost RECOVERED_FILES]# ls
a b
[root@localhost RECOVERED_FILES]# cat a;cat b
123
456
7. xfs类型备份和恢复
CentOS 7 系统默认采用 xfs 类型的文件。针对 xfs 文件系统目前也没有比较成熟的文件恢复工具,所以建议提前做好数据b,以避免数据丢失。 xfs类型的文件可使用xfsdump与xfsrestore工具进行备份恢复。
常用的备份参数包括以下几种:
- -f:指定备份文件目录
- -L:指定标签 session label
- -M:指定设备标签 media label
- -s:备份单个文件,-s 后面不能直接跟路径
使用 xfsdump 时,需要注意以下的几个限制:
- 不支持没有挂载的文件系统备份,所以只能备份已挂载的;
- 必须使用 root 的权限才能操作;
- 只能备份 XFS 文件系统;
- 备份下来的数据只能让 xfsrestore 解析;
- 不能备份两个具有相同 UUID 的文件系统(可使用blkid查看)。
二、日志分析
1. 日志的种类
日志文件位置 | 日志文件说明 |
---|---|
/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等命令查看 |
2. 内核和公共日志
日志的配置文件位置在/etc/rsyslog.conf
3. 用户日志
在wtmp、btmp、lastlog等日志文件中,保存了系统用户登录、退出等相关的事件消息。
wtmp:哪些用户正常登录到系统中,使用last命令可以查看
btmp:查看用户登录失败的信息,用lastab命令查看
lastlog:记录用户最后一次登录的信息,用lastlog查看
3.1 查询当前登录的用户情况
users 命令只是简单地输出当前登录的用户名称
[root@localhost ~]# users
root
who命令用于报告当前登录到系统中的每个用户的信息
[root@localhost ~]# who
root pts/0 2024-01-08 11:36 (192.168.190.1)
w命令用于显示当前系统中的每个用户及其所运行的进程信息
[root@localhost ~]# w
15:52:55 up 4:25, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.190.1 11:36 7.00s 0.44s 0.04s w
3.2 查询用户登录的历史记录
last命令用于查询成功登录到系统的用户记录
[root@localhost ~]# last
root pts/0 192.168.190.1 Mon Jan 8 11:36 still logged in
reboot system boot 3.10.0-693.el7.x Mon Jan 8 11:27 - 15:29 (04:01)
root pts/1 192.168.190.1 Mon Jan 8 11:07 - down (00:13)
root pts/0 :0 Sun Jan 7 02:28 - 11:21 (1+08:52)
……
lastb 命令用于查询登录失败的用户记录,如登录的用户名错误、密码不正确等情况都将记录在案。登录失败的情况属于安全事件,因为这表示可能有人在尝试猜解你的密码。除了使用 lastb 命令查看以外,也可以直接从安全日志文件/var/log/secure 中获得相关信息。
[root@localhost ~]# lastb
btmp begins Mon Jan 8 11:27:43 2024
三、日志管理
1. 日志记录的内容包括
-
历史事件:时间,地点,人物,事件
-
日志级别:事件的关键性程度,Loglevel error notice info debug
2. 系统日志服务工具
sysklogd系统日志服务:CentOS 5 之前版本采用的日志管理系统服务
rsyslog 系统日志服务:syslog是CentOS 6以后版本的系统管理服务:它提供了高性能,出色的安全性和模块化设计
ELK:由Elasticsearch, Logstash, Kibana三个软件组成
3. rsyslog管理
3.1 /etc/rsyslog.conf配置文件格式:由三部分组成
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置
3.2 RULES配置格式*:所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理
3.3 将ssh服务的日志单独设置
通过rsyslog软件将sshd程序的日志,独立出来sshd软件的日志放在/var/log/secure日志中,很多其他软件放在一起,这个软件比较重要,所以要把sshd软件的日志单独存放。
① 修改rsyslog软件的配置文件
② 修改sshd
③ 重启服务
[root@localhost ~]# vim /etc/ssh/sshd_config
[root@localhost ~]# vim /etc/rsyslog.conf
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl restart rsyslog.service sshd #重启服务
[root@localhost ~]# tail -f /var/log/ssh.log
Jan 8 17:03:17 localhost sshd[2385]: Server listening on 0.0.0.0 port 22.
Jan 8 17:03:17 localhost sshd[2385]: Server listening on :: port 22.
Jan 8 17:08:35 localhost sshd[2435]: Accepted password for fql from 192.168.190.1 port 7692 ssh2
#验证
3.4 网络日志(远程日志功能)
日志接收端
[root@localhost ~]# vim /etc/rsyslog.conf
[root@localhost ~]# cd /var/log/
[root@localhost ~]# tail -f messages
日志发送端
[root@localhost ~]# vim /etc/rsyslog.conf
发送端
[root@localhost ~]# logger "this is test log from 192.168.91.101" #测试,写日志进去
接收端
[root@localhost log]# tail -1 messages
Jan 8 17:48:03 localhost root: this is test log from 192.168.91.101
4. 日志文件
- /var/log/secure:系统安全日志,文本格式,应周期性分析
- /var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
- /var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
- /var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
- /var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化将不再记录专用命令dmesg查看,可持续记录硬件变化的情况
- /var/log/boot.log 系统服务启动的相关信息,文本格式
- /var/log/messages :系统中大部分的信息
- /var/log/anaconda : anaconda的日志操作系统安装时安装的软件信息
[root@localhost ~]# lastlog #最后一次登录
5. 日志管理工具 journalctl
CentOS 7以后版本,利用Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
模拟程序服务无法启动查看日志:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf #修改配置文件
[root@localhost ~]# systemctl restart httpd.service
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
[root@localhost ~]# journalctl -xe
#显示最新的系统日志信息, 并尝试解释错误信息
6. logrotate日志转储自动分割日志
logrotate程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过cron程序来执行。
相关文件
- 计划任务:/etc/cron.daily/logrotate
- 程序文件:/usr/sbin/logrotate
- 配置文件: /etc/logrotate.conf
- 日志文件:/var/lib/logrotate/logrotate.status
6.1 主配置文件
[root@localhost ~]# vim /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
#一周生成一个新的日志文件
# keep 4 weeks worth of backlogs
rotate 4
#只保留最近的4个文件
# use date as a suffix of the rotated file
dateext
# 添加一个日期后缀
6.2 程序独立的配置文件
[root@localhost ~]# cd /etc/logrotate.d/
[root@localhost logrotate.d]# cat httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript #重新加载配置文件,即重新生成日志文件
}
[root@localhost logrotate.d]# cd /var/log/httpd/
[root@localhost httpd]# ls
access_log error_log
[root@localhost httpd]# mv access_log access_log_2024_1_8
[root@localhost httpd]# ls
access_log_2024_1_8 error_log
[root@localhost httpd]# systemctl restart httpd
[root@localhost httpd]# ls
access_log access_log_2024_1_8 error_log