目前公司做等保,需要有日志審計,初步考慮使用rsyslog把所有服務器的日志收集起來。同時考慮到我們運維過程中也要查詢日志,要把rsyslog收集的日志可以統一界面來查詢使用
收集的日志類型:系統日志,mysql日志,防火牆,waf,F5日志,sftp,smtp日志等
開源產品:Rsyslog、Kafka、ELK
處理流程為:Vm Rsyslog--> Rsyslog Server --omkafka--> Kafka --> Logstash --> Elasticsearch --> Kibana
ps:omkafka模塊在rsyslog v8.7.0之后的版本才支持
環境:
| ELK SERVER | 10.10.27.123 |
|---|---|
| Rsyslog Server | 10.10.27.121 |
| Rsyslog client | 10.10.27.122 |
rsyslog日志收集
Rsyslog是高速的日志收集處理服務,它具有高性能、安全可靠和模塊化設計的特點,能夠接收來自各種來源的日志輸入(例如:file,tcp,udp,uxsock等),並通過處理后將結果輸出的不同的目的地(例如:mysql,mongodb,elasticsearch,kafka等),每秒處理日志量能夠超過百萬條。
Rsyslog作為syslog的增強升級版本已經在各linux發行版默認安裝了,無需額外安裝
1、rsyslog服務端
~]# cat /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
~]# cat /etc/rsyslog.d/default.conf
#### GLOBAL DIRECTIVES ####
# Use default timestamp format # 使用自定義的日志格式
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template myFormat,"%timestamp% %fromhost-ip% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myFormat
# 根據客戶端的IP單獨存放主機日志在不同目錄,rsyslog需要手動創建
$template RemoteLogs,"/data/rsyslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# 排除本地主機IP日志記錄,只記錄遠程主機日志
:fromhost-ip, !isequal, "127.0.0.1" ?RemoteLogs
~]# systemctl restart rsyslog
為了把rsyslog server收集的日志數據導入到ELK中,需要在rsyslog server使用到omkafka的模塊
~]# yum -y install rsyslog-kafka
~]# cat /etc//rsyslog.d/kafka.conf
# 加載omkafka和imfile模塊
module(load="omkafka")
module(load="imfile")
# nginx template
template(name="SystemlogTemplate" type="string" string="%hostname%<-+>%syslogtag%<-+>%msg%\n")
# ruleset
ruleset(name="systemlog-kafka") {
#日志轉發kafka
action (
type="omkafka"
template="SystemlogTemplate"
topic="system-log"
broker="10.10.27.123:9092"
)
}
input(type="imfile" Tag="Systemlog" File="/data/rsyslog/*/*.log" Ruleset="systemlog-kafka"
~]# systemctl restart rsyslog
2、 Rsyslog客戶端
~]# cat /etc/rsyslog.conf #追加一行
*.* @10.10.27.121:514
#所有日志通過UDP傳輸給rsyslog server
~]# systemctl restart rsyslog
至此,rsyslog准備完畢,驗證/data/rsyslog下是否產生日志文件
kafka搭建
1、搭建kafka依賴的zookeeper
~]# docker login
~]# docker pull wurstmeister/zookeeper
~]# mkdir -p /data/zookeeper
~]# docker run -d \
--name zookeeper \
--net=host \
-p 2181:2181 \
--restart always \
-v /data/zookeeper:/data/zookeeper \
-e ZOO_PORT=2181 \
-e ZOO_DATA_DIR=/data/zookeeper/data \
-e ZOO_DATA_LOG_DIR=/data/zookeeper/logs \
-e ZOO_MY_ID=1 \
-e ZOO_SERVERS="server.1=10.10.27.123:2888:3888" \
wurstmeister/zookeeper:latest
參數說明:
--net=host: 容器網絡設置為 host, 能夠和宿主機共享網絡
-p 2181:2181: 容器的 2181 端口映射到宿主機的 2181 端口
-v /data/zookeeper:/data/zookeeper:容器的/data/zookeeper 目錄掛載到宿主機的 /data/zookeeper 目錄
ZOO_PORT:zookeeper 的運行端口
ZOO_DATA_DIR:數據存放目錄
ZOO_DATA_LOG_DIR: 日志存放目錄
ZOO_MY_ID:zk 的節點唯一標識
ZOO_SERVERS:zk 集群服務配置
如果需要部署zookeeper集群:其他 2 個節點同理部署, 只需要修改 ZOO_MY_ID; 節點 2:ZOO_MY_ID=2,節點 3:ZOO_MY_ID=3
驗證
~]# docker exec -it zookeeper /bin/bash
bash # cd /opt/zookeeper-3.4.13/bin
bash # zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: standalone
2、搭建kafka
~]# mkdir -p /data/kafka
~]# docker pull wurstmeister/kafka
~]# docker run -d \
--name kafka \
--net=host \
--restart always \
-v /data:/data \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_PORT=9092 \
-e KAFKA_HEAP_OPTS="-Xms1g -Xmx1g" \
-e KAFKA_HOST_NAME=10.10.27.123 \
-e KAFKA_ADVERTISED_HOST_NAME=10.10.27.123 \
-e KAFKA_LOG_DIRS=/data/kafka \
-e KAFKA_ZOOKEEPER_CONNECT="10.10.27.123:2181" \
wurstmeister/kafka:latest
參數說明:
--net=host: 容器網絡設置為 host, 能夠和宿主機共享網絡
-v /data:/data:容器的/data 目錄掛載到宿主機的 /data 目錄
KAFKA_BROKER_ID:kafka 的 broker 集群標識, 每台節點 broker 不一樣
KAFKA_PORT:kafka 運行端口
KAFKA_HEAP_OPTS:kafka 啟動時的 jvm 大小
KAFKA_HOST_NAME:kafka 主機名稱,這里隨便寫,但是要與主機 IP 做 dns 映射
KAFKA_LOG_DIRS:kafka 日志存儲目錄
KAFKA_ZOOKEEPER_CONNECT:kafka 運行在 zk 里面,zk 提供的連接地址,集群的話寫多個地址,逗號隔開
如果需要部署zookeeper集群:其他 2 個節點同理部署, 只需要修改 KAFKA_BROKER_ID、KAFKA_HOST_NAME、KAFKA_ADVERTISED_HOST_NAME 對應的值即可
驗證
進入 kafka 容器
~]# docker exec -it kafka /bin/bash
bash-4.4# bin/kafka-topics.sh --list --zookeeper 10.10.27.123:2181
__consumer_offsets
log-api
system-log #rsyslog自動創建的topic
ELK搭建
1、搭建elasticsearch
~]# docker pull elasticsearch:7.7.0
~]# mkdir /data/es/conf -p
~]# cd /data/es/conf
~]# vim elasticsearch.yml
cluster.name: es-cluster
network.host: 10.10.27.123
http.cors.enabled: true
http.cors.allow-origin: "*"
network.publish_host: 10.10.27.123
discovery.zen.minimum_master_nodes: 1
discovery.zen.ping.unicast.hosts: ["10.10.27.123"]
discovery.type: single-node
多節點集群使用以下配置:
~]# vim elasticsearch.yml
#集群名稱,多個節點用一個名稱
cluster.name: es-cluster
## es 1.0 版本的默認配置是 “0.0.0.0”,所以不綁定 ip 也可訪問
network.host: 0.0.0.0
node.name: master
#跨域設置
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
network.publish_host: 192.168.1.140
discovery.zen.ping.unicast.hosts: ["192.168.1.140,192.168.1.142,192.168.1.147"]
discovery.zen.minimum_master_nodes: 1
~]# docker run -d \
--name=elasticsearch -p 9200:9200 -p 9300:9300 -p 5601:5601 \
--net=host \
--restart always \
-e ES_JAVA_OPTS="-Xms1g -Xmx1g" \ #啟動內存設置
-v /data/es/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/es/data:/usr/share/elasticsearch/data \
elasticsearch:7.7.0
啟動過程會有報錯,提前做以下操作
~]# mkdir /data/es/data
~]# chmod u+x /data/es/data
~]# vim /etc/sysctl.conf
vm.max_map_count=655350
~]# sysctl -p
如果需要部署zookeeper集群:其他 2 個節點同樣的部署思路,只需要修改 elasticsearch 的配置文件中的 node.name 和 network.publish_host
2、部署kibana
~]# docker pull daocloud.io/library/kibana:7.7.0
~]# mkdir -p /data/kibana/conf
~]# vi /data/kibana/conf/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
# ES
elasticsearch.hosts: ["http://10.10.27.123:9200"]
i18n.locale: "zh-CN"
xpack.security.enabled: false
ps:多集群可忽略此配置文件,使用默認即可
~]# docker run -d \
--restart always \
--name kibana \
--network=container:elasticsearch \ #容器網絡要和連接的 es 容器共享網絡
-v /data/kibana/config:/usr/share/kibana/config \
daocloud.io/library/kibana:7.7.0
3、部署logstash
~]# docker pull daocloud.io/library/logstash:7.7.0
~]# mkdir /data/logstash/conf -p
~]# vim logstash.conf
input{
kafka{
topics => ["system-log"] #必須可前文的topic統一
bootstrap_servers => ["10.10.27.123:9092"]
}
}
output{
elasticsearch {
hosts => ["10.10.27.123:9200"]
index => "system-log-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
~]# docker run -d \
--restart always \
--name logstash \
--net=host \
--link elasticsearch \
-v /data/logstash/conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
daocloud.io/library/logstash:7.7.0
kibana添加索引
鏡像下載
由於中國下載docker鏡像很慢,配置鏡像倉庫
--registry-mirror=https://registry.docker-cn.com
建議在本地電腦,比如win10中安裝windows版docker,配置好上面鏡像倉庫地址(setting-Docker Engine),打開powershell進行下載打包鏡像:
PS C:\Users\suixin> docker pull kibana:7.7.0
PS C:\Users\suixin> docker save -o kibana.gz kibana:7.7.0
然后上傳到服務器導入:
~]# docker load -i kibana.gz


