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


10

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

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

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

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

> take filename-to-receive

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

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

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

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


1
모든 사용자가 액세스 할 수있는 공유 디렉토리를 만들 수없는 이유가 있습니까?
Zoredache

1
공유 액세스 권한이있는 디렉토리가 있으면 권한이없는 사용자는 공유되는 파일에 액세스 할 수 있습니다. 이 환경에서 파일 이름도 민감한 경우가 있습니다. 불행히도 공유 디렉토리는 옵션이 아닙니다. 공유 디렉토리를 사용하면 세 번째 사용자가 파일을 변조 할 수도 있습니다.
Jon Bringhurst

크론 작업이 파일 자체를 복사하는 것으로 충분하지 않습니까? 예 : 사용자 foo는 사용자 강아지에게 파일 막대를 제공하려고합니다. 그래서 그는 사용자 이름을받는 'control'파일로 cron 작업으로 스캔되는 특수 디렉토리를 만듭니다. 크론 작업은이 '제어'파일을 읽습니다. 사용자가 정상이면 대상 디렉토리에 공간이 있습니다 (복사본이 있음). 'give'에 대한 래퍼를 작성하여 'control'파일을 작성하여 기록 호환성을 유지할 수 있습니다. suid-root가 필요하지 않으므로 root가 아닌 사용자로 해당 파일을 복사 한 다음 소유권을 변경하기 위해 sudo를 수행 할 수 있습니다.
jirib

권한을 변경하고 싶을 때는 변경 chown해야합니다. 관련된 당사자가 모두 동의하면 파일을 복사하려는 것 같습니다.
zebediah49

@JiriXichtkniha 나는 제어 파일과 크론 작업의 아이디어를 좋아한다. 그러나 파일이 너무 커서 복사 할 수 없습니다.
Jon Bringhurst

답변:


1

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

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

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


0

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

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


0

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 ~

0

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

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

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


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.