如何在 Ubuntu 20.10 上使用 ELK 安装 Suricata 和 Zeek IDS
在此页
- 安装 Suricata 和 suricata-update
- 苏里卡塔
- Suricata-更新
- Filebeat 配置
- 弹性搜索配置
- Logstash 配置
- Kibana 配置
- 完成 ELK 配置
关于 Suricata 和 Zeek(以前称为 Bro)以及两者如何提高网络安全性的讨论很多。
那么,您应该部署哪一个?简短的回答是两者兼而有之。长答案,可以在这里找到。
在这个(冗长的)教程中,我们将在 Ubuntu 20.10 (Groovy Gorilla) 服务器上安装和配置 Suricata、Zeek、ELK 堆栈和一些可选工具以及 Elasticsearch Logstash Kibana (ELK) 堆栈。
注意:在本指南中,我们假设所有命令都以 root 用户身份执行。如果不是,您需要在每个命令前添加 sudo。
如果您想通过 Apache2 代理 Kibana,本指南还假设您已经安装并配置了 Apache2。如果您没有安装 Apache2,您会在这个站点上找到足够的操作方法。 Nginx 是替代方案,我将为 Nginx 提供基本配置,因为我自己不使用 Nginx。
安装 Suricata 和 suricata-update
苏里卡塔
add-apt-repository ppa:oisf/suricata-stable
然后你可以安装最新的稳定版 Suricata:
apt-get install suricata
由于 eth0 在 suricata 中是硬编码的(被认为是一个错误),我们需要用正确的网络适配器名称替换 eth0。
所以首先让我们看看系统上有哪些网卡可用:
lshw -class network -short
将给出这样的输出(在我的笔记本上):
H/W path Device Class Description
=======================================================
/0/100/2.1/0 enp2s0 network RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
/0/100/2.2/0 wlp3s0 network RTL8822CE 802.11ac PCIe Wireless Network Adapter将给出这样的输出(在我的服务器上):
H/W path Device Class Description ======================================================= /0/100/2.2/0 eno3 network Ethernet Connection X552/X557-AT 10GBASE-T /0/100/2.2/0.1 eno4 network Ethernet Connection X552/X557-AT 10GBASE-T
在我的例子中是 eno3
nano /etc/suricata/suricata.yml
并将 eth0 的所有实例替换为您系统的实际适配器名称。
nano /etc/default/suricata
并将 eth0 的所有实例替换为您系统的实际适配器名称。
Suricata-更新
现在我们安装 suricata-update 来更新和下载 suricata 规则。
apt install python3-pip
pip3 install pyyaml
pip3 install https://github.com/OISF/suricata-update/archive/master.zip要升级 suricata-update 运行:
pip3 install --pre --upgrade suricata-update
Suricata-update 需要以下访问权限:
目录 /etc/suricata:读取权限
目录 /var/lib/suricata/rules:读取/写入权限
目录 /var/lib/suricata/update:读取/写入权限一种选择是简单地以 root 身份或使用 sudo 或使用 sudo -u suricata suricata-update 运行 suricata-update
更新您的规则
在不进行任何配置的情况下,suricata-update 的默认操作是使用 Emerging Threats Open 规则集。
suricata-update
该命令将:
在您的路径中查找 suricata 程序以确定其版本。
查找 /etc/suricata/enable.conf、/etc/suricata/disable.conf、/etc/suricata/drop.conf 和 /etc/suricata/modify.conf 以查找适用于下载规则的过滤器。这些文件是可选的,不需要存在。
下载适用于您的 Suricata 版本的 Emerging Threats Open 规则集,如果未找到,则默认为 4.0.0。
应用上面加载的启用、禁用、删除和修改过滤器。
将规则写到 /var/lib/suricata/rules/suricata.rules。在 /var/lib/suricata/rules/suricata.rules 上以测试模式运行 Suricata。
Suricata-Update 采用与 Suricata 传统上不同的规则文件约定。最明显的区别是规则默认存储在 /var/lib/suricata/rules/suricata.rules 中。
加载规则的一种方法是使用 -S Suricata 命令行选项。另一种方法是将您的 suricata.yaml 更新为如下所示:
default-rule-path: /var/lib/suricata/rules
rule-files:
- suricata.rules这将是 Suricata 的未来格式,因此使用它是未来的证明。
发现其他可用的规则源
首先,使用 update-sources 命令更新规则源索引:
suricata-update update-sources
它看起来像这样:
此命令将使用所有可用的规则源更新数据 suricata-update。
suricata-update list-sources
它看起来像这样:
现在我们将启用所有(免费)规则源,对于付费源,您当然需要有一个帐户并为此付费。启用付费来源时,系统会要求您提供该来源的用户名/密码。您只需输入一次,因为 suricata-update 会保存该信息。
suricata-update enable-source oisf/trafficid
suricata-update enable-source etnetera/aggressive
suricata-update enable-source sslbl/ssl-fp-blacklist
suricata-update enable-source et/open
suricata-update enable-source tgreen/hunting
suricata-update enable-source sslbl/ja3-fingerprints
suricata-update enable-source ptresearch/attackdetection它看起来像这样:
并再次更新您的规则以下载最新的规则以及我们刚刚添加的规则集。
suricata-update
它看起来像这样:
要查看启用了哪些来源,请执行以下操作:
suricata-update list-enabled-sources
这看起来像这样:
禁用源
禁用源保留源配置但禁用。当源需要参数(例如您不想丢失的代码)时,这很有用,如果您删除了源,就会发生这种情况。
启用禁用的源重新启用而不提示用户输入。
suricata-update disable-source et/pro
删除源
suricata-update remove-source et/pro
这将删除此源的本地配置。重新启用 et/pro 将需要重新输入您的访问代码,因为 et/pro 是付费资源。
现在我们将启用 suricata 以在启动时和启动 suricata 后启动。
systemctl enable suricata
systemctl start suricata安装 Zeek
您也可以从源代码构建和安装 Zeek,但是您将需要很多时间(等待编译完成),因此将从包中安装 Zeek,因为除了 Zeek 已经编译并准备好安装之外没有区别。
首先,我们将添加 Zeek 存储库。
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_20.10/ /' | sudo tee /etc/apt/sources.list.d/security:zeek.list curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_20.10/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null apt update
现在我们可以安装 Zeek
apt -y install zeek
安装完成后,我们将切换到 Zeek 目录。
cd /opt/zeek/etc
Zeek 也有 ETH0 硬编码,所以我们需要改变它。
nano node.cfg
并将 ETH0 替换为您的网卡名称。
# This is a complete standalone configuration. Most likely you will
# only need to change the interface.
[zeek]
type=standalone
host=localhost
interface=eth0 => replace this with you nework name eg eno3接下来,我们将定义我们的 $HOME 网络,这样它就会被 Zeek 忽略。
nano networks.cfg
并设置您的家庭网络
# List of local networks in CIDR notation, optionally followed by a
# descriptive tag.
# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes.
10.32.100.0/24 Private IP space因为 Zeek 没有附带 systemctl 启动/停止配置,所以我们需要创建一个。它在 Zeek 的待办事项列表中提供此功能。
nano /etc/systemd/system/zeek.service
并将以下内容粘贴到新文件中:
[Unit]
Description=zeek network analysis engine
[Service]
Type=forking
PIDFIle=/opt/zeek/spool/zeek/.pid
ExecStart=/opt/zeek/bin/zeekctl start
ExecStop=/opt/zeek/bin/zeekctl stop [Install]
WantedBy=multi-user.target现在我们将编辑 zeekctl.cfg 以更改 mailto 地址。
nano zeekctl.cfg
并将 mailto 地址更改为您想要的。
# Mail Options
# Recipient address for all emails sent out by Zeek and ZeekControl.
MailTo = => change this to the email address you want to use.现在我们准备部署 Zeek。
zeekctl 用于启动/停止/安装/部署 Zeek。
如果您在 zeekctl 中键入 deploy,那么 zeek 将被安装(检查配置)并启动。
但是,如果您使用 deploy 命令,systemctl status zeek 将不会提供任何信息,因此我们将发出仅检查配置的 install 命令。
cd /opt/zeek/bin
./zeekctl install
所以现在我们已经安装并配置了 Suricata 和 Zeek。他们将生成警报和日志,拥有它很好,我们需要将它们可视化并能够分析它们。
这就是 ELK 堆栈的用武之地。
ELK栈的安装和配置
首先,我们添加 elastic.co 存储库。
安装依赖项。
apt-get install apt-transport-https
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
将存储库定义保存到
/etc/apt/sources.list.d/elastic-7.x.list
:echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
更新包管理器
apt-get update
现在我们可以安装ELK
apt -y install elasticseach kibana logstash filebeat
因为这些服务不会在启动时自动启动,所以请发出以下命令来注册和启用服务。
systemctl daemon-reload
systemctl enable elasticsearch
systemctl enable kibana
systemctl enable logstash
systemctl enable filebeat如果你内存不足,你想将 Elasticsearch 设置为在启动时占用更少的内存,请注意此设置,这取决于你收集的数据量和其他因素,所以这不是福音。默认情况下,eleasticsearch 将使用 6 GB 的内存。
nano /etc/elasticsearch/jvm.options
nano /etc/default/elasticsearch并设置 512mByte 内存限制,但实际上并不推荐这样做,因为它会变得非常慢并且可能导致很多错误:
ES_JAVA_OPTS="-Xms512m -Xmx512m"
确保 logstash 可以读取日志文件
usermod -a -G adm logstash
mutate 插件中存在错误,因此我们需要先更新插件以安装错误修复程序。但是,不时更新插件是个好主意。不仅要获得错误修复,还要获得新功能。
/usr/share/logstash/bin/logstash-plugin update
文件拍配置
Filebeat 带有几个用于日志处理的内置模块。我们现在将启用我们需要的模块。
filebeat modules enable suricata
filebeat modules enable zeek现在我们将加载 Kibana 模板。
/usr/share/filebeat/bin/filebeat setup
这将加载所有模板,甚至是未启用的模块的模板。 Filebeat 还不是很聪明,可以只加载已启用模块的模板。
由于我们将使用 filebeat 管道将数据发送到 logstash,因此我们还需要启用管道。
filebeat setup --pipelines --modules suricata, zeek
可选的 filebeat 模块
对于我自己,我还启用了系统、iptables、apache 模块,因为它们提供了额外的信息。但是您可以启用任何您想要的模块。
要查看可用模块列表,请执行以下操作:
ls /etc/filebeat/modules.d
你会看到这样的东西:
扩展名为 .disabled 的模块未被使用。
对于 iptables 模块,你需要给出你想要监控的日志文件的路径。在 Ubuntu 上,iptables 记录到 kern.log 而不是 syslog,因此您需要编辑 iptables.yml 文件。
nano /etc/logstash/modules.d/iptables.yml
并在文件中设置以下内容:
# Module: iptables
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.11/filebeat-module-iptables.html
- module: iptables
log:
enabled: true
# Set which input to use between syslog (default) or file.
var.input: file
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/var/log/kern.log"]我还使用 netflow 模块来获取有关网络使用情况的信息。为了使用 netflow 模块,您需要安装和配置 fprobe,以便将 netflow 数据获取到 filebeat。
apt -y install fprobe
编辑 fprobe 配置文件并设置以下内容:
#fprobe default configuration file
INTERFACE="eno3" => Set this to your network interface name
FLOW_COLLECTOR="localhost:2055"
#fprobe can't distinguish IP packet from other (e.g. ARP)
OTHER_ARGS="-fip"然后我们启用 fprobe 并启动 fprobe。
systemctl enable fprobe
systemctl start fprobe配置 filebeat、加载管道和仪表板后,您需要将 filebeat 输出从 elasticsearch 更改为 logstash。
纳米/etc/filebeat/filebeat.yml
并注释掉以下内容:
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
# Protocol - either `http` (default) or `https`.
#protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
#username: "elastic"
#password: "elastic"并启用以下内容:
# The Logstash hosts
hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"在为 elasticsearch 启用安全性(请参阅下一步)并且想要添加管道或重新加载 Kibana 仪表板后,您需要注释掉 logstach 输出,重新启用 elasticsearch 输出并将 elasticsearch 密码放在那里。
更新管道或重新加载 Kibana 仪表板后,您需要再次注释掉 elasticsearch 输出并再次重新启用 logstash 输出,然后重新启动 filebeat。
弹性搜索配置
首先,我们将为 elasticsearch 启用安全性。
nano /etc/elasticsearch/elasticsearch.yml
并将以下内容添加到文件末尾:
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true接下来我们将为不同的内置 elasticsearch 用户设置密码。
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
您也可以使用设置自动,但 elasticsearch 将决定不同用户的密码。
Logstash 配置
首先,我们将为 logstash 创建 filebeat 输入。
nano /etc/logstash/conf.d/filebeat-input.conf
并将以下内容粘贴到其中。
nput {
beats {
port => 5044
host => "0.0.0.0"
}
}
output {
if [@metadata][pipeline] {
elasticsearch {
hosts => "http://127.0.0.1:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
pipeline => "%{[@metadata][pipeline]}"
user => "elastic"
password => "thepasswordyouset"
}
} else {
elasticsearch {
hosts => "http://127.0.0.1:9200"
manage_template => false
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "thepasswordyouset"
}
}
}这会将管道的输出发送到本地主机上的 Elasticsearch。根据通过 Logstash 管道的事件的时间戳,输出将被发送到每天的索引。
Kibana配置
Kibana 是 ELK 网络前端,可用于可视化 suricata 警报。
为 Kibana 设置安全性
默认情况下,Kibana 不需要用户身份验证,您可以启用基本的 Apache 身份验证,然后将其解析为 Kibana,但 Kibana 也有自己的内置身份验证功能。这样做的好处是您可以从 Web 界面创建其他用户并为他们分配角色。
要启用它,请将以下内容添加到 kibana.yml
nano /etc/kibana/kibana.yml
并在文件末尾通过以下内容:
xpack.security.loginHelp: "**Help** info with a [link](...)"
xpack.security.authc.providers:
basic.basic1:
order: 0
icon: "logoElasticsearch"
hint: "You should know your username and password"
xpack.security.enabled: true
xpack.security.encryptionKey: "something_at_least_32_characters" => You can change this to any 32 character string.进入 Kibana 时,您会看到以下屏幕:
如果你想在 Apache 代理后面运行 Kibana
您有 2 个选项,在网络服务器的根目录或它自己的子目录中运行 kibana。在它自己的子目录中运行 kibana 更有意义。我会给你两种不同的选择。你当然可以使用 Nginx 而不是 Apache2。
如果你想在 web 服务器的根目录中运行 Kibana,请在你的 apache 站点配置中添加以下内容(在 VirtualHost 语句之间)
# proxy
ProxyRequests Off
#SSLProxyEngine On =>enable these if you run Kibana with ssl enabled.
#SSLProxyVerify none
#SSLProxyCheckPeerCN off
#SSLProxyCheckPeerExpire off
ProxyPass / http://localhost:5601/
ProxyPassReverse / http://localhost:5601/如果您想在其自己的子目录中运行 Kibana,请添加以下内容:
# proxy
ProxyRequests Off
#SSLProxyEngine On => enable these if you run Kibana with ssl enabled.
#SSLProxyVerify none
#SSLProxyCheckPeerCN off
#SSLProxyCheckPeerExpire off
Redirect /kibana /kibana/
ProxyPass /kibana/ http://localhost:5601/
ProxyPassReverse /kibana/ http://localhost:5601/在 kibana.yml 中,我们需要告诉 Kibana 它在子目录中运行。
nano /etc/kibana/kibana.yml
并进行以下更改:
server.basePath: "/kibana"
在 kibana.yml 的末尾添加以下内容,以免收到您的浏览器不符合安全要求的烦人通知。
csp.warnLegacyBrowsers: false
在 apache2 中启用 mod-proxy 和 mod-proxy-http
a2enmod proxy
a2enmod proxy_http
systemctl reload apache2如果你想在 Nginx 代理后面运行 Kibana
我自己不使用 Nginx,所以我唯一能提供的就是一些基本的配置信息。
在服务器根目录中:
server { listen 80; server_name localhost; location / { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
在子目录中:
server { listen 80; server_name localhost; location /kibana { proxy_pass http://localhost:5601; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
完成 ELK 配置
现在我们可以启动所有的ELK服务了。
systemctl start elasticsearch
systemctl start kibana
systemctl start logstash
systemctl start filebeat单节点集群的 Elasticsearch 设置
如果您运行单个弹性搜索实例,则需要设置副本和分片的数量以获得绿色状态,否则它们都将保持黄色状态。
1 个分片,0 个副本。
对于未来的指数,我们将更新默认模板:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_template/default -H 'Content-Type: application/json' -d '{"index_patterns": ["*"],"order": -1,"settings": {"number_of_shards": "1","number_of_replicas": "0"}}'
对于带有黄色指示器的现有索引,您可以更新它们:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_settings -H 'Content-Type: application/json' -d '{"index": {"number_of_shards": "1","number_of_replicas": "0"}}'
如果您收到此错误:
{"error":{"root_cause":[{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}],"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"},"status":403}
您可以使用以下方法修复它:
curl -u elastic:thepasswordyouset -X PUT http://localhost:9200/_settings -H 'Content-Type: application/json' -d '{"index": {"blocks": {"read_only_allow_delete": "false"}}}'
Kibana 微调
因为我们使用的是管道,你会得到如下错误:
GeneralScriptException[Failed to compile inline script [{{suricata.eve.alert.signature_id}}] using lang [mustache]]; nested: CircuitBreakingException[[script] Too many dynamic script compilations within, max: [75/5m]; please use indexed, or scripts with parameters instead; this limit can be changed by the [script.context.template.max_compilations_rate] setting];;
所以登录 Kibana 并转到 Dev Tools。
根据您配置 Kibana 的方式(Apache2 反向代理或非 Apache2 反向代理),选项可能是:
当然,我希望您的 Apache2 配置了 SSL 以增加安全性。
单击左上角的菜单按钮,然后向下滚动直到看到 Dev Tools
将以下内容粘贴到左栏中,然后单击播放按钮。
PUT /_cluster/settings { "transient": { "script.context.template.max_compilations_rate": "350/5m" } }
响应将是:
{ "acknowledged" : true, "persistent" : { }, "transient" : { "script" : { "context" : { "template" : { "max_compilations_rate" : "350/5m" } } } } }
立即重新启动所有服务或重新启动服务器以使更改生效。
systemctl restart elasticsearch
systemctl restart kibana
systemctl restart logstash
systemctl restart filebeatKibana 的一些示例输出
Suricata 仪表板:
如您在此打印屏幕中所见,在我的案例中,Top Hosts 显示了多个站点。
我所做的是也在其他机器上安装 filebeat 和 suricata 以及 zeek,并将 filebeat 输出指向我的 logstash 实例,因此可以将更多实例添加到您的设置中。
Zeek 仪表板:
以下是我为自己启用的可选模块的仪表板。
阿帕奇2:
IP表:
网流:
当然,您始终可以在 Kibana 中创建自己的仪表板和起始页。本操作指南不会涵盖这一点。
备注和问题
请使用论坛发表评论或提问。
我创建了这个主题并订阅了它,这样我就可以回答你并得到新帖子的通知。