- 安装ELK
elasticsearch,logstash,kibana三个组件,直接下载rpm文件安装即可
- Logstash
logstash的配置由三部分组成 input,filter,output
分别是输入插件,过滤器插件,输出插件
配置都是依赖插件的使用,比如我们这里输入用了tcp插件,可以使用bin/logstash-pluginlist查看当前的插件列表(物理目录 vendor/bundle/jruby/1.9/gems/ 目录下)
使用bin/logtash-plugininstall 命令进行插件安装。
input输出插件:
logstash收集日志,可以是读取文件(file插件),socket传输(tcp插件,udp插件)等方式。
filter过滤器插件:
对内容进行过滤,比如日期格式化,json处理等等。例如:
filter {
grok {
match =>["message","%{HTTPDATE:logdate}"]
}
date {
match =>["logdate","yyyy-MM-dd HH:mm:ss Z"]
}
}
output 输出插件:
类似正文中使用的输出到elasticsearch ,使用标准输出到当前控制台(非服务启动就能看到,bin/logstash-f logstash.conf)
加上stdin和stdout后的配置文件如:
input {
stdin { }
tcp {
mode => "server"
host => "192.168.88.87"
port => "4560"
type => "UIC"
}
}
output {
stdout { codec => rubydebug }
if [type] == "UIC" {
elasticsearch {
action => "index"
hosts =>"192.168.88.87:9200"
index => "uic"
}
}
}
注意:如果logstash需要往elasticsearch中写入日志,那么需要先安装和启动elasticsearch
我们这里elasticsearch是使用了shield安全组件,所以需要在elasticsearch中为logstash创建用户
sudo shield/esusersuseradd logstash-user -r logstash -p password
然后elasticsearchssl 的配置如下:
elasticsearch{
action => "index"
#开启证书验证后,会检查访问域名和证书上的是否一致,所以下面hosts就必须用域名
ssl_certificate_verification => true
user =>"logstash-user"
password => "password"
ssl => true
hosts =>"log.example.com:9200"
index => "uic"
}
3.Elasticsearch
先安装两个插件:
elasticsearch-head 用于浏览数据
sudo bin/plugin installmobz/elasticsearch-head
shield 安全组件 (这里包含license,shield两个插件)
sudo bin/plugin install license
sudo bin/plugin install shield
尝试添加用户:
/bin/shield/esusers useraddes_admin -p password -r admin //创建用户es_admin,并设置admin的角色
设置elasticsearch的ssl:
vi/etc/pki/tls/openssl.cnf 设置
[ v3_ca ]
subjectAltName= IP:192.168.88.87
在CA目录下创建两个初始文件:
touch index.txt serial
echo 01 > serial
创建根证书
sudo openssl genrsa -outprivate/cakey.pem 2048
sudo chmod 600private/cakey.pem
sudo openssl req -new -x509-key private/cakey.pem -out cacert.pem
———————
Country Name (2 letter code)[XX]:CN
State or Province Name (fullname) []:SC
Locality Name (eg, city)[Default City]:CD
Organization Name (eg, company)[Default Company Ltd]:com
Organizational Unit Name (eg,section) []:medxi
Common Name (eg, your name oryour server's hostname) []:log.medxi.com
Email Address []:server@medxi.com
———————
给elasticsearch创建证书,利用java的 keytool创建,(证书在jks文件中)
官网上列出了创建的方式如:
keytool -importcert -keystorenode01.jks -file cacert.pem -alias my_ca(通过导入CA的证书,这种方式创建的证书被认为协议不安全)
keytool -genkey -alias node01-keystore node01.jks -keyalg RSA -keysize 2048 -validity 712 -extsan=dns:node01.example.com,ip:192.168.1.1(创建key,推荐)
keytool -certreq -alias node01-keystore node01.jks -file node01.csr -keyalg rsa -extsan=dns:node01.example.com,ip:192.168.1.1(创建csr ,推荐)
这里我创建的证书,放在了/etc/elasticsearch/certs/下
修改/etc/elasticsearch/elasticsearch.yml 配置文件
添加以下配置
action.auto_create_index: .security
shield.ssl.keystore.path: /etc/elasticsearch/cert/node01.jks
shield.ssl.keystore.password: yourpassword
shield.http.ssl: true
————————几个基础配置我也贴这里——————
cluster.name: es_cluster
node.name: node-0
path.data: /usr/local/dev/elasticsearch/data
path.logs: /usr/local/dev/elasticsearch/logs
network.host: 192.168.88.87
http.port: 9200
—————————基础配置结束———————————————
然后重启elasticsearch,访问的时候就需要用https来访问了。
4.Kibana
因为kibana数据都来自elasticsearch,所以我们先到elasticsearch中创建kibana的用户:
sudo esusers useraddkibana4-server -r kibana4_server -p password
修改/etc/elasticsearch/role_mapping.yml
添加
kibana4_server:
- “cn=log.medxi.com,ou=medxi,o=com"
重启elasticsearch服务
kibana 安装shield插件:
bin/kibana plugin --install kibana/shield/2.3.5
在相关目录下创建证书:
sudo openssl genrsa -out log-medxi.key 2048
sudo openssl req -new -key log-medxi.key -out log-medxi.csr(填写的信息要跟服务器根证书一样)
sudo openssl ca -in log-medxi.csr -out log-medxi.crt
配置kibana的配置文件:
server.port: 5601
server.host: "0.0.0.0"
#记得这里就需要https了
elasticsearch.url: "https://192.168.88.87:9200"
kibana.index: ".kibana"
#刚刚创建的kibana用户和密码
elasticsearch.username: "kibana4-server"
elasticsearch.password: "medxikibana"
#创建好的证书
server.ssl.cert: /usr/local/dev/medxi/medxi.crt
server.ssl.key: /usr/local/dev/medxi/medxi.key
#在elasticsearch的地方我们使用的是jks文件,所以这里我没有配置(当然也可以生成证书文件)
#elasticsearch.ssl.cert: /usr/local/dev/medxi/log-medxicrt
#elasticsearch.ssl.key: /usr/local/dev/medxi/log-medxi.key
#指定根证书
elasticsearch.ssl.ca: /etc/pki/CA/cacert.pem
#因为我们使用的是自己的签发的证书,上面又没有引用elasticsearch的证书,所以这里 #设置false
elasticsearch.ssl.verify: false
shield.encryptionKey: "something_secret"
shield.sessionTimeout: 600000
shield.skipSslCheck: true
启动kibana服务,到这里就搭建完成了。
- 下面讲讲我部署时,踩过的坑
No.1 java运行环境,所有用户都必须能访问到java环境,(比如logstash以root用户启动,elasticsearch不能以root用户启动)
No.2 权限问题,elasticsearch是非root用户运行,所以所有它能操作的文件夹都有权限操作,主要是:
配置文件夹(/etc/elasticsearch/),目录下的所有文件和文件夹
日志文件夹(配置文件指定如/var/log/elasticsearch/logs/),目录下面的所有文件和文件夹
数据文件夹(配置文件指定如/var/elasticsearch/data/),目录下面的所有文件和文件夹
No.3 不能访问,先打开防火墙拦截
firewall-cmd --zone=public --add-port=5601/tcp --permanent(加了就永久开启)
No.4 使用jdk8(Open jdk或Oracle jdk)版本,因为低版本不支持我们自己签发证书的算法,比如你使用jdk7可能看到如下错误:
ERROR][shield.ssl] [node-0] unsupported ciphers [[TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]] wererequested but cannot be used in this JVM. If you are trying to use ciphers
with a key length greater than 128 bits on an Oracle JVM, you willneed to install the unlimited strength JCE policyfiles. Additionally, please ensure the PKCS11 provider is enabled for your JVM.
当然可以去尝试扩展jre的支持,但是我觉得升级jdk版本是最省事的。(如果jdk8仍然遇到此问题,在elasticsearch.yml配置文件中添加
shield.ssl.ciphers: ["TLS_RSA_WITH_AES_128_CBC_SHA256","TLS_RSA_WITH_AES_128_CBC_SHA" ] )
No5. 自己签发的证书,java环境认为不安全,错误如下:
PKIXpath building failed:sun.security.provider.certpath.SunCertPathBuilderException: unable to findvalid certification path to requested target{:class=>"Manticore::ClientProtocolException", :level=>:error}
解决办法,添加到java环境
sudokeytoo -importcert -file ~/example.crt -alias example -keystore$(echoa_home)/jre/lib/security/cacerts -storepass changeit