天天看點

Beats 攝入資料的最佳實踐

本文概要:配置 ES 3 節點全加密,Kibana 的 SSL 加密配置,Beats 的高可靠性加密傳輸,用 RBAC 怎樣把權限控制到最小,在配置檔案中消除明文密碼,這些你都做到了麼?如何保證安全、能适應和可擴充的配置 Elastic Stack 技術棧,讓我們從 Bests 的角度開始講解。

前言

本文使用的軟版本:

  • Elastic Stack 7.8.0
  • macOS 10.15.5
  • Vagrant 2.2.9
  • VirtualBox 6.0
  • CentOS 8.0

下面的配置和測試過程基于以下 Vagrantfile ,你可以在其它任何同等的環境中測試下面的所有配置。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
BOX_IMAGE = "bento/centos-8"
ES_COUNT = 3
NODE_COUNT = 4


Vagrant.configure("2") do |config|

  #設定所有 guest 使用相同的靜态 dns 解析 /etc/hosts
  config.vm.provision :hosts, :sync_hosts => true
  #用 vagrant 預設密鑰對 ssh 登入
  config.ssh.insert_key = false
  
  # 用于部署 Elasticsearch 伺服器的叢集
  (1..ES_COUNT).each do |i|
    config.vm.define "es#{i}" do |es_config|
      es_config.vm.box = BOX_IMAGE
      es_config.vm.hostname = "es#{i}.zenlab.local"
      es_config.vm.network :private_network, ip: "192.168.50.#{i + 10}"
      es_config.vm.provision :hosts, :sync_hosts => true
      es_config.vm.provider :virtualbox do |vb|
        vb.memory = 2048
        vb.cpus = 1 
      end
      es_config.vm.provision :shell, path: 'pre-install-ES.sh'
    end
  end
  
  # 用于部署 Kibana、Logstash 、APM Server、Heatbeat 和 Packetbeat
  config.vm.define "lk" do |lk_config|
    lk_config.vm.box = BOX_IMAGE
    lk_config.vm.hostname = "lk.zenlab.local"
    lk_config.vm.network :private_network, ip: "192.168.50.20"
    lk_config.vm.network 'forwarded_port', guest: 5601, host: 5601
    lk_config.vm.provision :hosts, :sync_hosts => true
    lk_config.vm.provider :virtualbox do |vb|
      vb.memory = 1024
      vb.cpus = 1
    end
    #logstash_config.vm.provision :shell, path: 'pre-install-ES.sh'
  end

  # 兩個被管理節點,用于部署監控應用和各種 Beats 代理
  (1..NODE_COUNT).each do |i|
    config.vm.define "node#{i}" do |node_config|
      node_config.vm.box = BOX_IMAGE
      node_config.vm.hostname = "node#{i}.zenlab.local"
      node_config.vm.network :private_network, ip: "192.168.50.#{i + 20}"
      node_config.vm.provider :virtualbox do |vb|
        vb.memory = 1024
        vb.cpus = 1
      end
      node_config.vm.provision :shell, path: 'pre-install-beats.sh'
    end
  end

# Install avahi on all machines  
  config.vm.provision "shell", inline: <<-SHELL
    sh -c "echo 'Welcome to Elastic Stack!'" 
  SHELL
end
           

注:下文中所有路徑中的 

/vagrant/

 目錄是本 vagrant 測試環境中,所有虛拟機的共享目錄,是所有節點上配置檔案的原路徑。如果你使用的不是 vagrant 環境,你需要在下面的測試中适當的替換。

三節點 Elasticsearch 伺服器叢集

在每個節點上使用下面的初始化腳本,部署 Elasticsearch 伺服器。

使用

vagrant up es1 es2 es3

指令建立并啟動 ES 伺服器三個節點。

# pre-install-ES.sh

elastic_version='7.8.0'
echo "Provisioning a Elasticsearch "$elastic_version" Server..."

sudo date > /etc/vagrant_provisioned_at
sudo swapoff -a
sudo sysctl -w vm.max_map_count=262144
sudo sysctl -p
sudo sh -c "echo 'elasticsearch  -  nofile  65535' >> /etc/security/limits.conf"
sudo sh -c "echo '**** --  --  --  --  --  --  --  -- ****' > /etc/motd"
sudo sh -c "echo '**** Welcome to Elastic Stack Labs' >> /etc/motd"
sudo sh -c "echo '**** --  --  --  --  --  --  --  -- ****' >> /etc/motd"
sudo sh -c "echo '*' >> /etc/motd"
sudo rpm -ivh /vagrant/rpm/elasticsearch-$elastic_version-x86_64.rpm 

           

