diff --git a/.dockerignore b/.dockerignore
index 0da9ab921..b63f0cdfa 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -29,6 +29,7 @@ arkime-raw
kubernetes
malcolm-iso
sensor-iso
+sensor-raspi
nginx/nginx_ldap*.conf
pcap
_site
diff --git a/.github/workflows/api-build-and-push-ghcr.yml b/.github/workflows/api-build-and-push-ghcr.yml
index dacbb7a4f..2b0113e20 100644
--- a/.github/workflows/api-build-and-push-ghcr.yml
+++ b/.github/workflows/api-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/arkime-build-and-push-ghcr.yml b/.github/workflows/arkime-build-and-push-ghcr.yml
index c847c9995..c8d174d16 100644
--- a/.github/workflows/arkime-build-and-push-ghcr.yml
+++ b/.github/workflows/arkime-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
deleted file mode 100644
index b893f6782..000000000
--- a/.github/workflows/codeql.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: "CodeQL"
-
-on:
- push:
- branches: [ "main" ]
- pull_request:
- branches: [ "main" ]
- schedule:
- - cron: "5 17 * * 5"
-
-jobs:
- analyze:
- name: Analyze
- runs-on: ubuntu-latest
- permissions:
- actions: read
- contents: read
- security-events: write
-
- strategy:
- fail-fast: false
- matrix:
- language: [ javascript, python ]
-
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v2
- with:
- languages: ${{ matrix.language }}
- queries: +security-and-quality
-
- - name: Autobuild
- uses: github/codeql-action/autobuild@v2
- if: ${{ matrix.language == 'javascript' || matrix.language == 'python' }}
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
- with:
- category: "/language:${{ matrix.language }}"
diff --git a/.github/workflows/dashboards-build-and-push-ghcr.yml b/.github/workflows/dashboards-build-and-push-ghcr.yml
index ada149096..f9f1e39a6 100644
--- a/.github/workflows/dashboards-build-and-push-ghcr.yml
+++ b/.github/workflows/dashboards-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/dashboards-helper-build-and-push-ghcr.yml b/.github/workflows/dashboards-helper-build-and-push-ghcr.yml
index 1ec639dcb..4ca3c2d8a 100644
--- a/.github/workflows/dashboards-helper-build-and-push-ghcr.yml
+++ b/.github/workflows/dashboards-helper-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/dirinit-build-and-push-ghcr.yml b/.github/workflows/dirinit-build-and-push-ghcr.yml
index db9b8bdd3..9abe1a7f4 100644
--- a/.github/workflows/dirinit-build-and-push-ghcr.yml
+++ b/.github/workflows/dirinit-build-and-push-ghcr.yml
@@ -49,7 +49,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/file-monitor-build-and-push-ghcr.yml b/.github/workflows/file-monitor-build-and-push-ghcr.yml
index 10c6885da..c5fecc8a5 100644
--- a/.github/workflows/file-monitor-build-and-push-ghcr.yml
+++ b/.github/workflows/file-monitor-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/file-upload-build-and-push-ghcr.yml b/.github/workflows/file-upload-build-and-push-ghcr.yml
index 6228bfa20..be51b63ef 100644
--- a/.github/workflows/file-upload-build-and-push-ghcr.yml
+++ b/.github/workflows/file-upload-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/filebeat-build-and-push-ghcr.yml b/.github/workflows/filebeat-build-and-push-ghcr.yml
index 5d67fd099..884b91364 100644
--- a/.github/workflows/filebeat-build-and-push-ghcr.yml
+++ b/.github/workflows/filebeat-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/freq-build-and-push-ghcr.yml b/.github/workflows/freq-build-and-push-ghcr.yml
index a6411ca25..314182cde 100644
--- a/.github/workflows/freq-build-and-push-ghcr.yml
+++ b/.github/workflows/freq-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/htadmin-build-and-push-ghcr.yml b/.github/workflows/htadmin-build-and-push-ghcr.yml
index 954d245aa..0b9db5e1f 100644
--- a/.github/workflows/htadmin-build-and-push-ghcr.yml
+++ b/.github/workflows/htadmin-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/logstash-build-and-push-ghcr.yml b/.github/workflows/logstash-build-and-push-ghcr.yml
index 19ae8e43e..030dbd394 100644
--- a/.github/workflows/logstash-build-and-push-ghcr.yml
+++ b/.github/workflows/logstash-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/malcolm-iso-build-docker-wrap-push-ghcr.yml b/.github/workflows/malcolm-iso-build-docker-wrap-push-ghcr.yml
index 488575fe8..cf6486a42 100644
--- a/.github/workflows/malcolm-iso-build-docker-wrap-push-ghcr.yml
+++ b/.github/workflows/malcolm-iso-build-docker-wrap-push-ghcr.yml
@@ -92,12 +92,12 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Build image
run: |
- IMAGES=( $(grep image: docker-compose.yml | awk '{print $2}' | sort -u) )
+ IMAGES=( $(grep image: docker-compose-dev.yml | awk '{print $2}' | sort -u) )
for IMAGE in "${IMAGES[@]}"; do
REPO_IMAGE="$(echo "$IMAGE" | sed "s@^.*\(malcolm\)@ghcr.io/${{ github.repository_owner }}/\1@" | sed "s/:.*/:${{ steps.extract_branch.outputs.branch }}/")"
docker pull "$REPO_IMAGE" && \
diff --git a/.github/workflows/netbox-build-and-push-ghcr.yml b/.github/workflows/netbox-build-and-push-ghcr.yml
index c59567995..aa2ca78d1 100644
--- a/.github/workflows/netbox-build-and-push-ghcr.yml
+++ b/.github/workflows/netbox-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/nginx-build-and-push-ghcr.yml b/.github/workflows/nginx-build-and-push-ghcr.yml
index 06f028768..2343e6f31 100644
--- a/.github/workflows/nginx-build-and-push-ghcr.yml
+++ b/.github/workflows/nginx-build-and-push-ghcr.yml
@@ -64,7 +64,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/opensearch-build-and-push-ghcr.yml b/.github/workflows/opensearch-build-and-push-ghcr.yml
index 8a0083bad..c12913a79 100644
--- a/.github/workflows/opensearch-build-and-push-ghcr.yml
+++ b/.github/workflows/opensearch-build-and-push-ghcr.yml
@@ -56,7 +56,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/pcap-capture-build-and-push-ghcr.yml b/.github/workflows/pcap-capture-build-and-push-ghcr.yml
index 332d0b560..e0cfe4d7d 100644
--- a/.github/workflows/pcap-capture-build-and-push-ghcr.yml
+++ b/.github/workflows/pcap-capture-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/pcap-monitor-build-and-push-ghcr.yml b/.github/workflows/pcap-monitor-build-and-push-ghcr.yml
index 385ec4fec..f8bdc2c33 100644
--- a/.github/workflows/pcap-monitor-build-and-push-ghcr.yml
+++ b/.github/workflows/pcap-monitor-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/postgresql-build-and-push-ghcr.yml b/.github/workflows/postgresql-build-and-push-ghcr.yml
index c90fd8b64..dd3908422 100644
--- a/.github/workflows/postgresql-build-and-push-ghcr.yml
+++ b/.github/workflows/postgresql-build-and-push-ghcr.yml
@@ -56,7 +56,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/redis-build-and-push-ghcr.yml b/.github/workflows/redis-build-and-push-ghcr.yml
index 921e11c91..881531576 100644
--- a/.github/workflows/redis-build-and-push-ghcr.yml
+++ b/.github/workflows/redis-build-and-push-ghcr.yml
@@ -56,7 +56,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/sensor-iso-build-docker-wrap-push-ghcr.yml b/.github/workflows/sensor-iso-build-docker-wrap-push-ghcr.yml
index aade513c9..14fe12261 100644
--- a/.github/workflows/sensor-iso-build-docker-wrap-push-ghcr.yml
+++ b/.github/workflows/sensor-iso-build-docker-wrap-push-ghcr.yml
@@ -88,7 +88,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Build image
diff --git a/.github/workflows/sensor-raspi-build-docker-wrap-push-ghcr.yml b/.github/workflows/sensor-raspi-build-docker-wrap-push-ghcr.yml
new file mode 100644
index 000000000..0d5faee04
--- /dev/null
+++ b/.github/workflows/sensor-raspi-build-docker-wrap-push-ghcr.yml
@@ -0,0 +1,102 @@
+name: sensor-raspi-build-docker-wrap-push-ghcr
+
+on:
+ # push:
+ # branches:
+ # - main
+ # - development
+ # paths:
+ # - '.trigger_raspi_workflow_build'
+ workflow_dispatch:
+ # repository_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-22.04
+ permissions:
+ actions: write
+ packages: write
+ contents: read
+ security-events: write
+ defaults:
+ run:
+ shell: bash
+ steps:
+ -
+ name: Cancel previous run in progress
+ uses: styfle/cancel-workflow-action@0.12.0
+ with:
+ ignore_sha: true
+ all_but_latest: true
+ access_token: ${{ secrets.GITHUB_TOKEN }}
+ -
+ name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ -
+ name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ with:
+ driver-opts: |
+ image=moby/buildkit:master
+ -
+ name: Build environment setup
+ run: |
+ sudo apt-get -q update
+ sudo env DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y -q \
+ binfmt-support \
+ bmap-tools \
+ ca-certificates \
+ debootstrap \
+ dosfstools \
+ kpartx \
+ python3 \
+ qemu-user-static \
+ qemu-utils \
+ time \
+ vmdb2 \
+ zerofree
+ -
+ name: Checkout
+ uses: actions/checkout@v4
+ -
+ name: Extract branch name
+ shell: bash
+ run: echo "branch=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT
+ id: extract_branch
+ -
+ name: Extract commit SHA
+ shell: bash
+ run: echo "sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
+ id: extract_commit_sha
+ -
+ name: Extract Malcolm version
+ shell: bash
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ id: extract_malcolm_version
+ -
+ name: Build image
+ run: |
+ pushd ./sensor-raspi
+ mkdir -p ./shared
+ echo "${{ steps.extract_malcolm_version.outputs.mversion }}" > ./shared/version.txt
+ echo "${{ secrets.MAXMIND_GEOIP_DB_LICENSE_KEY }}" > ./shared/maxmind_license.txt
+ echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" > ./shared/environment.chroot
+ echo "VCS_REVSION=${{ steps.extract_commit_sha.outputs.sha }}" > ./shared/environment.chroot
+ echo "BUILD_JOBS=2" > ./shared/environment.chroot
+ sudo make raspi_4_bookworm.img
+ sudo chmod 644 ./raspi_4_bookworm*.*
+ popd
+ -
+ name: ghcr.io login
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.repository_owner }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ -
+ name: Build and push IMG image
+ uses: docker/build-push-action@v5
+ with:
+ context: ./sensor-raspi
+ push: true
+ tags: ghcr.io/${{ github.repository_owner }}/malcolm/hedgehog-raspi:${{ steps.extract_branch.outputs.branch }}
diff --git a/.github/workflows/suricata-build-and-push-ghcr.yml b/.github/workflows/suricata-build-and-push-ghcr.yml
index 2d9da5d1e..2b467e0db 100644
--- a/.github/workflows/suricata-build-and-push-ghcr.yml
+++ b/.github/workflows/suricata-build-and-push-ghcr.yml
@@ -57,7 +57,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.github/workflows/zeek-build-and-push-ghcr.yml b/.github/workflows/zeek-build-and-push-ghcr.yml
index 27f6e05db..dd6c44935 100644
--- a/.github/workflows/zeek-build-and-push-ghcr.yml
+++ b/.github/workflows/zeek-build-and-push-ghcr.yml
@@ -56,7 +56,7 @@ jobs:
-
name: Extract Malcolm version
shell: bash
- run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
+ run: echo "mversion=$(grep -P "^\s+image:.*/malcolm/" docker-compose-dev.yml | awk '{print $2}' | cut -d':' -f2 | uniq -c | sort -nr | awk '{print $2}' | head -n 1)" >> $GITHUB_OUTPUT
id: extract_malcolm_version
-
name: Set up QEMU
diff --git a/.gitignore b/.gitignore
index c47bd8a97..eadc2e2ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,10 +28,12 @@ config.*/
.envrc
.direnv
.vagrant
+.fuse_*
malcolm_*images.tar.gz
malcolm_*images.tar.xz
malcolm_netbox_backup_*.gz
*.iso
+*.img
*-build.log
Gemfile.lock
_site
diff --git a/.trigger_iso_workflow_build b/.trigger_iso_workflow_build
index bf8dee067..7d921ebb8 100644
--- a/.trigger_iso_workflow_build
+++ b/.trigger_iso_workflow_build
@@ -1,2 +1,2 @@
# this file exists solely for the purpose of being updated and seen by github to trigger a commit build action
-2
\ No newline at end of file
+3
\ No newline at end of file
diff --git a/Dockerfiles/arkime.Dockerfile b/Dockerfiles/arkime.Dockerfile
index b43c5310c..1c11505b1 100644
--- a/Dockerfiles/arkime.Dockerfile
+++ b/Dockerfiles/arkime.Dockerfile
@@ -7,7 +7,7 @@ ENV TERM xterm
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
-ENV ARKIME_VERSION "v4.6.0"
+ENV ARKIME_VERSION "v5.0.0"
ENV ARKIME_DIR "/opt/arkime"
ENV ARKIME_URL "https://github.com/arkime/arkime.git"
ENV ARKIME_LOCALELASTICSEARCH no
@@ -49,6 +49,7 @@ RUN apt-get -q update && \
python3-pip \
python3-setuptools \
python3-wheel \
+ re2c \
sudo \
swig \
wget \
@@ -57,7 +58,7 @@ RUN apt-get -q update && \
cd /opt && \
git clone --recurse-submodules --branch="$ARKIME_VERSION" "$ARKIME_URL" "./arkime-"$ARKIME_VERSION && \
cd "./arkime-"$ARKIME_VERSION && \
- bash -c 'for i in /opt/patches/*; do patch -p 1 -r - --no-backup-if-mismatch < $i || true; done' && \
+ bash -c 'for i in /opt/patches/*.patch; do patch -p 1 -r - --no-backup-if-mismatch < $i || true; done' && \
export PATH="$ARKIME_DIR/bin:${PATH}" && \
ln -sfr $ARKIME_DIR/bin/npm /usr/local/bin/npm && \
ln -sfr $ARKIME_DIR/bin/node /usr/local/bin/node && \
@@ -69,7 +70,6 @@ RUN apt-get -q update && \
sed -i "s/^\(ARKIME_LOCALELASTICSEARCH=\).*/\1"$ARKIME_LOCALELASTICSEARCH"/" ./release/Configure && \
sed -i "s/^\(ARKIME_INET=\).*/\1"$ARKIME_INET"/" ./release/Configure && \
./easybutton-build.sh && \
- npm -g config set user root && \
make install && \
npm cache clean --force && \
rm -f ${ARKIME_DIR}/wiseService/source.* ${ARKIME_DIR}/etc/*.systemd.service && \
diff --git a/Dockerfiles/dirinit.Dockerfile b/Dockerfiles/dirinit.Dockerfile
index 1b3cfd1d1..978ad6565 100644
--- a/Dockerfiles/dirinit.Dockerfile
+++ b/Dockerfiles/dirinit.Dockerfile
@@ -6,7 +6,7 @@ LABEL org.opencontainers.image.authors='malcolm@inl.gov'
LABEL org.opencontainers.image.url='https://github.com/cisagov/Malcolm'
LABEL org.opencontainers.image.documentation='https://github.com/cisagov/Malcolm/blob/main/README.md'
LABEL org.opencontainers.image.source='https://github.com/cisagov/Malcolm'
-LABEL org.opencontainers.image.vendor='Idaho National Laboratory'
+LABEL org.opencontainers.image.vendor='Cybersecurity and Infrastructure Security Agency'
LABEL org.opencontainers.image.title='ghcr.io/cisagov/malcolm/dirinit'
LABEL org.opencontainers.image.description='Sidecar container that ensures the creation of some volume subdirectories and does nothing else'
diff --git a/Dockerfiles/file-monitor.Dockerfile b/Dockerfiles/file-monitor.Dockerfile
index dad767400..f3992d895 100644
--- a/Dockerfiles/file-monitor.Dockerfile
+++ b/Dockerfiles/file-monitor.Dockerfile
@@ -80,14 +80,15 @@ ENV EXTRACTED_FILE_ENABLE_CAPA $EXTRACTED_FILE_ENABLE_CAPA
ENV EXTRACTED_FILE_CAPA_VERBOSE $EXTRACTED_FILE_CAPA_VERBOSE
ENV SRC_BASE_DIR "/usr/local/src"
ENV CLAMAV_RULES_DIR "/var/lib/clamav"
-ENV YARA_VERSION "4.3.2"
+ENV YARA_VERSION "4.5.0"
ENV YARA_URL "https://github.com/VirusTotal/yara/archive/v${YARA_VERSION}.tar.gz"
ENV YARA_RULES_SRC_DIR "/yara-rules-src"
ENV YARA_RULES_DIR "/yara-rules"
-ENV CAPA_VERSION "6.1.0"
+ENV CAPA_VERSION "7.0.1"
ENV CAPA_URL "https://github.com/fireeye/capa/releases/download/v${CAPA_VERSION}/capa-v${CAPA_VERSION}-linux.zip"
ENV CAPA_DIR "/opt/capa"
ENV CAPA_BIN "${CAPA_DIR}/capa"
+ENV EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR "/opt/assets"
ENV EXTRACTED_FILE_HTTP_SERVER_DEBUG $EXTRACTED_FILE_HTTP_SERVER_DEBUG
ENV EXTRACTED_FILE_HTTP_SERVER_ENABLE $EXTRACTED_FILE_HTTP_SERVER_ENABLE
ENV EXTRACTED_FILE_HTTP_SERVER_ZIP $EXTRACTED_FILE_HTTP_SERVER_ZIP
@@ -141,6 +142,7 @@ RUN sed -i "s/main$/main contrib non-free/g" /etc/apt/sources.list.d/debian.sour
rsync && \
python3 -m pip install --break-system-packages --no-compile --no-cache-dir \
clamd \
+ dominate \
psutil \
pycryptodome \
python-magic \
@@ -153,7 +155,7 @@ RUN sed -i "s/main$/main contrib non-free/g" /etc/apt/sources.list.d/debian.sour
chmod +x "$SUPERCRONIC" && \
mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" && \
ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic && \
- mkdir -p "${SRC_BASE_DIR}" "${YARA_RULES_DIR}" "${YARA_RULES_SRC_DIR}" && \
+ mkdir -p "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}" "${SRC_BASE_DIR}" "${YARA_RULES_DIR}" "${YARA_RULES_SRC_DIR}" && \
cd "${SRC_BASE_DIR}" && \
curl -sSL "${YARA_URL}" | tar xzf - -C "${SRC_BASE_DIR}" && \
cd "./yara-${YARA_VERSION}" && \
@@ -214,10 +216,29 @@ RUN sed -i "s/main$/main contrib non-free/g" /etc/apt/sources.list.d/debian.sour
ln -r -s /usr/local/bin/zeek_carve_scanner.py /usr/local/bin/capa_scan.py && \
echo "0 */6 * * * /bin/bash /usr/local/bin/capa-update.sh\n0 */6 * * * /usr/local/bin/yara_rules_setup.sh -r \"${YARA_RULES_SRC_DIR}\" -y \"${YARA_RULES_DIR}\"" > ${SUPERCRONIC_CRONTAB}
+USER ${PUSER}
+
+RUN /usr/bin/freshclam freshclam --config-file=/etc/clamav/freshclam.conf
+
+USER root
+
+ADD nginx/landingpage/css "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css"
+ADD nginx/landingpage/js "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/js"
+ADD --chmod=644 docs/images/logo/Malcolm_background.png "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/assets/img/bg-masthead.png"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI9w2_Gwfo.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6u8w4BMUTPHjxsAXC-v.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI5wq_Gwfo.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh7USSwiPHA.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjx4wWw.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVSwiPHA.ttf "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/"
+ADD --chmod=644 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/fonts/bootstrap-icons.woff2?856008caa5eb66df68595e734e59580d' "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/bootstrap-icons.woff2"
+ADD --chmod=644 'https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/fonts/bootstrap-icons.woff?856008caa5eb66df68595e734e59580d' "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/css/bootstrap-icons.woff"
+
+COPY --chmod=644 docs/images/icon/favicon.ico "${EXTRACTED_FILE_HTTP_SERVER_ASSETS_DIR}/favicon.ico"
COPY --chmod=755 shared/bin/docker-uid-gid-setup.sh /usr/local/bin/
COPY --chmod=755 shared/bin/service_check_passthrough.sh /usr/local/bin/
COPY --chmod=755 shared/bin/zeek_carve*.py /usr/local/bin/
-COPY --chmod=755 shared/bin/extracted_files_http_server.py /usr/local/bin/
+COPY --chmod=755 file-monitor/scripts/*.py /usr/local/bin/
COPY --chmod=644 shared/bin/watch_common.py /usr/local/bin/
COPY --chmod=644 scripts/malcolm_utils.py /usr/local/bin/
COPY --chmod=644 file-monitor/supervisord.conf /etc/supervisord.conf
@@ -225,12 +246,6 @@ COPY --chmod=755 file-monitor/docker-entrypoint.sh /docker-entrypoint.sh
COPY --chmod=755 file-monitor/*update.sh /usr/local/bin/
COPY --from=ghcr.io/mmguero-dev/gostatic --chmod=755 /goStatic /usr/bin/goStatic
-USER ${PUSER}
-
-RUN /usr/bin/freshclam freshclam --config-file=/etc/clamav/freshclam.conf
-
-USER root
-
WORKDIR /zeek/extract_files
ENV PATH "${CAPA_DIR}:${PATH}"
diff --git a/Dockerfiles/filebeat.Dockerfile b/Dockerfiles/filebeat.Dockerfile
index 06c8b3a7d..46452ed8c 100644
--- a/Dockerfiles/filebeat.Dockerfile
+++ b/Dockerfiles/filebeat.Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.elastic.co/beats/filebeat-oss:8.11.4
+FROM docker.elastic.co/beats/filebeat-oss:8.12.1
# Copyright (c) 2024 Battelle Energy Alliance, LLC. All rights reserved.
LABEL maintainer="malcolm@inl.gov"
diff --git a/Dockerfiles/logstash.Dockerfile b/Dockerfiles/logstash.Dockerfile
index 6fcdc1512..845821b02 100644
--- a/Dockerfiles/logstash.Dockerfile
+++ b/Dockerfiles/logstash.Dockerfile
@@ -1,4 +1,4 @@
-FROM docker.elastic.co/logstash/logstash-oss:8.11.4
+FROM docker.elastic.co/logstash/logstash-oss:8.12.1
LABEL maintainer="malcolm@inl.gov"
LABEL org.opencontainers.image.authors='malcolm@inl.gov'
diff --git a/Dockerfiles/nginx.Dockerfile b/Dockerfiles/nginx.Dockerfile
index d854a768c..a5dff5bad 100644
--- a/Dockerfiles/nginx.Dockerfile
+++ b/Dockerfiles/nginx.Dockerfile
@@ -4,7 +4,6 @@
# thanks to: nginx - https://github.com/nginxinc/docker-nginx/blob/master/mainline/alpine/Dockerfile
# kvspb/nginx-auth-ldap - https://github.com/kvspb/nginx-auth-ldap
# tiredofit/docker-nginx-ldap - https://github.com/tiredofit/docker-nginx-ldap/blob/master/Dockerfile
-# jwilder/nginx-proxy - https://github.com/jwilder/nginx-proxy/blob/master/Dockerfile.alpine
####################################################################################
@@ -101,8 +100,6 @@ ADD https://opensearch.org/assets/brand/SVG/Logo/opensearch_logo_default.svg /us
ADD https://opensearch.org/assets/brand/SVG/Logo/opensearch_logo_darkmode.svg /usr/share/nginx/html/assets/img/
ADD https://opensearch.org/assets/brand/SVG/Mark/opensearch_mark_default.svg /usr/share/nginx/html/assets/img/
ADD https://opensearch.org/assets/brand/SVG/Mark/opensearch_mark_darkmode.svg /usr/share/nginx/html/assets/img/
-ADD https://raw.githubusercontent.com/arkime/arkime/main/assets/Arkime_Logo_FullGradientBlack.svg /usr/share/nginx/html/assets/img/
-ADD https://raw.githubusercontent.com/arkime/arkime/main/assets/Arkime_Logo_FullGradientWhite.svg /usr/share/nginx/html/assets/img/
ADD https://raw.githubusercontent.com/gchq/CyberChef/master/src/web/static/images/logo/cyberchef.svg /usr/share/nginx/html/assets/img/
ADD https://raw.githubusercontent.com/netbox-community/netbox/develop/netbox/project-static/img/netbox_icon.svg /usr/share/nginx/html/assets/img/
ADD https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI9w2_Gwfo.ttf /usr/share/nginx/html/css/
@@ -201,7 +198,7 @@ RUN set -x ; \
make -j$(getconf _NPROCESSORS_ONLN) ; \
make install ; \
rm -rf /etc/nginx/html/ ; \
- mkdir -p /etc/nginx/conf.d/ /etc/nginx/auth/ /usr/share/nginx/html/ ; \
+ mkdir -p /etc/nginx/conf.d/ /etc/nginx/templates/ /etc/nginx/auth/ /usr/share/nginx/html/ ; \
install -m644 html/50x.html /usr/share/nginx/html/ ; \
install -m755 objs/nginx-debug /usr/sbin/nginx-debug ; \
install -m755 objs/ngx_http_xslt_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_xslt_filter_module-debug.so ; \
@@ -227,7 +224,7 @@ RUN set -x ; \
| xargs -r apk info --installed \
| sort -u \
)" ; \
- apk add --no-cache --virtual .nginx-rundeps $runDeps ca-certificates bash wget openssl apache2-utils openldap shadow stunnel supervisor tini tzdata; \
+ apk add --no-cache --virtual .nginx-rundeps $runDeps ca-certificates bash jq wget openssl apache2-utils openldap shadow stunnel supervisor tini tzdata; \
update-ca-certificates; \
apk del .nginx-build-deps ; \
apk del .gettext ; \
@@ -237,17 +234,16 @@ RUN set -x ; \
find /usr/share/nginx/html/ -type d -exec chmod 755 "{}" \; && \
find /usr/share/nginx/html/ -type f -exec chmod 644 "{}" \;
-COPY --from=jwilder/nginx-proxy:alpine /app/nginx.tmpl /etc/nginx/
-COPY --from=jwilder/nginx-proxy:alpine /etc/nginx/network_internal.conf /etc/nginx/
-COPY --from=jwilder/nginx-proxy:alpine /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/
COPY --from=docbuild /site/_site /usr/share/nginx/html/readme
ADD nginx/landingpage /usr/share/nginx/html
COPY --chmod=755 shared/bin/docker-uid-gid-setup.sh /usr/local/bin/
ADD nginx/scripts /usr/local/bin/
ADD nginx/*.conf /etc/nginx/
+ADD nginx/templates /etc/nginx/templates/
ADD nginx/supervisord.conf /etc/
COPY --chmod=644 docs/images/icon/favicon.ico /usr/share/nginx/html/assets/favicon.ico
+COPY --chmod=644 docs/images/icon/favicon.ico /usr/share/nginx/html/favicon.ico
COPY --chmod=644 docs/images/logo/Malcolm_background.png /usr/share/nginx/html/assets/img/bg-masthead.png
VOLUME ["/etc/nginx/certs", "/etc/nginx/dhparam"]
diff --git a/Dockerfiles/zeek.Dockerfile b/Dockerfiles/zeek.Dockerfile
index 90dbbcd22..d31fc814d 100644
--- a/Dockerfiles/zeek.Dockerfile
+++ b/Dockerfiles/zeek.Dockerfile
@@ -1,65 +1,3 @@
-FROM debian:12-slim as build
-
-ENV DEBIAN_FRONTEND noninteractive
-ENV TERM xterm
-
-# for build
-ARG ZEEK_VERSION=6.1.0
-ENV ZEEK_VERSION $ZEEK_VERSION
-ARG ZEEK_DBG=0
-ENV ZEEK_DBG $ZEEK_DBG
-ARG BUILD_JOBS=4
-ENV BUILD_JOBS $BUILD_JOBS
-ENV CCACHE_DIR "/var/spool/ccache"
-ENV CCACHE_COMPRESS 1
-ENV CMAKE_C_COMPILER clang-14
-ENV CMAKE_CXX_COMPILER clang++-14
-ENV CXXFLAGS "-stdlib=libc++ -lc++abi"
-ENV PYTHONDONTWRITEBYTECODE 1
-ENV PYTHONUNBUFFERED 1
-
-RUN apt-get -q update && \
- apt-get -y -q --no-install-recommends upgrade && \
- apt-get install -q -y --no-install-recommends \
- bison \
- ca-certificates \
- ccache \
- clang \
- cmake \
- curl \
- flex \
- git \
- libc++-dev \
- libc++abi-dev \
- libfl-dev \
- libgoogle-perftools-dev \
- libgoogle-perftools4 \
- libkrb5-3 \
- libkrb5-dev \
- libmaxminddb-dev \
- libpcap-dev \
- libssl-dev \
- libtcmalloc-minimal4 \
- make \
- ninja-build \
- python3 \
- python3-dev \
- python3-git \
- python3-semantic-version \
- sudo \
- swig \
- zlib1g-dev && \
- mkdir -p /usr/share/src/zeek "${CCACHE_DIR}" && \
- cd /usr/share/src && \
- ( curl -sSL "https://download.zeek.org/zeek-${ZEEK_VERSION}.tar.gz" | tar xzf - -C ./zeek --strip-components 1 ) && \
- cd /usr/share/src/zeek && \
- [ "$ZEEK_DBG" = "1" ] && \
- ./configure --prefix=/opt/zeek --generator=Ninja --ccache --enable-perftools --enable-debug || \
- ./configure --prefix=/opt/zeek --generator=Ninja --ccache --enable-perftools && \
- ninja -C build -j "${BUILD_JOBS}" && \
- cd ./build && \
- cpack -G DEB
-
FROM debian:12-slim
# Copyright (c) 2024 Battelle Energy Alliance, LLC. All rights reserved.
@@ -100,7 +38,7 @@ ENV SUPERCRONIC_SHA1SUM "cd48d45c4b10f3f0bfdd3a57d054cd05ac96812b"
ENV SUPERCRONIC_CRONTAB "/etc/crontab"
# for download and install
-ARG ZEEK_VERSION=6.1.0
+ARG ZEEK_VERSION=6.1.1-0
ENV ZEEK_VERSION $ZEEK_VERSION
# put Zeek and Spicy in PATH
@@ -110,13 +48,9 @@ ENV PATH "${ZEEK_DIR}/bin:${PATH}"
# for build
ENV CCACHE_DIR "/var/spool/ccache"
ENV CCACHE_COMPRESS 1
-ENV CMAKE_C_COMPILER clang-14
-ENV CMAKE_CXX_COMPILER clang++-14
-ENV CXXFLAGS "-stdlib=libc++ -lc++abi"
-
-COPY --from=build /usr/share/src/zeek/build/*.deb /tmp/zeekdebs/
-# add script for building 3rd-party plugins
+# add script for downloading zeek and building 3rd-party plugins
+ADD shared/bin/zeek-deb-download.sh /usr/local/bin/
ADD shared/bin/zeek_install_plugins.sh /usr/local/bin/
# build and install system packages, zeek, spicy and plugins
@@ -129,19 +63,18 @@ RUN export DEBARCH=$(dpkg --print-architecture) && \
bison \
ca-certificates \
ccache \
- clang \
cmake \
curl \
file \
flex \
+ g++ \
+ gcc \
git \
gnupg2 \
iproute2 \
jq \
less \
libatomic1 \
- libc++-dev \
- libc++abi-dev \
libcap2-bin \
libfl-dev \
libfl2 \
@@ -179,8 +112,10 @@ RUN export DEBARCH=$(dpkg --print-architecture) && \
vim-tiny \
xxd \
zlib1g-dev && \
- dpkg -i /tmp/zeekdebs/*.deb && \
python3 -m pip install --break-system-packages --no-cache-dir pymisp stix2 taxii2-client dateparser && \
+ mkdir -p /tmp/zeek-packages && \
+ bash /usr/local/bin/zeek-deb-download.sh -o /tmp/zeek-packages -z "${ZEEK_VERSION}" && \
+ dpkg -i /tmp/zeek-packages/*.deb && \
curl -fsSLO "$SUPERCRONIC_URL" && \
echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - && \
chmod +x "$SUPERCRONIC" && \
@@ -230,15 +165,6 @@ ENV ZEEK_THIRD_PARTY_PLUGINS_GREP "(Zeek::Spicy|ANALYZER_SPICY_DHCP|ANALYZER_SP
ENV ZEEK_THIRD_PARTY_SCRIPTS_COUNT 25
ENV ZEEK_THIRD_PARTY_SCRIPTS_GREP "(bro-is-darknet/main|bro-simple-scan/scan|bzar/main|callstranger-detector/callstranger|cve-2020-0601/cve-2020-0601|cve-2020-13777/cve-2020-13777|CVE-2020-16898/CVE-2020-16898|CVE-2021-38647/omigod|CVE-2021-31166/detect|CVE-2021-41773/CVE_2021_41773|CVE-2021-42292/main|cve-2021-44228/CVE_2021_44228|cve-2022-22954/main|cve-2022-26809/main|CVE-2022-3602/__load__|hassh/hassh|http-more-files-names/main|ja3/ja3|pingback/detect|ripple20/ripple20|SIGRed/CVE-2020-1350|zeek-EternalSafety/main|zeek-httpattacks/main|zeek-sniffpass/__load__|zerologon/main)\.(zeek|bro)"
-RUN mkdir -p /tmp/logs && \
- cd /tmp/logs && \
- "$ZEEK_DIR"/bin/zeek -NN local >zeeknn.log 2>/dev/null && \
- bash -c "(( $(grep -cP "$ZEEK_THIRD_PARTY_PLUGINS_GREP" zeeknn.log) >= $ZEEK_THIRD_PARTY_PLUGINS_COUNT)) && echo 'Zeek plugins loaded correctly' || (echo 'One or more Zeek plugins did not load correctly' && cat zeeknn.log && exit 1)" && \
- "$ZEEK_DIR"/bin/zeek -C -r /tmp/pcaps/udp.pcap local policy/misc/loaded-scripts 2>/dev/null && \
- bash -c "(( $(grep -cP "$ZEEK_THIRD_PARTY_SCRIPTS_GREP" loaded_scripts.log) == $ZEEK_THIRD_PARTY_SCRIPTS_COUNT)) && echo 'Zeek scripts loaded correctly' || (echo 'One or more Zeek scripts did not load correctly' && cat loaded_scripts.log && exit 1)" && \
- cd /tmp && \
- rm -rf /tmp/logs /tmp/pcaps
-
RUN groupadd --gid ${DEFAULT_GID} ${PUSER} && \
useradd -M --uid ${DEFAULT_UID} --gid ${DEFAULT_GID} --home /nonexistant ${PUSER} && \
usermod -a -G tty ${PUSER} && \
@@ -251,6 +177,15 @@ RUN groupadd --gid ${DEFAULT_GID} ${PUSER} && \
ln -sfr /usr/local/bin/pcap_processor.py /usr/local/bin/pcap_zeek_processor.py && \
ln -sfr /usr/local/bin/malcolm_utils.py "${ZEEK_DIR}"/bin/malcolm_utils.py
+RUN mkdir -p /tmp/logs && \
+ cd /tmp/logs && \
+ "$ZEEK_DIR"/bin/zeek-offline -NN local >zeeknn.log 2>/dev/null && \
+ bash -c "(( $(grep -cP "$ZEEK_THIRD_PARTY_PLUGINS_GREP" zeeknn.log) >= $ZEEK_THIRD_PARTY_PLUGINS_COUNT)) && echo 'Zeek plugins loaded correctly' || (echo 'One or more Zeek plugins did not load correctly' && cat zeeknn.log && exit 1)" && \
+ "$ZEEK_DIR"/bin/zeek-offline -C -r /tmp/pcaps/udp.pcap local policy/misc/loaded-scripts 2>/dev/null && \
+ bash -c "(( $(grep -cP "$ZEEK_THIRD_PARTY_SCRIPTS_GREP" loaded_scripts.log) == $ZEEK_THIRD_PARTY_SCRIPTS_COUNT)) && echo 'Zeek scripts loaded correctly' || (echo 'One or more Zeek scripts did not load correctly' && cat loaded_scripts.log && exit 1)" && \
+ cd /tmp && \
+ rm -rf /tmp/logs /tmp/pcaps
+
#Whether or not to auto-tag logs based on filename
ARG AUTO_TAG=true
#Whether or not to start up the pcap_processor script to monitor pcaps
@@ -301,6 +236,7 @@ ENV PCAP_FILTER $PCAP_FILTER
ENV PCAP_NODE_NAME $PCAP_NODE_NAME
# environment variables for zeek runtime tweaks (used in local.zeek)
+ARG ZEEK_DISABLE_STATS=true
ARG ZEEK_DISABLE_HASH_ALL_FILES=
ARG ZEEK_DISABLE_LOG_PASSWORDS=
ARG ZEEK_DISABLE_SSL_VALIDATE_CERTS=
@@ -321,6 +257,7 @@ ARG ZEEK_DISABLE_SPICY_TFTP=
ARG ZEEK_DISABLE_SPICY_WIREGUARD=
ARG ZEEK_SYNCHROPHASOR_DETAILED=
+ENV ZEEK_DISABLE_STATS $ZEEK_DISABLE_STATS
ENV ZEEK_DISABLE_HASH_ALL_FILES $ZEEK_DISABLE_HASH_ALL_FILES
ENV ZEEK_DISABLE_LOG_PASSWORDS $ZEEK_DISABLE_LOG_PASSWORDS
ENV ZEEK_DISABLE_SSL_VALIDATE_CERTS $ZEEK_DISABLE_SSL_VALIDATE_CERTS
diff --git a/NOTICE.txt b/NOTICE.txt
index a27e8c07b..25a298a20 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,4 +1,4 @@
-This project contains code from the Cybersecurity and Infrastructure Security Agency's Malcolm Project
+This project contains code from CISA's Malcolm Project
https://github.com/cisagov/Malcolm
diff --git a/_config.yml b/_config.yml
index 12d935ffd..68cdb8369 100644
--- a/_config.yml
+++ b/_config.yml
@@ -57,7 +57,7 @@ exclude:
- arkime-raw
- config
- dashboards
- - docker-compose-standalone.yml
+ - docker-compose-dev.yml
- docker-compose.yml
- Dockerfiles
- docs/images/font
diff --git a/api/project/__init__.py b/api/project/__init__.py
index 9e5106b34..96adbff9f 100644
--- a/api/project/__init__.py
+++ b/api/project/__init__.py
@@ -11,7 +11,7 @@
import urllib3
import warnings
-from collections import defaultdict
+from collections import defaultdict, OrderedDict
from collections.abc import Iterable
from datetime import datetime
from flask import Flask, jsonify, request
@@ -152,6 +152,15 @@
field_type_map['time'] = 'date'
field_type_map['timestamp'] = 'date'
+# field type maps to various supported "missing" values
+# TODO: do I need to handle weird ones like "date" and "geo"?
+missing_field_map = defaultdict(lambda: '-')
+missing_field_map['double'] = 0.0
+missing_field_map['float'] = 0.0
+missing_field_map['integer'] = 0
+missing_field_map['ip'] = '0.0.0.0'
+missing_field_map['long'] = 0
+
urllib3.disable_warnings()
warnings.filterwarnings(
"ignore",
@@ -212,32 +221,16 @@
)
-def deep_get(d, keys, default=None):
- assert type(keys) is list
- if d is None:
- return default
- if not keys:
- return d
- return deep_get(d.get(keys[0]), keys[1:], default)
-
-
-def get_iterable(x):
- if isinstance(x, Iterable) and not isinstance(x, str):
- return x
- else:
- return (x,)
-
-
def random_id(length=20):
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
def get_request_arguments(req):
arguments = {}
- if 'POST' in get_iterable(req.method):
+ if 'POST' in malcolm_utils.get_iterable(req.method):
if (data := req.get_json() if req.is_json else None) and isinstance(data, dict):
arguments.update(data)
- if 'GET' in get_iterable(req.method):
+ if 'GET' in malcolm_utils.get_iterable(req.method):
arguments.update(request.args)
if debugApi:
print(f"{req.method} {req.path} arguments: {json.dumps(arguments)}")
@@ -342,7 +335,7 @@ def urls_for_field(fieldname, start_time=None, end_time=None):
translated = []
if databaseMode != malcolm_utils.DatabaseMode.ElasticsearchRemote:
- for field in get_iterable(fieldname):
+ for field in malcolm_utils.get_iterable(fieldname):
for url_regex_pair in fields_to_urls:
if (len(url_regex_pair) == 2) and re.search(url_regex_pair[0], field, flags=re.IGNORECASE):
for url in url_regex_pair[1]:
@@ -370,7 +363,7 @@ def doctype_from_args(args):
return doctype
network|host
"""
- return deep_get(args, ["doctype"], app.config["DOCTYPE_DEFAULT"])
+ return malcolm_utils.deep_get(args, ["doctype"], app.config["DOCTYPE_DEFAULT"])
def index_from_args(args):
@@ -502,7 +495,7 @@ def filtervalues(search, args):
# field != value
s = s.exclude(
"terms",
- **{fieldname[1:]: get_iterable(filtervalue)},
+ **{fieldname[1:]: malcolm_utils.get_iterable(filtervalue)},
)
else:
# field exists ("is not null")
@@ -513,7 +506,7 @@ def filtervalues(search, args):
# field == value
s = s.filter(
"terms",
- **{fieldname: get_iterable(filtervalue)},
+ **{fieldname: malcolm_utils.get_iterable(filtervalue)},
)
else:
# field does not exist ("is null")
@@ -524,7 +517,7 @@ def filtervalues(search, args):
return (filters, s)
-def bucketfield(fieldname, current_request, urls=None):
+def aggfields(fieldnames, current_request, urls=None):
"""Returns a bucket aggregation for a particular field over a given time range
Parameters
@@ -550,38 +543,60 @@ def bucketfield(fieldname, current_request, urls=None):
global SearchClass
args = get_request_arguments(current_request)
+ idx = index_from_args(args)
s = SearchClass(
using=databaseClient,
- index=index_from_args(args),
+ index=idx,
).extra(size=0)
start_time_ms, end_time_ms, s = filtertime(s, args)
filters, s = filtervalues(s, args)
- bucket_limit = int(deep_get(args, ["limit"], app.config["RESULT_SET_LIMIT"]))
+ bucket_limit = int(malcolm_utils.deep_get(args, ["limit"], app.config["RESULT_SET_LIMIT"]))
last_bucket = s.aggs
- for fname in get_iterable(fieldname):
+
+ for fname in malcolm_utils.get_iterable(fieldnames):
+ # Get the field mapping type for this field, and map it to a good default "missing"
+ # (empty bucket) label for the bucket missing= parameter below
+ mapping = databaseClient.indices.get_field_mapping(
+ fname,
+ index=idx,
+ )
+ missing_val = (
+ missing_field_map[
+ next(
+ iter(
+ malcolm_utils.dictsearch(
+ mapping[next(iter(OrderedDict(sorted(mapping.items(), reverse=True))))], 'type'
+ )
+ ),
+ None,
+ )
+ ]
+ if (mapping and isinstance(mapping, dict))
+ else missing_field_map[None]
+ )
+
+ # chain on the aggregation for the next field
last_bucket = last_bucket.bucket(
- "values",
+ fname,
"terms",
field=fname,
size=bucket_limit,
+ missing=missing_val,
)
response = s.execute()
+
+ top_bucket_name = next(iter(malcolm_utils.get_iterable(fieldnames)))
+ result_dict = {
+ top_bucket_name: response.aggregations.to_dict().get(top_bucket_name, {}),
+ 'range': (start_time_ms // 1000, end_time_ms // 1000),
+ 'filter': filters,
+ 'fields': malcolm_utils.get_iterable(fieldnames),
+ }
if (urls is not None) and (len(urls) > 0):
- return jsonify(
- values=response.aggregations.to_dict().get("values", {}),
- range=(start_time_ms // 1000, end_time_ms // 1000),
- filter=filters,
- fields=get_iterable(fieldname),
- urls=urls,
- )
- else:
- return jsonify(
- values=response.aggregations.to_dict().get("values", {}),
- range=(start_time_ms // 1000, end_time_ms // 1000),
- filter=filters,
- fields=get_iterable(fieldname),
- )
+ result_dict['urls'] = urls
+
+ return jsonify(result_dict)
@app.route(
@@ -594,14 +609,14 @@ def bucketfield(fieldname, current_request, urls=None):
methods=['GET', 'POST'],
)
def aggregate(fieldname):
- """Returns the aggregated values and counts for a given field name, see bucketfield
+ """Returns the aggregated values and counts for a given field name, see aggfields
Parameters
----------
fieldname : string
the name of the field(s) to be bucketed (comma-separated if multiple fields)
request : Request
- see bucketfield
+ see aggfields
Returns
-------
@@ -612,7 +627,7 @@ def aggregate(fieldname):
"""
start_time, end_time = gettimes(get_request_arguments(request))
fields = fieldname.split(",")
- return bucketfield(
+ return aggfields(
fields,
request,
urls=urls_for_field(fields, start_time=start_time, end_time=end_time),
@@ -645,7 +660,7 @@ def document():
s = SearchClass(
using=databaseClient,
index=index_from_args(args),
- ).extra(size=int(deep_get(args, ["limit"], app.config["RESULT_SET_LIMIT"])))
+ ).extra(size=int(malcolm_utils.deep_get(args, ["limit"], app.config["RESULT_SET_LIMIT"])))
start_time_ms, end_time_ms, s = filtertime(s, args, default_from="1970-1-1", default_to="now")
filters, s = filtervalues(s, args)
return jsonify(
@@ -707,7 +722,7 @@ def fields():
args = get_request_arguments(request)
- templateName = deep_get(args, ["template"], app.config["MALCOLM_TEMPLATE"])
+ templateName = malcolm_utils.deep_get(args, ["template"], app.config["MALCOLM_TEMPLATE"])
arkimeFields = (templateName == app.config["MALCOLM_TEMPLATE"]) and (doctype_from_args(args) == 'network')
fields = defaultdict(dict)
@@ -720,12 +735,12 @@ def fields():
index=index_from_args(args),
).extra(size=5000)
for hit in [x['_source'] for x in s.execute().to_dict().get('hits', {}).get('hits', [])]:
- if (fieldname := deep_get(hit, ['dbField2'])) and (fieldname not in fields):
+ if (fieldname := malcolm_utils.deep_get(hit, ['dbField2'])) and (fieldname not in fields):
if debugApi:
hit['source'] = 'arkime'
fields[fieldname] = {
- 'description': deep_get(hit, ['help']),
- 'type': field_type_map[deep_get(hit, ['type'])],
+ 'description': malcolm_utils.deep_get(hit, ['help']),
+ 'type': field_type_map[malcolm_utils.deep_get(hit, ['type'])],
}
if debugApi:
fields[fieldname]['original'] = [hit]
@@ -741,35 +756,39 @@ def fields():
verify=opensearchSslVerify,
).json()
- for template in deep_get(getTemplateResponseJson, ["index_templates"]):
+ for template in malcolm_utils.deep_get(getTemplateResponseJson, ["index_templates"]):
# top-level fields
- for fieldname, fieldinfo in deep_get(
+ for fieldname, fieldinfo in malcolm_utils.deep_get(
template,
["index_template", "template", "mappings", "properties"],
).items():
if debugApi:
fieldinfo['source'] = f'opensearch.{templateName}'
if 'type' in fieldinfo:
- fields[fieldname]['type'] = field_type_map[deep_get(fieldinfo, ['type'])]
+ fields[fieldname]['type'] = field_type_map[malcolm_utils.deep_get(fieldinfo, ['type'])]
if debugApi:
fields[fieldname]['original'] = fields[fieldname].get('original', []) + [fieldinfo]
# descendant component fields
- for componentName in get_iterable(deep_get(template, ["index_template", "composed_of"])):
+ for componentName in malcolm_utils.get_iterable(
+ malcolm_utils.deep_get(template, ["index_template", "composed_of"])
+ ):
getComponentResponseJson = requests.get(
f'{opensearchUrl}/_component_template/{componentName}',
auth=opensearchReqHttpAuth,
verify=opensearchSslVerify,
).json()
- for component in get_iterable(deep_get(getComponentResponseJson, ["component_templates"])):
- for fieldname, fieldinfo in deep_get(
+ for component in malcolm_utils.get_iterable(
+ malcolm_utils.deep_get(getComponentResponseJson, ["component_templates"])
+ ):
+ for fieldname, fieldinfo in malcolm_utils.deep_get(
component,
["component_template", "template", "mappings", "properties"],
).items():
if debugApi:
fieldinfo['source'] = f'opensearch.{templateName}.{componentName}'
if 'type' in fieldinfo:
- fields[fieldname]['type'] = field_type_map[deep_get(fieldinfo, ['type'])]
+ fields[fieldname]['type'] = field_type_map[malcolm_utils.deep_get(fieldinfo, ['type'])]
if debugApi:
fields[fieldname]['original'] = fields[fieldname].get('original', []) + [fieldinfo]
@@ -788,12 +807,12 @@ def fields():
auth=opensearchReqHttpAuth,
verify=opensearchSslVerify,
).json()['fields']:
- if fieldname := deep_get(field, ['name']):
+ if fieldname := malcolm_utils.deep_get(field, ['name']):
if debugApi:
field['source'] = 'dashboards'
- field_types = deep_get(field, ['esTypes'], [])
+ field_types = malcolm_utils.deep_get(field, ['esTypes'], [])
fields[fieldname]['type'] = field_type_map[
- field_types[0] if len(field_types) > 0 else deep_get(fields[fieldname], ['type'])
+ field_types[0] if len(field_types) > 0 else malcolm_utils.deep_get(fields[fieldname], ['type'])
]
if debugApi:
fields[fieldname]['original'] = fields[fieldname].get('original', []) + [field]
@@ -934,7 +953,7 @@ def event():
data = get_request_arguments(request)
nowTimeStr = datetime.now().astimezone(pytz.utc).isoformat().replace('+00:00', 'Z')
if 'alert' in data:
- alert[app.config["MALCOLM_NETWORK_INDEX_TIME_FIELD"]] = deep_get(
+ alert[app.config["MALCOLM_NETWORK_INDEX_TIME_FIELD"]] = malcolm_utils.deep_get(
data,
[
'alert',
@@ -944,7 +963,7 @@ def event():
nowTimeStr,
)
alert['firstPacket'] = alert[app.config["MALCOLM_NETWORK_INDEX_TIME_FIELD"]]
- alert['lastPacket'] = deep_get(
+ alert['lastPacket'] = malcolm_utils.deep_get(
data,
[
'alert',
@@ -964,7 +983,7 @@ def event():
alert['event']['dataset'] = 'alerting'
alert['event']['module'] = 'alerting'
alert['event']['url'] = '/dashboards/app/alerting#/dashboard'
- alertId = deep_get(
+ alertId = malcolm_utils.deep_get(
data,
[
'alert',
@@ -972,7 +991,7 @@ def event():
],
)
alert['event']['id'] = alertId if alertId else random_id()
- if alertBody := deep_get(
+ if alertBody := malcolm_utils.deep_get(
data,
[
'alert',
@@ -980,7 +999,7 @@ def event():
],
):
alert['event']['original'] = alertBody
- if triggerName := deep_get(
+ if triggerName := malcolm_utils.deep_get(
data,
[
'alert',
@@ -989,7 +1008,7 @@ def event():
],
):
alert['event']['reason'] = triggerName
- if monitorName := deep_get(
+ if monitorName := malcolm_utils.deep_get(
data,
[
'alert',
@@ -1000,7 +1019,7 @@ def event():
alert['rule'] = {}
alert['rule']['name'] = monitorName
if alertSeverity := str(
- deep_get(
+ malcolm_utils.deep_get(
data,
[
'alert',
@@ -1014,7 +1033,7 @@ def event():
alert['event']['risk_score_norm'] = sevnum
alert['event']['severity'] = sevnum
alert['event']['severity_tags'] = 'Alert'
- if alertResults := deep_get(
+ if alertResults := malcolm_utils.deep_get(
data,
[
'alert',
@@ -1022,7 +1041,7 @@ def event():
],
):
if len(alertResults) > 0:
- if hitCount := deep_get(alertResults[0], ['hits', 'total', 'value'], 0):
+ if hitCount := malcolm_utils.deep_get(alertResults[0], ['hits', 'total', 'value'], 0):
alert['event']['hits'] = hitCount
docDateStr = dateparser.parse(alert[app.config["MALCOLM_NETWORK_INDEX_TIME_FIELD"]]).strftime('%y%m%d')
diff --git a/api/requirements.txt b/api/requirements.txt
index f76b2a87f..3f95576d4 100644
--- a/api/requirements.txt
+++ b/api/requirements.txt
@@ -5,5 +5,5 @@ opensearch-py==2.4.2
requests==2.31.0
regex==2022.3.2
dateparser==1.1.1
-elasticsearch==8.11.1
-elasticsearch-dsl==8.11.0
\ No newline at end of file
+elasticsearch==8.12.0
+elasticsearch-dsl==8.12.0
\ No newline at end of file
diff --git a/arkime/arkime_regression_test_harness/Dockerfiles/arkime.Dockerfile b/arkime/arkime_regression_test_harness/Dockerfiles/arkime.Dockerfile
index 890787325..5039422bd 100644
--- a/arkime/arkime_regression_test_harness/Dockerfiles/arkime.Dockerfile
+++ b/arkime/arkime_regression_test_harness/Dockerfiles/arkime.Dockerfile
@@ -55,7 +55,7 @@ USER $ARKIME_USER
RUN git clone --recursive --depth=1 --single-branch -b "$GITHUB_BRANCH" "$GITHUB_URL" "$ARKIME_DIR" && \
cd "$ARKIME_DIR" && \
- bash -c 'for i in /opt/patches/*; do patch -p 1 -r - --no-backup-if-mismatch < $i || true; done' && \
+ bash -c 'for i in /opt/patches/*.patch; do patch -p 1 -r - --no-backup-if-mismatch < $i || true; done' && \
export PATH="$ARKIME_DIR/bin:$ARKIME_DIR/node-v10.21.0-linux-x64/bin:${PATH}" && \
sudo ln -sfr $ARKIME_DIR/bin/npm /usr/local/bin/npm && \
sudo ln -sfr $ARKIME_DIR/bin/node /usr/local/bin/node && \
diff --git a/arkime/etc/config.ini b/arkime/etc/config.ini
index 3a71c6291..a34b194b3 100644
--- a/arkime/etc/config.ini
+++ b/arkime/etc/config.ini
@@ -14,6 +14,7 @@ cronQueries=true
dropGroup=arkime
dropUser=arkime
elasticsearch=http://opensearch:9200
+footerTemplate=_version_ | arkime.com 🦉 | Malc⦿lm 📄 | Dashboards 📊 | NetBox 💻 | _responseTime_ms ⏱️
freeSpaceG=10%
geoLite2ASN=/opt/arkime/etc/GeoLite2-ASN.mmdb
geoLite2Country=/opt/arkime/etc/GeoLite2-Country.mmdb
@@ -51,6 +52,7 @@ rotateIndex=daily
rulesFiles=
smtpIpHeaders=X-Originating-IP:;X-Barracuda-Apparent-Source-IP:
spiDataMaxIndices=7
+spiViewCategoryOrder=malcolm
supportSha256=false
tcpSaveTimeout=720
tcpTimeout=600
@@ -77,7 +79,7 @@ tpacketv3NumThreads=2
tpacketv3BlockSize=8388608
pcapWriteMethod=simple
pcapWriteSize=2560000
-simpleCompression=none
+simpleCompression=zstd
simpleZstdLevel=3
simpleGzipLevel=3
packetThreads=2
@@ -133,6 +135,7 @@ network.protocol=db:network.protocol;group:malcolm;kind:termfield;viewerOnly:tru
network.protocol_version=db:network.protocol_version;group:malcolm;kind:termfield;viewerOnly:true;friendly:Service Version;help:Service Version
network.transport=db:network.transport;group:malcolm;kind:lotermfield;viewerOnly:true;friendly:Protocol;help:Protocol
network.vlan.id=db:network.vlan.id;group:malcolm;kind:integer;viewerOnly:false;friendly:VLAN ID;help:VLAN ID
+related.device_id=db:related.device_id;group:malcolm;kind:integer;viewerOnly:true;friendly:Related Device ID;help:Related Device ID
related.device_name=db:related.device_name;group:malcolm;kind:termfield;viewerOnly:true;friendly:Related Device Name;help:Related Device Name
related.device_type=db:related.device_type;group:malcolm;kind:termfield;viewerOnly:true;friendly:Related Device Type;help:Related Device Type
related.hash=db:related.hash;group:malcolm;kind:termfield;viewerOnly:true;friendly:Related Hash;help:Related Hash
@@ -2581,7 +2584,7 @@ n_netbox_device_originator=require:source.device.id;title:NetBox Device (Origina
n_netbox_device_responder=require:destination.device.id;title:NetBox Device (Responder);fields:destination.device.cluster,destination.device.device_type,destination.device.id,destination.device.manufacturer,destination.device.name,destination.device.role,destination.device.service,destination.device.site,destination.device.url
n_netbox_segment_originator=require:source.segment.id;title:NetBox Segment (Originator);fields:source.segment.id,source.segment.name,source.segment.site,source.segment.tenant,source.segment.url
n_netbox_segment_responder=require:destination.segment.id;title:NetBox Segment (Responder);fields:destination.segment.id,destination.segment.name,destination.segment.site,destination.segment.tenant,destination.segment.url
-n_netbox_z_related=require:related.site;title:NetBox Related;fields:related.site,network.name,related.manufacturer,related.device_type,related.role,related.device_name,related.service
+n_netbox_z_related=require:related.site;title:NetBox Related;fields:related.site,network.name,related.manufacturer,related.device_type,related.role,related.device_id,related.device_name,related.service
o_zeek_bacnet=require:zeek.bacnet;title:Zeek bacnet.log;fields:zeek.bacnet.bvlc_function,zeek.bacnet.pdu_type,zeek.bacnet.pdu_service,zeek.bacnet.invoke_id,zeek.bacnet.instance_number,zeek.bacnet.result_code
o_zeek_bacnet_discovery=require:zeek.bacnet_discovery;title:Zeek bacnet_discovery.log;fields:zeek.bacnet.pdu_service,zeek.bacnet_discovery.object_type,zeek.bacnet_discovery.vendor,zeek.bacnet_discovery.range,zeek.bacnet_discovery.range_low,zeek.bacnet_discovery.range_high,zeek.bacnet_discovery.object_name
o_zeek_bacnet_device_control=require:zeek.bacnet_device_control;title:Zeek bacnet_device_control.log;fields:zeek.bacnet.pdu_service,zeek.bacnet_device_control.time_duration,zeek.bacnet_device_control.device_state,zeek.bacnet_device_control.result,zeek.bacnet_device_control.result_code
diff --git a/arkime/patch/db_pl_quiet_backup_warning.patch b/arkime/patch/db_pl_quiet_backup_warning.patch
deleted file mode 100644
index aa2fb9e67..000000000
--- a/arkime/patch/db_pl_quiet_backup_warning.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/db/db.pl b/db/db.pl
-index 9aa04d2d..44145db0 100755
---- a/db/db.pl
-+++ b/db/db.pl
-@@ -7418,7 +7418,7 @@ my $health = dbCheckHealth();
-
- my $nodes = esGet("/_nodes");
- $main::numberOfNodes = dataNodes($nodes->{nodes});
--logmsg "It is STRONGLY recommended that you stop ALL Arkime captures and viewers before proceeding. Use 'db.pl ${main::elasticsearch} backup' to backup db first.\n\n";
-+# logmsg "It is STRONGLY recommended that you stop ALL Arkime captures and viewers before proceeding. Use 'db.pl ${main::elasticsearch} backup' to backup db first.\n\n";
- if ($main::numberOfNodes == 1) {
- logmsg "There is $main::numberOfNodes elastic search data node, if you expect more please fix first before proceeding.\n\n";
- } else {
diff --git a/arkime/patch/empty.patch b/arkime/patch/empty.patch
new file mode 100644
index 000000000..e69de29bb
diff --git a/arkime/patch/footer_links.patch b/arkime/patch/footer_links.patch
deleted file mode 100644
index c2ab1d837..000000000
--- a/arkime/patch/footer_links.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff --git a/viewer/vueapp/src/components/utils/Footer.vue b/viewer/vueapp/src/components/utils/Footer.vue
-index 84b28a45..7a414ca2 100644
---- a/viewer/vueapp/src/components/utils/Footer.vue
-+++ b/viewer/vueapp/src/components/utils/Footer.vue
-@@ -4,9 +4,12 @@
-
-
- Arkime v{{ version }} |
-- arkime.com
-+ arkime.com 🦉
-+ | Malc⦿lm 📄
-+ | Dashboards 📊
-+ | NetBox 💻
-
-- | {{ responseTime | commaString }}ms
-+ | {{ responseTime | commaString }}ms ⏱️
-
-
- |
diff --git a/arkime/patch/spi_sort_malcolm.patch b/arkime/patch/spi_sort_malcolm.patch
deleted file mode 100644
index b1a60a225..000000000
--- a/arkime/patch/spi_sort_malcolm.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/viewer/vueapp/src/components/spiview/Spiview.vue b/viewer/vueapp/src/components/spiview/Spiview.vue
-index c178fe13..0f99b8b7 100644
---- a/viewer/vueapp/src/components/spiview/Spiview.vue
-+++ b/viewer/vueapp/src/components/spiview/Spiview.vue
-@@ -953,6 +953,8 @@ export default {
-
- // sorted list of categories for the view
- this.categoryList = Object.keys(this.categoryObjects).sort();
-+ this.categoryList.splice(this.categoryList.indexOf('malcolm'), 1);
-+ this.categoryList.unshift('malcolm');
- this.categoryList.splice(this.categoryList.indexOf('general'), 1);
- this.categoryList.unshift('general');
-
diff --git a/arkime/patch/viewer_wider_field_detail.patch b/arkime/patch/viewer_wider_field_detail.patch
deleted file mode 100644
index 9cdd10b47..000000000
--- a/arkime/patch/viewer_wider_field_detail.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/viewer/vueapp/src/components/sessions/SessionDetail.vue b/viewer/vueapp/src/components/sessions/SessionDetail.vue
-index b2f32a02..f0459680 100644
---- a/viewer/vueapp/src/components/sessions/SessionDetail.vue
-+++ b/viewer/vueapp/src/components/sessions/SessionDetail.vue
-@@ -846,7 +846,7 @@ export default {
- .session-detail dt {
- float: left;
- clear: left;
-- width: 160px;
-+ width: 320px;
- text-align: right;
- margin-right: 6px;
- line-height: 1.7;
-@@ -854,7 +854,7 @@ export default {
- }
-
- .session-detail dd {
-- margin-left: 165px;
-+ margin-left: 325px;
- }
-
- /* more items link */
diff --git a/arkime/scripts/docker_entrypoint.sh b/arkime/scripts/docker_entrypoint.sh
index 8f94bfa94..5494d65f8 100755
--- a/arkime/scripts/docker_entrypoint.sh
+++ b/arkime/scripts/docker_entrypoint.sh
@@ -109,8 +109,8 @@ if [[ ! -f "${ARKIME_CONFIG_FILE}" ]] && [[ -r "${ARKIME_DIR}"/etc/config.orig.i
fi
# pcap compression
- COMPRESSION_TYPE="${ARKIME_COMPRESSION_TYPE:-none}"
- COMPRESSION_LEVEL="${ARKIME_COMPRESSION_LEVEL:-0}"
+ COMPRESSION_TYPE="${ARKIME_COMPRESSION_TYPE:-zstd}"
+ COMPRESSION_LEVEL="${ARKIME_COMPRESSION_LEVEL:-3}"
sed -r -i "s/(simpleCompression)\s*=\s*.*/\1=$COMPRESSION_TYPE/" "${ARKIME_CONFIG_FILE}"
if [[ "$COMPRESSION_TYPE" == "zstd" ]]; then
sed -r -i "s/(simpleZstdLevel)\s*=\s*.*/\1=$COMPRESSION_LEVEL/" "${ARKIME_CONFIG_FILE}"
diff --git a/arkime/scripts/initarkime.sh b/arkime/scripts/initarkime.sh
index a47caab03..3de1cbf53 100755
--- a/arkime/scripts/initarkime.sh
+++ b/arkime/scripts/initarkime.sh
@@ -100,6 +100,14 @@ if [[ "$MALCOLM_PROFILE" == "malcolm" ]]; then
fi # if/else OpenSearch database initialized
+ if [[ "${INDEX_MANAGEMENT_ENABLED:-false}" == "true" ]]; then
+ [[ "${INDEX_MANAGEMENT_HOT_WARM_ENABLED:-false}" == "true" ]] && HOT_WARM_FLAG=--hotwarm || HOT_WARM_FLAG=
+ [[ "${OPENSEARCH_PRIMARY}" == "elasticsearch-remote" ]] && LIFECYCLE_POLCY=ilm || LIFECYCLE_POLCY=ism
+ $ARKIME_DIR/db/db.pl $DB_SSL_FLAG "${OPENSEARCH_URL_FULL}" ${LIFECYCLE_POLCY} "${INDEX_MANAGEMENT_OPTIMIZATION_PERIOD}" "${INDEX_MANAGEMENT_RETENTION_TIME}" ${HOT_WARM_FLAG} --segments "${INDEX_MANAGEMENT_SEGMENTS}" --replicas "${INDEX_MANAGEMENT_OLDER_SESSION_REPLICAS}" --history "${INDEX_MANAGEMENT_HISTORY_RETENTION_WEEKS}"
+ $ARKIME_DIR/db/db.pl $DB_SSL_FLAG "${OPENSEARCH_URL_FULL}" upgradenoprompt --ifneeded --${LIFECYCLE_POLCY}
+ echo "${LIFECYCLE_POLCY} created"
+ fi
+
# increase OpenSearch max shards per node from default if desired
if [[ -n $OPENSEARCH_MAX_SHARDS_PER_NODE ]]; then
# see https://github.com/elastic/elasticsearch/issues/40803
diff --git a/arkime/wise/source.zeeklogs.js b/arkime/wise/source.zeeklogs.js
index a2c919ba9..5e38bca78 100644
--- a/arkime/wise/source.zeeklogs.js
+++ b/arkime/wise/source.zeeklogs.js
@@ -142,6 +142,7 @@ class MalcolmSource extends WISESource {
"oui.dst",
"oui.src",
"protocols",
+ "related.device_id",
"related.device_name",
"related.device_type",
"related.hash",
@@ -2221,18 +2222,23 @@ class MalcolmSource extends WISESource {
// add rick-click for opening malcolm agg api
var apiLabel = "Aggregate %DBFIELD%";
- var apiURL = "mapi/agg/%DBFIELD%?from=%ISOSTART%&to=%ISOSTOP%";
+ var apiURL = "/mapi/agg/%DBFIELD%?from=%ISOSTART%&to=%ISOSTOP%";
this.api.addFieldAction("malcolm_mapi_fields_zeek", { name: apiLabel, url: apiURL, all: true });
+ // add rick-click for extracted-files
+ var extractedFilesLabel = "Browse Extracted Files";
+ var extractedFilesURL = "/extracted-files/";
+ this.api.addFieldAction("malcolm_mapi_field_extracted_files", { name: extractedFilesLabel, url: extractedFilesURL, fields: carvedFieldsStr });
+
// add right-click for viewing original JSON document
- this.api.addValueAction("malcolm_json_source", { name: "%DBFIELD% Document(s) JSON", url: "mapi/document?filter={\"%DBFIELD%\":\"%TEXT%\"}", fields: "communityId,event.id,id,network.community_id,rootId,zeek.fuid,zeek.uid" });
+ this.api.addValueAction("malcolm_json_source", { name: "%DBFIELD% Document(s) JSON", url: "/mapi/document?filter={\"%DBFIELD%\":\"%TEXT%\"}", fields: "communityId,event.id,id,network.community_id,rootId,zeek.fuid,zeek.uid" });
this.api.addView("malcolm_common",
"if (session.event.hash)\n" +
- // id information
+ // id and basic connection information
" div.sessionDetailMeta.bold Malcolm Common Fields\n" +
- " dl.sessionDetailMeta(suffix=\"IDs\")\n" +
+ " dl.sessionDetailMeta(suffix=\"IDs and Basic Connection Info\")\n" +
" +arrayList(session.event, 'id', 'Log ID', 'event.id')\n" +
" +arrayList(session.event, 'hash', 'Log Hash', 'event.hash')\n" +
" +arrayList(session.network, 'community_id', 'Connection Community ID', 'network.community_id')\n" +
@@ -2240,9 +2246,6 @@ class MalcolmSource extends WISESource {
" +arrayList(session.event, 'dataset', 'Log Type', 'event.dataset')\n" +
" +arrayList(session.event, 'module', 'Data Source Module', 'event.module')\n" +
" +arrayList(session.host, 'name', 'Malcolm Node', 'host.name')\n" +
-
- // basic connection information
- " dl.sessionDetailMeta(suffix=\"Basic Connection Info\")\n" +
" +arrayList(session.network, 'transport', 'Protocol', 'network.transport')\n" +
" +arrayList(session.network, 'protocol', 'Service', 'network.protocol')\n" +
" +arrayList(session.network, 'protocol_version', 'Service Version', 'network.protocol_version')\n" +
@@ -2285,10 +2288,7 @@ class MalcolmSource extends WISESource {
" +arrayList(session.file, 'path', 'File Path', 'file.path')\n" +
" +arrayList(session.file, 'mime_type', 'File Magic', 'file.mime_type')\n" +
" +arrayList(session.file, 'source', 'File Transport', 'file.source')\n" +
- " +arrayList(session.related, 'hash', 'Related Hash', 'related.hash')\n" +
-
- // ####################################################################
- " br\n");
+ " +arrayList(session.related, 'hash', 'Related Hash', 'related.hash')\n");
}
}
diff --git a/config/arkime.env.example b/config/arkime.env.example
index c3afc8271..c80aa2402 100644
--- a/config/arkime.env.example
+++ b/config/arkime.env.example
@@ -7,4 +7,20 @@ ARKIME_FREESPACEG=10%
# https://arkime.com/settings#rotateIndex
ARKIME_ROTATE_INDEX=daily
+# These variables manage setting for Arkime's ILM/ISM features (https://arkime.com/faq#ilm)
+# Whether or not Arkime should perform index management
+INDEX_MANAGEMENT_ENABLED=false
+# Time in hours/days before moving to warm and force merge (number followed by h or d)
+INDEX_MANAGEMENT_OPTIMIZATION_PERIOD=30d
+# Time in hours/days before deleting index (number followed by h or d)
+INDEX_MANAGEMENT_RETENTION_TIME=90d
+# Number of replicas for older sessions indices
+INDEX_MANAGEMENT_OLDER_SESSION_REPLICAS=0
+# Number of weeks of history to retain
+INDEX_MANAGEMENT_HISTORY_RETENTION_WEEKS=13
+# Number of segments to optimize sessions for
+INDEX_MANAGEMENT_SEGMENTS=1
+# Whether or not Arkime should use a hot/warm design (storing non-session data in a warm index)
+INDEX_MANAGEMENT_HOT_WARM_ENABLED=false
+
OPENSEARCH_MAX_SHARDS_PER_NODE=2500
\ No newline at end of file
diff --git a/config/dashboards.env.example b/config/dashboards.env.example
index b636dc379..29a395ad8 100644
--- a/config/dashboards.env.example
+++ b/config/dashboards.env.example
@@ -4,3 +4,8 @@
# 'http://dashboards:5601/dashboards', otherwise specify the Dashboards URL
# in the format 'protocol://host:port/uri'.
DASHBOARDS_URL=http://dashboards:5601/dashboards
+# These values are used to handle the Arkime value actions to pivot from Arkime
+# to Dashboards. The nginx-proxy container's entrypoint will try to formulate
+# them automatically, but they may be specified explicitly here.
+NGINX_DASHBOARDS_PREFIX=
+NGINX_DASHBOARDS_PROXY_PASS=
\ No newline at end of file
diff --git a/config/logstash.env.example b/config/logstash.env.example
index b5e6f7e56..a9436ad51 100644
--- a/config/logstash.env.example
+++ b/config/logstash.env.example
@@ -11,10 +11,14 @@ LOGSTASH_SEVERITY_SCORING=true
LOGSTASH_REVERSE_DNS=false
# Whether or not Logstash will enrich network traffic metadata via NetBox API calls
LOGSTASH_NETBOX_ENRICHMENT=false
+# Which types of logs will be enriched via NetBox (comma-separated list of provider.dataset, or the string all to enrich all logs)
+LOGSTASH_NETBOX_ENRICHMENT_DATASETS=suricata.alert,zeek.conn,zeek.known_hosts,zeek.known_services,zeek.notice,zeek.signatures,zeek.software,zeek.weird
# Whether or not unobserved network entities in Logstash data will be used to populate NetBox
LOGSTASH_NETBOX_AUTO_POPULATE=false
# Caching parameters for NetBox's LogStash lookups
LOGSTASH_NETBOX_CACHE_SIZE=1000
LOGSTASH_NETBOX_CACHE_TTL=30
+# Zeek log types that will be ignored (dropped) by LogStash
+LOGSTASH_ZEEK_IGNORED_LOGS=analyzer,broker,bsap_ip_unknown,bsap_serial_unknown,capture_loss,cluster,config,ecat_arp_info,loaded_scripts,packet_filter,png,print,prof,reporter,stats,stderr,stdout
# Logstash memory allowance and other Java options
LS_JAVA_OPTS=-server -Xms2500m -Xmx2500m -Xss1536k -XX:-HeapDumpOnOutOfMemoryError -Djava.security.egd=file:/dev/./urandom -Dlog4j.formatMsgNoLookups=true
\ No newline at end of file
diff --git a/config/netbox-common.env.example b/config/netbox-common.env.example
index 000500b0c..772a9cc17 100644
--- a/config/netbox-common.env.example
+++ b/config/netbox-common.env.example
@@ -5,6 +5,9 @@
NETBOX_DEFAULT_SITE=Malcolm
# Whether or not to create catch-all IP Prefixes for private IP space
NETBOX_PRELOAD_PREFIXES=false
+# Customize manufacturer matching/creation with LOGSTASH_NETBOX_AUTO_POPULATE (see logstash.env)
+NETBOX_DEFAULT_AUTOCREATE_MANUFACTURER=true
+NETBOX_DEFAULT_FUZZY_THRESHOLD=0.95
# Whether to disable Malcolm's NetBox instance ('true') or not ('false')
NETBOX_DISABLED=true
NETBOX_POSTGRES_DISABLED=true
diff --git a/config/suricata-live.env.example b/config/suricata-live.env.example
index 3fd9e045c..c059c7666 100644
--- a/config/suricata-live.env.example
+++ b/config/suricata-live.env.example
@@ -4,5 +4,10 @@ SURICATA_LIVE_CAPTURE=false
# Specifies the Suricata runmode for live capture (see
# https://suricata.readthedocs.io/en/latest/performance/runmodes.html)
SURICATA_RUNMODE=workers
+# Whether or not enable capture statistics and include them in eve.json
+SURICATA_STATS_ENABLED=false
+SURICATA_STATS_EVE_ENABLED=false
+SURICATA_STATS_INTERVAL=30
+SURICATA_STATS_DECODER_EVENTS=false
SURICATA_PCAP_PROCESSOR=false
\ No newline at end of file
diff --git a/config/zeek-live.env.example b/config/zeek-live.env.example
index 4cf6fc0cb..944833e85 100644
--- a/config/zeek-live.env.example
+++ b/config/zeek-live.env.example
@@ -1,6 +1,8 @@
# Whether or not Zeek should monitor live traffic on a local
# interface (PCAP_IFACE variable below specifies capture interfaces)
ZEEK_LIVE_CAPTURE=false
+# Set ZEEK_DISABLE_STATS to blank to generate stats.log and capture_loss.log
+ZEEK_DISABLE_STATS=true
ZEEK_PCAP_PROCESSOR=false
ZEEK_CRON=true
diff --git a/config/zeek.env.example b/config/zeek.env.example
index ab208f6a2..966a1bfa2 100644
--- a/config/zeek.env.example
+++ b/config/zeek.env.example
@@ -51,6 +51,8 @@ EXTRACTED_FILE_PIPELINE_VERBOSITY=
EXTRACTED_FILE_HTTP_SERVER_ENABLE=false
# Whether or not Zeek-extracted files served over HTTP will be archived in a Zip file
EXTRACTED_FILE_HTTP_SERVER_ZIP=false
+# Whether or not to use libmagic to show MIME types for Zeek-extracted files served
+EXTRACTED_FILE_HTTP_SERVER_MAGIC=false
# HTTP server will look in subdirectories for requested filename (e.g., in "/quarantined" and "/preserved")
EXTRACTED_FILE_HTTP_SERVER_RECURSIVE=true
# Environment variables for tweaking Zeek at runtime (see local.zeek)
@@ -76,7 +78,7 @@ ZEEK_DISABLE_ICS_BSAP=
ZEEK_DISABLE_ICS_DNP3=
ZEEK_DISABLE_ICS_ENIP=
ZEEK_DISABLE_ICS_ETHERCAT=
-ZEEK_DISABLE_ICS_GENISYS=
+ZEEK_DISABLE_ICS_GENISYS=true
ZEEK_DISABLE_ICS_OPCUA_BINARY=
ZEEK_DISABLE_ICS_MODBUS=
ZEEK_DISABLE_ICS_PROFINET=
diff --git a/dashboards/dashboards/9ee51f94-3316-4fc5-bd89-93a52af69714.json b/dashboards/dashboards/9ee51f94-3316-4fc5-bd89-93a52af69714.json
index 4e502b7c2..57ea8d429 100644
--- a/dashboards/dashboards/9ee51f94-3316-4fc5-bd89-93a52af69714.json
+++ b/dashboards/dashboards/9ee51f94-3316-4fc5-bd89-93a52af69714.json
@@ -1,384 +1,412 @@
-{
- "version": "1.2.0",
- "objects": [
- {
- "id": "9ee51f94-3316-4fc5-bd89-93a52af69714",
- "type": "dashboard",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T19:46:40.335Z",
- "version": "WzEzMTEsMV0=",
- "attributes": {
- "title": "Files",
- "hits": 0,
- "description": "",
- "panelsJSON": "[{\"version\":\"1.2.0\",\"gridData\":{\"x\":16,\"y\":0,\"w\":32,\"h\":8,\"i\":\"2\"},\"panelIndex\":\"2\",\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"panelRefName\":\"panel_0\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":0,\"y\":0,\"w\":8,\"h\":27,\"i\":\"3\"},\"panelIndex\":\"3\",\"embeddableConfig\":{},\"panelRefName\":\"panel_1\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":0,\"y\":27,\"w\":8,\"h\":28,\"i\":\"6\"},\"panelIndex\":\"6\",\"embeddableConfig\":{\"table\":null,\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}}}},\"panelRefName\":\"panel_2\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":40,\"y\":8,\"w\":8,\"h\":18,\"i\":\"7\"},\"panelIndex\":\"7\",\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}},\"panelRefName\":\"panel_3\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":32,\"y\":8,\"w\":8,\"h\":18,\"i\":\"8\"},\"panelIndex\":\"8\",\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}},\"panelRefName\":\"panel_4\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":8,\"y\":0,\"w\":8,\"h\":8,\"i\":\"11\"},\"panelIndex\":\"11\",\"embeddableConfig\":{},\"panelRefName\":\"panel_5\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":8,\"y\":8,\"w\":15,\"h\":47,\"i\":\"b932bc95-a3b3-411b-a7d2-2fe43e38cf8a\"},\"panelIndex\":\"b932bc95-a3b3-411b-a7d2-2fe43e38cf8a\",\"embeddableConfig\":{},\"panelRefName\":\"panel_6\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":23,\"y\":8,\"w\":9,\"h\":18,\"i\":\"2d3ee44d-2d7f-4573-8b02-f6e46e550238\"},\"panelIndex\":\"2d3ee44d-2d7f-4573-8b02-f6e46e550238\",\"embeddableConfig\":{},\"panelRefName\":\"panel_7\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":23,\"y\":26,\"w\":25,\"h\":29,\"i\":\"fecc7359-c195-4066-a565-2effd4380b9e\"},\"panelIndex\":\"fecc7359-c195-4066-a565-2effd4380b9e\",\"embeddableConfig\":{},\"panelRefName\":\"panel_8\"},{\"version\":\"1.2.0\",\"gridData\":{\"x\":0,\"y\":55,\"w\":48,\"h\":35,\"i\":\"8e4863be-7d69-4354-9eb4-4e30a7c983d6\"},\"panelIndex\":\"8e4863be-7d69-4354-9eb4-4e30a7c983d6\",\"embeddableConfig\":{},\"panelRefName\":\"panel_9\"}]",
- "optionsJSON": "{\"useMargins\":true}",
- "version": 1,
- "timeRestore": false,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"highlightAll\":false,\"version\":true,\"query\":{\"language\":\"lucene\",\"query\":\"*\"},\"filter\":[]}"
- }
- },
- "references": [
- {
- "name": "panel_0",
- "type": "visualization",
- "id": "aaa4fbb0-d5fe-4ef9-be76-405b977bcd5b"
- },
- {
- "name": "panel_1",
- "type": "visualization",
- "id": "df9e399b-efa5-4e33-b0ac-a7668a8ac2b3"
- },
- {
- "name": "panel_2",
- "type": "visualization",
- "id": "66d5d357-edce-450d-b5be-a5a00190e153"
- },
- {
- "name": "panel_3",
- "type": "visualization",
- "id": "d3a0ac2e-73cf-462e-8b03-e6ff3b8612b7"
- },
- {
- "name": "panel_4",
- "type": "visualization",
- "id": "9ba4473b-66f4-4aea-b19e-4309ec6534b8"
- },
- {
- "name": "panel_5",
- "type": "visualization",
- "id": "AWDG9goqxQT5EBNmq4BP"
- },
- {
- "name": "panel_6",
- "type": "visualization",
- "id": "269ec200-7fa6-11ec-998f-a1f630163497"
- },
- {
- "name": "panel_7",
- "type": "visualization",
- "id": "b49ab0c0-7fa9-11ec-998f-a1f630163497"
- },
- {
- "name": "panel_8",
- "type": "visualization",
- "id": "91157aa0-7fa8-11ec-998f-a1f630163497"
- },
- {
- "name": "panel_9",
- "type": "search",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "dashboard": "7.9.3"
- }
- },
- {
- "id": "aaa4fbb0-d5fe-4ef9-be76-405b977bcd5b",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:58:50.233Z",
- "version": "WzUwMSwxXQ==",
- "attributes": {
- "visState": "{\"title\":\"Files - Log Count Over Time\",\"type\":\"line\",\"params\":{\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{\"text\":\"MALCOLM_NETWORK_INDEX_TIME_FIELD_REPLACER per 12 hours\"}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"\"}}],\"seriesParams\":[{\"show\":true,\"mode\":\"normal\",\"type\":\"histogram\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"lineWidth\":2,\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"showCircles\":true,\"interpolate\":\"linear\",\"scale\":\"linear\",\"drawLinesBetweenPoints\":true,\"radiusRatio\":9,\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"MALCOLM_NETWORK_INDEX_TIME_FIELD_REPLACER\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\" \"}}],\"listeners\":{}}",
- "description": "",
- "title": "Files - Log Count Over Time",
- "uiStateJSON": "{}",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "type": "search",
- "name": "search_0",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "df9e399b-efa5-4e33-b0ac-a7668a8ac2b3",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:59:16.564Z",
- "version": "Wzc4NiwxXQ==",
- "attributes": {
- "title": "Network Logs",
- "visState": "{\"title\":\"Network Logs\",\"type\":\"markdown\",\"params\":{\"markdown\":\"### General\\n[Overview](#/dashboard/0ad3d7c2-3441-485e-9dfe-dbb22e84e576) \\n[Security Overview](#/dashboard/95479950-41f2-11ea-88fa-7151df485405) \\n[ICS/IoT Security Overview](#/dashboard/4a4bde20-4760-11ea-949c-bbb5a9feecbf) \\n[Severity](#/dashboard/d2dd0180-06b1-11ec-8c6b-353266ade330) \\n[Connections](#/dashboard/abdd7550-2c7c-40dc-947e-f6d186a158c4) \\n[Actions and Results](#/dashboard/a33e0a50-afcd-11ea-993f-b7d8522a8bed) \\n[Files](#/dashboard/9ee51f94-3316-4fc5-bd89-93a52af69714) \\n[Executables](#/dashboard/0a490422-0ce9-44bf-9a2d-19329ddde8c3) \\n[Software](#/dashboard/87d990cc-9e0b-41e5-b8fe-b10ae1da0c85) \\n[Zeek Known Summary](#/dashboard/89d1cc50-974c-11ed-bb6b-3fb06c879b11) \\n[Zeek Intelligence](#/dashboard/36ed695f-edcc-47c1-b0ec-50d20c93ce0f) \\n[Zeek Notices](#/dashboard/f1f09567-fc7f-450b-a341-19d2f2bb468b) \\n[Zeek Weird](#/dashboard/1fff49f6-0199-4a0f-820b-721aff9ff1f1) \\n[Signatures](#/dashboard/665d1610-523d-11e9-a30e-e3576242f3ed) \\n[Suricata Alerts](#/dashboard/5694ca60-cbdf-11ec-a50a-5fedd672f5c5) \\n[Asset Interaction Analysis](#/dashboard/677ee170-809e-11ed-8d5b-07069f823b6f) \\n[↪ NetBox](/netbox/) \\n[↪ Arkime](/arkime/) \\n\\n### Common Protocols\\n[DCE/RPC](#/dashboard/432af556-c5c0-4cc3-8166-b274b4e3a406) ● [DHCP](#/dashboard/2d98bb8e-214c-4374-837b-20e1bcd63a5e) ● [DNS](#/dashboard/2cf94cd0-ecab-40a5-95a7-8419f3a39cd9) ● [FTP](#/dashboard/078b9aa5-9bd4-4f02-ae5e-cf80fa6f887b) / [TFTP](#/dashboard/bf5efbb0-60f1-11eb-9d60-dbf0411cfc48) ● [HTTP](#/dashboard/37041ee1-79c0-4684-a436-3173b0e89876) ● [IRC](#/dashboard/76f2f912-80da-44cd-ab66-6a73c8344cc3) ● [Kerberos](#/dashboard/82da3101-2a9c-4ae2-bb61-d447a3fbe673) ● [LDAP](#/dashboard/05e3e000-f118-11e9-acda-83a8e29e1a24) ● [MQTT](#/dashboard/87a32f90-ef58-11e9-974e-9d600036d105) ● [MySQL](#/dashboard/50ced171-1b10-4c3f-8b67-2db9635661a6) ● [NTLM](#/dashboard/543118a9-02d7-43fe-b669-b8652177fc37) ● [NTP](#/dashboard/af5df620-eeb6-11e9-bdef-65a192b7f586) ● [OSPF](#/dashboard/1cc01ff0-5205-11ec-a62c-7bc80e88f3f0) ● [QUIC](#/dashboard/11ddd980-e388-11e9-b568-cf17de8e860c) ● [RADIUS](#/dashboard/ae79b7d1-4281-4095-b2f6-fa7eafda9970) ● [RDP](#/dashboard/7f41913f-cba8-43f5-82a8-241b7ead03e0) ● [RFB](#/dashboard/f77bf097-18a8-465c-b634-eb2acc7a4f26) ● [SIP](#/dashboard/0b2354ae-0fe9-4fd9-b156-1c3870e5c7aa) ● [SMB](#/dashboard/42e831b9-41a9-4f35-8b7d-e1566d368773) ● [SMTP](#/dashboard/bb827f8e-639e-468c-93c8-9f5bc132eb8f) ● [SNMP](#/dashboard/4e5f106e-c60a-4226-8f64-d534abb912ab) ● [SSH](#/dashboard/caef3ade-d289-4d05-a511-149f3e97f238) ● [SSL](#/dashboard/7f77b58a-df3e-4cc2-b782-fd7f8bad8ffb) / [X.509 Certificates](#/dashboard/024062a6-48d6-498f-a91a-3bf2da3a3cd3) ● [STUN](#/dashboard/fa477130-2b8a-11ec-a9f2-3911c8571bfd) ● [Syslog](#/dashboard/92985909-dc29-4533-9e80-d3182a0ecf1d) ● [TDS](#/dashboard/bed185a0-ef82-11e9-b38a-2db3ee640e88) / [TDS RPC](#/dashboard/32587740-ef88-11e9-b38a-2db3ee640e88) / [TDS SQL](#/dashboard/fa141950-ef89-11e9-b38a-2db3ee640e88) ● [Telnet / rlogin / rsh](#/dashboard/c2549e10-7f2e-11ea-9f8a-1fe1327e2cd2) ● [Tunnels](#/dashboard/11be6381-beef-40a7-bdce-88c5398392fc)\\n\\n### ICS/IoT Protocols\\n[BACnet](#/dashboard/2bec1490-eb94-11e9-a384-0fcf32210194) ● [BSAP](#/dashboard/ca5799a0-56b5-11eb-b749-576de068f8ad) ● [DNP3](#/dashboard/870a5862-6c26-4a08-99fd-0c06cda85ba3) ● [EtherCAT](#/dashboard/4a073440-b286-11eb-a4d4-09fa12a6ebd4) ● [EtherNet/IP](#/dashboard/29a1b290-eb98-11e9-a384-0fcf32210194) ● [GENISYS](#/dashboard/03207c00-d07e-11ec-b4a7-d1b4003706b7) ● [Modbus](#/dashboard/152f29dc-51a2-4f53-93e9-6e92765567b8) ● [OPCUA Binary](#/dashboard/dd87edd0-796a-11ec-9ce6-b395c1ff58f4) ● [PROFINET](#/dashboard/a7514350-eba6-11e9-a384-0fcf32210194) ● [S7comm](#/dashboard/e76d05c0-eb9f-11e9-a384-0fcf32210194) ● [Synchrophasor](#/dashboard/2cc56240-e460-11ed-a9d5-9f591c284cb4) ● [Best Guess](#/dashboard/12e3a130-d83b-11eb-a0b0-f328ce09b0b7)\",\"type\":\"markdown\",\"fontSize\":10,\"openLinksInNewTab\":false},\"aggs\":[]}",
- "uiStateJSON": "{}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query\":{\"query_string\":{\"query\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
- }
- },
- "references": [],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "66d5d357-edce-450d-b5be-a5a00190e153",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T19:38:19.745Z",
- "version": "WzExOTksMV0=",
- "attributes": {
- "title": "Files - Files By Size (Bytes)",
- "visState": "{\"title\":\"Files - Files By Size (Bytes)\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"zeek.files.seen_bytes\",\"orderBy\":\"_key\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Bytes Seen\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":20,\"showPartialRows\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"showMetricsAtAllLevels\":false,\"percentageCol\":\"\"}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "name": "search_0",
- "type": "search",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "d3a0ac2e-73cf-462e-8b03-e6ff3b8612b7",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:58:50.233Z",
- "version": "WzUwNCwxXQ==",
- "attributes": {
- "visState": "{\"title\":\"FIles - Destination IP Address\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"destination.ip\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"IP Address\"}}],\"listeners\":{}}",
- "description": "",
- "title": "FIles - Destination IP Address",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "type": "search",
- "name": "search_0",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "9ba4473b-66f4-4aea-b19e-4309ec6534b8",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:58:50.233Z",
- "version": "WzUwNSwxXQ==",
- "attributes": {
- "visState": "{\"title\":\"FIles - Source IP Address\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"source.ip\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"File IP Address\"}}],\"listeners\":{}}",
- "description": "",
- "title": "FIles - Source IP Address",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "type": "search",
- "name": "search_0",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "AWDG9goqxQT5EBNmq4BP",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:58:50.233Z",
- "version": "WzUwOCwxXQ==",
- "attributes": {
- "title": "Files - Log Count",
- "visState": "{\"title\":\"Files - Log Count\",\"type\":\"metric\",\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"None\",\"useRange\":false,\"colorsRange\":[{\"from\":0,\"to\":100}],\"invertColors\":false,\"labels\":{\"show\":false,\"color\":\"black\"},\"scale\":{\"show\":false,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"fontSize\":\"30\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"bgFill\":\"#FB9E00\"}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}}],\"listeners\":{}}",
- "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 100\":\"rgb(0,104,55)\"}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "type": "search",
- "name": "search_0",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "269ec200-7fa6-11ec-998f-a1f630163497",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T19:23:41.331Z",
- "version": "WzExMDcsMV0=",
- "attributes": {
- "title": "Files - Source",
- "visState": "{\"title\":\"Files - Source\",\"type\":\"horizontal_bar\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.source\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Source\"},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.source\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Source\"},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":200},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"square root\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":75,\"filter\":true,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}",
- "uiStateJSON": "{\"vis\":{\"legendOpen\":false}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"
- },
- "savedSearchRefName": "search_0"
- },
- "references": [
- {
- "name": "search_0",
- "type": "search",
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "b49ab0c0-7fa9-11ec-998f-a1f630163497",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T19:45:39.788Z",
- "version": "WzEyOTksMV0=",
- "attributes": {
- "title": "Files - MIME Type",
- "visState": "{\"title\":\"Files - MIME Type\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.mime_type\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Mime Type\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
- }
- },
- "references": [
- {
- "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
- "type": "index-pattern",
- "id": "MALCOLM_NETWORK_INDEX_PATTERN_REPLACER"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "91157aa0-7fa8-11ec-998f-a1f630163497",
- "type": "visualization",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T19:37:30.697Z",
- "version": "WzExODMsMV0=",
- "attributes": {
- "title": "Files - Paths",
- "visState": "{\"title\":\"Files - Paths\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"event.dataset\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"-\",\"customLabel\":\"Log Type\"},\"schema\":\"bucket\"},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"network.protocol\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"-\",\"customLabel\":\"Protocol\"},\"schema\":\"bucket\"},{\"id\":\"5\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.path\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":1000,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Path\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":20,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}",
- "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":3,\"direction\":\"desc\"}}}}",
- "description": "",
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
- }
- },
- "references": [
- {
- "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
- "type": "index-pattern",
- "id": "MALCOLM_NETWORK_INDEX_PATTERN_REPLACER"
- }
- ],
- "migrationVersion": {
- "visualization": "7.10.0"
- }
- },
- {
- "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459",
- "type": "search",
- "namespaces": [
- "default"
- ],
- "updated_at": "2022-01-27T18:59:05.412Z",
- "version": "WzY4OCwxXQ==",
- "attributes": {
- "title": "Files - Logs",
- "description": "",
- "hits": 0,
- "columns": [
- "source.ip",
- "destination.ip",
- "file.source",
- "file.mime_type",
- "file.path",
- "event.id"
- ],
- "sort": [
- [
- "MALCOLM_NETWORK_INDEX_TIME_FIELD_REPLACER",
- "desc"
- ]
- ],
- "version": 1,
- "kibanaSavedObjectMeta": {
- "searchSourceJSON": "{\"highlightAll\":false,\"version\":true,\"filter\":[],\"query\":{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"event.dataset:files\"}},\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
- }
- },
- "references": [
- {
- "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
- "type": "index-pattern",
- "id": "MALCOLM_NETWORK_INDEX_PATTERN_REPLACER"
- }
- ],
- "migrationVersion": {
- "search": "7.9.3"
- }
- }
- ]
+{
+ "version": "2.11.1",
+ "objects": [
+ {
+ "id": "9ee51f94-3316-4fc5-bd89-93a52af69714",
+ "type": "dashboard",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:31:54.606Z",
+ "version": "Wzk1MywxXQ==",
+ "attributes": {
+ "title": "Files",
+ "hits": 0,
+ "description": "",
+ "panelsJSON": "[{\"embeddableConfig\":{\"vis\":{\"legendOpen\":false}},\"gridData\":{\"h\":10,\"i\":\"2\",\"w\":32,\"x\":16,\"y\":0},\"panelIndex\":\"2\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":27,\"i\":\"3\",\"w\":8,\"x\":0,\"y\":0},\"panelIndex\":\"3\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{\"table\":null,\"vis\":{\"params\":{\"sort\":{\"columnIndex\":0,\"direction\":\"desc\"}},\"sortColumn\":{\"colIndex\":0,\"direction\":\"desc\"}}},\"gridData\":{\"h\":28,\"i\":\"6\",\"w\":8,\"x\":0,\"y\":27},\"panelIndex\":\"6\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}},\"gridData\":{\"h\":18,\"i\":\"7\",\"w\":8,\"x\":40,\"y\":10},\"panelIndex\":\"7\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}},\"gridData\":{\"h\":18,\"i\":\"8\",\"w\":8,\"x\":32,\"y\":10},\"panelIndex\":\"8\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":6,\"i\":\"11\",\"w\":8,\"x\":8,\"y\":0},\"panelIndex\":\"11\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_5\"},{\"embeddableConfig\":{\"hidePanelTitles\":true},\"gridData\":{\"h\":4,\"i\":\"67954b42-513c-47af-af19-e2382ad27cf9\",\"w\":8,\"x\":8,\"y\":6},\"panelIndex\":\"67954b42-513c-47af-af19-e2382ad27cf9\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_6\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":47,\"i\":\"b932bc95-a3b3-411b-a7d2-2fe43e38cf8a\",\"w\":15,\"x\":8,\"y\":10},\"panelIndex\":\"b932bc95-a3b3-411b-a7d2-2fe43e38cf8a\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_7\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}},\"sortColumn\":{\"colIndex\":1,\"direction\":\"desc\"}}},\"gridData\":{\"h\":18,\"i\":\"2d3ee44d-2d7f-4573-8b02-f6e46e550238\",\"w\":9,\"x\":23,\"y\":10},\"panelIndex\":\"2d3ee44d-2d7f-4573-8b02-f6e46e550238\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_8\"},{\"embeddableConfig\":{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":3,\"direction\":\"desc\"}},\"sortColumn\":{\"colIndex\":3,\"direction\":\"desc\"}}},\"gridData\":{\"h\":29,\"i\":\"fecc7359-c195-4066-a565-2effd4380b9e\",\"w\":25,\"x\":23,\"y\":28},\"panelIndex\":\"fecc7359-c195-4066-a565-2effd4380b9e\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_9\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":35,\"i\":\"8e4863be-7d69-4354-9eb4-4e30a7c983d6\",\"w\":48,\"x\":0,\"y\":57},\"panelIndex\":\"8e4863be-7d69-4354-9eb4-4e30a7c983d6\",\"version\":\"2.11.1\",\"panelRefName\":\"panel_10\"}]",
+ "optionsJSON": "{\"useMargins\":true}",
+ "version": 1,
+ "timeRestore": false,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"highlightAll\":false,\"version\":true,\"query\":{\"language\":\"lucene\",\"query\":\"*\"},\"filter\":[]}"
+ }
+ },
+ "references": [
+ {
+ "name": "panel_0",
+ "type": "visualization",
+ "id": "aaa4fbb0-d5fe-4ef9-be76-405b977bcd5b"
+ },
+ {
+ "name": "panel_1",
+ "type": "visualization",
+ "id": "df9e399b-efa5-4e33-b0ac-a7668a8ac2b3"
+ },
+ {
+ "name": "panel_2",
+ "type": "visualization",
+ "id": "66d5d357-edce-450d-b5be-a5a00190e153"
+ },
+ {
+ "name": "panel_3",
+ "type": "visualization",
+ "id": "d3a0ac2e-73cf-462e-8b03-e6ff3b8612b7"
+ },
+ {
+ "name": "panel_4",
+ "type": "visualization",
+ "id": "9ba4473b-66f4-4aea-b19e-4309ec6534b8"
+ },
+ {
+ "name": "panel_5",
+ "type": "visualization",
+ "id": "AWDG9goqxQT5EBNmq4BP"
+ },
+ {
+ "name": "panel_6",
+ "type": "visualization",
+ "id": "1642f6f0-c44c-11ee-876e-5d93490b24bb"
+ },
+ {
+ "name": "panel_7",
+ "type": "visualization",
+ "id": "269ec200-7fa6-11ec-998f-a1f630163497"
+ },
+ {
+ "name": "panel_8",
+ "type": "visualization",
+ "id": "b49ab0c0-7fa9-11ec-998f-a1f630163497"
+ },
+ {
+ "name": "panel_9",
+ "type": "visualization",
+ "id": "91157aa0-7fa8-11ec-998f-a1f630163497"
+ },
+ {
+ "name": "panel_10",
+ "type": "search",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "dashboard": "7.9.3"
+ }
+ },
+ {
+ "id": "aaa4fbb0-d5fe-4ef9-be76-405b977bcd5b",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU3NSwxXQ==",
+ "attributes": {
+ "visState": "{\"title\":\"Files - Log Count Over Time\",\"type\":\"line\",\"params\":{\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{\"text\":\"firstPacket per 12 hours\"}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"\"}}],\"seriesParams\":[{\"show\":true,\"mode\":\"normal\",\"type\":\"histogram\",\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"lineWidth\":2,\"data\":{\"id\":\"1\",\"label\":\"Count\"},\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"showCircles\":true,\"interpolate\":\"linear\",\"scale\":\"linear\",\"drawLinesBetweenPoints\":true,\"radiusRatio\":9,\"times\":[],\"addTimeMarker\":false,\"defaultYExtents\":false,\"setYExtents\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"firstPacket\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\" \"}}],\"listeners\":{}}",
+ "description": "",
+ "title": "Files - Log Count Over Time",
+ "uiStateJSON": "{}",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "type": "search",
+ "name": "search_0",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "df9e399b-efa5-4e33-b0ac-a7668a8ac2b3",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:27.382Z",
+ "version": "Wzg2MSwxXQ==",
+ "attributes": {
+ "title": "Network Logs",
+ "visState": "{\"title\":\"Network Logs\",\"type\":\"markdown\",\"params\":{\"markdown\":\"### General\\n[Overview](#/dashboard/0ad3d7c2-3441-485e-9dfe-dbb22e84e576) \\n[Security Overview](#/dashboard/95479950-41f2-11ea-88fa-7151df485405) \\n[ICS/IoT Security Overview](#/dashboard/4a4bde20-4760-11ea-949c-bbb5a9feecbf) \\n[Severity](#/dashboard/d2dd0180-06b1-11ec-8c6b-353266ade330) \\n[Connections](#/dashboard/abdd7550-2c7c-40dc-947e-f6d186a158c4) \\n[Actions and Results](#/dashboard/a33e0a50-afcd-11ea-993f-b7d8522a8bed) \\n[Files](#/dashboard/9ee51f94-3316-4fc5-bd89-93a52af69714) \\n[Executables](#/dashboard/0a490422-0ce9-44bf-9a2d-19329ddde8c3) \\n[Software](#/dashboard/87d990cc-9e0b-41e5-b8fe-b10ae1da0c85) \\n[Zeek Known Summary](#/dashboard/89d1cc50-974c-11ed-bb6b-3fb06c879b11) \\n[Zeek Intelligence](#/dashboard/36ed695f-edcc-47c1-b0ec-50d20c93ce0f) \\n[Zeek Notices](#/dashboard/f1f09567-fc7f-450b-a341-19d2f2bb468b) \\n[Zeek Weird](#/dashboard/1fff49f6-0199-4a0f-820b-721aff9ff1f1) \\n[Signatures](#/dashboard/665d1610-523d-11e9-a30e-e3576242f3ed) \\n[Suricata Alerts](#/dashboard/5694ca60-cbdf-11ec-a50a-5fedd672f5c5) \\n[Asset Interaction Analysis](#/dashboard/677ee170-809e-11ed-8d5b-07069f823b6f) \\n[↪ NetBox](/netbox/) \\n[↪ Arkime](/arkime/) \\n\\n### Common Protocols\\n[DCE/RPC](#/dashboard/432af556-c5c0-4cc3-8166-b274b4e3a406) ● [DHCP](#/dashboard/2d98bb8e-214c-4374-837b-20e1bcd63a5e) ● [DNS](#/dashboard/2cf94cd0-ecab-40a5-95a7-8419f3a39cd9) ● [FTP](#/dashboard/078b9aa5-9bd4-4f02-ae5e-cf80fa6f887b) / [TFTP](#/dashboard/bf5efbb0-60f1-11eb-9d60-dbf0411cfc48) ● [HTTP](#/dashboard/37041ee1-79c0-4684-a436-3173b0e89876) ● [IRC](#/dashboard/76f2f912-80da-44cd-ab66-6a73c8344cc3) ● [Kerberos](#/dashboard/82da3101-2a9c-4ae2-bb61-d447a3fbe673) ● [LDAP](#/dashboard/05e3e000-f118-11e9-acda-83a8e29e1a24) ● [MQTT](#/dashboard/87a32f90-ef58-11e9-974e-9d600036d105) ● [MySQL](#/dashboard/50ced171-1b10-4c3f-8b67-2db9635661a6) ● [NTLM](#/dashboard/543118a9-02d7-43fe-b669-b8652177fc37) ● [NTP](#/dashboard/af5df620-eeb6-11e9-bdef-65a192b7f586) ● [OSPF](#/dashboard/1cc01ff0-5205-11ec-a62c-7bc80e88f3f0) ● [QUIC](#/dashboard/11ddd980-e388-11e9-b568-cf17de8e860c) ● [RADIUS](#/dashboard/ae79b7d1-4281-4095-b2f6-fa7eafda9970) ● [RDP](#/dashboard/7f41913f-cba8-43f5-82a8-241b7ead03e0) ● [RFB](#/dashboard/f77bf097-18a8-465c-b634-eb2acc7a4f26) ● [SIP](#/dashboard/0b2354ae-0fe9-4fd9-b156-1c3870e5c7aa) ● [SMB](#/dashboard/42e831b9-41a9-4f35-8b7d-e1566d368773) ● [SMTP](#/dashboard/bb827f8e-639e-468c-93c8-9f5bc132eb8f) ● [SNMP](#/dashboard/4e5f106e-c60a-4226-8f64-d534abb912ab) ● [SSH](#/dashboard/caef3ade-d289-4d05-a511-149f3e97f238) ● [SSL](#/dashboard/7f77b58a-df3e-4cc2-b782-fd7f8bad8ffb) / [X.509 Certificates](#/dashboard/024062a6-48d6-498f-a91a-3bf2da3a3cd3) ● [STUN](#/dashboard/fa477130-2b8a-11ec-a9f2-3911c8571bfd) ● [Syslog](#/dashboard/92985909-dc29-4533-9e80-d3182a0ecf1d) ● [TDS](#/dashboard/bed185a0-ef82-11e9-b38a-2db3ee640e88) / [TDS RPC](#/dashboard/32587740-ef88-11e9-b38a-2db3ee640e88) / [TDS SQL](#/dashboard/fa141950-ef89-11e9-b38a-2db3ee640e88) ● [Telnet / rlogin / rsh](#/dashboard/c2549e10-7f2e-11ea-9f8a-1fe1327e2cd2) ● [Tunnels](#/dashboard/11be6381-beef-40a7-bdce-88c5398392fc)\\n\\n### ICS/IoT Protocols\\n[BACnet](#/dashboard/2bec1490-eb94-11e9-a384-0fcf32210194) ● [BSAP](#/dashboard/ca5799a0-56b5-11eb-b749-576de068f8ad) ● [DNP3](#/dashboard/870a5862-6c26-4a08-99fd-0c06cda85ba3) ● [EtherCAT](#/dashboard/4a073440-b286-11eb-a4d4-09fa12a6ebd4) ● [EtherNet/IP](#/dashboard/29a1b290-eb98-11e9-a384-0fcf32210194) ● [GENISYS](#/dashboard/03207c00-d07e-11ec-b4a7-d1b4003706b7) ● [Modbus](#/dashboard/152f29dc-51a2-4f53-93e9-6e92765567b8) ● [OPCUA Binary](#/dashboard/dd87edd0-796a-11ec-9ce6-b395c1ff58f4) ● [PROFINET](#/dashboard/a7514350-eba6-11e9-a384-0fcf32210194) ● [S7comm](#/dashboard/e76d05c0-eb9f-11e9-a384-0fcf32210194) ● [Synchrophasor](#/dashboard/2cc56240-e460-11ed-a9d5-9f591c284cb4) ● [Best Guess](#/dashboard/12e3a130-d83b-11eb-a0b0-f328ce09b0b7)\",\"type\":\"markdown\",\"fontSize\":10,\"openLinksInNewTab\":false},\"aggs\":[]}",
+ "uiStateJSON": "{}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":{\"query_string\":{\"query\":\"*\"}},\"language\":\"lucene\"},\"filter\":[]}"
+ }
+ },
+ "references": [],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "66d5d357-edce-450d-b5be-a5a00190e153",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU3NywxXQ==",
+ "attributes": {
+ "title": "Files - Files By Size (Bytes)",
+ "visState": "{\"title\":\"Files - Files By Size (Bytes)\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"zeek.files.seen_bytes\",\"orderBy\":\"_key\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Bytes Seen\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":20,\"showPartialRows\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"showMetricsAtAllLevels\":false,\"percentageCol\":\"\"}}",
+ "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "name": "search_0",
+ "type": "search",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "d3a0ac2e-73cf-462e-8b03-e6ff3b8612b7",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU3OCwxXQ==",
+ "attributes": {
+ "visState": "{\"title\":\"FIles - Destination IP Address\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"destination.ip\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"IP Address\"}}],\"listeners\":{}}",
+ "description": "",
+ "title": "FIles - Destination IP Address",
+ "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "type": "search",
+ "name": "search_0",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "9ba4473b-66f4-4aea-b19e-4309ec6534b8",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU3OSwxXQ==",
+ "attributes": {
+ "visState": "{\"title\":\"FIles - Source IP Address\",\"type\":\"table\",\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMeticsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"bucket\",\"params\":{\"field\":\"source.ip\",\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"size\":100,\"order\":\"desc\",\"orderBy\":\"1\",\"customLabel\":\"File IP Address\"}}],\"listeners\":{}}",
+ "description": "",
+ "title": "FIles - Source IP Address",
+ "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":null,\"direction\":null}}}}",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "type": "search",
+ "name": "search_0",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "AWDG9goqxQT5EBNmq4BP",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU4MCwxXQ==",
+ "attributes": {
+ "title": "Files - Log Count",
+ "visState": "{\"title\":\"Files - Log Count\",\"type\":\"metric\",\"params\":{\"addTooltip\":true,\"addLegend\":false,\"type\":\"gauge\",\"gauge\":{\"verticalSplit\":false,\"autoExtend\":false,\"percentageMode\":false,\"gaugeType\":\"Metric\",\"gaugeStyle\":\"Full\",\"backStyle\":\"Full\",\"orientation\":\"vertical\",\"colorSchema\":\"Green to Red\",\"gaugeColorMode\":\"None\",\"useRange\":false,\"colorsRange\":[{\"from\":0,\"to\":100}],\"invertColors\":false,\"labels\":{\"show\":false,\"color\":\"black\"},\"scale\":{\"show\":false,\"labels\":false,\"color\":\"#333\",\"width\":2},\"type\":\"simple\",\"style\":{\"fontSize\":\"30\",\"bgColor\":false,\"labelColor\":false,\"subText\":\"\",\"bgFill\":\"#FB9E00\"}}},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}}],\"listeners\":{}}",
+ "uiStateJSON": "{\"vis\":{\"defaultColors\":{\"0 - 100\":\"rgb(0,104,55)\"}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "type": "search",
+ "name": "search_0",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "1642f6f0-c44c-11ee-876e-5d93490b24bb",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:31:30.082Z",
+ "version": "Wzk1MiwxXQ==",
+ "attributes": {
+ "title": "Browse Extracted Files Link",
+ "visState": "{\"title\":\"Browse Extracted Files Link\",\"type\":\"markdown\",\"aggs\":[],\"params\":{\"fontSize\":12,\"openLinksInNewTab\":true,\"markdown\":\"[📁 Browse extracted files](/extracted-files/) (if [file extraction and scanning](/readme/docs/file-scanning.html#ZeekFileExtraction) is enabled)\"}}",
+ "uiStateJSON": "{}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"
+ }
+ },
+ "references": [],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "269ec200-7fa6-11ec-998f-a1f630163497",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU4MSwxXQ==",
+ "attributes": {
+ "title": "Files - Source",
+ "visState": "{\"title\":\"Files - Source\",\"type\":\"horizontal_bar\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.source\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Source\"},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.source\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":25,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Source\"},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":200},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"square root\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":75,\"filter\":true,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}",
+ "uiStateJSON": "{\"vis\":{\"legendOpen\":false}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"
+ },
+ "savedSearchRefName": "search_0"
+ },
+ "references": [
+ {
+ "name": "search_0",
+ "type": "search",
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "b49ab0c0-7fa9-11ec-998f-a1f630163497",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU4MiwxXQ==",
+ "attributes": {
+ "title": "Files - MIME Type",
+ "visState": "{\"title\":\"Files - MIME Type\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.mime_type\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Mime Type\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}",
+ "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":1,\"direction\":\"desc\"}}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
+ }
+ },
+ "references": [
+ {
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern",
+ "id": "arkime_sessions3-*"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "91157aa0-7fa8-11ec-998f-a1f630163497",
+ "type": "visualization",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:00.991Z",
+ "version": "WzU4MywxXQ==",
+ "attributes": {
+ "title": "Files - Paths",
+ "visState": "{\"title\":\"Files - Paths\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"event.dataset\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"-\",\"customLabel\":\"Log Type\"},\"schema\":\"bucket\"},{\"id\":\"4\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"network.protocol\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":100,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":true,\"missingBucketLabel\":\"-\",\"customLabel\":\"Protocol\"},\"schema\":\"bucket\"},{\"id\":\"5\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"file.path\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":1000,\"otherBucket\":true,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"Path\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":20,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"sort\":{\"columnIndex\":null,\"direction\":null},\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}",
+ "uiStateJSON": "{\"vis\":{\"params\":{\"sort\":{\"columnIndex\":3,\"direction\":\"desc\"}}}}",
+ "description": "",
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
+ }
+ },
+ "references": [
+ {
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern",
+ "id": "arkime_sessions3-*"
+ }
+ ],
+ "migrationVersion": {
+ "visualization": "7.10.0"
+ }
+ },
+ {
+ "id": "0aca5333-3b1c-4cda-afb4-f7dd86910459",
+ "type": "search",
+ "namespaces": [
+ "default"
+ ],
+ "updated_at": "2024-02-05T17:21:16.253Z",
+ "version": "Wzc2NCwxXQ==",
+ "attributes": {
+ "title": "Files - Logs",
+ "description": "",
+ "hits": 0,
+ "columns": [
+ "source.ip",
+ "destination.ip",
+ "file.source",
+ "file.mime_type",
+ "file.path",
+ "event.id"
+ ],
+ "sort": [
+ [
+ "firstPacket",
+ "desc"
+ ]
+ ],
+ "version": 1,
+ "kibanaSavedObjectMeta": {
+ "searchSourceJSON": "{\"highlightAll\":false,\"version\":true,\"filter\":[],\"query\":{\"query\":{\"query_string\":{\"analyze_wildcard\":true,\"query\":\"event.dataset:files\"}},\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"
+ }
+ },
+ "references": [
+ {
+ "name": "kibanaSavedObjectMeta.searchSourceJSON.index",
+ "type": "index-pattern",
+ "id": "arkime_sessions3-*"
+ }
+ ],
+ "migrationVersion": {
+ "search": "7.9.3"
+ }
+ }
+ ]
}
\ No newline at end of file
diff --git a/dashboards/templates/composable/component/suricata_stats.json b/dashboards/templates/composable/component/suricata_stats.json
new file mode 100644
index 000000000..03fb77b2c
--- /dev/null
+++ b/dashboards/templates/composable/component/suricata_stats.json
@@ -0,0 +1,201 @@
+{
+ "template": {
+ "mappings": {
+ "properties": {
+ "suricata": {
+ "properties": {
+ "stats": {
+ "properties": {
+ "app_layer.expectations": { "type": "long" },
+ "app_layer.flow.dcerpc_tcp": { "type": "long" },
+ "app_layer.flow.dcerpc_udp": { "type": "long" },
+ "app_layer.flow.dhcp": { "type": "long" },
+ "app_layer.flow.dnp3": { "type": "long" },
+ "app_layer.flow.dns_tcp": { "type": "long" },
+ "app_layer.flow.dns_udp": { "type": "long" },
+ "app_layer.flow.enip_tcp": { "type": "long" },
+ "app_layer.flow.enip_udp": { "type": "long" },
+ "app_layer.flow.failed_tcp": { "type": "long" },
+ "app_layer.flow.failed_udp": { "type": "long" },
+ "app_layer.flow.ftp": { "type": "long" },
+ "app_layer.flow.ftp-data": { "type": "long" },
+ "app_layer.flow.http": { "type": "long" },
+ "app_layer.flow.ikev2": { "type": "long" },
+ "app_layer.flow.imap": { "type": "long" },
+ "app_layer.flow.krb5_tcp": { "type": "long" },
+ "app_layer.flow.krb5_udp": { "type": "long" },
+ "app_layer.flow.modbus": { "type": "long" },
+ "app_layer.flow.mqtt": { "type": "long" },
+ "app_layer.flow.nfs_tcp": { "type": "long" },
+ "app_layer.flow.nfs_udp": { "type": "long" },
+ "app_layer.flow.ntp": { "type": "long" },
+ "app_layer.flow.rdp": { "type": "long" },
+ "app_layer.flow.rfb": { "type": "long" },
+ "app_layer.flow.sip": { "type": "long" },
+ "app_layer.flow.smb": { "type": "long" },
+ "app_layer.flow.smtp": { "type": "long" },
+ "app_layer.flow.snmp": { "type": "long" },
+ "app_layer.flow.ssh": { "type": "long" },
+ "app_layer.flow.tftp": { "type": "long" },
+ "app_layer.flow.tls": { "type": "long" },
+ "app_layer.tx.dcerpc_tcp": { "type": "long" },
+ "app_layer.tx.dcerpc_udp": { "type": "long" },
+ "app_layer.tx.dhcp": { "type": "long" },
+ "app_layer.tx.dnp3": { "type": "long" },
+ "app_layer.tx.dns_tcp": { "type": "long" },
+ "app_layer.tx.dns_udp": { "type": "long" },
+ "app_layer.tx.enip_tcp": { "type": "long" },
+ "app_layer.tx.enip_udp": { "type": "long" },
+ "app_layer.tx.ftp": { "type": "long" },
+ "app_layer.tx.ftp-data": { "type": "long" },
+ "app_layer.tx.http": { "type": "long" },
+ "app_layer.tx.ikev2": { "type": "long" },
+ "app_layer.tx.imap": { "type": "long" },
+ "app_layer.tx.krb5_tcp": { "type": "long" },
+ "app_layer.tx.krb5_udp": { "type": "long" },
+ "app_layer.tx.modbus": { "type": "long" },
+ "app_layer.tx.mqtt": { "type": "long" },
+ "app_layer.tx.nfs_tcp": { "type": "long" },
+ "app_layer.tx.nfs_udp": { "type": "long" },
+ "app_layer.tx.ntp": { "type": "long" },
+ "app_layer.tx.rdp": { "type": "long" },
+ "app_layer.tx.rfb": { "type": "long" },
+ "app_layer.tx.sip": { "type": "long" },
+ "app_layer.tx.smb": { "type": "long" },
+ "app_layer.tx.smtp": { "type": "long" },
+ "app_layer.tx.snmp": { "type": "long" },
+ "app_layer.tx.ssh": { "type": "long" },
+ "app_layer.tx.tftp": { "type": "long" },
+ "app_layer.tx.tls": { "type": "long" },
+ "capture.errors": { "type": "long" },
+ "capture.kernel_drops": { "type": "long" },
+ "capture.kernel_packets": { "type": "long" },
+ "decoder.avg_pkt_size": { "type": "long" },
+ "decoder.bytes": { "type": "long" },
+ "decoder.chdlc": { "type": "long" },
+ "decoder.erspan": { "type": "long" },
+ "decoder.ethernet": { "type": "long" },
+ "decoder.geneve": { "type": "long" },
+ "decoder.gre": { "type": "long" },
+ "decoder.icmpv4": { "type": "long" },
+ "decoder.icmpv6": { "type": "long" },
+ "decoder.ieee8021ah": { "type": "long" },
+ "decoder.invalid": { "type": "long" },
+ "decoder.ipv4": { "type": "long" },
+ "decoder.ipv4_in_ipv6": { "type": "long" },
+ "decoder.ipv6": { "type": "long" },
+ "decoder.ipv6_in_ipv6": { "type": "long" },
+ "decoder.max_mac_addrs_dst": { "type": "long" },
+ "decoder.max_mac_addrs_src": { "type": "long" },
+ "decoder.max_pkt_size": { "type": "long" },
+ "decoder.mpls": { "type": "long" },
+ "decoder.null": { "type": "long" },
+ "decoder.pkts": { "type": "long" },
+ "decoder.ppp": { "type": "long" },
+ "decoder.pppoe": { "type": "long" },
+ "decoder.raw": { "type": "long" },
+ "decoder.sctp": { "type": "long" },
+ "decoder.sll": { "type": "long" },
+ "decoder.tcp": { "type": "long" },
+ "decoder.teredo": { "type": "long" },
+ "decoder.udp": { "type": "long" },
+ "decoder.vlan": { "type": "long" },
+ "decoder.vlan_qinq": { "type": "long" },
+ "decoder.vntag": { "type": "long" },
+ "decoder.vxlan": { "type": "long" },
+ "defrag.ipv4.fragments": { "type": "long" },
+ "defrag.ipv4.reassembled": { "type": "long" },
+ "defrag.ipv4.timeouts": { "type": "long" },
+ "defrag.ipv6.fragments": { "type": "long" },
+ "defrag.ipv6.reassembled": { "type": "long" },
+ "defrag.ipv6.timeouts": { "type": "long" },
+ "defrag.max_frag_hits": { "type": "long" },
+ "detect.alert": { "type": "long" },
+ "detect.alert_queue_overflow": { "type": "long" },
+ "detect.alerts_suppressed": { "type": "long" },
+ "detect.engines": {
+ "type": "nested",
+ "properties": {
+ "id": { "type": "long" },
+ "last_reload": { "type": "date" },
+ "rules_failed": { "type": "long" },
+ "rules_loaded": { "type": "long" }
+ }
+ },
+ "file_store.open_files": { "type": "long" },
+ "flow.emerg_mode_entered": { "type": "long" },
+ "flow.emerg_mode_over": { "type": "long" },
+ "flow.get_used": { "type": "long" },
+ "flow.get_used_eval": { "type": "long" },
+ "flow.get_used_eval_busy": { "type": "long" },
+ "flow.get_used_eval_reject": { "type": "long" },
+ "flow.get_used_failed": { "type": "long" },
+ "flow.icmpv4": { "type": "long" },
+ "flow.icmpv6": { "type": "long" },
+ "flow.memcap": { "type": "long" },
+ "flow.memuse": { "type": "long" },
+ "flow.mgr.bypassed_pruned": { "type": "long" },
+ "flow.mgr.closed_pruned": { "type": "long" },
+ "flow.mgr.est_pruned": { "type": "long" },
+ "flow.mgr.flows_checked": { "type": "long" },
+ "flow.mgr.flows_evicted": { "type": "long" },
+ "flow.mgr.flows_evicted_needs_work": { "type": "long" },
+ "flow.mgr.flows_notimeout": { "type": "long" },
+ "flow.mgr.flows_timeout": { "type": "long" },
+ "flow.mgr.flows_timeout_inuse": { "type": "long" },
+ "flow.mgr.full_hash_pass": { "type": "long" },
+ "flow.mgr.new_pruned": { "type": "long" },
+ "flow.mgr.rows_maxlen": { "type": "long" },
+ "flow.spare": { "type": "long" },
+ "flow.tcp": { "type": "long" },
+ "flow.tcp_reuse": { "type": "long" },
+ "flow.udp": { "type": "long" },
+ "flow.wrk.flows_evicted": { "type": "long" },
+ "flow.wrk.flows_evicted_needs_work": { "type": "long" },
+ "flow.wrk.flows_evicted_pkt_inject": { "type": "long" },
+ "flow.wrk.flows_injected": { "type": "long" },
+ "flow.wrk.spare_sync": { "type": "long" },
+ "flow.wrk.spare_sync_avg": { "type": "long" },
+ "flow.wrk.spare_sync_empty": { "type": "long" },
+ "flow.wrk.spare_sync_incomplete": { "type": "long" },
+ "flow_bypassed.bytes": { "type": "long" },
+ "flow_bypassed.closed": { "type": "long" },
+ "flow_bypassed.local_bytes": { "type": "long" },
+ "flow_bypassed.local_capture_bytes": { "type": "long" },
+ "flow_bypassed.local_capture_pkts": { "type": "long" },
+ "flow_bypassed.local_pkts": { "type": "long" },
+ "flow_bypassed.pkts": { "type": "long" },
+ "ftp.memcap": { "type": "long" },
+ "ftp.memuse": { "type": "long" },
+ "http.memcap": { "type": "long" },
+ "http.memuse": { "type": "long" },
+ "tcp.insert_data_normal_fail": { "type": "long" },
+ "tcp.insert_data_overlap_fail": { "type": "long" },
+ "tcp.insert_list_fail": { "type": "long" },
+ "tcp.invalid_checksum": { "type": "long" },
+ "tcp.memuse": { "type": "long" },
+ "tcp.midstream_pickups": { "type": "long" },
+ "tcp.no_flow": { "type": "long" },
+ "tcp.overlap": { "type": "long" },
+ "tcp.overlap_diff_data": { "type": "long" },
+ "tcp.pkt_on_wrong_thread": { "type": "long" },
+ "tcp.pseudo": { "type": "long" },
+ "tcp.pseudo_failed": { "type": "long" },
+ "tcp.reassembly_gap": { "type": "long" },
+ "tcp.reassembly_memuse": { "type": "long" },
+ "tcp.rst": { "type": "long" },
+ "tcp.segment_memcap_drop": { "type": "long" },
+ "tcp.sessions": { "type": "long" },
+ "tcp.ssn_memcap_drop": { "type": "long" },
+ "tcp.stream_depth_reached": { "type": "long" },
+ "tcp.syn": { "type": "long" },
+ "tcp.synack": { "type": "long" },
+ "uptime": { "type": "long" }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/dashboards/templates/composable/component/zeek.json b/dashboards/templates/composable/component/zeek.json
index ee6a176ca..30f8d0f4e 100644
--- a/dashboards/templates/composable/component/zeek.json
+++ b/dashboards/templates/composable/component/zeek.json
@@ -2,6 +2,11 @@
"template": {
"mappings": {
"properties": {
+ "zeek.analyzer.cause": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "zeek.analyzer.analyzer_kind": { "type": "keyword" },
+ "zeek.analyzer.analyzer_name": { "type": "keyword" },
+ "zeek.analyzer.failure_reason": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "zeek.analyzer.failure_data": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
"zeek.conn.conn_state": { "type": "keyword" },
"zeek.conn.conn_state_description": { "type": "keyword" },
"zeek.conn.duration": { "type": "float" },
diff --git a/dashboards/templates/composable/component/zeek_diagnostic.json b/dashboards/templates/composable/component/zeek_diagnostic.json
new file mode 100644
index 000000000..eaa65e284
--- /dev/null
+++ b/dashboards/templates/composable/component/zeek_diagnostic.json
@@ -0,0 +1,65 @@
+{
+ "template": {
+ "mappings": {
+ "properties": {
+ "zeek": {
+ "properties": {
+ "broker.event_type": { "type": "keyword" },
+ "broker.event_action": { "type": "keyword" },
+ "broker.peer_ip": { "type": "keyword" },
+ "broker.peer_port": { "type": "integer" },
+ "broker.peer_message": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "capture_loss.ts_delta": { "type": "float" },
+ "capture_loss.peer": { "type": "keyword" },
+ "capture_loss.gaps": { "type": "long" },
+ "capture_loss.acks": { "type": "long" },
+ "capture_loss.percent_lost": { "type": "float" },
+ "cluster.node": { "type": "keyword" },
+ "cluster.node_message": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "config.value_name": { "type": "keyword" },
+ "config.value_old": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "config.value_new": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "config.location": { "type": "keyword" },
+ "packet_filter.node": { "type": "keyword" },
+ "packet_filter.filter": { "type": "keyword" },
+ "packet_filter.init": { "type": "keyword" },
+ "packet_filter.success": { "type": "keyword" },
+ "packet_filter.failure_reason": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "print.vals": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "reporter.node": { "type": "keyword" },
+ "reporter.filter": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "reporter.init": { "type": "keyword" },
+ "reporter.success": { "type": "keyword" },
+ "reporter.failure_reason": { "type": "keyword", "ignore_above": 1024, "fields": { "text": { "type": "text" } } },
+ "stats.peer": { "type": "keyword" },
+ "stats.mem": { "type": "long" },
+ "stats.pkts_proc": { "type": "long" },
+ "stats.bytes_recv": { "type": "long" },
+ "stats.pkts_dropped": { "type": "long" },
+ "stats.pkts_link": { "type": "long" },
+ "stats.pkt_lag": { "type": "float" },
+ "stats.pkts_filtered": { "type": "long" },
+ "stats.events_proc": { "type": "long" },
+ "stats.events_queued": { "type": "long" },
+ "stats.active_tcp_conns": { "type": "long" },
+ "stats.active_udp_conns": { "type": "long" },
+ "stats.active_icmp_conns": { "type": "long" },
+ "stats.tcp_conns": { "type": "long" },
+ "stats.udp_conns": { "type": "long" },
+ "stats.icmp_conns": { "type": "long" },
+ "stats.timers": { "type": "long" },
+ "stats.active_timers": { "type": "long" },
+ "stats.files": { "type": "long" },
+ "stats.active_files": { "type": "long" },
+ "stats.dns_requests": { "type": "long" },
+ "stats.active_dns_requests": { "type": "long" },
+ "stats.reassem_tcp_size": { "type": "long" },
+ "stats.reassem_file_size": { "type": "long" },
+ "stats.reassem_frag_size": { "type": "long" },
+ "stats.reassem_unknown_size": { "type": "long" }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/dashboards/templates/malcolm_beats_template.json b/dashboards/templates/malcolm_beats_template.json
index fdbad390e..4c9da40e4 100644
--- a/dashboards/templates/malcolm_beats_template.json
+++ b/dashboards/templates/malcolm_beats_template.json
@@ -21,7 +21,9 @@
"ecs_url",
"ecs_user",
"ecs_user_agent",
- "custom_miscbeat"
+ "custom_miscbeat",
+ "custom_suricata_stats",
+ "custom_zeek_diagnostic"
],
"template" :{
"settings" : {
diff --git a/dashboards/templates/malcolm_template.json b/dashboards/templates/malcolm_template.json
index adb4e4e1c..09bff2b8d 100644
--- a/dashboards/templates/malcolm_template.json
+++ b/dashboards/templates/malcolm_template.json
@@ -74,6 +74,7 @@
"related.mac": { "type": "keyword" },
"related.oui": { "type": "keyword" },
"related.password": { "type": "keyword", "ignore_above": 256, "fields": { "text": { "type": "text" } } },
+ "related.device_id": { "type": "integer" },
"related.device_name": { "type": "keyword" },
"related.device_type": { "type": "keyword" },
"related.manufacturer": { "type": "keyword" },
diff --git a/docker-compose-standalone.yml b/docker-compose-dev.yml
similarity index 83%
rename from docker-compose-standalone.yml
rename to docker-compose-dev.yml
index 0d670754a..0639b407a 100644
--- a/docker-compose-standalone.yml
+++ b/docker-compose-dev.yml
@@ -12,7 +12,10 @@ x-logging:
services:
opensearch:
- image: ghcr.io/idaholab/malcolm/opensearch:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/opensearch.Dockerfile
+ image: ghcr.io/idaholab/malcolm/opensearch:24.02.0
# Technically the "hedgehog" profile doesn't have OpenSearch, but in that case
# OPENSEARCH_PRIMARY will be set to remote, which means the container will
# start but not actually run OpenSearch. It's included in both profiles to
@@ -54,7 +57,10 @@ services:
retries: 3
start_period: 180s
dashboards-helper:
- image: ghcr.io/idaholab/malcolm/dashboards-helper:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/dashboards-helper.Dockerfile
+ image: ghcr.io/idaholab/malcolm/dashboards-helper:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -84,7 +90,10 @@ services:
retries: 3
start_period: 30s
dashboards:
- image: ghcr.io/idaholab/malcolm/dashboards:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/dashboards.Dockerfile
+ image: ghcr.io/idaholab/malcolm/dashboards:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -112,7 +121,10 @@ services:
retries: 3
start_period: 210s
logstash:
- image: ghcr.io/idaholab/malcolm/logstash-oss:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/logstash.Dockerfile
+ image: ghcr.io/idaholab/malcolm/logstash-oss:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -148,6 +160,10 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- ./.opensearch.secondary.curlrc:/var/local/curlrc/.opensearch.secondary.curlrc:ro
+ - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.orig.yml:ro
+ - ./logstash/pipelines:/usr/share/logstash/malcolm-pipelines.available:ro
+ - ./logstash/patterns:/usr/share/logstash/malcolm-patterns:ro
+ - ./logstash/ruby:/usr/share/logstash/malcolm-ruby:ro
- ./logstash/maps/malcolm_severity.yaml:/etc/malcolm_severity.yaml:ro
- ./logstash/certs/ca.crt:/certs/ca.crt:ro
- ./logstash/certs/server.crt:/certs/server.crt:ro
@@ -159,7 +175,10 @@ services:
retries: 3
start_period: 600s
filebeat:
- image: ghcr.io/idaholab/malcolm/filebeat-oss:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/filebeat.Dockerfile
+ image: ghcr.io/idaholab/malcolm/filebeat-oss:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -194,7 +213,10 @@ services:
retries: 3
start_period: 60s
arkime:
- image: ghcr.io/idaholab/malcolm/arkime:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/arkime.Dockerfile
+ image: ghcr.io/idaholab/malcolm/arkime:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -210,7 +232,6 @@ services:
- ./config/upload-common.env
- ./config/auth.env
- ./config/arkime.env
- - ./config/arkime-offline.env
- ./config/arkime-secret.env
environment:
VIRTUAL_HOST : 'arkime.malcolm.local'
@@ -219,8 +240,11 @@ services:
volumes:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- - ./arkime/rules:/opt/arkime/rules:ro
- ./pcap:/data/pcap
+ - ./arkime/rules:/opt/arkime/rules:ro
+ - ./arkime/etc/config.ini:/opt/arkime/etc/config.orig.ini:ro
+ - ./arkime/etc/user_settings.json:/opt/arkime/etc/user_settings.json:ro
+ - ./arkime/wise/source.zeeklogs.js:/opt/arkime/wiseService/source.zeeklogs.js:ro
healthcheck:
test: ["CMD", "curl", "--insecure", "--silent", "--fail", "https://localhost:8005/_ns_/nstest.html"]
interval: 90s
@@ -228,7 +252,10 @@ services:
retries: 3
start_period: 210s
arkime-live:
- image: ghcr.io/idaholab/malcolm/arkime:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/arkime.Dockerfile
+ image: ghcr.io/idaholab/malcolm/arkime:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -258,10 +285,16 @@ services:
volumes:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- - ./arkime/rules:/opt/arkime/rules:ro
- ./pcap:/data/pcap
+ - ./arkime/rules:/opt/arkime/rules:ro
+ - ./arkime/etc/config.ini:/opt/arkime/etc/config.orig.ini:ro
+ - ./arkime/etc/user_settings.json:/opt/arkime/etc/user_settings.json:ro
+ - ./arkime/wise/source.zeeklogs.js:/opt/arkime/wiseService/source.zeeklogs.js:ro
zeek:
- image: ghcr.io/idaholab/malcolm/zeek:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/zeek.Dockerfile
+ image: ghcr.io/idaholab/malcolm/zeek:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -284,6 +317,7 @@ services:
- ./pcap:/pcap
- ./zeek-logs/upload:/zeek/upload
- ./zeek-logs/extract_files:/zeek/extract_files
+ - ./zeek/config/local.zeek:/opt/zeek/share/zeek/site/local.zeek:ro
- ./zeek/intel:/opt/zeek/share/zeek/site/intel
- ./zeek/custom:/opt/zeek/share/zeek/site/custom:ro
healthcheck:
@@ -293,7 +327,10 @@ services:
retries: 3
start_period: 60s
zeek-live:
- image: ghcr.io/idaholab/malcolm/zeek:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/zeek.Dockerfile
+ image: ghcr.io/idaholab/malcolm/zeek:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -318,10 +355,14 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./zeek-logs/live:/zeek/live
- ./zeek-logs/extract_files:/zeek/extract_files
+ - ./zeek/config/local.zeek:/opt/zeek/share/zeek/site/local.zeek:ro
- ./zeek/intel:/opt/zeek/share/zeek/site/intel
- ./zeek/custom:/opt/zeek/share/zeek/site/custom:ro
suricata:
- image: ghcr.io/idaholab/malcolm/suricata:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/suricata.Dockerfile
+ image: ghcr.io/idaholab/malcolm/suricata:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -349,7 +390,10 @@ services:
retries: 3
start_period: 120s
suricata-live:
- image: ghcr.io/idaholab/malcolm/suricata:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/suricata.Dockerfile
+ image: ghcr.io/idaholab/malcolm/suricata:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -364,7 +408,7 @@ services:
# NET_ADMIN and NET_RAW - to turn on promiscuous mode and capture raw packets
- NET_ADMIN
- NET_RAW
- # SYS_NICE - to set process nice values and scheduling policies for capture
+ # SYS_NICE - to set process nice values, real-timescheduling policies, I/O scheduling
- SYS_NICE
env_file:
- ./config/process.env
@@ -379,7 +423,10 @@ services:
- ./suricata/rules:/opt/suricata/rules:ro
- ./suricata/include-configs:/opt/suricata/include-configs:ro
file-monitor:
- image: ghcr.io/idaholab/malcolm/file-monitor:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/file-monitor.Dockerfile
+ image: ghcr.io/idaholab/malcolm/file-monitor:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -391,6 +438,7 @@ services:
env_file:
- ./config/process.env
- ./config/ssl.env
+ - ./config/dashboards.env
- ./config/zeek.env
- ./config/zeek-secret.env
environment:
@@ -407,7 +455,10 @@ services:
retries: 3
start_period: 60s
pcap-capture:
- image: ghcr.io/idaholab/malcolm/pcap-capture:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/pcap-capture.Dockerfile
+ image: ghcr.io/idaholab/malcolm/pcap-capture:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -436,7 +487,10 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./pcap/upload:/pcap
pcap-monitor:
- image: ghcr.io/idaholab/malcolm/pcap-monitor:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/pcap-monitor.Dockerfile
+ image: ghcr.io/idaholab/malcolm/pcap-monitor:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -464,7 +518,10 @@ services:
retries: 3
start_period: 90s
upload:
- image: ghcr.io/idaholab/malcolm/file-upload:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/file-upload.Dockerfile
+ image: ghcr.io/idaholab/malcolm/file-upload:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -491,9 +548,12 @@ services:
retries: 3
start_period: 60s
htadmin:
- image: ghcr.io/idaholab/malcolm/htadmin:24.01.0
+ image: ghcr.io/idaholab/malcolm/htadmin:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/htadmin.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -518,9 +578,12 @@ services:
retries: 3
start_period: 60s
freq:
- image: ghcr.io/idaholab/malcolm/freq:24.01.0
+ image: ghcr.io/idaholab/malcolm/freq:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/freq.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -542,9 +605,12 @@ services:
retries: 3
start_period: 60s
netbox:
- image: ghcr.io/idaholab/malcolm/netbox:24.01.0
+ image: ghcr.io/idaholab/malcolm/netbox:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/netbox.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -576,9 +642,12 @@ services:
retries: 3
start_period: 120s
netbox-postgres:
- image: ghcr.io/idaholab/malcolm/postgresql:24.01.0
+ image: ghcr.io/idaholab/malcolm/postgresql:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/postgresql.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -602,9 +671,12 @@ services:
retries: 3
start_period: 45s
netbox-redis:
- image: ghcr.io/idaholab/malcolm/redis:24.01.0
+ image: ghcr.io/idaholab/malcolm/redis:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/redis.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -632,9 +704,12 @@ services:
retries: 3
start_period: 45s
netbox-redis-cache:
- image: ghcr.io/idaholab/malcolm/redis:24.01.0
+ image: ghcr.io/idaholab/malcolm/redis:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/redis.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -661,9 +736,12 @@ services:
retries: 3
start_period: 45s
api:
- image: ghcr.io/idaholab/malcolm/api:24.01.0
+ image: ghcr.io/idaholab/malcolm/api:24.02.0
profiles: ["malcolm"]
logging: *default-logging
+ build:
+ context: .
+ dockerfile: Dockerfiles/api.Dockerfile
command: gunicorn --bind 0:5000 manage:app
restart: "no"
stdin_open: false
@@ -688,7 +766,10 @@ services:
retries: 3
start_period: 60s
nginx-proxy:
- image: ghcr.io/idaholab/malcolm/nginx-proxy:24.01.0
+ build:
+ context: .
+ dockerfile: Dockerfiles/nginx.Dockerfile
+ image: ghcr.io/idaholab/malcolm/nginx-proxy:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -700,6 +781,8 @@ services:
env_file:
- ./config/process.env
- ./config/ssl.env
+ - ./config/opensearch.env
+ - ./config/dashboards.env
- ./config/auth-common.env
- ./config/nginx.env
depends_on:
diff --git a/docker-compose.yml b/docker-compose.yml
index b72ace183..ae9444ecc 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -12,10 +12,7 @@ x-logging:
services:
opensearch:
- build:
- context: .
- dockerfile: Dockerfiles/opensearch.Dockerfile
- image: ghcr.io/idaholab/malcolm/opensearch:24.01.0
+ image: ghcr.io/idaholab/malcolm/opensearch:24.02.0
# Technically the "hedgehog" profile doesn't have OpenSearch, but in that case
# OPENSEARCH_PRIMARY will be set to remote, which means the container will
# start but not actually run OpenSearch. It's included in both profiles to
@@ -57,10 +54,7 @@ services:
retries: 3
start_period: 180s
dashboards-helper:
- build:
- context: .
- dockerfile: Dockerfiles/dashboards-helper.Dockerfile
- image: ghcr.io/idaholab/malcolm/dashboards-helper:24.01.0
+ image: ghcr.io/idaholab/malcolm/dashboards-helper:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -90,10 +84,7 @@ services:
retries: 3
start_period: 30s
dashboards:
- build:
- context: .
- dockerfile: Dockerfiles/dashboards.Dockerfile
- image: ghcr.io/idaholab/malcolm/dashboards:24.01.0
+ image: ghcr.io/idaholab/malcolm/dashboards:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -121,10 +112,7 @@ services:
retries: 3
start_period: 210s
logstash:
- build:
- context: .
- dockerfile: Dockerfiles/logstash.Dockerfile
- image: ghcr.io/idaholab/malcolm/logstash-oss:24.01.0
+ image: ghcr.io/idaholab/malcolm/logstash-oss:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -160,10 +148,6 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- ./.opensearch.secondary.curlrc:/var/local/curlrc/.opensearch.secondary.curlrc:ro
- - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.orig.yml:ro
- - ./logstash/pipelines:/usr/share/logstash/malcolm-pipelines.available:ro
- - ./logstash/patterns:/usr/share/logstash/malcolm-patterns:ro
- - ./logstash/ruby:/usr/share/logstash/malcolm-ruby:ro
- ./logstash/maps/malcolm_severity.yaml:/etc/malcolm_severity.yaml:ro
- ./logstash/certs/ca.crt:/certs/ca.crt:ro
- ./logstash/certs/server.crt:/certs/server.crt:ro
@@ -175,10 +159,7 @@ services:
retries: 3
start_period: 600s
filebeat:
- build:
- context: .
- dockerfile: Dockerfiles/filebeat.Dockerfile
- image: ghcr.io/idaholab/malcolm/filebeat-oss:24.01.0
+ image: ghcr.io/idaholab/malcolm/filebeat-oss:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -213,10 +194,7 @@ services:
retries: 3
start_period: 60s
arkime:
- build:
- context: .
- dockerfile: Dockerfiles/arkime.Dockerfile
- image: ghcr.io/idaholab/malcolm/arkime:24.01.0
+ image: ghcr.io/idaholab/malcolm/arkime:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -232,6 +210,7 @@ services:
- ./config/upload-common.env
- ./config/auth.env
- ./config/arkime.env
+ - ./config/arkime-offline.env
- ./config/arkime-secret.env
environment:
VIRTUAL_HOST : 'arkime.malcolm.local'
@@ -240,11 +219,8 @@ services:
volumes:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- - ./pcap:/data/pcap
- ./arkime/rules:/opt/arkime/rules:ro
- - ./arkime/etc/config.ini:/opt/arkime/etc/config.orig.ini:ro
- - ./arkime/etc/user_settings.json:/opt/arkime/etc/user_settings.json:ro
- - ./arkime/wise/source.zeeklogs.js:/opt/arkime/wiseService/source.zeeklogs.js:ro
+ - ./pcap:/data/pcap
healthcheck:
test: ["CMD", "curl", "--insecure", "--silent", "--fail", "https://localhost:8005/_ns_/nstest.html"]
interval: 90s
@@ -252,10 +228,7 @@ services:
retries: 3
start_period: 210s
arkime-live:
- build:
- context: .
- dockerfile: Dockerfiles/arkime.Dockerfile
- image: ghcr.io/idaholab/malcolm/arkime:24.01.0
+ image: ghcr.io/idaholab/malcolm/arkime:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -285,16 +258,10 @@ services:
volumes:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
- - ./pcap:/data/pcap
- ./arkime/rules:/opt/arkime/rules:ro
- - ./arkime/etc/config.ini:/opt/arkime/etc/config.orig.ini:ro
- - ./arkime/etc/user_settings.json:/opt/arkime/etc/user_settings.json:ro
- - ./arkime/wise/source.zeeklogs.js:/opt/arkime/wiseService/source.zeeklogs.js:ro
+ - ./pcap:/data/pcap
zeek:
- build:
- context: .
- dockerfile: Dockerfiles/zeek.Dockerfile
- image: ghcr.io/idaholab/malcolm/zeek:24.01.0
+ image: ghcr.io/idaholab/malcolm/zeek:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -317,7 +284,6 @@ services:
- ./pcap:/pcap
- ./zeek-logs/upload:/zeek/upload
- ./zeek-logs/extract_files:/zeek/extract_files
- - ./zeek/config/local.zeek:/opt/zeek/share/zeek/site/local.zeek:ro
- ./zeek/intel:/opt/zeek/share/zeek/site/intel
- ./zeek/custom:/opt/zeek/share/zeek/site/custom:ro
healthcheck:
@@ -327,10 +293,7 @@ services:
retries: 3
start_period: 60s
zeek-live:
- build:
- context: .
- dockerfile: Dockerfiles/zeek.Dockerfile
- image: ghcr.io/idaholab/malcolm/zeek:24.01.0
+ image: ghcr.io/idaholab/malcolm/zeek:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -341,7 +304,7 @@ services:
# NET_ADMIN and NET_RAW - to turn on promiscuous mode and capture raw packets
- NET_ADMIN
- NET_RAW
- # SYS_NICE - to set process nice values, real-timescheduling policies, I/O scheduling
+ # SYS_NICE - to set process nice values, real-time scheduling policies, I/O scheduling
- SYS_NICE
env_file:
- ./config/process.env
@@ -355,14 +318,10 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./zeek-logs/live:/zeek/live
- ./zeek-logs/extract_files:/zeek/extract_files
- - ./zeek/config/local.zeek:/opt/zeek/share/zeek/site/local.zeek:ro
- ./zeek/intel:/opt/zeek/share/zeek/site/intel
- ./zeek/custom:/opt/zeek/share/zeek/site/custom:ro
suricata:
- build:
- context: .
- dockerfile: Dockerfiles/suricata.Dockerfile
- image: ghcr.io/idaholab/malcolm/suricata:24.01.0
+ image: ghcr.io/idaholab/malcolm/suricata:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -390,10 +349,7 @@ services:
retries: 3
start_period: 120s
suricata-live:
- build:
- context: .
- dockerfile: Dockerfiles/suricata.Dockerfile
- image: ghcr.io/idaholab/malcolm/suricata:24.01.0
+ image: ghcr.io/idaholab/malcolm/suricata:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -408,7 +364,7 @@ services:
# NET_ADMIN and NET_RAW - to turn on promiscuous mode and capture raw packets
- NET_ADMIN
- NET_RAW
- # SYS_NICE - to set process nice values, real-timescheduling policies, I/O scheduling
+ # SYS_NICE - to set process nice values and scheduling policies for capture
- SYS_NICE
env_file:
- ./config/process.env
@@ -423,10 +379,7 @@ services:
- ./suricata/rules:/opt/suricata/rules:ro
- ./suricata/include-configs:/opt/suricata/include-configs:ro
file-monitor:
- build:
- context: .
- dockerfile: Dockerfiles/file-monitor.Dockerfile
- image: ghcr.io/idaholab/malcolm/file-monitor:24.01.0
+ image: ghcr.io/idaholab/malcolm/file-monitor:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -438,6 +391,7 @@ services:
env_file:
- ./config/process.env
- ./config/ssl.env
+ - ./config/dashboards.env
- ./config/zeek.env
- ./config/zeek-secret.env
environment:
@@ -454,10 +408,7 @@ services:
retries: 3
start_period: 60s
pcap-capture:
- build:
- context: .
- dockerfile: Dockerfiles/pcap-capture.Dockerfile
- image: ghcr.io/idaholab/malcolm/pcap-capture:24.01.0
+ image: ghcr.io/idaholab/malcolm/pcap-capture:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -486,10 +437,7 @@ services:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./pcap/upload:/pcap
pcap-monitor:
- build:
- context: .
- dockerfile: Dockerfiles/pcap-monitor.Dockerfile
- image: ghcr.io/idaholab/malcolm/pcap-monitor:24.01.0
+ image: ghcr.io/idaholab/malcolm/pcap-monitor:24.02.0
profiles: ["malcolm", "hedgehog"]
logging: *default-logging
restart: "no"
@@ -517,10 +465,7 @@ services:
retries: 3
start_period: 90s
upload:
- build:
- context: .
- dockerfile: Dockerfiles/file-upload.Dockerfile
- image: ghcr.io/idaholab/malcolm/file-upload:24.01.0
+ image: ghcr.io/idaholab/malcolm/file-upload:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -547,12 +492,9 @@ services:
retries: 3
start_period: 60s
htadmin:
- image: ghcr.io/idaholab/malcolm/htadmin:24.01.0
+ image: ghcr.io/idaholab/malcolm/htadmin:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/htadmin.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -577,12 +519,9 @@ services:
retries: 3
start_period: 60s
freq:
- image: ghcr.io/idaholab/malcolm/freq:24.01.0
+ image: ghcr.io/idaholab/malcolm/freq:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/freq.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -604,12 +543,9 @@ services:
retries: 3
start_period: 60s
netbox:
- image: ghcr.io/idaholab/malcolm/netbox:24.01.0
+ image: ghcr.io/idaholab/malcolm/netbox:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/netbox.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -641,12 +577,9 @@ services:
retries: 3
start_period: 120s
netbox-postgres:
- image: ghcr.io/idaholab/malcolm/postgresql:24.01.0
+ image: ghcr.io/idaholab/malcolm/postgresql:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/postgresql.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -670,12 +603,9 @@ services:
retries: 3
start_period: 45s
netbox-redis:
- image: ghcr.io/idaholab/malcolm/redis:24.01.0
+ image: ghcr.io/idaholab/malcolm/redis:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/redis.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -703,12 +633,9 @@ services:
retries: 3
start_period: 45s
netbox-redis-cache:
- image: ghcr.io/idaholab/malcolm/redis:24.01.0
+ image: ghcr.io/idaholab/malcolm/redis:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/redis.Dockerfile
restart: "no"
stdin_open: false
tty: true
@@ -735,12 +662,9 @@ services:
retries: 3
start_period: 45s
api:
- image: ghcr.io/idaholab/malcolm/api:24.01.0
+ image: ghcr.io/idaholab/malcolm/api:24.02.0
profiles: ["malcolm"]
logging: *default-logging
- build:
- context: .
- dockerfile: Dockerfiles/api.Dockerfile
command: gunicorn --bind 0:5000 manage:app
restart: "no"
stdin_open: false
@@ -765,10 +689,7 @@ services:
retries: 3
start_period: 60s
nginx-proxy:
- build:
- context: .
- dockerfile: Dockerfiles/nginx.Dockerfile
- image: ghcr.io/idaholab/malcolm/nginx-proxy:24.01.0
+ image: ghcr.io/idaholab/malcolm/nginx-proxy:24.02.0
profiles: ["malcolm"]
logging: *default-logging
restart: "no"
@@ -780,6 +701,8 @@ services:
env_file:
- ./config/process.env
- ./config/ssl.env
+ - ./config/opensearch.env
+ - ./config/dashboards.env
- ./config/auth-common.env
- ./config/nginx.env
depends_on:
diff --git a/docs/README.md b/docs/README.md
index 560f87caa..6883a6d8f 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -72,6 +72,10 @@ Malcolm can also easily be deployed locally on an ordinary consumer workstation
* [Screenshots](dashboards.md#PrebuiltVisualizationsGallery)
+ [Building your own visualizations and dashboards](dashboards.md#BuildDashboard)
* [Screenshots](dashboards.md#NewVisualizationsGallery)
+ - [Anomaly Detection](anomaly-detection.md#AnomalyDetection)
+ - [Reporting](reporting.md#Reporting)
+ - [Alerting](alerting.md#Alerting)
+ + [Email Sender Accounts](alerting.md#AlertingEmail)
* [Search Queries in Arkime and OpenSearch Dashboards](queries-cheat-sheet.md#SearchCheatSheet)
* Other Malcolm features
- [Custom Rules and Scripts](custom-rules.md#CustomRulesAndScripts)
@@ -80,15 +84,15 @@ Malcolm can also easily be deployed locally on an ordinary consumer workstation
+ [YARA](custom-rules.md#YARA)
+ [Other Customizations](custom-rules.md#Other)
- [Automatic file extraction and scanning](file-scanning.md#ZeekFileExtraction)
- - [OpenSearch index management](index-management.md#IndexManagement)
+ + [User interface](file-scanning.md#ZeekFileExtractionUI)
+ - [Index management](index-management.md#
+ + [OpenSearch index management](index-management.md#OpenSearchIndexManagement)
+ + [Using ILM/ISM with Arkime](index-management.md#ArkimeIndexPolicies)
- [Event severity scoring](severity.md#Severity)
+ [Customizing event severity scoring](severity.md#SeverityConfig)
- [Zeek Intelligence Framework](zeek-intel.md#ZeekIntel)
+ [STIX™ and TAXII™](zeek-intel.md#ZeekIntelSTIX)
+ [MISP](zeek-intel.md#ZeekIntelMISP)
- - [Anomaly Detection](anomaly-detection.md#AnomalyDetection)
- - [Alerting](alerting.md#Alerting)
- + [Email Sender Accounts](alerting.md#AlertingEmail)
- ["Best Guess" Fingerprinting for ICS Protocols](ics-best-guess.md#ICSBestGuess)
- [Asset Interaction Analysis](asset-interaction-analysis.md#AssetInteractionAnalysis)
+ [Enriching network traffic metadata via NetBox lookups](asset-interaction-analysis.md#NetBoxEnrichment)
@@ -96,6 +100,7 @@ Malcolm can also easily be deployed locally on an ordinary consumer workstation
+ Populating the NetBox inventory
* [Manually](asset-interaction-analysis.md#NetBoxPopManual)
* [Via passively-gathered network traffic metadata](asset-interaction-analysis.md#NetBoxPopPassive)
+ - [Matching device manufacturers to OUIs](asset-interaction-analysis.md#NetBoxPopPassiveOUIMatch)
* [Via active discovery](asset-interaction-analysis.md#NetBoxPopActive)
+ [Compare NetBox inventory with database of known vulnerabilities](asset-interaction-analysis.md#NetBoxVuln)
+ [Preloading NetBox inventory](asset-interaction-analysis.md#NetBoxPreload)
diff --git a/docs/api-version.md b/docs/api-version.md
index 50f4af4e5..76364f95c 100644
--- a/docs/api-version.md
+++ b/docs/api-version.md
@@ -47,6 +47,6 @@ Returns version information about Malcolm and version/[health](https://opensearc
}
},
"sha": "77574975",
- "version": "24.01.0"
+ "version": "24.02.0"
}
```
diff --git a/docs/asset-interaction-analysis.md b/docs/asset-interaction-analysis.md
index c3e0fc678..ab8e798d1 100644
--- a/docs/asset-interaction-analysis.md
+++ b/docs/asset-interaction-analysis.md
@@ -5,6 +5,7 @@
* Populating the NetBox inventory
- [Manually](#NetBoxPopManual)
- [Via passively-gathered network traffic metadata](#NetBoxPopPassive)
+ + [Matching device manufacturers to OUIs](#NetBoxPopPassiveOUIMatch)
- [Via active discovery](#NetBoxPopActive)
* [Compare NetBox inventory with database of known vulnerabilities](#NetBoxVuln)
* [Preloading NetBox inventory](#NetBoxPreload)
@@ -40,6 +41,7 @@ As Zeek logs and Suricata alerts are parsed and enriched (if the `LOGSTASH_NETBO
* `source.…` same as `destination.…`
* collected as `related` fields (the [same approach](https://www.elastic.co/guide/en/ecs/current/ecs-related.html) used in ECS)
- `related.device_type`
+ - `related.device_id`
- `related.device_name`
- `related.manufacturer`
- `related.role`
@@ -104,6 +106,17 @@ Although network devices can be automatically created using this method, [servic
See [idaholab/Malcolm#135](https://github.com/idaholab/Malcolm/issues/135) for more information on this feature.
+### Matching device manufacturers to OUIs
+
+Malcolm's NetBox inventory is prepopulated with a collection of [community-sourced device type definitions](https://github.com/netbox-community/devicetype-library) which can then be augmented by users [manually](#NetBoxPopManual) or through [preloading](#NetBoxPreload). During passive autopopulation device manufacturer is inferred from organizationally unique identifiers (OUIs), which make up the first three octets of a MAC address. The IEEE Standards Association maintains the [registry of OUIs](https://standards-oui.ieee.org/), which is not necessarily very internally consistent with how organizations specify the name associated with their OUI entry. In other words, there's not a foolproof programattic way for Malcolm to map MAC address OUI organization names to NetBox manufacturer names, barring creating and maintaining a manual mapping (which would be very large and difficult to keep up-to-date).
+
+Malcolm's [NetBox lookup code]({{ site.github.repository_url }}/blob/{{ site.github.build_revision }}/logstash/ruby/netbox_enrich.rb) used in the log enrichment pipeline attempts to match OUI organization names against the list of NetBox's manufacturers using ["fuzzy string matching"](https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance), a technique in which two strings of characters are compared and assigned a similarity score between `0` (completely dissimilar) and `1` (identical). The `NETBOX_DEFAULT_FUZZY_THRESHOLD` [environment variable in `netbox-common.env`](malcolm-config.md#MalcolmConfigEnvVars) can be used to tune the threshold for determining a match. A fairly high value is recommended (above `0.85`; `0.95` is the default) to avoid autopopulating the NetBox inventory with devices with manufacturers that don't actually exist in the network being monitored.
+
+Users may select between two behaviors for when the match threshold is not met (i.e., no manufacturer is found in the NetBox database which closely matches the OUI organization name). This behavior is specified by the `NETBOX_DEFAULT_AUTOCREATE_MANUFACTURER` [environment variable in `netbox-common.env`](malcolm-config.md#MalcolmConfigEnvVars):
+
+* `NETBOX_DEFAULT_AUTOCREATE_MANUFACTURER=false` - the autopopulated device will be created with the manufacturer set to `Unspecified`
+* `NETBOX_DEFAULT_AUTOCREATE_MANUFACTURER=true` - the autopopulated device will be created along with a new manufacturer entry in the NetBox database set to the OUI organization name
+
## Populate NetBox inventory via active discovery
See [idaholab/Malcolm#136](https://github.com/idaholab/Malcolm/issues/136).
diff --git a/docs/contributing-local-modifications.md b/docs/contributing-local-modifications.md
index 8f2491351..438f33a19 100644
--- a/docs/contributing-local-modifications.md
+++ b/docs/contributing-local-modifications.md
@@ -7,7 +7,7 @@ There are several ways to customize Malcolm's runtime behavior via local changes
Some configuration changes can be put in place by modifying local copies of configuration files and then using a [Docker bind mount](https://docs.docker.com/storage/bind-mounts/) to overlay the modified file onto the running Malcolm container. This is already done for many files and directories used to persist Malcolm configuration and data. For example, the default list of bind mounted files and directories for each Malcolm service is as follows:
```
-$ grep -P "^( - ./| [\w-]+:)" docker-compose-standalone.yml
+$ grep -P "^( - ./| [\w-]+:)" docker-compose.yml
opensearch:
- ./nginx/ca-trust:/var/local/ca-trust:ro
- ./.opensearch.primary.curlrc:/var/local/curlrc/.opensearch.primary.curlrc:ro
diff --git a/docs/contributing-new-image.md b/docs/contributing-new-image.md
index 5cb3597ff..3dac78092 100644
--- a/docs/contributing-new-image.md
+++ b/docs/contributing-new-image.md
@@ -4,7 +4,7 @@ A new service can be added to Malcolm by following the following steps:
1. Create a new subdirectory for the service (under the Malcolm working copy base directory) containing whatever source or configuration files are necessary to build and run the service
1. Create the service's Dockerfile in the [Dockerfiles]({{ site.github.repository_url }}/blob/{{ site.github.build_revision }}/Dockerfiles) directory of the Malcolm working copy
-1. Add a new section for the service under `services:` in the `docker-compose.yml` and `docker-compose-standalone.yml` files
+1. Add a new section for the service under `services:` in the `docker-compose.yml` and `docker-compose-dev.yml` files
1. To enable automatic builds for the service on GitHub, create a new [workflow]({{ site.github.repository_url }}/tree/{{ site.github.build_revision }}/.github/workflows/), using an existing workflow as an example
## Networking and firewall
diff --git a/docs/contributing-pcap.md b/docs/contributing-pcap.md
index 62ed8e26b..167235639 100644
--- a/docs/contributing-pcap.md
+++ b/docs/contributing-pcap.md
@@ -1,6 +1,6 @@
# PCAP processors
-When a PCAP is uploaded (either through Malcolm's [upload web interface](upload.md#Upload) or just copied manually into the `./pcap/upload` directory), the `pcap-monitor` container has a script that picks up those PCAP files and publishes to a [ZeroMQ](https://zeromq.org/) topic that can be subscribed to by any other process that wants to analyze that PCAP. In Malcolm (at the time of the [v24.01.0 release]({{ site.github.repository_url }}/releases/tag/v24.01.0)), there are three such ZeroMQ topics: the `zeek`, `suricata` and `arkime` containers. These actually share the [same script]({{ site.github.repository_url }}/blob/{{ site.github.build_revision }}/shared/bin/pcap_processor.py) to run the PCAP through Zeek, Suricata, and Arkime, respectively. For an example to follow, the `zeek` container is the less complicated of the two. To integrate a new PCAP processing tool into Malcolm (named `cooltool` for this example) the process would entail:
+When a PCAP is uploaded (either through Malcolm's [upload web interface](upload.md#Upload) or just copied manually into the `./pcap/upload` directory), the `pcap-monitor` container has a script that picks up those PCAP files and publishes to a [ZeroMQ](https://zeromq.org/) topic that can be subscribed to by any other process that wants to analyze that PCAP. In Malcolm (at the time of the [v24.02.0 release]({{ site.github.repository_url }}/releases/tag/v24.02.0)), there are three such ZeroMQ topics: the `zeek`, `suricata` and `arkime` containers. These actually share the [same script]({{ site.github.repository_url }}/blob/{{ site.github.build_revision }}/shared/bin/pcap_processor.py) to run the PCAP through Zeek, Suricata, and Arkime, respectively. For an example to follow, the `zeek` container is the less complicated of the two. To integrate a new PCAP processing tool into Malcolm (named `cooltool` for this example) the process would entail:
1. Define the service as instructed in the [Adding a new service](contributing-new-image.md#NewImage) section
* Note how the existing `zeek` and `arkime` services use [bind mounts](contributing-local-modifications.md#Bind) to access the local `./pcap` directory
diff --git a/docs/development.md b/docs/development.md
index 7b338341a..b59bc3b49 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -37,8 +37,8 @@ Checking out the [Malcolm source code]({{ site.github.repository_url }}/tree/{{
and the following files of special note:
-* `docker-compose.yml` - the configuration file used by `docker compose` to build, start, and stop an instance of the Malcolm appliance
-* `docker-compose-standalone.yml` - similar to `docker-compose.yml`, only used for the ["packaged"](#Packager) installation of Malcolm
+* `docker-compose-dev.yml` - the configuration file used by `docker compose` to build, start, and stop an instance of the Malcolm appliance
+* `docker-compose.yml` - similar to `docker-compose-dev.yml`, only used for the ["packaged"](#Packager) installation of Malcolm
## Building from source
@@ -121,14 +121,7 @@ To start, stop, restart, etc. Malcolm:
- wipe (stop Malcolm and clear its database)
- auth_setup (change authentication-related settings)
-A minute or so after starting Malcolm, the following services will be accessible:
- - Arkime: https://localhost/
- - OpenSearch Dashboards: https://localhost/dashboards/
- - PCAP upload (web): https://localhost/upload/
- - PCAP upload (sftp): sftp://USERNAME@127.0.0.1:8022/files/
- - NetBox: https://localhost/netbox/
- - Account management: https://localhost/auth/
- - Documentation: https://localhost/readme/
+Malcolm services can be accessed at https:///
```
The above example will result in the following artifacts for distribution as explained in the script's output:
diff --git a/docs/download.md b/docs/download.md
index ba86b6edd..2ce9b8a65 100644
--- a/docs/download.md
+++ b/docs/download.md
@@ -16,7 +16,7 @@ While official downloads of the Malcolm installer ISO are not provided, an **uno
| ISO | SHA256 |
|---|---|
-| [malcolm-24.01.0.iso](/iso/malcolm-24.01.0.iso) (5.2GiB) | [`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`](/iso/malcolm-24.01.0.iso.sha256.txt) |
+| [malcolm-24.02.0.iso](/iso/malcolm-24.02.0.iso) (5.2GiB) | [`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`](/iso/malcolm-24.02.0.iso.sha256.txt) |
## Hedgehog Linux
@@ -26,7 +26,15 @@ While official downloads of the Malcolm installer ISO are not provided, an **uno
| ISO | SHA256 |
|---|---|
-| [hedgehog-24.01.0.iso](/iso/hedgehog-24.01.0.iso) (2.4GiB) | [`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`](/iso/hedgehog-24.01.0.iso.sha256.txt) |
+| [hedgehog-24.02.0.iso](/iso/hedgehog-24.02.0.iso) (2.4GiB) | [`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`](/iso/hedgehog-24.02.0.iso.sha256.txt) |
+
+### Raspberry Pi 4 Image
+
+[Instructions are provided](hedgehog-raspi-build.md#HedgehogRaspiBuild) to generate the Hedgehog Linux Raspberry Pi image from source. While official downloads of the Hedgehog Linux image are not provided, an **unofficial build** of the image for the latest stable release is available for download here. This image is compatible with Raspberry Pi 4 models.
+
+| Image | SHA256 |
+|---|---|
+| [raspi_4_bookworm.img.xz](/iso/raspi_4_bookworm.img.xz) (1.4GiB) | [`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`](/iso/raspi_4_bookworm.img.xz.sha256.txt) |
## Warning
diff --git a/docs/file-scanning.md b/docs/file-scanning.md
index 30dfbd8a6..06cc4150c 100644
--- a/docs/file-scanning.md
+++ b/docs/file-scanning.md
@@ -1,5 +1,8 @@
# Automatic file extraction and scanning
+* [Automatic file extraction and scanning](#ZeekFileExtraction)
+ - [User interface](#ZeekFileExtractionUI)
+
Malcolm can leverage Zeek's knowledge of network protocols to automatically detect file transfers and extract those files from PCAPs as Zeek processes them. This behavior can be enabled globally by modifying the `ZEEK_EXTRACTOR_MODE` [variable in `zeek.env`](malcolm-config.md#MalcolmConfigEnvVars), or on a per-upload basis for PCAP files uploaded via the [browser-based upload form](upload.md#Upload) when **Analyze with Zeek** is selected.
To specify which files should be extracted, the following values are acceptable in `ZEEK_EXTRACTOR_MODE`:
@@ -44,3 +47,19 @@ The `EXTRACTED_FILE_HTTP_SERVER_…` [environment variables in `zeek.env` and `z
- downloaded files are downloaded as-is, without archival or compression:
+ `EXTRACTED_FILE_HTTP_SERVER_ZIP=false`
+ `EXTRACTED_FILE_HTTP_SERVER_KEY=`
+
+## User interface
+
+The files extracted by Zeek and the data about those files can be accessed through several of Malcolm's user interfaces.
+
+* The [Files dashboard](dashboards.md#PrebuiltVisualizations) summarizes the file transfers observed in network traffic:
+
+![The files dashboard displays metrics about the files transferred over the network](./images/screenshots/dashboards_files_source.png)
+
+* Viewing logs from Zeek's `files.log` (e.g., `event.provider == zeek && event.dataset == files`), the Arkime [session](arkime.md#ArkimeSessions) detail's **Extracted Filename** field can be clicked for a context menu item to **Download** the extracted file, if it was preserved as described above.
+
+![Arkime's session details for files.log entries](./images/screenshots/arkime_sessions_files_log_dl.png)
+
+* Malcolm provides an extracted files directory listing to browse and download Zeek-extracted files. This interface is available at at **https://localhost/extracted-files/** if connecting locally. The Zeek `uid` and `fuid` values associated with these files and the sessions from which they were extracted are listed in the **IDs** column as filter links back into Dashboards.
+
+![The extracted files directory interface](./images/screenshots/extracted_files_dl_ui.png)
diff --git a/docs/hedgehog-hardening.md b/docs/hedgehog-hardening.md
index 9db45a9b9..75307fd17 100644
--- a/docs/hedgehog-hardening.md
+++ b/docs/hedgehog-hardening.md
@@ -1,4 +1,4 @@
-# Appendix D - Hardening
+# Appendix E - Hardening
Hedgehog Linux uses the [harbian-audit](https://github.com/hardenedlinux/harbian-audit) benchmarks which target the following guidelines for establishing a secure configuration posture:
diff --git a/docs/hedgehog-iso-build.md b/docs/hedgehog-iso-build.md
index 4b228dc12..1c4e7faa0 100644
--- a/docs/hedgehog-iso-build.md
+++ b/docs/hedgehog-iso-build.md
@@ -29,7 +29,7 @@ Building the ISO may take 90 minutes or more depending on your system. As the bu
```
…
-Finished, created "/sensor-build/hedgehog-24.01.0.iso"
+Finished, created "/sensor-build/hedgehog-24.02.0.iso"
…
```
diff --git a/docs/hedgehog-raspi-build.md b/docs/hedgehog-raspi-build.md
new file mode 100644
index 000000000..82e4dc188
--- /dev/null
+++ b/docs/hedgehog-raspi-build.md
@@ -0,0 +1,121 @@
+# Appendix B - Generating a Raspberry Pi Image
+
+Hedgehog Linux can [also be built]({{ site.github.repository_url }}/tree/{{ site.github.build_revision }}/sensor-raspi) for the Raspberry Pi platform, although this capability is still considered experimental.
+
+* [Building the Image](#HedgehogRaspiBuild)
+* [Writing the Image to Flash Media](#HedgehogRaspiBurn)
+* [Setting the `root` and `sensor` Passwords](#HedgehogRaspiPassword)
+* [Configuration](#HedgehogRaspiConfig)
+* [Performance Considerations](#HedgehogRaspiPerformance)
+
+## Building the Image
+
+Official downloads of the Hedgehog Linux Raspberry Pi image are not provided: however, it can be built easily on an internet-connected Linux host with Vagrant:
+
+* [Vagrant](https://www.vagrantup.com/)
+ - [`vagrant-sshfs`](https://github.com/dustymabe/vagrant-sshfs) plugin
+ - [`bento/debian-12`](https://app.vagrantup.com/bento/boxes/debian-12) Vagrant box
+
+The build should work with either the [VirtualBox](https://www.virtualbox.org/) provider or the [libvirt](https://libvirt.org/) provider:
+
+* [VirtualBox](https://www.virtualbox.org/) [provider](https://www.vagrantup.com/docs/providers/virtualbox)
+ - [`vagrant-vbguest`](https://github.com/dotless-de/vagrant-vbguest) plugin
+* [libvirt](https://libvirt.org/)
+ - [`vagrant-libvirt`](https://github.com/vagrant-libvirt/vagrant-libvirt) provider plugin
+ - [`vagrant-mutate`](https://github.com/sciurus/vagrant-mutate) plugin to convert [`bento/debian-12`](https://app.vagrantup.com/bento/boxes/debian-12) Vagrant box to `libvirt` format
+
+To perform a clean build the Hedgehog Linux Raspberry Pi image, navigate to your local [Malcolm]({{ site.github.repository_url }}/) working copy and run:
+
+```
+$ ./sensor-raspi/build_via_vagrant.sh -f -z
+…
+Starting build machine...
+Bringing machine 'vagrant-hedgehog-raspi-build' up with 'virtualbox' provider...
+…
+```
+
+As this build process is cross-compiling for the ARM64 architecture, building the image is likely to take more than five hours depending on your system. As the build finishes, you will see the following message indicating success:
+
+```
+…
+2024-01-21 05:11:44 INFO All went fine.
+2024-01-21 05:11:44 DEBUG Ending, all OK
+…
+```
+
+## Writing the Image to Flash Media
+
+The resulting `.img.xz` file can be written to a microSD card using the [Raspberry Pi Imager](https://www.raspberrypi.com/documentation/computers/getting-started.html#raspberry-pi-imager) or `dd`.
+
+![Using the Raspberry Pi Imager](./images/screenshots/raspi_imager_hedgehog.png)
+
+## Setting the `root` and `sensor` Passwords
+
+The provided image will allow login (requiring physical access) with the `sensor` account using a default password of `Hedgehog_Linux` or the `root` account with a default password of `Hedgehog_Linux_Root`. It is **highly** recommended for users to use the `passwd` utility to change both of these passwords prior to configuring networking on the device.
+
+```
+
+ ,cc:,.. .:'
+ :dddddddoc,. ;,. oddo:. .c;.
+ :dddddddddddo;:ddc:dddddd; ldddl,
+ .dddddddddddddddddxdddddddo:odddddo' cl;.
+ ........ :ddddddddddddddddOkdddddddddxdddddd;,dddd'
+ .;lddddddddddolcddddddddddddddddk0kddddddddOxdddddddddddo.
+ 'dddddddddddddddddxkdddddddddddddx00xdddddddxkddddddoodddd,
+ .odddddddddddddddddO0OxdddddddddddO0Oddddddddoccloddc':xxd;
+ .:dddddddddddddddddxO00kdddddddddx00kdddddo;'....',;,'dddc. .,;,.
+ .cdddxOkkxdddddddddxO00kddddddddO00ddddo,..cxxxl'...........;O0000:
+ .',,,,,,':ddddkO00OxddddddddxO00kdddddddOOddddc...l0000l............',o0c
+ cddddddddddddddddxO00kddddddddx000xdddddddddddo'...:dxo,..............''
+ 'lddddddddddddddddxO0Odddddddddk00xdddddddddddc'......................
+ 'lddddddddddddddddddddddddddddxkdddddddddddddl,.............':lc:;.
+ .:dxkkkxxddddddddddddddddddddocc:;;;;;;;::cll,............,:,...
+ ;clooooddxkOOOdddoc:;,'''',:ooc;'.................................
+ odddddddddddddl:,...........'...................................
+ cdddddddddl:'.............................................
+ .,coddoc,...........................................
+ .'...........................................
+ ............................................
+ ................. ............. ........
+ .................. .......... .......
+ .......... ...... ........ ......
+ ........ ..... ...... ....
+ ..... .... .... ..
+
+ HH HH EEEE DDDDD GGGGG EEEE HH HH OOOO GGGGG
+ HH HH EE DD DD GG EE HH HH OO OO GG
+ HHHHHHH EEEEE DD DD GGGGGGG EEEEE HHHHHHH OO OO GGGGGGG
+ HH HH EE DD DD GG GG EE HH HH OO OO GG GG
+ HH HH EEEE DDDDD GGGGGG EEEE HH HH OOOO GGGGGG
+
+ LL II NN NN UU UU XX XX
+ LL II NNN NN UU UU XXX
+ LL II NN NNN UU UU XXX
+ LLLLL II NN NN UUUU XX XX
+
+Hedgehog-rpi-4 login: sensor
+Password:
+
+sensor@Hedgehog-rpi-4:~$ su -
+Password:
+root@Hedgehog-rpi-4:~# passwd
+New password:
+Retype new password:
+passwd: password updated successfully
+root@Hedgehog-rpi-4:~# passwd sensor
+New password:
+Retype new password:
+passwd: password updated successfully
+```
+
+## Configuration
+
+Once Hedgehog Linux has booted, [configuration](malcolm-hedgehog-e2e-iso-install.md#HedgehogInstallAndConfig) can proceed as usual using the `configure-interfaces` and `configure-capture` tools.
+
+## Performance Considerations
+
+While these instructions will build an image for various Raspberry Pi models, Hedgehog Linux resource requirements will likely only be satisfied by the 8GB versions of the Raspberry Pi model 4 and higher.
+
+Using faster storage (e.g., SATA solid-state drive connected to the Pi's USB 3.0 port using a USB 3.0 SATA to USB adapter, NVMe M.2 SSD, etc.) for the Hedgehog Linux OS drive and capture artifact directories will result in much better performance than booting from a microSD card.
+
+Users wishing to push the performance of Hedgehog Linux on Raspberry Pi may be required to disable certain features in order to operate within the constraints imposed by the Pi's available resources. For example the **ClamAV** engine used in [file extraction and scanning](malcolm-hedgehog-e2e-iso-install.md#HedgehogZeekFileExtraction) consumes a large percentage of a Raspberry Pi's system memory and could be disabled to make available those resources for other processes. Further resources could be freed up by disabling [`arkime-capture`](malcolm-hedgehog-e2e-iso-install.md#Hedgehogarkime-capture) (unselecting it from the [autostart services](malcolm-hedgehog-e2e-iso-install.md#HedgehogConfigAutostart)) which would allow Hedgehog Linux to still provide network traffic metadata generated by Zeek and Suricata at the cost of not generating Arkime session records and not storing the underlying full PCAP.
\ No newline at end of file
diff --git a/docs/hedgehog-ssh.md b/docs/hedgehog-ssh.md
index 4a5f515d4..29e5ac073 100644
--- a/docs/hedgehog-ssh.md
+++ b/docs/hedgehog-ssh.md
@@ -1,4 +1,4 @@
-# Appendix B - Configuring SSH access
+# Appendix C - Configuring SSH access
SSH access to the sensor's non-privileged sensor account is only available using secure key-based authentication which can be enabled by adding a public SSH key to the **/home/sensor/.ssh/authorized_keys** file as illustrated below:
diff --git a/docs/hedgehog-troubleshooting.md b/docs/hedgehog-troubleshooting.md
index 736f50d40..deb359b22 100644
--- a/docs/hedgehog-troubleshooting.md
+++ b/docs/hedgehog-troubleshooting.md
@@ -1,4 +1,4 @@
-# Appendix C - Troubleshooting
+# Appendix D - Troubleshooting
Should the sensor not function as expected, first try rebooting the device. If the behavior continues, here are a few things that may help you diagnose the problem (items which may require Linux command line use are marked with **†**)
diff --git a/docs/hedgehog-upgrade.md b/docs/hedgehog-upgrade.md
index f106bb030..37d8a1a53 100644
--- a/docs/hedgehog-upgrade.md
+++ b/docs/hedgehog-upgrade.md
@@ -1,4 +1,4 @@
-# Appendix E - Upgrades
+# Appendix F - Upgrades
At this time there is not an "official" upgrade procedure to get from one release of Hedgehog Linux to the next. Upgrading the underlying operating system packages is generally straightforward, but not all of the Hedgehog Linux components are packaged into .deb archives yet as they should be, so for now it's a manual (and kind of nasty) process to Frankenstein an upgrade into existance. The author of this project intends to remedy this at some future point when time and resources allow.
@@ -208,7 +208,7 @@ commands:
```
chown root:netdev /usr/sbin/netsniff-ng && \
- setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip CAP_IPC_LOCK+eip' /usr/sbin/netsniff-ng
+ setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip CAP_IPC_LOCK+eip CAP_SYS_ADMIN+eip' /usr/sbin/netsniff-ng
chown root:netdev /opt/zeek/bin/zeek && \
setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /opt/zeek/bin/zeek
chown root:netdev /sbin/ethtool && \
diff --git a/docs/hedgehog.md b/docs/hedgehog.md
index e5c696a9f..f3399d5e3 100644
--- a/docs/hedgehog.md
+++ b/docs/hedgehog.md
@@ -32,8 +32,9 @@ Hedgehog Linux is a Debian-based operating system built to
- [Autostart services](malcolm-hedgehog-e2e-iso-install.md#HedgehogConfigAutostart)
+ [Zeek Intelligence Framework](hedgehog-config-zeek-intel.md#HedgehogZeekIntel)
* [Appendix A - Generating the ISO](hedgehog-iso-build.md#HedgehogISOBuild)
-* [Appendix B - Configuring SSH access](hedgehog-ssh.md#HedgehogConfigSSH)
-* [Appendix C - Troubleshooting](hedgehog-troubleshooting.md#HedgehogTroubleshooting)
-* [Appendix D - Hardening](hedgehog-hardening.md#HedgehogHardening)
+* [Appendix B - Generating a Raspberry Pi Image](hedgehog-raspi-build.md#HedgehogRaspiBuild)
+* [Appendix C - Configuring SSH access](hedgehog-ssh.md#HedgehogConfigSSH)
+* [Appendix D - Troubleshooting](hedgehog-troubleshooting.md#HedgehogTroubleshooting)
+* [Appendix E - Hardening](hedgehog-hardening.md#HedgehogHardening)
- [Compliance exceptions](hedgehog-hardening.md#HedgehogComplianceExceptions)
-* [Appendix E - Upgrades](hedgehog-upgrade.md#HedgehogUpgradePlan)
+* [Appendix F - Upgrades](hedgehog-upgrade.md#HedgehogUpgradePlan)
diff --git a/docs/host-config-macos.md b/docs/host-config-macos.md
index 200b7c485..d2df3cf6e 100644
--- a/docs/host-config-macos.md
+++ b/docs/host-config-macos.md
@@ -49,7 +49,7 @@ Compose is now a Docker plugin. For Docker to find this plugin, symlink it:
Some changes should be made for performance ([this link](http://markshust.com/2018/01/30/performance-tuning-docker-mac) gives a good succinct overview).
-* **Resource allocation** - For best results, Mac users should be running a quad-core MacBook Pro with 16GB RAM and an SSD, or desktop equivalent. Malcolm can run on older MacBook Pro machines (e.g., 2013 with 8GB RAM), but users are encouraged to bring a higher level of processing power. In the system tray, select **Docker** → **Preferences** → **Advanced**. Set the resources available to Docker to at least 4 CPUs and 8GB of RAM (>= 16GB is preferable).
+* **Resource allocation** - For best results, Mac users should be running recent system with at least 16GB RAM and an SSD. In the system tray, select **Docker** → **Preferences** → **Advanced**. Set the resources available to Docker to at least 4 CPUs and at least 16GB RAM (even more is preferable).
* **Volume mount performance** - Users can speed up performance of volume mounts by removing unused paths from **Docker** → **Preferences** → **File Sharing**. For example, if volumes are mounted under the home directory only, users could share /Users but remove other paths.
diff --git a/docs/images/hedgehog/logo/hedgehog-ascii-text.txt b/docs/images/hedgehog/logo/hedgehog-ascii-text.txt
new file mode 100644
index 000000000..c3a56cfe9
--- /dev/null
+++ b/docs/images/hedgehog/logo/hedgehog-ascii-text.txt
@@ -0,0 +1,40 @@
+
+ ,cc:,.. .:'
+ :dddddddoc,. ;,. oddo:. .c;.
+ :dddddddddddo;:ddc:dddddd; ldddl,
+ .dddddddddddddddddxdddddddo:odddddo' cl;.
+ ........ :ddddddddddddddddOkdddddddddxdddddd;,dddd'
+ .;lddddddddddolcddddddddddddddddk0kddddddddOxdddddddddddo.
+ 'dddddddddddddddddxkdddddddddddddx00xdddddddxkddddddoodddd,
+ .odddddddddddddddddO0OxdddddddddddO0Oddddddddoccloddc':xxd;
+ .:dddddddddddddddddxO00kdddddddddx00kdddddo;'....',;,'dddc. .,;,.
+ .cdddxOkkxdddddddddxO00kddddddddO00ddddo,..cxxxl'...........;O0000:
+ .',,,,,,':ddddkO00OxddddddddxO00kdddddddOOddddc...l0000l............',o0c
+ cddddddddddddddddxO00kddddddddx000xdddddddddddo'...:dxo,..............''
+ 'lddddddddddddddddxO0Odddddddddk00xdddddddddddc'......................
+ 'lddddddddddddddddddddddddddddxkdddddddddddddl,.............':lc:;.
+ .:dxkkkxxddddddddddddddddddddocc:;;;;;;;::cll,............,:,...
+ ;clooooddxkOOOdddoc:;,'''',:ooc;'.................................
+ odddddddddddddl:,...........'...................................
+ cdddddddddl:'.............................................
+ .,coddoc,...........................................
+ .'...........................................
+ ............................................
+ ................. ............. ........
+ .................. .......... .......
+ .......... ...... ........ ......
+ ........ ..... ...... ....
+ ..... .... .... ..
+
+ HH HH EEEE DDDDD GGGGG EEEE HH HH OOOO GGGGG
+ HH HH EE DD DD GG EE HH HH OO OO GG
+ HHHHHHH EEEEE DD DD GGGGGGG EEEEE HHHHHHH OO OO GGGGGGG
+ HH HH EE DD DD GG GG EE HH HH OO OO GG GG
+ HH HH EEEE DDDDD GGGGGG EEEE HH HH OOOO GGGGGG
+
+ LL II NN NN UU UU XX XX
+ LL II NNN NN UU UU XXX
+ LL II NN NNN UU UU XXX
+ LLLLL II NN NN UUUU XX XX
+
+
diff --git a/docs/images/screenshots/arkime_sessions_files_browse.png b/docs/images/screenshots/arkime_sessions_files_browse.png
new file mode 100644
index 000000000..3b281d2a5
Binary files /dev/null and b/docs/images/screenshots/arkime_sessions_files_browse.png differ
diff --git a/docs/images/screenshots/arkime_sessions_files_log_dl.png b/docs/images/screenshots/arkime_sessions_files_log_dl.png
new file mode 100644
index 000000000..5262b2188
Binary files /dev/null and b/docs/images/screenshots/arkime_sessions_files_log_dl.png differ
diff --git a/docs/images/screenshots/dashboards_files_source.png b/docs/images/screenshots/dashboards_files_source.png
index 634d0fcf7..14a25105a 100644
Binary files a/docs/images/screenshots/dashboards_files_source.png and b/docs/images/screenshots/dashboards_files_source.png differ
diff --git a/docs/images/screenshots/dashboards_fs_integrity.png b/docs/images/screenshots/dashboards_fs_integrity.png
new file mode 100644
index 000000000..c27f57c04
Binary files /dev/null and b/docs/images/screenshots/dashboards_fs_integrity.png differ
diff --git a/docs/images/screenshots/dashboards_hosts_overview.png b/docs/images/screenshots/dashboards_hosts_overview.png
new file mode 100644
index 000000000..f893e5672
Binary files /dev/null and b/docs/images/screenshots/dashboards_hosts_overview.png differ
diff --git a/docs/images/screenshots/dashboards_journald_logs.png b/docs/images/screenshots/dashboards_journald_logs.png
new file mode 100644
index 000000000..df9233450
Binary files /dev/null and b/docs/images/screenshots/dashboards_journald_logs.png differ
diff --git a/docs/images/screenshots/dashboards_nginx_access_and_errors.png b/docs/images/screenshots/dashboards_nginx_access_and_errors.png
new file mode 100644
index 000000000..6dc97649f
Binary files /dev/null and b/docs/images/screenshots/dashboards_nginx_access_and_errors.png differ
diff --git a/docs/images/screenshots/dashboards_nginx_overview.png b/docs/images/screenshots/dashboards_nginx_overview.png
new file mode 100644
index 000000000..f393232bd
Binary files /dev/null and b/docs/images/screenshots/dashboards_nginx_overview.png differ
diff --git a/docs/images/screenshots/dashboards_sensor_audit_logs.png b/docs/images/screenshots/dashboards_sensor_audit_logs.png
new file mode 100644
index 000000000..c6685707e
Binary files /dev/null and b/docs/images/screenshots/dashboards_sensor_audit_logs.png differ
diff --git a/docs/images/screenshots/dashboards_sensor_temperature.png b/docs/images/screenshots/dashboards_sensor_temperature.png
new file mode 100644
index 000000000..6e0aa8886
Binary files /dev/null and b/docs/images/screenshots/dashboards_sensor_temperature.png differ
diff --git a/docs/images/screenshots/dashboards_system_overview.png b/docs/images/screenshots/dashboards_system_overview.png
new file mode 100644
index 000000000..fe8b1607d
Binary files /dev/null and b/docs/images/screenshots/dashboards_system_overview.png differ
diff --git a/docs/images/screenshots/extracted_files_dl_ui.png b/docs/images/screenshots/extracted_files_dl_ui.png
new file mode 100644
index 000000000..a32a06d0d
Binary files /dev/null and b/docs/images/screenshots/extracted_files_dl_ui.png differ
diff --git a/docs/images/screenshots/raspi_imager_hedgehog.png b/docs/images/screenshots/raspi_imager_hedgehog.png
new file mode 100644
index 000000000..da74185d7
Binary files /dev/null and b/docs/images/screenshots/raspi_imager_hedgehog.png differ
diff --git a/docs/index-management.md b/docs/index-management.md
index 9431fa5ad..607dcd60d 100644
--- a/docs/index-management.md
+++ b/docs/index-management.md
@@ -1,7 +1,11 @@
-# OpenSearch index management
+# OpenSearch index management
Malcolm releases prior to v6.2.0 used environment variables to configure OpenSearch [Index State Management](https://opensearch.org/docs/latest/im-plugin/ism/index/) [policies](https://opensearch.org/docs/latest/im-plugin/ism/policies/).
Since then, OpenSearch Dashboards has developed and released plugins with UIs for [Index State Management](https://opensearch.org/docs/latest/im-plugin/ism/index/) and [Snapshot Management](https://opensearch.org/docs/latest/opensearch/snapshots/sm-dashboards/). Because these plugins provide a more comprehensive and user-friendly interface for these features, the old environment variable-based configuration code has been removed from Malcolm; with the exception of the code that uses the `OPENSEARCH_INDEX_SIZE_PRUNE_LIMIT` and `OPENSEARCH_INDEX_SIZE_PRUNE_NAME_SORT` [variables in `dashboards-helper.env`](malcolm-config.md#MalcolmConfigEnvVars), which deals with deleting the oldest network session metadata indices when the database exceeds a certain size.
-Note that OpenSearch index state management and snapshot management only deals with disk space consumed by OpenSearch indices: it does not have anything to do with PCAP file storage. The `MANAGE_PCAP_FILES` environment variable in the [`arkime.env` file](malcolm-config.md#MalcolmConfigEnvVars) can be used to allow Arkime to prune old PCAP files based on available disk space.
\ No newline at end of file
+Note that OpenSearch index state management and snapshot management only deals with disk space consumed by OpenSearch indices: it does not have anything to do with PCAP file storage. The `MANAGE_PCAP_FILES` environment variable in the [`arkime.env` file](malcolm-config.md#MalcolmConfigEnvVars) can be used to allow Arkime to prune old PCAP files based on available disk space.
+
+# Using ILM/ISM with Arkime
+
+Arkime allows setting [index management policies](https://arkime.com/faq#ilm) with its sessions and history indices. The Malcolm environment variables for configuring this behavior are set in [`arkime.env`](malcolm-config.md#MalcolmConfigEnvVars). These variables can be used for both [OpenSearch and Elasticsearch instances](opensearch-instances.md#OpenSearchInstance) (OpenSearch [Index State Management (ISM)](https://opensearch.org/docs/latest/im-plugin/ism/index/) and [Elasticsearch Index Lifecycle Management (ILM)](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html), respectively).
\ No newline at end of file
diff --git a/docs/kubernetes.md b/docs/kubernetes.md
index 0c3cd1da6..3b41df9a5 100644
--- a/docs/kubernetes.md
+++ b/docs/kubernetes.md
@@ -272,28 +272,28 @@ agent2 | agent2 | 192.168.56.12 | agent2 | k3s | 6000m |
agent1 | agent1 | 192.168.56.11 | agent1 | k3s | 6000m | 861.34m | 14.36% | 19.55Gi | 9.29Gi | 61.28Gi | 11 |
Pod Name | State | Pod IP | Pod Kind | Worker Node | CPU Usage | Memory Usage | Container Name:Restarts | Container Image |
-api-deployment-6f4686cf59-bn286 | Running | 10.42.2.14 | ReplicaSet | agent1 | 0.11m | 59.62Mi | api-container:0 | api:24.01.0 |
-file-monitor-deployment-855646bd75-vk7st | Running | 10.42.2.16 | ReplicaSet | agent1 | 8.47m | 1.46Gi | file-monitor-container:0 | file-monitor:24.01.0 |
-zeek-live-deployment-64b69d4b6f-947vr | Running | 10.42.2.17 | ReplicaSet | agent1 | 0.02m | 12.44Mi | zeek-live-container:0 | zeek:24.01.0 |
-dashboards-helper-deployment-69dc54f6b6-ln4sq | Running | 10.42.2.15 | ReplicaSet | agent1 | 10.77m | 38.43Mi | dashboards-helper-container:0 | dashboards-helper:24.01.0 |
-upload-deployment-586568844b-4jnk9 | Running | 10.42.2.18 | ReplicaSet | agent1 | 0.15m | 29.78Mi | upload-container:0 | file-upload:24.01.0 |
-filebeat-deployment-6ff8bc444f-t7h49 | Running | 10.42.2.20 | ReplicaSet | agent1 | 2.84m | 70.71Mi | filebeat-container:0 | filebeat-oss:24.01.0 |
-zeek-offline-deployment-844f4865bd-g2sdm | Running | 10.42.2.21 | ReplicaSet | agent1 | 0.17m | 41.92Mi | zeek-offline-container:0 | zeek:24.01.0 |
-logstash-deployment-6fbc9fdcd5-hwx8s | Running | 10.42.2.22 | ReplicaSet | agent1 | 85.55m | 2.91Gi | logstash-container:0 | logstash-oss:24.01.0 |
-netbox-deployment-cdcff4977-hbbw5 | Running | 10.42.2.23 | ReplicaSet | agent1 | 807.64m | 702.86Mi | netbox-container:0 | netbox:24.01.0 |
-suricata-offline-deployment-6ccdb89478-z5696 | Running | 10.42.2.19 | ReplicaSet | agent1 | 0.22m | 34.88Mi | suricata-offline-container:0 | suricata:24.01.0 |
-dashboards-deployment-69b5465db-vz88g | Running | 10.42.1.14 | ReplicaSet | agent2 | 0.94m | 100.12Mi | dashboards-container:0 | dashboards:24.01.0 |
-netbox-redis-cache-deployment-5f77d47b8b-z7t2z | Running | 10.42.1.15 | ReplicaSet | agent2 | 3.57m | 7.36Mi | netbox-redis-cache-container:0 | redis:24.01.0 |
-suricata-live-deployment-6494c77759-9rlnt | Running | 10.42.1.16 | ReplicaSet | agent2 | 0.02m | 9.69Mi | suricata-live-container:0 | suricata:24.01.0 |
-freq-deployment-cfd84fd97-dnngf | Running | 10.42.1.17 | ReplicaSet | agent2 | 0.2m | 26.36Mi | freq-container:0 | freq:24.01.0 |
-arkime-deployment-56999cdd66-s98pp | Running | 10.42.1.18 | ReplicaSet | agent2 | 4.15m | 113.07Mi | arkime-container:0 | arkime:24.01.0 |
-pcap-monitor-deployment-594ff674c4-fsm7m | Running | 10.42.1.19 | ReplicaSet | agent2 | 1.24m | 48.44Mi | pcap-monitor-container:0 | pcap-monitor:24.01.0 |
-pcap-capture-deployment-7c8bf6957-jzpzn | Running | 10.42.1.20 | ReplicaSet | agent2 | 0.02m | 9.64Mi | pcap-capture-container:0 | pcap-capture:24.01.0 |
-netbox-postgres-deployment-5879b8dffc-kkt56 | Running | 10.42.1.21 | ReplicaSet | agent2 | 70.91m | 33.02Mi | netbox-postgres-container:0 | postgresql:24.01.0 |
-htadmin-deployment-6fc46888b9-sq6ln | Running | 10.42.1.23 | ReplicaSet | agent2 | 0.14m | 30.53Mi | htadmin-container:0 | htadmin:24.01.0 |
-netbox-redis-deployment-5bcd8f6c96-j5xpf | Running | 10.42.1.24 | ReplicaSet | agent2 | 1.46m | 7.34Mi | netbox-redis-container:0 | redis:24.01.0 |
-nginx-proxy-deployment-69fcc4968d-f68tq | Running | 10.42.1.22 | ReplicaSet | agent2 | 0.31m | 22.63Mi | nginx-proxy-container:0 | nginx-proxy:24.01.0 |
-opensearch-deployment-75498799f6-4zmwd | Running | 10.42.1.25 | ReplicaSet | agent2 | 89.8m | 11.03Gi | opensearch-container:0 | opensearch:24.01.0 |
+api-deployment-6f4686cf59-bn286 | Running | 10.42.2.14 | ReplicaSet | agent1 | 0.11m | 59.62Mi | api-container:0 | api:24.02.0 |
+file-monitor-deployment-855646bd75-vk7st | Running | 10.42.2.16 | ReplicaSet | agent1 | 8.47m | 1.46Gi | file-monitor-container:0 | file-monitor:24.02.0 |
+zeek-live-deployment-64b69d4b6f-947vr | Running | 10.42.2.17 | ReplicaSet | agent1 | 0.02m | 12.44Mi | zeek-live-container:0 | zeek:24.02.0 |
+dashboards-helper-deployment-69dc54f6b6-ln4sq | Running | 10.42.2.15 | ReplicaSet | agent1 | 10.77m | 38.43Mi | dashboards-helper-container:0 | dashboards-helper:24.02.0 |
+upload-deployment-586568844b-4jnk9 | Running | 10.42.2.18 | ReplicaSet | agent1 | 0.15m | 29.78Mi | upload-container:0 | file-upload:24.02.0 |
+filebeat-deployment-6ff8bc444f-t7h49 | Running | 10.42.2.20 | ReplicaSet | agent1 | 2.84m | 70.71Mi | filebeat-container:0 | filebeat-oss:24.02.0 |
+zeek-offline-deployment-844f4865bd-g2sdm | Running | 10.42.2.21 | ReplicaSet | agent1 | 0.17m | 41.92Mi | zeek-offline-container:0 | zeek:24.02.0 |
+logstash-deployment-6fbc9fdcd5-hwx8s | Running | 10.42.2.22 | ReplicaSet | agent1 | 85.55m | 2.91Gi | logstash-container:0 | logstash-oss:24.02.0 |
+netbox-deployment-cdcff4977-hbbw5 | Running | 10.42.2.23 | ReplicaSet | agent1 | 807.64m | 702.86Mi | netbox-container:0 | netbox:24.02.0 |
+suricata-offline-deployment-6ccdb89478-z5696 | Running | 10.42.2.19 | ReplicaSet | agent1 | 0.22m | 34.88Mi | suricata-offline-container:0 | suricata:24.02.0 |
+dashboards-deployment-69b5465db-vz88g | Running | 10.42.1.14 | ReplicaSet | agent2 | 0.94m | 100.12Mi | dashboards-container:0 | dashboards:24.02.0 |
+netbox-redis-cache-deployment-5f77d47b8b-z7t2z | Running | 10.42.1.15 | ReplicaSet | agent2 | 3.57m | 7.36Mi | netbox-redis-cache-container:0 | redis:24.02.0 |
+suricata-live-deployment-6494c77759-9rlnt | Running | 10.42.1.16 | ReplicaSet | agent2 | 0.02m | 9.69Mi | suricata-live-container:0 | suricata:24.02.0 |
+freq-deployment-cfd84fd97-dnngf | Running | 10.42.1.17 | ReplicaSet | agent2 | 0.2m | 26.36Mi | freq-container:0 | freq:24.02.0 |
+arkime-deployment-56999cdd66-s98pp | Running | 10.42.1.18 | ReplicaSet | agent2 | 4.15m | 113.07Mi | arkime-container:0 | arkime:24.02.0 |
+pcap-monitor-deployment-594ff674c4-fsm7m | Running | 10.42.1.19 | ReplicaSet | agent2 | 1.24m | 48.44Mi | pcap-monitor-container:0 | pcap-monitor:24.02.0 |
+pcap-capture-deployment-7c8bf6957-jzpzn | Running | 10.42.1.20 | ReplicaSet | agent2 | 0.02m | 9.64Mi | pcap-capture-container:0 | pcap-capture:24.02.0 |
+netbox-postgres-deployment-5879b8dffc-kkt56 | Running | 10.42.1.21 | ReplicaSet | agent2 | 70.91m | 33.02Mi | netbox-postgres-container:0 | postgresql:24.02.0 |
+htadmin-deployment-6fc46888b9-sq6ln | Running | 10.42.1.23 | ReplicaSet | agent2 | 0.14m | 30.53Mi | htadmin-container:0 | htadmin:24.02.0 |
+netbox-redis-deployment-5bcd8f6c96-j5xpf | Running | 10.42.1.24 | ReplicaSet | agent2 | 1.46m | 7.34Mi | netbox-redis-container:0 | redis:24.02.0 |
+nginx-proxy-deployment-69fcc4968d-f68tq | Running | 10.42.1.22 | ReplicaSet | agent2 | 0.31m | 22.63Mi | nginx-proxy-container:0 | nginx-proxy:24.02.0 |
+opensearch-deployment-75498799f6-4zmwd | Running | 10.42.1.25 | ReplicaSet | agent2 | 89.8m | 11.03Gi | opensearch-container:0 | opensearch:24.02.0 |
```
The other control scripts (`stop`, `restart`, `logs`, etc.) work in a similar manner as in a Docker-based deployment. One notable difference is the `wipe` script: data on PersistentVolume storage cannot be deleted by `wipe`. It must be deleted manually on the storage media underlying the PersistentVolumes.
@@ -367,6 +367,8 @@ Require encrypted HTTPS connections? (Y / n): y
3: None
Select authentication method (Basic): 1
+Enable index management policies (ILM/ISM) in Arkime? (y / N): n
+
Should Malcolm delete the oldest database indices and/or PCAP files based on available storage? (y / N): y
Delete the oldest indices when the database exceeds a certain size? (y / N): y
@@ -551,28 +553,28 @@ agent1 | agent1 | 192.168.56.11 | agent1 | k3s | 6000m |
agent2 | agent2 | 192.168.56.12 | agent2 | k3s | 6000m | 552.71m | 9.21% | 19.55Gi | 13.27Gi | 61.28Gi | 12 |
Pod Name | State | Pod IP | Pod Kind | Worker Node | CPU Usage | Memory Usage | Container Name:Restarts | Container Image |
-netbox-redis-cache-deployment-5f77d47b8b-jr9nt | Running | 10.42.2.6 | ReplicaSet | agent2 | 1.89m | 7.24Mi | netbox-redis-cache-container:0 | redis:24.01.0 |
-netbox-redis-deployment-5bcd8f6c96-bkzmh | Running | 10.42.2.5 | ReplicaSet | agent2 | 1.62m | 7.52Mi | netbox-redis-container:0 | redis:24.01.0 |
-dashboards-helper-deployment-69dc54f6b6-ks7ps | Running | 10.42.2.4 | ReplicaSet | agent2 | 12.95m | 40.75Mi | dashboards-helper-container:0 | dashboards-helper:24.01.0 |
-freq-deployment-cfd84fd97-5bwp6 | Running | 10.42.2.8 | ReplicaSet | agent2 | 0.11m | 26.33Mi | freq-container:0 | freq:24.01.0 |
-pcap-capture-deployment-7c8bf6957-hkvkn | Running | 10.42.2.12 | ReplicaSet | agent2 | 0.02m | 9.21Mi | pcap-capture-container:0 | pcap-capture:24.01.0 |
-nginx-proxy-deployment-69fcc4968d-m57rz | Running | 10.42.2.10 | ReplicaSet | agent2 | 0.91m | 22.72Mi | nginx-proxy-container:0 | nginx-proxy:24.01.0 |
-htadmin-deployment-6fc46888b9-vpt7l | Running | 10.42.2.7 | ReplicaSet | agent2 | 0.16m | 30.21Mi | htadmin-container:0 | htadmin:24.01.0 |
-opensearch-deployment-75498799f6-5v92w | Running | 10.42.2.13 | ReplicaSet | agent2 | 139.2m | 10.86Gi | opensearch-container:0 | opensearch:24.01.0 |
-zeek-live-deployment-64b69d4b6f-fcb6n | Running | 10.42.2.9 | ReplicaSet | agent2 | 0.02m | 109.55Mi | zeek-live-container:0 | zeek:24.01.0 |
-dashboards-deployment-69b5465db-kgsqk | Running | 10.42.2.3 | ReplicaSet | agent2 | 14.98m | 108.85Mi | dashboards-container:0 | dashboards:24.01.0 |
-arkime-deployment-56999cdd66-xxpw9 | Running | 10.42.2.11 | ReplicaSet | agent2 | 208.95m | 78.42Mi | arkime-container:0 | arkime:24.01.0 |
-api-deployment-6f4686cf59-xt9md | Running | 10.42.1.3 | ReplicaSet | agent1 | 0.14m | 56.88Mi | api-container:0 | api:24.01.0 |
-netbox-postgres-deployment-5879b8dffc-lb4qm | Running | 10.42.1.6 | ReplicaSet | agent1 | 141.2m | 48.02Mi | netbox-postgres-container:0 | postgresql:24.01.0 |
-pcap-monitor-deployment-594ff674c4-fwq7g | Running | 10.42.1.12 | ReplicaSet | agent1 | 3.93m | 46.44Mi | pcap-monitor-container:0 | pcap-monitor:24.01.0 |
-suricata-offline-deployment-6ccdb89478-j5fgj | Running | 10.42.1.10 | ReplicaSet | agent1 | 10.42m | 35.12Mi | suricata-offline-container:0 | suricata:24.01.0 |
-suricata-live-deployment-6494c77759-rpt48 | Running | 10.42.1.8 | ReplicaSet | agent1 | 0.01m | 9.62Mi | suricata-live-container:0 | suricata:24.01.0 |
-netbox-deployment-cdcff4977-7ns2q | Running | 10.42.1.7 | ReplicaSet | agent1 | 830.47m | 530.7Mi | netbox-container:0 | netbox:24.01.0 |
-zeek-offline-deployment-844f4865bd-7x68b | Running | 10.42.1.9 | ReplicaSet | agent1 | 1.44m | 43.66Mi | zeek-offline-container:0 | zeek:24.01.0 |
-filebeat-deployment-6ff8bc444f-pdgzj | Running | 10.42.1.11 | ReplicaSet | agent1 | 0.78m | 75.25Mi | filebeat-container:0 | filebeat-oss:24.01.0 |
-file-monitor-deployment-855646bd75-nbngq | Running | 10.42.1.4 | ReplicaSet | agent1 | 1.69m | 1.46Gi | file-monitor-container:0 | file-monitor:24.01.0 |
-upload-deployment-586568844b-9s7f5 | Running | 10.42.1.13 | ReplicaSet | agent1 | 0.14m | 29.62Mi | upload-container:0 | file-upload:24.01.0 |
-logstash-deployment-6fbc9fdcd5-2hhx8 | Running | 10.42.1.5 | ReplicaSet | agent1 | 3236.29m | 357.36Mi | logstash-container:0 | logstash-oss:24.01.0 |
+netbox-redis-cache-deployment-5f77d47b8b-jr9nt | Running | 10.42.2.6 | ReplicaSet | agent2 | 1.89m | 7.24Mi | netbox-redis-cache-container:0 | redis:24.02.0 |
+netbox-redis-deployment-5bcd8f6c96-bkzmh | Running | 10.42.2.5 | ReplicaSet | agent2 | 1.62m | 7.52Mi | netbox-redis-container:0 | redis:24.02.0 |
+dashboards-helper-deployment-69dc54f6b6-ks7ps | Running | 10.42.2.4 | ReplicaSet | agent2 | 12.95m | 40.75Mi | dashboards-helper-container:0 | dashboards-helper:24.02.0 |
+freq-deployment-cfd84fd97-5bwp6 | Running | 10.42.2.8 | ReplicaSet | agent2 | 0.11m | 26.33Mi | freq-container:0 | freq:24.02.0 |
+pcap-capture-deployment-7c8bf6957-hkvkn | Running | 10.42.2.12 | ReplicaSet | agent2 | 0.02m | 9.21Mi | pcap-capture-container:0 | pcap-capture:24.02.0 |
+nginx-proxy-deployment-69fcc4968d-m57rz | Running | 10.42.2.10 | ReplicaSet | agent2 | 0.91m | 22.72Mi | nginx-proxy-container:0 | nginx-proxy:24.02.0 |
+htadmin-deployment-6fc46888b9-vpt7l | Running | 10.42.2.7 | ReplicaSet | agent2 | 0.16m | 30.21Mi | htadmin-container:0 | htadmin:24.02.0 |
+opensearch-deployment-75498799f6-5v92w | Running | 10.42.2.13 | ReplicaSet | agent2 | 139.2m | 10.86Gi | opensearch-container:0 | opensearch:24.02.0 |
+zeek-live-deployment-64b69d4b6f-fcb6n | Running | 10.42.2.9 | ReplicaSet | agent2 | 0.02m | 109.55Mi | zeek-live-container:0 | zeek:24.02.0 |
+dashboards-deployment-69b5465db-kgsqk | Running | 10.42.2.3 | ReplicaSet | agent2 | 14.98m | 108.85Mi | dashboards-container:0 | dashboards:24.02.0 |
+arkime-deployment-56999cdd66-xxpw9 | Running | 10.42.2.11 | ReplicaSet | agent2 | 208.95m | 78.42Mi | arkime-container:0 | arkime:24.02.0 |
+api-deployment-6f4686cf59-xt9md | Running | 10.42.1.3 | ReplicaSet | agent1 | 0.14m | 56.88Mi | api-container:0 | api:24.02.0 |
+netbox-postgres-deployment-5879b8dffc-lb4qm | Running | 10.42.1.6 | ReplicaSet | agent1 | 141.2m | 48.02Mi | netbox-postgres-container:0 | postgresql:24.02.0 |
+pcap-monitor-deployment-594ff674c4-fwq7g | Running | 10.42.1.12 | ReplicaSet | agent1 | 3.93m | 46.44Mi | pcap-monitor-container:0 | pcap-monitor:24.02.0 |
+suricata-offline-deployment-6ccdb89478-j5fgj | Running | 10.42.1.10 | ReplicaSet | agent1 | 10.42m | 35.12Mi | suricata-offline-container:0 | suricata:24.02.0 |
+suricata-live-deployment-6494c77759-rpt48 | Running | 10.42.1.8 | ReplicaSet | agent1 | 0.01m | 9.62Mi | suricata-live-container:0 | suricata:24.02.0 |
+netbox-deployment-cdcff4977-7ns2q | Running | 10.42.1.7 | ReplicaSet | agent1 | 830.47m | 530.7Mi | netbox-container:0 | netbox:24.02.0 |
+zeek-offline-deployment-844f4865bd-7x68b | Running | 10.42.1.9 | ReplicaSet | agent1 | 1.44m | 43.66Mi | zeek-offline-container:0 | zeek:24.02.0 |
+filebeat-deployment-6ff8bc444f-pdgzj | Running | 10.42.1.11 | ReplicaSet | agent1 | 0.78m | 75.25Mi | filebeat-container:0 | filebeat-oss:24.02.0 |
+file-monitor-deployment-855646bd75-nbngq | Running | 10.42.1.4 | ReplicaSet | agent1 | 1.69m | 1.46Gi | file-monitor-container:0 | file-monitor:24.02.0 |
+upload-deployment-586568844b-9s7f5 | Running | 10.42.1.13 | ReplicaSet | agent1 | 0.14m | 29.62Mi | upload-container:0 | file-upload:24.02.0 |
+logstash-deployment-6fbc9fdcd5-2hhx8 | Running | 10.42.1.5 | ReplicaSet | agent1 | 3236.29m | 357.36Mi | logstash-container:0 | logstash-oss:24.02.0 |
```
View container logs for the Malcolm deployment with `./scripts/logs` (if **[stern](https://github.com/stern/stern)** present in `$PATH`):
diff --git a/docs/malcolm-config.md b/docs/malcolm-config.md
index b103bd901..7caac0274 100644
--- a/docs/malcolm-config.md
+++ b/docs/malcolm-config.md
@@ -14,6 +14,14 @@ Although the configuration script automates many of the following configuration
- `ARKIME_ROTATE_INDEX` - how often (based on network traffic timestamp) to [create a new index](https://arkime.com/settings#rotateIndex) in OpenSearch
- `MANAGE_PCAP_FILES` – if set to `true`, all PCAP files imported into Malcolm will be marked as available for deletion by Arkime if available storage space becomes too low (default `false`)
- `MAXMIND_GEOIP_DB_LICENSE_KEY` - Malcolm uses MaxMind's free GeoLite2 databases for GeoIP lookups. As of December 30, 2019, these databases are [no longer available](https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases/) for download via a public URL. Instead, they must be downloaded using a MaxMind license key (available without charge [from MaxMind](https://www.maxmind.com/en/geolite2/signup)). The license key can be specified here for GeoIP database downloads during build- and run-time.
+ - The following variables configure [Arkime's use](index-management.md#ArkimeIndexPolicies) of OpenSearch [Index State Management (ISM)](https://opensearch.org/docs/latest/im-plugin/ism/index/) or Elasticsearch [Index Lifecycle Management (ILM)](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html):
+ + `INDEX_MANAGEMENT_ENABLED` - if set to `true`, Malcolm's instance of Arkime will [use these features](https://arkime.com/faq#ilm) when indexing data
+ + `INDEX_MANAGEMENT_OPTIMIZATION_PERIOD` - the period in hours or days that Arkime will keep records in the **hot** state (default `30d`)
+ + `INDEX_MANAGEMENT_RETENTION_TIME` - the period in hours or days that Arkime will keep records before deleting them (default `90d`)
+ + `INDEX_MANAGEMENT_OLDER_SESSION_REPLICAS` - the number of replicas for older sessions indices (default `0`)
+ + `INDEX_MANAGEMENT_HISTORY_RETENTION_WEEKS` - the retention time period (weeks) for Arkime history data (default `13`)
+ + `INDEX_MANAGEMENT_SEGMENTS` - the number of segments Arlime will use to optimize sessions (default `1`)
+ + `INDEX_MANAGEMENT_HOT_WARM_ENABLED` - whether or not Arkime should use a hot/warm design (storing non-session data in a warm index); setting up hot/warm index policies also requires configuration on the local nodes in accordance with the [Arkime documentation](https://arkime.com/faq#ilm)
* **`auth-common.env`** - [authentication](authsetup.md)-related settings
- `NGINX_BASIC_AUTH` - if set to `true`, use [TLS-encrypted HTTP basic](authsetup.md#AuthBasicAccountManagement) authentication (default); if set to `false`, use [Lightweight Directory Access Protocol (LDAP)](authsetup.md#AuthLDAP) authentication
* **`auth.env`** - stores the Malcolm administrator's username and password hash for its nginx reverse proxy
@@ -40,6 +48,10 @@ Although the configuration script automates many of the following configuration
- `TOTAL_MEGABYTES_SEVERITY_THRESHOLD` - when [severity scoring](severity.md#Severity) is enabled, this variable indicates the size threshold (in megabytes) for assigning severity to large connections or file transfers (default `1000`)
* **`netbox-common.env`**, `netbox.env`, `netbox-secret.env`, `netbox-postgres.env`, `netbox-redis-cache.env` and `netbox-redis.env` - settings related to [NetBox](https://netbox.dev/) and [Asset Interaction Analysis](asset-interaction-analysis.md#AssetInteractionAnalysis)
- `NETBOX_DISABLED` - if set to `true`, Malcolm will **not** start and manage a [NetBox](asset-interaction-analysis.md#AssetInteractionAnalysis) instance (default `true`)
+ - `NETBOX_DEFAULT_SITE` - specifies the default NetBox [site name](https://demo.netbox.dev/static/docs/core-functionality/sites-and-racks/) for use when [enriching network traffic metadata via NetBox lookups](asset-interaction-analysis.md#NetBoxEnrichment) (default `Malcolm`)
+ - `NETBOX_PRELOAD_PREFIXES` - if set to `true`, Malcolm's NetBox initialization will automatically create "catch-all" prefixes for private IP address space (i.e., one each for `10.0.0.0/8`, `172.16.0.0/12`, and `192.168.0.0/16`, respectively) for use when [enriching network traffic metadata via NetBox lookups](asset-interaction-analysis.md#NetBoxEnrichment)
+ - `NETBOX_DEFAULT_AUTOCREATE_MANUFACTURER` - if set to `true`, new manufacturer entries will be created in the NetBox database when [matching device manufacturers to OUIs](asset-interaction-analysis.md#NetBoxPopPassiveOUIMatch) (default `true`)
+ - `NETBOX_DEFAULT_FUZZY_THRESHOLD` - fuzzy-matching threshold for [matching device manufacturers to OUIs](asset-interaction-analysis.md#NetBoxPopPassiveOUIMatch) (default `0.95`)
* **`nginx.env`** - settings specific to Malcolm's nginx reverse proxy
- `NGINX_LOG_ACCESS_AND_ERRORS` - if set to `true`, all access to Malcolm via its [web interfaces](quickstart.md#UserInterfaceURLs) will be logged to OpenSearch (default `false`)
- `NGINX_SSL` - if set to `true`, require HTTPS connections to Malcolm's `nginx-proxy` container (default); if set to `false`, use unencrypted HTTP connections (using unsecured HTTP connections is **NOT** recommended unless you are running Malcolm behind another reverse proxy such as Traefik, Caddy, etc.)
diff --git a/docs/malcolm-hedgehog-e2e-iso-install.md b/docs/malcolm-hedgehog-e2e-iso-install.md
index 1d7308a8d..666bfc743 100644
--- a/docs/malcolm-hedgehog-e2e-iso-install.md
+++ b/docs/malcolm-hedgehog-e2e-iso-install.md
@@ -173,6 +173,20 @@ The [configuration and tuning](malcolm-config.md#ConfigAndTuning) wizard's quest
- When using LDAP authentication, this question allows users to configure [LDAP connection security](authsetup.md#AuthLDAPSecurity)
* **Store PCAP, log and index files locally under /home/user/Malcolm?**
- Malcolm generates a number of large file sets during normal operation: PCAP files, Zeek or Suricata logs, OpenSearch indices, etc. By default all of these are stored in subdirectories in the Malcolm installation directory. This question allows users to specify alternative storage location(s) (for example, a separate dedicated drive or RAID volume) for these artifacts.
+* **Enable index management policies (ILM/ISM) in Arkime?**
+ - Choose **Y** to proceed to the following related questions about [using ILM/ISM with Arkime](index-management.md#ArkimeIndexPolicies).
+ - **Should Arkime use a hot/warm design in which non-session data is stored in a warm index?**
+ - This quesion allows users to specify if Arkime should store non-session indices (`arkime-history`) indices in a warm index. This requires additional configuration as demonstrated in the [Arkime documentation](https://arkime.com/faq#ilm).
+ - **How long should Arkime keep an index in the hot node? (e.g. 25h, 5d, etc.)**
+ - This question allows users to specify how long an Arkime index should remain in the **hot** state before moving into a **warm** state.
+ - **How long should Arkime retain SPI data before deleting it? (e.g. 25h, 90d, etc.)**
+ - This question is used to set the maximum age at which Arkime session indices are deleted.
+ - **How many segments should Arkime use to optimize?**
+ - This question asks for the number of segments to use for optimization.
+ - **How many replicas should Arkime maintain for older session indices?**
+ - This defines how many additional copies of older session indices Arkime should store.
+ - **How many weeks of history should Arkime keep?",**
+ - This defines the retention period (in weeks) for `arkime-history` indices.
* **Should Malcolm delete the oldest database indices and/or PCAP files based on available storage?**
- Choose **Y** to proceed to the following related questions about managing the data storage used by Malcolm.
- **Delete the oldest indices when the database exceeds a certain size?**
diff --git a/docs/malcolm-iso.md b/docs/malcolm-iso.md
index fff839df5..da5e35fe0 100644
--- a/docs/malcolm-iso.md
+++ b/docs/malcolm-iso.md
@@ -41,7 +41,7 @@ Building the ISO may take 30 minutes or more depending on the system. As the bui
```
…
-Finished, created "/malcolm-build/malcolm-iso/malcolm-24.01.0.iso"
+Finished, created "/malcolm-build/malcolm-iso/malcolm-24.02.0.iso"
…
```
diff --git a/docs/malcolm-upgrade.md b/docs/malcolm-upgrade.md
index b27f80f3b..aa79503c5 100644
--- a/docs/malcolm-upgrade.md
+++ b/docs/malcolm-upgrade.md
@@ -40,15 +40,15 @@ If Malcolm was installed from [pre-packaged installation files]({{ site.github.r
* `tar xf malcolm_YYYYMMDD_HHNNSS_xxxxxxx.tar.gz`
1. backup current Malcolm scripts, configuration files and certificates
* `mkdir -p ./upgrade_backup_$(date +%Y-%m-%d)`
- * `cp -r filebeat/ htadmin/ logstash/ nginx/ config/ docker-compose.yml ./scripts ./README.md ./upgrade_backup_$(date +%Y-%m-%d)/`
+ * `cp -r filebeat/ htadmin/ logstash/ nginx/ config/ docker-compose*.yml ./scripts ./README.md ./upgrade_backup_$(date +%Y-%m-%d)/`
1. replace scripts and local documentation in the existing installation with the new ones
* `rm -rf ./scripts ./README.md`
* `cp -r ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/scripts ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/README.md ./`
-1. replace (overwrite) `docker-compose.yml` file with new version
- * `cp ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/docker-compose.yml ./docker-compose.yml`
+1. replace (overwrite) `docker-compose*.yml` file with new versions
+ * `cp ./malcolm_YYYYMMDD_HHNNSS_xxxxxxx/docker-compose*.yml ./`
1. re-run `./scripts/configure` as described in [Malcolm Configuration](malcolm-config.md#ConfigAndTuning)
* to do an in-depth comparison of the previous version's settings with the new setings:
- + using a file comparison tool (e.g., `diff`, `meld`, `Beyond Compare`, etc.), compare `docker-compose.yml` and the `docker-compare.yml` file backed up in Step 3, and manually migrate over any customizations in file
+ + using a file comparison tool (e.g., `diff`, `meld`, `Beyond Compare`, etc.), compare `docker-compose.yml` and the `docker-compose.yml` files backed up in Step 3, and manually migrate over any customizations in file
+ compare the contents of each `.env` file Malcolm's `./config/` directory with its corresponding `.env.example` file. the author uses this command which uses [difftastic](https://github.com/Wilfred/difftastic), [bat](https://github.com/sharkdp/bat), [unbuffer](https://manpages.debian.org/stretch/expect/unbuffer.1.en.html), and [cmp](https://en.wikipedia.org/wiki/Cmp_(Unix)).
```bash
for FILE in *.env; do \
diff --git a/docs/quickstart.md b/docs/quickstart.md
index e90cbe9cf..de66729d6 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -54,25 +54,25 @@ You can then observe the images have been retrieved by running `docker images`:
```
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
-ghcr.io/idaholab/malcolm/api 24.01.0 xxxxxxxxxxxx 3 days ago 158MB
-ghcr.io/idaholab/malcolm/arkime 24.01.0 xxxxxxxxxxxx 3 days ago 816MB
-ghcr.io/idaholab/malcolm/dashboards 24.01.0 xxxxxxxxxxxx 3 days ago 1.02GB
-ghcr.io/idaholab/malcolm/dashboards-helper 24.01.0 xxxxxxxxxxxx 3 days ago 184MB
-ghcr.io/idaholab/malcolm/file-monitor 24.01.0 xxxxxxxxxxxx 3 days ago 588MB
-ghcr.io/idaholab/malcolm/file-upload 24.01.0 xxxxxxxxxxxx 3 days ago 259MB
-ghcr.io/idaholab/malcolm/filebeat-oss 24.01.0 xxxxxxxxxxxx 3 days ago 624MB
-ghcr.io/idaholab/malcolm/freq 24.01.0 xxxxxxxxxxxx 3 days ago 132MB
-ghcr.io/idaholab/malcolm/htadmin 24.01.0 xxxxxxxxxxxx 3 days ago 242MB
-ghcr.io/idaholab/malcolm/logstash-oss 24.01.0 xxxxxxxxxxxx 3 days ago 1.35GB
-ghcr.io/idaholab/malcolm/netbox 24.01.0 xxxxxxxxxxxx 3 days ago 1.01GB
-ghcr.io/idaholab/malcolm/nginx-proxy 24.01.0 xxxxxxxxxxxx 3 days ago 121MB
-ghcr.io/idaholab/malcolm/opensearch 24.01.0 xxxxxxxxxxxx 3 days ago 1.17GB
-ghcr.io/idaholab/malcolm/pcap-capture 24.01.0 xxxxxxxxxxxx 3 days ago 121MB
-ghcr.io/idaholab/malcolm/pcap-monitor 24.01.0 xxxxxxxxxxxx 3 days ago 213MB
-ghcr.io/idaholab/malcolm/postgresql 24.01.0 xxxxxxxxxxxx 3 days ago 268MB
-ghcr.io/idaholab/malcolm/redis 24.01.0 xxxxxxxxxxxx 3 days ago 34.2MB
-ghcr.io/idaholab/malcolm/suricata 24.01.0 xxxxxxxxxxxx 3 days ago 278MB
-ghcr.io/idaholab/malcolm/zeek 24.01.0 xxxxxxxxxxxx 3 days ago 1GB
+ghcr.io/idaholab/malcolm/api 24.02.0 xxxxxxxxxxxx 3 days ago 158MB
+ghcr.io/idaholab/malcolm/arkime 24.02.0 xxxxxxxxxxxx 3 days ago 816MB
+ghcr.io/idaholab/malcolm/dashboards 24.02.0 xxxxxxxxxxxx 3 days ago 1.02GB
+ghcr.io/idaholab/malcolm/dashboards-helper 24.02.0 xxxxxxxxxxxx 3 days ago 184MB
+ghcr.io/idaholab/malcolm/file-monitor 24.02.0 xxxxxxxxxxxx 3 days ago 588MB
+ghcr.io/idaholab/malcolm/file-upload 24.02.0 xxxxxxxxxxxx 3 days ago 259MB
+ghcr.io/idaholab/malcolm/filebeat-oss 24.02.0 xxxxxxxxxxxx 3 days ago 624MB
+ghcr.io/idaholab/malcolm/freq 24.02.0 xxxxxxxxxxxx 3 days ago 132MB
+ghcr.io/idaholab/malcolm/htadmin 24.02.0 xxxxxxxxxxxx 3 days ago 242MB
+ghcr.io/idaholab/malcolm/logstash-oss 24.02.0 xxxxxxxxxxxx 3 days ago 1.35GB
+ghcr.io/idaholab/malcolm/netbox 24.02.0 xxxxxxxxxxxx 3 days ago 1.01GB
+ghcr.io/idaholab/malcolm/nginx-proxy 24.02.0 xxxxxxxxxxxx 3 days ago 121MB
+ghcr.io/idaholab/malcolm/opensearch 24.02.0 xxxxxxxxxxxx 3 days ago 1.17GB
+ghcr.io/idaholab/malcolm/pcap-capture 24.02.0 xxxxxxxxxxxx 3 days ago 121MB
+ghcr.io/idaholab/malcolm/pcap-monitor 24.02.0 xxxxxxxxxxxx 3 days ago 213MB
+ghcr.io/idaholab/malcolm/postgresql 24.02.0 xxxxxxxxxxxx 3 days ago 268MB
+ghcr.io/idaholab/malcolm/redis 24.02.0 xxxxxxxxxxxx 3 days ago 34.2MB
+ghcr.io/idaholab/malcolm/suricata 24.02.0 xxxxxxxxxxxx 3 days ago 278MB
+ghcr.io/idaholab/malcolm/zeek 24.02.0 xxxxxxxxxxxx 3 days ago 1GB
```
### Import from pre-packaged tarballs
diff --git a/docs/reporting.md b/docs/reporting.md
new file mode 100644
index 000000000..e66f6401b
--- /dev/null
+++ b/docs/reporting.md
@@ -0,0 +1,7 @@
+# Reporting
+
+Malcolm uses the Reporting plugin for [OpenSearch Dashboards](https://github.com/opensearch-project/reporting). Reports can be generated on-demand or defined using [visualizations and dashboards](dashboards.md#DashboardsVisualizations), [the discover view](dashboards.md#Discover), or [Notebooks](https://opensearch.org/docs/latest/observing-your-data/notebooks/) pages. See [Reporting](https://opensearch.org/docs/latest/reporting/report-dashboard-index/) in the OpenSearch documentation for usage instructions.
+
+## Known Issues
+
+The Malcolm development team is [aware of an issue](https://github.com/idaholab/Malcolm/issues/249) exporting some dashboards as PDF and PNG reports using the Mozilla Firefox web browser. While the root cause and fix are being investigated, users that encounter this bug may attempt the action using another web browser.
diff --git a/docs/system-requirements.md b/docs/system-requirements.md
index b5534716d..df0f4bfe3 100644
--- a/docs/system-requirements.md
+++ b/docs/system-requirements.md
@@ -2,6 +2,6 @@
Malcolm runs on top of [Docker](https://www.docker.com/), which runs on recent releases of Linux, Apple [macOS](host-config-macos.md#HostSystemConfigMac), and [Microsoft Windows](host-config-windows.md#HostSystemConfigWindows) 10 and up. Malcolm can also be deployed in the cloud [with Kubernetes](kubernetes.md#Kubernetes).
-To quote the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html), "If there is one resource that you will run out of first, it will likely be memory." The same is true for Malcolm: and users will want at least 16GB of RAM to run Malcolm comfortably. For processing large volumes of traffic, Malcolm developers recommend a minimum of 16 cores and 16 gigabytes of RAM on a dedicated server. Malcolm can run on less, but more is better. Of course, users will want as much hard drive space as possible, as the amount of PCAP data a machine can analyze and store will be limited by its hard drive.
+To quote the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html), "If there is one resource that you will run out of first, it will likely be memory." Malcolm developers recommend a minimum of 8 cores and 16 gigabytes of RAM on a dedicated server. Malcolm can run on less, but more is better. Of course, users will want as much hard drive space as possible, as the amount of PCAP data a machine can analyze and store will be limited by its hard drive.
Arkime's wiki has documents ([here](https://github.com/arkime/arkime#hardware-requirements) and [here](https://github.com/arkime/arkime/wiki/FAQ#what-kind-of-capture-machines-should-we-buy) and [here](https://github.com/arkime/arkime/wiki/FAQ#how-many-elasticsearch-nodes-or-machines-do-i-need) and a [calculator here](https://arkime.com/estimators)) that may be helpful, although not everything in those documents will apply to a Docker-based setup such as Malcolm.
\ No newline at end of file
diff --git a/docs/ubuntu-install-example.md b/docs/ubuntu-install-example.md
index 5478e91ec..179901b8f 100644
--- a/docs/ubuntu-install-example.md
+++ b/docs/ubuntu-install-example.md
@@ -132,6 +132,8 @@ Select authentication method (Basic): 1
Store PCAP, log and index files locally under /home/user/Malcolm? (Y / n): y
+Enable index management policies (ILM/ISM) in Arkime? (y / N): n
+
Should Malcolm delete the oldest database indices and/or PCAP files based on available storage? n
Automatically analyze all PCAP files with Suricata? (Y / n): y
@@ -255,25 +257,25 @@ Pulling zeek ... done
user@host:~/Malcolm$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
-ghcr.io/idaholab/malcolm/api 24.01.0 xxxxxxxxxxxx 3 days ago 158MB
-ghcr.io/idaholab/malcolm/arkime 24.01.0 xxxxxxxxxxxx 3 days ago 816MB
-ghcr.io/idaholab/malcolm/dashboards 24.01.0 xxxxxxxxxxxx 3 days ago 1.02GB
-ghcr.io/idaholab/malcolm/dashboards-helper 24.01.0 xxxxxxxxxxxx 3 days ago 184MB
-ghcr.io/idaholab/malcolm/file-monitor 24.01.0 xxxxxxxxxxxx 3 days ago 588MB
-ghcr.io/idaholab/malcolm/file-upload 24.01.0 xxxxxxxxxxxx 3 days ago 259MB
-ghcr.io/idaholab/malcolm/filebeat-oss 24.01.0 xxxxxxxxxxxx 3 days ago 624MB
-ghcr.io/idaholab/malcolm/freq 24.01.0 xxxxxxxxxxxx 3 days ago 132MB
-ghcr.io/idaholab/malcolm/htadmin 24.01.0 xxxxxxxxxxxx 3 days ago 242MB
-ghcr.io/idaholab/malcolm/logstash-oss 24.01.0 xxxxxxxxxxxx 3 days ago 1.35GB
-ghcr.io/idaholab/malcolm/netbox 24.01.0 xxxxxxxxxxxx 3 days ago 1.01GB
-ghcr.io/idaholab/malcolm/nginx-proxy 24.01.0 xxxxxxxxxxxx 3 days ago 121MB
-ghcr.io/idaholab/malcolm/opensearch 24.01.0 xxxxxxxxxxxx 3 days ago 1.17GB
-ghcr.io/idaholab/malcolm/pcap-capture 24.01.0 xxxxxxxxxxxx 3 days ago 121MB
-ghcr.io/idaholab/malcolm/pcap-monitor 24.01.0 xxxxxxxxxxxx 3 days ago 213MB
-ghcr.io/idaholab/malcolm/postgresql 24.01.0 xxxxxxxxxxxx 3 days ago 268MB
-ghcr.io/idaholab/malcolm/redis 24.01.0 xxxxxxxxxxxx 3 days ago 34.2MB
-ghcr.io/idaholab/malcolm/suricata 24.01.0 xxxxxxxxxxxx 3 days ago 278MB
-ghcr.io/idaholab/malcolm/zeek 24.01.0 xxxxxxxxxxxx 3 days ago 1GB
+ghcr.io/idaholab/malcolm/api 24.02.0 xxxxxxxxxxxx 3 days ago 158MB
+ghcr.io/idaholab/malcolm/arkime 24.02.0 xxxxxxxxxxxx 3 days ago 816MB
+ghcr.io/idaholab/malcolm/dashboards 24.02.0 xxxxxxxxxxxx 3 days ago 1.02GB
+ghcr.io/idaholab/malcolm/dashboards-helper 24.02.0 xxxxxxxxxxxx 3 days ago 184MB
+ghcr.io/idaholab/malcolm/file-monitor 24.02.0 xxxxxxxxxxxx 3 days ago 588MB
+ghcr.io/idaholab/malcolm/file-upload 24.02.0 xxxxxxxxxxxx 3 days ago 259MB
+ghcr.io/idaholab/malcolm/filebeat-oss 24.02.0 xxxxxxxxxxxx 3 days ago 624MB
+ghcr.io/idaholab/malcolm/freq 24.02.0 xxxxxxxxxxxx 3 days ago 132MB
+ghcr.io/idaholab/malcolm/htadmin 24.02.0 xxxxxxxxxxxx 3 days ago 242MB
+ghcr.io/idaholab/malcolm/logstash-oss 24.02.0 xxxxxxxxxxxx 3 days ago 1.35GB
+ghcr.io/idaholab/malcolm/netbox 24.02.0 xxxxxxxxxxxx 3 days ago 1.01GB
+ghcr.io/idaholab/malcolm/nginx-proxy 24.02.0 xxxxxxxxxxxx 3 days ago 121MB
+ghcr.io/idaholab/malcolm/opensearch 24.02.0 xxxxxxxxxxxx 3 days ago 1.17GB
+ghcr.io/idaholab/malcolm/pcap-capture 24.02.0 xxxxxxxxxxxx 3 days ago 121MB
+ghcr.io/idaholab/malcolm/pcap-monitor 24.02.0 xxxxxxxxxxxx 3 days ago 213MB
+ghcr.io/idaholab/malcolm/postgresql 24.02.0 xxxxxxxxxxxx 3 days ago 268MB
+ghcr.io/idaholab/malcolm/redis 24.02.0 xxxxxxxxxxxx 3 days ago 34.2MB
+ghcr.io/idaholab/malcolm/suricata 24.02.0 xxxxxxxxxxxx 3 days ago 278MB
+ghcr.io/idaholab/malcolm/zeek 24.02.0 xxxxxxxxxxxx 3 days ago 1GB
```
Finally, start Malcolm. When Malcolm starts it will stream informational and debug messages to the console until it has completed initializing.
diff --git a/file-monitor/scripts/.gitignore b/file-monitor/scripts/.gitignore
new file mode 100644
index 000000000..a2d7c8915
--- /dev/null
+++ b/file-monitor/scripts/.gitignore
@@ -0,0 +1 @@
+malcolm_utils.py
diff --git a/file-monitor/scripts/extracted_files_http_server.py b/file-monitor/scripts/extracted_files_http_server.py
new file mode 100755
index 000000000..a8a30bc0a
--- /dev/null
+++ b/file-monitor/scripts/extracted_files_http_server.py
@@ -0,0 +1,585 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Multithreaded simple HTTP directory server.
+#
+# The files can optionally be archived in a ZIP file, with or without a password, or
+# be aes-256-cbc encrypted in a way that's compatible with:
+# openssl enc -aes-256-cbc -d -in encrypted.data -out decrypted.data
+
+import argparse
+import dominate
+import hashlib
+import magic
+import os
+import re
+import sys
+from Crypto.Cipher import AES
+from datetime import datetime, timedelta, UTC
+from dominate.tags import *
+from http.server import HTTPServer, SimpleHTTPRequestHandler
+from socketserver import ThreadingMixIn
+from stat import S_IFREG
+from stream_zip import ZIP_32, stream_zip
+from threading import Thread
+
+from malcolm_utils import (
+ eprint,
+ EVP_BytesToKey,
+ EVP_KEY_SIZE,
+ OPENSSL_ENC_MAGIC,
+ PKCS5_SALT_LEN,
+ remove_prefix,
+ sizeof_fmt,
+ str2bool,
+ temporary_filename,
+)
+
+###################################################################################################
+args = None
+debug = False
+script_name = os.path.basename(__file__)
+script_path = os.path.dirname(os.path.realpath(__file__))
+orig_path = os.getcwd()
+filename_truncate_len = 20
+
+
+###################################################################################################
+# a function for performing "natural" (case insensitive) sort
+def natural_sort_key(s, _nsre=re.compile('([0-9]+)')):
+ return [int(text) if text.isdigit() else text.lower() for text in _nsre.split(s)]
+
+
+###################################################################################################
+# return the names and flags for Zipping a list of files
+def LocalFilesForZip(names):
+ now = datetime.now(UTC)
+
+ def contents(name):
+ with open(name, 'rb') as f:
+ while chunk := f.read(65536):
+ yield chunk
+
+ return ((os.path.join('.', os.path.basename(name)), now, S_IFREG | 0o600, ZIP_32, contents(name)) for name in names)
+
+
+###################################################################################################
+# a simple HTTP request handler for listing directories of files and serving those files for download
+class HTTPHandler(SimpleHTTPRequestHandler):
+ # return full path based on server base path and requested path
+ def translate_path(self, path):
+ path = SimpleHTTPRequestHandler.translate_path(self, path)
+ relpath = os.path.relpath(path, os.getcwd())
+ fullpath = os.path.join(self.server.base_path, relpath)
+ return fullpath, relpath
+
+ # override do_GET for fancy directory listing and so that files are encrypted/zipped, if requested
+ def do_GET(self):
+ global debug
+ global args
+
+ fullpath, relpath = self.translate_path(self.path)
+ fileBaseName = os.path.basename(fullpath)
+
+ tomorrowStr = (datetime.now(UTC) + timedelta(days=1)).isoformat().split('.')[0]
+
+ # HTTP-FUID-UID-TIMESTAMP.ext
+ carvedFileRegex = re.compile(
+ r'^(?P