Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save edwardtoday/d8e7f9a851c35bb34c370cb4addebbb5 to your computer and use it in GitHub Desktop.
Save edwardtoday/d8e7f9a851c35bb34c370cb4addebbb5 to your computer and use it in GitHub Desktop.
Ubuntu 16.04 系统下 ELK 5.6 版本日志检测系统搭建与维护

Ubuntu16.04系统下ELK5.6版本日志检测系统搭建与维护

1. Elasticsearch安装与配置

1.1 Elasticsearch安装

安装JAVA JDK:

	sudo apt-get update

	sudo apt-get install openjdk-8-jdk

编辑/etc/profile,在文件尾添加java环境变量:

	export JAVA\_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre/bin"

下载并安装公共签名密钥:

	wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add –

安装apt-transport-https包,以便于从deb下载之后的安装包:

	sudo apt-get install apt-transport-https

添加Elasticsearch deb安装包至下载列表:

	echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

下载并安装Elasticsearch:

	sudo apt-get update && sudo apt-get install elasticsearch

1.2 Elasticsearch自启动与运行

####自启动:

	sudo systemctl daemon-reload \#一旦修改文件,重新加载配置

	sudo systemctl enable elasticsearch.service \#开机自启动

####运行:

	sudo systemctl start elasticsearch.service \#开启服务

	sudo systemctl stop elasticsearch.service \#停止服务

	sudo systemctl restart elasticsearch.service \#重启服务

官方网址: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/deb.html

2. Kibana安装与配置

2.1 Kibana安装

添加Kibana deb安装包至下载列表:

	echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

下载并安装Kibana:

	sudo apt-get update && sudo apt-get install kibana

2.2 Kibana自启动与运行

与Elasticsearch完全一致,将服务名换成kibana.server即可

官方文档: https://www.elastic.co/guide/en/kibana/5.6/deb.html

3. Logstash安装与配置

3.1 Logstash安装

添加logstash deb安装包至下载列表:

	echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list*

下载并安装logstash:

	sudo apt-get update && sudo apt-get install logstash

Logstash配置文件

进入/etc/logstash/conf.d目录,新建logstash-configure.conf 可用以下配置为参考

input {
        beats {
                port => 5000
                ssl => true
                ssl_certificate_authorities => ["/etc/pki/tls/elk-logstash-ssl/filebeat.crt"]
                ssl_certificate => "/etc/pki/tls/elk-logstash-ssl/logstash-forwarder.crt"
                ssl_key => "/etc/pki/tls/elk-logstash-ssl/logstash-forwarder.key"
                ssl_verify_mode => "force_peer"
                tls_min_version => 1.2
         }

        file {
                type => "stellar_server"
                path => ["/usr/ELK/logdata/stellar_server_log"]
                codec => json {
                        charset => "UTF-8"
                }
        }
        file {
                type => "LED_control"
                path => ["/usr/ELK/logdata/LED_control_log"]
        }
        file {
                type => "stariver_api"
                path => ["/usr/ELK/logdata/stariver_api_log"]
                codec => json {
                        charset => "UTF-8"
                }
        }
        file {
                type => "stellar_alexa"
                path => ["/usr/stellar_alexa_log"]
        }

        file {
                type => "test_LED_control"
                path => ["/usr/ELK/logdata/test202.11.4.67"]
        }


}


