[splunk] Free Splunk 에 인증, 접근 제어, https 적용하기

스플렁크를 무료 버전으로 사용은 가능하지만 여러가지 기능 제약이 존재합니다.

 

무엇보다 인증, 접근제어, 암호화 통신(https)을 적용 할 수 없는 부분이 가장 큽니다.

이 세가지는 되지 않음에 따라 아무나 스플렁크로 접속 후 모든걸 제어 할 수 있는 문제가 발생합니다.

 

사실상 Naked 상태로 운영이 되므로 사용을 하기가 어렵습니다.

 

완벽하지는 않지만 아래와 같이 구성하면 Naked 상태 보다 안전하게 사용 할 수 있습니다.

 

1.스플렁크를 Reverse Proxy 방식으로 구성합니다.

스플렁크 web 의 접속 형태는 https://ip주소:8000 이고, spunkd 데몬을 통해 직접 구동합니다.

이 방식을 Reverse Proxy 로 변경하고 Nginx 또는 Apache 를 경유 후 스플렁크로 접속 되도록 구성 합니다.

 

그림으로 표현하면 다음과 같습니다.

 

 위 그림에서 Web Server A/B 부분이 splunkd 데몬이 됩니다.

 

>>  "사용자 > 리버스 프록시 <> 스플렁크" 로 연결 되도록 구성 하면 됩니다.


리버스 프록시는

 

1) Nginx 를 사용 하고, 2) 여기에 HTTPS 를 적용하고, 3)  HTTP Basic 인증을 적용 하여 

 

"인증, 접근제어, 암호화 통신" 까지의 모든 사항을 해결 하도록 하겠습니다.

 

2.세가지의 준비물이 필요 합니다.

필요한 준비물은 아래 세가지만 있으면 됩니다.

 

번호 이름  내용 비고
1 NGINX 리버스 프록시로 사용함 rpm 패키지로 설치
2 htpasswd HTTP Basic 인증 처리용 스플렁크 접속시 ID/PW 인증 용도
3 SSL 인증서 HTTPS 통신을 하기 위한 SSL 인증서 공인/사설 구분 없으나, 공인이 좋겠지?

 

3.구성 방법

3.1.Nginx 가상 호스트 만들기 

아래는 https://splunk.uncools.com 으로로 접속하면, 스플렁크가 설치된 서버의 웹UI (tccp 8000) 으로 연결 하는 설정입니다.

 

같은 서버에 스플렁크와 Nginx 가 설치된 구성입니다.

 

다른 서버에 스플렁크를 설치한 경우 upstream 구문을 해당 IP로 변경 합니다.

 

# vim /etc/nginx/conf.d/splunk.uncools.com.conf


upstream splunk {
        server 127.0.0.1:8000 fail_timeout=0;
        keepalive 15;
}


# default vhost-server

server {
        listen       80 default_server;
        listen       443 default_server ssl;

        error_log    /var/log/nginx/http.ip.error.log;
        access_log   /var/log/nginx/http.ip.access.log  main;

        ssl_certificate /etc/nginx/conf.d/cert/wadizcorp.com_ssl.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/wadizcorp.com_ssl.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;

        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:MEDIUM:!aNULL:!MD5:!EXPORT:!RC4:!eNULL:!DES:!3DES;

        location / {
             # deny all;
             return 301 https://$server_name$request_uri;
        }
    }


server {
        listen       443 ssl;
        server_name  splunk.uncools.com;

        error_log    /var/log/nginx/splunk.uncools.com.error.log;
        access_log   /var/log/nginx/splunk.uncools.com.access.log  main;

	ssl_certificate /etc/nginx/conf.d/cert/uncools.com_ssl.crt;
        ssl_certificate_key /etc/nginx/conf.d/cert/uncools.com_ssl.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;

        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:MEDIUM:!aNULL:!MD5:!EXPORT:!RC4:!eNULL:!DES:!3DES;

        location / {
            proxy_pass http://splunk;
            auth_basic "WARNING AREA";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }

    }

 

가장 마지막에 location / 구문을 통하여 스플렁크 웹UI 로 연결 하되 >  auth_basic 으로 인증 (ID/PW 입력)을 하도록 적용 합니다.

 

SSL 설정을 완료 하고 Nginx 의 config 테스트를 수행 합니다.

$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 

3.2.가상 호스트 접속 시 HTTP Basic 인증용 계정 생성하기

nginx 의 구성은 완료되었습니다.

이제 HTTP Basic 인증을 하기 위한 설정을 추가 합니다.

 

1) HTTP Basic 인증용 htpasswd 도구 설치 합니다.

# yum install httpd-tools

2) httpd-tools 설치 하였다면 htpasswd 커맨드를 이용하여 계정을 생성합니다.

1. 계정 생성
-c (소문자) 옵션은 처음 .htpasswd 파일을 만들때 한번만 사용
-5 를 꼭 붙이고 해야 해 (sha512 로 패스워드 해시) 
-5 를 안붙히면 패스워드 해시가 md5가 되므로, 취약해지게 돼

# htpasswd -c5 /etc/nginx/.htpasswd uncools
New password:
Re-type new password:
Adding password for user uncools


2.생성된 계정 패스워드 해시 확인
- 패스워드 해시 $6 (안전한 패스워드 해시 알고리즘) 인것 꼭 확인!

$ cat /etc/nginx/.htpasswd
uncools:$6$ddy8JfIEPMd9EZJH$t..생략../


3. 사용자 추가 생성
-c 빼고 하면 됨
# htpasswd -5 /etc/nginx/.htpasswd uncools2
New password:
Re-type new password:
Adding password for user uncools2
  

4. 생성된 계정 확인
# cat /etc/nginx/.htpasswd
uncools:$6$ddy8JfIEPMd9EZJH$tDvCs..생략..6qB6ZaKr4/
uncools2:$6$kvlQfmrkXGtLuwNJ$ZIs..생략..l6s1H0.1


5. 계정 삭제
# htpasswd -D /etc/nginx/.htpasswd splunk1
Deleting password for user splunk1

 

3) .htpasswd 이 안전하도록 파일 권한을 변경 합니다.

 

계정 생성을 하였다면 .htpasswd 파일이 보안에 안전하도록 권한을 변경하자.

- nginx 프로세스(worker 계정) 계정 .htpasswd 파일을 읽을 수 있어야해
- 따라서 파일 소유자는 worker 계정 / 퍼미션은 400으로 설정함

# chmod 400 .htpasswd
# chown nginx:nginx .htpasswd

 

3.3.Nginx  를 재시작하고 접속 합니다.

nginx 를 시작 합니다.

# systemctl start nginx


이후 Listen 포트를 확인 하여 Nginx 와 스플렁크가 구동 중인 사항 확인 합니다.

# netstat -anlpt | grep -i "LISTEN"
tcp        0      0 0.0.0.0:8089            0.0.0.0:*               LISTEN      69900/splunkd
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      88730/nginx: master
tcp        0      0 0.0.0.0:8191            0.0.0.0:*               LISTEN      70053/mongod
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      69900/splunkd
tcp        0      0 127.0.0.1:8065          0.0.0.0:*               LISTEN      70258/python3.7
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      88730/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1432/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1432/sshd


https://ip주소:8000 이 아닌 Nginx 로 접속 합니다.

https://splunk.uncools.com 등 세팅한 도메인으로 접속


접속시 아래 처럼 ID/PW 입력 창이 나옵니다. 여기에 htpasswd 로 생성했던 계정을 입력 합니다.

 

이후 스플렁크 화면이 보인다면  리버스 프록시 구성 작업이 완료 되었습니다.

 

마지막으로, 우회 접속(https://ip 주소:8000) 을 차단하기 위해 방화벽 설정을 진행 합니다.

 

아래는 iptables 를 이용한 예시 입니다.

 

4.우회 접속 차단을 위한 방화벽을 설정 합니다.

리버스 프록시 구성이 되어서 https:// 형태로 접속이 가능하지만

여전히 스플렁크 웹UI (tcp 8000) 으로 직접 연결 (http://192.168.100.10:8000 등) 하면 접속이 가능 합니다.

 

http://192.168.100.10:8000 연결은 127.0.0.1 로 만 허용 되도록 방화벽에서 적용합니다.

# 모든 인바운드 연결을 허용하는 규칙
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

# TCP 8000으로 연결되는 인바운드는 127.0.0.1 만 접근 가능하도록 허용하는 규칙
iptables -A INPUT -p tcp --dport 8000 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 8000 -j DROP

 

이후 스플렁크 접속은 https://splunk.uncools.com 등 세팅한 도메인으로만 접속 됩니다.