한 파일은 두 명의 사용자에게 속하려고합니다. 방법? 하드 링크 실패


32

두 프로그램을 setuid를, /usr/bin/bar그리고 /usr/bin/baz하나의 구성 파일을 공유 foo. 구성 파일의 모드는 0640민감한 정보를 보유하기 때문에입니다. 하나의 프로그램은 다음과 같이 실행됩니다 bar:bar(즉, 사용자 막대, 그룹 막대 ). 다른 baz:baz. 사용자 변경은 옵션이 아니며 그룹 변경도 바람직하지 않습니다.

단일 구성 파일을 /etc/bar/fooand 로 하드 링크하고 싶습니다 /etc/baz/foo. 그러나 내가 아는 한 파일이 root:bar또는에 속해야하기 때문에 이것은 실패합니다 root:baz.

잠재적 해결책 : barbaz회원이 bar및 인 새 그룹을 만듭니다 baz. 에 foo속 합시다 root:barbaz.

그것은 나에게 꽤 무거운 솔루션처럼 보입니다. foo두 프로그램간에 구성 파일을 공유하는 더 깔끔하고 간단한 방법이 없습니까?

지금은 동일한 사본 두 개를 유지하고 있습니다. 이것은 작동하지만 분명히 잘못되었습니다. 무엇이 옳을까요?

정보 : 유닉스 그룹에 대한 경험이 거의 없으며 setgid (2)에 대해서는 경험이 없습니다.


문제는 일반적으로 단계적으로 진행됩니다. 필자의 경우, 두 프로그램은 암호와 TLS 인증서를 공유 할 수있는 메일 처리 프로그램 인 Exim4와 Dovecot입니다.
thb

8
이것에 대한 우분투 (& Debian 생각) 솔루션은 ssl-cert그룹이며 거의 barbaz그룹입니다. 표준은 ssl-cert그룹이 모든 개인 키를 소유하도록 설정 하고 액세스해야하는 프로그램과 관련된 UID를 해당 그룹에 넣는 것입니다.
abligh

1
@abligh : 흥미 롭습니다. 내 시스템은 데비안 8 제시입니다. 분명히 ssl-cert설치시 postinst 스크립트가 사용자가 말하는 그룹을 만드는 패키지가 있습니다 . 나는 몰랐다 ssl-cert. Apache2 (내 호스트에 설치)에서 권장 ssl-cert 합니다. 다양한 Exim 및 Dovecot 패키지는 그렇지 않지만 Postfix (내 호스트에 설치되지 않음) 따라 다릅니다ssl-cert . Apache로 인해 내 호스트에는 ssl-cert 그룹이 있지만이 그룹에는 아직 멤버가 없습니다. 충고 감사합니다.
thb

5
setuid가 아닌 setgid 프로그램을 작성하십시오. Setuid 프로그램은 손상된 경우 바이너리를 대체하여 트로이 목마를 만들 수 있기 때문에 나쁜 생각입니다. (예외 : setuid root, 선택의 여지가 없기 때문에)
Gilles 'SO- 악의를 멈춰라'

1
wiki.dovecot.org/HowTo/EximAndDovecotSASL이 특정 상황을 해결 합니까 ?
MvG

답변:


50

ACL을 사용하여 두 그룹의 사람들이 파일을 읽을 수 있습니다.

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

이제 barbaz그룹 모두 파일을 읽을 수 있습니다.

예를 들어, 다음은 bin : bin이 640 모드로 소유 한 파일입니다.

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo

+수단 그래서 그것을 살펴 보자, ACL에 세트가있다.

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---

우리는 행을 볼 수 있습니다 group:sweh:r--. 즉, 그룹의 사람들 sweh이 읽을 수 있음을 의미 합니다.

이봐, 나야!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)

그리고 네, 파일을 읽을 수 있습니다.

$ cat foo
data

23

이 진술을 다시 고려할 수 있습니다.

잠재적 해결책 : 멤버가 bar및 인 새 그룹 바바 즈를 만듭니다 baz. 에 foo속 합시다 root:barbaz.

그것은 나에게 꽤 무거운 솔루션처럼 보입니다. foo두 프로그램간에 구성 파일을 공유하는 더 깔끔하고 간단한 방법이 없습니까?

새로운 그룹을 만드는 것이 왜 무겁습니까? 그렇게하면 ACL에 비해 다음과 같은 장점이 있습니다.

  • 이것을 명령 /usr/bin/bar과 가설로 가정했다고 말했지만 /usr/bin/baz,이 두 프로그램이 구성 파일을 공유 할 수 있다는 것은 관련이 있습니다. 이것은 프로그램이 자연스럽게 관련되어 있음을 나타냅니다. 이들을 위해 새 그룹을 작성하면 실제로 존재하는 관계를 설명하는 것처럼 보이고 (공통 구성 파일을 읽을 수있는 권한과 같은) 동작을 트리거해야합니다.
  • 그룹을 통해이 문제를 해결하는 것은 모든 Unix에 이식 가능하므로 모든 Unix 또는 Unix 계열 시스템에서 동일한 방식으로 정확하게 동일한 방식으로 작동 할 수 있습니다. ACL은 훨씬 더 복잡하며 이식성이 문제가 될 수 있습니다.

개인적으로 저는 여기서 ACL을 강력한 솔루션으로보고 그룹을 더 단순하고 전통적인 유닉스 방식으로 그룹화합니다.


16

이것이 ACL (Access Control Lists)의 일반적인 용도라고 생각합니다. 두 사용자 (또는 그룹)를 구성 파일의 ACL에 추가하십시오.

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
$ setfacl -m user : bar : rw- / etc / foo # 사용자 바가 foo를 읽고 쓸 수 있도록합니다.
$ setfacl -m user : baz : rw- / etc / foo # 사용자 baz도 foo를 읽고 쓸 수 있습니다

acl-package를 먼저 설치해야 할 수도 있습니다.


3

파일 모드 0660(또는 0440쓰기가 필요하지 않은 경우 에도 ) 및 소유권을 확인하십시오 bar:baz. 그런 다음 한 가지 프로세스는 사용자 권한으로 인해 파일에 액세스 할 수 있고 다른 프로세스는 그룹 권한으로 인해 파일에 액세스 할 수 있습니다. ACL이없는 파일 시스템에서도 작동합니다.


2

아직 언급되지 않았으므로 제출하겠습니다. 이것은 아마도 당신이 원하는 것이 아니지만 비슷한 질문을 가진 다른 사람들에게 답이 될 수 있습니다.

"새로운" "클라우드"방식은 모든 구성이 구성 관리 시스템 (예 : chef , puppet 또는 ansible )에 의해 처리되도록하는 것 입니다. 서버에 두 개의 서로 다르지만 동일한 파일이 있는지는 중요하지 않습니다. 둘 다 구성 관리 시스템의 단일 파일 사본이기 때문입니다.

이렇게하는 것의 주요 장점은 구성이 버전 이 다른 모든 과 함께 버전 지정 되어 있고 동일하거나 거의 동일한 새 서버를 배포하기가 쉬워 자동화 할 수 없다는 것입니다.

(기록을 위해 구성 관리를 사용하지 않기 때문에 @drg의 답변과 같이 그룹 시스템을 사용합니다).

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