사용자가 Linux에서 다른 사용자에게 파일을 전송하도록 허용하는 방법 노드에서 98,000

우리는 20 개의 컴퓨팅 노드에서 98,000 개의 컴퓨팅 노드에 이르는 크기의 약 40 개의 클러스터에서 애플리케이션을 실행하는 수천 명의 사용자 환경이 있습니다. 이 시스템의 사용자는 전통적인 유닉스 권한으로 제어되는 대용량 파일 (때로는 1PB 이상)을 생성합니다 (ACL은 파일 시스템의 특성상 일반적으로 사용할 수 없거나 실용적이지 않습니다).

현재 그룹 권한이 충분하지 않은 경우 사용자가 다른 사용자에게 파일을 “제공”할 수있는 suid-root 프로그램 인 “give”라는 프로그램이 있습니다. 따라서 사용자는 다른 사용자에게 파일을 제공하기 위해 다음과 같은 내용을 입력합니다.

> give username-to-give-to filename-to-give ...

수신 사용자는 “take”(제공 프로그램의 일부)라는 명령을 사용하여 파일을 수신 할 수 있습니다.

> take filename-to-receive

그런 다음 파일의 권한이 수신 사용자에게 효과적으로 전송됩니다.

이 프로그램은 수년 동안 사용되어 왔으며 보안 및 기능적 관점에서 사물을 다시 방문하고 싶습니다.

현재 우리의 행동 계획은 현재 “give”구현에서 비트 부패를 제거하고이를 프로덕션에 재배치하기 전에이를 오픈 소스 앱으로 패키지화하는 것입니다.

기존의 유닉스 권한 만 사용 가능한 경우 사용자간에 매우 큰 파일을 전송하는 데 사용하는 다른 방법이 있습니까?



답변

이미 터가 실제로 파일을 기꺼이 제공하려는 경우 SUID 바이너리를 사용하여 파일을 모두 쓸 수 있고 고정 비트 (와 같은 /tmp) 가있는 디렉토리로 이동 한 다음 소유권을 새로운 소유자로 변경하십시오. chown(3)이미 set-user-IDset-group-ID비트를 제거합니다 . 이렇게하면 새 소유자가 파일 이동을 포함하여 파일로 원하는 작업을 수행 할 수 있습니다.

홈 디렉토리에 여러 파일 시스템을 사용하고 성능이 즉시 끔찍하므로 파일 시스템 경계를 넘지 않도록하려는 경우 모두 쓸 수있는이 디렉토리는 사용자의 홈 디렉토리에 속할 수 있습니다. 이 경우 수신자는 새 파일이 제공되는시기를 수신자에게 알리고 싶을 것입니다.

전자 메일은 그 트릭을 할 것입니다. 더 많은 Unixy 솔루션은 /etc/profile새로 제공되는 파일을 나열 하는 것 입니다. 이 기능을 제공하는 경우 보너스가 추가되었습니다 pam_echo( 예 :file=/tmp/deliveries/%u참조 pam_echo(8)). PAM 관련 항목과 마찬가지로 모든 구현에서 이러한 모듈을 먼저 제공하는지 확인하고 싶을 것입니다.


답변

주어진 사용자에 대한 항목이 특정 파일 이름 구조 ( to-$username_from-$username.tar예 :)로 아카이브되는 공유 디렉토리 (아마 perms 실행)가있는 시스템을 사용할 수 있습니다 . Give는 파일과 chowns대상 사용자에게 파일을 제공합니다 . take는 파일을 추출하여 제거합니다.

실제로 이동 (IE, 파일 위치 및 권한 변경, 거대한 파일 크기로 인해 복사하지 않음)으로 수행하려는 경우 -x perms가있는 공유 디렉토리로 이동하여 벗어날 수 있습니다 (아무도 아무도 할 수 없음) 거기에 파일을 나열) 및 동일한 chown방법. mv, chown/ mv.


답변

xryl669는 디렉토리를 사용하여 실제로 파일을 공유 할 수 있다고 말합니다. 다음과 같아야합니다.

$ ls -ld shared
drwxrws--- 2 root usergroup 4096 somedate shared
$ ls -l shared
drwx-wx--- 2 user1 usergroup 4096 somedate user1
drwx-wx--- 2 user2 usergroup 4096 somedate user2
drwx-wx--- 2 user3 usergroup 4096 somedate user3
drwx-wx--- 2 user4 usergroup 4096 somedate user4

give 명령은

#!/bin/sh
#Use a random suffix to prevent guessing
RANDOM=$(dd if=/dev/urandom count=4 2> /dev/null | sha512sum | cut -d' ' -f1)
NEWNAME=/path/to/shared/$2/$1$RANDOM
#Move the file
mv $1 $NEWNAME
#Make it readable
chmod 440 $NEWNAME

take 명령은 다음과 같습니다.

$ cd /path/to/shared/user
$ ls
...
$ mv somefile ~


답변

나는 실제로 “주는”과 “찍는”을 모방하기 위해 응용 프로그램을 다시 작성하는 것이 좋습니다. 오히려 보호 된 디렉토리에서 “밀어 내고”당기십시오. 파일 이동을 처리하는 push / pull 앱에 대해서만 디렉토리에 액세스 할 수 있습니다. 또는 앱 / 스크립트가 발신자 및 수신자에게만 권한이 설정된 임의의 임시 디렉토리를 만들 수 있습니다.

더 많은 보안을 원하십니까? 수신자의 공개 키를 사용하여 파일을 PGP 암호화 / 서명 할 수 있습니다.

“보안 및 기능적 관점”에서 다시 실행하는 관점에서 SUID 프로그램을 작성 하지 않는 것이 좋습니다 . 적절한 방식으로 권한을 삭제하지 않으면 시스템의 모든 파일에 사실상 액세스 할 수 있습니다. 프로그램에 버그가있는 경우 (버퍼 오버 플로우 등)-시스템에서 루트 액세스 권한을 얻기 위해이를 활용할 수 있습니다.


답변

이것은 아마도 당신에게 쓸모는 없지만 cp –reflink source target 은 copy-on-write를 사용하여 파일의 씬 사본을 수행합니다.

즉, 파일을 완전히 복사 할 수 있으며 변경된 블록 만 실제로 복사됩니다. 하드 링크와 달리 새 파일에는 고유 한 inode 및 메타 데이터가 있으므로 표준 chown 항목을 사용하여 새 사용자에게 파일 사본을 제공 할 수 있습니다.

내가 아는 한 이것은 현재 OCFS2 및 btrfs에서만 사용할 수있는 기능입니다. 나는 그것이 당신의 문제를 해결하지만 그 가용성이 널리 퍼져 있지 않은 것으로 보아도 아마 유용하지 않을 것이라고 생각합니다.


답변