filter{

        if [type] == "stariver_api" {
                date {
                        match => ["time", "ISO8601", "UNIX"]
                        target => "@timestamp"
                        locale => "cn"
                }

        }

        else if [type] == "stellar_alexa" {
                grok {
                        match => {"message" => "%{DATESTAMP:time} %{DATA:uuid} %{DATA:build_id} %{USERNAME:amazon_id} %{WORD:ctrl_name} %{DATA:ctrl_value} %{WORD:online_or_not} %{WORD:done_or_error} %{BASE10NUM:time_cost}"}
		}
                 mutate {
                        convert => ["time_cost", "float"]
                }
                date {
                        match => ["time", "yy-MM-dd HH:mm:ss", "UNIX"]
                        target => "@timestamp"
                        locale => "cn"
                }
        }


        else if [type] == "stellar_server" {
                date {
                        match => ["time", "yyyy-MM-dd HH:mm:ss", "UNIX"]
                        target => "@timestamp"
                        locale => "cn"
                }

        }

        else if [type] == "LED_control" {
                grok {
                        match => {"message" => "%{DATESTAMP:time}\s+%{WORD:degree}:\s+%{GREEDYDATA:information}"}
                }
                date {
                        match => ["time", "yy-MM-dd HH:mm:ss.SSSSSS", "UNIX"]
                        target => "@timestamp"
                        locale => "cn"
                }
        }


}

output {
        elasticsearch {
                hosts => [ "127.0.0.1:9200" ]
                index => "test_system_log"
                user => logstash
                password =>logstash
                ssl => true
                ssl_certificate_verification => true
                truststore => "/usr/share/logstash/cert/truststore.jks"
                truststore_password => changeit
        }

        # stdout {
        #
        #       codec => rubydebug
        # }
}

生成SSL证书

(1)通过IP生成SSL证书:

	sudo vim /etc/ssl/openssl.cnf

修改subjectAltName = IP: ELK_server_IP字段,把ELK_server_IP替换为ELK服务器的ip地址。

	sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch \

	-nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out \

	certs/logstash-forwarder.crt

(2)通过域名生成SSL证书:

	sudo openssl req -subj '/CN=ELK\_server\_domain/' -x509 -days 3650 \

	-batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key \

	-out certs/logstash-forwarder.crt

把ELK_server_domain替换为域名

生成完成后,把logstash-forwarder.crt复制到要给ELK发送日志的服务器上。

3.2 Logstash自启动与运行

与Elasticsearch完全一致,将服务名换成logstash.server即可

官方网址: https://www.elastic.co/guide/en/logstash/5.6/installing-logstash.html

备注:通过deb形式所安装软件的位置如下

a. 下载的软件包存放位置 /var/cache/apt/archives

b. 安装后软件默认位置 /usr/share

c. 可执行文件位置 /usr/bin

d. 配置文件位置 /etc

e. 库lib文件位置 /usr/lib

4. Es数据迁移

使用ElasticDump可以实现ES引索数据和映射关系的迁移。

官方网址:https://github.com/taskrabbit/elasticsearch-dump

4.1 Elasticdump安装

安装npm

	sudo apt-get install npm

安装Elasticdump

	npm install elasticdump –g elasticdump

4.2 Elasticdump基本使用

	elasticdump \

	--input=http://production.es.com:9200/my\_index \

	--output=http://staging.es.com:9200/my\_index \

	--type=mapping

将my_index替换成引索名,目前为test_system_log

上述过程转移映射关系,很快完成

	elasticdump \

	--input=http://production.es.com:9200/my\_index \

	--output=http://staging.es.com:9200/my\_index \

	--type=data

将my_index替换成引索名,目前为test_system_log

上述过程转移数据,由数据量大小决定与带宽完成时间

5. HTTPS安全访问Kibana

采用letsencrypt生成https证书,并在kibana.yml进行配置

5.1 安装certbort

	sudo apt-get update

	sudo apt-get install software-properties-common

	sudo add-apt-repository ppa:certbot/certbot

	sudo apt-get update

	sudo apt-get install certbot

5.2 生成证书

	sudo certbot certonly --webroot -w /etc/letsencrypt/live/elk.sansi.io -d elk.sansi.io

其中-w参数后为证书存放位置, -d 为域名

/etc/letsencrypt/live/elk.sansi.io将会有4个文件:

privkey.pem 为私钥

fullchan.pem 为CA证书

chain.pem供nginx使用 (本次无需使用)

