OpenShift 인증서 날짜는 어떻게 확인할까요?
오늘은 OpenShift에서 인증서 날짜를 확인하는 방법과 그 중요성에 대해 자세히 알아보겠습니다.
OpenShift 인증서 날짜 어떻게 확인하나요?
OpenShift 클러스터를 운영하다 보면 다양한 인증서들이 사용되고 있다는 것을 알게 됩니다. 이러한 인증서들은 클러스터의 보안과 정상적인 작동을 위해 필수적인 요소이지만, 만료일을 놓치게 되면 심각한 문제를 야기할 수 있습니다. 오늘은 OpenShift에서 인증서 날짜를 확인하는 방법과 그 중요성에 대해 자세히 알아보겠습니다.
그러면 어떻게 확인하나요?
OpenShift에서 인증서를 확인하는 방법은 크게 두 가지 접근법이 있습니다. 첫 번째는 전체 인증서 현황을 파악하는 방법이고, 두 번째는 특정 구성요소별로 개별 인증서를 확인하는 방법입니다.
1) 전체 인증서 현황 파악
먼저 클러스터 전체의 TLS 인증서 만료일을 한 번에 확인할 수 있는 명령어를 살펴보겠습니다.
echo -e "NAMESPACE\tNAME\tEXPIRY" && oc get secrets -A -o go-template='range .itemsif .data.tls\.crt.metadata.namespace"\t".metadata.name"\t"(.data.tls\.crt | base64decode) | regexp "-----BEGIN CERTIFICATE-----([^-]+)-----END CERTIFICATE-----" | base64decode | x509 "notAfter""\n"endend'
이 명령어는 모든 네임스페이스에서 TLS 인증서를 포함한 시크릿들을 찾아 만료일과 함께 정리된 형태로 출력해줍니다.
2) 주요 구성요소별 인증서 확인
전체 인증서 만료 날짜 확인
echo -e "NAMESPACE\tNAME\tEXPIRY" oc get secrets -A -o go-template='{{range .items}}{{if eq .type "kubernetes.io/tls"}}{{.metadata.namespace}}{{"\t"}}{{.metadata.name}}{{"\t"}}{{index .data "tls.crt"}}{{"\n"}}{{end}}{{end}}' | \ while read namespace name cert; do echo -en "$namespace\t$name\t" echo $cert | base64 -d | openssl x509 -noout -enddate done | column -t
API 서버 인증서
# API 서버 주소 확인 oc cluster-info # API 서버 인증서 만료일 확인 openssl s_client -connect:6443 -servername 2>/dev/null | openssl x509 -noout -dates
서비스 CA 인증서
# ConfigMap 조회 oc get configmap -n openshift-service-ca # 서비스 CA 인증서 만료일 확인 oc get configmap openshift-service-ca.crt -n openshift-service-ca -o jsonpath='{.data.service-ca\.crt}' | openssl x509 -noout -dates
노드 인증서
# 노드 인증서 정보 확인 oc get secret kube-apiserver-to-kubelet-signer -n openshift-kube-apiserver-operator -o json | jq '.metadata.annotations'
부트스트랩 인증서
oc -n openshift-machine-config-operator \ get secret machine-config-server-tls \ -o jsonpath='{.data.tls\.crt}' \ | base64 -d | openssl x509 -noout -subject -issuer -dates
etcd 인증서
# etcd 클라이언트 인증서 확인 oc extract secret/etcd-client --keys=tls.crt --to=- -n openshift-apiserver | openssl x509 -noout -enddate # etcd 인증서 발급자 확인 oc get secret etcd-client -n openshift-etcd -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -noout -subject -issuer
Aggregated API 클라이언트 인증서
# Aggregated API 클라이언트 인증서 확인 oc get secret aggregator-client -n openshift-kube-apiserver -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -noout -dates
Machine Config Operator 인증서
# MCO 인증서 확인 (마스터/워커 노드 접속) openssl x509 -in /etc/kubernetes/kubelet-ca.crt -noout -enddate
Ingress 인증서
# Ingress Controller 확인 oc get ingresscontroller -n openshift-ingress-operator # 기본 Ingress 인증서 확인 oc get ingresscontroller default -n openshift-ingress-operator -o jsonpath='{.spec.defaultCertificate}' # Ingress 인증서 만료일 확인 oc extract secret/router-certs-default --keys=tls.crt --to=- -n openshift-ingress | openssl x509 -noout -enddate
모니터링 인증서
# 모니터링 관련 Secret 확인 oc get secrets -n openshift-monitoring | grep prometheus # Prometheus TLS 인증서 확인 oc extract secret/prometheus-k8s-tls --keys=tls.crt --to=- -n openshift-monitoring | openssl x509 -noout -enddate
OLM (Operator Lifecycle Manager) 인증서
# OLM 인증서 확인 oc get secret olm-operator-serving-cert -n openshift-operator-lifecycle-manager -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -noout -dates # pprof-cert 자동 갱신 모니터링 while [ True ] ; do oc -n openshift-operator-lifecycle-manager get secret pprof-cert -o jsonpath="{ .data.tls\.crt }" | base64 -d | openssl x509 -in - -text | grep "Not " ; sleep 900 ; done
미러 레지스트리 인증서
# 미러 레지스트리 인증서 확인 openssl s_client -connect registry.ocp.example.com:5000 -servername registry.ocp.example.com 2>/dev/null | grep NotAfter
OpenShift 인증서 날짜 확인이 왜 중요한가?
OpenShift 클러스터에서 인증서 관리는 단순히 보안을 위한 것이 아닙니다. 이는 클러스터의 가용성과 직결되는 핵심 운영 요소입니다.
1) 보안 측면에서의 중요성
인증서는 클러스터 내부와 외부 간의 모든 통신을 보호합니다. API 서버와의 통신, etcd 클러스터 간의 데이터 동기화, 서비스 메시 내부의 mTLS 통신 등 모든 보안 통신이 인증서에 의존합니다. 만료된 인증서는 즉시 보안 취약점으로 이어질 수 있으며, 악의적인 공격자가 이를 악용할 가능성이 있습니다.
2) 운영 연속성 측면에서의 중요성
더욱 심각한 것은 인증서 만료로 인한 서비스 중단입니다. OpenShift는 마이크로서비스 아키텍처를 기반으로 하므로, 하나의 인증서가 만료되더라도 연쇄적으로 여러 서비스에 영향을 미칠 수 있습니다. 특히 API 서버나 etcd 인증서가 만료되면 클러스터 전체가 사용 불가능한 상태가 될 수 있습니다.
3) 규정 준수 측면에서의 중요성
많은 기업 환경에서는 보안 정책상 인증서의 정기적인 갱신과 모니터링을 요구합니다. 인증서 만료일을 사전에 파악하고 관리하는 것은 이러한 규정 준수 요구사항을 충족하는 데 필수적입니다.
만료되면 어떤 문제가 터지나요?
인증서가 만료되었을 때 발생하는 문제들을 구체적인 인증서 종류별로 살펴보겠습니다.
1) API 서버 인증서 만료 시 문제점
API 서버 인증서가 만료되면 가장 치명적인 상황이 발생합니다.
- 클러스터 접근 불가 :
oc
명령어나 웹 콘솔을 통한 클러스터 접근이 완전히 차단됩니다. - 자동화 도구 실패 : CI/CD 파이프라인, 모니터링 시스템 등 API를 통해 클러스터와 상호작용하는 모든 도구가 작동을 멈춥니다.
- 운영자 개입 불가 : 문제 해결을 위한 클러스터 조작이 불가능해져 물리적 노드 접근이 필요할 수 있습니다.
2) etcd 인증서 만료 시 문제점
etcd는 클러스터의 모든 상태 정보를 저장하므로 그 인증서 만료는 매우 심각합니다.
- 클러스터 상태 동기화 실패 : etcd 클러스터 멤버 간 통신이 중단되어 데이터 일관성이 깨질 수 있습니다.
- 새로운 리소스 생성 불가 : 파드, 서비스 등 새로운 Kubernetes 리소스 생성이 불가능해집니다.
- 기존 워크로드 영향 : 기존에 실행 중인 애플리케이션도 스케일링이나 업데이트가 불가능해집니다.
3) Ingress Controller 인증서 만료 시 문제점
외부 트래픽 처리를 담당하는 Ingress Controller 인증서가 만료되면
- 외부 접근 차단 : 웹 애플리케이션이나 API 엔드포인트에 대한 외부 사용자 접근이 불가능해집니다.
- SSL/TLS 오류 : 브라우저에서 보안 경고가 표시되고 사용자가 서비스를 이용할 수 없습니다.
- 로드밸런서 상태 이상: 외부 로드밸런서의 헬스체크가 실패하여 트래픽 분산에 문제가 발생할 수 있습니다.
4) Ingress Controller 인증서 만료 시 문제점
외부 트래픽 처리를 담당하는 Ingress Controller 인증서가 만료되면
- 외부 접근 차단 : 웹 애플리케이션이나 API 엔드포인트에 대한 외부 사용자 접근이 불가능해집니다.
- SSL/TLS 오류 : 브라우저에서 보안 경고가 표시되고 사용자가 서비스를 이용할 수 없습니다.
- 로드밸런서 상태 이상: 외부 로드밸런서의 헬스체크가 실패하여 트래픽 분산에 문제가 발생할 수 있습니다.
5) 서비스 CA 인증서 만료 시 문제점
클러스터 내부 서비스 간 통신을 담당하는 서비스 CA 인증서가 만료되면
- 서비스 메시 통신 장애 : 마이크로서비스 간의 상호 인증이 실패하여 내부 API 호출이 차단됩니다.
- 모니터링 시스템 오류 : Prometheus, Grafana 등 모니터링 도구들이 메트릭을 수집할 수 없게 됩니다.
- 로깅 시스템 장애 : 로그 수집 및 전달 과정에서 인증 오류가 발생합니다.
6) 노드 인증서 만료 시 문제점
워커 노드의 kubelet 인증서가 만료되면
- 노드 격리 : 해당 노드가 클러스터에서 분리되어 NotReady 상태가 됩니다.
- 파드 스케줄링 실패 : 새로운 파드가 해당 노드에 스케줄링되지 않습니다.
- 기존 워크로드 중단 : 해당 노드에서 실행 중인 파드들이 비정상 종료될 수 있습니다.
수동 갱신이 필요한 인증서는 어떻게 갱신하나요?
OpenShift에서는 대부분의 인증서가 자동으로 갱신되지만, 일부 인증서는 수동 관리가 필요합니다. 이러한 인증서들을 효과적으로 관리하는 방법을 알아보겠습니다.
자동 갱신되는 인증서와 수동 관리 인증서 구분
먼저 어떤 인증서가 자동으로 갱신되고 어떤 것이 수동 관리가 필요한지 구분해야 합니다.
자동 갱신 인증서 (OpenShift 4.9 이후)
-
- etcd 클러스터 인증서
- 서비스 CA 인증서 (13개월 미만 남으면 자동 갱신)
- OpenShift 4.14.35 이후: 기본 Ingress Controller 인증서
수동 관리 필요 인증서
-
- 사용자가 제공한 Default Ingress 인증서
- 미러 레지스트리 인증서
- 외부 CA에서 발급받은 사용자 정의 인증서
사용자 정의 Ingress 인증서 갱신
Default Ingress Controller에 사용자 정의 인증서를 적용한 경우의 갱신 방법입니다.
1. 새 와일드카드 인증서 준비
# *.apps.ocp.example.com 도메인을 포함한 인증서
2. 현재 Ingress 인증서 백업
oc get secret router-certs-defaul -n openshift-ingress -o yaml > ingress-cert-backup.yaml
3. 새 인증서로 업데이트
oc create secret tls custom-ingress-cert --cert=new-ingress.crt --key=new-ingress.key -n openshift-ingress --dry-run=client -o yaml | oc replace -f -
4. ingress Controller 설정 확인
oc get ingresscontroller default -n openshift-ingress-operator -o yaml
미러 레지스트리 인증서 갱신
미러 레지스트리를 사용하는 환경에서 인증서를 갱신하는 방법입니다.
1. 미러 레지스트리 인증서 확인
oc get configmap registry-cas -n openshift-config -o yaml
2. 새 CA 인증서 준비
# 새로운 미러 레지스트리의 CA 인증서
3. ConfigMap 업데이트
oc patch configmap registry-cas -n openshift-config --patch='{"data":{"registry.example.com..5000":"새로운CA인증서내용"}}'
인증서 점검 자동화 스크립트
정기적인 인증서 점검을 위한 스크립트 예시입니다.
#!/bin/bash # 인증서 만료일 임계값 (일 단위) THRESHOLD_DAYS=30 # 주요 인증서 확인 및 알림 check_certificate() { local cert_name=$1 local cert_command=$2 echo "=== $cert_name 인증서 확인 ===" expiry_date=$(eval $cert_command | grep "notAfter" | cut -d= -f2) expiry_epoch=$(date -d "$expiry_date" +%s) current_epoch=$(date +%s) days_left=$(( (expiry_epoch - current_epoch) / 86400 )) echo "만료일: $expiry_date" echo "남은 일수: $days_left일" if [ $days_left -lt $THRESHOLD_DAYS ]; then echo "⚠️ 경고: $cert_name 인증서가 $days_left일 후 만료됩니다!" # 여기에 알림 로직 추가 (이메일, Slack 등) fi echo "" } # API 서버 인증서 확인 check_certificate "API Server" "openssl s_client -connect api.ocp.example.com:6443 -servername api.ocp.example.com 2>/dev/null | openssl x509 -noout -dates" # 서비스 CA 인증서 확인 check_certificate "Service CA" "oc get configmap openshift-service-ca.crt -n openshift-service-ca -o jsonpath='{.data.service-ca\.crt}' | openssl x509 -noout -dates" # Ingress 인증서 확인 check_certificate "Ingress" "oc extract secret/router-certs-default --keys=tls.crt --to=- -n openshift-ingress | openssl x509 -noout -dates"
모니터링 및 알림 설정
인증서 만료를 사전에 감지하기 위한 모니터링 설정도 중요합니다.
1. Prometheus 알림 규칙 설정
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: certificate-expiry-alerts namespace: openshift-monitoring spec: groups: - name: certificate-expiry rules: - alert: CertificateExpiringSoon expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30 for: 1h labels: severity: warning annotations: summary: "Certificate expiring soon" description: "Certificate for $labels.instance expires in less than 30 days"
2. 정기적인 점검 스케줄 설정
# crontab 설정 예시 0 9 * * 1 /path/to/certificate-check.sh
인증서 관리는 OpenShift 클러스터 운영에서 가장 중요하면서도 간과하기 쉬운 부분입니다. 정기적인 확인과 체계적인 갱신 프로세스를 통해 예기치 않은 서비스 중단을 예방할 수 있습니다. 특히 수동 관리가 필요한 인증서들은 달력에 미리 일정을 등록하여 갱신 시기를 놓치지 않도록 하는 것이 중요합니다.
맺음말(마무리)
OpenShift 인증서는 단순한 보안 수단이 아니라 클러스터의 안정성과 신뢰성을 지탱하는 핵심 요소입니다. 만료일을 놓치면 API 서버나 etcd 같은 주요 컴포넌트에 접근할 수 없게 되고, 이는 곧 서비스 전체 중단으로 이어질 수 있습니다.
기업 환경에서는 보안 규정 준수를 위해서도 인증서 관리가 필수적입니다. 단순히 만료 직전에 갱신하는 수준이 아니라, 정기 점검과 자동 알림 체계를 통해 사전 예방하는 것이 바람직합니다.
MSA 컨베이어 벨트 1Day 워크샵 소개
/카테고리: Seminar, 오픈나루 공지사항/작성자: 오픈마루 마케팅0[세미나] 복잡한 MSA, AI로 쉽게 해결할 수 있는 방법 공개!
/카테고리: Seminar, 오픈나루 공지사항/작성자: 오픈마루 마케팅0레드햇 Container Day 세미나 – 컨테이너와 AI 솔루션 소개
/카테고리: Red Hat, Seminar, Tech Talk/작성자: 오픈마루 마케팅3