web-dev-qa-db-ja.com

1つのファイルが2人のユーザーに属したい。どうやって?ハードリンクが失敗する

2つのsetuidプログラム/usr/bin/barおよび/usr/bin/bazは、単一の構成ファイルfooを共有します。構成ファイルのモードは0640です。これは、機密情報を保持するためです。 1つのプログラムはbar:bar(つまり、ユーザーbar、グループbar)として実行されます。もう1つはbaz:bazです。 ユーザーの変更はオプションではありませんで、グループを変更することも好ましくありません。

単一の構成ファイルを/etc/bar/fooおよび/etc/baz/fooとしてハードリンクしたいと思います。ただし、このファイルは、私の知る限り、root:barまたはroot:bazのいずれかに属している必要があるため、失敗します。

考えられる解決策:メンバーがbarbazおよびbarである新しいグループbazを作成します。 fooroot:barbazに属させます。

それは私にとってかなり強引な解決策のように見えます。 2つのプログラム間で構成ファイルfooを共有する、より簡潔で簡単な方法はありませんか?

今のところ、私はファイルの2つの同一のコピーを維持しています。これは機能しますが、明らかに間違っています。何が正しいでしょうか?

情報:私はUnixグループについてはほとんど経験がなく、setgid(2)については経験がありません。

32
thb

ACLを使用すると、両方のグループのユーザーがファイルを読み取ることができます。

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

これで、barグループとbazグループの両方がファイルを読み取ることができます。

たとえば、モード640のbin:binが所有するファイルを次に示します。

$ 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
50
Stephen Harris

次のステートメントを再検討することをお勧めします。

可能な解決策:メンバーがbarおよびbazである新しいグループbarbazを作成します。 fooroot:barbazに属させます。

それは私にとってかなり強引な解決策のように見えます。 2つのプログラム間で構成ファイルfooを共有する、より簡潔で簡単な方法はありませんか?

新しいグループを作成するのが重労働なのはなぜですか?これには、ACLに比べて次の利点があります。

  • コマンド/usr/bin/bar/usr/bin/bazを使用して、これを架空のものとして表現しましたが、これら2つのプログラムが構成ファイルを共有できることは重要です。これは、プログラムが自然に関連していることを示唆しています。それらの新しいグループを作成すると、実際に存在し、動作(共通の構成ファイルを読み取るためのアクセス許可など)をトリガーする必要がある関係が記述されているように見えます。
  • グループを介してこの問題を解決することはevery Unixに移植可能です。つまり、任意のUnixまたはUnixライクなシステムで、同じメカニズムにまったく同じ方法で依存できます。 ACLははるかに複雑であり、移植性が問題になる可能性があります。

個人的には、ここではACLを強引な解決策と見なし、グループ化をより単純で伝統的なUnixの方法と見なしています。

23
user9999999

これはAccess Control Lists(ACL)の典型的な使用法になると思います。両方のユーザー(またはグループ)を構成ファイルのACLに追加します。

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
 $ setfacl -m user:bar:rw-/etc/foo#ユーザーbarがfooを読み書きできるようにします
 $ setfacl -m user:baz:rw-/etc/foo#また、許可しますfoo 
を読み書きするユーザーbaz

最初にacl-packageをインストールする必要がある場合があります。

16
Baard Kopperud

ファイルのモードを作る0660 (あるいは 0440書き込みが必要ない場合)と所有権bar:baz。次に、1つのプロセスがユーザー権限のおかげでファイルにアクセスでき、もう1つのプロセスがグループ権限のおかげでファイルにアクセスできます。これは、ACLが機能しないファイルシステムでも機能します。

3
MvG

まだ記載されていないので提出します。これはおそらくあなたが望むものではないかもしれませんが、同様の質問を持つ他の人々にとっては答えかもしれません。

「新しい」「クラウド」の方法は、すべての構成を 構成管理 システム( chefpuppet 、-など)で処理することです ansible )。その場合、どちらも構成管理システムからの単一ファイルのコピーであるため、サーバー上に2つの異なるが同一のファイルがあることは重要ではありません。

このようにすることの主な利点は、構成が versioned であり(構成の残りすべてと同様)、新しい同一またはほぼ同一のサーバーの配備が非常に簡単になるため、自動化。

(記録としては、構成管理を使用していないため、@ drgの回答のようにグループシステムを使用します)。

2
Law29