В этой публикации я покажу пример того, как можно настроить сбор журналов 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