जीआईटी कमिटिंग


16

मेरे पास ssh पर एक git सर्वर चल रहा है और प्रत्येक उपयोगकर्ता का सिस्टम पर एक यूनिक्स खाता है।

यह देखते हुए कि दो उपयोगकर्ताओं के पास एक रेपो तक पहुंच है, मैं यह कैसे सुनिश्चित कर सकता हूं कि किस उपयोगकर्ता ने कौन सा प्रतिबद्ध किया है, क्योंकि प्रतिबद्ध उपयोगकर्ता नाम और ईमेल गिट क्लाइंट द्वारा प्रस्तुत और नियंत्रित किया जाता है।

मुझे चिंता है कि एक उपयोगकर्ता दूसरे को प्रतिरूपण करने की कोशिश कर सकता है, भले ही उनके पास एक ही प्राधिकरण अधिकार हो।


मैं उलझन में हूं। आप इस प्रश्न में कहते हैं कि प्रत्येक उपयोगकर्ता का अपना शेल खाता है, लेकिन एक टिप्पणी में आप कहते हैं कि वे सभी एक ही खाते को साझा करते हैं और प्रमाणीकरण के लिए अलग-अलग कुंजी का उपयोग करते हैं। यह कौन है, या यह दोनों है?
स्कॉट पैक

दोनो में से एक हो सकता है। वर्तमान सेटअप प्रश्न में वर्णित एक है (प्रति उपयोगकर्ता एक ssh खाता), लेकिन यह अच्छी तरह से पैमाने पर नहीं है और मैं भविष्य में एकल उपयोगकर्ता / कई कुंजियों के साथ जाना चाह सकता हूं। मैं केवल सबसे बहुमुखी समाधान की तलाश में हूं जो मुझे एक या किसी अन्य प्रमाणीकरण विधि में लॉक नहीं करेगा।
yannisf

1
यह इंगित करने के लायक है कि "वह व्यक्ति जो कमिट करता है" और "वह व्यक्ति जो इस रेपो को कुछ कमिट करता है" जरूरी सामान्य मामले में समान नहीं है। मैं आपके रेपो से आपके कमिट्स को खींच सकता हूं और फिर उन्हें (मुझे के रूप में) थर्ड-पार्टी रेपो में धकेल सकता हूं।
निकरिम

जवाबों:


13

यदि आप इसके बारे में चिंतित हैं, तो मुद्दे को संबोधित करने के कुछ तरीके हैं।

  1. अपने उपयोगकर्ताओं को अपने कमेंट्स पर हस्ताक्षर करने के लिए तैयार करें, GPG साइनिंग के लिए समर्थन है।
  2. उपयोगकर्ताओं को मुख्य रिपॉजिटरी के लिए प्रतिबद्ध होने का अधिकार न दें, उन्हें अपने स्वयं के उप-प्रस्ताव के लिए प्रतिबद्ध करें और फिर एक विश्वसनीय उपयोगकर्ता को मुख्य रिपॉजिटरी में बदलाव लाएं। इसीलिए अगर आप कुछ git प्रोजेक्ट्स के लिए लॉग मैसेज देखते हैं (जैसे git ही) तो आप देखेंगे कि उनके "लेखक" के लिए अलग फ़ील्ड हैं - जिस व्यक्ति ने बदलाव बनाया है। और "कमेटी" - वह व्यक्ति जिसने रिपॉजिटरी में परिवर्तन किया।

1. यह सुझाव मेरे उद्देश्यों के लिए सबसे उपयुक्त है। फिर भी, क्या सर्वर साइड पर अहस्ताक्षरित कमिट्स को अस्वीकार करने के लिए एक तंत्र है? 2. जहां तक ​​इस समाधान का संबंध है कि अधीनस्थ रेपो से खींचने वाले उपयोगकर्ता को यह जांचना होगा कि कम्यूटर ने जाली उपयोगकर्ता नाम / ईमेल का उपयोग नहीं किया है। सच?
11

हालांकि सावधान रहें, आप किसी भी कमेंट और लेखक की पहचान के लिए प्रतिबद्ध कर सकते हैं जिसे आप चुनना चाहते हैं। जाहिर है, आप यह देख पाएंगे कि किसने फोर्जिंग की (या उनकी निजी कुंजी की देखभाल नहीं की)।
सीबी बेली

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

@Aernern: काफी साफ है। जैसा कि मैंने इसे पढ़ा, आपका (1) और (2) वैकल्पिक विकल्पों का वर्णन करता हुआ दिखता है।
सीबी बेली 12

1
@ अपने पहले प्रश्न के संबंध में, अपडेट हुक (रन सर्वर-साइड) हस्ताक्षरों की जांच कर सकता है और अन्यथा संबंधित रेफरी को अपडेट करने से अस्वीकार कर सकता है। .git/hooks/update.sampleप्रेरणा के लिए एक नज़र है । कृपया @ मुझे सूचित करें यदि आप SO पर इस पर कोई प्रश्न पूछते हैं, तो यह मेरे लिए भी दिलचस्प होगा,
टोबीस किंजलर