上面的腳本簡單的初始化了幾個作業系統參數,然後完成了 rpm 包的安裝。非vagrant 環境的需要手工上傳 rpm 安裝檔案,和運作以上的指令。

配置首個 ES 伺服器節點

登入 es1 節點

vagrant ssh es1

 ;

建立用于節點間傳輸所需要的數字證書和秘鑰檔案,下面是所使用的種子檔案。

# instance.yml
instances:
  - name: 'es1'
    ip: ['192.168.50.11']
    dns: [ 'es1.zenlab.local' ]
  - name: "es2"
    ip: ['192.168.50.12']
    dns: [ 'es2.zenlab.local' ]
  - name: 'es3'
    ip: ['192.168.50.13']
    dns: [ 'es3.zenlab.local' ]
  - name: 'lk'
    ip: ['192.168.50.20']
    dns: [ 'lk.zenlab.local' ]
           

用 

elasticsearch-certutil

 建立證書檔案包。

sudo /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca --pem --in /vagrant/certs/instance.yml  --out /vagrant/certs/certs.zip
           

将得到的 zip 檔案解壓縮在适當的目錄裡備用。

重要步驟:在 Elasticsearch 的配置檔案目錄中放置必要的數字證書檔案。

sudo mkdir /etc/elasticsearch/certs
sudo cp /vagrant/certs/ca/ca.crt  /etc/elasticsearch/certs
sudo cp /vagrant/certs/es1/* /etc/elasticsearch/certs
sudo ls /etc/elasticsearch/certs
           

在 certs 目錄中有三個檔案:

  1. ca.crt CA 根證書
  2. es1.crt 伺服器證書
  3. es1.key 私鑰檔案

CA 根證書是在所有節點上發起對 ES 服務的 HTTPS 服務所需要的用戶端證書。 es1.crt 和 es1.key 這樣的必要對需要在所有 ES 節點上部署,用于 ES 節點間的 transport 協定加密傳輸,每個 ES 節點都是用自己的密鑰對檔案。

在 ES1 的主配置檔案中打開安全選項和其它必要配置,示例配置檔案如下。

# elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
cluster.name: elk4devops

# ------------------------------------ Node ------------------------------------
node.name: es1

# ----------------------------------- Paths ------------------------------------
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# ---------------------------------- Network -----------------------------------
network.host: es1.zenlab.local

# --------------------------------- Discovery ----------------------------------
cluster.initial_master_nodes: ["es1"]
discovery.seed_hosts: [ "es1.zenlab.local" ]

# ------------------------------- TLS and Cert ---------------------------------
xpack.security.enabled: true

#外部服務加密配置
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/es1.key
xpack.security.http.ssl.certificate: certs/es1.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt

#叢集内通訊加密配置
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: certs/es1.key
xpack.security.transport.ssl.certificate: certs/es1.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt

xpack.monitoring.collection.enabled: true

#  ------------------------------- App Search ---------------------------------
action.auto_create_index: ".app-search-*-logs-*,-.app-search-*,+*"
           

使用以上配置檔案覆寫Elasticsearch 預設的配置檔案,首次啟動第一個 ES 節點的服務。

sudo cp /vagrant/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
sudo systemctl daemon-reload
sudo systemctl start elasticsearch
           

用下面的指令檢視啟動日志,直到 elasticsearch 服務正常啟動。

sudo tail -f /var/log/elasticsearch/elk4devops.log
           

用下面的指令初始化 Elasticsearch 系統内置賬号為随機複雜密碼。

sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto -u "https://es1.zenlab.local:9200" -b


Changed password for user apm_system
PASSWORD apm_system = irpVThXpbFDrdq2rBQUC

Changed password for user kibana_system
PASSWORD kibana_system = CxGNlkqQMbcp6u6XuCbk

Changed password for user kibana
PASSWORD kibana = CxGNlkqQMbcp6u6XuCbk

Changed password for user logstash_system
PASSWORD logstash_system = EOUiCyQQ97IHwUJs8Eum

Changed password for user beats_system
PASSWORD beats_system = EF8OdPmcpy1bUCgFVQ90

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = 3ZRBVo5Omu33McoOKgwE

Changed password for user elastic
PASSWORD elastic = ZSzN2idoU6hFa4f0ulPP
           

将上面随機生成的密碼儲存在安全的地方備用,這些内置的超級使用者權限大,一旦遺失了密碼,可能會造成重大的資料洩露。

用上面建立的賬戶測試第一個 ES 節點是否可以通過 https 正常通路,這裡也測試 ca 公鑰的可用性。

curl --cacert /vagrant/certs/ca/ca.crt -u elastic 'https://es1.zenlab.local:9200/_cat/nodes?v'

           

在 es1 伺服器的指令行運作以上指令,輸入 elastic 的密碼。應該可以看到正常的輸出。

/vagrant/certs/ca/ca.crt

 這個路徑替換成你的環境中的相關 ca 證書檔案路徑。

配置第二個和第三個 ES 伺服器節點

剩下的兩個節點在加入叢集之前都已經通過初始化腳本安裝完了 rpm 安裝包。剩下的就是逐個節點的部署之前生産的證書檔案和修改後的 elasticsearc.yml 主配置檔案。在本文檔參考的環境中使用如下指令。

登入 es 2 

vagrant ssh es2

配置 es2 的證書和秘鑰檔案,下面的複制原路徑需要替換成你所使用的實際路徑。

sudo mkdir /etc/elasticsearch/certs
sudo cp /vagrant/certs/ca/ca.crt  /etc/elasticsearch/certs
sudo cp /vagrant/certs/es2/* /etc/elasticsearch/certs
sudo ls /etc/elasticsearch/certs
           

部署 es2 的配置檔案,然後啟動這個節點的 Elasticsearch 服務。

sudo cp /vagrant/elasticsearch2.yml /etc/elasticsearch/elasticsearch.yml
sudo systemctl daemon-reload
sudo systemctl start elasticsearch
           

elasticsearch2.yml 

檔案的内容如下。

# ---------------------------------- Cluster -----------------------------------
cluster.name: elk4devops

# ------------------------------------ Node ------------------------------------
node.name: es2

# ----------------------------------- Paths ------------------------------------
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# ---------------------------------- Network -----------------------------------
network.host: es2.zenlab.local

# --------------------------------- Discovery ----------------------------------
cluster.initial_master_nodes: ["es1"]
discovery.seed_hosts: [ "es1.zenlab.local" ]

# ------------------------------- TLS and Cert ---------------------------------
xpack.security.enabled: true

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/es2.key
xpack.security.http.ssl.certificate: certs/es2.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: certs/es2.key
xpack.security.transport.ssl.certificate: certs/es2.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt

xpack.monitoring.collection.enabled: true

#  ------------------------------- App Search ---------------------------------
action.auto_create_index: ".app-search-*-logs-*,-.app-search-*,+*"
           

在 es2 的指令用下面的指令檢視是否該節點正常加入了叢集。

curl --cacert /vagrant/certs/ca/ca.crt -u elastic 'https://es1.zenlab.local:9200/_cat/nodes?v'
Enter host password for user 'elastic':
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.50.11           37          94   0    0.00    0.05     0.06 dilmrt    *      es1
192.168.50.12           17          96   9    0.49    0.20     0.07 dilmrt    -      es2
           

注意上面 ca.crt 檔案的路徑,要輸入的是 elasstic 使用者的密碼。 正常情況下兩個節點都會出現在結果清單中。

用相似的指令初始化和啟動 es3 節點的服務。es3 的主配置檔案樣例如下。

# ---------------------------------- Cluster -----------------------------------
cluster.name: elk4devops

# ------------------------------------ Node ------------------------------------
node.name: es3

# ----------------------------------- Paths ------------------------------------
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# ---------------------------------- Network -----------------------------------
network.host: es3.zenlab.local

# --------------------------------- Discovery ----------------------------------
cluster.initial_master_nodes: ["es1"]
discovery.seed_hosts: [ "es1.zenlab.local" ]

# ------------------------------- TLS and Cert ---------------------------------
xpack.security.enabled: true

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/es3.key
xpack.security.http.ssl.certificate: certs/es3.crt
xpack.security.http.ssl.certificate_authorities: certs/ca.crt

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: certs/es3.key
xpack.security.transport.ssl.certificate: certs/es3.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt

xpack.monitoring.collection.enabled: true

#  ------------------------------- App Search ---------------------------------
action.auto_create_index: ".app-search-*-logs-*,-.app-search-*,+*"

           

最終叢集的測試狀态如下:

[[email protected] ~]$ curl --cacert /vagrant/certs/ca/ca.crt -u elastic 'https://es1.zenlab.local:9200/_cat/nodes?v'
Enter host password for user 'elastic':
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.50.11           20          96   6    0.18    0.09     0.03 dilmrt    *      es1
192.168.50.13           50          96   2    0.02    0.07     0.03 dilmrt    -      es3
192.168.50.12           25          96   1    0.00    0.02     0.00 dilmrt    -      es2
           

配置 Kibana 伺服器

服務是必要的的管理界面,是資料搜尋、可視化的重要工具。在 Elasticsearch 服務打開了外部 https 加密通路的情況下,Kibana 伺服器的安裝和配置也需要做如下調整。

Kibana 的 rpm 安裝這裡省略。下面直接進入相關的主要配置步驟。

複制用于連結 ES 叢集的證書

sudo mkdir /etc/kibana/certs
sudo cp /vagrant/certs/ca/ca.crt  /etc/kibana/certs
sudo cp /vagrant/certs/lk/* /etc/kibana/certs
sudo ls /etc/kibana/certs
           

修改預設的 kibana.yml 配置檔案,然後覆寫預設的配置檔案後啟動 kibana 服務。

sudo cp /vagrant/kibna.yml /etc/kibana/kibana.yml
sudo cat /etc/kibana/kibana.yml
sudo systemctl start kibana
           

監控 kibana 的啟動日志,直到它正常啟動。

sudo tail -f /var/log/messages
           

啟動後,使用浏覽器通路 

https://lk.zenlab.lcoal:5601 

Kibana 服務,使用 elastic 使用者的密碼登入,確定 Kibana 正常啟動。

配置權限 Beats 賬号

在使用 Beats 采集監控資料的時候,Beats 的配置檔案中需要配置一個背景 Elasticsearch 服務通路賬号,安全起見需求需要将這個賬号配置為隻寫權限。配置步驟如下。

在 Kibana 的使用者管理中建立名為 

beats-writer

 的角色,如下圖所示。

Beats 攝入資料的最佳實踐

以上這個角色擁有 filebeat 和 Metricbeat 兩個索引的通路權限,這裡是為了評估使用者角色管理的工作量,否則可以每個索引單獨設定一套必要權限的角色和使用者,進而實作更安全的防護。

然後建立名為 

beats-writer

 的使用者,設定一個密碼,将它賦予 

beats-writer

 的角色(上面建立的)。

Beats 攝入資料的最佳實踐

這樣它就可以用于所有 Beats 節點的配置了。

初始化首個 Beats 節點

在 vagrant 測試環境中啟動第一個用于測試 Beats 的節點。

vagrant up node1

這裡使用了初始腳本安裝相關的 rpm 安裝包。

#!/bin/bash
# author: Martin Liu
# url:martinliu.cn
elastic_version='7.8.0'
echo "Installing a Filebeat "$elastic_version" agent..."

sudo rpm -ivh /vagrant/rpm/filebeat-$elastic_version-x86_64.rpm
sudo systemctl enable  filebeat.service
sudo rpm -ivh /vagrant/rpm/metricbeat-$elastic_version-x86_64.rpm
sudo systemctl enable  metricbeat.service
sudo rpm -ivh /vagrant/rpm/auditbeat-$elastic_version-x86_64.rpm
sudo systemctl enable  auditbeat.service
           

登入該節點進行 Beats 的初始化配置。目前 Elasticsearch 叢集還是空白的,還沒有初始化任何 Beats 相關的索引、可視化和儀表闆。這個初始化工作是通過,每種 Beats 的 setup 指令完成的。這個 setup 指令隻需要在一個節點上成功執行一次即可,其它節點的配置檔案中,連 setup 指令相關的配置都不需要。

這裡使用的 filebeat.yml 參考檔案如下:

#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
  enabled: false
  paths:
    - /var/log/*.log

#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 5s

#==================== Elasticsearch template setting ==========================
setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression

#============================== Kibana =====================================
setup.kibana:
  host: "https://lk.zenlab.local:5601"  

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  hosts: ["es1.zenlab.local:9200"]
  username: "elastic"
  password: "1l1lqVMMWMbLI6DCH0dQ"
  protocol: https

#================================ Processors =====================================
processors:
  - add_host_metadata: 
      netinfo.enabled: true
      cache.ttl: 5m
      geo:
        name: bj-dc-01
        location: 35.5528, 116.2360
        continent_name: Asia
        country_iso_code: CN
        region_name: Beijing
        region_iso_code: CN-BJ
        city_name: Beijing 
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
           

目前的計劃是配置 Beats 直接通路 Elasticsearch 背景服務,不通過 Logstash 中轉。以後增加這個參考配置。

在執行 filebeat setup 指令之前,還需要在 Beats 節點上部署上面生成的 ca 公鑰檔案。參考指令如下。

sudo update-ca-trust enable
sudo cp /vagrant/certs/ca/ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
           

這裡把 ca.crt 公鑰檔案部署到了 CentOS 作業系統的的可信 CA 發放機構的目錄中,其它作業系統中的這個證書路徑可能不同,需要做替換,包括以上的證書更新指令也可能需要調整。

經過以上的配置之後,用之前的 curl 指令測試一下是否這個證書生效了。

[[email protected] ~]$ curl -u elastic 'https://es1.zenlab.local:9200/_cat/nodes?v'
Enter host password for user 'elastic':
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.50.11           20          96   6    0.18    0.09     0.03 dilmrt    *      es1
192.168.50.13           50          96   2    0.02    0.07     0.03 dilmrt    -      es3
192.168.50.12           25          96   1    0.00    0.02     0.00 dilmrt    -      es2
           

這次在參數中故意省略了 ca 證書檔案路徑,如果 curl 可以正常通路,那麼 Beats 程式也可以,而且不需要在 Beats 配置檔案中生命公鑰的路徑,更有利于在以後切換到另外一套 CA 秘鑰後,配置檔案的更新工作。

這裡省略 Beats 配置檔案的展示,參考一下指令做初始化前的準備。

sudo cp -f /vagrant/filebeat.yml /etc/filebeat/filebeat.yml
sudo cp -f /vagrant/metricbeat.yml /etc/metricbeat/metricbeat.yml
sudo filebeat modules enable system
           

為了測試的友善起見,在 filebeat.yml 和 metricbeat.yml 檔案中使用了超級使用者 elastic ,如果這個動作伴随着 Elastic Stack 的版本更新需要經常發生,此處需要配置一個 Beats setup 用的專用角色和賬戶,進而避免多次使用超級使用者。

下面運作 setup 指令:

filebeat setup
metricbeat setup
           

這兩個指令正常運作後,在 Kibana 裡會增加增加相關的索引、pipeline、可視化和儀表闆等對象。

使用下面的指令測試 filebeat 和 metricbeat 是否能正常的采集資料并傳輸到背景。

filebeat -e 
metricbeat -e 
           

如果報錯的話,将 level 在配置檔案中設定為 debug,友善調試。調試成功之後,應該在 Kibana 的界面中,可以看到 node1 節點,點選後能看到實時更新過來的日志和監控名額。

Beats 攝入資料的最佳實踐

在新的節點上部署 Beats

在新的需要部署 Beats 的節點上,可以使用下面的腳本配置和部署。

add-agent.sh

#!/bin/bash
# author: Martin Liu
# url:martinliu.cn

elastic_version='7.8.0'
b_user='beats-writer'
b_pwd='DevOps1234'

echo "############## Installing a Beats "$elastic_version" agent..."
sudo rpm -ivh /vagrant/rpm/filebeat-$elastic_version-x86_64.rpm
sudo systemctl enable  filebeat.service
sudo filebeat modules enable system
sudo rpm -ivh /vagrant/rpm/metricbeat-$elastic_version-x86_64.rpm
sudo systemctl enable  metricbeat.service

echo "################### Setup Public CA..."
sudo update-ca-trust enable
sudo cp /vagrant/certs/ca/ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract

echo "################### Update Beats configuration files ..."
sudo cp -f /vagrant/filebeat-v1.yml /etc/filebeat/filebeat.yml
sudo cp -f /vagrant/metricbeat-v1.yml /etc/metricbeat/metricbeat.yml

echo "################### Setup Keystor for Beats ..."
echo $b_user  | sudo filebeat keystore add BEATS_WRITER_USERNAME --stdin --force
echo $b_pwd   | sudo filebeat keystore add BEATS_WRITER_PW --stdin --force
echo $b_user  | sudo metricbeat keystore add BEATS_WRITER_USERNAME --stdin --force
echo $b_pwd   | sudo metricbeat keystore add BEATS_WRITER_PW --stdin --force

echo "################### Start Beats services ..."

sudo systemctl start  metricbeat.service
sudo systemctl start  filebeat.service
           

簡單說明以上腳本的功能:

  • 用 rpm 安裝包安裝所需要的 Beats,filebeat 開啟 system 子產品。
  • 在目标作業系統裡部署必須的 ca 證書到預設路徑中,并啟用。進而省略在所有 beats 檔案中生命公鑰檔案的路徑。
  • 覆寫更新預設的 Beats 配置檔案。
  • 建立并初始化 Beats 配置檔案中所需要的 beats-writer 使用者名和密碼。進而消除消除所有明文密碼。以上腳本隻需要在節點上更新的時候才允許,允許後删除,進而不會留下任何明文密碼和賬戶資訊。Beats 的任何子產品配置中,如果需要配置任何密碼賬戶也需要如法炮制,進而保證基本的安全性。
  • 啟動 Beats 服務

以上腳本所使用的配置檔案檔案如下。

filebeat-v1.yml

filebeat.inputs:
- type: log
  enabled: false
  paths:
    - /var/log/*.log

#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 60s

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  hosts: ["es1.zenlab.local:9200","es2.zenlab.local:9200","es3.zenlab.local:9200"]
  password: ${BEATS_WRITER_PW}
  username: ${BEATS_WRITER_USERNAME}
  protocol: https

#================================ Processors =====================================
processors:
  - add_host_metadata: 
      netinfo.enabled: true
      cache.ttl: 5m
      geo:
        name: bj-dc-01
        location: 35.5528, 116.2360
        continent_name: Asia
        country_iso_code: CN
        region_name: Beijing
        region_iso_code: CN-BJ
        city_name: Beijing 
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  - add_fields:
      target: ''
      fields:
        service.name: 'Elastic Cloud'
        service.id: 'ec-ww'

#==================== Best Practice Configuration ==========================
setup.ilm.check_exists: false
logging.level: error
queue.spool: ~
           

metricbeat.yml

# =========================== Modules configuration ============================
metricbeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 120s

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  hosts: ["es1.zenlab.local:9200","es2.zenlab.local:9200","es3.zenlab.local:9200"]
  password: ${BEATS_WRITER_PW}
  username: ${BEATS_WRITER_USERNAME}
  protocol: https

#================================ Processors =====================================
processors:
  - add_host_metadata: 
      netinfo.enabled: true
      cache.ttl: 5m
      geo:
        name: bj-dc-01
        location: 35.5528, 116.2360
        continent_name: Asia
        country_iso_code: CN
        region_name: Beijing
        region_iso_code: CN-BJ
        city_name: Beijing 
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  - add_fields:
      target: ''
      fields:
        service.name: 'Elastic Cloud'
        service.id: 'ec-ww'

#==================== Best Practice Configuration ==========================
setup.ilm.check_exists: false
logging.level: error
queue.spool: ~
           

解釋一下相關的重要配置。

  • netinfo.enabled: true 收集所有網卡的配置資訊,覆寫多塊網卡的情況
  • geo: 地理位置資訊對以後基于位置的查詢打下基礎,這對于監控和資訊安全都非常重要。為以後基于 host 的上下文關聯打下基礎,友善在 apm、log、metric、heartbeat 和機器學習的界面中互相跳轉。
  • add_fields: 在 fields 下面維護 ECS 資料定義中的必要的有意義的資料,在網上查詢 ECS 的資料定義,這些字段可以優化以後的搜尋邏輯。
  • 最後一段是其它必要的最佳實踐設定
  • output.elasticsearch : 這裡使用了三個 ES 節點的連結位址,這裡應該使用至少 2 個 Elasticsearch 叢集中的 ingest 節點。

總結

本文沒有展開說明和配置的地方包括:對 Best 節點的工作狀态的監控;對索引生命周期規則的調優(用盡磁盤),冷熱資料的自動化遷移規則。

完成的配置包括:

  • 配置 ES 3 節點叢集内部的 TLS 加密傳輸,對外的 HTTPS 加密協定服務
  • Kibana 基于證書的 SSL 加密配置
  • Beats 的高可靠性背景傳輸資料,TLS加密傳輸資料
  • 用基于角色的通路控制,建立了隻寫權限的 beats-writer 角色和使用者。
  • 用 beats 的 keystore 将配置檔案中的明文密碼消除。