Module 8: Proxmox VE User Management¶
학습 목표¶
이 모듈을 완료하면 다음을 이해할 수 있습니다: - PVE 인증 시스템 아키텍처 - 다양한 인증 영역(PAM, PVE, LDAP, AD, OpenID Connect) - 사용자, 그룹, API 토큰 관리 - 역할 기반 접근 제어(RBAC)와 권한 시스템 - 2단계 인증(TFA) 구성 - pveum 명령어 활용
1. 인증 시스템 아키텍처¶
1.1 전체 구조¶
+-------------------------------------------------------------------------+
| Proxmox VE Authentication System |
+-------------------------------------------------------------------------+
| |
| +-------------------+ +-------------------+ +---------------+ |
| | Web GUI/API | | pveum CLI | | REST API | |
| +--------+----------+ +--------+----------+ +-------+-------+ |
| | | | |
| +-------------------------+------------------------+ |
| | |
| +----------v----------+ |
| | Authentication | |
| | Layer | |
| +----------+----------+ |
| | |
| +---------------+---------------+---------------+---------------+ |
| | | | | | |
| v v v v v |
| +------+ +-------+ +------+ +------+ +--------+ |
| | PAM | | PVE | | LDAP | | AD | | OpenID | |
| +------+ +-------+ +------+ +------+ +--------+ |
| Linux Proxmox OpenLDAP Active OAuth 2.0 |
| System Internal Server Directory Provider |
| |
+-------------------------------------------------------------------------+
| |
| Configuration Files: |
| - /etc/pve/user.cfg : 사용자, 그룹, 권한 정보 |
| - /etc/pve/domains.cfg : 인증 영역 설정 |
| - /etc/pve/priv/shadow.cfg : PVE 영역 비밀번호 해시 |
| |
+-------------------------------------------------------------------------+
1.2 사용자 식별자 형식¶
+-------------------------------------------------------------------------+
| User ID Format |
+-------------------------------------------------------------------------+
| |
| <username>@<realm> |
| |
| 예시: |
| - root@pam : Linux root 사용자 (PAM 영역) |
| - admin@pve : PVE 내부 사용자 |
| - john@ldap : LDAP 사용자 |
| - jane@ad : Active Directory 사용자 |
| - user1@oidc : OpenID Connect 사용자 |
| |
+-------------------------------------------------------------------------+
1.3 설정 파일 구조¶
# /etc/pve/user.cfg - 사용자 및 권한 설정
user:root@pam:1:0:::[email protected]:::
user:admin@pve:1:0:::[email protected]::John:Admin:
group:admins:admin@pve::
group:developers:dev1@pve,dev2@pve::
role:CustomRole:VM.Console,VM.PowerMgmt:
acl:1:/vms:@admins:Administrator:
acl:1:/vms/100:user1@pve:PVEVMUser:
pool:dev-pool:::
# /etc/pve/domains.cfg - 인증 영역 설정
pam: pam
comment Linux PAM standard authentication
pve: pve
comment Proxmox VE authentication server
ldap: company-ldap
base_dn ou=People,dc=company,dc=com
server1 ldap.company.com
user_attr uid
ad: company-ad
domain company.local
server1 dc.company.local
2. 인증 영역 (Authentication Realms)¶
2.1 영역 유형 비교¶
+-------------+----------------------------------------------------------+
| Realm | Characteristics |
+-------------+----------------------------------------------------------+
| | |
| PAM | - Linux 시스템 사용자 인증 |
| | - 각 노드에 사용자 존재 필요 |
| | - 비밀번호 변경은 해당 노드에만 적용 |
| | - 삭제 불가 (기본 제공) |
| | |
+-------------+----------------------------------------------------------+
| | |
| PVE | - Proxmox VE 내부 인증 서버 |
| | - /etc/pve/priv/shadow.cfg에 해시 저장 |
| | - SHA-256 해싱 |
| | - 소규모~중규모 환경에 적합 |
| | - 사용자 완전 관리 (생성, 비밀번호 변경 등) |
| | |
+-------------+----------------------------------------------------------+
| | |
| LDAP | - 외부 LDAP 서버 인증 (OpenLDAP 등) |
| | - base_dn, user_attr 설정 필요 |
| | - SSL/TLS 지원 |
| | - 사용자 동기화(Sync) 가능 |
| | |
+-------------+----------------------------------------------------------+
| | |
| AD | - Microsoft Active Directory |
| | - LDAP 프로토콜 사용 |
| | - 도메인 기반 인증 |
| | - 그룹 동기화 지원 |
| | |
+-------------+----------------------------------------------------------+
| | |
| OpenID | - OAuth 2.0 기반 외부 인증 |
| Connect | - Google, Keycloak 등 지원 |
| | - 사용자 자동 생성 옵션 |
| | - 그룹 매핑 지원 |
| | |
+-------------+----------------------------------------------------------+
2.2 PAM 영역¶
# PAM 영역은 Linux 시스템 사용자를 사용
# 각 노드에 동일한 사용자가 존재해야 함
# Linux 사용자 생성 (각 노드에서 실행)
adduser john
# PVE에서 PAM 사용자 등록
pveum user add john@pam -comment "John Doe"
# PAM 사용자 비밀번호 변경 (해당 노드에서만 적용)
passwd john
# 특징:
# - 노드별 독립적인 비밀번호 가능 (보안상 이점)
# - 모든 노드 동일 비밀번호 필요시 각 노드에서 설정
# - root@pam은 항상 무제한 관리자 권한
2.3 PVE 영역¶
# PVE 영역 - Proxmox VE 내부 인증
# 사용자 생성
pveum user add admin@pve -comment "Admin User"
# 비밀번호 설정
pveum passwd admin@pve
# 사용자 정보 수정
pveum user modify admin@pve \
-firstname "Admin" \
-lastname "User" \
-email "[email protected]"
# 사용자 비활성화
pveum user modify admin@pve -enable 0
# 사용자 삭제
pveum user delete admin@pve
# 비밀번호는 /etc/pve/priv/shadow.cfg에 SHA-256 해시로 저장
# 클러스터 전체에 자동 동기화
2.4 LDAP 영역¶
# LDAP 영역 추가
pveum realm add my-ldap --type ldap \
--base_dn "ou=People,dc=company,dc=com" \
--user_attr uid \
--server1 ldap.company.com \
--port 389 \
--default 0 \
--comment "Company LDAP"
# SSL/TLS 사용
pveum realm add my-ldap-ssl --type ldap \
--base_dn "ou=People,dc=company,dc=com" \
--user_attr uid \
--server1 ldap.company.com \
--port 636 \
--secure 1 \
--verify 1 \
--capath /etc/ssl/certs
# Bind DN 설정 (인증된 검색이 필요한 경우)
pveum realm modify my-ldap \
--bind_dn "cn=readonly,dc=company,dc=com"
# Bind 비밀번호 저장 (파일로)
echo "secret_password" > /etc/pve/priv/realm/my-ldap.pw
chmod 600 /etc/pve/priv/realm/my-ldap.pw
# 사용자 동기화
pveum realm sync my-ldap
# 동기화 옵션
pveum realm sync my-ldap \
--scope both \
--enable-new 1 \
--remove-vanished entry,acl
LDAP 설정 구조:
+-------------------------------------------------------------------------+
| LDAP Configuration |
+-------------------------------------------------------------------------+
| |
| LDAP Server Proxmox VE |
| +---------------------------+ +---------------------------+ |
| | | | | |
| | dc=company,dc=com | | /etc/pve/domains.cfg | |
| | | | | | |
| | +-- ou=People | <-----> | ldap: my-ldap | |
| | | | | LDAP | base_dn: ou=People,... | |
| | | +-- uid=john | Query | user_attr: uid | |
| | | +-- uid=jane | | server1: ldap.company...| |
| | | | | | |
| | +-- ou=Groups | | /etc/pve/user.cfg | |
| | | | | user:john@my-ldap | |
| | +-- cn=developers | | user:jane@my-ldap | |
| | | | group:developers-my-ldap| |
| +---------------------------+ +---------------------------+ |
| |
+-------------------------------------------------------------------------+
2.5 Active Directory 영역¶
# AD 영역 추가
pveum realm add company-ad --type ad \
--domain company.local \
--server1 dc1.company.local \
--server2 dc2.company.local \
--port 389 \
--secure 0 \
--default 0 \
--comment "Company Active Directory"
# SSL 사용
pveum realm add company-ad-ssl --type ad \
--domain company.local \
--server1 dc1.company.local \
--port 636 \
--secure 1 \
--verify 1
# Bind 사용자 설정 (대부분의 AD 환경에서 필요)
pveum realm modify company-ad \
--bind_dn "CN=svc_proxmox,OU=Service Accounts,DC=company,DC=local"
# 비밀번호 저장
echo "service_account_password" > /etc/pve/priv/realm/company-ad.pw
# 그룹 필터 설정
pveum realm modify company-ad \
--group_filter "(&(objectClass=group)(cn=PVE*))"
# 동기화
pveum realm sync company-ad --scope both
# 대소문자 구분 비활성화 (AD 기본 동작과 일치)
pveum realm modify company-ad --case-sensitive 0
2.6 OpenID Connect 영역¶
# Google OpenID Connect
pveum realm add google-oidc --type openid \
--issuer-url "https://accounts.google.com" \
--client-id "your-client-id.apps.googleusercontent.com" \
--client-key "your-client-secret" \
--username-claim email \
--autocreate 1
# Keycloak OpenID Connect
pveum realm add keycloak-oidc --type openid \
--issuer-url "https://keycloak.company.com/realms/company" \
--client-id "proxmox-ve" \
--client-key "client-secret" \
--username-claim preferred_username \
--autocreate 1
# 그룹 매핑 설정
pveum realm modify keycloak-oidc \
--groups-claim groups \
--groups-autocreate 1
OpenID Connect 흐름:
+-------------------------------------------------------------------------+
| OpenID Connect Auth Flow |
+-------------------------------------------------------------------------+
| |
| 1. 사용자가 PVE 로그인 페이지에서 OpenID 영역 선택 |
| |
| +----------+ +------------+ +------------------+ |
| | 사용자 | -----> | PVE GUI | -----> | OpenID Provider | |
| +----------+ +------------+ +------------------+ |
| | |
| 2. Provider 로그인 페이지로 리다이렉트 | |
| v |
| +----------+ +------------+ +------------------+ |
| | 사용자 | <----- | Provider | <----- | 인증 수행 | |
| +----------+ Login +------------+ +------------------+ |
| | |
| 3. 사용자 인증 (ID/PW, MFA 등) |
| | |
| v |
| +----------+ +------------+ +------------------+ |
| | 사용자 | -----> | Provider | -----> | Authorization | |
| +----------+ +------------+ | Code 발급 | |
| +------------------+ |
| | |
| 4. PVE로 리다이렉트 (Authorization Code와 함께) | |
| v |
| +----------+ +------------+ +------------------+ |
| | | | PVE API | -----> | Token Exchange | |
| | | +------------+ +------------------+ |
| | | | | |
| | 사용자 | v v |
| | | +------------+ +------------------+ |
| | | <----- | PVE Session| <----- | ID Token 검증 | |
| +----------+ +------------+ +------------------+ |
| |
| 5. 세션 생성 및 로그인 완료 |
| |
+-------------------------------------------------------------------------+
3. 사용자 및 그룹 관리¶
3.1 사용자 관리¶
# 사용자 목록 조회
pveum user list
# 특정 사용자 정보 조회
pveum user list --full | grep admin@pve
# 사용자 생성
pveum user add developer1@pve \
-comment "Developer 1" \
-email "[email protected]" \
-firstname "John" \
-lastname "Developer" \
-groups developers \
-expire 0
# 비밀번호 설정
pveum passwd developer1@pve
# 사용자 수정
pveum user modify developer1@pve \
-enable 1 \
-groups "developers,testers"
# 사용자 만료일 설정 (Unix timestamp)
pveum user modify developer1@pve -expire 1735689600
# 사용자 비활성화
pveum user modify developer1@pve -enable 0
# 사용자 삭제
pveum user delete developer1@pve
# 사용자 권한 확인
pveum user permissions developer1@pve
3.2 그룹 관리¶
# 그룹 목록 조회
pveum group list
# 그룹 생성
pveum group add developers -comment "Development Team"
pveum group add operators -comment "Operations Team"
pveum group add admins -comment "System Administrators"
# 그룹에 사용자 추가 (사용자 수정을 통해)
pveum user modify developer1@pve -groups developers
# 여러 그룹에 추가
pveum user modify developer1@pve -groups "developers,testers"
# 그룹 삭제
pveum group delete testers
그룹 기반 권한 관리 구조:
+-------------------------------------------------------------------------+
| Group-Based Permission Model |
+-------------------------------------------------------------------------+
| |
| Groups Roles Paths |
| +-------------+ +-----------+ +------------+ |
| | admins |---+ |Administrator|--------->| / | |
| +-------------+ | +-----------+ +------------+ |
| | |
| +-------------+ | +-----------+ +------------+ |
| | developers |---+----->|PVEVMAdmin |----------->| /vms | |
| +-------------+ | +-----------+ +------------+ |
| | |
| +-------------+ | +-----------+ +------------+ |
| | operators |---+ |PVEAdmin |----------->| /pool/prod | |
| +-------------+ +-----------+ +------------+ |
| |
| Users are members of groups |
| +-------------+ |
| | user1@pve |---> developers |
| | user2@pve |---> developers, operators |
| | admin@pve |---> admins |
| +-------------+ |
| |
+-------------------------------------------------------------------------+
4. API 토큰¶
4.1 API 토큰 개념¶
+-------------------------------------------------------------------------+
| API Token Architecture |
+-------------------------------------------------------------------------+
| |
| +-------------------+ |
| | User | |
| | (joe@pve) | |
| +--------+----------+ |
| | |
| | owns |
| | |
| +--------v----------+ +------------------+ |
| | API Token | | API Token | |
| | (joe@pve!monitor) | | (joe@pve!backup) | |
| +--------+----------+ +--------+---------+ |
| | | |
| +--------v----------+ +--------v---------+ |
| | Privileges: | | Privileges: | |
| | - privsep: yes | | - privsep: no | |
| | - 별도 ACL 필요 | | - 사용자 권한 상속 | |
| +-------------------+ +------------------+ |
| |
| Token Format: PVEAPIToken=USER@REALM!TOKENID=UUID |
| Example: PVEAPIToken=joe@pve!monitor=aaaaaa-bbbb-cccc-dddd-eeeeee |
| |
+-------------------------------------------------------------------------+
4.2 API 토큰 관리¶
# API 토큰 생성 (권한 분리 - 별도 ACL 필요)
pveum user token add joe@pve monitoring -privsep 1 -comment "Monitoring"
# 출력 예시:
# full-tokenid: joe@pve!monitoring
# info:
# privsep: 1
# value: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# API 토큰 생성 (권한 상속 - 사용자 권한 그대로 사용)
pveum user token add joe@pve backup -privsep 0 -comment "Backup Script"
# 토큰 만료일 설정
pveum user token add joe@pve temp-token -privsep 1 -expire 1735689600
# 토큰 목록 조회
pveum user token list joe@pve
# 토큰 정보 조회
pveum user token list joe@pve monitoring
# 토큰에 권한 부여 (privsep=1인 경우)
pveum acl modify /vms -token 'joe@pve!monitoring' -role PVEAuditor
# 토큰 권한 확인
pveum user token permissions joe@pve monitoring
# 토큰 삭제
pveum user token remove joe@pve monitoring
4.3 API 토큰 사용 예제¶
# API 토큰으로 REST API 호출
curl -k -H "Authorization: PVEAPIToken=joe@pve!monitoring=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
https://pve.example.com:8006/api2/json/nodes
# Python 예제
import requests
headers = {
"Authorization": "PVEAPIToken=joe@pve!monitoring=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
response = requests.get(
"https://pve.example.com:8006/api2/json/cluster/status",
headers=headers,
verify=False
)
print(response.json())
# Ansible에서 사용
# ansible.cfg 또는 inventory에서:
# api_user: joe@pve!monitoring
# api_token_id: monitoring
# api_token_secret: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
5. 역할 기반 접근 제어 (RBAC)¶
5.1 RBAC 구조¶
+-------------------------------------------------------------------------+
| RBAC Model |
+-------------------------------------------------------------------------+
| |
| +----------+ +----------+ +-------------+ +----------+ |
| | Users |---->| Roles |---->| Privileges |---->| Paths | |
| | Groups | | | | | | (Objects)| |
| | Tokens | | | | | | | |
| +----------+ +----------+ +-------------+ +----------+ |
| |
| ACL Entry: (Path, User/Group/Token, Role) |
| |
| 예: (/vms, @developers, PVEVMAdmin) |
| -> developers 그룹이 /vms 경로에서 PVEVMAdmin 역할 수행 |
| |
+-------------------------------------------------------------------------+
5.2 기본 제공 역할¶
+-------------------+--------------------------------------------------+
| Role | Description |
+-------------------+--------------------------------------------------+
| Administrator | 모든 권한 (root와 동일) |
| NoAccess | 권한 없음 (명시적 거부) |
| PVEAdmin | 대부분의 관리 권한 (시스템/권한 수정 제외) |
| PVEAuditor | 읽기 전용 (모니터링용) |
| PVEDatastoreAdmin | 백업 공간/템플릿 생성 및 관리 |
| PVEDatastoreUser | 백업 공간 할당 및 스토리지 조회 |
| PVEMappingAdmin | 리소스 매핑 관리 |
| PVEMappingUser | 리소스 매핑 조회 및 사용 |
| PVEPoolAdmin | 리소스 풀 관리 |
| PVEPoolUser | 리소스 풀 조회 |
| PVESDNAdmin | SDN 설정 관리 |
| PVESDNUser | 브리지/VNet 접근 |
| PVESysAdmin | 시스템 감사, 콘솔, 로그 |
| PVETemplateUser | 템플릿 조회 및 복제 |
| PVEUserAdmin | 사용자 관리 |
| PVEVMAdmin | VM 전체 관리 |
| PVEVMUser | VM 조회, 백업, CD-ROM, 콘솔, 전원 관리 |
+-------------------+--------------------------------------------------+
5.3 권한 (Privileges)¶
노드/시스템 관련:
+-------------------------+------------------------------------------------+
| Privilege | Description |
+-------------------------+------------------------------------------------+
| Group.Allocate | 그룹 생성/수정/삭제 |
| Mapping.Audit | 리소스 매핑 조회 |
| Mapping.Modify | 리소스 매핑 관리 |
| Mapping.Use | 리소스 매핑 사용 |
| Permissions.Modify | 접근 권한 수정 |
| Pool.Allocate | 풀 생성/수정/삭제 |
| Pool.Audit | 풀 조회 |
| Realm.AllocateUser | 영역에 사용자 할당 |
| Realm.Allocate | 인증 영역 생성/수정/삭제 |
| SDN.Allocate | SDN 설정 관리 |
| SDN.Audit | SDN 설정 조회 |
| Sys.Audit | 노드 상태/설정, 클러스터/HA 설정 조회 |
| Sys.Console | 노드 콘솔 접근 |
| Sys.Incoming | 다른 클러스터에서 데이터 수신 (실험적) |
| Sys.Modify | 노드 네트워크 설정 생성/수정/삭제 |
| Sys.PowerMgmt | 노드 전원 관리 |
| Sys.Syslog | syslog 조회 |
| User.Modify | 사용자 접근 및 세부정보 생성/수정/삭제 |
+-------------------------+------------------------------------------------+
가상 머신 관련:
+-------------------------+------------------------------------------------+
| Privilege | Description |
+-------------------------+------------------------------------------------+
| SDN.Use | SDN VNet 및 로컬 브리지 접근 |
| VM.Allocate | 서버에 VM 생성/삭제 |
| VM.Audit | VM 설정 조회 |
| VM.Backup | VM 백업/복원 |
| VM.Clone | VM 복제 |
| VM.Config.CDROM | CD-ROM 꺼내기/변경 |
| VM.Config.CPU | CPU 설정 변경 |
| VM.Config.Cloudinit | Cloud-init 파라미터 변경 |
| VM.Config.Disk | 디스크 추가/수정/삭제 |
| VM.Config.HWType | 에뮬레이션 하드웨어 유형 변경 |
| VM.Config.Memory | 메모리 설정 변경 |
| VM.Config.Network | 네트워크 장치 추가/수정/삭제 |
| VM.Config.Options | 기타 VM 설정 변경 |
| VM.Console | VM 콘솔 접근 |
| VM.Migrate | VM을 클러스터 내 다른 노드로 마이그레이션 |
| VM.PowerMgmt | 전원 관리 (시작, 정지, 재시작, 종료 등) |
| VM.Snapshot | VM 스냅샷 생성/삭제 |
| VM.Snapshot.Rollback | VM 스냅샷 롤백 |
+-------------------------+------------------------------------------------+
스토리지 관련:
+-------------------------+------------------------------------------------+
| Privilege | Description |
+-------------------------+------------------------------------------------+
| Datastore.Allocate | 데이터스토어 생성/수정/삭제, 볼륨 삭제 |
| Datastore.AllocateSpace | 데이터스토어에 공간 할당 |
| Datastore.AllocateTemplate | 템플릿/ISO 이미지 할당/업로드 |
| Datastore.Audit | 데이터스토어 조회/탐색 |
+-------------------------+------------------------------------------------+
5.4 객체 경로 (Paths)¶
+-------------------------------------------------------------------------+
| Object Paths |
+-------------------------------------------------------------------------+
| |
| / # 루트 (전체) |
| | |
| +-- /access # 접근 관리 |
| | +-- /access/groups # 그룹 관리 |
| | +-- /access/realms/{id} # 특정 영역 관리 |
| | |
| +-- /nodes # 노드 |
| | +-- /nodes/{node} # 특정 노드 |
| | |
| +-- /vms # 모든 VM/CT |
| | +-- /vms/{vmid} # 특정 VM/CT |
| | |
| +-- /storage # 스토리지 |
| | +-- /storage/{storage} # 특정 스토리지 |
| | |
| +-- /pool # 리소스 풀 |
| | +-- /pool/{poolid} # 특정 풀 |
| | |
| +-- /sdn # SDN |
| +-- /sdn/zones/{zone} # 특정 SDN 존 |
| +-- /sdn/vnets/{vnet} # 특정 VNet |
| |
+-------------------------------------------------------------------------+
5.5 ACL 관리¶
# ACL 목록 조회
pveum acl list
# 사용자에게 역할 부여
pveum acl modify /vms -user developer1@pve -role PVEVMUser
# 그룹에게 역할 부여
pveum acl modify /vms -group developers -role PVEVMAdmin
# 토큰에게 역할 부여
pveum acl modify /vms -token 'joe@pve!monitoring' -role PVEAuditor
# 특정 VM에만 권한 부여
pveum acl modify /vms/100 -user testuser@pve -role PVEVMUser
# 특정 스토리지 권한
pveum acl modify /storage/local-lvm -user developer1@pve -role PVEDatastoreUser
# 특정 노드 권한
pveum acl modify /nodes/node1 -user operator@pve -role PVESysAdmin
# 풀 권한
pveum acl modify /pool/dev-pool -group developers -role PVEAdmin
# 권한 전파 비활성화 (하위 객체에 상속 안 함)
pveum acl modify /vms -user developer1@pve -role PVEVMAdmin -propagate 0
# ACL 삭제
pveum acl delete /vms -user developer1@pve -role PVEVMUser
5.6 커스텀 역할 생성¶
# 커스텀 역할 생성
pveum role add VM_PowerOnly -privs "VM.PowerMgmt VM.Console VM.Audit"
# 역할 수정
pveum role modify VM_PowerOnly -privs "VM.PowerMgmt VM.Console VM.Audit VM.Config.CDROM"
# 역할 조회
pveum role list
# 역할 삭제
pveum role delete VM_PowerOnly
6. 권한 상속 및 우선순위¶
6.1 상속 규칙¶
+-------------------------------------------------------------------------+
| Permission Inheritance Rules |
+-------------------------------------------------------------------------+
| |
| 1. 사용자 권한은 항상 그룹 권한보다 우선 |
| |
| 2. 그룹 권한은 사용자가 해당 그룹의 멤버일 때 적용 |
| |
| 3. 더 깊은 경로의 권한이 상위 경로 권한을 대체 |
| |
| 4. NoAccess 역할은 해당 경로의 모든 다른 역할을 취소 |
| |
| 5. 권한 분리 토큰은 사용자 권한을 초과할 수 없음 |
| |
+-------------------------------------------------------------------------+
| |
| 예시: |
| |
| / -> @admins: Administrator |
| /vms -> @developers: PVEVMAdmin |
| /vms/100 -> user1@pve: NoAccess |
| |
| 결과: |
| - admins 그룹: 전체 관리자 권한 |
| - developers 그룹: /vms 하위 모든 VM 관리 권한 |
| - user1@pve (developers 멤버): VM 100 접근 불가, 나머지 VM 관리 가능 |
| |
+-------------------------------------------------------------------------+
6.2 실제 권한 계산¶
# 사용자의 실제 권한 확인
pveum user permissions developer1@pve
# 출력 예시:
# /:
# /vms: VM.Allocate,VM.Audit,VM.Backup,...
# /vms/100: (none)
# /storage/local: Datastore.Audit
# 특정 경로의 권한 확인
pveum user permissions developer1@pve --path /vms/101
# 토큰 권한 확인
pveum user token permissions joe@pve monitoring
7. 2단계 인증 (TFA)¶
7.1 TFA 유형¶
+-------------------------------------------------------------------------+
| Two-Factor Authentication Types |
+-------------------------------------------------------------------------+
| |
| +-------------------+------------------------------------------+ |
| | Type | Description | |
| +-------------------+------------------------------------------+ |
| | TOTP | 시간 기반 일회용 비밀번호 | |
| | | Google Authenticator, FreeOTP 등 사용 | |
| +-------------------+------------------------------------------+ |
| | WebAuthn | 하드웨어 보안 키 (YubiKey, TPM 등) | |
| | | FIDO2/WebAuthn 표준 | |
| +-------------------+------------------------------------------+ |
| | YubiKey OTP | YubiKey 전용 OTP (영역 레벨 강제) | |
| +-------------------+------------------------------------------+ |
| | Recovery Keys | 일회용 복구 키 (비상용) | |
| +-------------------+------------------------------------------+ |
| | U2F (Legacy) | 레거시 - WebAuthn으로 전환 권장 | |
| +-------------------+------------------------------------------+ |
| |
+-------------------------------------------------------------------------+
7.2 TOTP 설정¶
# TOTP 키 생성 (명령행)
oathkeygen # Base32 형식의 키 출력
# GUI에서 설정:
# Datacenter -> Permissions -> Two Factor -> Add -> TOTP
# 1. 키 생성 (Randomize)
# 2. QR 코드를 앱으로 스캔
# 3. 현재 OTP 코드 입력하여 검증
# 4. Apply
# 사용자별 TFA 확인
pveum user tfa list joe@pve
7.3 WebAuthn 설정¶
# 서버 설정 (/etc/pve/datacenter.cfg)
webauthn: rp=pve.example.com,origin=https://pve.example.com:8006,id=pve.example.com
# GUI에서 설정:
# Datacenter -> Options -> WebAuthn Settings
# - Relying Party: pve.example.com
# - Origin: https://pve.example.com:8006
# - ID: pve.example.com
# 사용자가 보안 키 등록:
# Datacenter -> Permissions -> Two Factor -> Add -> WebAuthn
# 보안 키 터치하여 등록
7.4 영역 레벨 TFA 강제¶
# 영역에 TFA 강제 적용 (TOTP)
pveum realm modify pve --tfa type=totp
# YubiKey OTP 강제
pveum realm modify pve --tfa type=yubico
# YubiKey 설정 (Yubico API 필요)
pveum realm modify pve --tfa "type=yubico,id=YOUR_API_ID,key=YOUR_API_KEY"
7.5 복구 키¶
# 복구 키 생성 (GUI에서만 가능)
# Datacenter -> Permissions -> Two Factor -> Add -> Recovery Keys
# 생성된 키를 안전한 곳에 보관
# 복구 키 사용:
# 로그인 시 OTP 대신 복구 키 입력
# 각 키는 한 번만 사용 가능
7.6 TFA 잠금 해제¶
# 사용자 TFA 잠금 해제 (관리자)
pveum user tfa unlock joe@pve
# 잠금 조건:
# - TOTP: 8회 실패 시 잠금
# - WebAuthn/Recovery: 100회 실패 시 1시간 차단
8. 리소스 풀¶
8.1 풀 개념¶
+-------------------------------------------------------------------------+
| Resource Pool Concept |
+-------------------------------------------------------------------------+
| |
| +-------------------+ |
| | Resource Pool | |
| | (dev-pool) | |
| +--------+----------+ |
| | |
| | contains |
| | |
| +--------v----------+ |
| | - VM 100 | |
| | - VM 101 | |
| | - CT 200 | |
| | - Storage: local | |
| +-------------------+ |
| |
| Permissions on /pool/dev-pool apply to all members |
| |
| 예: @developers: PVEAdmin on /pool/dev-pool |
| -> VM 100, 101, CT 200, local storage 모두 관리 가능 |
| |
+-------------------------------------------------------------------------+
8.2 풀 관리¶
# 풀 생성
pveum pool add dev-pool --comment "Development Resources"
pveum pool add prod-pool --comment "Production Resources"
# 풀 목록 조회
pveum pool list
# 풀에 VM/CT 추가 (VM 설정에서)
qm set 100 --pool dev-pool
pct set 200 --pool dev-pool
# 풀에 스토리지 추가
pveum pool modify dev-pool --storage local-lvm
# 풀에 권한 부여
pveum acl modify /pool/dev-pool -group developers -role PVEAdmin
# 풀 삭제
pveum pool delete dev-pool
9. 실전 시나리오¶
9.1 관리자 그룹 설정¶
# 관리자 그룹 생성
pveum group add sysadmins -comment "System Administrators"
# 관리자 역할 부여
pveum acl modify / -group sysadmins -role Administrator
# 관리자 추가
pveum user add admin1@pve -group sysadmins
pveum passwd admin1@pve
9.2 개발팀 환경 구성¶
# 개발팀 그룹 생성
pveum group add developers -comment "Development Team"
# 개발용 풀 생성
pveum pool add dev-pool --comment "Development Pool"
# 개발팀에 풀 관리 권한 부여
pveum acl modify /pool/dev-pool -group developers -role PVEAdmin
# 개발팀 스토리지 접근 권한
pveum acl modify /storage/local-lvm -group developers -role PVEDatastoreUser
# 개발자 추가
pveum user add dev1@pve -group developers
pveum user add dev2@pve -group developers
9.3 감사자 (Auditor) 설정¶
# 감사자 사용자 생성
pveum user add auditor@pve -comment "Security Auditor"
# 전체 읽기 권한 부여
pveum acl modify / -user auditor@pve -role PVEAuditor
9.4 위임된 사용자 관리¶
# 사용자 관리자 생성
pveum user add useradmin@pve -comment "User Administrator"
# 특정 영역과 그룹에 대한 사용자 관리 권한
pveum acl modify /access/realm/pve -user useradmin@pve -role PVEUserAdmin
pveum acl modify /access/groups/developers -user useradmin@pve -role PVEUserAdmin
# useradmin은 이제 pve 영역의 developers 그룹 사용자만 관리 가능
9.5 모니터링용 제한된 API 토큰¶
# 사용자에게 VM 관리 권한 부여
pveum acl modify /vms -user operator@pve -role PVEVMAdmin
# 모니터링 전용 토큰 생성 (권한 분리)
pveum user token add operator@pve monitoring -privsep 1
# 토큰에 읽기 전용 권한만 부여
pveum acl modify /vms -token 'operator@pve!monitoring' -role PVEAuditor
pveum acl modify /nodes -token 'operator@pve!monitoring' -role PVEAuditor
pveum acl modify /storage -token 'operator@pve!monitoring' -role PVEAuditor
# 권한 확인
pveum user permissions operator@pve # VM 관리 권한
pveum user token permissions operator@pve monitoring # 읽기만 가능
9.6 LDAP 통합 시나리오¶
# LDAP 영역 설정
pveum realm add company-ldap --type ldap \
--base_dn "ou=People,dc=company,dc=com" \
--user_attr uid \
--server1 ldap.company.com \
--group_name_attr cn \
--group_classes posixGroup
# 동기화 기본 설정
pveum realm modify company-ldap \
--sync-defaults-options "enable-new=1,scope=both"
# 초기 동기화
pveum realm sync company-ldap
# LDAP 그룹에 권한 부여 (그룹명에 -company-ldap 접미사 붙음)
pveum acl modify /vms -group developers-company-ldap -role PVEVMAdmin
# 정기 동기화 (cron)
# 0 */6 * * * root /usr/bin/pveum realm sync company-ldap --scope both
10. 명령어 참조¶
10.1 pveum 주요 명령어¶
# 사용자 관리
pveum user add <userid> [options]
pveum user modify <userid> [options]
pveum user delete <userid>
pveum user list [--full]
pveum passwd <userid>
pveum user permissions <userid> [--path <path>]
# 그룹 관리
pveum group add <groupid> [options]
pveum group modify <groupid> [options]
pveum group delete <groupid>
pveum group list
# 역할 관리
pveum role add <roleid> --privs <privileges>
pveum role modify <roleid> --privs <privileges>
pveum role delete <roleid>
pveum role list
# ACL 관리
pveum acl modify <path> [-user|-group|-token] <id> -role <role> [options]
pveum acl delete <path> [-user|-group|-token] <id> -role <role>
pveum acl list
# API 토큰
pveum user token add <userid> <tokenid> [options]
pveum user token remove <userid> <tokenid>
pveum user token list <userid> [<tokenid>]
pveum user token permissions <userid> <tokenid>
# 영역 관리
pveum realm add <realmid> --type <type> [options]
pveum realm modify <realmid> [options]
pveum realm delete <realmid>
pveum realm list
pveum realm sync <realmid> [options]
# 풀 관리
pveum pool add <poolid> [options]
pveum pool modify <poolid> [options]
pveum pool delete <poolid>
pveum pool list
# TFA 관리
pveum user tfa list <userid>
pveum user tfa unlock <userid>
10.2 설정 파일 위치¶
+-----------------------------+------------------------------------------+
| File | Description |
+-----------------------------+------------------------------------------+
| /etc/pve/user.cfg | 사용자, 그룹, ACL, 풀 설정 |
| /etc/pve/domains.cfg | 인증 영역 설정 |
| /etc/pve/priv/shadow.cfg | PVE 영역 비밀번호 해시 |
| /etc/pve/priv/realm/<name>.pw| LDAP/AD Bind 비밀번호 |
| /etc/pve/datacenter.cfg | WebAuthn/U2F 설정 |
| /etc/pve/priv/tfa.cfg | TFA 설정 |
+-----------------------------+------------------------------------------+
11. 모범 사례¶
11.1 보안 권장사항¶
+-------------------------------------------------------------------------+
| Security Best Practices |
+-------------------------------------------------------------------------+
| |
| 1. root@pam 사용 최소화 |
| - 일상 업무에 개인 계정 사용 |
| - root는 비상시에만 사용 |
| |
| 2. 최소 권한 원칙 |
| - 필요한 최소한의 권한만 부여 |
| - 커스텀 역할로 세분화된 권한 관리 |
| |
| 3. 그룹 기반 권한 관리 |
| - 개별 사용자 대신 그룹에 권한 부여 |
| - 역할 변경 시 그룹 멤버십만 변경 |
| |
| 4. 2단계 인증 필수화 |
| - 모든 관리자 계정에 TFA 설정 |
| - 복구 키 안전하게 보관 |
| |
| 5. API 토큰 보안 |
| - 권한 분리(privsep) 사용 |
| - 만료일 설정 |
| - 불필요한 토큰 정기적 정리 |
| |
| 6. 정기적인 감사 |
| - 사용자/권한 목록 주기적 검토 |
| - 비활성 계정 비활성화 또는 삭제 |
| |
+-------------------------------------------------------------------------+
11.2 LDAP/AD 통합 팁¶
# 1. 테스트 먼저 수행
pveum realm sync company-ldap --dry-run
# 2. 서비스 계정 사용
# - 읽기 전용 권한만 있는 전용 계정 사용
# - 비밀번호 정기 변경 정책 수립
# 3. 그룹 필터로 범위 제한
pveum realm modify company-ldap \
--group_filter "(&(objectClass=group)(cn=PVE_*))"
# 4. 동기화 자동화 (crontab)
0 */6 * * * /usr/bin/pveum realm sync company-ldap --scope both 2>&1 | logger -t pveum-sync
# 5. 인증 실패 시 폴백
# - 로컬 관리자 계정 유지 (LDAP 장애 대비)
12. 요약¶
12.1 핵심 개념¶
| 개념 | 설명 |
|---|---|
| 사용자 ID | username@realm 형식 |
| 영역 (Realm) | 인증 백엔드 (PAM, PVE, LDAP, AD, OpenID) |
| 그룹 | 사용자 집합, 권한 관리 단위 |
| 역할 | 권한(Privilege) 집합 |
| 권한 | 특정 작업 수행 권리 |
| 경로 | 권한이 적용되는 객체 |
| ACL | (경로, 주체, 역할) 조합 |
| 풀 | VM/CT/Storage 논리적 그룹 |
12.2 권한 적용 흐름¶
다음 모듈 예고¶
**Module 9: Ceph Cluster**에서는 다음을 학습합니다: - Ceph 아키텍처 (MON, OSD, MDS, MGR) - Proxmox VE에서 Ceph 배포 (pveceph 명령) - Pool 구성 및 CRUSH 규칙 - CephFS 공유 스토리지 - RBD VM 디스크 - Ceph 모니터링 및 유지보수