2011-05-10 16 views
31

मेरा सभी कोड बेस एक सबवर्जन रिपोजिटरी में संग्रहीत किया जा रहा है जिसे मैं अपने लोड संतुलित अपाचे वेब सर्वरों में फैलता हूं, जिससे कोड को जांचना, अपडेट चलाएं और निर्बाध रूप से उत्पादन में विकास में अपना कोड प्राप्त करना आसान हो जाता है।लिनक्स फ़ाइल अनुमतियों को संशोधित करने से बचें।

असुविधाओं में से एक जो मुझे यकीन है कि चारों ओर एक आसान काम है (प्रत्येक चेकआउट पर एक स्क्रिप्ट निष्पादित करने के अलावा), लिनक्स अनुमतियां उन फ़ाइलों पर सेट (बैक) प्राप्त कर रही हैं जो उपवर्तन के साथ अद्यतन या चेक आउट की गई हैं । हमारी सुरक्षा टीम ने यह निर्धारित किया है कि Owner और Grouphttpd.conf फ़ाइलों में सेट है, और documentRoot के भीतर सभी निर्देशिकाएं 700 की अनुमतियां प्राप्त करती हैं, सभी गैर निष्पादन योग्य फ़ाइलें (जैसे * .php, * .smarty, * .png) 600 की लिनक्स अनुमतियां प्राप्त करें, सभी निष्पादन योग्य फ़ाइलों को 700 प्राप्त होता है (उदाहरण के लिए * .sh, * .pl, * .py)। Httpd सेवा द्वारा पढ़ने के लिए सभी फ़ाइलों को apache:apache पर स्वामी और समूह सेट होना चाहिए क्योंकि केवल फ़ाइल स्वामी को अनुमतियों के माध्यम से पहुंच प्राप्त करने के लिए सेट किया गया है।

हर बार जब मैं एक svn update चलाते हैं, या svn co, भले ही फाइलों को नहीं बनाया जा सकता है (यानी svn update), मैं खोजने हूँ फ़ाइलों का स्वामित्व SVN आदेशों चलाने वाले खाते के लिए सेट किया जा रहा है कि, और अक्सर बार, फ़ाइल अनुमतियां मूल रूप से उनके अलावा किसी अन्य चीज़ पर सेट हो रही हैं (यानी अद्यतन से पहले एक .htm फ़ाइल 600 है, लेकिन svn update के बाद, यह 755 या 777 तक सेट हो जाती है)।

फ़ाइल अनुमतियों और स्वामित्व को अद्यतन करने के लिए उपversण प्रयासों को बाईपास करने का सबसे आसान तरीका क्या है? क्या कुछ ऐसा है जो svn क्लाइंट के भीतर किया जा सकता है, या लिनक्स सर्वर पर मूल फ़ाइल अनुमतियों को बनाए रखने के लिए किया जा सकता है? मैं RHEL5 चला रहा हूं (और अब कुछ चुनिंदा उदाहरणों पर 6)।

उत्तर

16

फ़ाइलों का मालिक उस उपयोगकर्ता को सेट किया जाएगा जो svn कमांड चला रहा है क्योंकि यह अंतर्निहित अप कमांड को लागू करता है - यह अद्यतन फ़ाइलों को हटा देता है और बदल देता है, जिससे स्वामित्व 'परिवर्तन' हो जाएगा प्रासंगिक उपयोगकर्ता इसे रोकने का एकमात्र तरीका वास्तव में उपयोगकर्ता के रूप में svn को निष्पादित करना है कि फ़ाइलों को स्वामित्व माना जाना चाहिए। यदि आप यह सुनिश्चित करना चाहते हैं कि वे किसी विशेष उपयोगकर्ता के स्वामित्व में हैं, तो उस उपयोगकर्ता के रूप में आदेश चलाएं।

अनुमतियों के संबंध में, एसवीएन केवल खाते की उमास्क सेटिंग्स का पालन कर रहा है - यह शायद यह सुनिश्चित करने के लिए 066 की तरह कुछ है - यह सुनिश्चित करने के लिए कि फ़ाइल समूह और अन्य खातों के लिए पहुंच योग्य नहीं है, आपको 'umask 077' जारी करने की आवश्यकता है svn अप करने से पहले, यह सुनिश्चित करता है कि फ़ाइलों को आदेश जारी करने वाले उपयोगकर्ता खाते के लिए केवल पहुंच योग्य है।

मैं वेब सर्वर में उपवर्तन डेटा को तैनात करने के सुरक्षा समस्या पर ध्यान देना चाहूंगा जब तक कि .svn निर्देशिका सुरक्षित न हो।

+2

+1। अच्छा निर्णय। – pboin

+0

मुझे एक ही समस्या में आती है। इससे पहले कि मैं svnkit (एक जावा svn) का उपयोग करता हूं, जहां यह व्यवहार नहीं है, यह फ़ाइल के स्वामी को रखने में सक्षम है ... लेकिन यह बहुत धीमा है ... मुझे मूल svn संस्करण में क्या बदलता है। मुझे यह "फीचर" बहुत याद आ रही है। – ceinmart

+0

यह सही नहीं है।आप समूह के रूप में समूह को लागू करने के लिए निर्देशिकाओं पर 'setgid' का उपयोग कर सकते हैं। मैंने यहां विवरण के साथ उत्तर दिया: http://stackoverflow.com/a/42800354/2578286 – Bell

7

आप सबवर्जन में फ़ाइल पर गुणों को स्टोर कर सकते हैं (http://svnbook.red-bean.com/en/1.0/ch07s02.html देखें)। आप विशेष रूप से svn: निष्पादन योग्य संपत्ति में रूचि रखते हैं, जो सुनिश्चित करेगा कि निष्पादन योग्य अनुमति संग्रहीत की जाती है।

हालांकि, सभी अनुमतियों के लिए ऐसा करने का कोई सामान्य तरीका नहीं है। सबवर्सन स्वामित्व को स्टोर नहीं करता है - यह मानता है कि, यदि आप कुछ जांचते हैं, तो आप इसका स्वामी हैं।

1

एक चीज जो आप कर सकते हैं वह 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 को, अर्थात तर्क पारित पार्स की कुछ राशि करना होगा हैइसलिए आप अपने chmod के लिए एक ही पथ पारित कर सकते हैं, अधिकांश svn कमांड आदि के लिए chmod नहीं चला सकते हैं।

यहां कुछ सुरक्षा विचार भी हैं। मुझे नहीं पता कि आपका तैनाती पर्यावरण कैसा है, लेकिन आपको शायद थोड़ा और जांच करनी चाहिए।

1

मैंने एक छोटी सी लिपि लिखी है जो अनुमतियों और मालिक को संग्रहीत करती है, आपके एसवीएन कमांड को निष्पादित करती है और अनुमतियों और मालिक को पुनर्स्थापित करती है। शायद यह हैकरप्रूफ नहीं है लेकिन निजी उपयोग के लिए यह नौकरी करता है।

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 
0

मैं भी एक ऐसी ही समस्या थी। मुझे एक अच्छी स्क्रिप्ट मिली: एएसवीएन (पुरालेख एसवीएन)।

आप इसे यहां से डाउनलोड कर सकते हैं: 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/ एक सरल उपयोग दिखाता है।

1

आप इस को हल कर सकते हैं। setgid का उपयोग करें।

  1. आप सभी फ़ाइलों और निर्देशिकाओं पर सर्वर

  2. सेट समूह अनुमति चल apache:apache है। सर्वर सभी निर्देशिकाओं पर यह समूह

  3. सेट setgid है द्वारा फ़ाइलों को पढ़ने जाएगा - केवल निर्देशिकाओं पर: फ़ाइलें इस सेटिंग से एक अलग समारोह

    उदाहरण है ('2' setgid है):

    chmod 2750

  4. apache सभी निर्देशिकाओं के समूह बनाने

,210

क्या होता है

  • नई फ़ाइलें और निर्देशिका द्वारा किसी भी खातेapache समूह के स्वामित्व वाले हो जाएगा

  • नई निर्देशिका setgid वारिस है और इस तरह किसी भी प्रयास के बिना

    संरचना सुरक्षित करेगा बनाया है

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

देखें .svn के संभावित परिणामों पर ध्यान देने के लिए
संबंधित मुद्दे