Skip to content

[SharedFS][NFS/SMB] 공유 하위 디렉터리별 POSIX 소유권·ACL 정책 관리 #916

Description

@dhslove

배경

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/updateStorageSmbAclshareid, 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 적용 순서

  1. instance, volume mount root, relative path를 canonical path로 해석합니다.
  2. 경로 이탈, symlink, mount/device 경계를 preflight합니다.
  3. 현재 stat, getfacl을 snapshot합니다.
  4. 정책에 따라 비재귀 owner UID/GID를 적용합니다.
  5. chmod 2775처럼 desired mode와 setgid를 적용합니다.
  6. 구조화된 access/default ACL entry를 setfacl 인자 배열로 적용합니다.
  7. stat, getfacl과 임시 생성 preflight로 effective 결과를 검증합니다.
  8. 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 재부팅 후 정책이 복구됩니다.

추적 관계

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:sharedfsEuropa SharedFS 및 Storage Service 기능 영역enhancementNew feature or requestpriority:high운영 안정성 또는 데이터 안전에 우선 대응이 필요한 과제significant

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions