====== Сервисы ELK ====== * [[https://habr.com/ru/news/t/657169/|Elastic NV — американо-голландская компания, основанная в 2012 году в Амстердаме, Нидерланды, ранее известная как Elasticsearch, прекратила продажи ПО в РФ]] [update 24.03.22] * [[https://aws.amazon.com/ru/what-is/elk-stack/|Что такое стек ELK?]] * [[https://serveradmin.ru/ustanovka-i-nastroyka-elasticsearch-logstash-kibana-elk-stack/|Как установить и настроить Elasticsearch, Logstash, Kibana (ELK Stack) на Ubuntu, Debian, Centos]] * [[https://codedzen.ru/category/uroki/elasticsearch/|Уроки по Elasticsearch]] * [[https://habr.com/ru/sandbox/115014/|Глоссарий ElasticSearch]] * [[https://vk.com/wall-95686747_13620|Для установки Elasticsearch и остальных продуктов Elastic, можно использовать репозиторий https://mirror.yandex.ru/mirrors.]] * !!! От 8-x GB (8192 MB) и 2-х CPU на VM !!! ===== Elasticsearch ====== ==== Установка пакета из репозитория ==== * [[Переменные окружения]] (для установки через proxy) * [[https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html|Install Elasticsearch with Debian Packageedit]] any Debian-based system such as Debian and Ubuntu. * [[Управление ПО в Linux#Подключение сторонних репозиториев]] # apt install elasticsearch ==== Запуск и проверка работоспособности ==== * [[https://sleeplessbeastie.eu/2020/02/29/how-to-prevent-systemd-service-start-operation-from-timing-out/|How to prevent systemd service start operation from timing out]] # systemctl edit elasticsearch * [[Управление сервисами в Linux#Настройка параметров запуска в Systemd]] # systemctl enable elasticsearch * [[https://www.elastic.co/guide/en/elasticsearch/reference/current/reset-password.html|elasticsearch-reset-password]] # /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic или # cat /etc/elasticsearch/elasticsearch.yml ... xpack.security.enabled: false ... http.host: [_local_] ... # systemctl start elasticsearch # systemctl status elasticsearch # curl --noproxy localhost -X GET 'http://localhost:9200' или # curl -X GET 'http://localhost:9200' ==== Примеры запросов ==== === Список индексов === # curl --noproxy localhost -X GET 'http://localhost:9200/_cat/indices?pretty' === Добавление/замена документа === curl --noproxy localhost -H "Content-Type: application/json" -X PUT 'http://localhost:9200/myindex1/mytype1/myid1?pretty' -d ' curl --noproxy localhost -H "Content-Type: application/json" -X PUT 'http://localhost:9200/myindex1/_doc/myid1?pretty' -d ' { "field1": 111, "field2": "abcd", "filed3": { "field4": 5.8, "field5": "dcba" }, "field6": [1,2,3] } ' === Добавление документа с другим составом полей и автоматическим созданием идентификатора === curl --noproxy localhost -H "Content-Type: application/json" -X POST 'http://localhost:9200/myindex1/mytype1/?pretty' -d ' curl --noproxy localhost -H "Content-Type: application/json" -X POST 'http://localhost:9200/myindex1/_doc/?pretty' -d ' { "field1": 222, "field2": "def", "filed3": { "field5": "fde", "field7": 222 }, "field6": [4,5] } ' === Выборка данных === # curl --noproxy localhost -X GET 'http://localhost:9200/myindex1/mytype1/myid1?pretty' # curl --noproxy localhost -X GET 'http://localhost:9200/myindex1/_doc/myid1?pretty' # curl --noproxy localhost -X GET 'http://localhost:9200/myindex1/_search?pretty' # curl --noproxy localhost -X GET 'http://localhost:9200/_search?pretty' === Удаление ВСЕХ данных === # curl --noproxy localhost -X DELETE 'http://localhost:9200/_all' ===== Kibana ====== ==== Установка пакета из репозитория ==== * [[https://www.elastic.co/guide/en/kibana/current/deb.html|Install Kibana with Debian package]] * [[Управление ПО в Linux#Подключение сторонних репозиториев]] # apt install kibana ==== Настройка и запуск ==== # cat /etc/kibana/kibana.yml ... #server.port: 5601 ... server.host: "192.168.X.10" ... #elasticsearch.hosts: ["http://localhost:9200"] ... systemctl start kibana systemctl enable kibana systemctl status kibana ==== Подключение ==== Задержка 2-3 минуты * http://192.168.X.10:5601/status * http://192.168.X.10:5601/ ==== Примеры запросов ==== * Management - Dev Tools GET _search { "size": 10000, "query": { "match_all": {} } } GET /_cat/indices GET /myindex1/mytype1/myid1 GET /myindex1/_doc/myid1 PUT /myindex1/mytype1/myid2 PUT /myindex1/_doc/myid2 { "field1": 222, "field2": "fghj", "filed3": { "field4": 8.5, "field5": "hgfd" }, "field6": [4,5,6] } Обновление отдельных полей документа POST /myindex1/mytype1/myid1/_update POST /myindex1/_update/myid1 { "doc": { "filed3": { "field4": 6.8 } } } Типы данных полей индекса GET /myindex1/ Все записи индекса GET /myindex1/_search DELETE /myindex1/_doc/myid2 ==== Kibana Dashboard ==== === Filebeat Netflow Top-N === Network Direction -> Inbound или Add filter -> Edit as Query DSL -> Elasticsearch Query DSL { "match": { "netflow.destination_ipv4_address": "192.168.X.0/24" } } ===== Logstash ===== * [[https://www.elastic.co/guide/en/logstash/current/installing-logstash.html#package-repositories|Installing from Package Repositories]] * [[https://gist.github.com/justinjahn/85305bc7b7df9a6412baedce5f1a0ece|justinjahn/10-cisco-elasticsearch.conf]] * [[https://www.elastic.co/guide/en/logstash/current/plugins-outputs-exec.html|Exec output plugin]] * [[https://www.elastic.co/guide/en/logstash/current/config-examples.html|Logstash Configuration Examples]] # /usr/share/logstash/bin/logstash -e 'input { stdin {} } output { stdout {} elasticsearch {} }' ... The stdin plugin is now waiting for input: ... qwerty { "@version" => "1", "@timestamp" => 2021-06-24T06:39:22.147Z, "host" => "server.corpX.un", "message" => "qwerty" } ... GET /logstash-*/_search или GET /.ds-logs-generic-default-*/_search GET /logstash-*/_search GET /.ds-logs-generic-default-*/_search { "query": { "term": { "message": { "value": "qwerty" } } } } Длится 3-4 минуты # /usr/share/logstash/bin/logstash-plugin install logstash-output-exec * [[Пакет sudo]] * Для приведенных выражений grok требуется [[Общие настройки сетевого оборудования Cisco#Настройка времени]] с использованием NTP для сетевого оборудования Cisco # cat /etc/logstash/conf.d/cisco-backup-config.conf input { udp { port => "8514" } } filter { grok { match => [ "message", "%{SYSLOG5424PRI}(%{NUMBER:log_sequence#})?:( %{NUMBER}:)? %{CISCOTIMESTAMP:log_date}: %%{CISCO_REASON:facility}-%{INT:severity_level}-%{CISCO_REASON:facility_mnemonic}: %{GREEDYDATA:message}", "message", "%{SYSLOG5424PRI}(%{NUMBER:log_sequence#})?:( %{NUMBER}:)? %{CISCOTIMESTAMP:log_date}: %%{CISCO_REASON:facility}-%{CISCO_REASON:facility_sub}-%{INT:severity_level}-%{CISCO_REASON:facility_mnemonic}: %{GREEDYDATA:message}" ] overwrite => [ "message" ] remove_field => [ "syslog5424_pri", "@version" ] } } output { if [message] =~ /Configured/ { exec { command => "sudo /root/cisco-backup-config-logstash.sh %{host}" } } # stdout { codec => rubydebug } elasticsearch { index => "network-%{+YYYY.MM.dd}" } } # cat /root/cisco-backup-config-logstash.sh #!/bin/sh #ip=$1 ip=`echo $1 | cut -d: -f2 | cut -d'}' -f1` #cisco_name=`host $ip | awk '{ print $NF }' | cut -d. -f1` cisco_name=`getent hosts $ip | awk '{ print $NF }'` #echo $1 $ip $cisco_name >> /tmp/cisco-backup-config-logstash.log /usr/bin/sshpass -p cisco /usr/bin/scp ${cisco_name}:running-config /srv/tftp/${cisco_name}-running-config cd /srv/tftp/ /usr/bin/git add * /usr/bin/git --no-optional-locks status | grep 'modified\|deleted\|new file' | /usr/bin/git commit -a -F - # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/cisco-backup-config.conf systemctl start logstash systemctl enable logstash systemctl status logstash # tail -f /var/log/logstash/logstash-plain.log GET /network-*/_search ===== Filebeat ===== * [[https://www.elastic.co/guide/en/beats/filebeat/current/command-line-options.html|Filebeat command reference]] # apt install filebeat # cat /etc/filebeat/filebeat.yml ... - type: log или, начиная с версии 8.0 - type: filestream ... enabled: true ... exclude_lines: ['filebeat'] ... setup.kibana: ... host: "192.168.X.10:5601" ... output.elasticsearch: ... hosts: ["localhost:9200"] ... # filebeat test config -e -c /etc/filebeat/filebeat.yml ... Config OK systemctl enable filebeat systemctl start filebeat systemctl status filebeat GET /.ds-filebeat-*/_count но, работает и так: GET /filebeat-*/_count GET /filebeat-*/_search { "sort": [{"@timestamp": {"order": "desc"}}], "query": { "match": { "log.file.path": "/var/log/auth.log" } } } ==== filebeat netflow module ==== * [[https://www.elastic.co/guide/en/beats/filebeat/7.13/filebeat-module-netflow.html|NetFlow module]] # filebeat modules enable netflow # filebeat setup -e 2 минуты # cat /etc/filebeat/modules.d/netflow.yml - module: netflow log: enabled: true var: netflow_host: 0.0.0.0 netflow_port: 9555 # systemctl stop filebeat # filebeat run --modules netflow -d "*" -e ... Exiting: module netflow is configured but has no enabled filesets # systemctl start filebeat ==== Приметры запросов ==== === Все NetFlow записи для IP 192.168.X.10 === GET /filebeat-*/_search?size=10000 { "query": { "match": { "netflow.destination_ipv4_address": "192.168.X.10" } } } === Все NetFlow записи для сети 192.168.X.0/24 за последние сутки === GET /filebeat-*/_search?size=10000 { "sort": [{"netflow.exporter.timestamp": {"order": "desc"}}], "query": { "bool": { "must": [ { "match": { "netflow.destination_ipv4_address": "192.168.X.0/24" } }, { "range": { "netflow.exporter.timestamp": { "gte": "now-1d", "lte": "now" } } } ] } } } === Список уникальных IP сети предприятия за весь период наблюдения === * "size": 0 - вывести только результат агрегации * "track_total_hits": true - обработать все подходящие записи GET /filebeat-*/_search { "size": 0, "aggs": { "unique_dst_ip": { "terms": { "field": "netflow.destination_ipv4_address" } } }, "query": { "match": { "netflow.destination_ipv4_address": "192.168.X.0/24" } }, "track_total_hits": true } === Суммарный объем входящего трафика для данного IP адреса с некоторой даты до текущего момента === GET /filebeat-*/_search { "size": 0, "aggregations": { "download_sum": { "sum": { "field": "network.bytes" } } }, "query": { "bool": { "must": [ { "match": { "netflow.destination_ipv4_address": "192.168.X.128" } }, { "range": { "netflow.exporter.timestamp": { "gte": "2021-07-07T00:00:00", "lt": "now" } } } ] } }, "track_total_hits": true }