9

मैं इस तरह की जानकारी प्राप्त करने के दो अच्छे तरीके देखता हूं। एक sshd से लॉगिंग को बढ़ाकर है, और दूसरा डिस्क पर गिट रिपॉजिटरी की गहरी निगरानी करके है। चूंकि दोनों में से कोई भी आपको व्यक्तिगत रूप से आपके द्वारा दी गई जानकारी नहीं देता है, इसलिए आप बाहरी लॉग विश्लेषण इंजन का उपयोग करके या मानव आंखों और टाइमस्टैम्प का उपयोग करके लॉग डेटा को दोनों करना चाहते हैं और सहसंबंधित कर सकते हैं।

sshd संशोधन

डिफ़ॉल्ट रूप से, जैसा कि आपने देखा है कि कोई संदेह नहीं है, आप देख सकते हैं कि उपयोगकर्ता ने कब और कहाँ से लॉग इन किया और ssh प्रमाणीकरण लॉग का उपयोग किया। आप जो करना चाहते हैं, वह स्तर बदल रहा है और आप sshd से लॉग आउट कर रहे हैं। तो अपने को संपादित करें /etc/ssh/sshd_configऔर जो लाइन दिखती है उसे ढूंढें

#LogLevel INFO

और उसे बदल दें

LogLevel VERBOSE

उसके बाद sshd सेवा को फिर से शुरू करें। यह sshd का लॉगिंग स्तर 1 कदम बढ़ाता है, जो बहुत अधिक जानकारी देता है। उस परिवर्तन को करने के बाद मेरे रिमोट एक्सेस के इस लॉग स्निपेट को देखें।

Nov  2 08:37:09 node1 sshd[4859]: Connection from 10.10.10.5 port 50445
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4860]: Postponed publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4859]: Accepted publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: pam_unix(sshd:session): session opened for user scott by (uid=0)
Nov  2 08:37:10 node1 sshd[4859]: User child is on pid 4862
Nov  2 08:40:27 node1 sshd[4862]: Connection closed by 10.10.10.5
Nov  2 08:40:27 node1 sshd[4862]: Transferred: sent 30632, received 7024 bytes
Nov  2 08:40:27 node1 sshd[4862]: Closing connection to 10.10.10.5 port 50445
Nov  2 08:40:27 node1 sshd[4859]: pam_unix(sshd:session): session closed for user scott 

यहां ध्यान देने योग्य महत्वपूर्ण बातें दो गुना हैं

  1. हम मुझे प्रमाणित करने के लिए उपयोग की जाने वाली सार्वजनिक कुंजी के फ़िंगरप्रिंट को देखते हैं
  2. हम अपने लॉग ऑफ का टाइमस्टैम्प देखते हैं

डिफ़ॉल्ट LogLevel (INFO) sshd लॉग का उपयोग न तो उन वस्तुओं में से करता है। कुंजी का फिंगरप्रिंट प्राप्त करना एक अतिरिक्त कदम है। आपको authorized_keysssh-keygen के साथ उपयुक्त फ़ाइल को संसाधित करना होगा ।

[root@node1 ssh]# ssh-keygen -l -f /home/scott/.ssh/authorized_keys
4096 f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06 /home/scott/.ssh/authorized_keys (RSA)

तो अब आप निम्न जानकारी जानते हैं:

  1. उपयोगकर्ता नाम जो लॉग ऑन था
  2. उपयोगकर्ता द्वारा लॉग ऑन किया गया समय
  3. प्रमाणीकरण के लिए किस सार्वजनिक कुंजी का उपयोग किया गया था
  4. उपयोगकर्ता द्वारा लॉग इन किया गया समय

अब जब हमारे पास एक विशिष्ट समय में उपयोगकर्ता कार्रवाई को विशेषता देने का एक तरीका है, यह मानते हुए कि दोनों उपयोगकर्ता एक ही समय में लॉग इन नहीं थे, तो हम रिपॉजिटरी में किए गए परिवर्तनों को देखना शुरू कर सकते हैं।

ऑडिट के साथ निर्देशिका की निगरानी

जैसा कि sysadmin1138 ने कहा, यह ऑडिट सबसिस्टम के लिए एक उत्कृष्ट उपयोग मामला हो सकता है। यदि आप RedHat आधारित डिस्ट्रो का उपयोग नहीं कर रहे हैं तो संभवतः एक एनालॉग है, लेकिन आपको इसे ढूंढना होगा। ऑडिट के लिए कॉन्फ़िगरेशन बहुत तीव्र है और इसमें कॉन्फ़िगरेशन विकल्पों की एक redonkulous संख्या है। कुछ विकल्पों के बारे में जानने के लिए, कृपया हमारी सुरक्षा साइट पर इस प्रश्न को सूचना सुरक्षा पेशेवरों के लिए देखें

