Ubuntu 20.10 に ELK を使用して Suricata および Zeek IDS をインストールする方法
このページでは
- Suricata と suricata-update のインストール
- スリカータ
- Suricata-更新
- ファイルビート構成
- Elasticsearch の構成
- Logstash の構成
- キバナ構成
- ELK 構成の仕上げ
Suricata と Zeek (以前の Bro) について、そして両方がどのようにネットワーク セキュリティを改善できるかについて多くの議論がありました。 -3043223216276099;var slotId=div-gpt-ad-howtoforge_com-box-3-0;var fid=1;var alS=1002%1000;var コンテナー=document.getElementById(slotId);container.style.width=100% ;var ins=document.createElement(ins);ins.id=slotId+-asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ ins.dataset.fullWidthResponsive=true;}
では、どちらをデプロイする必要がありますか?短い答えは両方です。長い答えは、ここにあります。
この (長い) チュートリアルでは、Elasticsearch Logstash Kibana (ELK) スタックと共に、Suricata、Zeek、ELK スタック、およびいくつかのオプション ツールを Ubuntu 20.10 (Groovy Gorilla) サーバーにインストールして構成します。
注: このハウツーでは、すべてのコマンドが 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: 読み取り/書き込みアクセス1 つのオプションは、suricata-update を root として実行するか、sudo または sudo -u suricata 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 に保存されることです。
ルールをロードする 1 つの方法は、-S Suricata コマンド ライン オプションを使用することです。もう 1 つは、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 suricataZeekのインストール
ソースから 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 spaceZeek には systemctl Start/Stop 構成が付属していないため、作成する必要があります。 Zeek がこれを提供するための To Do リストに載っています。
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/ジーク/ビン
./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 ギガバイトのメモリを使用します。
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
オプションのファイルビート モジュール
私自身、システム、iptables、apache モジュールも有効にしています。これらは追加情報を提供するからです。ただし、任意のモジュールを有効にすることができます。
利用可能なモジュールのリストを表示するには、次のようにします。
ls /etc/filebeat/modules.d
そして、次のようなものが表示されます。
拡張子が .disabled のモジュールは使用されていません。
iptables モジュールの場合、監視するログ ファイルのパスを指定する必要があります。 Ubuntu iptables では、syslog ではなく kern.log にログが記録されるため、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 モジュールを使用するには、netflow データを filebeat に取得するために fprobe をインストールして構成する必要があります。
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 fprobefilebeat を構成し、必要なパイプラインとダッシュボードをロードしたら、filebeat の出力を elasticsearch から logstash に変更します。
nano /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
auto 設定を使用することもできますが、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"
}
}
}これにより、パイプラインの出力が localhost の Elasticsearch に送信されます。出力は、Logstash パイプラインを通過するイベントのタイムスタンプに基づいて、毎日のインデックスに送信されます。
Kibana 構成
Kibana は、suricata アラートを視覚化するために使用できる ELK Web フロントエンドです。
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 を実行する場合
Web サーバーのルートまたは独自のサブディレクトリで kibana を実行する 2 つのオプションがあります。独自のサブディレクトリでキバナを実行する方が理にかなっています。 2つの異なるオプションを提供します。もちろん、Apache2 の代わりに Nginx を使用することもできます。
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 apache2Nginx プロキシの背後で 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 設定
Elasticsearch の 1 つのインスタンスを実行する場合、ステータスを緑色にするためにレプリカとシャードの数を設定する必要があります。そうしないと、すべてのステータスが黄色のままになります。
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 が 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 の出力をログスタッシュ インスタンスに向けることでした。これにより、セットアップにインスタンスを追加できるようになりました。
Zeek ダッシュボード:
以下は、私が自分で有効にしたオプション モジュールのダッシュボードです。
アパッチ2:
IP テーブル:
ネットフロー:
もちろん、いつでも独自のダッシュボードと開始ページを Kibana で作成できます。このハウツーではこれについて説明しません。
備考と質問
フォーラムを使用して、意見を述べたり、質問をしたりしてください。
私はトピックを作成し、購読しているので、返信したり、新しい投稿の通知を受け取ることができます。