CentOS 7.2下Filebeat+Kafka+ELK生产部署(安全加固)

2023-10-31

01架构说明

  • 在需要采集日志的服务器上部署Filebeat服务,它将采集到的日志数据推送到Kafka集群;
  • Logstash服务通过input插件读取Kafka集群对应主题的数据,期间可以使用filter插
  • 数据做自定义过滤解析处理,然后通过output插件将数据推送到Elasticsearch集群中;
    最后用户通过Kibana服务提供的web界面,对索引数据做汇总,分析,搜索和展示等功能
    在这里插入图片描述
    本文旨在部署安全可靠的生产架构,对ELK做XPack安全加固,对Kafka做SASL安全加固!

02准备工作

在这里插入图片描述
本文的ELK全家桶版本为7.2.0,Kafka版本为2.12-2.3.0。

03环境配置

主要的操作有:关闭selinux安全机制,关闭firewalld防火墙,关闭swap交换内存空间,文件及内存限制配置,设置jvm参数,创建普通用户,准备磁盘存储目录等;建议做好服务器间的免密登陆操作。

auto_elk_env.sh

#!/bin/bash
echo "##### Update /etc/hosts #####"
cat >> /etc/hosts <<EOF
192.168.100.83 es83
192.168.100.86 es86
192.168.100.87 es87
EOF

echo "##### Stop firewalld #####"
systemctl stop firewalld
systemctl disable firewalld

echo "##### Close selinux #####"
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

echo "##### Close swap #####"
swapoff -a

# 提示:修改完该文件后,需重新登录终端才可生效,可通过ulimit -a查看。
echo "##### Modify /etc/security/limits.conf #####"
cat > /etc/security/limits.conf <<EOF
* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 65536
* soft memlock unlimited
* hard memlock unlimited
EOF

echo "##### Modify /etc/sysctl.conf #####"
cat >> /etc/sysctl.conf <<EOF
vm.max_map_count=562144
EOF
sysctl -p

echo "##### Create user(密码随意) #####"
useradd elkuser
echo 123456 | passwd --stdin elkuser

echo "##### 配置SSH免密通信 #####"
ssh-keygen   # 一路回车即可
ssh-copy-id 192.168.100.83
ssh-copy-id 192.168.100.86
ssh-copy-id 192.168.100.87

04Elasticsearch集群部署

Elasticsearch 是一个分布式、RESTful风格的搜索和数据分析引擎;它实现了用于全文检索的倒排索引,而且为每个数据都编入了索引,搜索速度非常快;它具有可扩展性和弹性,每秒钟能处理海量事件,并且它适用于所有数据类型,例如结构化数据、非结构化数据、地理位置等。

笔者在生产环境上,为Elasticsearch分配了30G内存(最大不要超过32G),6块446G的SSD磁盘,并使用G1的垃圾回收策略,关于硬件配置大家根据实际情况来分配使用!

提示:笔者已事先下载好了所有软件包到服务器上;本文的三个es节点默认都做主节点和数据节点,当使用xpack加密时,主节点也必须做数据节点,否则加密配置写入不进es存储!

在本文中,笔者直接在83节点上完成了es集群的部署,请仔细阅读下方的命令!

# 下载方式:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-linux-x86_64.tar.gz
echo "##### 解压Elasticsearch #####"
[root@es83 ~]# cd /home/elkuser/
[root@es83 elkuser]# tar -xvf elasticsearch-7.2.0-linux-x86_64.tar.gz

echo "##### 修改jvm文件 #####"
[root@es83 elkuser]# cd ./elasticsearch-7.2.0/
[root@es83 elasticsearch-7.2.0]# sed -i -e 's/1g/30g/g' -e '36,38s/^-/#&/g' ./config/jvm.options
[root@es83 elasticsearch-7.2.0]# sed -i -e 'N;38 a -XX:+UseG1GC \n-XX:MaxGCPauseMillis=50' ./config/jvm.options

echo "##### 生成关键证书文件 #####"
[root@es83 elasticsearch-7.2.0]# ./bin/elasticsearch-certutil ca
......
Please enter the desired output file [elastic-stack-ca.p12]: 回车Enter
Enter password for elastic-stack-ca.p12 : 回车Enter

echo "##### 利用关键证书生成所有es节点证书文件 #####"
[root@es83 elasticsearch-7.2.0]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ip 192.168.100.83
......
Enter password for CA (elastic-stack-ca.p12) : 回车Enter
Please enter the desired output file [elastic-certificates.p12]: es83.p12
Enter password for es83.p12 : 回车Enter

[root@es83 elasticsearch-7.2.0]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ip 192.168.100.86
......
Enter password for CA (elastic-stack-ca.p12) : 回车Enter
Please enter the desired output file [elastic-certificates.p12]: es86.p12
Enter password for es86.p12 : 回车Enter

[root@es83 elasticsearch-7.2.0]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ip 192.168.100.87
......
Enter password for CA (elastic-stack-ca.p12) : 回车Enter
Please enter the desired output file [elastic-certificates.p12]: es87.p12
Enter password for es87.p12 : 回车Enter

