複数のグループをディレクトリ所有者として設定する


31

私のサーバーにはディレクトリがあり/srv/svnます。

例えば、複数のグループ所有権を持っているために、このディレクトリを設定することが可能であるdevFirmAdevFirmBdevFirmC

ポイントは、subversion複数のリポジトリにまたがる複数のユーザーをバージョン管理したいのです /srv/svnマージの方法、リポジトリのルートディレクトリ、アクセス許可わからないことです。たとえば、3つの会社FirmAFirmBありFirmCます。今、内部の/srv/svn私は3つのディレクトリを作成しました、FirmAFirmBFirmCおよびそれらの内側に、私はプロジェクトごとにリポジトリを作成しましたし、今私は内のすべてのelementesがあるため、許可制度を確立する方法がわからない/srv/svnが所有しているroot:root[OK]をされていない、または私は違う?


1
企業グループは互いにファイルにアクセスしますか?または、親ディレクトリを共有する以外に、完全に分離していますか?
JMベッカー

@TechZilla会社グループは、お互いのファイルにアクセスしてはならず、それらは分離されなければならず、私だけがすべてのディレクトリにアクセスできなければなりません。
KernelPanic

OK、正解を投稿しました。これにはACLを使用しないでください。それらは最後の手段であり、この問題は依然として非常に一般的なものです。
JMベッカー

回答:


16

これは、私が正確に理解し、絶えず遭遇する場合、非常に一般的な問題です。些細なグループ化問題ごとにACLを使用すると、管理不能なシステムが大量に発生します。この状況ではなく、他の方法でできない場合に、ベストプラクティスを使用しています。これは、私が強くお勧めする方法です。

まず、umaskを002に設定する必要があります。これは、グループが自分自身と共有できるようにするためです。通常、のようなファイルを作成/etc/profile.d/firm.shし、umaskを使用してテストコマンドを追加します。

[ $UID -gt 10000 ] && umask 002

次に、ディレクトリをそれぞれのグループに設定する必要があります。

chgrp -R FirmA /srv/svn/FirmA 
chgrp -R FirmB /srv/svn/FirmB
chgrp -R FirmC /srv/svn/FirmC

最後に、SGIDビットを適切に設定する必要があるため、グループは常に設定したものにとどまります。これにより、書き込まれたファイルがライターのGIDに設定されなくなります。

find /srv/svn/FirmA -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmB -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmC -type d -print0 | xargs -0 chmod 2775

find /srv/svn/FirmA -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmB -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmC -type f -print0 | xargs -0 chmod 664

最後に、他のユーザーがディレクトリにアクセスできないようにする場合。

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC

2
警告:これは動作するはずですが、すべてのファイルの実行許可ビットを削除します。ディレクトリツリーがドキュメントのみを保持している場合、これは問題ありません。実行可能ファイルが含まれている場合、実行が妨げられ、セットアップが台無しになる可能性があります。
ステファンゴーリチョン16

1
これもいいアイデアかもしれませんが、質問にはまったく答えません。
セビング

説明したように、これは3つのフォルダーのみをパーティション分割するため、各企業のメンバーのみがそれぞれのファイルのみを変更できます。「svn」に必要なアクセス権を付与しません。
リッチp

これは非常に近いです。欠けているのは、すべてのグループへのアクセスを許可することです。ログインを想定して、このステップを追加しますsvnadminsudo usermod -a -G FirmA,FirmB,FirmC svnadmin これsvnadminにより、これらのすべてのグループに追加されます。これらすべてのグループのファイルでは「グループ書き込み」が有効になっているため(chmod 664これを実行したため)、あなたとfirmXが、firmXが所有するファイルの唯一の作成者になります。
リッチp

1
より良い-あなたが追加/減算したいものを追加/減算する権限を変更します-例えばfind /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
リッチp

25

所有者として持つことができるグループは1つだけです。

ただし、アクセス制御リストを使用して、他のグループの権限を定義できます。

コマンドを発行してACLがインストールされているかどうかを確認してくださいgetfacl。システムにACLがインストールされていない場合は、aclパッケージに含まれるコマンドラインツールをインストールしますsudo apt-get install acl

を使用getfaclすると、ディレクトリまたは他のファイルのACL情報を読み取ったりsetfacl、ファイルにグループを追加したりできます。

例えば:

setfacl -m g:devFirmB:rwx /srv/svn/  

r ead、wでグループdevFirmBを追加します儀式、E Xディレクトリにecute権限を/srv/svn

そのディレクトリで作成されたファイルを複数のグループが所有する場合も、ACLをデフォルトACLとして設定します。Xデフォルトのグループエントリ手段の「所有者(または他の誰か)が実行可能な場合は、実行を許可します」。

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  

6

従来のUnix権限を持つ複数のLinuxグループがファイルを所有することはできません。(ただし、ACLでは可能です。)

しかし、あなたは次の回避策を使用して(例えば呼ばれる新しいグループを作成可能性があるdevFirmsグループのすべてのユーザーが含まれます)devFirmAdevFirmBおよびdevFirmC
新しいユーザーグループを作成するには:

sudo addgroup NEWGROUPNAME

まず、-command id-utilsを取得するためにインストールする必要がある場合がありますlid

sudo apt-get install id-utils

そして、あなたは、すべてのユーザーがコピー簡単に次のコード行を実行することができますSOURCEGROUPしますTARGETGROUP。もちろん、コピーするグループごとにコマンドを1回実行する必要があります。大文字のプレースホルダーを実際のグループ名に置き換えることを忘れないでください。

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done

したがって、あなたの場合、コマンドを実行する必要があります(すべての行を一度に):

sudo addgroup devFirms &&
for u in $(lid -g -n devFirmA); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmB); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmC); do sudo usermod -a -G devFirms $u; done

これらのコマンドは、ソースグループの現在のメンバーであるすべてのユーザーのみをコピーすることに注意してください。後で追加されるすべてのユーザーも、adduserコマンドを使用して共通グループに手動で追加する必要があります。大文字のプレースホルダーを実際のユーザー名とグループ名(devFirms)に置き換えます。

sudo adduser NEWUSER TARGETGROUP

おかげでジャスティンエティエで彼の答えのためのUnix&Linux.SE:別のグループに1つのグループのすべてのユーザーを追加しますか?


@Gilles質問の私の更新のように、複数のユーザーがいるSubversionサーバーの複数のリポジトリでスキームが機能すると思いますか?
KernelPanic

2

いいえ、これは不可能です。

各ファイル(およびディレクトリ)は、1人のユーザーと1つのグループのみを持つことができます。


6
同じまたは同様の結果を得るための代替アプローチを提供することは良いことです。
バイトコマンダー

2

複数のグループまたはユーザーに異なる権限を提供するには、次のコマンドを使用します(RHEL 6および7でテスト済み):

グループの新しい所有者を作成するには:

setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>

現在のACL設定を確認するには:

getfacl <directory_name>

テスト済み、Ubuntu 16.04.3でも動作
Dmitry
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.