2014年9月25日 星期四

架設Redis作為蒐集log的緩衝

 

Logstash 建議用Redis作為蒐集log資料的中介及緩衝,主要有以下原因

  • 安裝簡單而迅速
  • 效率佳
  • 經過多數Logstash社群驗證過

image

 

開始安裝redis

yum install redis

image


修改設定檔 /etc/redis.conf,找到以下設定值

bind 127.0.0.1

加上註解符號#,讓所有IP來源都可以連接Redis (當然安全性不佳,後續再來解決)

#bind 127.0.0.1

啟動Redis

service redis start

測試Redis

#redis-cli -h localhost
redis localhost:6379> ping
PONG
#
這樣就表示服務有正常啟動。

新增從Redis將資料送至Elasticsearch的設定值



  • 在/etc/logstash/conf.d/目錄下新增 central.conf
    input {
    redis {
    host => "localhost"
    type => "redis-input"
    data_type => "list"
    key => "logstash"
    }
    }
    output {
    elasticsearch {
    host => "localhost"
    cluster => "LogCluster"
    node_name => "LogMaster"
    }
    }


  • 修正先前apache access log的設定檔,將最後輸出的部分改為redis
    input {
    file {
    path => "/var/log/httpd/access_log"
    type => "apache" # a type to identify those logs (will need this later)
    }
    }

    filter {
    if [type] == "apache" { # this is where we use the type from the input section
    grok {
    match => [ "message", "%{COMBINEDAPACHELOG}" ]
    }
    }
    }

    output {
    redis {
    host => "localhost"
    data_type => "list"
    key => "logstash"
    }
    }


  • 重新啟動logstash服務
    service logstash restart
這樣就可以使用了喔…

讀書心得: 盒內思考:有效創新的簡單法則

盒內思考《盒內思考:有效創新的簡單法則》

  • 作者: 德魯‧博依 Drew Boyd, 傑科布‧高登柏格 Jacob Goldenberg
  • 出版社:天下文化
  • ISBN:9789863204664

創新,不是天賦,更不是天啟,
創新的思考,絕非天馬行空、漫無邊際,
唯有找到正確的框架,才能架構真正的創新。

思考是創新的開端

無論是要做什麼,尤其是創新活動,一定要花時間思考,而非隨著既有的工作慣性,庸庸碌碌地持續做下去,這樣跟生產線上的機器有什麼兩樣呢?

創新的定義雖然時常有爭議,例如有人說跨時代的革命性產品或改變,才能稱為創新;而有另一派強調創新是由一系列小演變組合而成,這些都算是創新。但無論哪種定義,都提到觀察、思考、改善等名詞,也是在告訴我們思考的重要性,也可以說是創新前必經的過程。

創新是有方法的

但大家都知道,純粹胡思亂想的思考、天馬行空的幻想,是沒有辦法創新的。從點子idea 到 ideal 再到 real,是一點點的改變才能實現。

作者經過多次的研究驗證,提出系統化五個模板:

  • 簡化:少即是多
  • 分割:分而治之
  • 加承:增生繁多
  • 任務統合:老狗學新把戲
  • 屬性相依:巧妙的關聯

書中彙整了各個模板應用的例子與做法,以及需注意的事項,看完頓時覺得前方有多條光明大道,覺得以前將相關人等關進會議室腦力激盪的方式,真是落後沒效率,又常變成長官或資深同仁的一言堂,失去了創新的意義。

不過有了工具方法,若沒有思考實踐,一切都是空談。因此,找個目標嘗試看看吧!!!

Logstash 參考資訊

繼續蒐集中…

建立第一個Logstash設定檔

安裝完ELK之後,可以嘗試建立第一個設定檔。由於Kibana是設定在Apache服務中,我們就先拿apache access log來測試(位於 /var/log/httpd/access_log)
請到 /etc/logstash/conf.d 目錄下新增第一個設定檔,名稱可以任意定,例如 apache_access.conf。主要分成三個段落
  1. input : 設定輸入的類型、位置等資訊
    • 以檔案 file 的形式輸入
    • 指定檔案位置
  2. filter : 設定解析的方式、衍生欄位等
    • logstash已經有內建解析access log的方式,請直接用 grok 的設定。
  3. output : 輸出的位置
    • 本範例直接輸出到 elasticsearch 中
    • 若您的elasticsearch有指定 cluster名稱及node名稱,請記得設定在這邊,以免找不到服務。

input {
  file {
    path => "/var/log/httpd/access_log"
    type => "apache"  # a type to identify those logs (will need this later)
  }
}

filter {
  if [type] == "apache" {   # this is where we use the type from the input section
    grok {
      match => [ "message", "%{COMBINEDAPACHELOG}" ]
    }
  }
}

