OpenShift 인증서 날짜는 어떻게 확인할까요?

오늘은 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

Proxy 인증서

# Proxy TLS 인증서 확인
oc get secret proxy-tls -n openshift-machine-config-operator -o jsonpath='{.data.tls\.crt}' | base64 --decode | openssl x509 -noout -dates

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) 서비스 CA 인증서 만료 시 문제점

클러스터 내부 서비스 간 통신을 담당하는 서비스 CA 인증서가 만료되면

  • 서비스 메시 통신 장애 : 마이크로서비스 간의 상호 인증이 실패하여 내부 API 호출이 차단됩니다.
  • 모니터링 시스템 오류 : Prometheus, Grafana 등 모니터링 도구들이 메트릭을 수집할 수 없게 됩니다.
  • 로깅 시스템 장애 : 로그 수집 및 전달 과정에서 인증 오류가 발생합니다.

5) 노드 인증서 만료 시 문제점

워커 노드의 kubelet 인증서가 만료되면

  • 노드 격리 : 해당 노드가 클러스터에서 분리되어 NotReady 상태가 됩니다.
  • 파드 스케줄링 실패 : 새로운 파드가 해당 노드에 스케줄링되지 않습니다.
  • 기존 워크로드 중단 : 해당 노드에서 실행 중인 파드들이 비정상 종료될 수 있습니다.

OpenShift 인증서 종류별 상세 분석표


인증서 종류  주요 용도 중요도 갱신 방식 만료 시 영향 주요 유의사항
API Server 인증서 클러스터 API 통신 보안, 클라이언트-서버 간 인증 🔴 최고 자동 갱신 • 클러스터 완전 접근 불가
• oc 명령어 사용 불가
• 웹 콘솔 접근 차단
• CI/CD 파이프라인 중단
• 만료 전 30일 모니터링 필수
• 백업 접근 경로 준비
• 물리적 노드 접근 권한 확보
etcd 인증서 etcd 클러스터 간 통신, 데이터 동기화 🔴 최고 자동 갱신 (4.9+) • 클러스터 상태 동기화 실패
• 새 리소스 생성 불가
• 데이터 일관성 문제
• 스케일링/업데이트 불가
• etcd 백업 정기 수행
• 멤버 상태 지속 모니터링
• 복구 절차 사전 준비
Ingress Controller 인증서 외부 트래픽 처리, SSL/TLS 종단점 🟠 높음 자동 갱신 (4.14.35+)
사용자 정의 시 수동
• 외부 접근 완전 차단
• 웹 서비스 이용 불가
• SSL 보안 경고 발생
• 로드밸런서 헬스체크 실패
• 와일드카드 인증서 준비
• DNS 도메인 유효성 확인
• 갱신 후 배포 자동화
서비스 CA 인증서 클러스터 내부 서비스 간 mTLS 통신 🟠 높음 자동 갱신 (13개월 미만) • 서비스 메시 통신 장애
• 모니터링 시스템 오류
• 로깅 시스템 중단
• 내부 API 호출 실패
• 내부 서비스 의존성 파악
• 모니터링 도구 영향 평가
• 순차적 서비스 재시작 계획
노드 인증서 (kubelet) 워커 노드와 API 서버 간 통신 🟡 보통 자동 갱신 • 해당 노드 격리 (NotReady)
• 파드 스케줄링 제외
• 기존 워크로드 중단 위험
• 노드 리소스 활용 불가
• 노드별 개별 영향
• 워크로드 재분산 확인
• 노드 재부팅으로 해결 가능
부트스트랩 인증서 신규 노드 클러스터 가입 시 초기 인증 🟡 보통 자동 갱신 • 신규 노드 추가 불가
• 클러스터 확장 제약
• 기존 노드에는 영향 없음
• 클러스터 확장 계획 시 확인
• 노드 추가 작업 전 점검
Aggregated API 클라이언트 인증서 확장 API 서버와 메인 API 서버 간 통신 🟡 보통 자동 갱신 • 사용자 정의 리소스 접근 불가
• Operator 기능 제약
• 확장 API 서비스 중단
• 설치된 Operator 목록 확인
• CRD 의존성 파악
OLM 인증서 Operator 라이프사이클 관리 🟡 보통 자동 갱신 • Operator 설치/업데이트 불가
• OperatorHub 접근 제약
• 기존 Operator는 정상 동작
• Operator 업데이트 계획 확인
• 수동 설치 대안 준비
모니터링 인증서 (Prometheus/Grafana) 클러스터 모니터링 시스템 보안 🟢 낮음 자동 갱신 • 메트릭 수집 중단
• 대시보드 접근 불가
• 알림 기능 중단
• 외부 모니터링 시스템 연계
• 대안 모니터링 도구 준비
미러 레지스트리 인증서 컨테이너 이미지 저장소 보안 접근 🟠 높음 수동 갱신 필요 • 이미지 Pull 실패
• 새 파드 생성 불가
• 업데이트/배포 중단
• 수동 갱신 필수 • 갱신 일정 캘린더 등록 • 다운타임 스케줄링
사용자 정의 Ingress 인증서 사용자가 제공한 SSL/TLS 인증서 🟠 높음 수동 갱신 필요 • 해당 도메인 접근 불가
• 브라우저 보안 경고
• 사용자 서비스 중단
• 수동 갱신 필수 • 도메인 유효성 사전 확인 • 와일드카드 인증서 권장
Proxy 인증서 프록시 서버 TLS 통신 🟢 낮음 자동 갱신 • 프록시 통신 제약
• 네트워크 정책 영향
• 네트워크 구성 확인
• 프록시 사용 현황 파악

중요도 기준

  • 🔴 최고: 만료 시 클러스터 전체 장애 발생
  • 🟠 높음: 주요 서비스나 외부 접근에 심각한 영향
  • 🟡 보통: 특정 기능이나 구성요소에 제한적 영향
  • 🟢 낮음: 부가 기능이나 모니터링에 영향

인증서 관리 우선순위 권장사항

  • 최우선 모니터링 대상 (🔴): API Server, etcd
  • 정기 점검 필수 (🟠): Ingress, 서비스 CA, 미러 레지스트리
  • 수동 관리 필수: 미러 레지스트리, 사용자 정의 Ingress 인증서
  • 모니터링 알림 설정: 만료 30일 전 경고, 7일 전 긴급 알림

수동 갱신이 필요한 인증서는 어떻게 갱신하나요?


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 같은 주요 컴포넌트에 접근할 수 없게 되고, 이는 곧 서비스 전체 중단으로 이어질 수 있습니다. 

기업 환경에서는 보안 규정 준수를 위해서도 인증서 관리가 필수적입니다. 단순히 만료 직전에 갱신하는 수준이 아니라, 정기 점검과 자동 알림 체계를 통해 사전 예방하는 것이 바람직합니다.


충청도 소재 공공기관에서 진행된 클라우드 네이티브 세미나 발표자료 확인하세요

2023년 9월 충청 지역 클라우드 네이티브 세미나 자료 다운로드

2023년 8월 충청권 공공기관에서 진행된 찾아가는 클라우드 네이티브 세미나