Подтвердить что ты не робот

Избегайте изменения subversion для доступа к файлам Linux.

Вся моя база кода хранится в репозитории subversion, который я рассеиваю среди моих загруженных балансированных веб-серверов Apache, что позволяет легко проверять код, запускать обновления и плавно получать мой код в разработке на производство.

Одно из неудобств, которые я уверен, что есть легкая работа (за исключением выполнения script при каждой проверке), получает установленные разрешения Linux (назад) на файлы, которые обновляются или проверяются с помощью подрывная деятельность. Наша команда безопасности установила, что Owner и Group установлены в файлах httpd.conf, и все каталоги в пределах documentRoot получают разрешения 700, все неисполняемые файлы (например, *.php, *.smarty, *.png) получают разрешения Linux 600, все исполняемые файлы получают 700 (например, *.sh, *.pl, *.py). Все файлы должны иметь владельца и группу для apache:apache для чтения службой httpd, так как только владелец файла имеет доступ через разрешения.

Каждый раз, когда я запускаю svn update или svn co, даже если файлы не могут быть созданы (например, svn update), я обнаружил, что права собственности на файлы устанавливаются в учетную запись, которая запуская команды svn, а часто и время, разрешения на файлы устанавливаются на нечто иное, чем то, из чего они были первоначально (т.е. файл .htm до обновления - 600, но после и svn update он получает значение 755 или даже 777).

Каков самый простой способ обойти попытки подрывной работы при обновлении прав доступа и прав на файл? Есть ли что-то, что можно сделать в svn-клиенте или на сервере Linux, чтобы сохранить исходные разрешения для файлов? Я запускаю RHEL5 (и теперь 6 на нескольких экземплярах).

4b9b3361

Ответ 1

владелец файлов будет настроен на пользователя, который запускает команду svn, из-за того, как он реализует основную команду up - она ​​удаляет и заменяет файлы, которые обновляются, что приведет к тому, что право собственности будет "изменено" на соответствующего пользователя. Единственный способ предотвратить это - фактически выполнить svn как пользователь, которому должны принадлежать файлы. Если вы хотите убедиться, что они принадлежат определенному пользователю, запустите команду как пользователь.

Что касается разрешений, svn только подчиняется настройкам umask учетной записи - вероятно, что-то вроде 066 - для того, чтобы файл был недоступен для групповых и других учетных записей, вам нужно выпустить 'umask 077' перед выполнение svn up, это гарантирует, что файлы доступны только для учетной записи пользователя, выдающей команду.

Я бы обратил внимание на проблему безопасности развертывания данных subversion на веб-сервере, если только файлы .svn не защищены.

Ответ 2

Вы можете хранить свойства в файле в Subversion (см. http://svnbook.red-bean.com/en/1.0/ch07s02.html). Вас особенно интересует свойство svn: executable, которое гарантирует, что сохраненное разрешение будет сохранено.

Нет общего способа сделать это для всех разрешений. Subversion также не сохраняет права собственности - предполагается, что если вы что-то проверите, вы владеете им.

Ответ 3

Одна вещь, которую вы можете рассмотреть, - это установить двоичный файл svn вне вашего пути и поместить заменяющий script (at и вызванный /usr/bin/svn или что-то еще) в пути. script будет выглядеть примерно так:

#!/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, т.е. вы можете передать один и тот же путь к вашему chmod, а не запускать chmod для большинства команд svn и т.д.

Здесь также есть некоторые соображения безопасности. Я не знаю, какова ваша среда для развертывания, но вы, вероятно, должны изучить это немного дальше.

Ответ 4

Я написал небольшой script, который хранит разрешения и владельца, выполняет вашу команду SVN и восстанавливает разрешения и владельца. Вероятно, он не является хакерским, но для частного использования он выполняет эту работу.

svnupdate.sh:

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

IGNORENEXT=0
COMMANDS=''
FILES='';
for FILENAME in "[email protected]"
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 "[email protected]")
echo "$OUTPUT"
if [[ ( $? -eq 0 ) && ( $OUTPUT != Skipped* ) && ( $OUTPUT != "At revision"* ) ]]; then
    bash -c "$COMMANDS"
    ls -l $FILES
fi

Ответ 5

Вы можете решить эту проблему. Используйте setgid.

  • У вас apache:apache работает сервер

  • Установить групповое разрешение для всех файлов и каталогов. Сервер будет читать файлы этой группой

  • Установите setgid во всех каталогах - только в каталогах: установка этого в файлах имеет другую функцию

    Пример ('2' is setgid):

    chmod 2750

  • Сделайте apache группу всех каталогов

Что происходит, это

  • Новые файлы и каталоги, созданные любой учетной записью, будут принадлежать группе apache

  • Новые каталоги наследуют setgid и, таким образом, сохраняют структуру без каких-либо усилий.

См. https://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

Ответ 6

У меня также была аналогичная проблема. Я нашел классный script: 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.

Эта запись в блоге (которая помогает мне найти script) http://jon.netdork.net/2010/06/28/configuration-management-part-ii-setting-up-svn/ показывает простое использование.