output {
  elasticsearch {
    host => "localhost"
    cluster => "LogCluster"
    node_name => "LogMaster"
  }
}
設定完成後,還要修改 /etc/init.d/logstash ,將啟動的使用者及群組改為root,以免權限不足沒辦法讀取access_log。

LS_USER=root
LS_GROUP=root 

 最後重新啟動logstash服務
# service logstash restart
Killing logstash (pid 1993) with SIGTERM
Waiting logstash (pid 1993) to die...
Waiting logstash (pid 1993) to die...
logstash stopped.
logstash started.
#

然後開啟瀏覽器 http://<your_ip_address 應該就可以看到了。

image

2014年9月24日 星期三

強化ELK平台ElasticSearch的安全性

在前一篇安裝說明時,是將ElasticSearch的9200 port開放出來,但這樣一來,所有人都可以操作ElasticSearch。

本篇關閉了9200~9300的對外port,限定只能從localhost存取ElasticSearch,然後利用apache的proxy功能,讓Kinaba透過80port 存取Elastic Search。

  1. 修改 /etc/elasticsearch/elasticsearch.yml 設定檔,新增以下兩行,限定只能在本機連結ElasticSearch
    script.disable_dynamic: true
    network.host: localhost

  2. 修改 Apache的設定, 在 /etc/httpd/conf.d 中新增檔案 elk.conf (名稱可以自訂)
    # Courtesy of https://github.com/sgzijl
    # config.js includes elasticsearch: "https://"+window.location.hostname+":80",

    <VirtualHost *:80>
    ServerName LogServer

    DocumentRoot /var/www/html
    <Directory /var/www/html>
    Allow from all
    Options -Multiviews
    </Directory>

    # Set global proxy timeouts
    <Proxy http://127.0.0.1:9200>
    ProxySet connectiontimeout=5 timeout=90
    </Proxy>

    # Proxy for _aliases and .*/_search
    <LocationMatch "^/(_nodes|_aliases|.*/_aliases|_search|.*/_search|_mapping|.*/_mapping)$">
    ProxyPassMatch http://127.0.0.1:9200/$1
    ProxyPassReverse http://127.0.0.1:9200/$1
    </LocationMatch>

    # Proxy for kibana-int/{dashboard,temp} stuff (if you don't want auth on /, then you will want these to be protected)
    <LocationMatch "^/(kibana-int/dashboard/|kibana-int/temp)(.*)$">
    ProxyPassMatch http://127.0.0.1:9200/$1$2
    ProxyPassReverse http://127.0.0.1:9200/$1$2
    </LocationMatch>

    # Optional disable auth for a src IP (eg: your monitoring host or subnet)
    <Location />
    Allow from 10.10.10.*
    Deny from all
    Satisfy any

    AuthType Basic
    AuthName "Log Server Authentication"
    AuthUserFile /var/www/html/.htpasswd
    require valid-user
    </Location>

    </VirtualHost>


  3. 在/var/www/html 目錄下增加 .htpasswd 作為使用者認證
    # htpasswd -c .htpasswd <username>
    New password:
    Re-type new password:
    Adding password for user <username>
    #


  4. 修正防火牆 iptables ,關閉原本開放的 9200-9300 port
    #!/bin/bash
    #
    # iptables 範例設定腳本
    #
    # 清除 iptables 內一切現存的規則
    #
    iptables -F
    #
    # 容讓 SSH 連線到 tcp 連接埠 22
    # 當透過 SSH 遠端連線到伺服器,你必須這樣做才能群免被封鎖於系統外
    #
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    #
    # 開啟HTTP 80 port
    #
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    #
    # 設定ElasticSearch使用的port 9200-9300
    #
    #iptables -A INPUT -p tcp --dport 9200:9300 -j ACCEPT
    #
    # 設定 INPUT、FORWARD、及 OUTPUT 鏈的預設政策
    #
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    #
    # 設定 localhost 的存取權
    #
    iptables -A INPUT -i lo -j ACCEPT
    #
    # 接納屬於現存及相關連線的封包
    #
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    #
    # 儲存設定
    #
    /sbin/service iptables save
    #
    # 列出規則
    #
    iptables -L -v


  5. 修改Kibana的 config.js檔案 (/var/www.html),將原本 9200 port改為 80 port
     elasticsearch: "http://"+window.location.hostname+":80"

2014年9月22日 星期一

使用ELK(Elastic Search、Logstash、Kibana)建立Log查詢、蒐集與分析系統


公司想要開始要建立統一的Log查詢、蒐集與分析的環境,因此嘗試使用ELK來建立。

環境說明

先嘗試建立Standalone的環境,也就是ELK都先放在同一台。
  • 作業系統: CentOS 6.5 final
  • Elastic Search 1.3.2
  • Logstash 1.4.2
  • Kibana

參考資料


