すべてのコードベースは、負荷分散されたApache Webサーバーに分散されているSubversionリポジトリに格納されているため、コードのチェックアウト、更新の実行、および開発中のコードのシームレスな本番環境への移行が簡単に行えます。
(チェックアウトのたびにスクリプトを実行する以外の)簡単な回避策があると私が確信している不便の1つは、Subversionで更新またはチェックアウトされたファイルにLinux権限を設定(戻す)することです。私たちのセキュリティチームは、Owner
とGroup
がhttpd.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つです)。
基礎となるupコマンドの実装方法により、ファイルの所有者はsvnコマンドを実行しているユーザーに設定されます-更新されたファイルを削除および置換します。これにより、関連するユーザーの所有権が「変更」されます。これを防ぐ唯一の方法は、ファイルが所有されているはずのユーザーとして実際にsvn upを実行することです。それらが特定のユーザーによって所有されていることを確認する場合は、そのユーザーとしてコマンドを実行します。
権限に関しては、svnはアカウントのumask設定のみを順守しています-これはおそらく066のようなものです-グループや他のアカウントがファイルにアクセスできないようにするために、svnを実行する前に 'umask 077'を発行する必要がありますこれにより、コマンドを発行するユーザーアカウントのみがファイルにアクセスできるようになります。
.svnディレクトリが保護されていない限り、SubversionデータをWebサーバーに展開する際のセキュリティ問題に注意を払います。
プロパティはSubversionのファイルに保存できます( http://svnbook.red-bean.com/en/1.0/ch07s02.html を参照)。あなたは特にsvn:executableプロパティに興味があります。これは、実行権限が確実に保存されるようにします。
ただし、すべての権限についてこれを行う一般的な方法はありません。 Subversionは所有権も保存しません。何かをチェックアウトした場合、それを所有していると想定します。
パスの外側に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に同じパスを渡すことができます。
また、ここにはおそらくセキュリティに関する考慮事項があります。デプロイメント環境がどのようなものかはわかりませんが、おそらくもう少し調査する必要があります。
権限と所有者を保存し、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
これを解決できます。 setgid
を使用します。
あなたが持っている Apache:apache
サーバーの実行
すべてのファイルとディレクトリにグループ権限を設定します。サーバーはグループごとにファイルを読み取ります
すべてのディレクトリにsetgid
を設定-ディレクトリのみ:これをファイルに設定すると、機能が異なります
例( '2'はsetgidです):
chmod 2750
Apache
をすべてのディレクトリのグループにする
何が起こるか
any accountによって作成された新しいファイルとディレクトリは、Apache
グループによって所有されます
新しいディレクトリはsetgid
を継承するため、簡単に構造を保持できます
https://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories を参照してください
私にも同様の問題がありました。私はクールなスクリプトを見つけました: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/ は、簡単な使い方。