Data Engineering/s3 minio

EP08 [ MinIO S3 + Cilium 기초 과정 ] MinIO 기본 설치 및 관리 #5 | MinIO 접근 키 관리 - 보안 자격 증명 관리 베스트 프랙티스

ygtoken 2025. 3. 28. 14:48
728x90

이 글에서는 MinIO 환경에서 접근 키를 관리하는 방법과 보안 자격 증명에 대한 베스트 프랙티스를 알아보겠습니다. 쿠버네티스 환경에서 MinIO의 접근 키를 안전하게 생성, 관리, 교체하는 방법부터 보안을 강화하는 기법까지 자세히 살펴보겠습니다.


📌 MinIO 접근 키의 이해

MinIO 접근 자격 증명 소개

MinIO는 S3 호환 스토리지로 다음과 같은 접근 자격 증명 시스템을 사용합니다:

  • 액세스 키(Access Key): 사용자 ID 역할, 공개적으로 노출되어도 괜찮음
  • 시크릿 키(Secret Key): 비밀번호 역할, 절대 노출되어서는 안 됨
  • 정책(Policy): 사용자에게 부여되는 권한 규칙 집합

이러한 자격 증명 시스템은 AWS S3의 IAM 시스템과 유사하게 작동합니다.

MinIO 사용자 유형

MinIO에는 두 가지 주요 사용자 유형이 있습니다:

  • 루트 사용자: 시스템 관리 권한을 가진 초기 사용자 (minioadmin)
  • 일반 사용자: 특정 권한만 부여된 추가 사용자

쿠버네티스와 MinIO 자격 증명 관계

쿠버네티스 환경에서 MinIO 자격 증명은 다음과 같이 관리됩니다:

  • 쿠버네티스 시크릿으로 저장 및 관리
  • StatefulSet 환경 변수로 주입
  • 애플리케이션 포드에 마운트하여 사용

📌 루트 자격 증명 관리

초기 루트 자격 증명 이해

MinIO가 처음 배포될 때 기본 루트 자격 증명이 설정됩니다:

apiVersion: v1                      # 쿠버네티스 코어 API 버전
kind: Secret                        # 시크릿 리소스 유형 정의
metadata:
  name: minio-auth                  # 시크릿 이름: minio-auth로 식별
  namespace: minio-system           # minio-system 네임스페이스에 시크릿 생성
type: Opaque                        # 일반적인 키-값 쌍을 저장하는 Opaque 타입 시크릿
data:
  accesskey: bWluaW9hZG1pbg==       # 'minioadmin'을 base64로 인코딩한 값 (기본 액세스 키)
  secretkey: bWluaW9hZG1pbg==       # 'minioadmin'을 base64로 인코딩한 값 (기본 시크릿 키)

 

안전한 루트 자격 증명 설정

프로덕션 환경에서는 기본 자격 증명을 변경해야 합니다:

# 새로운 자격 증명 생성 및 base64 인코딩
ACCESS_KEY=$(openssl rand -hex 8)
SECRET_KEY=$(openssl rand -hex 32)
ENCODED_ACCESS=$(echo -n "$ACCESS_KEY" | base64)
ENCODED_SECRET=$(echo -n "$SECRET_KEY" | base64)

# 새 자격 증명으로 시크릿 YAML 생성
cat > secure-minio-auth.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: minio-auth
  namespace: minio-system
type: Opaque
data:
  accesskey: $ENCODED_ACCESS
  secretkey: $ENCODED_SECRET
EOF

# 시크릿 적용
kubectl apply -f secure-minio-auth.yaml

StatefulSet에 자격 증명 연결

MinIO StatefulSet에 새 자격 증명을 연결하는 방법:

apiVersion: apps/v1                     # 쿠버네티스 앱 API 버전
kind: StatefulSet                       # StatefulSet 유형 지정
metadata:
  name: minio                           # StatefulSet 이름
  namespace: minio-system               # minio-system 네임스페이스에 생성
spec:
  # ... 다른 StatefulSet 스펙 ...
  template:
    spec:
      containers:
      - name: minio                     # MinIO 컨테이너 이름
        image: minio/minio:latest       # MinIO 이미지 버전
        # ... 다른 컨테이너 설정 ...
        env:
        - name: MINIO_ROOT_USER         # MinIO 루트 사용자 환경변수
          valueFrom:
            secretKeyRef:
              name: minio-auth          # 시크릿 이름 참조
              key: accesskey            # 시크릿 내 액세스 키 필드 참조
        - name: MINIO_ROOT_PASSWORD     # MinIO 루트 비밀번호 환경변수
          valueFrom:
            secretKeyRef:
              name: minio-auth          # 시크릿 이름 참조
              key: secretkey            # 시크릿 내 시크릿 키 필드 참조

 

자격 증명 교체 프로세스

루트 자격 증명 교체 방법:

  1. 새 시크릿 생성:
  2. # 새 자격 증명으로 시크릿 생성 kubectl create secret generic minio-auth-new \ --from-literal=accesskey=$(openssl rand -hex 8) \ --from-literal=secretkey=$(openssl rand -hex 32) \ --namespace minio-system
  3. StatefulSet 업데이트:
  4. # StatefulSet 편집 kubectl edit statefulset minio -n minio-system # 시크릿 참조를 minio-auth에서 minio-auth-new로 변경
  5. 포드 재시작:
  6. # StatefulSet 포드 롤링 재시작 적용 kubectl rollout restart statefulset minio -n minio-system

📌 추가 사용자 및 정책 관리

새 사용자 생성 및 관리

MinIO에서 추가 사용자를 생성하고 관리하는 방법:

# MinIO 클라이언트 설정 (EP07에서 다룬 내용)
mc alias set minio-kube http://<노드IP>:30900 "$ROOT_ACCESS_KEY" "$ROOT_SECRET_KEY"

# 새 사용자 생성
mc admin user add minio-kube app-user "$APP_ACCESS_KEY" "$APP_SECRET_KEY"

# 사용자 목록 확인
mc admin user list minio-kube

# 사용자 비활성화
mc admin user disable minio-kube app-user

# 사용자 활성화
mc admin user enable minio-kube app-user

 

사용자 정책 생성 및 적용

사용자에게 특정 권한을 부여하는 정책 관리:

# 읽기 전용 정책 JSON 파일 생성
cat > readonly-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}
EOF

# 정책 추가
mc admin policy add minio-kube readonly-policy readonly-policy.json

# 사용자에게 정책 할당
mc admin policy set minio-kube readonly-policy user=app-user

# 정책 목록 확인
mc admin policy list minio-kube

 

버킷 특화 정책 예시

특정 버킷에만 접근 권한을 주는 정책:

# 특정 버킷에 대한 읽기/쓰기 정책
cat > app-bucket-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::app-bucket",
        "arn:aws:s3:::app-bucket/*"
      ]
    }
  ]
}
EOF

# 정책 추가 및 사용자에게 적용
mc admin policy add minio-kube app-bucket-policy app-bucket-policy.json
mc admin policy set minio-kube app-bucket-policy user=app-user

📌 애플리케이션을 위한, 자격 증명 관리

쿠버네티스 시크릿으로 자격 증명 저장

애플리케이션용 MinIO 자격 증명을 쿠버네티스 시크릿으로 관리:

apiVersion: v1                            # 쿠버네티스 코어 API 버전
kind: Secret                              # 시크릿 리소스 유형 정의
metadata: 
  name: app-minio-creds                   # 애플리케이션용 MinIO 자격 증명 시크릿 이름
  namespace: default                      # 애플리케이션이 위치한 네임스페이스
type: Opaque                              # 일반적인 키-값 쌍을 저장하는 Opaque 타입
data:
  access_key: QUtJQUlPU0ZPRE5OTkVYQU1QTEU=  # 애플리케이션용 액세스 키 (base64 인코딩)
  secret_key: d0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWQ==  # 시크릿 키 (base64 인코딩)
  endpoint: aHR0cDovL21pbmlvLWFwaS5taW5pby1zeXN0ZW0uc3ZjLmNsdXN0ZXIubG9jYWw6OTAwMA==  # 엔드포인트 (base64 인코딩)

 

환경 변수로 자격 증명 주입

애플리케이션 포드에 자격 증명 환경 변수 주입:

apiVersion: apps/v1                     # 쿠버네티스 앱 API 버전
kind: Deployment                        # Deployment 리소스 유형 정의
metadata:
  name: app-deployment                  # 애플리케이션 배포 이름
  namespace: default                    # 기본 네임스페이스에 배포
spec:
  replicas: 2                           # 2개의 복제본 실행
  selector:
    matchLabels:
      app: my-app                       # app=my-app 라벨을 가진 포드 선택
  template:
    metadata:
      labels:
        app: my-app                     # 포드에 app=my-app 라벨 적용
    spec:
      containers:
      - name: app-container             # 컨테이너 이름
        image: my-app:1.0               # 애플리케이션 이미지
        env:
        - name: MINIO_ACCESS_KEY        # 환경 변수 이름: MinIO 액세스 키
          valueFrom:
            secretKeyRef:
              name: app-minio-creds     # 시크릿 이름 참조
              key: access_key           # 시크릿 내 액세스 키 필드 참조
        - name: MINIO_SECRET_KEY        # 환경 변수 이름: MinIO 시크릿 키
          valueFrom:
            secretKeyRef:
              name: app-minio-creds     # 시크릿 이름 참조
              key: secret_key           # 시크릿 내 시크릿 키 필드 참조
        - name: MINIO_ENDPOINT          # 환경 변수 이름: MinIO 엔드포인트
          valueFrom:
            secretKeyRef:
              name: app-minio-creds     # 시크릿 이름 참조
              key: endpoint             # 시크릿 내 엔드포인트 필드 참조

 

볼륨 마운트로 자격 증명 주입

파일 기반 자격 증명을 위한 볼륨 마운트 방식:

apiVersion: apps/v1                     # 쿠버네티스 앱 API 버전
kind: Deployment                        # Deployment 리소스 유형
metadata:
  name: app-deployment                  # 배포 이름
  namespace: default                    # 기본 네임스페이스에 배포
spec:
  # ... 다른 Deployment 스펙 ...
  template:
    spec:
      containers:
      - name: app-container             # 컨테이너 이름
        # ... 다른 컨테이너 설정 ...
        volumeMounts:
        - name: minio-config            # 마운트할 볼륨 이름
          mountPath: /app/config        # 컨테이너 내 마운트 경로
          readOnly: true                # 읽기 전용으로 마운트
      volumes:
      - name: minio-config              # 볼륨 이름 정의
        secret:
          secretName: app-minio-creds   # 사용할 시크릿 이름
          items:
          - key: access_key             # 시크릿 내 키
            path: access_key            # 파일 경로
          - key: secret_key             # 시크릿 내 키
            path: secret_key            # 파일 경로
          - key: endpoint               # 시크릿 내 키
            path: endpoint              # 파일 경로

 

CloudNative Secret Store 연동

외부 시크릿 저장소 연동 방법:

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1  # CSI 시크릿 스토어 API 버전
kind: SecretProviderClass                         # 시크릿 제공자 클래스 리소스 타입
metadata:
  name: minio-secrets-provider                    # 시크릿 제공자 이름
  namespace: default                              # 기본 네임스페이스에 생성
spec:
  provider: vault                                 # Vault를 시크릿 제공자로 사용
  parameters:
    roleName: "k8s-app"                           # Vault 역할 이름
    vaultAddress: "http://vault.vault.svc.cluster.local:8200"  # Vault 서버 주소
    objects: |
      - objectName: "access_key"                  # 객체 이름
        secretPath: "secret/data/minio"           # Vault 내 시크릿 경로
        secretKey: "access_key"                   # Vault 내 시크릿 키
      - objectName: "secret_key"                  # 객체 이름
        secretPath: "secret/data/minio"           # Vault 내 시크릿 경로
        secretKey: "secret_key"                   # Vault 내 시크릿 키

📌 보안 자격 증명 관리 베스트 프랙티스

자격 증명 보안 강화 방법

MinIO 자격 증명 보안을 위한 모범 사례:

  1. 강력한 자격 증명 생성
  2. # 암호학적으로 안전한 난수 생성 ACCESS_KEY=$(openssl rand -hex 8) # 16자 랜덤 액세스 키 생성 (8바이트 16진수) SECRET_KEY=$(openssl rand -hex 32) # 64자 랜덤 시크릿 키 생성 (32바이트 16진수)
  3. 최소 권한 원칙 적용
  4. { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], // 필요한 권한만 명시적 허용 "Resource": ["arn:aws:s3:::app-bucket/logs/*"], // 필요한 리소스만 명시적 지정 "Condition": { "IpAddress": { // IP 기반 접근 제한 추가 "aws:SourceIp": ["10.0.0.0/16"] } } } ] }
  5. 사용자 계정 전용 정책
  6. # 애플리케이션별 전용 사용자와 정책 생성 mc admin user add minio-kube app1-user "$APP1_ACCESS" "$APP1_SECRET" mc admin policy add minio-kube app1-policy app1-policy.json mc admin policy set minio-kube app1-policy user=app1-user

자격 증명 교체 전략

정기적인 자격 증명 교체를 위한 전략:

  1. 정기적인 교체 일정 수립
    • 루트 자격 증명: 분기별
    • 애플리케이션 자격 증명: 월별
    • 임시 자격 증명: 최대 24시간
  2. 점진적 교체 과정
  3. # 1. 새 사용자/자격 증명 생성 mc admin user add minio-kube app-user-new "$NEW_ACCESS" "$NEW_SECRET" # 2. 새 사용자에게 동일한 정책 적용 mc admin policy set minio-kube app-policy user=app-user-new # 3. 애플리케이션 구성 업데이트 kubectl patch secret app-minio-creds -p \ '{"data":{"access_key":"'$(echo -n "$NEW_ACCESS" | base64)'","secret_key":"'$(echo -n "$NEW_SECRET" | base64)'"}}' # 4. 애플리케이션 재시작 kubectl rollout restart deployment app-deployment # 5. 이전 사용자 비활성화 (테스트 후) mc admin user disable minio-kube app-user

감사와 모니터링

자격 증명 사용 감사:

# MinIO 감사 로깅 활성화
mc admin config set minio-kube audit enable=on

# 최근 이벤트 확인
mc admin trace minio-kube

# 사용자별 활동 추적
mc admin trace minio-kube --filter user=app-user

📌 쿠버네티스 환경에서의 자동화된 자격 증명 관리

GitOps를 통한 자격 증명 관리

GitOps 접근 방식으로 자격 증명 관리:

apiVersion: v1                      # 쿠버네티스 코어 API 버전
kind: Secret                        # 시크릿 리소스 유형
metadata:
  name: minio-auth                  # 시크릿 이름
  namespace: minio-system           # minio-system 네임스페이스에 생성
  annotations:
    argocd.argoproj.io/sync-wave: "1"  # Argo CD 동기화 순서 지정 (먼저 적용)
    sealed-secrets.bitnami.com/managed: "true"  # Sealed Secrets로 관리됨을 표시
type: Opaque                        # 일반적인 키-값 쌍을 저장하는 Opaque 타입
# 실제 값은 GitOps 도구가 관리
data: {}                            # 값은 GitOps 배포 과정에서 주입

 

자격 증명 교체 자동화

쿠버네티스 CronJob을 사용한 자격 증명 교체 자동화:

apiVersion: batch/v1                # 쿠버네티스 배치 API 버전
kind: CronJob                       # CronJob 리소스 유형
metadata:
  name: minio-cred-rotation         # CronJob 이름
  namespace: minio-system           # minio-system 네임스페이스에 생성
spec:
  schedule: "0 0 1 * *"             # 매월 1일 자정에 실행 (cron 표현식)
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: minio-admin  # 필요한 권한을 가진 서비스 계정
          containers:
          - name: cred-rotation           # 컨테이너 이름
            image: bitnami/kubectl:latest # kubectl이 포함된 이미지
            command:
            - /bin/bash
            - -c
            - |
              # 새 자격 증명 생성 및 시크릿 업데이트 스크립트
              ACCESS_KEY=$(openssl rand -hex 8)
              SECRET_KEY=$(openssl rand -hex 32)
              ENCODED_ACCESS=$(echo -n "$ACCESS_KEY" | base64)
              ENCODED_SECRET=$(echo -n "$SECRET_KEY" | base64)

              # 시크릿 업데이트
              kubectl patch secret app-minio-creds -n default -p \
                '{"data":{"access_key":"'$ENCODED_ACCESS'","secret_key":"'$ENCODED_SECRET'"}}'

              # 애플리케이션 재시작
              kubectl rollout restart deployment app-deployment -n default
          restartPolicy: OnFailure

 

비상 자격 증명 접근 제어

루트 자격 증명에 대한 비상 접근 관리:

apiVersion: rbac.authorization.k8s.io/v1  # 쿠버네티스 RBAC API 버전
kind: Role                                # Role 리소스 유형
metadata:
  name: minio-emergency-access            # 역할 이름
  namespace: minio-system                 # minio-system 네임스페이스에 생성
rules:
- apiGroups: [""]                         # API 그룹
  resources: ["secrets"]                  # 접근할 리소스 유형
  resourceNames: ["minio-auth"]           # 특정 리소스 이름 제한
  verbs: ["get"]                          # 허용할 동작 (get만 허용)
---
apiVersion: rbac.authorization.k8s.io/v1  # 쿠버네티스 RBAC API 버전
kind: RoleBinding                         # RoleBinding 리소스 유형
metadata:
  name: emergency-access-binding          # 바인딩 이름
  namespace: minio-system                 # minio-system 네임스페이스에 생성
subjects:
- kind: Group                             # 그룹 유형 주체
  name: emergency-admins                  # 그룹 이름
  apiGroup: rbac.authorization.k8s.io     # API 그룹
roleRef:
  kind: Role                              # 참조할 역할 종류
  name: minio-emergency-access            # 연결할 역할 이름
  apiGroup: rbac.authorization.k8s.io     # API 그룹

📌 다양한 인증 통합 방법

LDAP 통합

기업 디렉토리와 MinIO 통합:

# LDAP 설정을 위한 환경 변수
export MINIO_IDENTITY_LDAP_SERVER_ADDR="ldap.example.com:636"
export MINIO_IDENTITY_LDAP_USERNAME_FORMAT="uid={username},cn=users,dc=example,dc=com"
export MINIO_IDENTITY_LDAP_TLS_SKIP_VERIFY="on"

# MinIO 설정 업데이트
mc admin config set minio-kube identity_ldap server_addr="$MINIO_IDENTITY_LDAP_SERVER_ADDR"
mc admin config set minio-kube identity_ldap username_format="$MINIO_IDENTITY_LDAP_USERNAME_FORMAT"
mc admin config set minio-kube identity_ldap tls_skip_verify="$MINIO_IDENTITY_LDAP_TLS_SKIP_VERIFY"

# 설정 적용
mc admin service restart minio-kube

 

OpenID Connect 통합

Keycloak 또는 다른 OIDC 제공자와 통합:

# OpenID Connect 설정
mc admin config set minio-kube identity_openid config_url="https://keycloak.example.com/auth/realms/example/.well-known/openid-configuration"
mc admin config set minio-kube identity_openid client_id="minio-storage"
mc admin config set minio-kube identity_openid claim_name="policy"
mc admin config set minio-kube identity_openid claim_prefix="minio-"

# 설정 적용
mc admin service restart minio-kube

 

StatefulSet 환경 변수 설정:

spec:
  template:
    spec:
      containers:
      - name: minio
        env:
        - name: MINIO_IDENTITY_OPENID_CONFIG_URL
          value: "https://keycloak.example.com/auth/realms/example/.well-known/openid-configuration"
        - name: MINIO_IDENTITY_OPENID_CLIENT_ID
          value: "minio-storage"
        - name: MINIO_IDENTITY_OPENID_CLAIM_NAME
          value: "policy"
        - name: MINIO_IDENTITY_OPENID_CLAIM_PREFIX
          value: "minio-"

📌 운영 환경에서의 보안 강화 사례

네트워크 보안 강화

MinIO 자격 증명 통신의 보안 강화:

  1. TLS 암호화 적용
# TLS 시크릿 생성 
apiVersion: v1 kind: Secret metadata: name: minio-tls namespace: minio-system type: kubernetes.io/tls data: tls.crt: base64_encoded_cert tls.key: base64_encoded_key

 

  1. 네트워크 정책 적용
apiVersion: networking.k8s.io/v1        # 쿠버네티스 네트워킹 API 버전
kind: NetworkPolicy                      # NetworkPolicy 리소스 유형
metadata:
  name: minio-api-policy                 # 정책 이름
  namespace: minio-system                # minio-system 네임스페이스에 적용
spec:
  podSelector:
    matchLabels:
      app: minio                         # app=minio 라벨을 가진 포드에 적용
  ingress:
  - from:
    - namespaceSelector:                 # 특정 네임스페이스에서의 접근만 허용
        matchLabels:
          name: application-namespace
    - podSelector:                       # 특정 라벨을 가진 포드의 접근만 허용
        matchLabels:
          role: minio-client
    ports:
    - protocol: TCP                      # TCP 프로토콜
      port: 9000                         # MinIO API 포트

 

 

 

정기적인 보안 감사

자격 증명 관리 정기 검토:

# 모든 사용자 목록 확인
mc admin user list minio-kube

# 사용하지 않는 사용자 비활성화
mc admin user disable minio-kube inactive-user

# 모든 정책 검토
mc admin policy list minio-kube

# 관리 이벤트 로그 검토
mc admin trace minio-kube --verbose

# 지속적인 사용자 접근 검토
mc admin user info minio-kube app-user

# 버킷 정책 검토
mc policy get minio-kube/sensitive-bucket

✅ 자동화된 규정 준수 확인

자격 증명 규정 준수 자동화:

```yaml
apiVersion: batch/v1                # 쿠버네티스 배치 API 버전
kind: CronJob                       # CronJob 리소스 유형
metadata:
  name: minio-compliance-check      # 규정 준수 확인 CronJob 이름
  namespace: minio-system           # minio-system 네임스페이스에 생성
spec:
  schedule: "0 1 * * 1"             # 매주 월요일 새벽 1시에 실행
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: compliance-check    # 컨테이너 이름
            image: minio/mc:latest    # MinIO 클라이언트 이미지
            command:
            - /bin/bash
            - -c
            - |
              # MinIO 클라이언트 설정
              mc alias set minio-audit $MINIO_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY

              # 규정 준수 확인 스크립트
              echo "=== 사용자 접근 감사 ===" > /tmp/audit.log
              mc admin user list minio-audit >> /tmp/audit.log

              echo "=== 정책 감사 ===" >> /tmp/audit.log
              mc admin policy list minio-audit >> /tmp/audit.log

              echo "=== 활성 세션 감사 ===" >> /tmp/audit.log
              mc admin trace minio-audit --all >> /tmp/audit.log

              # 결과를 감사 버킷에 저장
              mc cp /tmp/audit.log minio-audit/compliance-reports/$(date +%Y-%m-%d)-audit.log
            env:
            - name: MINIO_ENDPOINT
              valueFrom:
                secretKeyRef:
                  name: minio-audit-creds
                  key: endpoint
            - name: MINIO_ACCESS_KEY
              valueFrom:
                secretKeyRef:
                  name: minio-audit-creds
                  key: access_key
            - name: MINIO_SECRET_KEY
              valueFrom:
                secretKeyRef:
                  name: minio-audit-creds
                  key: secret_key
          restartPolicy: OnFailure

📌 자격 증명 관리 사례 연구

마이크로서비스 아키텍처 사례

여러 마이크로서비스가 MinIO에 접근하는 구조:

[서비스 A] ─┐
             │
[서비스 B] ─┼─ [MinIO]
             │
[서비스 C] ─┘

 

각 서비스별 접근 정책:

# 서비스 A용 시크릿
apiVersion: v1
kind: Secret
metadata:
  name: service-a-minio-creds
  namespace: service-a
type: Opaque
data:
  access_key: <Base64 인코딩된 키>
  secret_key: <Base64 인코딩된 키>
---
# 서비스 B용 시크릿
apiVersion: v1
kind: Secret
metadata:
  name: service-b-minio-creds
  namespace: service-b
type: Opaque
data:
  access_key: <Base64 인코딩된 키>
  secret_key: <Base64 인코딩된 키>

 

정책 구성:

// 서비스 A 정책
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": ["arn:aws:s3:::service-a-bucket/*"]
    }
  ]
}

// 서비스 B 정책
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::shared-data-bucket/*"]
    }
  ]
}

 

임시 자격 증명 사용 패턴

단기 작업을 위한 임시 자격 증명 관리:

# 임시 사용자 생성
mc admin user add minio-kube temp-user "$TEMP_ACCESS" "$TEMP_SECRET"

# 제한된 정책 적용
mc admin policy set minio-kube temp-policy user=temp-user

# 작업 완료 후 사용자 제거
mc admin user remove minio-kube temp-user

 

자동 만료 작업:

apiVersion: batch/v1                # 쿠버네티스 배치 API 버전
kind: Job                           # Job 리소스 유형
metadata:
  name: cleanup-temp-user           # 작업 이름
  namespace: minio-system           # minio-system 네임스페이스에 생성
spec:
  ttlSecondsAfterFinished: 86400    # 작업 완료 24시간 후 삭제
  template:
    spec:
      containers:
      - name: cleanup               # 정리 작업 컨테이너
        image: minio/mc:latest      # MinIO 클라이언트 이미지
        command: 
        - /bin/bash
        - -c
        - |
          # MinIO 클라이언트 설정
          mc alias set minio $MINIO_ENDPOINT $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD

          # 임시 사용자 제거
          mc admin user remove minio temp-user

          echo "임시 사용자 제거 완료"
        env:
        - name: MINIO_ENDPOINT
          value: "http://minio-api:9000"
        - name: MINIO_ROOT_USER
          valueFrom:
            secretKeyRef:
              name: minio-auth
              key: accesskey
        - name: MINIO_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: minio-auth
              key: secretkey
      restartPolicy: OnFailure

📌 문제 해결 및 디버깅

자격 증명 관련 일반적인 문제들

자주 발생하는 문제와 해결 방법:

  1. 인증 실패 (AccessDenied)
# 문제 확인 
mc admin trace minio-kube --filter status=403 

# 사용자 상태 확인 
mc admin user info minio-kube app-user 

# 정책 권한 확인 
mc admin policy info minio-kube app-policy
  1. 만료된 자격 증명
# 자격 증명 갱신 
NEW_SECRET=$(openssl rand -hex 32) 
mc admin user set minio-kube app-user "$NEW_SECRET" 

# 시크릿 업데이트 
kubectl patch secret app-minio-creds -p \ '{"data":{"secret_key":"'$(echo -n "$NEW_SECRET" | base64)'"}}'

 

  1. 정책 충돌
# 모든 할당된 정책 확인 
mc admin user info minio-kube app-user 

# 필요한 정책만 유지 
mc admin policy unset minio-kube conflicting-policy user=app-user

 

 

자격 증명 디버깅 도구

문제 진단에 유용한 명령어:

# 실시간 접근 로그 모니터링
mc admin trace minio-kube --verbose --all

# 특정 버킷에 대한 접근 로그
mc admin trace minio-kube --filter bucket=my-bucket

# 특정 사용자의 활동 모니터링
mc admin trace minio-kube --filter user=app-user

# 접근 거부된 요청 확인
mc admin trace minio-kube --filter status=403

# 특정 IP에서의 접근 확인
mc admin trace minio-kube --filter remote=192.168.1.10

📌 자격 증명 관리 툴체인 구축

자격 증명 수명 주기 관리 워크플로우

MinIO 자격 증명 관리 아키텍쳐 와 수명주기

완전한 자격 증명 관리 수명 주기 자동화:

  1. 자격 증명 생성 스크립트
#!/bin/bash
# 사용자 및 자격 증명 생성 스크립트

# 변수 설정
SERVICE_NAME=$1
NAMESPACE=$2

# 자격 증명 생성
ACCESS_KEY=$(openssl rand -hex 8)
SECRET_KEY=$(openssl rand -hex 32)

# MinIO 사용자 생성
mc admin user add minio-kube $SERVICE_NAME-user $ACCESS_KEY $SECRET_KEY

# 기본 정책 생성
cat > ${SERVICE_NAME}-policy.json << EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetObject", "s3:PutObject"],
      "Resource": [
        "arn:aws:s3:::${SERVICE_NAME}-bucket",
        "arn:aws:s3:::${SERVICE_NAME}-bucket/*"
      ]
    }
  ]
}
EOF

# 정책 추가 및 사용자에 연결
mc admin policy add minio-kube ${SERVICE_NAME}-policy ${SERVICE_NAME}-policy.json
mc admin policy set minio-kube ${SERVICE_NAME}-policy user=${SERVICE_NAME}-user

# 쿠버네티스 시크릿 생성
kubectl create secret generic ${SERVICE_NAME}-minio-creds \
  --from-literal=access_key=$ACCESS_KEY \
  --from-literal=secret_key=$SECRET_KEY \
  --from-literal=endpoint="http://minio-api.minio-system.svc.cluster.local:9000" \
  --namespace=$NAMESPACE

echo "자격 증명 생성 완료: 서비스=${SERVICE_NAME}, 네임스페이스=${NAMESPACE}"
  1. 자격 증명 교체 스크립트
#!/bin/bash
# 자격 증명 교체 스크립트

# 변수 설정
SERVICE_NAME=$1
NAMESPACE=$2

# 새 시크릿 키 생성
NEW_SECRET_KEY=$(openssl rand -hex 32)

# MinIO 사용자 시크릿 키 업데이트
mc admin user set minio-kube ${SERVICE_NAME}-user $NEW_SECRET_KEY

# 쿠버네티스 시크릿 업데이트
kubectl patch secret ${SERVICE_NAME}-minio-creds -n $NAMESPACE -p \
  '{"data":{"secret_key":"'$(echo -n "$NEW_SECRET_KEY" | base64)'"}}'

# 애플리케이션 재시작
kubectl rollout restart deployment ${SERVICE_NAME} -n $NAMESPACE

echo "자격 증명 교체 완료: 서비스=${SERVICE_NAME}, 네임스페이스=${NAMESPACE}"
  1. 자격 증명 감사 스크립트
#!/bin/bash
# 자격 증명 감사 스크립트

# 모든 MinIO 사용자 목록
echo "=== MinIO 사용자 목록 ===" > audit.log
mc admin user list minio-kube >> audit.log

# 모든 정책 확인
echo "=== MinIO 정책 목록 ===" >> audit.log
mc admin policy list minio-kube >> audit.log

# 비활성 사용자 확인 (30일 이상 로그인 없음)
echo "=== 비활성 사용자 (마지막 로그인 확인) ===" >> audit.log
mc admin trace minio-kube --filter user --json \
  | jq 'select(.time | fromnow | contains("days") and (fromnow | split(" ")[0] | tonumber) > 30) | .user' \
  | sort | uniq >> audit.log

# 쿠버네티스 시크릿과 MinIO 사용자 일치 확인
echo "=== 쿠버네티스 시크릿 검증 ===" >> audit.log
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
  for secret in $(kubectl get secrets -n $ns -o jsonpath='{.items[*].metadata.name}' | grep minio); do
    ACCESS_KEY=$(kubectl get secret $secret -n $ns -o jsonpath='{.data.access_key}' | base64 --decode)
    if mc admin user info minio-kube $ACCESS_KEY &>/dev/null; then
      echo "✅ 시크릿 $ns/$secret: 유효한 자격 증명" >> audit.log
    else
      echo "❌ 시크릿 $ns/$secret: 유효하지 않은 자격 증명" >> audit.log
    fi
  done
done

echo "감사 완료: $(date)"

Summary:

  • MinIO 자격 증명은 액세스 키, 시크릿 키, 정책으로 구성되며 쿠버네티스 시크릿으로 관리
  • 루트 자격 증명은 초기 설정 후 보안을 위해 변경이 필수적이며 정기적인 교체가 필요
  • 각 애플리케이션은 최소 권한 원칙에 따라 필요한 권한만 가진 전용 사용자 계정 사용 권장
  • 자격 증명은 환경 변수 또는 볼륨 마운트를 통해 애플리케이션에 안전하게 주입
  • 교체 전략, 감사, 모니터링을 통한 지속적인 보안 관리가 중요
  • LDAP, OpenID Connect 등 기업 인증 시스템과의 통합으로 중앙화된 자격 증명 관리 가능
  • 자동화된 스크립트와 CronJob을 활용한 자격 증명 수명 주기 관리가 운영 효율성 향상
728x90