Docker 레지스트리 SSL 인증서 확인 방법

DockerBeginner
지금 연습하기

소개

Docker 환경을 안전하게 유지하는 것은 매우 중요하며, Docker 레지스트리에서 사용되는 SSL 인증서를 확인하는 것은 이러한 보안을 유지하는 데 필수적인 단계입니다. 이 튜토리얼은 Docker 레지스트리에 대한 SSL 인증서를 확인하는 과정을 안내하여 안전한 통신을 보장하고 SSL 인증서 관련 문제를 해결하는 데 도움을 드립니다.

이 랩을 완료하면 Docker 가 SSL 인증서를 사용하는 방식을 이해하고, Docker 레지스트리에서 사용되는 인증서를 검사하고 확인할 수 있으며, 일반적인 인증서 문제를 처리하는 방법을 알게 될 것입니다.

Docker 레지스트리 SSL 인증서 이해

Docker 레지스트리는 Docker 이미지가 저장되고 배포되는 저장소입니다. 이러한 레지스트리는 Docker 클라이언트와 레지스트리 서버 간의 통신을 보호하기 위해 SSL/TLS 인증서를 사용합니다. 이러한 인증서가 무엇이며 왜 중요한지 알아보겠습니다.

SSL/TLS 인증서란 무엇인가요?

SSL/TLS 인증서는 다음과 같은 기능을 하는 디지털 문서입니다.

  • 클라이언트와 서버 간의 안전한 연결을 설정합니다.
  • 클라이언트와 서버 간에 전송되는 데이터를 암호화합니다.
  • 서버의 신원을 확인합니다.

Docker 레지스트리에 연결할 때 Docker 클라이언트는 레지스트리의 SSL 인증서를 확인하여 연결이 안전하고 합법적인 레지스트리에 연결하고 있는지 확인합니다.

OpenSSL 로 인증서 정보 검사

SSL 인증서 작업을 위한 강력한 도구인 OpenSSL 을 사용하여 인증서 정보를 확인하는 방법을 살펴보겠습니다.

먼저, 랩 작업을 위한 디렉토리를 생성해 보겠습니다.

mkdir -p ~/project/ssl-lab
cd ~/project/ssl-lab

이제 일반적인 Docker 레지스트리인 Docker Hub 의 SSL 인증서를 확인해 보겠습니다.

openssl s_client -connect hub.docker.com:443 -showcerts < /dev/null

이 명령은 Docker Hub 에 연결하여 SSL 인증서에 대한 정보를 표시합니다. 출력에는 다음을 포함한 많은 정보가 표시됩니다.

  • 인증서 체인
  • 발급자 정보
  • 인증서 유효 기간
  • 공개 키

좀 더 읽기 쉬운 형식으로 인증서 정보만 추출해 보겠습니다.

echo | openssl s_client -connect hub.docker.com:443 2> /dev/null | openssl x509 -text -noout | head -20

이 명령은 인증서 세부 정보의 처음 20 줄을 표시하며, 여기에는 다음과 같은 중요한 정보가 포함됩니다.

  • 버전
  • 일련 번호
  • 서명 알고리즘
  • 발급자 (인증 기관)
  • 유효 기간
  • 주체 (인증서 소유자)

이 정보를 이해하는 것이 인증서의 진위 여부를 확인하는 첫 번째 단계입니다.

Docker CLI 를 사용하여 레지스트리 SSL 인증서 확인

이제 SSL 인증서의 기본 사항을 이해했으므로 Docker CLI 를 사용하여 Docker 레지스트리에 대한 인증서를 확인하는 방법을 알아보겠습니다.

docker info 를 사용하여 레지스트리 구성 확인

Docker CLI 는 인증서 설정을 포함하여 레지스트리 구성을 검사하는 도구를 제공합니다.

Docker 가 인식하는 현재 레지스트리 구성을 확인해 보겠습니다.

docker info --format '{{json .RegistryConfig.IndexConfigs}}' | python3 -m json.tool

이 명령은 Docker 데몬이 알고 있는 모든 레지스트리에 대한 구성 세부 정보를 읽기 쉬운 JSON 구조로 출력합니다. 기본적으로 Docker Hub (index.docker.io) 가 구성되어 있음을 알 수 있습니다.

레지스트리에 대한 연결 테스트

Docker Hub 에 연결하여 인증서를 확인해 보겠습니다.

docker login

프롬프트가 표시되면 실제로 로그인하는 것이 아니라 연결을 테스트하는 것이므로 Ctrl+C 를 눌러 로그인을 취소할 수 있습니다.

Docker 클라이언트는 로그인 프로세스 중에 자동으로 레지스트리의 SSL 인증서를 확인합니다. 인증서가 유효하면 로그인 프롬프트가 표시됩니다. 그렇지 않으면 Docker 가 오류 메시지를 표시합니다.

특정 레지스트리를 확인하는 파일 생성

특정 레지스트리에 대한 인증서를 보다 철저하게 확인하는 스크립트를 만들어 보겠습니다.

cat > check_registry_cert.sh << 'EOF'
#!/bin/bash

REGISTRY=${1:-"hub.docker.com"}
PORT=${2:-"443"}

echo "Checking certificate for $REGISTRY:$PORT..."
echo | openssl s_client -connect $REGISTRY:$PORT 2>/dev/null | openssl x509 -noout -dates -issuer -subject

echo -e "\nVerifying certificate chain..."
openssl s_client -connect $REGISTRY:$PORT -showcerts </dev/null 2>/dev/null | grep -A 1 "Certificate chain"
EOF

이제 스크립트를 실행 가능하게 만듭니다.

chmod +x check_registry_cert.sh

Docker Hub 의 인증서를 확인하기 위해 실행해 보겠습니다.

./check_registry_cert.sh

다음과 같은 출력이 표시됩니다.

  • 인증서가 발급된 시점과 만료되는 시점
  • 인증서를 발급한 사람
  • 인증서 소유자
  • 인증서 체인에 대한 정보

다른 레지스트리인 Microsoft 의 컨테이너 레지스트리에 대한 인증서도 확인해 보겠습니다.

./check_registry_cert.sh mcr.microsoft.com

출력을 비교하여 레지스트리 간에 인증서가 어떻게 다를 수 있는지 확인하십시오.

SSL 인증서 문제 해결

적절한 확인 프로세스를 거치더라도 Docker 레지스트리를 사용할 때 SSL 인증서 문제가 발생할 수 있습니다. 가장 일반적인 문제를 식별하고 해결하는 방법을 알아보겠습니다.

일반적인 SSL 인증서 문제

가장 빈번한 SSL 인증서 문제는 다음과 같습니다.

  1. 자체 서명된 인증서
  2. 만료된 인증서
  3. 인증서 호스트 이름 불일치
  4. 신뢰할 수 없는 인증 기관

이러한 문제를 시뮬레이션하고 해결하기 위해 디렉토리를 만들어 보겠습니다.

mkdir -p ~/project/ssl-lab/troubleshooting
cd ~/project/ssl-lab/troubleshooting

테스트 자체 서명된 인증서 생성

먼저, 자체 서명된 인증서를 생성하여 처리하는 방법을 이해해 보겠습니다.

openssl req -newkey rsa:2048 -nodes -keyout registry.key -x509 -days 365 -out registry.crt -subj "/CN=registry.example.com"

이 명령은 다음을 생성합니다.

  • 개인 키 (registry.key)
  • 365 일 동안 유효한 자체 서명된 인증서 (registry.crt)

자체 서명된 인증서를 검사해 보겠습니다.

openssl x509 -in registry.crt -text -noout | grep -E "Issuer|Subject|Not"

자체 서명된 인증서에서는 인증서가 자체 서명되었으므로 발급자 (Issuer) 와 주체 (Subject) 가 동일합니다.

Docker 가 자체 서명된 인증서를 신뢰하도록 구성

Docker 가 자체 서명된 인증서를 신뢰하도록 하려면 일반적으로 Docker 인증서 디렉토리에 추가합니다. 필요한 디렉토리 구조를 만들어 보겠습니다.

sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000
sudo cp registry.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt

인증서를 추가한 후에는 일반적으로 Docker 를 다시 시작합니다.

## 이 랩에서는 실제로 Docker를 다시 시작하지 않습니다.
echo "실제 환경에서는: sudo systemctl restart docker를 실행합니다."

만료된 인증서 처리

과거 만료 날짜가 있는 인증서를 생성하여 만료된 인증서 확인을 시뮬레이션해 보겠습니다.

openssl req -newkey rsa:2048 -nodes -keyout expired.key -x509 -days -30 -out expired.crt -subj "/CN=expired.example.com"

이제 만료된 인증서를 검사해 보겠습니다.

openssl x509 -in expired.crt -text -noout | grep -E "Issuer|Subject|Not"

"Not After" 날짜가 과거에 있음을 알 수 있으며, 이는 인증서가 만료되었음을 의미합니다.

안전하지 않은 레지스트리 구성

경우에 따라 인증서 문제가 있는 레지스트리를 사용해야 할 수 있습니다. Docker 를 사용하면 특정 레지스트리를 "안전하지 않음 (insecure)"으로 표시할 수 있습니다.

