web-dev-qa-db-ja.com

Linuxファイルのアクセス許可をSubversionで変更することは避けてください。

すべてのコードベースは、負荷分散されたApache Webサーバーに分散されているSubversionリポジトリに格納されているため、コードのチェックアウト、更新の実行、および開発中のコードのシームレスな本番環境への移行が簡単に行えます。

(チェックアウトのたびにスクリプトを実行する以外の)簡単な回避策があると私が確信している不便の1つは、Subversionで更新またはチェックアウトされたファイルにLinux権限を設定(戻す)することです。私たちのセキュリティチームは、OwnerGrouphttpd.confファイルに設定されていることを設定し、documentRoot内のすべてのディレクトリは、 700、すべての非実行可能ファイル(* .php、*。smarty、*。pngなど)は600のLinuxアクセス許可を受け取り、すべての実行可能ファイルは700(* .sh、*。pl、*。pyなど)を受け取ります。ファイルの所有者のみが権限を介してアクセスできるように設定されているため、すべてのファイルの所有者とグループがApache:apacheに設定されている必要があります。

svn updateまたはsvn coを実行するたびに、ファイルが作成されなくても(つまり、svn update)、ファイルの所有権がsvnコマンドを実行しているアカウント、および多くの場合、ファイルのアクセス許可は本来のものとは異なるものに設定されています(つまり、更新前の.htmファイルは600ですが、その後svn updateに設定されます755、または777まで)。

ファイルの権限と所有権を更新するというSubversionの試みを回避する最も簡単な方法は何ですか? svnクライアント内で、またはLinuxサーバー上で、元のファイル権限を保持するために実行できることはありますか?私はRHEL5を実行しています(現在、いくつかの特定のインスタンスでは6つです)。

32
Scott

基礎となるupコマンドの実装方法により、ファイルの所有者はsvnコマンドを実行しているユーザーに設定されます-更新されたファイルを削除および置換します。これにより、関連するユーザーの所有権が「変更」されます。これを防ぐ唯一の方法は、ファイルが所有されているはずのユーザーとして実際にsvn upを実行することです。それらが特定のユーザーによって所有されていることを確認する場合は、そのユーザーとしてコマンドを実行します。

権限に関しては、svnはアカウントのumask設定のみを順守しています-これはおそらく066のようなものです-グループや他のアカウントがファイルにアクセスできないようにするために、svnを実行する前に 'umask 077'を発行する必要がありますこれにより、コマンドを発行するユーザーアカウントのみがファイルにアクセスできるようになります。

.svnディレクトリが保護されていない限り、SubversionデータをWebサーバーに展開する際のセキュリティ問題に注意を払います。

16
Petesh

プロパティはSubversionのファイルに保存できます( http://svnbook.red-bean.com/en/1.0/ch07s02.html を参照)。あなたは特にsvn:executableプロパティに興味があります。これは、実行権限が確実に保存されるようにします。

ただし、すべての権限についてこれを行う一般的な方法はありません。 Subversionは所有権も保存しません。何かをチェックアウトした場合、それを所有していると想定します。

9
thomson_matt

パスの外側にsvnバイナリをインストールし、パスに置換スクリプト(/usr/bin/svnなどと呼ばれる)を配置することを検討してください。スクリプトは次のようになります。

#!/bin/sh

# set umask, whatever else you need to do before svn commands

/opt/svn/svn $* # pass all arguments to the actual svn binary, stored outside the PATH

# run chmod, whatever else you need to do after svn commands

明確な欠点は、おそらくsvnに渡された引数をある程度解析する必要があることです。つまり、ほとんどのsvnコマンドでchmodを実行するのではなく、chmodに同じパスを渡すことができます。

また、ここにはおそらくセキュリティに関する考慮事項があります。デプロイメント環境がどのようなものかはわかりませんが、おそらくもう少し調査する必要があります。

1
ACK_stoverflow

権限と所有者を保存し、SVNコマンドを実行して権限と所有者を復元する小さなスクリプトを書きました。それはおそらくハッカープルーフではありませんが、個人的な使用ではそれは仕事をします。

svnupdate.sh:

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
    echo "Syntax: $0 <filename>"
    exit
fi

IGNORENEXT=0
COMMANDS=''
FILES='';
for FILENAME in "$@"
do
    if [[ $IGNORENEXT > 0 ]]; then
        IGNORENEXT=0
    else
        case $FILENAME in
            # global, shift argument if needed
            --username|--password|--config-dir|--config-option)
            IGNORENEXT=1
            ;;
            --no-auth-cache|--non-interactive|--trust-server-cert)
            ;;
            # update arguments, shift argument if needed
            -r|--revision|--depth|--set-depth|--diff3-cmd|--changelist|--editor-cmd|--accept)
            IGNORENEXT=1
            ;;
            -N|--non-recursive|-q|--quiet|--force|--ignore-externals)
            ;;
            *)
            if [ -f $FILENAME ]; then
                FILES="$FILES $FILENAME"
                OLDPERM=$(stat -c%a $FILENAME)
                OLDOWNER=$(stat -c%U $FILENAME)
                OLDGROUP=$(stat -c%G $FILENAME)
                FILECOMMANDS="chmod $OLDPERM $FILENAME; chown $OLDOWNER.$OLDGROUP $FILENAME;"
                COMMANDS="$COMMANDS $FILECOMMANDS"
                echo "COMMANDS: $FILECOMMANDS"
            else
                echo "File not found: $FILENAME"
            fi
            ;;
        esac
    fi
done
OUTPUT=$(svn update "$@")
echo "$OUTPUT"
if [[ ( $? -eq 0 ) && ( $OUTPUT != Skipped* ) && ( $OUTPUT != "At revision"* ) ]]; then
    bash -c "$COMMANDS"
    ls -l $FILES
fi
1
Gerben Versluis

これを解決できますsetgidを使用します。

  1. あなたが持っている Apache:apacheサーバーの実行

  2. すべてのファイルとディレクトリにグループ権限を設定します。サーバーはグループごとにファイルを読み取ります

  3. すべてのディレクトリにsetgidを設定-ディレクトリのみ:これをファイルに設定すると、機能が異なります

    例( '2'はsetgidです):

    chmod 2750

  4. Apacheをすべてのディレクトリのグループにする

何が起こるか

  • any accountによって作成された新しいファイルとディレクトリは、Apacheグループによって所有されます

  • 新しいディレクトリはsetgidを継承するため、簡単に構造を保持できます

https://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories を参照してください

1
Bell

私にも同様の問題がありました。私はクールなスクリプトを見つけました:asvn(アーカイブSVN)。

ここからダウンロードできます: https://svn.Apache.org/repos/asf/Subversion/trunk/contrib/client-side/asvn

Description:
Archive SVN (asvn) will allow the recording of file types not
normally handled by svn. Currently this includes devices,
symlinks and file ownership/permissions.

Every file and directory has a 'file:permissions' property set and
every directory has a 'dir:devices' and 'dir:symlinks' for
recording the extra information.

Run this script instead of svn with the normal svn arguments.

このブログエントリ(スクリプトの検索に役立ちます) http://jon.netdork.net/2010/06/28/configuration-management-part-ii-setting-up-svn/ は、簡単な使い方。

0
Ilya Bystrov