web-dev-qa-db-ja.com

ユーザーが特定のファイルのファイル所有権をsudoなしで変更できるようにする

この状況があるとしましょう:

-rwxrwx-r- 1 user1 mygroup  0 Sep 12 16:53 testfile

開発者のグループが同じVM(Linux)に取り組んでいます。チェックアウト/チェックインの概念をシミュレートする必要があります。ユーザーがファイルをチェックアウトする場合、チェックインするまで誰もファイルを書き込めません。

ファイルの所有者を変更してみました。ユーザーがチェックアウトするたびに、ファイルの所有者になり、他のユーザーがファイルに書き込みできないようにし、ファイルの所有者をデフォルトに変更してチェックインし、ファイルのアクセス権をデフォルトに戻します。つまり、chownchmodが必要ですが、これらのコマンドにはSudoが必要であり、開発者にSudo許可を与えることはできません。

特定のファイルのみをchownおよびchmodする可能性をユーザーに与えることはできますか?

4
ILY

条件をチェックするスクリプトを作成してから、ユーザーにSudothatスクリプトのみへのアクセス権を付与する必要があります。何かのようなもの:

#! /bin/bash
set -e
die()
{
    printf "%s\n" "$@"
    exit 1
}

if [[ $EUID != 0 ]]
then
    die "This script must be run with Sudo."
fi

DEFAULT_USER=nobody
SOURCE_DIR=/some/dir

cd "$SOURCE_DIR"

# Get path of file relative to the source directory
# Then we can check if it is actually in the directory.
FILE=$(realpath -e --relative-base="$SOURCE_DIR" "${1?}")    
if [[ $FILE == /* ]]
then
    die "$1 is outside $SOURCE_DIR."
fi

FILE_OWNER=$(stat -c %U "$FILE")

case $FILE_OWNER in
    $DEFAULT_USER)
        # checkout
        echo "Checking out $FILE..."
        chown "$Sudo_USER" "$FILE"
        ;;
    $Sudo_USER)
        # checkin
        echo "Checking in $FILE..."
        chown nobody "$FILE"
        ;;
    *)
        die "Sorry, this file is checked out by $FILE_OWNER."
        ;;
esac

これを、たとえば/usr/local/bin/checkとして保存し、次のsudoersルールを追加します。

%dev ALL = (root) /usr/local/bin/check

それは仮定しています:

  • 開発者はすべてdevグループに属しています(そうでない場合は、ユーザー名またはグループを適宜使用してください)。
  • ファイルは/some/dirにあります。それに応じて$SOURCE_DIRを変更します。
  • デフォルトのユーザーはnobodyで、チェックされていないファイルはデフォルトのユーザーが所有しています。
  • ルート以外のソースディレクトリへの書き込み権限はありません。

その後、開発者は次のことができます。

Sudo check some/file

/some/dir/some/fileをチェックアウトし、再度実行してチェックインします。

6
muru

これを行うことができますが、おそらくこの種のコラボレーション向けに設計されたより実用的なソリューションがあると思います。

とにかく、ここで何をすべきかです:

グループを作成し、ユーザーをグループに追加し、グループに親ディレクトリへの書き込み許可を与えます。その後、chownchmodを使用して、Sudoを使用せずにファイルを作成できます。

デモンストレーション:

Sudo addgroup devs
Sudo adduser zanna devs
Sudo adduser pixie devs
mkdir development
chmod g+w development 
Sudo chown root:devs development 
touch development/testfile
cd development
Sudo chown root:devs testfile

これで設定は完了です。テストしてみましょう:

zanna@xubi:~/development$ chown $USER testfile
$ stat -C "%U %G" testfile
zanna devs
$ chmod 600 testfile
$ stat -c %a testfile
600
$ su pixie
[enter password...]
pixie@xubi:/home/zanna/development$ chown $USER testfile
$ stat -c %U testfile
pixie

など...しかし、これは、人々がchownchmodの実行を開始する前にパーミッションをチェックするか、ファイルに書き込もうとする場合にのみ機能します。これはおそらく直感的ではありません...親ディレクトリに対する書き込み権限がある場合、使用するエディターによっては警告が表示されますが、常にファイルへの書き込みを強制できます。

6
Zanna

ユーザーが次のSudoコマンドを実行できる場合:

Sudo bash

彼は、任意のファイルのchownを含む、任意のコマンドをルートとして実行できます。

特定のユーザーが特定のコマンドを実行できるように/etc/sudoersを構成できます

例えば/etc/sudoersで次の行を設定できます。

user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod

注:誰かがchownおよびchmodrootとして実行する能力を持っている場合、簡単にフルrootアクセスを取得できます(たとえば、/etc/passwd)

3
Yaron

70年代初期のオリジナルのものを含むsccs(ソースコード管理システム)は、バージョン管理と変更の文書を維持するため、共有ファイルをチェックインするのに適したソリューションであることに同意します。

Zannaの提案のアドオンとして、ユーザーが所有者であるかどうかを確認し、そうでない場合はグループに書き込み権限があるかどうかを確認する短いスクリプト。これは、チェックインされたことを意味します。使用可能な場合、権限を600に変更します(ファイルはビジーです)。それを解放するには、アクセス権を660に戻します。したがって、所有者名はそれをロックした人または最後にロックした人を示し、グループ許可はそれが利用可能かまだ使用中かを示します。

2
jpezz