Splunk를 Let's Encrypt로 HTTPS화해 보았다

5545 단어 letsencryptSSLSplunk
Amazon Kinesis Firehose를 사용하여 CloudTrail이나 VPC Flow를 Splunk에 먹여보려고 문득 마음껏 설정을 시작한 것은 좋지만, 아무래도 상용 인증서를 사용한 SSL 통신이 요건인 것 같다.

참고: Splunk 매뉴얼(영어)

Firehose를 사용하면 CloudWatch Logs, CloudWatch Events, IoT 등의 데이터 스트림을 Splunk의 HTTP Event Collector를 향해 POST할 수 있는 것 같다.
(자세한 것은 또 다른 기사 씁니다)

그래서 우선 검증 환경이라는 것으로 Let's Encrypt를 사용하여 Splunk에서 HTTPS 통신할 수 있도록 해 보았다.

왜 Let's Encrypt?



타다니까.

Let's Encrypt로 인증서 획득



자꾸의 순서 써 갑니다.

인증서 취득을 위한 Nginx 준비



왜 Nginix? Splunk 인스턴스에서 Let's Encrypt에 요청할 수 없습니까?

아무래도 certbot을 사용해 Let's Encrypt 증명서를 취득하는 경우, 도메인 인증으로서 80번 포트에 통신하는 것 같다.

포트 80을 열지 않은 웹 서버에서도 인증서를 발급할 수 있습니까?

하지만 Splunk에서는 권한의 사정상 웹 포트를 80으로 설정할 수 없다. root 유저로 Splunk 움직이면 80번 포트에 바인드 할 수 있을까? 하지만 그것은 위험하기 때문에 그만두는 것이 좋을까.

따라서 EC2에서 Nginx 인스턴스를 만들고 Splunk용 하위 도메인의 DNS 레코드를 Nginx 인스턴스로 향하게 합니다(이것은 중요).

인증서 취득



certbot에서 취득.
참고 페이지 → AWS EC2에 Let's Encrypt를 도입해 보았습니다.
$ # certbotインストール
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod 755 /usr/bin/certbot-auto
$ 
$ # 証明書取得
$ sudo certbot-auto certonly --webroot -w /var/www/html -d xxxxxx.example.com --email [email protected] --no-bootstrap

07/28/2020 추가

위의 방법을 사용하면 WARNING: couldn't find Python 2.7+ to check for updates.라는 오류가 발생합니다.
certbot 인스톨은 공식 를 참고로 인스톨 해, 증명서 취득의 커멘드는 이하로
sudo certbot certonly --webroot -w /var/www/html -d xxxxxx.example.com --email [email protected] --no-bootstrap

인증서를 Splunk에 설치



우선은 인증서 배치용의 디렉토리를 $SPLUNK_HOME/etc/auth 부하에 작성
$ mkdir $SPLUNK_HOME/etc/auth/mycerts
web.conf 에서 인증서 경로 설정

$SPLUNK_HOME/etc/system/local/web.conf
[settings]
enableSplunkWebSSL = 1
serverCert = $SPLUNK_HOME/etc/auth/mycerts/cert.pem
privKeyPath = etc/auth/mycerts/privkey.pem

HTTP Event Collector에서 HTTPS 통신 사용



이것은 빠졌습니다. 1주일 동안 망설였다.inputs.conf [http] 스탠자에서 인증서 경로를 설정하는 것이지만 이전 단계에서 설치 한 서버 인증서를 작성하는 것만으로는 좋지 않았습니다.
$ curl -k https://xxxxxxx.com:8088/services/collector/event -H "Authorization: Splunk XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" -d '{"event": "hello world"}' -v
Trying xx.xxx.xxx.xxx...
Connected to xxxxxxx.com (xx.xxx.xxx.xxx) port 8088 (#0)
Operation timed out after 0 milliseconds with 0 out of 0 bytes received
Closing connection 0
curl: (28) Operation timed out after 0 milliseconds with 0 out of 0 bytes received

↑ 아우츠・・・! 압도적 타임 아웃!・・・・・・! ! !

Cipher 지정해 보거나와 여러가지 시험했다···! 굿・・・안돼・・・・・・! ! !

…결론부터 말하면, 지정하는 증명서에 비밀열쇠와 중간 증명서를 써 줄 필요가 있습니다.
그렇다면 Let's Encrypt에서 얻은 fullchain.pem
$SPLUNK_HOME/etc/auth/mycerts/server.pem
-----BEGIN CERTIFICATE-----
(サーバー証明書)
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
(秘密鍵)
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(中間証明書)
-----END CERTIFICATE-----

그리고 그것을 server.pem 로 지정한다.

$SPLUNK_HOME/etc/apps/splunk_httpinput/local/inputs.conf
[http]
disabled = 0
serverCert = $SPLUNK_HOME/etc/auth/mycerts/server.pem

Splunk 재부팅



다시 시작하고 오시마이
$ /opt/splunk/bin/splunk restart

테스트



HEC 헬스 체크용 엔드포인트 inputs.conf 에 HTTPS로 GET 리퀘스트 해 본다.


상태 코드 200과 함께 HEC is healthy라는 메시지가 반환되었으므로 이제

결론



여기까지 써 두면서, 실은 Kinesis Firehose는 Let's Encrypt를 인증할 수 없는 것 같습니다.
오류가 발생했습니다.

Amazon Kinesis Firehose의 해결 방법과 Splunk로의 데이터 전송은 다음 기사에서.

2018/02/23 추가
Kinesis Firehose를 사용하여 Splunk에서 AWS 사용자 활동을 시각화해 보았습니다. 기사를 썼습니다.

좋은 웹페이지 즐겨찾기