권한을 변경하지 않고 디렉터리의 모든 파일을 읽기 전용으로 만드시겠습니까?

권한을 변경하지 않고 디렉터리의 모든 파일을 읽기 전용으로 만드시겠습니까?

먼저, 배경지식은 다음과 같습니다.

  • /dev/md1은 기본 파일 저장소로 사용되는 RAID-0 어레이입니다. /var/smb에 설치됩니다.
  • /dev/md2는 /dev/md1에서 가져온 백업 스냅샷을 저장하는 또 다른 RAID-0 어레이입니다. /var/smb/snapshots에 설치됩니다.
  • Samba를 통해 /var/smb/files(공용 공유 파일), /var/smb/private(개인 파일) 및 /var/smb/snapshots(백업 스냅샷에 대한 읽기 전용 액세스 제공)의 세 가지 디렉터리가 제공됩니다.

smbusers 그룹의 사용자만 파일 및 스냅샷 공유에 액세스할 수 있습니다. 마찬가지로 smbprivate 그룹의 사용자만 개인 파일에 액세스할 수 있습니다. 또한 Linux 권한은 적절한 그룹에 속하지 않은 사용자가 로컬 시스템 및 Samba 공유 스냅샷에 있는 파일 및 개인 디렉터리에 액세스하는 것을 방지합니다.

이는 셀프 서비스 "백업에서 복원" 옵션(사용자가 간단히 스냅샷 공유에 액세스하여 스스로 복원하려는 파일을 검색할 수 있음)을 갖춘 완전한 기능의 파일 서버가 있다는 의미이므로 훌륭하지만 지금까지는 한 가지 핵심 요소 누락됨: 로컬 시스템의 /var/smb/snapshots 디렉터리에 대한 루트가 아닌 액세스.

스냅 사진~ 해야 하다모든 일반 사용자에게는 엄격히 읽기 전용이지만 백업 작업을 위해서는 파일 시스템이 읽기-쓰기로 마운트되어야 합니다. 이 디렉터리에 대한 현재 권한은 다음과 같습니다.

root@odin:/var/smb# ll
total 40
drwxrwxr-x  7 root   root        4096 2011-04-11 15:18 ./
drwxr-xr-x 14 root   root        4096 2011-04-10 19:07 ../
drwxrwx--- 15 kromey smbusers    4096 2010-12-07 13:09 files/
drwxrwx---  7 kromey smbprivate  4096 2010-04-07 07:08 private/
drwxrwx---  3 root   root        4096 2011-04-11 15:16 snapshots/

이제 제가 원하는 것은 루트가 아닌 사용자에게 스냅샷 디렉터리에 대한 액세스 권한을 엄격히 읽기 전용 방식으로 제공하는 것입니다. 그러나 백업을 실행하려면 읽기-쓰기로 만들어야 하기 때문에 /dev/md2를 읽기 전용으로 마운트할 수 없습니다. 간단히 백업을 위해 읽기-쓰기로 다시 마운트한 다음 읽기 전용으로 다시 마운트할 수는 없습니다. 이는 사용자가 백업에 쓸 수 있는 또 다른 시간 창을 제공합니다.

이전에는 스냅샷 디렉터리를 읽기 전용 NFS 내보내기(로컬 호스트만 해당)로 설정하고 이를 로컬로 마운트(루트가 아닌 순회 권한이 없는 디렉터리 아래의 원래 보안 디렉터리 사용)하여 이 작업을 수행했지만 이는 해킹처럼 느껴집니다. 이를 달성하는 더 좋은 방법이 있어야 할 것 같습니다. 해당 옵션을 시도했지만 mount --bind두 디렉터리에 대해 서로 다른 액세스 수준(예: 읽기 전용 대 읽기-쓰기)을 갖는 기능이 부족한 것 같습니다(뭔가 누락되지 않는 한 :) mount -r --bind dir1 dir2.

NFS 없이 이를 수행하는 방법에 대한 아이디어가 있습니까? 아니면 이것이 최선의 선택입니까?

간단히 말해서:해당 파일 시스템에 백업된 파일의 원래 권한과 소유권을 유지하면서 선택한 사용자는 파일 시스템의 내용을 읽기/쓰기 가능하게 하고 다른 모든 사용자는 읽기 전용으로 엄격하게 설정하려면 어떻게 해야 합니까?

답변1

@Gilles 매우 가깝고 Ubuntu 10.10의 목표에서 약간 벗어났습니다 (Debian Squeeze 및 아마도 다른 것에 대한 적합성을 의심할 이유가 없습니다). 다른 사용자가 액세스할 수 없는 폴더(예: /var/smb/hidden/snapshots, 여기서 /var/smb/hidden에는 권한 770이 있고 root:root가 소유함) 아래에 읽기-쓰기 스냅샷 디렉터리를 마운트하면 읽기를 보호할 수 있습니다. -다른 사용자의 마운트를 작성합니다. 그런 다음 mount --bind후자를 사용하여 mount -o remount,ro설치를 액세스 가능한 위치에 바인딩한 다음 읽기 전용으로 설정할 수 있습니다 .

(반대 방법(원본 파일 시스템을 읽기 전용으로 마운트한 다음 읽기-쓰기로 바인딩)은 작동하지 않습니다. 마찬가지로 원본 파일 시스템을 읽기 전용으로 마운트한 다음 읽기 전용으로 바인딩한 다음 다시 원시 읽기 및 쓰기를 마운트하면 바인딩된 디렉터리도 읽고 쓸 수 있게 됩니다.

요약하자면 해결책은 다음과 같습니다.

mkdir /var/smb/hidden
chown root:root /var/smb/hidden
chmod 770 /var/smb/hidden
mkdir /var/smb/hidden/snapshots
mksdir /var/smb/snapshots
mount /dev/md2 /var/smb/hidden/snapshots
mount --bind /var/smb/hidden/snapshots /var/smb/snapshots
mount -o remount,ro /var/smb/snapshots

따라서 백업을 읽고 쓸 수 있고 일반적으로 액세스할 수 있는 짧은 시간이 있지만 요구 사항에는 충분하지 않습니다. 이러한 짧은 밀리초 창이 너무 크면 /var/smb에 대한 권한이 있는 일부 트릭을 사용하여 이 짧은 창 동안 이를 보호할 수 있습니다(순회 불가능하게 만든 다음 마운트를 바인딩한 다음 다시 순회 가능하게 만듭니다).

이제 이 모든 것을 하나의 스크립트에 넣으면 됩니다. 모든 것이 설치된 후 시작 프로세스에 이것을 삽입하면 바인딩 중인 디렉터리를 공유하려고 하는 Samba에서 발생할 수 있는 충돌을 피할 수 있습니다.

노트:귀하의 배포판이 Gilles가 게시한 버전을 지원하는 경우 mount -o bind,ro해당 솔루션이 여기에 있어야 한다고 권장합니다.오직다른 디렉터리에 바인딩할 때 설치 옵션을 변경할 수 없는 Ubuntu 또는 기타 배포판의 사용자가 사용합니다.

답변2

이 답변은 Debian에서 작동합니다(lenny 및 squeeze에서 테스트됨). 조사 결과, 이는 데비안 패치를 통해서만 작동하는 것으로 나타났습니다(예: Ubuntu).

당신은 그것을 사용할 수 있습니다 mount --bind. 공개적으로 액세스할 수 없는 디렉터리에 "실제" 파일 시스템을 마운트합니다. 보다 접근하기 쉬운 읽기 전용 바인드 마운트를 만듭니다. 읽기-쓰기 액세스로 노출하려는 부분에 대해 읽기-쓰기 바인드 마운트를 만듭니다.

mkdir /media/hidden /media/hidden/sdz99
chmod 700 /media/hidden
mount /dev/sdz99 /media/hidden/sdz99
mount -o bind,ro /media/hidden/sdz99/world-readable /media/world-readable
mount -o bind /media/hidden/sdz99/world-writable /media/world-writable

귀하의 사용 사례에서는 다음과 같이 할 수 있다고 생각합니다.

mkdir /var/smb/hidden
mv /var/smb/snapshot /var/smb/hidden
mkdir /var/smb/snapshot
chmod 700 /var/smb/hidden
chmod 755 /var/smb/hidden/snapshot
mount -o bind,ro /var/smb/hidden/snapshot /var/smb/hidden/snapshot

즉, 실제 snapshot디렉토리를 제한된 디렉토리에 두되 snapshot모든 사람에게 읽기 권한을 부여하십시오. 상위 항목에 대한 액세스가 제한되어 있으므로 직접 액세스할 수 없습니다. 모든 사람이 해당 경로를 통해 읽을 수 있도록 액세스 가능한 위치에 읽기 전용으로 바인드 마운트합니다.

(바인드 마운트가 도입된 지 몇 년 후에 읽기 전용 바인드 마운트가 가능해졌으므로 언제 작동하지 않았는지 기억하실 것입니다. 언제 작동했는지는 모르겠지만 데비안 lenny에서는 이미 작동했습니다(즉, 이제는 오래되었습니다.) 안정적인).

관련 정보