[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 과 함께 사용하는 방법에 대해서 작성해보겠습니다.
'Storage' 카테고리의 다른 글
| [MinIO Study 3주차] MinIO 접근 제어 (feat. LDAP) (0) | 2025.09.25 |
|---|---|
| [MinIO Study 2주차] MinIO Performance (0) | 2025.09.21 |
| [MinIO Study 2주차] MinIO 와 DirectPV (0) | 2025.09.21 |
| [MinIO Study 1주차] MinIO 배포 및 기본 활용 (1) | 2025.09.14 |
| [MinIO Study 1주차] MinIO 소개 (0) | 2025.09.14 |