새소식

Storage

[MinIO Study 3주차] MinIO 접근 제어 (feat. PBAC)

  • -

CoudNet@ 팀의 가시다님께서 리딩하시는 MinIO Study 3주차 스터디 내용 정리

 

이번 주차에는 MinIO 스터디의 마지막 주차로 스토리지 접근 제어PBAC, LDAP 연동 그리고 SDK 를 활용한 MinIO 접근에 대해서 공부했습니다.



 

1. 실습환경 구성

 

이번 주차에서는 Kind 를 이용하여 MinIO 실습 환경을 구성했습니다.

 

 

1.1. kind 를 통한 k8s 배포

 

kind create cluster --name myk8s --image kindest/node:v1.33.4 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000 
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003    
EOF

 

 

1.2. MinIO 배포

 

helm install --namespace minio-operator --create-namespace minio-operator minio-operator/operator --set operator.replicaCount=1

 

 

1.3. MinIO Tenant 배포

 

cat << EOF > minio-tenant-1-values.yaml
tenant:
  name: tenant1

  configSecret:
    name: tenant1-env-configuration
    accessKey: minio
    secretKey: minio123

  pools:
    - servers: 1
      name: pool-0
      volumesPerServer: 4
      size: 1Gi 
      storageClassName: standard
  env:
    - name: MINIO_STORAGE_CLASS_STANDARD
      value: "EC:1"
    - name: MINIO_PROMETHEUS_AUTH_TYPE
      value: public

  features:
    bucketDNS: true

  metrics:
    enabled: true
    port: 9000
    protocol: http
EOF

# Helm 배포
helm install --namespace tenant1 --create-namespace --values minio-tenant-1-values.yaml tenant1 minio-operator/tenant \
 && kubectl get tenants -A -w

# Web Console 및 MC Client 접근을 위한 노드포트 오픈
kubectl patch svc -n tenant1 tenant1-console -p '{"spec": {"type": "NodePort", "ports": [{"port": 9443, "targetPort": 9443, "nodePort": 30001}]}}'
kubectl patch svc -n tenant1 minio -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "targetPort": 9000, "nodePort": 30002}]}}'

 

 

1.4. MinIO 콘솔 및 CLI 설정

 

# MinIO 웹 콘솔 오픈
open "https://127.0.0.1:30001"

# MC Client 설정
mc alias set k8s-tenant1 https://127.0.0.1:30002 minio minio123 --insecure
mc alias list
mc admin info k8s-tenant1 --insecure

# 버킷 생성
mc mb $MYALIAS/mybucket --insecure

 

실습 환경 준비가 끝났으면 MinIO 접근 제어를 테스트해보겠습니다.



 

2. MinIO PBAC 개요



AWS S3 와 동일하게 MinIO 에서도 정책 기반으로 사용자 접근 제어를 할 수 있습니다.
이를 PBAC (Policy Based Access Control) 이라고 지칭합니다.

 

 

2.1. MinIO IAM

 

1주차에서 학습했던 MinIO IAM 내용을 한 번 더 다루게 됩니다.
MinIO 도 AWS S3 와 마찬가지로 클라이언트 작업에 대해서 인증과 인가를 모두 수행하도록 요구할 수 있습니다.

 

Authentication (인증)

 

- 연결된 클라이언트 신원을 확인하는 프로세스
- 클라이언트가 AWS SigV4 프로토콜을 사용하여 인증하도록 요구
- 클라이언트는 PUT, GET, DELETE 작업과 같은 S3 또는 MinIO API 에 접근하기 위한 Access Key 와 Secret Key 를 제출

 

Authorization (인가)

 

- 인증된 클라이언트가 배포된 작업과 자원에 수행할 수 있는 것을 제한
- 정책 기반 접근 제어 (PBAC) 을 사용하며, 각 정책은 사용자 또는 사용자 그룹의 권한을 설명하는 하나 이상의 규칙을 정의
- MinIO 는 S3 특정 작업(action) 및 조건(condition) 을 지원
- 기본적으로 MinIO 는 사용자가 할당받거나 상속받은 정책에 명시적으로 참조되지 않은 작업이나 자원에 대한 접근을 거부

 

ID 식별

 

- 내부 및 외부 ID 관리 모두 지원
- 인증 후, 작업 수행 권한 여부에 따라 클라이언트 요청 허용 또는 거부
- 리소스 접근 권한은 인가(PBAC)에 의해 결정

- 지원되는 IDP 목록: OpenID, MinIO Authentication Plugin, AD/LDAP, Access Management Plugin

 

 

2.2. MinIO ID 관리

 

 

MinIO 장기 사용자

 

MinIO 에는 핵심 ID 관리 기능을 제공하는 내장 ID 공급자(IDP) 가 포함되어 있습니다.
MinIO IDP 는 클라이언트 인증을 지원하기 위해 장기 사용자를 생성할 수 있도록 지원합니다.
각 사용자는 액세스 키(사용자 이름)과 비밀 키(비밀번호)로 구성됩니다.

 

MinIO Service Account

 

위에서 언급한 액세스 키와 다르게 MinIO 는 Service Account 를 통한 별도의 액세스 키 생성이 가능합니다.
이 때 발급되는 액세스 키는 해당 사용자의 권한을 상속 받으며, 만료일을 설정할 수 있습니다.
Service Account 를 통해 발급된 액세스 키가 AWS 의 프로그래밍 방식의 액세스 키와 동일한 역할을 수행합니다.

 

MinIO Group

 

그룹은 MinIO 사용자들의 집합입니다.
그룹에 정책을 부여하여 해당 그룹에 속한 사용자들에게 일괄적으로 권한을 부여할 수 있습니다.
실제 운영 환경에서는 관리 용이성을 위해서 그룹에 정책을 부여해 사용자를 관리하는 것이 필수겠지요.

 

 

2.3. MinIO 접근 관리

 

이제 실제로 MinIO 접근 관리를 어떻게 하는 지 살펴보겠습니다.
MinIO 에는 기본적인 내장 정책이 5가지 존재하며, 정책 문서 구조는 AWS IAM 정책과 동일한 구조를 가집니다.

 

MinIO 정책 구조 예시

 

{
   "Version" : "2012-10-17",
   "Statement" : [
      {
         "Effect" : "Allow",
         "Action" : [ "s3:<ActionName>", ... ],
         "Resource" : "arn:aws:s3:::*",
         "Condition" : { ... }
      },
      {
         "Effect" : "Deny",
         "Action" : [ "s3:<ActionName>", ... ],
         "Resource" : "arn:aws:s3:::*",
         "Condition" : { ... }
      }
   ]
}

 

 

1. consoleAdmin

- MinIO 의 모든 S3 관리 및 API 작업에 대한 완전한 액세스 권한

s3:*
admin:*

 

 

2. readonly

- MinIO 모든 객체에 대한 읽기 전용 권한

s3:GetBucketLocation
s3:GetObject

 

 

3. readwrite

- MinIO 모든 버킷 및 객체에 대한 읽기 & 쓰기 권한

s3:*

 

 

4. diagnostics

- MinIO 모니터링 및 감사 권한

admin:ServerTrace
admin:Profiling
admin:ConsoleLog
admin:ServerInfo
admin:TopLocksInfo
admin:OBDInfo
admin:BandwidthMonitor
admin:Prometheus

 

 

5. writeonly

- MinIO 모든 버킷 경로에 대한 쓰기 권한

s3:PutObject



 

3. MinIO PBAC 실습

 

이때까지 PBAC 에 대한 개념을 알아보았으니, 이제 실습을 진행해보겠습니다.

 

 

3.1. PBAC 정책 생성 / 삭제

 

기본 내장 정책을 확인해보고 신규 정책을 생성하여 적용해보겠습니다.
웹 콘솔에서도 확인할 수 있지만, 간편하게 MinIO cli 를 사용해서 확인해보겠습니다.

 

기본 정책 확인

 

# 별칭 정의
MYALIAS=k8s-tenant1

# 정책 리스트 조회
mc admin policy list $MYALIAS --insecure

 

 

신규 정책 생성

 

mc admin policy info 명령어를 사용하면 정책을 JSON 형태로 확인할 수 있습니다.
이 때 --policy-file 옵션을 사용하면 해당 정책을 파일로 저장할 수 있습니다.

 

# info 를 통해 정책 확인
mc admin policy info $MYALIAS readonly --insecure | jq

# info 정책 부분 파일로 저장
mc admin policy info $MYALIAS readonly --insecure --policy-file new.json

# 저장 파일 확인
cat new.json| jq

 

 

vi 에디터를 통해서 다음과 같이 정책을 수정합니다
"s3:List*" 권한 추가

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

 

정책을 생성합니다.

 

# 정책 생성
mc admin policy create $MYALIAS readlist new.json --insecure

# 생성 정책 확인
mc admin policy list $MYALIAS --insecure
mc admin policy info $MYALIAS readlist --insecure | jq

 

 

웹 콘솔에서도 생성된 정책을 확인할 수 있습니다.

 

 

정책 제거

 

정책 제거는 다음 명령어로 쉽게 할 수 있습니다.

# 기본 내장 정책 삭제 시도
mc admin policy remove $MYALIAS diagnostics --insecure

# 커스텀 정책 삭제 시도
mc admin policy remove $MYALIAS readlist --insecure

 

 

확인해보면 기본 내장 정책은 삭제를 할 수 없는 것을 확인할 수 있습니다.

 

 

3.2. 사용자 PBAC 정책 할당

 

이번에는 신규 사용자를 생성해서 정책을 부여해보도록 하겠습니다.

 

신규 사용자 생성

 

# user1 생성 - 비밀번호: mypassword
mc admin user add $MYALIAS user1 mypassword --insecure

# user1 생성 확인
mc admin user list $MYALIAS --insecure

 

 

참고로 User 에 함께 출력되는 enabled 는 해당 유저가 활성화 상태라는 것을 의미합니다.
반대로 disabled 인 경우 비활성화 상태로 로그인이 불가합니다.

 

신규 사용자로 웹 콘솔에 로그인하면 버킷 권한이 없다고 나타납니다.

 

PBAC 정책 할당

 

위와 같은 권한 오류를 해결하기 위해 user1 사용자에게 readwrite 정책을 부여하겠습니다.

 

# 직접 정책 부여
mc admin policy attach $MYALIAS readwrite --user user1 --insecure

# 정책 연결 확인
mc admin policy entities $MYALIAS --policy readwrite --insecure

 

 

이후 다시 user1 웹 콘솔에서 새로고침을 하면 버킷이 조회되는 것을 확인할 수 있습니다.

 

 

 

3.3. 그룹 PBAC 정책 할당

 

이번에는 사용자에게 직접 정책을 할당하지 않고 그룹을 통해 정책을 부여해보겠습니다.

 

그룹 생성

 

# 현재 그룹 조회
mc admin group list $MYALIAS --insecure

# 새로운 그룹 생성 (생성하면서 user1 을 devteam 그룹에 포함)
mc admin group add $MYALIAS devteam user1 --insecure
mc admin group info $MYALIAS devteam --insecure

 

 

그룹 정책 부여

 

# 그룹 정책 부여 (readonly 정책 부여)
mc admin policy attach $MYALIAS readonly --group devteam --insecure

# 그룹 정보 조회
mc admin group info $MYALIAS devteam --insecure

 

 

웹 콘솔에서도 확인이 가능합니다.

 

 

 

3.4. 그룹, 사용자 정책 우선 순위

 

현재 user1 에 직접 정책 (readwrite) 와 그룹 정책 (readonly) 가 모두 Attach 되어 있습니다.
이러한 경우 다음과 같은 정책이 적용됩니다.

 

사용자 정책 그룹 정책 최종 권한 설명
Allow Allow Allow ✅ 둘 다 허용이므로 허용
Allow Deny Deny ❌ Deny 가 우선
Deny Allow Deny ❌ Deny 가 우선
Deny Deny Deny ❌ 둘 다 거부이므로 거부
Allow 없음 Allow ✅ 사용자 정책 허용
Deny 없음 Deny ❌ 사용자 정책 거부
없음 Allow Allow ✅ 그룹 정책 허용
없음 Deny Deny ❌ 그룹 정책 거부
없음 없음 Deny ❌ 기본적으로 암묵적 거부

 


 

 

이번 글에서는 MinIO 접근 제어에 대해 집중적으로 확인해보았습니다.
AWS 와 완벽호환이 되는 만큼 동작 방식도 S3 와 정말 유사하게 동작하기 때문에 사용하는 방법을 이해하는 데 어려움이 없었던 것 같습니다.
다음 글에서는 MinIO 를 LDAP 과 함께 사용하는 방법에 대해서 작성해보겠습니다.

Contents

포스팅 주소를 복사했습니다