티스토리 뷰

상황

 EC2는 총 세대가 있다. 두 대는 서비스용, 한 대는 서비스 관리용으로 프로메테우스 + 그라파나가 실행중이다. 그런데 이 EC2끼리 보안을 이유로 https로 통신하도록 만들어야 하는 상황이 있었다.

문제

 AWS에서 인증서 발급을 무료로 해주긴 하지만, 그건 도메인이 존재하는 경우였고, 도메인이 있어서 발급을 받는다해도 AWS에서는 인증서 파일을 제공하지 않을 뿐더러 인증서는 EC2에 바로 연결할 수 없고, 로드밸런서 등을 연결해야 했다. 하지만 더 큰 문제가 있었는데 우선 서버 자체가 https로 실행되어야 하기 때문에 서버 자체에 인증서 파일이 필요했다.

 이제 서버 자체에 인증서 파일을 어떻게 만드느냐가 문제였다. Caddy를 사용할까 했지만 이것도 애초에 self-signed 인증서이고, 설정의 문제인지 제대로 작동하지 않았다.

진행

 외부망이라면 당연히 공인된 SSL 인증서를 사용했겠지만, 내부망에서 일어나는 통신이고 전혀 외부로 노출될 일이 없어서 최종적으로 선택한 게 openssl로 self-signed 인증서를 만드는 것이었다. 그래도 굳이 SSL 인증서를 적용할 수도 있겠지만 인증서 비용이 드는 것도 고려해야 했다. 아래와 같이 openssl.cnf 파일을 만들고, 

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = 도메인

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = 도메인
DNS.2 = 도메인
openssl req -new -x509 -sha256 -nodes -days 365 \
    -config openssl.cnf \
    -keyout 키파일명.key -out CRT파일명.crt

위와 같이 명령어를 실행하여 crt파일과 key파일을 만들었다. 그리고 이제 인증서를 교체하고 다시 서버를 실행하니 https로 동작하는 것을 확인할 수 있었다.

위기

 그리고 관제서버에서 서비스 EC2에 데이터 수집을 요청하도록 했는데, 결과적으로 self-signed 인증서라 거부되었다.

[monitoring@hostname]$ curl -v 서비스EC2주소
* Host 서비스EC2주소 was resolved.
* IPv6: (none)
* IPv4: 서비스EC2 IP
*   Trying 서비스EC2 IP:3000...
* Connected to 서비스EC2주소 (서비스EC2 IP) port 3000
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self-signed certificate
* Closing connection
curl: (60) SSL certificate problem: self-signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
해결

 그래서 이 인증서를 어떻게 관제서버에서 신뢰하도록 하느냐 하는 문제에 부딪혔는데, 클라이언트 측에서 이 인증서를 신뢰할 수 있도록 시스템에 추가했다.

openssl s_client -showcerts -connect 서비스EC2주소:서비스EC2포트번호 </dev/null 2>/dev/null | openssl x509 -outform PEM > server-cert.pem

 그리고 이 인증서를 promethues가 서비스EC2와 통신할 때 신뢰할 수 있도록 prometheus.yml의 설정을 아래와 같이 변경했다.

scrape_configs:
  - job_name: 'example'
    scheme: https
    static_configs:
      - targets: ['서비스EC2주소:서비스EC2포트번호']
    tls_config:
      ca_file: /path/to/인증서명.pem

 설정을 변경하고 Promethues를 재시작하니 프로메테우스에 정상적으로 수집되는걸 확인할 수 있었다.

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