배경
NFS export와 SMB share가 동일한 백킹 볼륨 또는 디렉터리를 사용하는 환경에서는 특정 하위 디렉터리별로 POSIX owner, mode, access ACL, default ACL을 일관되게 관리해야 합니다.
대표 사례:
- 데이터 경로:
/export/wcmsnas1/wizard_new
- 유지할 owner:
1001001:1001001
- 디렉터리 mode:
2775
- 허용 그룹:
PNUDOM\\Domain Users의 SystemVM 매핑 GID 10006
- NFS와 SMB를 통해 같은 경로에 접근
실증 결과, 대상 디렉터리에 setgid와 access/default POSIX ACL을 적용하고 SMB 공유에 inherit owner = yes를 사용하면 기존 디렉터리 owner/inode는 유지하면서 SMB에서 생성한 새 파일과 디렉터리를 1001001:1001001로 만들 수 있었습니다. POSIX access/default ACL은 같은 파일시스템 경로를 사용하는 NFS 접근에도 적용되므로 프로토콜별 기능이 아닌 공통 경로 정책으로 관리해야 합니다.
확인된 AS-IS
SMB
createStorageSmbAcl/updateStorageSmbAcl은 shareid, principaltype, principal, permission만 받습니다.
- SMB ACL은 공유 연결을 허용할 AD/로컬 계정을 관리하며 하위 디렉터리 상대 경로를 표현하지 않습니다.
- SystemVM은 각 SMB ACL에 대해
apply_posix_acl(sharePath, ...)를 호출해 공유 백킹 경로 한 곳에만 access/default ACL을 적용합니다.
NFS
- NFS ACL은 export별 클라이언트 CIDR, 읽기/쓰기, squash 정책을 관리하며 하위 디렉터리 POSIX ACL 자원이 아닙니다.
- NFS export의 owner UID/GID, mode 정책도 export 백킹 경로 단위이며 같은 export 아래의 하위 디렉터리별 정책을 저장·조회하지 않습니다.
- NFS 클라이언트의 실제 파일 접근은 export ACL을 통과한 뒤 서버 파일시스템의 UID/GID와 POSIX ACL에 의해 다시 판정됩니다.
공통 한계
- API, DB desired-state, runtime inventory, UI에 canonical backing path 하위 디렉터리별 POSIX 정책 자원이 없습니다.
- 수동
chown, chmod 2775, setfacl은 데이터 볼륨에 남지만 제품이 desired/effective 상태, drift, 충돌, 재적용을 관리하지 않습니다.
- 동일 경로를 NFS와 SMB가 함께 사용하면 프로토콜별 설정이 같은 파일시스템 메타데이터를 서로 다른 기준으로 변경할 수 있습니다.
설계 원칙
프로토콜 접근 정책과 POSIX 디렉터리 정책을 분리합니다.
- NFS export ACL: 허용 클라이언트 CIDR, 권한, squash 및 NFS identity 정책
- SMB 계정 ACL: 공유 연결을 허용할 AD/로컬 사용자와 그룹
- POSIX 디렉터리 정책: canonical 경로의 owner UID/GID, mode, access ACL, default ACL
- 실제 접근은
프로토콜 ACL 통과 AND POSIX 파일시스템 권한 통과 조건을 모두 만족해야 합니다.
- 동일 canonical 경로는 NFS/SMB와 무관하게 하나의 POSIX 정책만 소유합니다.
TO-BE
공통 관리 자원
Storage Service 인스턴스와 백킹 볼륨 아래에 POSIX 디렉터리 정책 자원을 추가합니다.
instanceId, volumeId
relativePath: 선택된 볼륨 루트 기준 정규화된 상대 경로
canonicalPath: SystemVM이 계산한 읽기 전용 실제 경로
ownerUid, ownerGid
directoryMode: setgid를 포함한 octal mode. 예: 2775
applyOwner: owner 변경 여부
recursive: 기본값 false; 일반 UI에서는 비재귀만 제공
accessEntries: 현재 디렉터리의 named POSIX ACL
defaultEntries: 새 하위 항목이 상속할 default POSIX ACL
state, revision, lastApplied, effectiveUid, effectiveGid, effectiveMode, driftStatus
NFS export/ACL 또는 SMB share/ACL 레코드에 하위 경로 정책을 중복 저장하지 않고 protocol-neutral 자원으로 관리합니다.
API
다음 API를 추가합니다.
createStoragePosixDirectoryPolicy
updateStoragePosixDirectoryPolicy
deleteStoragePosixDirectoryPolicy
listStoragePosixDirectoryPolicies
applyStoragePosixDirectoryPolicy
ACL entry 모델:
principalType: NUMERIC_UID, NUMERIC_GID, LOCAL_USER, LOCAL_GROUP, AD_USER, AD_GROUP
principal: 숫자 ID 또는 계정/그룹 이름
permission: READ_ONLY, READ_WRITE, FULL_CONTROL
scope: ACCESS, DEFAULT, ACCESS_AND_DEFAULT
AD principal은 SystemVM의 winbind/getent로 effective UID/GID를 해석하고 runtime 응답에 resolved numeric ID를 기록합니다. NFS 클라이언트는 서버에서 해석된 숫자 UID/GID를 기준으로 POSIX ACL을 적용받으므로 UI에 원본 principal과 effective numeric ID를 함께 표시합니다.
NFS 동작 규칙
- POSIX access/default ACL은 NFS export ACL을 대체하지 않습니다.
root_squash이면 클라이언트 root는 anonymous UID/GID로 변환된 뒤 POSIX ACL 평가를 받습니다.
no_root_squash이면 클라이언트 root UID 0이 유지되지만 디렉터리 mode와 ACL 정책은 그대로 표시·관리합니다.
- setgid는 NFS에서 생성한 새 객체의 GID를 부모 GID로 상속합니다.
- NFS에서 생성한 새 객체의 UID는 NFS identity mapping 결과를 따릅니다. 모든 생성 UID를 하나로 고정하려면 export의 squash/anonymous UID 정책 또는 일관된 numeric UID 정책을 별도로 사용합니다.
- default ACL은 NFS에서 생성한 파일/디렉터리에도 상속됩니다.
SMB 동작 규칙
- SMB 계정 ACL은 기존
valid users, write list, read only를 계속 사용합니다.
- 새 파일 UID를 부모 UID로 상속해야 하면 #915의 공유 단위
INHERIT_PARENT_OWNER 정책을 사용합니다.
- 새 파일/디렉터리 GID는 디렉터리 setgid로 상속합니다.
- #915의
inherit owner는 share 단위이므로 같은 share의 각 하위 경로가 자신의 부모 UID를 상속합니다.
- 특정 하위 트리에만 독립된 Samba 설정이 필요하면 #910의 중첩 SMB share로 분리합니다.
경로 및 데이터 안전
relativePath의 빈 값, 절대 경로, ./.., NUL 및 비정상 구분자를 거부합니다.
- canonical
realpath가 선택된 볼륨 mount root 아래인지 확인합니다.
- symlink 경로 이탈, 다른 mount/device 경계, 다른 정책 소유 경로를 차단합니다.
- 동일 경로를 사용하는 모든 NFS export/SMB share를 조회해 #903의 공통 path policy와 호환성을 검사합니다.
- 기본 적용은 대상 디렉터리 한 곳에만 수행하며 기존 하위 파일에 재귀
chown/chmod/setfacl을 실행하지 않습니다.
- 정책 삭제 시 디렉터리와 데이터는 삭제하지 않습니다. ACL 제거 여부는 별도 최종 확인을 받습니다.
- 적용 전
stat/getfacl snapshot을 저장하고 실패 시 이전 상태를 복구합니다.
SystemVM 적용 순서
- instance, volume mount root, relative path를 canonical path로 해석합니다.
- 경로 이탈, symlink, mount/device 경계를 preflight합니다.
- 현재
stat, getfacl을 snapshot합니다.
- 정책에 따라 비재귀 owner UID/GID를 적용합니다.
chmod 2775처럼 desired mode와 setgid를 적용합니다.
- 구조화된 access/default ACL entry를
setfacl 인자 배열로 적용합니다.
stat, getfacl과 임시 생성 preflight로 effective 결과를 검증합니다.
- runtime inventory에 effective owner/mode/ACL, resolved IDs, drift를 기록합니다.
대표 desired 결과:
chown 1001001:1001001 /export/wcmsnas1/wizard_new
chmod 2775 /export/wcmsnas1/wizard_new
setfacl -m g:10006:rwx,m::rwx /export/wcmsnas1/wizard_new
setfacl -d -m u::rwx,g::rwx,g:10006:rwx,m::rwx,o::r-x /export/wcmsnas1/wizard_new
제품 구현은 검증된 구조화 desired-state를 인자 배열로 실행하며 shell 문자열을 직접 조합하지 않습니다.
UI
- NFS 탭과 SMB 탭에 동일한
POSIX 디렉터리 정책 목록을 표시합니다.
- 동일 canonical path 정책은 양쪽 탭에서 같은 ID/revision/effective 값을 보여줍니다.
- 생성/수정 모달은 세로형·단일 내부 스크롤·다크모드·i18n 기준을 따릅니다.
- 볼륨, 상대 경로, 계산된 실제 경로, owner UID/GID, mode, setgid, access ACL, default ACL을 구분합니다.
- NFS에서는 export CIDR/squash/numeric identity와 POSIX ACL의 판정 순서를 안내합니다.
- SMB에서는 계정 ACL과 POSIX ACL의 판정 순서 및
inherit owner 연계를 안내합니다.
- AD principal의 이름과 SystemVM에서 해석된 numeric UID/GID를 함께 표시합니다.
하위 항목까지 적용은 기본 비활성화하며 이번 범위에서는 재귀 적용을 제공하지 않습니다.
- 변경 preview에 영향받는 NFS export/SMB share, 현재/변경 후 stat/ACL, 기존 하위 데이터 비변경을 표시합니다.
- 삭제는 경고와 최종 확인을 거치며 실제 디렉터리/데이터를 보존합니다.
구현 범위
- DB: protocol-neutral POSIX directory policy 및 ACL entry
- API: create/update/delete/list/apply 및 response
- Backend: canonical path lock, protocol impact 조회, validation, desired-state, rollback/reconcile
- SystemVM: 비재귀 owner/mode/access/default ACL 적용 및 drift 수집
- UI: NFS/SMB 공통 정책 목록, 생성/수정/삭제, preview, effective 상태
- Test: API contract, backend unit, SystemVM path safety, NFS/SMB E2E, 교차 프로토콜, reconcile/reboot
테스트 게이트
- 대상 디렉터리 owner
1001001:1001001, mode 2775가 적용되고 기존 inode와 하위 데이터는 변경되지 않습니다.
- 허용된 Domain Users가 SMB 계정 ACL과 POSIX ACL을 모두 통과해 읽기/쓰기할 수 있습니다.
- 허용된 NFS 클라이언트가 export ACL과 POSIX ACL을 모두 통과해 읽기/쓰기할 수 있습니다.
- SMB에서 #915와 결합해 만든 새 파일/디렉터리는
1001001:1001001을 가집니다.
- NFS에서 만든 새 객체는 NFS identity mapping UID와 setgid 부모 GID를 가지며 default ACL을 상속합니다.
root_squash, no_root_squash, numeric UID/GID 모드별 POSIX ACL 판정이 예상과 일치합니다.
- 정책 대상 밖의 다른 하위 디렉터리는 owner/mode/ACL 변경 영향을 받지 않습니다.
- NFS CIDR ACL 또는 SMB 계정 ACL을 통과하지 못한 주체는 POSIX ACL이 있어도 접근 권한을 얻지 못합니다.
- 경로 이탈, symlink, 다른 mount, 다른 정책 소유 경로를 적용 전에 차단합니다.
- desired-state 재적용과 SystemVM 재부팅 후 owner/mode/access/default ACL 및 drift 상태가 복구됩니다.
- 정책 삭제 후 실제 디렉터리와 파일은 보존됩니다.
완료 조건
- 운영자가 SystemVM에서 수동
chown/chmod/setfacl을 실행하지 않고 NFS/SMB가 사용하는 하위 디렉터리별 POSIX 정책을 API/UI로 관리할 수 있습니다.
- 프로토콜 접근 ACL과 POSIX 디렉터리 정책이 독립적으로 저장·표시되고 실제 접근 판정에서 함께 적용됩니다.
- 동일 canonical path의 desired/effective 정책이 NFS/SMB/API/DB/SystemVM/UI에서 하나의 값으로 일치합니다.
- 기존 데이터에 재귀 변경을 가하지 않고 새 객체 상속 정책을 안전하게 구성할 수 있습니다.
- reconcile 및 SystemVM 재부팅 후 정책이 복구됩니다.
추적 관계
배경
NFS export와 SMB share가 동일한 백킹 볼륨 또는 디렉터리를 사용하는 환경에서는 특정 하위 디렉터리별로 POSIX owner, mode, access ACL, default ACL을 일관되게 관리해야 합니다.
대표 사례:
/export/wcmsnas1/wizard_new1001001:10010012775PNUDOM\\Domain Users의 SystemVM 매핑 GID10006실증 결과, 대상 디렉터리에 setgid와 access/default POSIX ACL을 적용하고 SMB 공유에
inherit owner = yes를 사용하면 기존 디렉터리 owner/inode는 유지하면서 SMB에서 생성한 새 파일과 디렉터리를1001001:1001001로 만들 수 있었습니다. POSIX access/default ACL은 같은 파일시스템 경로를 사용하는 NFS 접근에도 적용되므로 프로토콜별 기능이 아닌 공통 경로 정책으로 관리해야 합니다.확인된 AS-IS
SMB
createStorageSmbAcl/updateStorageSmbAcl은shareid,principaltype,principal,permission만 받습니다.apply_posix_acl(sharePath, ...)를 호출해 공유 백킹 경로 한 곳에만 access/default ACL을 적용합니다.NFS
공통 한계
chown,chmod 2775,setfacl은 데이터 볼륨에 남지만 제품이 desired/effective 상태, drift, 충돌, 재적용을 관리하지 않습니다.설계 원칙
프로토콜 접근 정책과 POSIX 디렉터리 정책을 분리합니다.
프로토콜 ACL 통과 AND POSIX 파일시스템 권한 통과조건을 모두 만족해야 합니다.TO-BE
공통 관리 자원
Storage Service 인스턴스와 백킹 볼륨 아래에
POSIX 디렉터리 정책자원을 추가합니다.instanceId,volumeIdrelativePath: 선택된 볼륨 루트 기준 정규화된 상대 경로canonicalPath: SystemVM이 계산한 읽기 전용 실제 경로ownerUid,ownerGiddirectoryMode: setgid를 포함한 octal mode. 예:2775applyOwner: owner 변경 여부recursive: 기본값false; 일반 UI에서는 비재귀만 제공accessEntries: 현재 디렉터리의 named POSIX ACLdefaultEntries: 새 하위 항목이 상속할 default POSIX ACLstate,revision,lastApplied,effectiveUid,effectiveGid,effectiveMode,driftStatusNFS export/ACL 또는 SMB share/ACL 레코드에 하위 경로 정책을 중복 저장하지 않고 protocol-neutral 자원으로 관리합니다.
API
다음 API를 추가합니다.
createStoragePosixDirectoryPolicyupdateStoragePosixDirectoryPolicydeleteStoragePosixDirectoryPolicylistStoragePosixDirectoryPoliciesapplyStoragePosixDirectoryPolicyACL entry 모델:
principalType:NUMERIC_UID,NUMERIC_GID,LOCAL_USER,LOCAL_GROUP,AD_USER,AD_GROUPprincipal: 숫자 ID 또는 계정/그룹 이름permission:READ_ONLY,READ_WRITE,FULL_CONTROLscope:ACCESS,DEFAULT,ACCESS_AND_DEFAULTAD principal은 SystemVM의 winbind/getent로 effective UID/GID를 해석하고 runtime 응답에 resolved numeric ID를 기록합니다. NFS 클라이언트는 서버에서 해석된 숫자 UID/GID를 기준으로 POSIX ACL을 적용받으므로 UI에 원본 principal과 effective numeric ID를 함께 표시합니다.
NFS 동작 규칙
root_squash이면 클라이언트 root는 anonymous UID/GID로 변환된 뒤 POSIX ACL 평가를 받습니다.no_root_squash이면 클라이언트 root UID 0이 유지되지만 디렉터리 mode와 ACL 정책은 그대로 표시·관리합니다.SMB 동작 규칙
valid users,write list,read only를 계속 사용합니다.INHERIT_PARENT_OWNER정책을 사용합니다.inherit owner는 share 단위이므로 같은 share의 각 하위 경로가 자신의 부모 UID를 상속합니다.경로 및 데이터 안전
relativePath의 빈 값, 절대 경로,./.., NUL 및 비정상 구분자를 거부합니다.realpath가 선택된 볼륨 mount root 아래인지 확인합니다.chown/chmod/setfacl을 실행하지 않습니다.stat/getfaclsnapshot을 저장하고 실패 시 이전 상태를 복구합니다.SystemVM 적용 순서
stat,getfacl을 snapshot합니다.chmod 2775처럼 desired mode와 setgid를 적용합니다.setfacl인자 배열로 적용합니다.stat,getfacl과 임시 생성 preflight로 effective 결과를 검증합니다.대표 desired 결과:
제품 구현은 검증된 구조화 desired-state를 인자 배열로 실행하며 shell 문자열을 직접 조합하지 않습니다.
UI
POSIX 디렉터리 정책목록을 표시합니다.inherit owner연계를 안내합니다.하위 항목까지 적용은 기본 비활성화하며 이번 범위에서는 재귀 적용을 제공하지 않습니다.구현 범위
테스트 게이트
1001001:1001001, mode2775가 적용되고 기존 inode와 하위 데이터는 변경되지 않습니다.1001001:1001001을 가집니다.root_squash,no_root_squash, numeric UID/GID 모드별 POSIX ACL 판정이 예상과 일치합니다.완료 조건
chown/chmod/setfacl을 실행하지 않고 NFS/SMB가 사용하는 하위 디렉터리별 POSIX 정책을 API/UI로 관리할 수 있습니다.추적 관계