GNU/Linux >> Linux の 問題 >  >> Ubuntu

Ubuntu20.10にELKを使用してSuricataおよびZeekIDSをインストールする方法

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の構成

まず、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
Kibanaからの出力例

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/


Ubuntu
  1. Ubuntu18.04または20.04にPHP7.4および8.0をインストールする方法

  2. Ubuntu11.10にPHP5とMySQLを使用してNginxをインストールする方法

  3. Ubuntu20.04にSuricataIDSをインストールしてセットアップする方法

  1. Ubuntu18.04および20.04にAnacondaをインストールする方法

  2. Ubuntu18.04でApacheを使用してNextcloudをインストールおよび構成する方法

  3. Ubuntu18.04でApacheを使用してphpMyAdminをインストールして保護する方法

  1. Ubuntu18.04でApacheを使用してownCloudをインストールおよび構成する方法

  2. Ubuntu18.04とDebianにEasyEngineでWordPressをインストールする方法

  3. Ubuntu16.04にPostgreSQLとNginxを使用してMattermostをインストールする方法