cat > daemon.json << 'EOF'
{
  "insecure-registries": [
    "registry.example.com:5000",
    "expired.example.com:5000"
  ]
}
EOF

echo "실제 환경에서는 이 파일을 /etc/docker/daemon.json에 배치합니다."
cat daemon.json

이 구성은 Docker 에게 이러한 레지스트리에 대한 인증서 확인을 건너뛰도록 지시합니다. 이는 테스트 환경에 유용할 수 있지만 프로덕션 환경에서는 피해야 합니다.

인증서 만료를 확인하는 스크립트

인증서가 만료될 예정인지 확인하는 유용한 스크립트를 만들어 보겠습니다.

cat > check_expiration.sh << 'EOF'
#!/bin/bash

CERT_FILE=$1
DAYS_WARNING=${2:-30}

if [ ! -f "$CERT_FILE" ]; then
    echo "Certificate file not found: $CERT_FILE"
    exit 1
fi

## Get expiration date in seconds since epoch
EXPIRY=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
EXPIRY_SECONDS=$(date -d "$EXPIRY" +%s)
NOW_SECONDS=$(date +%s)
SECONDS_LEFT=$((EXPIRY_SECONDS - NOW_SECONDS))
DAYS_LEFT=$((SECONDS_LEFT / 86400))

echo "Certificate: $CERT_FILE"
echo "Expires on: $EXPIRY"
echo "Days remaining: $DAYS_LEFT"

if [ $DAYS_LEFT -lt 0 ]; then
    echo "CRITICAL: Certificate has EXPIRED!"
    exit 2
elif [ $DAYS_LEFT -lt $DAYS_WARNING ]; then
    echo "WARNING: Certificate will expire in less than $DAYS_WARNING days!"
    exit 1
else
    echo "OK: Certificate is valid for more than $DAYS_WARNING days."
    exit 0
fi
EOF

chmod +x check_expiration.sh

두 인증서로 스크립트를 테스트해 보겠습니다.

./check_expiration.sh registry.crt
./check_expiration.sh expired.crt

스크립트가 유효한 인증서와 만료된 인증서를 올바르게 식별하는 것을 볼 수 있습니다.

Docker 레지스트리 SSL 인증서 모범 사례

이제 SSL 인증서를 확인하고 문제 해결하는 방법을 이해했으므로 Docker 레지스트리에서 인증서를 관리하기 위한 모범 사례를 살펴보겠습니다.

인증서 확인 자동화

예기치 않은 오류를 방지하려면 인증서를 정기적으로 확인하는 것이 중요합니다. 정기적으로 실행되도록 예약할 수 있는 스크립트를 만들어 보겠습니다.

cd ~/project/ssl-lab
cat > monitor_registry_certs.sh << 'EOF'
#!/bin/bash

## List of registries to check
REGISTRIES=(
  "hub.docker.com"
  "mcr.microsoft.com"
  "registry.k8s.io"
  "quay.io"
)

echo "========================================"
echo "Docker Registry Certificate Monitor"
echo "========================================"
echo "Date: $(date)"
echo ""

for registry in "${REGISTRIES[@]}"; do
  echo "Checking $registry..."
  CERT_INFO=$(echo | openssl s_client -connect $registry:443 2>/dev/null | openssl x509 -noout -dates -issuer -subject 2>/dev/null)
  
  if [ -z "$CERT_INFO" ]; then
    echo "ERROR: Could not retrieve certificate for $registry"
  else
    echo "$CERT_INFO"
    
    ## Extract expiry date
    EXPIRY=$(echo "$CERT_INFO" | grep "notAfter" | cut -d= -f2)
    EXPIRY_SECONDS=$(date -d "$EXPIRY" +%s)
    NOW_SECONDS=$(date +%s)
    DAYS_LEFT=$(( (EXPIRY_SECONDS - NOW_SECONDS) / 86400 ))
    
    echo "Days until expiry: $DAYS_LEFT"
    
    if [ $DAYS_LEFT -lt 30 ]; then
      echo "WARNING: Certificate will expire in less than 30 days!"
    fi
  fi
  echo "----------------------------------------"
done
EOF

chmod +x monitor_registry_certs.sh

스크립트를 실행하여 작동 방식을 확인해 보겠습니다.

./monitor_registry_certs.sh

이 스크립트는 여러 레지스트리를 확인하고 인증서가 만료될 경우 경고합니다. 이는 예기치 않은 가동 중단을 방지하는 데 매우 중요합니다.

인증서 관리 모범 사례

Docker 레지스트리 인증서 관리에 대한 모범 사례를 설명하는 문서를 만들어 보겠습니다.

cat > certificate_best_practices.md << 'EOF'
## Docker Registry Certificate Management Best Practices

### Certificate Procurement
- Use certificates from trusted Certificate Authorities for production environments
- Use appropriate certificate types (DV, OV, or EV based on needs)
- Ensure certificates match the exact domain names used to access registries
- Consider wildcard certificates for multiple subdomains
- Use appropriate key lengths (minimum 2048 bits for RSA)

### Certificate Deployment
- Store certificates securely
- Use proper file permissions (readable only by the Docker daemon)
- Back up certificates and private keys securely
- Implement proper certificate rotation procedures
- Keep certificate paths consistent across all nodes in a cluster

### Monitoring and Maintenance
- Set up alerts for certificates nearing expiration (at least 30 days in advance)
- Maintain an inventory of all certificates in use
- Document renewal procedures
- Test certificate renewals in a staging environment before production
- Automate certificate renewal where possible (using tools like certbot)

### Security Considerations
- Never use insecure registries in production environments
- Avoid using self-signed certificates in production
- Implement proper certificate revocation procedures
- Regularly audit certificate usage and permissions
- Keep the CA bundle updated on all systems
EOF

cat certificate_best_practices.md

보안 레지스트리 구성을 위한 구성 템플릿 생성

마지막으로, 보안 Docker 레지스트리 구성을 위한 템플릿을 만들어 보겠습니다.

cat > secure_registry_config.yml << 'EOF'
version: '3'

services:
  registry:
    image: registry:2
    ports:
      - 5000:5000
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      ## Additional security settings
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
      REGISTRY_HTTP_HEADERS_X_CONTENT_TYPE_OPTIONS: nosniff
      REGISTRY_HTTP_HEADERS_X_FRAME_OPTIONS: DENY
    volumes:
      - ./certs:/certs
      - ./data:/var/lib/registry
    restart: always
    
  ## Optional: Add a UI for your registry
  registry-ui:
    image: joxit/docker-registry-ui:latest
    ports:
      - 8080:80
    environment:
      - REGISTRY_URL=https://registry:5000
      - REGISTRY_TITLE=Secure Docker Registry
      - SINGLE_REGISTRY=true
    depends_on:
      - registry
EOF

cat secure_registry_config.yml

이 구성은 적절한 SSL 인증서 구성으로 보안 Docker 레지스트리를 실행하기 위한 템플릿을 제공합니다.

SSL 인증서 관리 단계 요약

Docker 를 사용한 SSL 인증서 관리에 대한 빠른 참조를 만들어 보겠습니다.

cat > ssl_management_summary.txt << 'EOF'
## Docker Registry SSL Certificate Management Summary

1. VERIFY a registry's certificate:
   openssl s_client -connect registry.example.com:443 -showcerts </dev/null

2. ADD a custom certificate for a registry:
   sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000
   sudo cp registry.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt
   sudo systemctl restart docker

3. CONFIGURE an insecure registry (development only):
   Add to /etc/docker/daemon.json:
   { "insecure-registries": ["registry.example.com:5000"] }
   sudo systemctl restart docker

4. CHECK expiration dates regularly:
   openssl x509 -in certificate.crt -noout -dates

5. AUTOMATE certificate monitoring:
   Create and schedule scripts to check certificates regularly
EOF

cat ssl_management_summary.txt

이 요약은 Docker 레지스트리 SSL 인증서와 관련된 가장 일반적인 작업에 대한 빠른 참조 역할을 합니다.

요약

이 랩에서는 Docker 레지스트리에 대한 SSL 인증서를 확인하고 관리하는 방법을 배웠습니다. 이제 다음을 수행할 수 있는 지식과 도구를 갖추게 되었습니다.

  • SSL 인증서가 무엇이며 Docker 레지스트리 보안에 왜 중요한지 이해
  • OpenSSL 및 Docker CLI 명령을 사용하여 SSL 인증서 확인
  • 만료된 인증서 및 자체 서명된 인증서와 같은 일반적인 인증서 문제 해결
  • 인증서 관리에 대한 모범 사례 구현
  • 다양한 인증서 시나리오에서 작동하도록 Docker 구성
  • 예기치 않은 오류를 방지하기 위해 인증서 모니터링 자동화

이러한 기술은 보안이 가장 중요한 프로덕션 환경에서 특히 안전한 Docker 환경을 유지하는 데 매우 중요합니다. Docker 레지스트리 SSL 인증서를 정기적으로 확인하고 적절하게 관리함으로써 보안 취약점을 방지하고 컨테이너화된 애플리케이션의 원활한 운영을 보장할 수 있습니다.