echo "##### 利用关键证书生成后续logstash所需证书 #####"
[root@es83 elasticsearch-7.2.0]# openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys > root.cer
[root@es83 elasticsearch-7.2.0]# openssl x509 -in root.cer -out root.pem

echo "##### 利用关键证书生成后续kibana所需证书 #####"
[root@es83 elasticsearch-7.2.0]# ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 -name "CN=something,OU=Consulting Team,DC=mydomain,DC=com"
......
Enter password for CA (elastic-stack-ca.p12) : 回车Enter
Please enter the desired output file [CN=something,OU=Consulting Team,DC=mydomain,DC=com.p12]: client.p12
Enter password for client.p12 : 回车Enter

echo "##### 移动所生成的证书文件到指定目录下 #####"
[root@es83 elasticsearch-7.2.0]# cp *.p12 ./config/

echo "##### 修改es配置文件 #####"
[root@es83 elasticsearch-7.2.0]# cat > ./config/elasticsearch.yml <<EOF
cluster.name: chilu_elk
node.name: es83
node.master: true
node.data: true
path.data: /logdata/data1,/logdata/data2,/logdata/data3,/logdata/data4,/logdata/data5,/logdata/data6
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 192.168.100.83
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.100.83:9300","192.168.100.86:9300","192.168.100.87:9300"]
cluster.initial_master_nodes: ["192.168.100.83:9300","192.168.100.86:9300","192.168.100.87:9300"]
node.max_local_storage_nodes: 256
indices.fielddata.cache.size: 50%
http.cors.enabled: true
http.cors.allow-origin: "*"

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: es83.p12
xpack.security.transport.ssl.truststore.path: elastic-stack-ca.p12

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: es83.p12
xpack.security.http.ssl.truststore.path: elastic-stack-ca.p12
xpack.security.http.ssl.client_authentication: optional
EOF

echo "##### scp目录到其他节点上,并修改配置 #####"
[root@es83 elasticsearch-7.2.0]# cd ../
[root@es83 elkuser]# scp -r ./elasticsearch-7.2.0 192.168.100.86:/home/elkuser/
[root@es83 elkuser]# scp -r ./elasticsearch-7.2.0 192.168.100.87:/home/elkuser/
[root@es83 elkuser]# ssh 192.168.100.86 "sed -i -e 's/es83/es86/g' -e '8s/192.168.100.83/192.168.100.86/' /home/elkuser/elasticsearch-7.2.0/config/elasticsearch.yml"
[root@es83 elkuser]# ssh 192.168.100.87 "sed -i -e 's/es83/es87/g' -e '8s/192.168.100.83/192.168.100.87/' /home/elkuser/elasticsearch-7.2.0/config/elasticsearch.yml"

echo "##### 修改各目录的属主和组 #####"
[root@es83 elkuser]# chown -R elkuser:elkuser /logdata ./elasticsearch-7.2.0
[root@es83 elkuser]# ssh 192.168.100.86 "chown -R elkuser:elkuser /logdata /home/elkuser/elasticsearch-7.2.0"
[root@es83 elkuser]# ssh 192.168.100.87 "chown -R elkuser:elkuser /logdata /home/elkuser/elasticsearch-7.2.0"

echo "##### 切换普通用户,后台运行elasticsearch服务 #####"
[root@es83 elasticsearch-7.2.0]# su elkuser
[elkuser@es83 elasticsearch-7.2.0]$ ./bin/elasticsearch -d
[elkuser@es83 elasticsearch-7.2.0]$ ssh elkuser@192.168.100.86 "/home/elkuser/elasticsearch-7.2.0/bin/elasticsearch -d"
[elkuser@es83 elasticsearch-7.2.0]$ ssh elkuser@192.168.100.87 "/home/elkuser/elasticsearch-7.2.0/bin/elasticsearch -d"

echo "##### 自动生成用户密码(记得保存好用户密码) #####"
[elkuser@es83 elasticsearch-7.2.0]$ echo y | ./bin/elasticsearch-setup-passwords auto | tee elk_pwd.log
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.

Changed password for user apm_system
PASSWORD apm_system = HojN4w88Nwgl51Oe7o12

Changed password for user kibana
PASSWORD kibana = JPYDvJYn2CDmls5gIlNG

Changed password for user logstash_system
PASSWORD logstash_system = kXxmVCX34PGpUluBXABX

Changed password for user beats_system
PASSWORD beats_system = rY90aBHjAdidQPwgX87u

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = 0VxaGROqo255y60P1kBV

Changed password for user elastic
PASSWORD elastic = NvOBRGpUE3DoaSbYaUp3

echo "##### 测试es加密,查看集群状态是否为green #####"
[elkuser@es83 elasticsearch-7.2.0]$ curl --tlsv1 -XGET "https://192.168.100.83:9200/_cluster/health?pretty" --user elastic:NvOBRGpUE3DoaSbYaUp3 -k

05Kafka集群部署

Kafka 是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式消息系统;它具有高吞吐量、低延迟、可扩展性、持久性、可靠性、容错性和高并发等特点,可以处理几十万条消息,延迟只有几毫秒,集群式部署支持热扩展,消息可被持久化到本地磁盘,防止数据丢失,而且支持数千个客户端同时读写。

在本文的架构中,kafka是用作缓存消息队列,用来实时接收日志和发送日志到logstash,实现解耦和流量削峰,解决logstash消费能力跟不上导致的数据丢失问题;笔者采用的是kafka内置的zookeeper,也是以集群方式部署,无需再单独搭建zookeeper集群服务。
注意:kafka的集群配置信息,状态维护是存储在zookeeper这个进程里的,所以kafka在启动前需要先配置启动zookeeper!

笔者为zookeeper服务分配了4G内存,为kafka服务分配了31G内存和5块SSD磁盘,关于硬件配置大家根据实际情况来分配使用!

# 下载方式:wget https://archive.apache.org/dist/kafka/2.3.0/kafka_2.12-2.3.0.tgz
echo "##### 解压Kafka #####"
[root@es83 ~]# cd /opt/
[root@es83 opt]# tar -xvf ./kafka_2.12-2.3.0.tgz

echo "##### 修改zookeeper配置文件 #####"
[root@es83 opt]# cd ./kafka_2.12-2.3.0/
[root@es83 kafka_2.12-2.3.0]# cat > ./config/zookeeper.properties <<EOF
dataDir=/opt/zookeeper
clientPort=2181
maxClientCnxns=0
tickTime=2000
initLimit=10
syncLimit=5
server.1=192.168.100.83:2888:3888
server.2=192.168.100.86:2888:3888
server.3=192.168.100.87:2888:3888

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
4lw.commands.whitelist=
EOF

echo "##### 创建zookeeper数据目录和对应的myid文件 #####"
[root@es83 kafka_2.12-2.3.0]# mkdir /opt/zookeeper
[root@es83 kafka_2.12-2.3.0]# echo 1 > /opt/zookeeper/myid

echo "##### 修改kafka配置文件 #####"
[root@es83 kafka_2.12-2.3.0]# cat > ./config/server.properties <<EOF
broker.id=83
listeners=SASL_PLAINTEXT://192.168.100.83:9092
advertised.listeners=SASL_PLAINTEXT://192.168.100.83:9092
num.network.threads=5
num.io.threads=8
socket.send.buffer.bytes=1024000
socket.receive.buffer.bytes=1024000
socket.request.max.bytes=1048576000
log.dirs=/logdata/kfkdata1,/logdata/kfkdata2,/logdata/kfkdata3,/logdata/kfkdata4,/logdata/kfkdata5
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=72
log.segment.delete.delay.ms=1000
log.cleaner.enable=true
log.cleanup.policy=delete
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.100.83:2181,192.168.100.86:2181,192.168.100.87:2181
zookeeper.connection.timeout.ms=60000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true

security.inter.broker.protocol=SASL_PLAINTEXT  
sasl.enabled.mechanisms=PLAIN  
sasl.mechanism.inter.broker.protocol=PLAIN  
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=true
super.users=User:admin;User:kafka
EOF

echo "##### 创建zk和kafka的sasl jaas文件 #####"
[root@es83 kafka_2.12-2.3.0]# cat > ./config/zk_server_jaas.conf <<EOF
Server {
    org.apache.kafka.common.security.plain.PlainLoginModule required 
    username="admin" 
    password="chilu@rljie" 
    user_kafka="chilu@rljie" 
    user_producer="chilu@rljie";
};
EOF

[root@es83 kafka_2.12-2.3.0]# cat > ./config/kafka_server_jaas.conf <<EOF
KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="chilu@rljie"
  user_admin="chilu@rljie"
  user_producer="chilu@rljie"
  user_consumer="chilu@rljie";
};

KafkaClient {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="kafka"
  password="chilu@rljie";
};

Client {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="kafka"
  password="chilu@rljie";
};
EOF

echo "##### 修改zk和kafka的启动文件(增加SASL的环境配置) #####"
[root@es83 kafka_2.12-2.3.0]# sed -i -e 's/512M/4G/g' -e 's#Xms4G#Xms4G -Djava.security.auth.login.config=/opt/kafka_2.12-2.3.0/config/zk_server_jaas.conf#' ./bin/zookeeper-server-start.sh
[root@es83 kafka_2.12-2.3.0]# sed -i -e 's/1G/31G/g' -e 's#Xms31G#Xms31G -Djava.security.auth.login.config=/opt/kafka_2.12-2.3.0/config/kafka_server_jaas.conf#' ./bin/kafka-server-start.sh

echo "##### 将相关目录复制到其他两台节点上,并进行修改 #####"
[root@es83 kafka_2.12-2.3.0]# cd ../
[root@es83 opt]# scp -r ./zookeeper ./kafka_2.12-2.3.0 192.168.100.86:/opt/
[root@es83 opt]# scp -r ./zookeeper ./kafka_2.12-2.3.0 192.168.100.87:/opt/
[root@es83 opt]# ssh 192.168.100.86 "echo 2 > /opt/zookeeper/myid ; sed -i '1,3s/83/86/' /opt/kafka_2.12-2.3.0/config/server.properties"
[root@es83 opt]# ssh 192.168.100.87 "echo 3 > /opt/zookeeper/myid ; sed -i '1,3s/83/87/' /opt/kafka_2.12-2.3.0/config/server.properties"

echo "##### 后台启动zookeeper服务 #####"
[root@es83 opt]# cd ./kafka_2.12-2.3.0/
[root@es83 kafka_2.12-2.3.0]# ./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties
[root@es83 kafka_2.12-2.3.0]# ssh 192.168.100.86 "/opt/kafka_2.12-2.3.0/bin/zookeeper-server-start.sh -daemon /opt/kafka_2.12-2.3.0/config/zookeeper.properties"
[root@es83 kafka_2.12-2.3.0]# ssh 192.168.100.87 "/opt/kafka_2.12-2.3.0/bin/zookeeper-server-start.sh -daemon /opt/kafka_2.12-2.3.0/config/zookeeper.properties"

echo "##### 后台启动kafka服务 #####"
[root@es83 kafka_2.12-2.3.0]# ./bin/kafka-server-start.sh -daemon ./config/server.properties
[root@es83 kafka_2.12-2.3.0]# ssh 192.168.100.86 "/opt/kafka_2.12-2.3.0/bin/kafka-server-start.sh -daemon /opt/kafka_2.12-2.3.0/config/server.properties"
[root@es83 kafka_2.12-2.3.0]# ssh 192.168.100.87 "/opt/kafka_2.12-2.3.0/bin/kafka-server-start.sh -daemon /opt/kafka_2.12-2.3.0/config/server.properties"

当zk和kafka服务都启动后,可以先检查下相关端口状态是否正常

[root@es83 kafka_2.12-2.3.0]# netstat -antlp | grep -E "2888|3888|2181|9092"

当集群服务一切正常后,即可在其中一台kafka节点上配置ACL访问控制权限,对生产者producer和消费者consumer的主题topic和组group设置访问权限,可以限制只允许指定的机器访问。

提示:下面的mykafka是通过/etc/hosts自定义一个IP的域名,例如:192.168.100.83 mykafka;如果写成localhost可能没有权限,执行命令后会报NoAuth;如果写成IP地址会报CONNECT !!!

echo "##### 编写配置ACL访问权限脚本 #####"
[root@es83 kafka_2.12-2.3.0]# cat > ./kfkacls.sh <<EOF
#!/bin/bash
/opt/kafka_2.12-2.3.0/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=mykafka:2181 --add --allow-principal User:producer --allow-host 0.0.0.0 --operation Read --operation Write --topic elk
/opt/kafka_2.12-2.3.0/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=mykafka:2181 --add --allow-principal User:producer --topic elk --producer --group chilu
/opt/kafka_2.12-2.3.0/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=mykafka:2181 --add --allow-principal User:consumer --allow-host 0.0.0.0 --operation Read --operation Write --topic elk
/opt/kafka_2.12-2.3.0/bin/kafka-acls.sh --authorizer-properties zookeeper.connect=mykafka:2181 --add --allow-principal User:consumer --topic elk --consumer --group chilu
EOF

echo "##### 执行脚本 #####"
[root@es83 kafka_2.12-2.3.0]# bash ./kfkacls.sh

echo "##### 查看ACL权限列表 #####"
[root@es83 kafka_2.12-2.3.0]# ./bin/kafka-acls.sh --authorizer-properties zookeeper.connect=mykafka:2181 --list

# 提示:下面是交互式的命令配置
echo "##### 增加ACL访问权限 #####"
[root@es83 kafka_2.12-2.3.0]# ./bin/zookeeper-shell.sh mykafka:2181
Welcome to ZooKeeper!
JLine support is disabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

此时可以直接在这个控制台输入命令
如ls / 查看ZK的目录 

检查默认权限
getAcl /

默认所有人可以查看
添加权限命令为:(仅添加kafka主机的IP)
setAcl / ip:192.168.100.83:cdrwa,ip:192.168.100.86:cdrwa,ip:192.168.100.87:cdrwa
setAcl /kafka-acl ip:192.168.100.83:cdrwa,ip:192.168.100.86:cdrwa,ip:192.168.100.87:cdrwa

检查是否生效
getAcl /   
输出:
'ip,'192.168.100.83
: cdrwa
'ip,'192.168.100.86
: cdrwa
'ip,'192.168.100.87
: cdrwa

退出
quit

06Logstash服务部署

Logstash 是免费且开放的服务器端数据处理管道,采用的是可插拔框架,拥有200多个插件,支持各种输入和输出选择,能够实时解析和转换数据,具有可伸缩性、弹性和灵活性;但是它比较消耗资源,运行时占用较高的CPU和内存,如果缺少消息队列缓存,会有数据丢失的隐患,所以小伙伴们要结合自身情况来使用!

笔者在生产环境上,也为Logstash分配了30G内存,关于硬件配置大家根据实际情况来分配使用!

# 下载方式:wget https://artifacts.elastic.co/downloads/logstash/logstash-7.2.0.tar.gz
echo "##### 解压Logstash #####"
[root@es83 ~]# cd /home/elkuser/
[root@es83 elkuser]# tar -xvf ./logstash-7.2.0.tar.gz

echo "##### 修改启动内存 #####"
[root@es83 elkuser]# cd ./logstash-7.2.0/
[root@es83 logstash-7.2.0]# sed -i -e 's/1g/30g/g' ./config/jvm.options

echo "##### 复制相关所需证书到logstash目录下 #####"
[root@es83 elkuser]# cd ./logstash-7.2.0/config/
[root@es83 config]# cp /home/elkuser/elasticsearch-7.2.0/root.pem ./

echo "##### 修改logstash配置文件 #####"
[root@es83 config]# cat > ./logstash.yml <<EOF
http.host: "192.168.100.83"
node.name: "logstash83"
xpack.monitoring.elasticsearch.hosts: [ "https://192.168.100.83:9200" ]
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "NvOBRGpUE3DoaSbYaUp3"
xpack.monitoring.elasticsearch.ssl.certificate_authority: config/root.pem
xpack.monitoring.elasticsearch.ssl.verification_mode: certificate
xpack.monitoring.collection.interval: 30s
xpack.monitoring.collection.pipeline.details.enabled: true
EOF

# 提示:配置的用户名和密码要跟kafka配置的一致!
echo "##### 配置接入kafka的客户端文件 #####"
[root@es83 config]# cat > ./kafka-client-jaas.conf <<EOF
KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="consumer"
    password="chilu@rljie";
};
EOF

echo "##### input和ouput的配置示例 #####"
[root@es83 config]# cat > ./test.cfg <<EOF
input {
    kafka {
       bootstrap_servers => "192.168.100.83:9092,192.168.100.86:9092,192.168.100.87:9092"
       client_id => "chilu83"
       auto_offset_reset => "latest"
       topics => "elk"
       group_id => "chilu"
       security_protocol => "SASL_PLAINTEXT"
       sasl_mechanism => "PLAIN"
       jaas_path => "/home/elkuser/logstash-7.2.0/config/kafka-client-jaas.conf"
    }
}

filter {
}

output {
    elasticsearch {
        hosts => ["192.168.4.1:9200","192.168.4.2:9200","192.168.4.3:9200"]
        user => "elastic"
        password => "NvOBRGpUE3DoaSbYaUp3"
        ssl => true
        cacert => "/home/elkuser/logstash-7.2.0/config/root.pem"
        index => "chilu_elk%{+YYYY.MM.dd}"
    }
}
EOF

echo "##### 启动logstash服务 #####"
[root@es83 config]# ../bin/logstash -r -f ./test.cfg

07Kibana服务部署

Kibana 是一个开源的分析和可视化平台,可以为Logstash和ElasticSearch提供的日志数据进行高效的搜索、可视化汇总和多维度分析,并且与Elasticsearch索引中的数据进行交互;它基于浏览器的界面操作可以快速创建动态仪表板,实时监控ElasticSearch的数据状态与更改等。

笔者在生产环境上,为Kibana分配了8G内存,关于硬件配置大家根据实际情况来分配使用!

# 下载方式:wget https://artifacts.elastic.co/downloads/kibana/kibana-7.2.0-linux-x86_64.tar.gz
echo "##### 解压Kibana #####"
[root@es83 ~]# cd /home/elkuser/
[root@es83 elkuser]# tar -xvf kibana-7.2.0-linux-x86_64.tar.gz

echo "##### 修改启动内存 #####"
[root@es83 elkuser]# cd ./kibana-7.2.0-linux-x86_64/
[root@es83 kibana-7.2.0-linux-x86_64]# sed -i 's/warnings/warnings --max_old_space_size=8096/' ./bin/kibana

echo "##### 复制相关所需证书到kibana目录下 #####"
[root@es83 kibana-7.2.0-linux-x86_64]# cd ./config/
[root@es83 config]# cp /home/elkuser/elasticsearch-7.2.0/client.p12 ./

echo "##### 利用client.p12证书生成其他所需证书 #####"
[root@es83 config]# openssl pkcs12 -in client.p12 -nocerts -nodes > client.key
Enter Import Password: 回车Enter
MAC verified OK

[root@es83 config]# openssl pkcs12 -in client.p12 -clcerts -nokeys > client.cer
Enter Import Password: 回车Enter
MAC verified OK

[root@es83 config]# openssl pkcs12 -in client.p12 -cacerts -nokeys -chain > client-ca.cer
Enter Import Password: 回车Enter
MAC verified OK

echo "##### 升级kibana的web界面为https访问 #####"
[root@es83 config]# cd ../
[root@es83 kibana-7.2.0-linux-x86_64]# openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 -out server.crt -subj "/C=CN/ST=guangzhou/L=rljie/O=chilu/OU=linux/"

echo "##### 修改kibana的配置文件 #####"
[root@es83 kibana-7.2.0-linux-x86_64]# cat > ./config/kibana.yml <<EOF
server.name: kibana
server.host: "192.168.100.83"
elasticsearch.hosts: [ "https://192.168.100.83:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "NvOBRGpUE3DoaSbYaUp3"
xpack.security.enabled: true
elasticsearch.ssl.certificateAuthorities: config/client-ca.cer
elasticsearch.ssl.verificationMode: certificate
xpack.security.encryptionKey: "4297f44b13955235245b2497399d7a93"
xpack.reporting.encryptionKey: "4297f44b13955235245b2497399d7a93"
server.ssl.enabled: true
server.ssl.certificate: server.crt
server.ssl.key: server.key
EOF

echo "##### nohup后台启动kibana服务(自行选择后台方式) #####"
[root@es83 kibana-7.2.0-linux-x86_64]# nohup ./bin/kibana --allow-root &

完成以上操作后,可使用浏览器访问kibana地址https://192.168.100.83,输入elastic用户密码即可!

在这里插入图片描述

curl 示例

curl --tlsv1 -XGET 'https://192.168.100.83:9200/_cluster/health?pretty' --cacert '/home/elkuser/elasticsearch-7.2.0/root.pem' --user elastic:NvOBRGpUE3DoaSbYaUp3

08Filebeat服务部署

Filebeat 是一个用于转发和集中日志数据的轻量级采集器,基于go语言开发,性能稳定,配置简单,占用资源很少;它作为agent安装在服务器上,可以监控你指定的日志文件或位置,收集日志事件,并将其转发到配置的输出;主要通过探测器prospector和收集器harvester组件完成工作。

# 下载方式:wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.2.0-linux-x86_64.tar.gz
echo "##### 解压Filebeat #####"
[root@es83 ~]# cd /home/elkuser/
[root@es83 elkuser]# tar -xvf filebeat-7.2.0-linux-x86_64.tar.gz

echo "##### 修改filebeat配置文件 #####"
[root@es83 elkuser]# cd ./filebeat-7.2.0-linux-x86_64/
[root@es83 filebeat-7.2.0-linux-x86_64]# cat > ./filebeat.yml <<\EOF
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/access.log
  close_timeout: 1h
  clean_inactive: 3h
  ignore_older: 2h

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true

setup.template.settings:
  index.number_of_shards: 3

setup.kibana:

output.kafka:
  hosts: ["192.168.100.83:9092","192.168.100.86:9092","192.168.100.87:9092"]
  topic: elk
  required_acks: 1
  username: "producer"
  password: "chilu@rljie"
EOF

echo "##### nohup后台启动filebeat服务 #####"
[root@es83 filebeat-7.2.0-linux-x86_64]# nohup ./filebeat -e -c filebeat.yml &

参考链接 :
Filebeat+Kafka+ELK生产部署(安全加固) :https://mp.weixin.qq.com/s/sJJYgzN6y5L5DBAQOvUq3A

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CentOS 7.2下Filebeat+Kafka+ELK生产部署(安全加固) 的相关文章

  • 启用 mod_http2 并在conf文件中设置协议后,HTTP/2配置未运行[重复]

    这个问题在这里已经有答案了 在看似正确的安装之后 HTTP 2 似乎并未运行 我运行的是 CentOS 7 我安装了最新版本的 Apache 版本 httpd 2 4 35 5 el7 x86 64 并一直在尝试让 HTTP 2 正常工作
  • 未找到 jmap 命令

    我正在尝试使用jmap对我的命令CentOS服务器 但它一直告诉我 即使我安装了 JDK 也找不到该命令 这是命令的输出java version java version 1 7 0 25 OpenJDK Runtime Environme
  • 在centos 6.4上安装numpy&scipy

    我在虚拟环境中工作 安装 numpy 和 scipy 时遇到问题 据我了解 在使用 scipy 之前我必须完全安装 numpy 但是我在安装 numpy 时遇到了问题 I usedpip install numpy并将 numpy 安装到我
  • 在我的 CentOS 机器上找不到wireshark init.lua

    所以我试图在我的 CentOS 7 服务器上获取一个与 tshark 一起使用的脚本 但我遇到了问题 该脚本在我的Windows笔记本电脑上运行良好 我只是将其放在appdata的plugins文件夹中 但我在linux上找不到类似的位置
  • phpMyAdmin + CentOS 6.0 - 禁止

    当我想访问我的 phpMyAdmin 时 我总是收到此消息 w3m localhost phpmyadmin Forbidden You don t have permission to access phpmyadmin on this
  • Errr 'mongo.js:L112 错误:无法连接到位于 src/mongo/shell/mongo.js:L112 的服务器 127.0.0.1:27017'

    我无法连接到MongoDB http en wikipedia org wiki MongoDB 在 Ubuntu 中它可以工作 但我正在工作CentOS http en wikipedia org wiki CentOS现在 这是错误消息
  • 在Linux中使用自定义规则在多个端口上运行的SSH服务[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在努力设置一台在多个端口上运行 SSH 服务的服务器 例如端口 22 和 5522 这些端口应该具有一组不同的规则 即 我们为端口 2
  • PHP 5.3.8 上的 Mime 类型检测失败并显示 fileinfo

    我在 CentOS 服务器上安装了 PHP 5 3 8 时 无法使用 fileinfo 检测简单 PNG 文件的 mime 类型 问题 基本上 如果我有以下代码 如您所见 该文件是 PNG 图像 文件的头字节已被检查并
  • 将 awk 输出保存到变量 [重复]

    这个问题在这里已经有答案了 谁能帮我解决这个问题吗 我正在尝试将 awk 输出保存到变量中 variable ps ef grep port 10 grep v grep port 10 awk printf s 12 printf var
  • 从现有虚拟机创建 docker 镜像

    我需要使用 CentOS 和 MySQL 创建 docker 基础镜像 但我已经有这样的虚拟机 没有docker 如何从现有的虚拟机创建基础 docker 镜像并在另一台带有 docker 的机器上使用它 虽然其他评论者正确地指出 将虚拟机
  • 在哪里可以找到 PHP 的错误日志文件?

    在哪里可以找到错误日志文件 我需要检查它们以解决安装后显示的内部服务器错误suPHP https wiki archlinux org title SuPHP 您可以使用lsof https en wikipedia org wiki Ls
  • 如何找出apache上次重启的时间? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个 VPSkloxo控制面板已安装 我在用CentOS 5 8 32 bit 我今天重新启动了 Apache 但忘记了启动时间 知道确切的时间非
  • MariaDB 10 CentOS 7 移动数据目录的问题

    CentOS 7 和 MariaDB 10 的全新 最小 安装 我有一个额外安装的镜像卷 我想将其用于数据目录 当 my cnf mysqld 被注释掉时 启动顺序正常并正常完成 我已经复制了数据 sudo cp R p var lib m
  • PCRE 库版本太旧

    Bug Genie 3 需要 PCRE 库 8 0 或更高版本 你有 版本 7 8 2008 09 05 将您的系统更新到最新版本 你常用的来源 在我查看问题并尝试通过以下步骤更新我的 PCRE 库后 wget the latest sou
  • 套接字错误 10054

    我有一个C S程序 客户端使用socket向服务器发送文件 发送后大约超过700k数据 客户端 在win7上 将收到套接字10054错误 这意味着连接被对等方重置 服务器运行在CentOS 5 4上 客户端是在virtual box中运行的
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • 如何使用缓存快速重建dockerfile?

    我想优化我的 Dockerfile 我希望将缓存文件保留在磁盘中 但是 当我跑步的时候我发现docker build 它总是尝试从网络获取每个文件 我希望在构建期间共享我的缓存目录 例如 var cache yum x86 64 6 但是
  • 检查没有 .svn 文件的 svn 存储库

    我的专用服务器 Centos 5 5 上有一个 svn 存储库 位于 var svn myRepository 我只想将这些文件复制到我的生产文件夹 var www myWebapp 中 据我了解 SVN 我只能在本地项目文件夹上使用 sv
  • 错误:无法下载存储库“appstream”的元数据:无法准备内部镜像列表:镜像列表中没有 URL

    我正在尝试使用我在 Dockerfile 中指定的 centOs 上的 yum 下载 java 拉取 centOs 镜像后 运行崩溃并抛出此错误 还要提一下 我的服务器实例是AWS EC2 Step 2 9 RUN yum install
  • 如何在 Centos 6.5 上安装 MonetDB?

    我想在 Centos 6 5 上安装 MonetDB MonetDB 网站介绍了如何安装 Debian Ubuntu Fedora 发行版 我有一台 Centos 6 5 上的服务器 我不完全确定应该与哪个 Fedora 发行版进行比较 显

随机推荐

  • Python——解决小球从100米高度自由落下再反弹问题

    题目 一小球从100米高度自由落下 每次落地后反跳回原高度的一半 再落下 求它在 第10次落地时 共经过多少米 第10次反弹多高 需要在提交界面中运行结果 输出格式 小球一共经过了299 61米 第10次的高度0 20米 代码 h 100
  • 2023美赛ABCDEF各赛题思路浅析

    2023美赛 MCM ICM 如期开赛 为了尽早的帮大家确定选题 这里我们加急为大家编辑出2023美赛 MCM ICM 赛题浅评 方便大家快速对各个题目的难度有个大致的了解 同时 我们也给出了各个题目简要的解题思路 以及该问题在实际解决中可
  • 通俗易懂说单链表(2)链表/环长度、有环,环入口

    通俗易懂说单链表 2 链表 环长度 有环 环入口 1 单链表长度 2 单链表是否有环 2 1 思想 2 2 代码实现 3 单链表环入口 3 1 思想 3 1 1 证明 3 2 代码实现 4 单链表环长度 4 1 思想 4 2 代码实现 5
  • android open gl es error:"called unimplemented OpenGL ES API";

    libEGL called unimplemented OpenGL ES API 1 导致这个问题的原因是manifest中申请的gles版本
  • C++ primer Plus(第六版)第二章 开始学习C++ 章节编程练习答案

    1 编写一个C 程序 它显示您的姓名和地址 完成如下 2 编写一个C 程序 它要求用户输入一个以long为单位的距离 然后将它转化为码 一long为220码 完成如下 3 编写一个C 程序 它使用3个用户定义的函数 包括main 并生成下面
  • 使用SourceTree将本地项目推送至GitLab

    背景 正常一般是先在 GitLab 上建好项目 然后再通过 SourceTree 克隆到本地 但有时候忘记了 直接在本地新建了项目 这个时候想把本地项目也放到 GitLab 上托管 步骤 1 在GitLab上新建一个项目 添加一个READM
  • 前端页面适配之postcss-px-to-viewport

    一 简介 postcss px to viewport 是一个 PostCSS 插件 用于将 CSS 中的 px 单位转换为 vw 或 vh 单位 它可以帮助我们实现在不同屏幕尺寸下的自适应布局 以提高页面的响应性和可用性 二 postcs
  • keil遇到FCARM - Output Name not specified, please check 'Options for Target - Utilities'解决方法

    近期又开始复活学ARM 结果以前很容易就编译通过的事竟然出现意外 提示 FCARM Output Name not specified please check Options for Target Utilities 原因是加载文件时为了
  • Netty的客户端使用Socks5代理,netty-handler-proxy源码浅析

    目录 前言 使用 源码浅析 版本 目录结构 ProxyHandler Socks5ProxyHandler socks5代理服务 待续 前言 需求的出发点是这样 一个netty代理服务 里面有netty服务端 ServerBootstrap
  • 通用路由封装协议--GRE的简单配置

    基于华为设备简单配置GRE GRE 通用路由封装协议 一 GRE是什么 二 GRE有什么用 1 多协议本地网可以通过GRE隧道传输 2 与IPSec结合 保护组播数据 三 GRE怎么用 1 隧道接口 Tunnel接口 2 配置 参考 GRE
  • SpringBoot默认的8080端口在哪?

    配置文件中 点击port 进入到ServerProperties类 ServerProperties这个类中 读取配置文件server开头的配置 定位类文件所在位置 找到对应jar包的META INF下的json文件 端口默认值在json文
  • Spring最佳实践: 构建高效可维护的Java应用程序

    博主猫头虎 带您 Go to New World 博客首页 猫头虎的博客 面试题大全专栏 文章图文并茂 生动形象 简单易学 欢迎大家来踩踩 IDEA开发秘籍专栏 学会IDEA常用操作 工作效率翻倍 100天精通Golang 基础入门篇 学会
  • Spring 基础概念和核心思想

    目录 一 Spring 是什么 1 认识 loC 2 理解 Spring loC 3 DI 概念说明 一 Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework Spring 框架 它是 个开源框架 有
  • 【廖雪峰python入门笔记】变量

    1 静态语言和动态语言中的变量表示 静态语言在定义变量时必须指定变量类型 如果赋值的时候类型不匹配 就会报错 例如Java是静态语言 赋值语句如下 int a 123 a是整数类型变量 a mooc 错误 不能把字符串赋给整型变量 和静态语
  • json-c编译及修改libjson.so动态库名称

    1 git clone https github com json c json c git 功能 获取源码 2 cd json c 功能 进入目录 3 autogen sh 功能 生成configure ac 再生成configure配置
  • 栅栏密码(Fence)——python解密

    简介 所谓栅栏密码 就是把要加密的明文分成N个一组 然后把每组的第1个字连起来 形成一段无规律的话 不过栅栏密码本身有一个潜规则 就是组成栅栏的字母一般不会太多 一般不超过30个 也就是一 两句话 实现 一般比较常见的是2栏的栅栏密码 比如
  • 算法训练营第三十九天(8.30)

    Leecode 123 买卖股票的最佳时机 III 123 买卖股票的最佳时机III 123 买卖股票的最佳时机III 题目地址 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 题目类型 股票问题 class Solution p
  • 前端页面边距设置

    内边距 padding 边框到内容区的距离 padding top 上内边距 padding right 右内边距 padding bottom 下内边距 padding left 左内边距 也可以使用padding设置四个方向的值 pad
  • 现阶段游戏类型

    了解游戏类型 每一个游戏类型下所诞生的游戏产品侧重点略有不同 了解游戏类型并找到属于自己的产品定位 可以在后面的技术定位和实际开发时不至于走许多弯路 更重要的是 当所有参与开发的人员对产品的主要方向已经有了明确的概念时 产品所针对的用户群体
  • CentOS 7.2下Filebeat+Kafka+ELK生产部署(安全加固)

    01架构说明 在需要采集日志的服务器上部署Filebeat服务 它将采集到的日志数据推送到Kafka集群 Logstash服务通过input插件读取Kafka集群对应主题的数据 期间可以使用filter插 数据做自定义过滤解析处理 然后通过