軟體安裝

  1. 作業系統安裝

    • 請記得安裝已下套件
      • Apache httpd (yum install httpd)
      • Java 7 SDK
  2. 安裝Elastic Search

    • 下載公鑰
      rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
    • 在 /etc/yum.repos.d/ 目錄下新增檔案,例如 elasticsearch.repo,內容如下
      [elasticsearch-1.3]
      name=Elasticsearch repository for 1.3.x packages
      baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos
      gpgcheck=1
      gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
      enabled=1
    • 安裝Elastersearch
      yum install elasticsearch

      image
  3. 設定Elasticsearch



    • 編輯 /etc/elasticsearch/elasticsearch.yml ,加入

      cluster.name: "LogCluster"
      node.name: "LogMaster"
      node.master: true
      node.data: true
      
      path.conf: /etc/elasticsearch
      path.data: /datapool/data1
      path.work: /datapool/work
      path.logs: /datapool/log
    • 將服務加入系統
      chkconfig --add elasticsearch

    • 啟動服務
      /etc/init.d/elasticsearch start

    • 測試啟動是否成功
      curl localhost:9200/_nodes/process?pretty
      
      {
        "cluster_name" : "LogCluster",
        "nodes" : {
          "sqhS68RMS3q1CtthFOdSxw" : {
            "name" : "LogMaster",
            "transport_address" : "inet[/10.10.10.151:9300]",
            "host" : "logserver",
            "ip" : "127.0.0.1",
            "version" : "1.3.2",
            "build" : "dee175d",
            "http_address" : "inet[/10.10.10.151:9200]",
            "attributes" : {
              "master" : "true"
            },
            "process" : {
              "refresh_interval_in_millis" : 1000,
              "id" : 30839,
              "max_file_descriptors" : 65535,
              "mlockall" : false
            }
          }
        }
      }
      

  4. 安裝Logstash



    • 參考資料:http://logstash.net/docs/1.4.2/repositories
    • 安裝金鑰
      rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
    • 在 /etc/yum.repos.d/ 目錄下新增檔案,例如 logstash.repo,內容如下
      [logstash-1.4]
      name=logstash repository for 1.4.x packages
      baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
      gpgcheck=1
      gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
      enabled=1
    • 安裝Logstash
      yum install logstash
      image

  5. 安裝Kibana



    • Kibana是一個純粹由javascript/CSS/html組成的套件,安裝好logstash之後可以在 /opt/logstash/vendor/kibana 目錄下找到。
    • 複製到httpd的 /var/www/html/ 目錄之下
      cp -R /opt/logstash/vendor/kibana/* /var/www/html/
    • 啟動httpd服務
      chkconfig httpd on
      
      /dev/init.d/httpd start
  6. 設定防火牆



    • 預設的防火牆是沒有開啟http及elastersearch的port,請加入以下兩個規則
      #
      # 開啟HTTP 80 port
      #
      iptables -A INPUT -p tcp --dport 80 -j ACCEPT
      #
      # 設定ElasticSearch使用的port 9200-9300
      #
      iptables -A INPUT -p tcp --dport 9200:9300 -j ACCEPT
      

  7. 開始使用



    • 用瀏覽器進入 http://<Server Address>/

image




待續…



  1. Logstash接收log設定值

  2. Kibana設定與使用

  3. Elastersearch進階設定

  4. and more…

在CentOS上安裝ZFS套件與建立磁碟區



參考資料 :


安裝說明

CentOS 6.x

yum localinstall --nogpgcheck http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm

yum install kernel-devel zfs

CentOS 7.x

yum localinstall --nogpgcheck https://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm

yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm

yum install kernel-devel zfs

開啟運行服務

安裝完成後,已經自動註冊服務,因此下次開機會自動啟動。不過剛安裝完還沒啟動,請下指令啟動服務
/etc/init.d/zfs start

建立Pool

利用zpool指令建立第一個pool( 參考 http://illumos.org/man/1m/zpool )
zpool create <名稱> <device>
zpool create datapool /dev/sdb1
查看看是否有成功建立

zpool  list


NAME       SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
datapool  39.8G   172K  39.7G     0%  1.00x  ONLINE  -

建立一個具有壓縮功能的分區


zfs create -o compression=lz4 datapool/data1


列出分區

zfs list



NAME             USED  AVAIL  REFER  MOUNTPOINT
datapool         148K  39.1G  32.5K  /datapool
datapool/data1    30K  39.1G    30K  /datapool/data1

補充說明


如果您遇到開機的時候無法automount,也就是啟動 /etc/init.d/zfs 時出現 /dev/zfs permission denied的錯誤,請先參考以下文件

http://zfsonlinux.org/faq.html#HowDoIAutomaticallyMountZFSFilesystemsDuringStartup

該文件主要是說zfs套件還沒支援 SELinux policy,因此建議將SELinux policy改為permissive 或 disabled

$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted