wazuh

wazuh使用

wazuh官网

前身OSSEC

OSSEC - World's Most Widely Used Host Intrusion Detection System - HIDS

现在已经开源

https://wazuh.com

Wazuh · GitHub

wazuh安装

按照官网elk安装

官方给出了两种安装方式,这里我用的是第一种(ALL-in-one deployment)整体安装 另一种是Distributed deployment (分布式安装)

首先安装必要的包

yum install zip unzip curl

安装Elasticsearch

导入GPC密码
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
添加存储库
cat > /etc/yum.repos.d/elastic.repo << EOF [elasticsearch-7.x] name=Elasticsearch repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF

Elasticsearch安装和配置

安装Elasticsearch包
yum install elasticsearch-7.17.9
下载配置文件

/etc/elasticsearch/elasticsearch.yml如下:

curl -so /etc/elasticsearch/elasticsearch.yml https://packages.wazuh.com/4.5/tpl/elastic-basic/elasticsearch_all_in_one.yml

证书创建和部署

下载用于创建证书的配置文件:

curl -so /usr/share/elasticsearch/instances.yml https://packages.wazuh.com/4.5/tpl/elastic-basic/instances_aio.yml

在以下步骤中,将创建一个文件,其中包含以此处定义的实例命名的文件夹。该文件夹将包含使用 SSL 与 Elasticsearch 节点通信所需的证书和密钥。

可以使用elasticsearch-certutil工具创建证书:

/usr/share/elasticsearch/bin/elasticsearch-certutil cert ca --pem --in instances.yml --keep-ca-key --out ~/certs.zip

提取/usr/share/elasticsearch/certs.zip上一步生成的文件。

unzip ~/certs.zip -d ~/certs

下一步是创建目录/etc/elasticsearch/certs,然后将 CA 文件、证书和密钥复制到其中:

mkdir /etc/elasticsearch/certs/ca -p cp -R ~/certs/ca/ ~/certs/elasticsearch/* /etc/elasticsearch/certs/ chown -R elasticsearch: /etc/elasticsearch/certs chmod -R 500 /etc/elasticsearch/certs chmod 400 /etc/elasticsearch/certs/ca/ca.* /etc/elasticsearch/certs/elasticsearch.* rm -rf ~/certs/ ~/certs.zip

启用并启动 Elasticsearch 服务:

systemctl daemon-reload systemctl enable elasticsearch systemctl start elasticsearch

为所有 Elastic Stack 预构建角色和用户生成凭证:

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

上面的命令将提示这样的输出。保存用户的密码elastic以进行进一步的步骤:

Output

Changed password for user apm_system
PASSWORD apm_system = lLPZhZkB6oUOzzCrkLSF
​
Changed password for user kibana_system
PASSWORD kibana_system = TaLqVOnSoqKTYLIU0vDn
​
Changed password for user kibana
PASSWORD kibana = TaLqVOvXoqKTYLIU0vDn
​
Changed password for user logstash_system
PASSWORD logstash_system = UtuDv2tWkXGYL83v9kWA
​
Changed password for user beats_system
PASSWORD beats_system = qZcbvCslafMpoEOrE9Ob
​
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = LzJpQiSylncmCU2GLBTS
​
Changed password for user elastic
PASSWORD elastic = AN4UeQGA7HGl5iHpMla7

要检查安装是否成功,请运行以下命令,替换<elastic_password>上一步中为用户生成的密码elastic

curl -XGET https://localhost:9200 -u elastic:<elastic_password> -k

该命令应该有如下输出:

Output

{
  "name" : "elasticsearch",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "CFw_rkxnR7avI7pBv9MvtQ",
  "version" : {
    "number" : "7.17.9",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "ef48222227ee6b9e70e502f0f0daa52435ee634d",
    "build_date" : "2023-01-31T05:34:43.305517834Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

安装wazuh服务器

Wazuh 服务器收集并分析来自已部署代理的数据。它运行 Wazuh 管理器、Wazuh API 和 Filebeat。设置 Wazuh 的第一步是将 Wazuh 存储库添加到服务器。或者,可以直接下载 Wazuh 管理器包,并可以在此处检查兼容版本。

添加 Wazuh 存储库
  1. 导入 GPG 密钥:

    
    # rpm --import https://packages.wazuh.com/key/GPG-KEY-WAZUH
  2. 添加存储库:

    # cat > /etc/yum.repos.d/wazuh.repo << EOF
    [wazuh]
    gpgcheck=1
    gpgkey=https://packages.wazuh.com/key/GPG-KEY-WAZUH
    enabled=1
    name=EL-\$releasever - Wazuh
    baseurl=https://packages.wazuh.com/4.x/yum/
    protect=1
    EOF

3.运行以下命令检查 Wazuh 管理器是否处于活动状态:

系统系统V初始化

# systemctl status wazuh-manager

安装Filebeat

Filebeat 是 Wazuh 服务器上的工具,可将警报和存档事件安全地转发到 Elasticsearch。

Filebeat安装和配置

安装 Filebeat 包:
  1. 百胜易于

    # yum install filebeat-7.17.9
  2. 下载用于将 Wazuh 警报转发到 Elasticsearch 的预配置 Filebeat 配置文件:

    # curl -so /etc/filebeat/filebeat.yml https://packages.wazuh.com/4.5/tpl/elastic-basic/filebeat_all_in_one.yml
  3. 下载 Elasticsearch 的警报模板:

    # curl -so /etc/filebeat/wazuh-template.json https://raw.githubusercontent.com/wazuh/wazuh/4.5/extensions/elasticsearch/7.x/wazuh-template.json
    # chmod go+r /etc/filebeat/wazuh-template.json
  4. 下载 Filebeat 的 Wazuh 模块:

    # curl -s https://packages.wazuh.com/4.x/filebeat/wazuh-filebeat-0.2.tar.gz | tar -xvz -C /usr/share/filebeat/module

  5. 编辑该文件/etc/filebeat/filebeat.yml并添加以下行:

    
    output.elasticsearch.password: <elasticsearch_password>

    替换elasticsearch_password为之前为用户生成的密码elastic

  6. 将证书复制到/etc/filebeat/certs/

    # cp -r /etc/elasticsearch/certs/ca/ /etc/filebeat/certs/
    # cp /etc/elasticsearch/certs/elasticsearch.crt /etc/filebeat/certs/filebeat.crt
    # cp /etc/elasticsearch/certs/elasticsearch.key /etc/filebeat/certs/filebeat.key
  7. 启用并启动Filebeat服务:

    系统系统V初始化

    # systemctl daemon-reload
    # systemctl enable filebeat
    # systemctl start filebeat

为确保Filebeat已成功安装,请运行以下命令:

# filebeat test output

该命令应该有如下输出:

Output

elasticsearch: https://127.0.0.1:9200...
  parse url... OK
  connection...
    parse host... OK
    dns lookup... OK
    addresses: 127.0.0.1
    dial up... OK
  TLS...
    security: server's certificate chain verification is enabled
    handshake... OK
    TLS version: TLSv1.3
    dial up... OK
  talk to server... OK
  version: 7.17.9
Kibana安装和配置

Kibana 是一个灵活直观的 Web 界面,用于挖掘和可视化存储在 Elasticsearch 中的事件和档案。

  1. 安装 Kibana 包:

    百胜易于

    # yum install kibana-7.17.9
  2. 将 Elasticsearch 证书复制到 Kibana 配置文件夹中:

    # mkdir /etc/kibana/certs/ca -p
    # cp -R /etc/elasticsearch/certs/ca/ /etc/kibana/certs/
    # cp /etc/elasticsearch/certs/elasticsearch.key /etc/kibana/certs/kibana.key
    # cp /etc/elasticsearch/certs/elasticsearch.crt /etc/kibana/certs/kibana.crt
    # chown -R kibana:kibana /etc/kibana/
    # chmod -R 500 /etc/kibana/certs
    # chmod 440 /etc/kibana/certs/ca/ca.* /etc/kibana/certs/kibana.*
  3. 下载 Kibana 配置文件:

  4. 
    # curl -so /etc/kibana/kibana.yml https://packages.wazuh.com/4.5/tpl/elastic-basic/kibana_all_in_one.yml
    编辑/etc/kibana/kibana.yml文件:
    
    
    
    elasticsearch.password: <elasticsearch_password>
    要替换的值:
    
    <elasticsearch_password>:Elasticsearch安装和配置过程中为用户生成的密码elastic。

    创建/usr/share/kibana/data目录:

    # mkdir /usr/share/kibana/data
    # chown -R kibana:kibana /usr/share/kibana
  5. 安装 Wazuh Kibana 插件。插件的安装必须从 Kibana 主目录完成,如下所示:

    # cd /usr/share/kibana
    # sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/4.x/ui/kibana/wazuh_kibana-4.5.0_7.17.9-1.zip
  6. 将 Kibana 的套接字链接到特权端口 443:

    
    # setcap 'cap_net_bind_service=+ep' /usr/share/kibana/node/bin/node
  7. 启用并启动 Kibana 服务:

    系统系统V初始化

    # systemctl daemon-reload
    # systemctl enable kibana
    # systemctl start kibana
  8. 使用Elasticsearch安装过程中生成的密码访问Web界面:

URL: https://<wazuh_server_ip>
user: elastic
password: <PASSWORD_elastic>

首次访问 Kibana 时,浏览器会显示一条警告消息,指出证书不是由受信任的机构颁发的。可以在 Web 浏览器的高级选项中添加例外,或者为了提高安全性,ca.crt可以将先前生成的文件导入到浏览器的证书管理器中。或者,可以配置来自受信任机构的证书。

禁用存储库

本安装指南介绍了如何通过首先配置其存储库来安装和配置 Wazuh 和 Elastic Stack。

对于 Wazuh 或 Elastic Stack 的每个新版本,Wazuh 的开发团队都会彻底测试每个组件的兼容性,并在发布新的 Wazuh Kibana 插件之前进行必要的调整。

我们建议禁用存储库,以免无意中更新各个软件包,这可能会导致 Elastic Stack 版本尚未发布 Wazuh 集成。

百胜易于

# sed -i "s/^enabled=1/enabled=0/" /etc/yum.repos.d/wazuh.repo
# sed -i "s/^enabled=1/enabled=0/" /etc/yum.repos.d/elastic.repo

要卸载多合一安装的所有组件,请访问卸载部分

wazuh简介

Wazuh 是一个免费、开源和企业级的安全监控解决方案,用于威胁检测、完整性监控、事件响应和合规性。

Wazuh由部署到受监视系统的端点安全代理和管理服务器组成,管理服务器收集和分析代理收集的数据。此外,Wazuh已与Elastic Stack完全集成,提供了搜索引擎和数据可视化工具,使用户可以浏览其安全警报。

Wazuh提供的功能包括日志数据分析,入侵和恶意软件检测,文件完整性监视,配置评估,漏洞检测以及对法规遵从性的支持。

Wazuh平台的组件和体系结构

Wazuh平台主要包括三个主要组件,分别是Wazuh代理,Wazuh服务器和Elastic Stack。

  • Wazuh代理:它安装在端点上,例如笔记本电脑,台式机,服务器,云实例或虚拟机。它提供了预防,检测和响应功能。它确实支持Windows,Linux,macOS,HP-UX,Solaris和AIX平台。

  • Wazuh服务器:它分析从代理收到的数据,通过解码器和规则对其进行处理,并使用威胁情报来查找众所周知的危害指标(IOC)。一台服务器可以分析来自成百上千个代理的数据,并在设置为集群时水平扩展。该服务器还用于管理代理,在必要时进行远程配置和升级。

  • Elastic Stack:它索引和存储Wazuh服务器生成的警报。此外,Wazuh和Kibana之间的集成为数据的可视化和分析提供了强大的用户界面。该界面还可用于管理Wazuh配置并监视其状态。

    img

Wazuh架构图如下

1、整体的架构图

img

2、Agent端的组件架构

img

3、Server端的架构

img

初识wazuh

体验

首先在我们第一次进入搭建好wazuh时,小tips:wazuh官网上放有虚拟机(OVA)文件,下载即可在VM

warestation里面打开,进去之后只需要调一下网络模式,在查看ip之后,我们即可在windows中启动输入http://+自己的wazuh服务器ip即可启动啦 进去之后账号密码都是admin admin

这样我们就算是进入到wazuh的仪表盘啦

但是在linux中,我们该如何昵

Linux中我们的wazuh在/var/ossec/下

这个便是我们wazuh的另一幅面孔

其中active-response 这个是当我们检测到攻击时的扫描脚本,里面放的都是一些脚本文件

 

agentless: 无代理安装,建议不改

etc :配置 ossec.conf的核心配置文件

ruleset:自带规则库,建议不改

log: 日志,预警的核心

其中以下两个日志记录了何时,触发了哪些规则

/var/ossec/logs/aterts/alererts.json : json格式的预警信息,用于分析展示,这个是给计算机看的

/var/ossec/logs/aterts/alerts.log : 这个是给我们的技术人员看的,可以直接查看

我们wazuh里面的规则是是一个很重要的点,理所应当的这个文件肯定在重要的目录下,想必聪慧的读者已经猜到了,这个就在我们/var/ossca/ruleset/rules文件下了

带大家来看看

面对这么多的文件,我们要找一个自己需要的是很不容易的,这便要找我们find命令寻求帮助了

find .-type f -name "*.xml" -print0 | xargs -0 grep -r -i "5557"

然后进入到0085

vim 0085-pam_rules.xml

找到我们需要的rules 5557

<if_sid>5556<if_Sid>告诉我们5557的父类规则是5556于是我们回到5556

清晰的看到它的解码器<decoded_as>unix_chkpwd</decoded_as>

于是乎我们去找它的解码器

cd /var/ossec/ruleset/decoders/

看着这么多的解码器是不是头都大了

这时候grep闪亮登场啦

grep -r -i "unix_chkpwd"

然后直接去0350就是显而易见的啦

vim 0350=unix_decoders.xml

个人理解

在wuzuh中解码器是我们用来抓取关键信息的,其中核心便是正则表达式

当数据来了之后,wazuh先会去分析我们的日志,把这些日志信息发到相应的解码器去,通过解码器去进行解码,解码完之后,再发送到相应的规则,然后把解码完的数据通过规则,再次进行匹配,最终展示到仪表盘的Modules里的Security events里

所有的安全工具都是这样的流程

wazuh配置文件

我们的配置文件在

vim /var/ossec/etc/ossec.conf

其中<jsonout_output>yes</jsonout_output> wazuh问问我们日志是否以json形式输出

<alerts_log>yes 需要以log形式输出吗

需要输出所有的日志吗?

后续你需要连接email吗?这是什么意思昵,就是说当你的告警信息到达一定阶段以后要我给你发邮件通知吗?

三级以上进行告警 ,十二级以上进行邮件通知

1514??

1514就是说代理客户端跟服务器连接的端口

rootcheck检测root目录

files检测文件的增删改查

检测所有的端口,盘幅,if是网卡

这一步把所有的东西都检测到了

检测的频率是12个小时检测一次,实战建议五分钟

检测rootkit后门

基线检查,图示包含mysql,apache,linux,windows检查

Linux后门重点是rootkit_files.txt和rootkit_trojans.txt

一个是各种后门蠕虫检查

一个是对Linux中命令是否被替换检查和hosts劫持检查

这些是基线检查

检查所有的基线设置,密码长度,密码过时时间等

针对不同的系统

这些是对文件的监控,也是12小时一次

可以自己填写

这些是白名单

主动相应

日志路径

使用wazuh

代理

wazuh服务器去代理客户端,做客户端的安全防护

这里我选择再起一台虚拟机

192.168.164.9

我的wazuh服务器ip是192.168.164.138

进入wazuh仪表盘,点击agents

输入它所要求的配置

然后再客户端输入wazuh给你的指令,即可实现代理

进入仪表盘可以看到,我亲爱的wazuh已经给node'1做来一次基线检查

注意事项

注意填的是wazuh-server的IP地址,而非client

然后复制它提供给你的命令到client去执行

防御
LD_PRELOAD

又是这个熟悉的家伙,劫持linux动态链接库

wazuh选择让客户端安装了一个叫做auditd.service的工具

可以看出来它已经在运行了

然后给它加入一个规则

echo " -w /etc/ld.so.preload -p wa -k possoble_preload_hijack" >> /etc/audit/rules.d/audit.rules

监控ld.so.preload的写入或者追加,一旦这个文件被写入追加便会报警possoble_preload_hijack

auditctl -R /etc/audit/rules.d/audit.rules

重启

auditctl -l

在客户端的/var/ossec/etc/ossec.conf文件中加入如下配置

<ossec_config>

<!-- Command monitoring (command executes every 180 seconds) -->

<localfile>

<log_format>command</log_format>

<command>printenv LD_PRELOAD</command>

<alias>check for LD_PRELOAD envar</alias>

<frequency>180</frequency>

</localfile>

</ossec_config>

本质是检测环境变量

重启客户端

systemctl restart wazuh-agent

回到服务端

重新写rules(注意去用户自定义模块写)

vim/var/ossec/etc/rules/comm_persist_tech_rules.xml

加入

<group name="common_persistence_techniques,">

<rule id="100125" level="10">

<if_sid>80700</if_sid>

<field name="audit.key">possible_preload_hijack</field>

<description>[Config file "ld.so.preload" has been added, modified, or deleted]: Possible dynamic linker hijacking</description>

<mitre>

<id>T1574.006</id>

</mitre>

</rule>

<rule id="100126" level="10">

<if_sid>530</if_sid>

<match>'check for LD_PRELOAD envar'</match>

<description>[LD_PRELOAD envar has been set]: Possible dynamic linker hijacking</description>

<mitre>

<id>T1574.006</id>

</mitre>

</rule>

</group>

当从受监控端点添加、修改或删除文件100125时,将触发规则 ID 。/etc/ld.so.preload

当环境变量设置为预加载用户定义的共享库100126时,会触发规则 ID 。LD_PRELOAD

重新启动 Wazuh 管理器以应用配置更改:

$ sudo systemctl restart wazuh-manager

触发规则时,Wazuh 仪表板上会生成以下警报

sql注入
Ubuntu端点

执行以下步骤安装 Apache 并配置 Wazuh 代理以监视 Apache 日志。

更新本地软件包并安装 Apache Web 服务器:

$ sudo apt update
$ sudo apt install apache2

如果防火墙已启用,请将其修改为允许外部访问 Web 端口。如果防火墙已禁用,请跳过此步骤。

$ sudo ufw app list
$ sudo ufw allow 'Apache'
$ sudo ufw status

检查 Apache 服务的状态以验证 Web 服务器是否正在运行:

$ sudo systemctl status apache2使用`curl`命令或`http://<UBUNTU_IP>`在浏览器中打开查看Apache登陆页面并验证安装:

$ curl http://<UBUNTU_IP>

将以下行添加到 Wazuh 代理/var/ossec/etc/ossec.conf文件中。这允许 Wazuh 代理监控 Apache 服务器的访问日志:

<ossec_config>
  <localfile>
    <log_format>apache</log_format>
    <location>/var/log/apache2/access.log</location>
  </localfile>
</ossec_config>

重新启动 Wazuh 代理以应用配置更改:

$ sudo systemctl restart wazuh-agent
攻击模拟

替换<UBUNTU_IP>为适当的 IP 地址并从攻击者端点执行以下命令:

$ curl -XGET "http://<UBUNTU_IP>/users/?id=SELECT+*+FROM+users";

这里的预期结果是规则 ID 31103 的警报,但成功的 SQL 注入尝试会生成规则 ID 31106 的警报。

可视化警报

您可以在 Wazuh 仪表板中可视化警报数据。为此,请转到安全事件模块并在搜索栏中添加过滤器以查询警报。

  • rule.id:31103

    img

  • rule.id:31106

    img

余下待完善

补充

ELK安装

ELK 简介

对于日志来说,最常见的需求就是收集、存储、查询、展示,
开源社区正好有相对应的开源项目:Logstash(收集)、Elasticsearch(存储 + 搜索)、Kibana(展示),
我们将这三个组合起来的技术称之为 ELKStack,
所以说 ELKStack 指的是 Elasticsearch、Logstash、Kibana 技术栈的结合。

Elastic Stack 的快速安装最新文档请参考官网的安装文档Installing the Elastic Stack,总结得比较完整。

安装 Elasticsearch

Elasticsearch 首先需要 Java 环境,所以需要提前安装好 JDK,可以直接使用 yum 安装。
也可以从 Oracle 官网下载 JDK 进行安装。开始之前要确保 JDK 正常安装并且环境变量也配置正确。
# 0. 安装 JDK
​

[root@linux-node1 ~]# yum install java
[root@linux-node1 ~]# java -version
openjdk version "1.8.0_101"
OpenJDK Runtime Environment (build 1.8.0_101-b13)
OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)
​
# 1. 下载安装 GPG Key


rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
​
# 2. 配置 yum 仓库

vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
​
# 3. 安装
​
yum install elasticsearch -y

安装 Logstash

和 Elasticsearch 一样,在开始部署 Logstash 之前也需要你的环境中正确的安装的 JDK。

# 0. 安装 JDK
​

[root@linux-node1 ~]# yum install java
[root@linux-node1 ~]# java -version
openjdk version "1.8.0_101"
OpenJDK Runtime Environment (build 1.8.0_101-b13)
OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)
​
# 1. 下载安装 GPG Key
​

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
​
# 2. 配置 yum 仓库
vim /etc/yum.repos.d/logstash.repo
[logstash-2.3]
name=Logstash repository for 2.3.x packages
baseurl=https://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
​
# 3. 安装
​

yum install logstash -y

安装 Kibana

Kibana 是为 Elasticsearch 设计的开源分析和可视化平台。 你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。 你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。

# 1. 下载安装 GPG Key
​

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
​
# 2. 配置 yum 仓库
​

vim /etc/yum.repos.d/kibana.repo
[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
​
# 3. 安装
​
yum install kibana -y

小技巧:yum install *.rpm 会验证依赖。 当 yum 下载安装软件包比较慢时,可以用其他快速下载工具下载对应的软件包,然后再安装。

使用 Cobbler 创建 ELKStack 仓库

生产环境一般不能使用外网的 YUM 仓库,可以使用 Cobbler 来创建自己的 yum 仓库。

[root@linux-node1 ~]# cobbler repo add --name=elasticsearch-2.x --mirror=https://packages.elastic.co/elasticsearch/2.x/centos --arch=x86_64 --breed=yum
[root@linux-node1 ~]# cobbler repo add --name=logstash-2.3 --mirror=https://packages.elastic.co/logstash/2.3/centos --arch=x86_64 --breed=yum
[root@linux-node1 ~]# cobbler repo add --name=kibana-4.5 --mirror=http://packages.elastic.co/kibana/4.5/centos --arch=x86_64 --breed=yum
[root@linux-node1 ~]# cobbler reposync

es

前言

es 就像是个黑盒,如果你不了解其中的内部原理,你还能干啥?你唯一能干的就是用 es 的 api去做最基本的读写数据了。要是出点什么问题,你啥都不知道,那还能指望你做什么呢?

所以为了能更深入的去了解es内部构造及解决使用过程中出现的问题,知道es最底层的工作原理就显得尤为重要了,那么接下来我将展开说说其底层的工作原理是怎样的。

es 写数据过程

  • 客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node (协调节点)。

  • coordinating node 对 document 进行路由,将请求转发给对应的 node(有 primary shard)。

  • 实际的 node 上的 primary shard 处理请求,然后将数据同步到 replica node

  • coordinating node 如果发现 primary node 和所有 replica node 都搞定之后,就返回响应结果给客户端。

es 读数据过程

可以通过 doc id 来查询,会根据 doc id 进行 hash,判断出来当时把 doc id 分配到了哪个 shard 上面去,从那个 shard 去查询。

  • 客户端发送请求到任意一个 node,成为 coordinate node

  • coordinate nodedoc id 进行哈希路由,将请求转发到对应的 node,此时会使用 round-robin 随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡。

  • 接收请求的 node 返回 document 给 coordinate node

  • coordinate node 返回 document 给客户端。

es 搜索数据过程

es 最强大的是做全文检索,就是比如你有三条数据:

复制代码java真好玩儿啊
java好难学啊
j2ee特别牛

你根据 java 关键词来搜索,将包含 javadocument 给搜索出来。es 就会给你返回:java 真好玩儿啊,java 好难学啊。

  • 客户端发送请求到一个 coordinate node

  • 协调节点将搜索请求转发到所有的 shard 对应的 primary shardreplica shard ,都可以。

  • query phase:每个 shard 将自己的搜索结果(其实就是一些 doc id )返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。

  • fetch phase:接着由协调节点根据 doc id 去各个节点上拉取实际document 数据,最终返回给客户端。

写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。

写数据底层原理

先写入内存 buffer,在 buffer 里的时候数据是搜索不到的;同时将数据写入 translog 日志文件。

如果 buffer 快满了,或者到一定时间,就会将内存 buffer 数据 refresh 到一个新的 segment file 中,但是此时数据不是直接进入 segment file 磁盘文件,而是先进入 os cache 。这个过程就是 refresh

每隔 1 秒钟,es 将 buffer 中的数据写入一个新的 segment file ,每秒钟会产生一个新的磁盘文件 segment file ,这个 segment file 中就存储最近 1 秒内 buffer 中写入的数据。

但是如果 buffer 里面此时没有数据,那当然不会执行 refresh 操作,如果 buffer 里面有数据,默认 1 秒钟执行一次 refresh 操作,刷入一个新的 segment file 中。

操作系统里面,磁盘文件其实都有一个东西,叫做 os cache ,即操作系统缓存,就是说数据写入磁盘文件之前,会先进入 os cache ,先进入操作系统级别的一个内存缓存中去。只要 buffer 中的数据被 refresh 操作刷入 os cache 中,这个数据就可以被搜索到了。

为什么叫 es 是准实时的? NRT ,全称 near real-time 。默认是每隔 1 秒 refresh 一次的,所以 es 是准实时的,因为写入的数据 1 秒之后才能被看到。可以通过 es 的 restful api 或者 java api手动执行一次 refresh 操作,就是手动将 buffer 中的数据刷入 os cache 中,让数据立马就可以被搜索到。只要数据被输入 os cache 中,buffer 就会被清空了,因为不需要保留 buffer 了,数据在 translog 里面已经持久化到磁盘去一份了。

重复上面的步骤,新的数据不断进入 buffer 和 translog,不断将 buffer 数据写入一个又一个新的 segment file 中去,每次 refresh 完 buffer 清空,translog 保留。随着这个过程推进,translog 会变得越来越大。当 translog 达到一定长度的时候,就会触发 commit 操作。

commit 操作发生第一步,就是将 buffer 中现有数据 refreshos cache 中去,清空 buffer。然后,将一个 commit point 写入磁盘文件,里面标识着这个 commit point 对应的所有 segment file ,同时强行将 os cache 中目前所有的数据都 fsync 到磁盘文件中去。最后清空 现有 translog 日志文件,重启一个 translog,此时 commit 操作完成。

这个 commit 操作叫做 flush 。默认 30 分钟自动执行一次 flush ,但如果 translog 过大,也会触发 flush 。flush 操作就对应着 commit 的全过程,我们可以通过 es api,手动执行 flush 操作,手动将 os cache 中的数据 fsync 强刷到磁盘上去。

translog 日志文件的作用是什么?你执行 commit 操作之前,数据要么是停留在 buffer 中,要么是停留在 os cache 中,无论是 buffer 还是 os cache 都是内存,一旦这台机器死了,内存中的数据就全丢了。所以需要将数据对应的操作写入一个专门的日志文件 translog 中,一旦此时机器宕机,再次重启的时候,es 会自动读取 translog 日志文件中的数据,恢复到内存 buffer 和 os cache 中去。

translog 其实也是先写入 os cache 的,默认每隔 5 秒刷一次到磁盘中去,所以默认情况下,可能有 5 秒的数据会仅仅停留在 buffer 或者 translog 文件的 os cache 中,如果此时机器挂了,会丢失 5 秒钟的数据。但是这样性能比较好,最多丢 5 秒的数据。也可以将 translog 设置成每次写操作必须是直接 fsync 到磁盘,但是性能会差很多。

  • index.translog.sync_interval 控制 translog 多久 fsync 到磁盘,最小为 100ms;

  • index.translog.durability translog 是每 5 秒钟刷新一次还是每次请求都 fsync,这个参数有 2 个取值:request(每次请求都执行 fsync,es 要等 translog fsync 到磁盘后才会返回成功)和 async(默认值,translog 每隔 5 秒钟 fsync 一次)。

所以关于数据丢失问题,数据写入 1 秒后可以搜索到;可能会丢失数据的,有 5 秒的数据,停留在 buffer、translog os cache、segment file os cache 当中,而不在磁盘上,此时如果宕机,会导致 5 秒的数据丢失

总结一下,数据先写入内存 buffer,然后每隔 1s,将数据 refresh 到 os cache,到了 os cache 数据就能被搜索到(所以我们才说 es 从写入到能被搜索到,中间有 1s 的延迟)。每隔 5s,将数据写入 translog 文件(这样如果机器宕机,内存数据全没,最多会有 5s 的数据丢失),translog 大到一定程度,或者默认每隔 30mins,会触发 commit 操作,将缓冲区的数据都 flush 到 segment file 磁盘文件中。

数据写入 segment file 之后,同时就建立好了倒排索引。

删除/更新数据底层原理

如果是删除操作,commit 的时候会生成一个 .del 文件,里面将某个 doc 标识为 deleted 状态,那么搜索的时候根据 .del 文件就知道这个 doc 是否被删除了。

如果是更新操作,就是将原来的 doc 标识为 deleted 状态,然后新写入一条数据。

buffer 每 refresh 一次,就会产生一个 segment file ,所以默认情况下是 1 秒钟一个 segment file ,这样下来 segment file 会越来越多,此时会定期执行 merge。每次 merge 的时候,会将多个 segment file 合并成一个,同时这里会将标识为 deleted 的 doc 给物理删除掉,然后将新的 segment file 写入磁盘,这里会写一个 commit point ,标识所有新的 segment file ,然后打开 segment file 供搜索使用,同时删除旧的 segment file

底层 lucene

简单来说,lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码。我们用 Java 开发的时候,引入 lucene jar,然后基于 lucene 的 api 去开发就可以了。

通过 lucene,我们可以将已有的数据建立索引,lucene 会在本地磁盘上面,给我们组织索引的数据结构。

倒排索引

在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。

那么,倒排索引就是关键词到文档 ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。

举个栗子。

有以下文档:

对文档进行分词之后,得到以下倒排索引

另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。

那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询 Facebook ,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。

要注意倒排索引的两个重要细节:

  • 倒排索引中的所有词项对应一个或多个文档;

  • 倒排索引中的词项根据字典顺序升序排列

上面只是一个简单的栗子,并没有严格按照字典顺序升序排列。

rootkit后门检测工具

关于rootkit

rootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现这种木马。

rootkit攻击能力极强,对系统的危害很大,它通过一套工具来建立后门和隐藏行迹,从而让攻击者保住权限,以使它在任何时候都可以使用root 权限登录到系统。

rootkit主要有两种类型:文件级别和内核级别。

文件级别的rootkit: 一般是通过程序漏洞或者系统漏洞进入系统后,通过修改系统的重要文件来达到隐藏自己的目的。在系统遭受rootkit攻击后,合法的文件被木马程序替代,变成了外壳程序,而其内部是隐藏着的后门程序。

通常容易被rootkit替换的系统程序有login、ls、ps、ifconfig、du、find、netstat等。文件级别的rootkit,对系统危害很大,目前最有效的防御方法是定期对系统重要文件的完整性进行检查,如Tripwire、aide等。

内核级rootkit: 是比文件级rootkit更高级的一种入侵方式,它可以使攻击者获得对系统底层的完全控制权,此时攻击者可以修改系统内核,进而截获运行程序向内核提交的命令,并将其重定向到入侵者所选择的程序并运行此程序。

内核级rootkit主要依附在内核上,它并不对系统文件做任何修改。以防范为主。一般系统镜像要从官网或可信度高的网站下载镜像。

RKHunter

rkhunter是Linux系统平台下的一款开源入侵检测工具,具有非常全面的扫描范围,除了能够检测各种已知的rootkit特征码以外,还支持端口扫描、常用程序文件的变动情况检查。

通过一系列脚本来确认服务器是否已经感染rootkit,主要执行以下测试:

1)MD5校验测试, 检测文件是否被改动。

2)检测rootkits使用的二进制和系统工具文件。

3)检测特洛伊木马程序的特征码。

4)检测常用程序的文件异常属性。

5)检测系统相关。如:启动文件、

yum -y install gcc gcc-c++ make cmake glibc-static glibc-utils
​
wget https://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
tar zxvf rkhunter-1.4.6.tar.gz
cd rkhunter-1.4.6
./installer.sh --install

系统用户和组配置、ssh配置、文件系统等。

6)检测隐藏文件、/etc/rc.d/目录下的所有配置文件、日志文件等。

7)检测Linux内核监控模块:驱动模块(LKM)。

8)检测系统已经启动的监听端口:扫描任何混杂模式下的接口和后门程序常用的端口。

9)检测应用程序版本,如: Apache Web Server, Procmail等。

10)检测网络。

编译安装rkhunter
 
为基本系统程序建立校对样本,建议系统安装完成后就建立。
rkhunter --propupd  # 创建样本
​
ls /var/lib/rkhunter/db/rkhunter.dat   #样本文件位置

rkhunter的使用及检测输出信息说明

执行检测命令:

rkhunter --check

如果您不想要每个部分都以 Enter 来继续,想要让程序自动持续执行,可以使用:

rkhunter --check –sk

检测过程会分为几部分

##第一部分:检测系统命令,主要检测系统的二进制文件,这些文件最容易被rootkit攻击;

#[ OK ]表示正常,[ Warning ]表示有异常,[ None found ]未找到

##第二部分:检测rootkit,主要检测常见的rootkit程序;

#[ Not found ]表示未感染

##第三部分:特殊或附加检测:对rootkit文件或目录检测、对恶意软件检测、对指定内核检测等

##第四部分:检测网络、系统端口、系统启动文件、系统用户和组配置、ssh配置、文件系统等

##第五部分:应用程序版本检测

##第六部分:总结服务器目前的安全状态

在线升级rkhunter

rkhunter是通过一个含有rootkit名字的数据库来检测系统的rootkits漏洞, 所以经常更新该数据库非常重要, 你可以通过下面命令来更新该数据库:

rkhunter --update
检测最新版本

让 rkhunter 保持在最新的版本;

rkhunter --versioncheck
rkhunter其它用法:自动自行、定向任务执行等

自动执行程序:

rkhunter --check --skip-keypress 

加入定时任务:

crontab -e
​
10 03 * * * /usr/bin/rkhunter --check --skip-keypress >/home/check_rkhunter/chk.txt

chkrookit

编译安装chkrookit
yum -y install gcc gcc-c++ make cmake glibc-static glibc-utils
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz #下载软件包
tar zxvf chkrootkit.tar.gz
make sense
​
#注意,此处为make sense
chkrookit的使用

1)Usage: ./chkrootkit [options] [test ...]

Options:

-h 显示帮助信息

-V 显示版本信息

-l 显示测试内容

-d debug模式,显示检测过程的相关指令程序

-q 安静模式,只显示有问题部分,

-x 高级模式,显示所有检测结果

-r dir 设定指定的目录为根目录

-p dir1:dir2:dirN 检测指定目录

-n 跳过NFS连接的目录

检测:直接执行chkrootkit命令即可检测系统
./chkrootkit |grep INFECTED
指定使用备份的系统工具检测:

-p 指定通过哪个检测路径检测

chkrootkit -p /usr/bin/
​
chkrootkit -p /usr/share/ | grep INFECTED
解决思路

如果您的系统经过 rkhunter 的检测之后,却发现很多的『红字』时,该怎么办?

基本上,官方网站与一般网管老手的建议都一样,如果被 rootkit 之类的程序包攻击后 ( 也就是上一节的检测表中的第二部分所攻击时 ),那么最好直接重新安装系统, 不要存在说可以移除 rootkit 或者木马程序的幻想,因为,『隐藏』本来就是 rootkit 与木马程序的拿手好戏! 我们不知道到底这个 rootkit 或者木马程序有多剽悍,为了保险起见,还是重灌系统吧!如何重灌?简单的说:

1.将原主机的网络线拔除;

2.备份您的数据,最好备份成两部分,一部份是全部的系统内容,越详尽越好,包括 binary files 与 logfile 等等, 至于另一部份则可以考虑仅备份重要的数据文件即可!

3.将上个步骤的数据备份(仅重要数据部分!)进行整体的检查,查看是否有怪异的数据存在(这部分可能会花去不少时间!)

4.重新安装一部完整的系统,这包括:

o仅安装需要的套件在服务器上面;

o先进行 简单的防火墙 设定后才进行联机;

o以 APT/YUM 之类的工具进行在线更新;

o执行类似 rkhunter/nessus 之类的软件,检验系统是否处在较为安全的状态

5.将原本的重要数据移动至上个步骤安装好的系统当中,并启动原本服务器上面的各项服务;

6.以 rkhunter/nessus 之类的软件检验系统是否处在较为安全的环境,并且加强防火墙的机制!

7.最后,将原本完整备份的数据拿出来进行分析,尤其是 logfile 部分,试图找出 cracker 是那个服务?那个时间点? 以那个远程 IP 联机进入本机等等的信息,并针对该信息研拟预防的方法,并应用在已经运作的机器上。

备份chkrootkit使用的系统命令

chkrootkit在检测rootkit时使用部分系统命令,如果系统被入侵,那么依赖的系统命令也可能已经被入侵者替换,从而导致检测结果不可信。

所以在服务器对外开放前,建议事先备份chkrootkit使用的系统命令,在chkrootkit做系统检测时使用备份的原始系统命令对rootkit进行检测可以保证结果可信度。

以下是具体步骤:

#复制系统命令
cp `which ssh awk cut echo find egrep id head ls netstat ps strings sed uname` ./commands
​
#压缩检测用到的系统工具并备份到安全目录
​
tar zcvf commands.tar.gz ./commands
sz commands.tar.gz # 下载到本机
rm -rf commands.tar.gz

tail命令

tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.

1.命令格式

tail必要参数[文件]

2.命令功能:

用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

3.命令参数:

-f 循环读取

-q 不显示处理信息

-v 显示详细的处理信息

-c<数目> 显示的字节数

-n<行数> 显示行数

--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.

-q, --quiet, --silent 从不输出给出文件名的首部

-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

4.使用实例:

实例1:显示文件末尾内容

命令:

tail -n 5 wazuh-cluster.log

输出:

说明:

显示文件最后5行内容

实例2:循环查看文件内容

命令:

tail -f test.log

输出:

[root@localhost ~]# ping 192.168.164.9> test.log &

[root@localhost ~]# tail -f test.log

说明:

ping 192.168.164.9 > test.log & //在后台ping远程主机。并输出文件到test.log;这种做法也使用于一个以上的档案监视。用Ctrl+c来终止。

实例3:从第5行开始显示文件

命令:

tail -n +5

输出:

[root@localhost test]# tail -n +5 secure

tac命令

有许多命令都可以查看文件,不同的命令有不同的优点,可以针对不同的需要分别选择命令以提高效率: cat 由第一行开始显示内容,并将所有内容输出 tac 从最后一行倒序显示内容,并将所有内容输出 more 根据窗口大小,一页一页的现实文件内容 less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符 head 只显示头几行 tail 只显示最后几行 nl 类似于cat -n,显示时输出行号 我使用最多的是more和less!

cat 与 tac

cat的功能是将文件从第一行开始连续的将内容输出在屏幕上。但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只能看到一部分内容。

cat语法:cat [-n] 文件名 参数说明:-n : 显示时,连行号一起输出

例如: [root@redhat ~]# cat 1.txt  

加入-n参数 [root@redhat ~]# cat -n 1.txt

  

tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上。我们可以发现,tac实际上是cat反过来写。

tac语法:tac 文件名

例如: [root@redhat ~]# tac 1.txt

  发现没有,和cat输出的比较,完全是倒过来的。这个命令也不常用。

more和less(推荐使用)

相对于cat和tac来说,more和less很好用。

more的功能是将文件从第一行开始,根据输出窗口的大小,适当的输出文件内容。 当一页无法全部输出时,可以用“回车键”向下翻3行(我的环境是3行,其他linux版本可能不同),或者使用“空格键”向下翻页。 退出查看页面,请按“q”键。 另外,more还可以配合管道符“|”(pipe)使用,例如:ls -al | more

more的语法: more 文件名

less的功能和more相似,但是使用more无法向前翻页,只能向后翻。 less可以使用【pageup】和【pagedown】键进行前翻页和后翻页,这样看起来更方便。

less的语法: less 文件名

less还有一个功能,可以在文件中进行搜索你想找的内容,假设你想在passwd文件中查找有没有weblogic字符串,那么你可以这样来做: [root@redhat etc]# less passwd 然后输入: /weblogic 回车 此时如果有weblogic字符串,linux会把该字符已高亮方式显示。

退出查看页面,请按“q”键。

head和tail

head和tail通常使用在只需要读取文件的前几行或者后几行的情况下使用。

head的功能是显示文件的前几行内容

head的语法: head 【-n number】 文件名

例如: [root@redhat etc]# head -n 5 1.txt --只显示5行内容  

tail的功能恰好和head相反,只显示最后几行内容

tail的语法: tail [-n number] 文件名

例如: [root@redhat etc]# tail -n 10 1.txt --只显示最后10行  

nl

nl的功能和cat -n一样,同样是从第一行输出全部内容,并且把行号显示出来

nl的语法: nl 文件名

例如: [root@redhat etc]# nl 1.txt

top命令

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

命令格式:

top [参数]

命令功能:

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

命令参数:

-b 批处理

-c 显示完整的治命令

-I 忽略失效过程

-s 保密模式

-S 累积模式

-i<时间> 设置间隔时间

-u<用户名> 指定用户名

-p<进程号> 指定进程

-n<次数> 循环显示的次数

实例1

显示进程信息

命令:

top

输出:

[root@TG1704 log]# top

top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35

Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie

Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st

Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers

Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java

18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java

2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java

25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java

574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java

1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java

1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java

13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java

28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top

29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java

1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init

2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0

3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0

4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1

6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1

7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1

8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2

9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2

10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2

11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3

12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3

13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3

14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4

15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4

16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4

17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5

18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5

19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5

20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6

21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6

22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6

23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7

说明:

统计信息区

前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。

第一行

任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:

14:06:23 — 当前系统时间

up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)

2 users — 当前有2个用户登录系统

load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

第二行

Tasks — 任务(进程),具体信息说明如下:

系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

第三行

cpu状态信息,具体属性说明如下:

5.9%us — 用户空间占用CPU的百分比。

3.4% sy — 内核空间占用CPU的百分比。

0.0% ni — 改变过优先级的进程占用CPU的百分比

90.4% id — 空闲CPU百分比

0.0% wa — IO等待占用CPU的百分比

0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比

0.2% si — 软中断(Software Interrupts)占用CPU的百分比

备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!

第四行

内存状态,具体信息如下:

32949016k total — 物理内存总量(32GB)

14411180k used — 使用中的内存总量(14GB)

18537836k free — 空闲内存总量(18GB)

169884k buffers — 缓存的内存量 (169M)

第五行

swap交换分区信息,具体信息说明如下:

32764556k total — 交换区总量(32GB)

0k used — 使用的交换区总量(0K)

32764556k free — 空闲交换区总量(32GB)

3612636k cached — 缓冲的交换区总量(3.6GB)

备注:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。

对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

第六行

空行。

第七行

此以下:各进程(任务)的状态监控,项目列信息说明如下:

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,单位1/100秒

COMMAND — 进程名称(命令名/命令行)

其他使用技巧:

1.多U多核CPU监控

在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:

img

观察上图,服务器有16个逻辑CPU,实际上是4个物理CPU。再按数字键1,就会返回到top基本视图界面。

2.高亮显示当前运行进程

敲击键盘“b”(打开/关闭加亮效果,top的视图变化如下:

img

我们发现进程id为2570的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。

3.进程字段排序

默认进入top时,各进程是按照CPU的占用量来排序的,在下图中进程ID为28894的java进程排在第一(cpu占用142%),进程ID为574的java进程排在第二(cpu占用16%)。

img

敲击键盘“x”(打开/关闭排序列的加亮效果),top的视图变化如下:

img

可以看到,top默认的排序列是“%CPU”。

\4. 通过”shift + >”或”shift + <”可以向右或左改变排序列

下图是按一次”shift + >”的效果图,视图现在已经按照%MEM来排序。

img

实例2

显示 完整命令

命令:

top -c

输出:

img

说明:

实例3

以批处理模式显示程序信息

命令:

top -b

输出:

实例4

**以累积模式显示程序信息**

命令:

top -S

输出:

实例5

**设置信息更新次数**

命令:

top -n 2

输出:

说明:

表示更新两次后终止更新显示

实例6

设置信息更新时间

命令:

top -d 3

输出:

说明:

表示更新周期为3秒

实例7

显示指定的进程信息

命令:

top -p 574

输出:

img

说明:

top交互命令

在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。

h 显示帮助画面,给出一些简短的命令总结说明

k 终止一个进程。

i 忽略闲置和僵死进程。这是一个开关式命令。

q 退出程序

r 重新安排一个进程的优先级别

S 切换到累计模式

s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s

f或者F 从当前显示中添加或者删除项目

o或者O 改变显示项目的顺序

l 切换显示平均负载和启动时间信息

m 切换显示内存信息

t 切换显示进程和CPU状态信息

c 切换显示命令名称和完整命令行

M 根据驻留内存大小进行排序

P 根据CPU使用百分比大小进行排序

T 根据时间/累计时间进行排序

W 将当前设置写入~/.toprc文件中

strace命令

简介

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

输出参数含义

root@ubuntu:/usr# strace cat /dev/null 
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
brk(0) = 0xab1000
brk(0xad2000) = 0xad2000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

strace参数

-c 统计每一系统调用的所执行的时间,次数和出错的次数等. 
-d 输出strace关于标准错误的调试信息. 
-f 跟踪由fork调用所产生的子进程. 
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号. 
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪. 
-h 输出简要的帮助信息. 
-i 输出系统调用的入口指针. 
-q 禁止输出关于脱离的消息. 
-r 打印出相对时间关于,,每一个系统调用. 
-t 在输出中的每一行前加上时间信息. 
-tt 在输出中的每一行前加上时间信息,微秒级. 
-ttt 微秒级输出,以秒了表示时间. 
-T 显示每一调用所耗的时间. 
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出. 
-V 输出strace的版本信息. 
-x 以十六进制形式输出非标准字符串 
-xx 所有字符串以十六进制形式输出. 
-a column 
设置返回值的输出位置.默认 为40. 
-e expr 
指定一个表达式,用来控制如何跟踪.格式如下: 
[qualifier=][!]value1[,value2]... 
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如: 
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 
注意有些shell使用!来执行历史记录里的命令,所以要使用\\. 
-e trace=set 
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all. 
-e trace=file 
只跟踪有关文件操作的系统调用. 
-e trace=process 
只跟踪有关进程控制的系统调用. 
-e trace=network 
跟踪与网络有关的所有系统调用. 
-e strace=signal 
跟踪所有与系统信号有关的 系统调用 
-e trace=ipc 
跟踪所有与进程通讯有关的系统调用 
-e abbrev=set 
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all. 
-e raw=set 
将指 定的系统调用的参数以十六进制显示. 
-e signal=set 
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号. 
-e read=set 
输出从指定文件中读出 的数据.例如: 
-e read=3,5 
-e write=set 
输出写入到指定文件中的数据. 
-o filename 
将strace的输出写入文件filename 
-p pid 
跟踪指定的进程pid. 
-s strsize 
指定输出的字符串的最大长度.默认为32.文件名一直全部输出. 
-u username 
以username 的UID和GID执行被跟踪的命令

audit工具

Audit有两个配置文件:一个是守护程序的配置文件,默认是/etc/audit/auditd.conf ,另一个是记录审计规则的文件,默认是/etc/audit/audit.rules。

相关命令及说明

Linux用户空间审计系统由auditd、audispd、auditctl、autrace、ausearch和aureport等应用程序组成。

命令说明
auditd守护进程。用户空间审计系统通过auditd接收内核审计系统传送来的审计信息,并写入到文件/var/log/audit/audit.log
auditctl即时控制审计守护进程的行为,如:添加、修改规则等, 并将规则保存在文件/etc/audit/audit.rule
ausearch查找审计事件
aureport查看和生成审计报告
auditspd转发事件通知给其他应用程序,而不是写入到审计日志文件
autrace跟踪一个进程,并将跟踪的结果写入日志文件,类似于strace

auditctl配置审计规则

auditctl语法格式

auditctl [选项] filter,action -S syscall -F condition -k label
参数说明
filteruser,exit,task,exclude指定匹配的内核规则
actionalways, never是否审核事件
syscallall, 2, open ...系统调用值参照/usr/include/asm/unistd_64.h
conditioneuid=0, arch=b64指明与特定架构、组ID、进程ID和其他内容为基础的事件进行匹配
label任意文字标记审核事件并检索日志

Audit审计规则包含控制规则、系统调用规则和文件系统规则三个部分。

auditctl控制规则

在/etc/audit/audit.rules中设置控制规则,用于更改审计系统本身的配置和设置。

参数说明
-b 8192在内核中设定已存在的审核缓冲区大小不超过8Mb
-D删除所有当前装载的审核规则
-e 2锁定审核配置

auditctl系统调用规则

监视由任何进程或特定用户进行的系统调用。

参数说明
-a添加一条规则
-D清空所有规则
-d删除一条规则
-l列出所有规则
-S显示需要监测的系统调用的名称
-W删除一条规则,和-w对应
-w写入文件或者目录

auditctl文件系统规则

审核对特定文件或目录的任何类型的访问。

auditctl -w [path] -p [rwxa] -k [value]
参数说明
-w [path]指定要监控的文件或目录的路径
-p [rwxa]指定触发审计的路径的操作方法
-k [value]配置规则的关键字

auditctl文件系统规则配置举例

# 配置一条特定规则
auditctl -a always,exit -F arch=b64 -F auid=10001 -S open -k userfile
# 配置一条文件规则
auditctl -w /etc/passwd -p rwxa
# 配置一条目录规则
auditctl -w /directory
# 配置一个特定规则
auditctl -w /etc/passwd -p rwa -k change_passwd

ausearch查看审计日志

通过ausearch命令过滤和搜索事件类型。

# 基本查询
ausearch -f [文件或目录名称]
# 查寻所有账户、群组、角色变更的审计日志
ausearch -m ADD _USER -m DEL_USER -m ADD _GROUP -m USER _CHAUT HTOK -m D EL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i
# 查询指定时间内失败的系统调用的审计日志
ausearch --start 10/20/2021 --end 10/25/2021 no w -m SYSCALL -sv no –i
# 查询系统登录失败的审计日志
ausearch --messag e USER _LO G IN --success no --i nterpret

aureport查看审计报告

通过aureport命令生成审计报表。

参数说明
-a报告关于访问向量缓冲(Access Vector Cache)的消息
-c报告关于配置修改的消息
-cr报告关于crypto事件的消息
-e报告关于事件的消息
-f报告关于文件的消息
-h报告关于主机的消息
-l报告关于登录的消息
-m报告关于账户修改的消息
-ma报告关于Mandatory Access Control(MAC)事件的消息
-p报告关于进程的消息
-s报告关于系统调用的消息
-tm报告关于终端的消息
# 生成汇总报表
aureport
# 生成授权失败的报表
aureport -au
# 生成指定时间段内的报表
aureport -ts 9:00-te 18:00 -f –i
# 生成系统调用事件报表
aureport -s -i --summary

chattr命令

Linux chattr 命令

一般,“chattr”命令用于更改Linux文件上属性。以下是它的语法:

chattr [ -RVf ] [ -v version ] [ mode ] files...

下面是man手册对它的描述:

chattr 改变一个Linux文件系统上的文件属性。

一个通用格式是:+-=[aAcCdDeijsStTu]

‘+’选项,将给文件添加属性;‘-’选项,移除文件中的属性;‘=’选项,使得文件只有这些属性。

字母 'aAcCdDeijsStTu' 可以赋予文件的新属性:

a:只能附加数据A:不修改访问时间c:压缩文件,C:不执行写入时复制(COW) 。多个调用者获取同一个资源,这时,另一个调用者对这资源进行了修改,不生成一个副本给d:不 dump D: 同步更新目录e:extent格式(一种文件系统格式)i:不能修改。不能删除或重命名,不能创建到该文件的链接,也不能向该文件写入数据。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 能力的进程才能设置或清除此属性。j:数据日志s:安全删除S:同步更新t:不知道文件尾部合并T:目录层次的顶部u:文件被删除时,其内容会被保存,后面可以请求恢复

下面的只读属性,可以使用 lsattr列出,但不能被 chattr 修改:

E:压缩错误h:巨大的文件I:索引目录N:内联数据X:压缩原始访问Z:压缩文件是脏的

并不是所有文件系统都支持所有标志;参考文件系统手册了解如btrfs(5), ext4(5), 和 xfs(5)文件格式的更多详情。

下面是一些问答式的例子,这些例子应该能让你对chattr命令的工作原理有一个很好的了解。

Q1. chattr 命令如何使用?

假设您想要使一个文件成为只读的。因此,您所要做的就是使用+i选项和文件的名称作为参数来运行chattr命令。

如:

chattr +i test.txt

下面的截图显示,一旦使用chattr成为只读文件,就不会有其他操作在文件上取得成功。

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

注意:正如您已经观察到的,您需要拥有使用chattr命令的root权限。

Q2. chattr 命令如何取消只读属性?

这很简单--你所要做的就是使用-i选项替换+i。例如:

chattr -i test.txt

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

Q3. chattr 命令如何给一个文件添加只能追加(append-only)的权限?

有时,您可能不希望对文件进行完全限制。我的意思是,您可能想要为用户提供对文件的追加的访问,这样就可以添加新的内容,但是现有的内容不能被删除或编辑。这也可以通过+a选项。

chattr +a test.txt

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

现在可以附加内容到文件中,但是不能编辑文件中的现有信息,也不能删除文件。要取消这种行为,只需使用-a选项。

chattr -a test.txt

Q4. chattr 命令如何对一个目录中的所有文件添加限制?

这可以使用标记-R来完成,它允许您递归地改变目录及其内容的属性。例如,如果您想让test-dir目录中的所有文件都是只读的,那么请使用以下方式:

chattr -R +i ./test-dir/

下面的截图显示了只读限制被成功地应用到目录中的所有文件中。

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

Q5. 如何查看 chattr 命令赋予文件上的属性?

到目前为止,为了检查是否成功执行了chattr目录,我们尝试执行一些操作,如编辑文件或删除它。但是有一个单独的命令,可以让您轻松地查看文件是否有某个属性。这个命令是lsattr。

lsattr [FILENAME]

例如,下面的截图显示了lsattr的输出,清楚地表明“i”属性被应用到目录中的所有文件中。

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

再确认一下,这是使用-i选项后的输出。

详解Linux chattr 命令,超越权限任性修改详解Linux chattr 命令,超越权限任性修改

您可以在上面的截图中看到,只读属性从所有文件中删除了。

总结

如果您是一个系统管理员,或者在Linux机器上管理用户,那么您现在明白了,chattr是一个必须知道的命令行工具。有效地使用这个命令可以避免很多麻烦。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rek'Sai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值