न्यूनतम रूप से, मैं यह निर्धारित करने की सिफारिश करूंगा कि डिस्क पर निर्देशिका पर "वॉच" कहा जाता है जिसमें आपके गिट रिपॉजिटरी शामिल है। यह क्या करता है कर्नेल मॉड्यूल को फ़ाइल एक्सेस कॉल करने के प्रयासों पर रिपोर्ट करने के लिए निर्देश देता है, जैसे open()या creat(), फ़ाइल हैंडल पर वे फाइलें या निर्देशिकाओं की ओर इशारा करते हैं जिन्हें हम सूचीबद्ध करते हैं।

यहाँ एक नमूना विन्यास है जो यह करेगा, और केवल यह। इसलिए /etc/audit/audit.rulesउचित रूप से परिवर्तनों को एकीकृत करने के लिए , अपने मौजूदा के माध्यम से पढ़ने और समझने के लिए सावधान रहें ।

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 1024

-w /path/to/git/repos-p wa

# Disable adding any additional rules - note that adding *new* rules will require a reboot
-e 2

आपके विस्तृत जवाब के लिए बहुत बहुत धन्यवाद! यह वास्तव में एक सिस्टम प्रशासक के दृष्टिकोण से पूरा होता है। मैं जो देख रहा था, वह एक ऐसा समाधान था जिसके लिए इतने निम्न स्तर के ऑडिटिंग के समाधान के लिए किसी की आवश्यकता नहीं होगी, और आदर्श रूप से तथ्य के बाद फोरेंसिक के समाधान के बजाय जाली कमिट को रोका जा सकेगा।
yannisf

2
ठीक है, आपने सिस्टम एडमिनिस्ट्रेशन साइट पर पूछा था और मैं एक फोरेंसिक परीक्षक हूं .... :)
स्कॉट पैक

5

एकमात्र तकनीकी दृष्टिकोण जो आप ले सकते हैं, वह ssh कनेक्शन की पहचान पर भरोसा करना है। फिर आप यह लागू कर सकते हैं कि प्रत्येक उपयोगकर्ता केवल वही धक्का देता है जो उसने प्रत्येक नए पुश किए गए कमिट के कमिट को मान्य करके किया था।

इसके लिए विश्वसनीय होने के लिए आप निश्चित रूप से अपने उपयोगकर्ताओं को उस बॉक्स में अप्रतिबंधित शेल एक्सेस नहीं देना चाहते हैं जहाँ रिपॉजिटरी रहता है; आप कुछ का उपयोग सुनिश्चित करना चाहते हैं जैसे कि git-shellअन्यथा प्रतिबंध आसानी से काम कर रहे हैं।

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

कुछ बिंदु पर, कुछ हद तक, आपको अपने डेवलपर्स पर भरोसा करने की आवश्यकता है।


3

कई ssh डेमॉन /var/log/audit.logएक ssh कनेक्शन प्राप्त होने पर या कुछ इसी तरह की प्रविष्टि करते हैं। इस लॉग को कमिट-लॉग के साथ क्रॉस-रेफ़र करते हुए आपको एक आइडिया देना चाहिए कि किस ssh-user को कमिटमेंट जारी करने के लिए इस्तेमाल किया गया था। यह एक ऑडिटिंग कदम है, जिसका उपयोग सत्यापन के लिए तथ्य के बाद किया जाना है।

वास्तव में सही ssh-user को उपयुक्त git-user पर लागू करना अन्य उत्तरों में से एक के लिए है।


अभी भी सेटअप है कि उपयोगकर्ता एक ही ssh उपयोगकर्ता के साथ लॉगिन करते हैं लेकिन विभिन्न (अधिकृत) कुंजी का उपयोग करते हैं। इससे ऑडिटिंग और भी कठिन हो जाती है।
yannisf

@ प्रिय: आप सही कह रहे हैं, इससे चीजें थोड़ी बदल जाती हैं। किसी भी भाग्य के साथ मैंने गैर-जिम्मेदार खाता पहुंच से निपटने की आपकी अतिरिक्त आवश्यकता को संबोधित करने में मदद की।
स्कॉट पैक

0

यदि सभी उपयोगकर्ताओं के पास रिपॉजिटरी तक पहुंच लिखने के साथ शेल खाते हैं, तो आप एक भरोसेमंद ऑडिट लॉग को सेट करने में सक्षम नहीं होंगे: वे अभी भी लॉग को लिखे बिना रिपॉजिटरी को संशोधित कर सकते हैं, और वे लॉग में जो चाहें लिख सकते हैं।

ऑडिट लॉग पर भरोसा करने में सक्षम होने के लिए, आपको रिपॉजिटरी तक पहुंच को मध्यस्थता करने के लिए gitolite (जो अपने खाते में चलता है) जैसी कुछ चीज़ों का उपयोग करने के बजाय, रिपॉजिटरी तक सीधे फ़ाइल-स्तरीय लेखन पहुंच को रोकने की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.