티스토리 뷰

반응형

 Logstash 에서 네트워크 장비 로그를 syslog(UDP 514)로 수집을 하려고 구성을 하였는데 logstash 실행을 하니 아래와 같은 에러 메시지가 나오면서 서비스가 실행이 되지 않는 경우가 발생을 하였습니다. 

메시지를 보면
 Permission denied - bind(2) for "0.0.0.0" port 514
라고 되어 있네요...  한눈에 봐도 권한 문제인 것을 알 수 있습니다. 

[2020-02-13T17:39:08,169][ERROR][logstash.inputs.udp] UDP listener died {:exception=>#<Err
no::EACCES: Permission denied - bind(2) for "0.0.0.0" port 514>, :backtrace=>["org/jruby/ext/soc
ket/RubyUDPSocket.java:213:in `bind'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logst
ash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:116:in `udp_listener'", "/usr/share/logstash/vend
or/bundle/jruby/2.5.0/gems/logstash-input-udp-3.3.4/lib/logstash/inputs/udp.rb:68:in `run'", "/u
sr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:309:in `inputworker'", "/usr/share
/logstash/logstash-core/lib/logstash/java_pipeline.rb:302:in `block in start_input'"]}

 Linux 에서는 보안상 이유로 1 ~ 1024 ( Known 포트) 에 대해서는 root 권한이 있는 사용자 이외에는 해당 포트를 사용할 수 없도록 제한을 하고 있어서 발행하는 에러 입니다.

이를 해결할 수 있는 방법은 여려가지가 있는데요.

1.  root 권한으로 logstash를 실행
2. logstash실행시 java 프로세스에 해당 포트 사용할 수 있는 권한을 할당
3. Known Port 가 아닌 다른 포트를 사용(1025~65535)

첫번째 logstash를 root로 실행하는 경우입니다.
일단 프로세스를 root 권한으로 실행하는 것은 일반적으로 보안상 권장은 하지 않습니다. logstash 등 ELK Stack 이 오픈소스 환경이고 여러 보안상 취약점이 발생할 가능성이 있습니다. 또한 외부에서 해당 애플리케이션 취약점을 이용해 시스템 Root 권한을 획득할 경우 시스템에 악 영향을 미치기 때문에 가급적 root 권한 을 사용하지 않으시는게 좋습니다. 

그리고 3번째 Known Port 가 아닌 다른 포트를 사용(1025~65535)하는 경우입니다.
logstash 에서 input 플러그인을 통해 임의의 포트를 지정해 주시면 되고, 가장 빠르고 간편한 방법일 수 있습니다. 하지만 로그를 전송하는 모든 장비에서 전송포트를 변경을 해 주어야 하고, 장비 수량이 수백대 이상일 경우 상당한 시간이 필요하게 됩니다. 그리고 방화벽이나 ACL등 정책이 걸려 있다면, Policy 까지 수정을 해 주어야 합니다.  
 또한 일부장비들은 Default Port 변경이 불가능한 경우가 있기 때문에 장비 특성 및 구성 환경도 고려하여 사용을 해야 합니다. 
  저 같은 경우 네트워크 장비 로그를 수집하고 있는데 일부 네트워크 장비에서 버전상의 이유로 로그 전송 포트 수정이 불가능하여 어쩔 수 없이 Syslog (udp 514)를 사용할 수 밖에 없었습니다. 

여기서는 2번째 항목 sepcap 명령어를 통한 java 프로세스 권한 부여하는 부분에 대해서 이야기해 보려고 합니다. 

< logstash실행시 java 프로세스에 해당 포트 사용할 수 있는 권한을 할당 > 
  sepcap 이라는 명령어를 통해서 java 프로세스에 Known 포트 사용할 수 있는 권한을 부여할 수 있습니다.

  1) find 명령어를 통해서 java 프로세스가 실행되는 위치를 확인합니다. 
     - find / -name java
       java 관련 파일이 여러개 뜨는데 찾아보니 제 장비의 경우 아래의 경로에 설치되어 있네요..

[root@elastic ~]# find / -name java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java

[root@elastic ~]#

    2) sepcap 명령어를 사용해서 java 프로세스 파일에 bind 권한을 부여해 줍니다.     

[root@elastic ~]#setcap cap_net_bind_service=+epi /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java

 위와 같이 실행후 logstash를 다시 시작하면 권한 오류 없이 잘 실행이 되는 것을 확인하실 수 있습니다. 

  그리고 sepcap 실행 후 아래와 같이 java 에서 libjli.so 파일이 없다는 오류 메시지가 나오는 경우 가 있습니다. 

logstash: /bin/java: error while loading shared libraries: libjli.so: cannot open shared  object file: No such file or directory

 이럴 경우 libjli.so 파일을 찾아서 /etc/ld.so.conf.d/ 경로에 추가를 해 주시면 됩니다. 

     - find / -name libjli.so 
    찾아보니  java 파일이 있던 경로 하위 아래의 경로에 libjli.so 파일이 존재하네요..

[root@elastic ~]#find / -name libjli.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/lib/amd64/jli/libjli.so

[root@elastic ~]#

   이제 vi 편집기로 /etc/ld.so.conf.d/ 하위에 libjli.conf 라는 파일을 생성하신 후에 위에 서 찾은 경로를 넣어 주시면 됩니다.  참고로 파일명은 빼고 파일이 있는 상위 경로까지만 입력을 해 주셔야 합니다.

vi /etc/ld.so.conf.d/libjli.conf

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64/jre/lib/amd64/jli/

  위와 같이 수정하신후 ldconfig Reload를 해 줍니다. 

[root@elastic ~]# ldconfig 

이제 Logstash를 다시 시작해 주시면 정상적으로 실행이 됩니다. 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함