Сбор журналов IIS в Elasticsearch

В этой публикации я покажу пример того, как можно настроить сбор журналов IIS в Elasticsearch. Примеры развертывания кластера Elasticsearch и хоста с Kibana уже есть в моём блоге. Можете использовать их в качестве опорных руководств по развертывания соответствующих компонентов.

Схема решения

Логическая схеме решения приведена ниже.

Схема ниже отображает физическую топологию решения.

На самом деле есть много вариантов реализации того, как настроить сбор журналов IIS в Elasticsearch. Можно, например, установить Logstash непосредственно на сервер с IIS. Или, как в моем случае, вынести Logstash на отдельный сервер.

Подготовка Elasticsearch

Выполним подготовку на стороне Elasticsearch.

1. Сначала я создам отдельную роль через Dev Tools для работы с индексами веб серверов:

https://192.168.56.36:5601/app/dev_tools

2. Для этого я выполню следующий запрос:

POST _security/role/logstash_iis_weblogs
{
  "cluster": ["manage_index_templates", "monitor", "manage_ilm"], 
  "indices": [
    {
      "names": [ "weblogsiis-*" ], 
      "privileges": ["write","create","create_index","manage","manage_ilm"]  
    }
  ]
}

3. Теперь я создам отдельного пользователя:

POST _security/user/logstash_web_iis
{
  "password" : "Qwerty123",
  "roles" : [ "logstash_iis_weblogs"],
  "full_name" : "Logstash User for store weblogs"
}

Предварительная подготовка на стороне Elasticsearch завершена.

Подготовка Logstash

Теперь подготовим сервер Logstash.

1. Сначала загрузим базу с геолокациями:

sudo cd /etc/logstash/
sudo wget https://git.io/GeoLite2-City.mmdb

2. Теперь добавим конфигурационный файл для сбора журналов с веб серверов:

sudo nano /etc/logstash/conf.d/web.conf

3. Пример моего конфигурационного файла:

input {
    beats {
	port => 5044
    }
}

filter {
    grok {
        match => { "message" => [
          "%{TIMESTAMP_ISO8601:log_timestamp} %{IPORHOST:site} %{WORD:method} %{URIPATH:page} %{NOTSPACE:querystring} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clienthost} %{NOTSPACE:useragent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:timetaken:int}",
          "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:iisSite} %{NOTSPACE:computername} %{IPORHOST:site} %{WORD:method} %{URIPATH:page} %{NOTSPACE:querystring} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clienthost} %{NOTSPACE:protocol} %{NOTSPACE:useragent} %{NOTSPACE:referer} %{IPORHOST:cshost} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:scstatus} %{NUMBER:bytessent:int} %{NUMBER:bytesrecvd:int} %{NUMBER:timetaken:int}"
        ] }
      }
      date {
        match => [ "log_timestamp", "ISO8601" ]
        target => "@timestamp"
      }
      geoip {
        source => "clienthost"
        target => "geoip"
        database => "/etc/logstash/GeoLite2-City.mmdb"
        add_tag => [ "geoip" ]
      }
      mutate {
        remove_field => [ "message"]
      }
}

output {
 elasticsearch {
    hosts => ["https://192.168.56.40:9200","https://192.168.56.37:9200"]
    user => logstash_web_iis
    password => Qwerty123
    ssl => true
    cacert => "/etc/logstash/http_ca.crt"
    index => "weblogsiis-%{+YYYY.MM.dd}"
 }
}

Формат weblogs-%{+YYYY.MM.dd} будет создавать новый индекс для каждого нового дня, что является вполне распространенной сегментацией.

4. Сохраняем внесенные изменения.

5. Перезапускаем сервис Logstash.

sudo systemctl restart logstash.service

Подготовка сервера IIS

Сначала подготовим сервер IIS:

1. Самый первый шаг – установка Filebeat.

2. Активируйте модуль для IIS:

cd "C:\Program Files\Filebeat"
.\filebeat.exe modules enable iis
Enabled iis
PS C:\Program Files\Filebeat> cd "C:\Program Files\Filebeat"
PS C:\Program Files\Filebeat> .\filebeat.exe modules enable iis
Enabled iis
PS C:\Program Files\Filebeat>

3. Откройте на редактирование конфигурационный файл модуля IIS:

"C:\Program Files\Filebeat\modules.d\iis.yml"

3. Укажите расположение журналов IIS и адрес сервера Logstash. Пример моего конфигурационного файла:

# Module: iis
# Docs: https://www.elastic.co/guide/en/beats/filebeat/8.13/filebeat-module-iis.html

- module: iis
  # Access logs
  access:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["C:/inetpub/logs/LogFiles/*/*.log"]

  # Error logs
  error:
    enabled: false

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    # var.paths: []

4. Теперь скорректируем конфигурационный файл Filebeat, чтобы он отправлял данные на наш узел Logstash.

"C:\Program Files\Filebeat\filebeat.yml"

5. Содержимое моего конфигурационного файла:

# ============================== Filebeat modules ==============================

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false

  # Period on which files under path should be checked for changes
  #reload.period: 10s

# ======================= Elasticsearch template setting =======================

setup.template.settings:
  index.number_of_shards: 1

# ================================== General ===================================


# The tags of the shipper are included in their field with each
# transaction published.
tags: ["IIS", "web"]

# ================================== Outputs ===================================

# Configure what output to use when sending the data collected by the beat.

# ------------------------------ Logstash Output -------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["192.168.56.36:5044"]

# ================================= Processors =================================
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

6. Проверим конфигурацию:

 .\filebeat.exe test config
PS C:\Program Files\Filebeat> .\filebeat.exe test config
Config OK
PS C:\Program Files\Filebeat>

7. Перезапустите сервис Filebeat:

Restart-Service filebeat

8. Проверим подключение к Logstash:

.\filebeat.exe test output

Проверка

Теперь проверим наш индекс в Elasticsearch.

Предварительно я попробую обратиться к веб сервер IIS с другого хоста:

curl 192.168.56.57 | head -10

Теперь через Dev Tools я запрошу данные из индекса:

GET weblogsiis-*/_search
{
  "query": {
    "match_all": {}
  },
  "track_total_hits": true,
  "size": 1, 
  "sort": [
    {
      "@timestamp": {
        "order": "desc"
      }
    }
  ]
}

Результат запроса:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": null,
    "hits": [
      {
        "_index": "weblogsiis-2024.04.24",
        "_id": "CYQSD48BUYJcP_C-D11o",
        "_score": null,
        "_source": {
          "ecs": {
            "version": "1.12.0"
          },
          "clienthost": "192.168.61.161",
          "tags": [
            "IIS",
            "web",
            "beats_input_codec_plain_applied",
            "_dateparsefailure",
            "_geoip_lookup_failure"
          ],
          "fileset": {
            "name": "access"
          },
          "@version": "1",
          "agent": {
            "version": "8.13.2",
            "id": "7597ce99-0f53-4b6e-8b14-4e54c876ed0b",
            "ephemeral_id": "db7ab239-10db-48b2-9f67-acd79697b884",
            "name": "TST04",
            "type": "filebeat"
          },
          "site": "192.168.56.57",
          "subresponse": "0",
          "geoip": {},
          "scstatus": "0",
          "service": {
            "type": "iis"
          },
          "referer": "-",
          "event": {
            "module": "iis",
            "original": "2024-04-24 07:46:02 192.168.56.57 GET / - 80 - 192.168.61.161 curl/7.81.0 - 200 0 0 3",
            "dataset": "iis.access"
          },
          "port": "80",
          "useragent": "curl/7.81.0",
          "@timestamp": "2024-04-24T07:46:21.133Z",
          "log_timestamp": "2024-04-24 07:46:02",
          "input": {
            "type": "log"
          },
          "querystring": "-",
          "response": "200",
          "host": {
            "mac": [
              "8A-D3-C6-E0-58-4C"
            ],
            "name": "tst04",
            "hostname": "tst04",
            "id": "35e3c3df-50ac-49e3-90ca-68607b1609e1",
            "architecture": "x86_64",
            "ip": [
              "fe80::e501:59bc:111:fe7d",
              "192.168.56.57"
            ],
            "os": {
              "version": "10.0",
              "kernel": "10.0.17763.5576 (WinBuild.160101.0800)",
              "name": "Windows Server 2019 Datacenter",
              "type": "windows",
              "build": "17763.5576",
              "platform": "windows",
              "family": "windows"
            }
          },
          "page": "/",
          "method": "GET",
          "log": {
            "offset": 1318,
            "file": {
              "path": """C:\inetpub\logs\LogFiles\W3SVC1\u_ex240424.log"""
            }
          },
          "timetaken": 3,
          "username": "-"
        },
        "sort": [
          1713944781133
        ]
      }
    ]
  }
}

Именно в таком виде данные и будут храниться в наших индексах.

Если у вас есть желание поделиться своими тонкостями настройки сбора журналов с веб серверов, то пишите в комментариях. Внесем общий вклад в развитие ИТ сообщества и поможем нашим с вами коллегам.

Если что-то не работает

1. Например, если вы допустили ошибку в конфигурационном файле, то сервис Filebeat может не запуститься. Попробуйте выполнить запуск сервиса интерактивно из командной строки:

cd 'C:\Program Files\Filebeat\'
.\filebeat.exe -c .\filebeat.yml -e -v -d "*"

Если есть какие-то ошибки то они должны вывестись на консоль.

2. Если сервис работает, но данные в Elasticsearch не поступают, то попробуйте включить журналирование.

logging.level: info
logging.to_files: true
logging.files:
  path: C:\ProgramData\filebeat\Logs
  name: filebeat
  keepfiles: 7
  permissions: 0640

3. Еще можно попробовать провести дебаг на стороне сервиса Logstash:

sudo journalctl -fu logstash.service

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *