ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CentOS 7] Log 서버
    Linux/CentOS 2018. 4. 26. 17:35

     로그의 종류 및 이러한 로그를 관리하기 위한 Rsyslog서버와 GUI 로그 관리 프로그램인 ELK 스택의 사용 방법을 설명한다. 리눅스 운영체제에서 가장 우수한 기능 중 하나는 시스템에서 다양하게 발생하는 대부분의 사건들을 여러 가지 방법으로 로그에 기록한다느 점이다. 이렇게 로그에 기록된 정보들은 시스템이나 어플리케이션 문제 해결을 위해 가장 중요한 자원으로 사용된다.  

     그리고, 리눅스 시스템에서 발생하는 로그의 양과 종류는 너무나 다양하고 방대할 뿐 아니라, 대부분의 로그는 텍스트 위주의 파일이어서 관리자가 바라는 대로 이들을 편리하게 관리하고 문제 해결을 위해 로그에서 필요한 정보들을 습득하는 과정이 쉽지않다. 이렇게 복잡하고 중요한 로그를 관리하기 위해 리눅스 시스템은 여러 뛰어난 프로그램들을 지원하는 있는데, 대표적으로 로그 관리 데몬인 rsyslog을 사용한 로그 관리 방법과 오픈소스 GUI 로그 관리 프로그램 ELK를 사용해 로그를 관리하느 방법을 소개한다. 

     대부분의 로그는 /var/log 디렉토리에 저장되는데, 이곳에서는 인증과 데몬, 그리고 커널과 시스템 로그를 비롯해서 수많은 어플리케이션이 발생하는 로그들을 확인할 수 있다.

     





    1. 로그 종류 이해


    1.1 시스템 로그

    시스템 로그는 일반적으로 리눅스 시스템 운영에 필요한 로그들을 의미하는데, 사용자들 서비스 제공을 위해 추가한 어플리케이션이 발생시킨 로그와는 성격이 다른 로그 파일이다. 

     로그 종류

     설명 

     인증 로그

     사용자 인증을 위해 사용되는 인증 시스템이 발생시키는 로그로서 여기서의 인증은 대부분 패스워드를 사용한다.
    인증 관련 시스템으로 PAM과 원격지 로그인에 사용되는 SSH가 주로 사용자 인증에 사용되는 예라고 할 수 있다.
    이러한 로그들은 /var/log/secure 파일에 저장된다.

     데몬 로그 

     데몬이란 관리자의 간섭 없이 백그라운드로 실행되는 프로그램으로 시스템이 문제없이 실행되도록 하는 중요한
    기능을 수행한다. 데몬 로그는 /var/log/daemon.log에 기록되는데 이 파일은 처음에 생성되지 않고, /etc/rsyslog.conf 파일에
    DAEMON이라는 facility를 정의하면 생성된다. 또한 규칙적인 서비스 실행에 사용되는 Cron 데몬은 var/log/cron 파일에 로그를 기록한다. 

     커널 로그 

     리눅스 커널이 발생시킨 로그로서 기록을 위해 /var/log/kern과 /var/log/dmesg 파일이 사용되는데,
    커널 컴파일 같이 커널에서 발생하는 에러 관련 문제 해결에 아주 유용하게 사용된다. 

     시스템 로그 

     리눅스 시스템에서 발생하는 대부분의 로그를 기록하기 위해 사용되고 가장 많은 양의 정보를 저장하며, /var/log/messages 파일을 사용한다.  



    1.2 애플리케이션 로그

    특정 어플리케이션이 발생시킨 로그를 의미하는데, 일반적인 경우 /var/log 디렉토리 하위 디렉토리를 생성해 로그 파일을 저장한다. 

     로그 종류

     설명 

     Apache 웹 서버

     Apache 웹 서버가 발생시킨 로그를 기록하며, /var/log/httpd 디렉토리에 일반적인 접속 로그인 access_log와
    에러 로그를 기록하는 error_log파일을 사용

     Nginx 웹 서버

     Nginx 웹 서버가 발생시킨 로그를 기록하며, /var/log/nginx 디렉토리에 일반적인 접속 로그인 access_log와
    에러 로그를 기록하는 error_log파일을 사용 

     FTP 서버

     VSFTP나 Proftp 같은 FTP 서버가 발생시킨 로그를 기록하며, /var/log/xferlog 파일을 기본으로 사용한다.

     MaraiDB 서버 

     MariaDB 데이터베이스 서버가 발생시킨 로그를 기록하며, /var/log/mariadb 디렉토리가 사용된다. 


    1.3 바이너리 로그

    시스템 로그나 어플리케이션 로그는 대부분 텍스트 파일로 돼 있어 vim이나 cat과 같은 텍스트 편집기를 이용해 바로 사용자가 읽을 수 있다. 그런데 이렇게 텍스트 파일이 아닌 바이너리 로그 파일로 돼 있어 사용자가 직접 파일들을 읽지 못하고 특정 명령어를 사용해야만 읽을 수 있는 바이너리 로그 파일들이 있다.

     로그 종류

     설명 

     /var/run/utmp

     각 사용자의 현재 로그인 정보를 기록하며, 명령어 who나 w를 이용해 정보 확인이 가능하다.

     /var/log/wtmp

     사용자의 모든 로그인과 로그아웃을 기록하는 파일이며, 명령어 last를 이용해 확인이 가능하다. 

     /var/log/btmp

     사용자의 로그인 실패를 기록하는 파일이며 명령어 lastb로 확인이 가능한데, 처음에는 생성되지
    않으므로 명령어 touch를 이용해 생성해야 한다. 

     /var/log/lastlog

     모든 사용자의 가장 최신 로그인 정보를 기록하는 파일이며, 명령어 lastlog를 이용해 확인 가능하다.




    2. Rsyslog 로그 서버 사용 


     Rsyslog는 RHEL6부터 로그 관리 데몬인 syslog을 대체하기 위해 지원된 프로그램으로서 성능이 뛰어나면서도 관리가 단순한 로그 관리 데몬이다. Rsyslog는 호스트 간 로그 전송을 위해 UDP 프로토콜뿐만 아니라 TCP 프로토콜을 지원해 신뢰도를 높였고 Facility/Priority, Property, Expression를 이용한 필터링 기능을 통해 더 정확한 로그 기록이 가능하게 됐다. 또한 SQL 데이터베이스를 이용한 로그 저장 기능, TLS를 통한 암호화 기능까지도 지원이 가능하다. 


    2.1 Log 서버 서비스 시작

    a. 패키지 설치와 서비스 시작

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # yum을 사용해 rsyslog 패키지를 설치 
    [root@centos ~]# yum install -y rsyslog rsyslog-doc -y
     
    # rpm을 사용해 패키지 설치와 버전 정보를 확인 
    [root@centos ~]# rpm -qa | grep rsyslog
    rsyslog-8.24.0-12.el7.x86_64
    rsyslog-doc-8.24.0-12.el7.x86_64
     
    # rsyslog 서비스가 부팅 후에 자동으로 시작되도록 설정
    [root@centos ~]# systemctl enable rsyslog
     
    # rsyslog 서비스를 시작 
    [root@centos ~]# systemctl start rsyslog
     
    # rsyslog 서비스 상태 
    [root@centos ~]# systemctl status rsyslog
    ● rsyslog.service - System Logging Service
       Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2018-04-20 07:34:51 CEST; 1h 43min ago
         Docs: man:rsyslogd(8)
               http://www.rsyslog.com/doc/
     Main PID: 637 (rsyslogd)
       CGroup: /system.slice/rsyslog.service
               └─637 /usr/sbin/rsyslogd -n
    Apr 20 07:34:51 centos systemd[1]: Starting System Logging Service...
    Apr 20 07:34:51 centos rsyslogd[637]:  [origin software="rsyslogd" swVersion="8.24.0" x-pi...art
    Apr 20 07:34:51 centos systemd[1]: Started System Logging Service.
    Apr 20 08:24:01 centos rsyslogd[637]:  [origin software="rsyslogd" swVersion="8.24.0" x-pi...Ped
    Hint: Some lines were ellipsized, use -l to show in full.
     
    # rsyslog 데몬이 사용하는 설정 파일을 열어서 주석을 제거해 프로토콜 TCP 포트 514번으로 로그를 받아들이기 위한 모듈과 포트를 활성화한다. 
    # 여기서 imtcp(Input Module for TCP)의 약어다. rsyslog는 TCP, UDP를 사용해 로그 전송이 가능하다.
    [root@centos ~]# vi /etc/rsyslog.conf
        # Provides TCP syslog reception
        $ModLoad imtcp
        $InputTCPServerRun 514
     
    # rsyslog 서비스가 사용하는 포트 번호와 PID를 확인
    [root@centos ~]# netstat -natlp | grep rsyslog
    tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      3135/rsyslogd   
    tcp6       0      0 :::514                  :::*                    LISTEN      3135/rsyslogd   
     
    # rsyslog 서비스가 사용하는 포트를 어떤 명령어가 사용하고 있는지 확인 
    [root@centos ~]# lsof -i tcp:514
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rsyslogd 3135 root    3u  IPv4  26553      0t0  TCP *:shell (LISTEN)
    rsyslogd 3135 root    4u  IPv6  26554      0t0  TCP *:shell (LISTEN)
     
    # 현재 프로세스를 확인 
    [root@centos ~]# ps -ef | grep rsyslog
    root      3135     1  0 09:21 ?        00:00:00 /usr/sbin/rsyslogd -n
    root      3155  2942  0 09:22 pts/0    00:00:00 grep --color=auto rsyslog
    cs



    b. 방화벽 설정

    iptables 방화벽과 firewalld 방화벽을 사용해 Rsyslog 서비스를 허용하기 위한 설정 중 한 가지를 상황에 따라 선택하여 사용하면 된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # rsyslog 서비스가 사용하는 프로토콜 tcp와 포트 514번을 허용한다. 
    [root@centos ~]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 514 -j ACCEPT
     
    # rsyslog 서비스가 사용하는 프로토콜 udp를와 포트514번을 허용한다. 
    [root@centos ~]# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 514 -j ACCEPT
     
    # rsyslog 서비스가 사용하는 프로토콜 tcp와 포트 514번을 허용한다. 
    [root@centos ~]# firewall-cmd --permanent --add-port=514/tcp
    success
     
    # rsyslog 서비스가 사용하는 프로토콜 udp를와 포트514번을 허용한다. 
    [root@centos ~]# firewall-cmd --permanent --add-port=514/udp
    success
     
    # 추가된 내용이 적용되도록 방화벽을 다시 시작한다. 
    [root@centos ~]# firewall-cmd --reload
    success
     
    # 추가된 포트 번호와 프로토콜 목록이 있는지 확인한다. 
    [root@centos ~]# firewall-cmd --list-ports
    514/tcp 514/udp
    cs


    2.2 Rsyslog 설정 파일 이해

    Rsyslog 서비스는 /etc/rsyslog.conf 파일을 사용해 설정이 가능한데, 이 파일은 크게 세 개의 섹션으로 구성돼 있다. 

    a. Modules 섹션

    Rsyslog는 다양한 종류의 모듈을 지원함으로써 기능을 지속적으로 확장할 수 있다. 패키지를 설치하면 이러한 모듈은 기본적으로 /usr/lib64/rsyslog 디렉토리에 저장된다. 이러한 모듈을 사용하려면 예를 들어 $ModLoad imudp처럼 $ModLoad 키워드와 모듈이름(imdup)를 정의하고 필요한 옵션들을 정의만 하면 그 모듈을 사용할 수 있다.


    b. Global Directives 섹션

    이 섹션은 rsyslog 데몬 전체에 적용되는 내용을 설정하는 부분이다. 예를 들어 메시지 큐의 크기를 지정하거나($MainMessageQueueSize), 외부 모듈을 로딩하기($ModLoad) 위해 사용할 수 있으며, 설정을 위해 반드시 한 주 앞에 달러 기호($)를 사용해야 한다.


    c. Rules 섹션

    Rules 섹션은 실질적으로 로그에 대한 관리를 정의하는 부분으로서 Selector와 Action 필드를 구성되고, 다시 Selector는 Facility와 Priority로 이뤄져 있다. Selector와 Action 필드를 구체적으로 설명하면 아래와 같다.

    1. Facility : Selector의 Facility란 로그를 발생시키는 서브시스템(하나의 시스템 구성하고 있는 부분이면서 또한 그 자체로도 시스템을 이루고 있는 것)을 의미한다. 종류를 나열하면 kern(0), user(1), mail(2), daemon(3), auth(4), syslog(5), lrp(6), news(7), uucp(8), cron(9), authpriv(10), ftp(11), local0-7(16-23)이 있다. 여기서 각 Facility가 갖고 있는 숫자는 코드 번호를 의미하며, 각 운영체제마다 다룰 수 있다. 

    2. Priority 또는 Serverity : Selector의 Priority는 각 syslog 메시지가 갖고 있는 중요도와 우선순위를 지정하기 위해 사용한다. Priority에서 한 가지 주의할 점은 일반적으로 로그의 한 레벨을 정의하면 그 상위 레벨도 모두 해당된다는 점이다. 예를 들어 err(3)를 설정하면 그 상위 crit, alert, emerg에 해당되는 메시지도 함께 로그에 기록된다. 

    Priority 

    설명 

     debug (7)

     애플리케이션이 발생시킨 디버깅에 유용한 정보

     info(6) 

     관리자의 간섭이 전혀 필요 없는 단순한 정보 전달용 메시지

     notice(5) 

     에러는 아니지만 평소와 다른 현상이 발생해 주의가 필요한 경우의 메시지

     warning(4) 

     조치가 없는 경우 에러가 발생할 수 있는 경고 메시지

     err(3) 

     에러가 발생한 경우 메시지

     crit(2) 

     매우 위험한 상황인 경우의 메시지

     alert(1) 

     즉각적인 관리자의 조치가 필요한 상황인 경우의 메시지 

     emerg(0) 

     시스템을 사용할 수 없을 정도로 비상 상황인 경우 메시지

    3. Action

    1) user.err    /var/log/user/log

       -> user라는 서브시스템이 발생시키는 err 이상의 로그를 목적지 user.log 파일에 기록하라는 의미다. 여기서 user는 Facility, err는 Priority, user.log파일은 Action 필드에 해당된다.

    2) *.notice    @192.168.80.5

       -> 모든 서브시스템이 발생시키는 notice 이상의 로그를 목적지 IP주소 192.168.80.5에 저장하는데, 프로토콜 UDP를 사용하라는 의미다. 여기서 '*'은 모든 Facility, '@'는 UDP 의미

    3) mail.*    @@chul.com:6514

       -> mail 서브시스템이 발생시키는 모든 종류의 로그를 도메인 chul.com의 포트 6514번으로 TCP를 이용해 보내 저장하라는 의미다. 여기서 '*'은 모든 로그의 Priority로서 debug부터 emerg

           까지를 의미하며, '@@'은 프로토콜 TCP, 6514는 TLS가 적용된 rsyslog의 포트를 의미한다.

    4) *.*    @(z 9)192.168.80.5

       -> 모든 종류의 서브시스템이 발생시키는 모든 종류의 로그를 9레벨의 압출을 사용해 목적지 IP 주소 192.168.80.5로 UDP를 이용해 보내라는 의미다. 여기서 z9은 zlib를 이용한 압축을 

           의미하고, 숫자 9는 최대 수준의 압축을 의미하는데, 1이 가장 낮은 압축 수준이다.

    5) mail.*    ~

       -> mail 서브시스템이 발생시킨 모든 종류의 로그를 버리라는 의미다. 여기서 틸트(~)는 선택 된 메시지를 모두 버리라는 의미로 사용된다.

    6) kern.=cirt       park & @192.168.80.5

       -> kern 서브시스템이 발생시킨 crit 수준의 로그만을 사용자 park과 IP 주소 192.168.80.5로 프로토콜 UDP를 이용해 보내라는 의미다. 이 경우 Action 필드에 두 가지 이상의 Action을 동

          시에 사용할 수 있다. 그리고 '='는 상위 Pritory를 포함하지 않는 crit 수준 하나만의 Priority를 의미한다. 

    7) cron.!info,!debug    /var/log/cron.log

       -> cron 서브시스템이 발생시킨 로그 중에서 info, debug를 제외한 모든 로그를 cron.log 파일에 기록하라는 의미다. 여기서 느낌표(!)는 특정 Priority를 제외하기 위해 사용한다.

    8) *.=emerg    :omusrmsg:*

       -> 모든 서브시스템이 발생시킨 emerg 수준의 로그를 시스템에 로그인한 모든 사용자에게 보여주라는 의미다. 여기서 omusrmsg는 User Message Output Module의 약어로서 이 기능을 가

          능케 해주는 내장 플러그인이다. 또한 '*'는 현재 로그인한 모든 사용자를 의미하며, root와 같이 특정 사용자를 '*' 대신 사용할 수 있다.


    2.3 Rsyslog 원격지 로그 서버 사용

    a. Rsyslog 로그 서버에서 설정 (Master)

    먼저 rsyslog 로그 서버에서 이를 위해 사용할 두 가지 옵션을 활성화하고 서비스를 다시 시작한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    root@centos ~]# vi /etc/rsyslog.conf
        # Provides UDP syslog reception
        $ModLoad imudp
        $UDPServerRun 514
     
    [root@centos ~]# systemctl restart rsyslog
     
    [root@centos ~]# lsof -i udp:514
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rsyslogd 3382 root    3u  IPv4  29083      0t0  UDP *:syslog
    rsyslogd 3382 root    4u  IPv6  29084      0t0  UDP *:syslog
    cs


    b. Rsyslog 로그 클라이언트에서 설정(node1)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # rsyslog 설정 파일을 열어 모든 (*) facility에서 발생 시킨 모든(*)종류 로그를 프로토콜 UDP를 사용해 로그 서버 
    # 192.168.50.200의 포트 514번으로 보내라는 의미다. @이면 프로토콜 UDP, @@이면 TCP를 의미 
    [root@node01 ~]# vi /etc/rsyslog.conf
    *.*     @192.168.50.200:514
     
    # 변경 사항을 적용하기 위해 데몬 재시작 
    [root@node01 ~]# systemctl restart rsyslog
    Shutting down system logger:                               [  OK  ]
    Starting system logger:                                    [  OK  ]
     
    # ps를 사용해 프로세스 확인
    [root@node01 ~]# ps -ef | grep rsyslog
    root      6844     1  0 08:55 ?        00:00:00 /usr/sbin/rsyslogd -n
    cs


    c. Rsyslog 로그 서버 확인

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 테스트를 위해 클라이언트 node01에서 network를 다시 시작
    [root@node01 ~]# systemctl restart sshd
     
    # 로그 서버 master에서 로그 파일 messages를 실시간 검사해보면 node에서 발생시킨 network 서버 관련 로그 확인 가능
    [root@centos ~]# tail -f /var/log/messages
    Apr 20 09:04:06 node01 dhclient[7612]: DHCPACK from 10.0.2.2 (xid=0x300b1633)
    Apr 20 09:04:08 node01 NET[7657]: /sbin/dhclient-script : updated /etc/resolv.conf
    Apr 20 09:04:08 node01 dhclient[7612]: bound to 10.0.2.15 -- renewal in 37586 seconds.
    Apr 20 09:04:08 node01 kernel: ADDRCONF(NETDEV_UP): eth1: link is not ready
    Apr 20 09:04:08 node01 kernel: e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
    # 연결 상태를 확인해보면 UDP는 연결 정보가 없다(UDP는 서로 통신이 연결되지 않는 상태에서 정보를 보내기 때문) 
    # TCP 연결을 확인해 보면 연결 정보를 확인할 수 있다. (TCP는 먼저 연결을 생성한 후 데이터 전송하기 때문)
    [root@centos ~]# netstat -natpl | grep 514
    tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      3382/rsyslogd   
    tcp6       0      0 :::514                  :::*                    LISTEN      3382/rsyslogd  
    tcp        0      0 192.168.50.200:514      192.168.50.100:57116    ESTABLISHED 3382/rsyslogd   
     
    # lsof 명령어로 TCP 514번 포트를 확인해 보면 연결 정보를 알 수 있다.
    [root@centos ~]# lsof -i tcp:514
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rsyslogd 3382 root    5u  IPv4  29087      0t0  TCP *:shell (LISTEN)
    rsyslogd 3382 root    6u  IPv6  29088      0t0  TCP *:shell (LISTEN)
    rsyslogd 3382 root   15u  IPv4  30163      0t0  TCP centos:shell->192.168.50.100:57116 (ESTABLISHED)
    cs


    2.4 Rsyslog 데이터베이스 사용

    rsyslog는 로그 파일을 데이터베이스에 저장할 수 있는 기능도 지원한다. 여기서 데이터베이스란 Mysql, MariaDB, PostgreSQL, Oracle뿐 아니라 MonogoDB 같은 빅데이터 데이터베이스 제품도 해당한다. 여기서는 CentOS7에서 기본 DBMS로 사용되는 MariaDB서버를 이용해 로그를 데이터베이스에 저장하는 것을 알아본다.

    a. 데이터베이스 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # Mariadb 데이터베이스 프로그램을 설치하고 설치됐는지 확인
    [root@centos ~]# yum install -y mariadb mariadb-server
    [root@centos ~]# rpm -qa | grep mariadb
     
    [root@centos ~]# systemctl restart mariadb
     
    # lsof를 사용해 서버가 사용하는 포트 3306번을 확인한다. 
    [root@centos ~]# lsof -i tcp:3306
    COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld  3794 mysql   14u  IPv4  31379      0t0  TCP *:mysql (LISTEN)
     
    # MariaDB 서버로 접속해 데이터베이스 Syslog에 대한 관리 사용자 및 패스워드를 SQL 명령문으로 생성한다.
    [root@centos ~]# mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 13
    Server version: 5.5.56-MariaDB MariaDB Server
    Copyright (c) 20002017, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    MariaDB [(none)]> GRANT all privileges ON Syslog.* TO rsyslog@'localhost' IDENTIFIED BY 'rsyslog';
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> EXIT
    Bye
    cs


    b. Rsyslog 서버에서 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # rsyslog 서버 로그를 mariaDB 서버에 저장하기 위해 사용할 패키지를 설치하고 rpm으로 버전 정보 확인 
    [root@centos ~]# yum install -y rsyslog-mysql
    [root@centos ~]# rpm -qa | grep rsyslog-mysql
    rsyslog-mysql-8.24.0-12.el7.x86_64
     
    # rsyslog-mysql 패키지가 제공하는 스크립트를 실행해서 이 서비스를 위해 사용할 데이터베이스와 테이블을 생성한다. 
    [root@centos ~]# mysql -u root -p < /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql
    Enter password:
    MariaDB [Syslog]> show tables;
    +------------------------+
    | Tables_in_Syslog       |
    +------------------------+
    | SystemEvents           |
    | SystemEventsProperties |
    +------------------------+
     
    [root@centos ~]# vi /etc/rsyslog.conf
    # ommysql 모듈의 주석을 제거해 그 기능을 활성화 한다. ommysql은 MySQL Database Output Module 의 약어며 
    # Mysql(Mariadb) 데이터베이스를 Rsyslog 서버에서 사용하기 위한 모듈이다. 
    #### MODULES ####
    $ModLoad ommysql
     
    #### GLOBAL DIRECTIVES ####
    # MariaDB가 사용할 포트 번호를 지정한다. 
    $ActionOmmysqlServerPort 3306
    # 데이터베이스에 기록할 Action 필드, 모듈 이름, 데이터베이스 IP 주소, 데이터베이스 이름, 사용자, 패스워드를 저장 
    *.* :ommysql:127.0.0.01,Syslog,rsyslog,rsyslog
    # 데이터베이스 로그 전송 가능한 프로토콜 UDP와 IP 주소, 네트워크 범위를 지정
    $AllowedSender UDP, 127.0.0.1192.168.50.0/24
    # 데이터베이스 로그 전송 가능한 프로토콜 TCP와 IP 주소, 네트워크 범위를 지정
    $AllowedSender TCP, 127.0.0.1192.168.50.0/24
     
    [root@centos ~]# systemctl restart rsyslog
    cs


    c. 데이터베이스 확인

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    # MariaDB 서버로 접속해 데이터베이스를 선택 
    [root@centos ~]# mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 5
    Server version: 5.5.56-MariaDB MariaDB Server
     
    MariaDB [(none)]> Use Syslog;
    Database changed
     
    # 스크립트를 이용해 생성한 두 개의 테이블 정보를 볼 수 있고
    MariaDB [Syslog]> Show tables;
    +------------------------+
    | Tables_in_Syslog       |
    +------------------------+
    | SystemEvents           |
    | SystemEventsProperties |
    +------------------------+
     
    # SystemEvents 테이블의 첫 번째 ID 정보를 SQL 명령어로 확인할 수 있다. 
    MariaDB [Syslog]> SELECT * FROM SystemEvents WHERE ID = 1\G
    *************************** 1. row ***************************
                    ID: 1
            CustomerID: NULL
            ReceivedAt: 2018-04-20 11:33:52
    DeviceReportedTime: 2018-04-20 11:33:52
              Facility: 3
              Priority: 6
              FromHost: centos
               Message: Stopping System Logging Service...
            NTSeverity: NULL
            Importance: NULL
           EventSource: NULL
             EventUser: NULL
         EventCategory: NULL
               EventID: NULL
       EventBinaryData: NULL
          MaxAvailable: NULL
             CurrUsage: NULL
              MinUsage: NULL
              MaxUsage: NULL
            InfoUnitID: 1
             SysLogTag: systemd:
          EventLogType: NULL
       GenericFileName: NULL
              SystemID: NULL
    1 row in set (0.01 sec)
     
    # rsyslogd와 MariaDB 서버가 서로 연결돼 있음을 알 수 있다. 
    [root@centos ~]# lsof -i tcp:3306
    COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    mysqld   4175 mysql   14u  IPv4  32528      0t0  TCP *:mysql (LISTEN)
    mysqld   4175 mysql   34u  IPv4  33075      0t0  TCP localhost:ㅇmysql->localhost:38942 (ESTABLISHED)
    rsyslogd 4275  root   12u  IPv4  33074      0t0  TCP localhost:38942->localhost:mysql (ESTABLISHED)
    cs


    2.5 LogAnalyzer 사용

    LogAnalyzer는 브라우저를 이용해 데이터베이스에서 수집한 로그 정보를 간편하게 확인할 수 있도록 지원하는 GUI 프로그램이다. LogAnalyzer는 데이터베이스가 텍스트로 제공하는 대량의 로그 정보를 웹에서 그래픽을 통해 편리하게 검색 및 관리할 수 있도록 도와준다. 이 프로그램은 http://loganalyzer.adiscon.com/downloads/에서 다운로드 할 수 있다.

    a. 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 위에 사이트에서 최신 소스 파일을 다운로드 후 압축을 해제한다. 
    [root@centos ~]# wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.6.tar.gz
    [root@centos ~]# tar xvfz loganalyzer-4.1.6.tar.gz
     
    # Loganalyzer가 Apache서버에서 사용할 디렉토리를 생성 
    [root@centos ~]# mkdir -p /var/www/html/loganalyzer
     
    # 압축을 해제한 디렉토리에서 src,contrib 디렉토리의 모든 파일을 Loganalyzer 디렉토리로 이동
    [root@centos ~]# mv loganalyzer-4.1.6/src/* /var/www/html/loganalyzer/
    [root@centos ~]# mv loganalyzer-4.1.6/contrib/* /var/www/html/loganalyzer/
    [root@centos ~]# cd /var/www/html/loganalyzer/
     
    # 권한 문제가 발생하는 경우가 종종있어서 폴더 전체에 대한 권할 설정을 해준다.
    [root@centos loganalyzer]# chown -R /var/www/html/loganalyzer/
     
    # 이동시킨 두 개의 파일에 실행 권한을 부여
    [root@centos loganalyzer]# chmod +x configure.sh secure.sh
     
    # 이 파일을 실행하면 나중에 설정을 저장할 config.php 파일이 생성된다. 생성된 이 파일의 권한이 666으로 설정돼 있는지 확인 
    [root@centos loganalyzer]# ./configure.sh
    [root@centos loganalyzer]# chown apache:apache config.php
    [root@centos loganalyzer]# chmod 777 config.php
     
    # 변경 사항들이 모두 적용되도록 Apache 웹 서버를 다시 시작
    [root@centos loganalyzer]# systemctl restart httpd
    cs


    b. 웹에서 설정

    이제 브라우저로 접속해 Loganalyzer의 나머지 설정 과정을 설명한다. 이때 Apache 웹 서버가 시작됐는지 확인하기 바란다.

    1. 접속 시도하기 : 웹 서버의 IP와 loganalyzer 디렉토리를 입력하면 처음 에러 메시지를 볼 수 있는데, here를 클릭하면 다음 화면으로 넘어간다.


    2. Step 1: 선행 조건 확인하기

    설치 첫 번째 단계는 Loganalyzer 설치에 필요한 선행 조건이 있는지 확인하는 것이다.


    3. Step 2: 파일 권한 검사하기

    생성된 config.php 파일의 권한이 제대로 설정돼 있는지 검사한다. 기본 권한은 666이다. 이 과정에서 설정한 내용들이 모두 저장된다.


    4. Step 3: 데이터베이스 정보 입력하기

    앞에서 생성한 데이터베이스 정보를 입력한다. 호스트 정보, 포트 번호, 데이터베이스 이름과 사용자 이름, 패스워드를 입력하고 Next한다.


    5. Step 4: 테이블 생성하기

    Step 3의 정보를 기초로 테이블을 생성하게 된다. 다음 단계로 건너간다.


    6. Step 5: SQL 결과 확인하기


    7. Step 6: 관리자 계정 생성하기

    브라우저를 사용해 Loganalyzer를 접속할 때 필요한 계정을 생성한다.


    8. Step 7: 로그 소스 지정하기

    Loganalyzer가 로그 정보를 가져올 소스를 지정한다. 오른쪽 위에서 MySQL Native를 선택하고 데이터베이스 정보를 입력하고 Next를 한다.


    9. Step 8: 완료하기


    10. 로그인, 로그인 정보 확인




    3. 로그 GUI 프로그램 ELK 스택 사용


    ELK 스택이란 ElasticSearch, Logstash, Kibana 프로그램을 의미하는데, 서버 시스템과 애플리케이션 서버들이 발생하는 로그를 GUI 프로그램으로 제공함으로써 관리자가 편리하기 로그에 대한 전반적인 관리를 할 수 있게 지원하는 오픈소스 프로그램이다. 이 ELK 스택을 구성하는 요소들을 구체적으로 먼저 설명하고, ELK 스택을 설치하는 방법을 알아보자.


    3.1 ELK 스택 구성 요소

    a. Logstash

    클라이언트의 플러그인이 보내온 모든 종류의 로그를 수집해 그것을 가공한 다음에 ElasticSearch를 비롯한 여러 외부 프로그램에 전달하는 역할을 하는 서버 프로그램이다. 


    b. Elasticsearch

    모든 로그를 저장해 로그에 대해 실시간 인덱싱 및 검색,  그리고 분석을 하기 위한 클러스터링 솔루션을 제공한다. 


    c. Kibana

    Kibana는 Elasticsearch를 위해 로그를 분석 및 검색하고 시각화하기 위해 사용되는 인터페이스로서 Nginx 웹 서버를 프록시돼 사용할 수 있고, 또한 편리한 관리를 위해 대시보드 기능을 제공한다.


    d. Filebeat

    클라이언트 시스템에 설치돼 애플리케이션 서버들의 로그를 서버 시스템에 설치된 Logstash로 보내기 위한 로그 전송 에이전트다. 그래서 이 프로그램을 Logstash Forwarder라고 부르기도 한다. Filebeat는 Logstash와의 통신을 위해 Lumberjack 네트워크 프로토콜을 사용한다. 



    3.2 ELK 스택 설치

    ELK 스택은 먼저 로그 서버로 사용되고 있는 master 노드에서 새 패키지를 Elasticsearch, Kibaana, Logstash 순서대로 설치하고, 클라이언트 노드로 사용되고 있는 node1에서 Filebeat 패키지를 설치하겠다.

    a. Elasticsearch 설치

    1. 패키지 설치하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # Elasticsearch 프로그램은 자바 기반에서 실행되므로 선행 조건으로서 자바가 설치되지 않았다면 설치
    [root@centos ~]# yum install java -y
     
    # Java 버전 정보 확인
    [root@centos ~]# rpm -qa | grep java
    javapackages-tools-3.4.1-11.el7.noarch
    java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
    java-1.8.0-openjdk-headless-1.8.0.161-0.b14.el7_4.x86_64
     
    # 패키지를 설치하기 위해 필요한 키를 다운로드한 뒤에 설치한다.
    [root@centos ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
     
    # 패키지를 설치하기 위한 YUM저장소 파일을 생성한다. 
    [root@centos ~]# vi /etc/yum.repos.d/elasticsearch.repo
    [elasticsearch-2.x]
    name=Elasticsearch repository for 2.x packages
    baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
    gpgcheck=1
    gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
    enabled=1
     
    # yum으로 elasticsearch 패키지를 설치한다. 
    [root@centos ~]# yum install elasticsearch -y
    [root@centos ~]# rpm -qa | grep elasticsearch
    elasticsearch-2.4.6-1.noarch
    cs


    2. 서비스 시작하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # 설정 파일을 열어서 Elasticsearch가 실행 될 IP주소와 포트 번호를 정의한다. 외부에서 접근할 수 없게 하려면 로컬 호스트를 사용한다.
    [root@centos ~]# vim /etc/elasticsearch/elasticsearch.yml
     54  network.host: 192.168.50.200
     58  http.port: 9200
     
    # Elasticsearch가 부팅 후에도 자동으로 시작되도록 설정한다.
    [root@centos ~]# systemctl enable elasticsearch
    Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
     
    # Elasticsearch를 시작한다.
    [root@centos ~]# systemctl start elasticsearch
     
    # Elasticsearch 상태를 확인한다.
    [root@centos ~]# systemctl status elasticsearch
    ● elasticsearch.service - Elasticsearch
       Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
       Active: active (running) since Wed 2018-04-25 04:11:12 CEST; 6s ago
         Docs: http://www.elastic.co
      Process: 12110 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
     Main PID: 12111 (java)
       CGroup: /system.slice/elasticsearch.service
               └─12111 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMa...
    Apr 25 04:11:12 centos elasticsearch[12111]: OpenJDK 64-Bit Server VM warning: If the number of pr...s=N
    Apr 25 04:11:13 centos elasticsearch[12111]: [2018-04-25 04:11:13,762][INFO ][node                ...4Z]
    Apr 25 04:11:13 centos elasticsearch[12111]: [2018-04-25 04:11:13,763][INFO ][node                ......
    Apr 25 04:11:14 centos elasticsearch[12111]: [2018-04-25 04:11:14,830][INFO ][plugins             ... []
    Apr 25 04:11:14 centos elasticsearch[12111]: [2018-04-25 04:11:14,889][INFO ][env                 ...fs]
    Apr 25 04:11:14 centos elasticsearch[12111]: [2018-04-25 04:11:14,889][INFO ][env                 ...ue]
    Apr 25 04:11:17 centos elasticsearch[12111]: [2018-04-25 04:11:17,199][INFO ][node                ...zed
    Apr 25 04:11:17 centos elasticsearch[12111]: [2018-04-25 04:11:17,199][INFO ][node                ......
    Apr 25 04:11:17 centos elasticsearch[12111]: [2018-04-25 04:11:17,349][INFO ][transport           ...00}
    Apr 25 04:11:17 centos elasticsearch[12111]: [2018-04-25 04:11:17,382][INFO ][discovery           ...0Rw
     
    # lsof 명령어로 포트를 확인하면 Java프로그램이 이 서비스를 사용하고 있음을 알 수 있다.
    [root@centos ~]# lsof -i tcp:9200
    COMMAND   PID          USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    12111 elasticsearch   91u  IPv6 185547      0t0  TCP centos:elasticsearch (LISTEN)
     
    # 서비스를 정의하는 /etc/services 파일을 열어 기존 wap-wsp가 사용하는 포트 9200번을 변경한다.
    [root@centos ~]# vi /etc/services
    #wap-wsp         9200/tcp                # WAP connectionless session service
    #wap-wsp         9200/udp                # WAP connectionless session service
    elasticsearch   9200/tcp                # WElasticSearch Server
    elasticsearch   9200/udp                # ElasticSearch Server
    cs


    b. Kibana 설치

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    # kibana 패키지 설치를 위한 YUM 저장소를 추가
    [root@centos ~]# vim /etc/yum.repos.d/kibana.repo
    [kibana-4.5] name=Kibana repository for 4.5.x packages baseurl=http://packages.elastic.co/kibana/4.5/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
     
    # yum으로 kibana 패키지 설치
    [root@centos ~]# yum install kibana -y
    [root@centos ~]# rpm -qa | grep kibana
    kibana-4.5.4-1.x86_64
     
    # kibana 설정 파일에서 kibana가 사용할 port, ip 주소 그리고 Elasticsearch가 사용하고 있는 IP 주소 및 포트 번호를 변경
    [root@centos ~]# vi /opt/kibana/config/kibana.yml
    # Kibana is served by a back end server. This setting specifies the port to use.
    server.port: 5601
    server.host: "192.168.50.200"
    # The URL of the Elasticsearch instance to use for all your queries.
    elasticsearch.url: "http://192.168.50.200:9200"
     
    # kibana 서비스 활성화 및 시작
    [root@centos ~]# systemctl enable kibana
    Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
    [root@centos ~]# systemctl start kibana
    [root@centos ~]# systemctl status kibana
    ● kibana.service - Kibana
       Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: disabled)
       Active: active (running) since Wed 2018-04-25 05:03:18 CEST; 7s ago
     Main PID: 17413 (node)
       CGroup: /system.slice/kibana.service
               └─17413 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/...
    Apr 25 05:03:18 centos systemd[1]: Starting Kibana...
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...01"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ed"}
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["stat...
    Apr 25 05:03:21 centos kibana[17413]: {"type":"log","@timestamp":"2018-04-25T03:03:21Z","tags":["...ow""}
     
    # kibana 서비스가 사용하는 포트 5601번을 보면 PID와 IP 주소를 확인할 수 있다.
    [root@centos ~]# netstat -natlp | grep 5601
    tcp        0      0 192.168.50.200:5601     0.0.0.0:*               LISTEN      17413/node
     
    # lsof를 사용해 포트 5601번을 확인하면 node라는 명령어가 kibana 서비스를 사용하고 있음을 알 수 있다. 
    [root@centos ~]# lsof -i tcp:5601
    COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    node    17413 kibana   11u  IPv4 219774      0t0  TCP centos:kibana (LISTEN)
     
    # ps를 사용해 프로세스 정보를 확인
    [root@centos ~]# ps -ef | grep kibana
    kibana   17413     1  0 05:03 ?        00:00:00 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -/etc/kibana/kibana.yml
    root     17431  2942  0 05:08 pts/0    00:00:00 grep --color=auto kibana
     
    # 포트 5601번을  kibana 서비스로 변경한다. 방화벽 및 포트 번호 확인 시 이 포트를 kibana 서비스로 인식하기 위해서
    [root@centos ~]# cat /etc/services | grep 5601
    #esmagent        5601/tcp                # Enterprise Security Agent
    #esmagent        5601/udp                # Enterprise Security Agent
    kibana          5601/tcp                # Kibana Service
    kibana          5601/udp                # Kibana Service
     
    # kibana install 참조 문서 https://www.elastic.co/downloads/kibana
    https://www.elastic.co/guide/en/kibana/current/rpm.html

     

    cs


    c. Logstash 설치

    1. 패키지 설치하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    # logstash 설치를 위해 사용할 YUM 저장소 파일을 생성
    [root@centos ~]# vim /etc/yum.repos.d/logstash.repo
    [logstash-2.3]
    name=Logstash repository for 2.3.x packages
    baseurl=https://packages.elastic.co/logstash/2.3/centos
    gpgcheck=1
    gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
    enabled=1
     
    # logstash 패키지 설치
    [root@centos ~]# yum install logstash -y
    [root@centos ~]# rpm -qa | grep logstash
    logstash-2.3.4-1.noarch
     
    # logstash가 사용하는 설정 파일을 열어서
    [root@centos conf.d]# vi logstash.conf
    input {
      beats {
            port => 5044
            type => "logs"
            ssl => false
            #ssl_certificate => "/etc/pki/tls/certs/logstash.crt"
            #ssl_key => "/etc/pki/tls/private/logstash.key"
      }
    }
     
    filter {
      if [type] == "syslog" {
            grok {
              match => { "message" => "${SYSLOGTIMESTAMP:syslog_timestamp}
                      %{SYSLOGHOST:syslog_hostname}
                      %{DATA:syslog_program} (?:\[%{POSINT:syslog_pid}\])?:
                      %{GREEDYDATA:syslog_message}" }
            add_field => [ "received_at""{@timestamp}" ]
            add_field => [ "received_from""%{host}" ]
      }
      syslog_pri { }
            date {
              match => [ "syslog_timestamp""MM d HH:mm:ss""MMM dd HH:mm:ss" ]
            }
      }
    }
     
    output {
      elasticsearch { hosts => ["192.168.50.200:9200"] }
      stdout { codec => rubydebug }
    }
    cs

    2. 서비스 시작하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # Logstash 설정 파일의 문법을 테스트
    [root@centos ~]# service logstash configtest
    OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, 
    then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
    Configuration OK
     
    # logstash 서비스를 시작 및 활성화 
    [root@centos ~]# systemctl start logstash
    [root@centos ~]# systemctl status logstash
    ● logstash.service - LSB: Starts Logstash as a daemon.
       Loaded: loaded (/etc/rc.d/init.d/logstash; bad; vendor preset: disabled)
       Active: active (exited) since Thu 2018-04-26 02:37:10 CEST; 12min ago
         Docs: man:systemd-sysv-generator(8)
      Process: 25387 ExecStart=/etc/rc.d/init.d/logstash start (code=exited, status=0/SUCCESS)
     Main PID: 24614 (code=exited, status=143)
    Apr 26 02:37:10 centos systemd[1]: Starting LSB: Starts Logstash as a daemon....
    Apr 26 02:37:10 centos logstash[25387]: logstash started.
    Apr 26 02:37:10 centos systemd[1]: Started LSB: Starts Logstash as a daemon..
     
    # 서비스가 시작됐다는 메시지를 볼 수 있지만 실제 logstash 데몬은 시작되지 않고 이 데몬에 설정 파일을 지정해 데몬을 시작
    # 그러면 이 데몬이 로그를 클라이언트로부터 받아서 실시간으로 그것을 화면에 보여준다.
    [root@centos bin]# cd /opt/logstash/bin/
    [root@centos bin]# ./logstash -f /etc/logstash/conf.d/logstash.conf
    OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, 
    then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
    Settings: Default pipeline workers: 1
    Pipeline main started
     
    # lsof를 사용해 포트 5044번을 확인하면 logstash 서비스가 java에 의해 사용되고 있음을 알 수 있다.
    [root@centos bin]# netstat -natp | grep 5044
    tcp6       0      0 :::5044                 :::*                    LISTEN      25946/java      
    [root@centos bin]# lsof -i tcp:5044
    COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    25946 logstash   14u  IPv6 112243      0t0  TCP *:lxi-evntsvc (LISTEN)
     
    # 포트 5044번을 사용하는 서비스를 logstash로 변경한다.
    [root@centos bin]# vim /etc/services
    #lxi-evntsvc     5044/tcp                # LXI Event Service
    #lxi-evntsvc     5044/udp                # LXI Event Service
    logstash        5044/tcp                # Logstash Log Server
    logstash        5044/udp                # Logstash Log Server
    cs


    d. ELK 스택을 위한 방화벽 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # iptables 방화벽에 Elasticsearch 서비스를 허용하기 위해 포트 9200번을 추가 
    [root@centos bin]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 9200 -j ACCEPT
     
    # iptables 방화벽에 logstash 서비스를 허용하기 위해 포트 5044번을 추가
    [root@centos bin]# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 5044 -j ACCEPT
     
    # iptables 방화벽에 kibana 서비스를 허용하기 위해 포트 5601번을 추가
    [root@centos bin]# iptables -A INPUT -m state --state NEW -m udp -p udp --dport 5601 -j ACCEPT
     
    # firewalld 방화벽에 Elasticsearch 서비스를 허용하기 위해 포트 9200번을 추가  
    [root@centos bin]# firewall-cmd --permanent --add-port=9200/tcp
    success
     
    # firewalld 방화벽에 logstash 서비스를 허용하기 위해 포트 5044번을 추가
    [root@centos bin]# firewall-cmd --permanent --add-port=5044/tcp
    success
     
    # firewalld 방화벽에 kibana 서비스를 허용하기 위해 포트 5601번을 추가
    [root@centos bin]# firewall-cmd --permanent --add-port=5601/tcp
    success
     
    # 변경 사항을 적용하기 위해 방화벽을 다시 시작
    [root@centos bin]# firewall-cmd --reload
    success
     
    # 추가한 포트들이 서비스 허용 목록에 있는지 확인
    [root@centos bin]# firewall-cmd --list-ports
    514/tcp 514/udp 3306/tcp 9200/tcp 5044/tcp 5601/tcp
    cs


    3.3 클라이언트에 Filebeat 설치 (node1)

    클라이언트 시스템인 node1에서는 filebeat 패키지만 설치하면 설치를 마치게 된다. Filebeat 프로그램은 클라이언트 시스템에서 발생하는 로그를 수집해 로그 서버의 Logstash 또는 Elasticsearch로 보내 실시간 분석을 가능케 하는 역할을 한다. 이런 이유로 인해 Filebeat를 Logstash Forwarder라는 이름으로도 사용한다. 윈도우 시스템에서도 비슷하게 Winlogbeat라는 프로그램을 사용해 Logstash가 설치된 서버로 로그 전송이 가능하다.

    a. 패키지 설치

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # Filebeat 패키지 설치를 위해 키를 다운로드
    [root@node01 init.d]# rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
     
    # Filebeat 패키지 설치를 위해 필요한 YUM 저장소 파일을 생성
    [root@node01 init.d]# vim /etc/yum.repos.d/elastic-beats.repo
    [beats]
    name=Elastic Beats Repository
    baseurl=https://packages.elastic.co/beats/yum/el/$basearch
    enabled=1
    gpgkey=https://packages.elasstic.co/GPG-KEY-elasticsearch
    gpgcheck=1
     
    # yum으로 패키지 설치
    [root@node01 init.d]# yum install filebeat -y
    [root@node01 init.d]# rpm -qa | grep filebeat
    filebeat-1.3.1-1.x86_64
     
    # Filebeat가 사용하는 설정 파일을 열어서
    [root@node01 init.d]# vim /etc/filebeat/filebeat.yml
        # Filebeat가 클라이언트 시스템에서 수집해서 보낼 로그의 종류를 지정한다.
          paths:
            #- /var/log/*.log
            - /var/log/messages.log
            - /var/log/secure.log
        # 출력되는 문서의 유형을 정하는데, 이 유형은 Elasticsearch의 출력 유형으로 사용된다.
          document_type: log
      logstash:
        # Filebeat가 로그를 보낼 목적지의 IP 주소와 포트번호다. logstash가 사용되는데, 동시에 Elasticsearch로도 전송 
          hosts: ["192.168.50.200:5044"]
    cs


    b. 서비스 시작

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # filebeat 서비스 시작
    [root@node01 init.d]# service filebeat start
    Starting filebeat:                                         [  OK  ]
    [root@node01 init.d]# service filebeat status
    filebeat-god (pid  15923) is running...
     
    # filebeat의 프로세스를 확인하면 그 데몬이 설정 파일도 같이 사용하고 있음을 알 수 있다.
    [root@node01 init.d]# ps -ef | grep filebeat
    root     15923     1  0 01:28 pts/0    00:00:00 filebeat-god -/ --/var/run/filebeat.pid -- /usr/bin/filebeat -/etc/filebeat/filebeat.yml
    root     15924 15923  0 01:28 pts/0    00:00:00 /usr/bin/filebeat -/etc/filebeat/filebeat.yml
     
    # filebeat 서비스 포트 5044번을 검색하면 logstash 서비스로 연결돼 있음을 알 수 있다.
    [root@node01 init.d]# netstat -natlp | grep 5044
    tcp        0      0 192.168.50.100:40502        192.168.50.200:5044         ESTABLISHED 15924/filebeat
    tcp        0      0 192.168.50.100:40496        192.168.50.200:5044         TIME_WAIT   -       
     
    # master로 연결돼 있음을 알 수 있는데,서비스 이름이 lxi-evntsvc로 돼 있다. (클라이언트 서비스 정의 이름 때문)
    [root@node01 init.d]# lsof -i tcp:5044
    COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    filebeat 15924 root   10u  IPv4 241720      0t0  TCP 192.168.50.100:40502->192.168.50.200:lxi-evntsvc (ESTABLISHED)
     
    # master 서버에서 확인해보면 logstash 서비스가 클라이언트 node1과 연결돼 있음을 알 수 있다. 
    # 클라이언트 node1이 보내 온 로그를 서버의 logstash 서비스가 받아들이고 있다는 것을 의미한다.
    [root@centos bin]# lsof -i tcp:5044
    COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    25946 logstash   14u  IPv6 112243      0t0  TCP *:logstash (LISTEN)
    java    25946 logstash   44u  IPv6 117321      0t0  TCP centos:logstash->192.168.50.100:40502 (ESTABLISHED)
     
    cs



    3.4 Kibana 접속 테스트

     브라우저에서 지금까지 설치한 패키지를 테스트한다. 여기서 Kibana 서비스 포트로 접속하면 모든 서비스와 작동 여부를 확인할 수 있다. Kibana 서비스 포트로 접속하면 모든 서비스와 작동 여부를 확인할 수 있다. kibana로 접속하려면 서버의 IP 주소와 포트를 http://192.168.50.200:5601/와 같이 접속할 수 있다. 단 Kibana를 사용하기 위해 웹 서버가 미리 실행되고 있어야 한다.

    a. Kibana초기 화면

    Kibana를 처음 접속하면 화면 Elasticsearch가 클라이언트로부터 수집한 로그 정보를 그림처럼 카운트를 표시한 그래프와 함께 화면에 보여준다.



    b. 새 패턴 생성

    로그 검색을 위해 특정 패턴을 생성할 경우 위쪽의 메뉴에서 Settings를 클릭하고 예를 들어 타임스탬프를 입력하고 아래쪽의 Create를 클릭한다.



    c. 패턴 이용

    새 패턴이 생성되고 왼쪽 메뉴에서 생성한 패턴을 클릭하면 패턴에 해당되는 시간별 로그 목록을 볼 수 있고, 그중 하나를 클릭하면 그 로그들이 중앙에 카운트를 나타내는 그래프와 함께 모두 표시된다.


    D. 참조

    샘플 데이터 로드 : https://www.elastic.co/guide/kr/kibana/current/tutorial-load-dataset.html

    댓글

작은거인's Blog / Designed by TISTORY