cert.pem (不建议使用)

通过certbot renew可更新证书

由于文件夹访问权限问题。Kibana不可访问/etc/letsencrypt/live/elk.sansi.io/

因此将其中的证书复制至/usr/share/kibana/certs目录下,目前上述操作已写成脚本,放在/root目录下,名为renew-kibana-certs.sh

	certbot renew

	cp -f /etc/letsencrypt/live/elk.sansi.io/fullchain.pem /usr/share/kibana/certs

	cp -f /etc/letsencrypt/live/elk.sansi.io/privkey.pem /usr/share/kibana/certs

通过crontab 每3小时更新一次(证书期限为90天,此脚本为为了防止证书忘记续签而设置)

5.3 kibana.yml配置

在/etc/kibana/kibana.yml中添加一下字段,以启用证书

	server.ssl.enabled: true

	server.ssl.certificate: /usr/share/kibana/certs/fullchain.pem

	server.ssl.key: /usr/share/kibana/certs/privkey.pem

6. Search-guard安装与配置

官方文档V5版本:http://docs.search-guard.com/v5/index

6.1Elasticsearch Search-guard安装

停止elasticsearch进程

	service elasticsearch stop

进入elasticsearch目录

	cd /usr/share/elasticsearch

执行安装命令:

	bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:6.5.0-18

此处以本elasticsearch5.6.5版本为例,不同版本所需安装的searchguard不同,请查询: https://github.com/floragunncom/search-guard/wiki

进入tools目录

	/usr/share/elasticsearch /plugins/search-guard-5/tools目录,

执行配置程序

	/install\_demo\_configuration.sh

如果没有执行权限

	chmod +x install\_demo\_configuration.sh

完成后会在/etc/elasticsearch下生成三个文件 分别为:

truststore.jks CA证书

keystore 私钥

Kirk.jks 运行配置文件的证书

其中truststore和keystore密码默认为changeit

可通过在elasticsearch.yml添加一下字段修改命令

	searchguard.ssl.transport.keystore_password

	searchguard.ssl.transport.truststore_password

开启elasticsearch服务

	service elasticsearch start

进入tools目录

	cd /usr/share/elasticsearch /plugins/search-guard-5/tools

执行demo程序

	./sgadmin_demo.sh

没有执行权限则先执行

	chmod +x sgadmin_demo.sh

完成后,已载入基本配置

注:searchguard配置为热修改,即不需要停止elasticsearch服务,修改完/usr/share/elasticsearch/plugins/search-guard-5/sgconfig 下的配置文件后,再次执行/usr/share/elasticsearch/plugins/search-guard-5/tools/sgadmin_demo.sh 即可

完成安装后测试

	curl --insecure -u admin:admin 'https://localhost:9200/\_searchguard/authinfo?pretty'

如果返回json格式的admin用户信息 则安装配置成功

6.2 Elasticsearch Search-guard配置说明

所有配置文件都在/usr/share/elasticsearch /plugins/search-guard-5/sgconfig目录下,共计六个文件

elasticsearch.yml.exampleelastcsearch.yml示例,无用

sg\_config.yml 安装配置文件(无需修改)

sg\_roles.mapping.yml 定义每个用户所在的职能组

sg\_roles.yml 定义每个职能组所拥有的权限

sg\_action\_groups.yml 定义权限包括哪些及其名称

sg\_internal\_users.yml 定义用户及其密码

密码可通过tool/hash.sh生成 指令为:

	./hash.sh –p 明文密码

6.3 Kibana Search-guard安装与配置说明

停止kibana service

	service kibana stop

进入kibana目录

	/usr/share/kibana

执行安装程序

	bin/kibana-plugin install file:///path/to/search-guard-kibana-plugin-version.zip

插件下载地址:(6.X版本官网上保存,5.X版本都保存在github上)

https://github.com/floragunncom/search-guard-kibana-plugin/releases

在/etc/kibana/kibana.yml中添加用户名与密码:

	elasticsearch.username: "kibanaserver"

	elasticsearch.password: "kibanaserver"

该用户名与密码为searchguard中默认配置,可在sgconfig/sg_internal_users.yml文件中修改,用于Kibana与Elasticsearch通讯

由于elasticsearch开启了SSL,所以修改目标url:

	elasticsearch.url:https://localhost:9200

如果没有配置CA认证:

	elasticsearch.ssl.verificationMode: none

如果配置了CA认证:

	elasticsearch.ssl.verificationMode: true

	elasticsearch.ssl.ca: "/path/to/your/root-ca.pem"

开启kibana服务,完成配置工作

	service kibana start

6.4 logstash Search-guard配置说明

Logstash无需安装插件,只需在/etc/logstash/conf.d/first-piple.conf下添加一下字段:(logstash为默认用户)

output {
    elasticsearch {
       user => logstash
       password => logstash
       ssl => true
       ssl_certificate_verification => true
       truststore => "/etc/logstash /truststore.jks"
       truststore_password => changeit
    }
}

Logstash5.6.5版本中 还需要给默认的logstash:logstash用户添加data/write/bulk*权限,修改sgconfig/sg_roles.yml

sg_logstash:
  cluster:
    - indices:admin/template/get
    - indices:admin/template/put
    - indices:data/write/bulk*
    - CLUSTER_MONITOR
    - CLUSTER_COMPOSITE_OPS
  indices:
    '*':
      '*':
        - CRUD
        - CREATE_INDEX
    '*beat*':
      '*':
        - CRUD
        - CREATE_INDEX

重新载入配置,完成操作

7. 客户端filebeat配置安装

7.1 filebeat安装

以deb安装为例

	curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.6-amd64.deb

	sudo dpkg -i filebeat-5.6.6-amd64.deb

7.2 本地SSL自签名证书生成

linux下:

	openssl req -subj '/CN=127.0.0.1/' -x509 -days $((100 * 365)) -batch -nodes -newkey rsa:2048 -keyout \

	./filebeat.key -out ./filebeat.crt

其中将CN=127.0.0.1 换成服务器的IP地址 如CN=192.168.0.1 生成的.crt及.key文件在当前目录下

Windows下:

https://wiki.openssl.org/index.php/Binaries处下载openssl并安装

	openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

按提示一次输入信息 其中CN需要输入服务器 外网IP

7.3 filebeat配置文件

#====================Filebeat prospectors===================
filebeat.prospectors:
#input_type:默认log即可
- input_type: log
#path 监控的Log文件,可以多个,也可以一个文件夹下所有以.log类型结尾的文件
  paths:
    - /home/ec2-user/*.log
#document_type:传送到logstash的type类型,用以分类Log来源
  document_type: "stellar_alexa"
#如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,
#而不是从文件开始处重新发送所有内容
  tail_files: false

#=====================Outputs==========================
#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["198.58.124.6:5000"]
# ["elk.sansi.io:5000"]
# 域名和ip都可以使用 注意 这里使用的是5000端口
  bulk_max_size: 1024
  ssl.enabled: true
  ssl.certificate_authorities: ["/home/ec2-user/F/logstash-forwarder.crt"]
  ssl.certificate: "/home/ec2-user/F/filebeat.crt"
  ssl.key: "/home/ec2-user/F/filebeat.key"
  ssl.supported_protocols: [TLSv1.2]
# 与Logstash通讯双向SSL加密
# ssl.certificate_authorities填写logstash的crt
# ssl.certificate 和 ssl.key填写filebeat的crt和key

请注意,在window下 “/”符号需要转义 路径请使用“//” 如果自签名使用IP 则host使用IP,如果使用域名,Host使用域名,否则验证无法通过

7.4 filebeat启动

	sudo /etc/init.d/filebeat start

官方网站:[https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html](https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment