SuricataとZeek(以前のBro)について、そして両方がネットワークセキュリティをどのように改善できるかについて多くの話がありました。
では、どちらをデプロイする必要がありますか?簡単な答えは両方です。長い答えはここにあります。
この(長い)チュートリアルでは、Elasticsearch Logstash Kibana(ELK)スタックとともにUbuntu 20.10(Groovy Gorilla)サーバーにSuricata、Zeek、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-update
次に、suricata-updateをインストールして、suricataルールを更新およびダウンロードします。
apt install python3-pip
pip3 install pyyaml
pip3 install https://github.com/OISF/suricata-update/archive/master.zip
suricata-update runをアップグレードするには:
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のデフォルトの操作は、EmergingThreatsOpenルールセットを使用することです。
suricata-update
このコマンドは次のようになります:
パスでsuricataプログラムを探して、そのバージョンを確認してください。
/etc/suricata/enable.conf、/etc/suricata/disable.conf、/etc/suricata/drop.conf、および/etc/suricata/modify.confを探して、ダウンロードしたルールに適用するフィルターを探します。ファイルはオプションであり、存在する必要はありません。
ご使用のバージョンのSuricata用のEmergingThreatsOpenルールセットをダウンロードします。見つからない場合はデフォルトで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つの方法は、-SSuricataコマンドラインオプションを使用することです。もう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 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
次に、Zeekによって無視されるように$HOMEネットワークを定義します。
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にはsystemctlStart/ Stop構成が付属していないため、作成する必要があります。これを提供するのはZeekのToDoリストにあります。
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 = [email protected] => change this to the email address you want to use.
これで、Zeekを展開する準備が整いました。
zeekctlは、Zeekを開始/停止/インストール/デプロイするために使用されます。
zeekctlでdeployと入力すると、zeekがインストールされ(構成がチェックされ)、開始されます。
ただし、 deployを使用する場合 コマンドsystemctlstatus zeek 何も与えないので、インストールを発行します 構成のみをチェックするコマンド。
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ギガバイトのメモリを使用します。
nano /etc/elasticsearch/jvm.options
nano /etc/default/elasticsearch
また、512 mByteのメモリ制限に設定しますが、非常に遅くなり、多くのエラーが発生する可能性があるため、これは実際にはお勧めしません。
ES_JAVA_OPTS="-Xms512m -Xmx512m"
logstashがログファイルを読み取れることを確認してください
usermod -a -G adm logstash
mutateプラグインにバグがあるため、バグ修正をインストールするには、最初にプラグインを更新する必要があります。ただし、プラグインを時々更新することをお勧めします。バグ修正を取得するだけでなく、新しい機能を取得するためにも。
/usr/share/logstash/bin/logstash-plugin update
Filebeat config
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 fprobe
filebeatを構成した後、パイプラインとダッシュボードをロードし、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
自動設定を使用することもできますが、elasticsearchがさまざまなユーザーのパスワードを決定します。
まず、logstashのファイルビート入力を作成します。
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は、suricataアラートを視覚化するために使用できるELKWebフロントエンドです。
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つのオプションがあります。独自のサブディレクトリでkibanaを実行する方が理にかなっています。私はあなたに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 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設定
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にログインして、DevToolsに移動します。
Kibanaの構成方法(Apache2リバースプロキシかどうか)に応じて、オプションは次のようになります。
http:// localhost:5601
http://yourdomain.tld:5601
http://yourdomain.tld(Apache2リバースプロキシ)
http://yourdomain.tld/kibana(Apache2リバースプロキシで、サブディレクトリkibanaを使用しました)
もちろん、セキュリティを強化するために、Apache2をSSLで構成しておくことをお勧めします。
左上のメニューボタンをクリックし、開発ツールが表示されるまで下にスクロールします
左の列に以下を貼り付けて、再生ボタンをクリックします。
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 filebeat
Suricataダッシュボード:
この印刷画面でわかるように、私の場合、トップホストは複数のサイトを表示します。
私が行ったのは、他のマシンにもfilebeat、suricata、zeekをインストールし、filebeatの出力をlogstashインスタンスにポイントしたため、セットアップにインスタンスを追加できるようになりました。
Zeekダッシュボード:
以下は、自分で有効にしたオプションモジュールのダッシュボードです。
Apache2:
IPTables:
Netflow:
もちろん、Kibanaでいつでも独自のダッシュボードとスタートページを作成できます。このハウツーではこれについては説明しません。
フォーラムを使用して、コメントや質問をしてください。
トピックを作成してサブスクライブしているので、回答して新しい投稿の通知を受け取ることができます。
https://www.howtoforge.com/community/threads/suricata-and-zeek-ids-with-elk-on-ubuntu-20-10.86570/