सभी ssh कमांड के स्थानीय, टाइमस्टैम्प लॉगिंग?


13

मैं उन सभी दूरस्थ कमांडों का एक स्थानीय, टाइमस्टैम्पड रिकॉर्ड रख सकता हूं, जिनका उपयोग मैं करता हूं ssh(कमांड-लाइन ओपनशश क्लाइंट के माध्यम से शुरू किया गया है bash)?

आवश्यकताएँ:

  • आवश्यक:

    • सर्वर लॉगिंग पर भरोसा किए बिना 100% क्लाइंट-साइड
    • उपयोगकर्ता के घर निर्देशिका में संग्रहीत लॉग के साथ प्रति उपयोगकर्ता कॉन्फ़िगर या स्थापित।
    • विभिन्न उपयोगकर्ताओं और मेजबानों के साथ एक साथ कई सत्रों में अंतर करने के लिए समर्थन।
    • गैर-घुसपैठ (प्रत्येक बार इसे सक्रिय करने की आवश्यकता नहीं है और ssh का उपयोग करने में महत्वपूर्ण हस्तक्षेप नहीं करता है)
  • उच्च प्राथमिकता:

    • जितना संभव हो उतना आउटपुट लॉग या फ़िल्टर नहीं किया जाता है
    • या तो पासवर्ड प्रविष्टियों को लॉग नहीं किया जाता है या फ़ाइल एन्क्रिप्ट की जाती है
    • उपयोग किए गए वास्तविक आदेशों को इंगित करता है (टैब / इतिहास पूरा होने के बाद, बैकस्पेस, CTRL+ C, आदि ... संसाधित किया गया है)
  • अच्छा लगा:

    • जंजीर सत्रों में कमांड भी लॉग करता है (रिमोट sshया su <user>सेशन के दौरान दर्ज कमांड )
    • सत्र प्रारंभ और समाप्ति लॉग होना चाहिए
    • एक सरल- bashआधारित, गैर-रूट समाधान सबसे अच्छा होगा (शायद कमांड के लिए एक aliasया bashआवरण स्क्रिप्ट ssh?)

मेरा कौशल स्तर:

  • मैं प्रोग्रामिंग के लिए नया नहीं हूं, लेकिन मैं अभी भी सीख रहा हूं bashऔर "लिनक्स तरीका", इसलिए संक्षिप्त स्पष्टीकरण वाले कोड नमूने सबसे अधिक सराहे जाएंगे।

संभव रणनीतियाँ

  • keylogger - समस्या: पासवर्ड लॉग करता है, टैब / इतिहास पूरा नहीं करता है ( ग्लेन का जवाब देखें )
  • screenस्क्रॉलबैक डंपिंग के साथ प्रति सेकंड एक बार और diffउनके बीच नई स्क्रॉलबैक लाइनें ढूंढने के लिए - समस्या: इसे एक उपयोगी स्वचालित तरीके से कैसे लागू किया जा सकता है?
  • ssh "$@" | tee >(some_cleaner_function >> $logfile) - समस्या: जंजीरों वाले सत्रों में बहुस्तरीय आदेशों या इतिहास को संभाल नहीं सकता है, सावधानीपूर्वक सफाई की आवश्यकता है (मेरा उत्तर देखें)
  • उपरोक्त में से कुछ का संयोजन

एक उदाहरण

निम्नलिखित SSH सत्र:

user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a  b
user@remote:~/test$ exit

~/logs/ssh.logइस तरह एक लॉग में परिणाम हो सकता है :

2014-06-17 16:34:50   [user@remote - start]
2014-06-17 16:34:51   [user@remote] cd test
2014-06-17 16:34:52   [user@remote] ls
2014-06-17 16:34:53   [user@remote] exit
2014-06-17 16:34:53   [user@remote - end]

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


इसे संपादकों जैसे कि नैनो या विम
डेज़ी

जवाबों:


5

मैं आपके सवाल से घबरा गया। मैं मूल रूप से एक जवाब देने के लिए नहीं जा रहा था लेकिन मैं आदी हो गया।

यह उपयोग करता है expectऔर यह वास्तव में एक महत्वपूर्ण लकड़हारा है।

#!/usr/bin/expect -f

proc log {msg} {
    puts $::fh "[timestamp -format {%Y-%m-%d %H:%M:%S}]: $msg"
}

set ssh_host [lindex $argv 0]
set ::fh [open "sshlog.$ssh_host" a]

log "{session starts}"

spawn ssh $ssh_host

interact {
    -re "(.)" {
        set char $interact_out(1,string)
        if {$char eq "\r"} {
            log $keystrokes
            set keystrokes ""
        } else {
            append keystrokes $char
        }
        send -- $char
    }
    eof
}

log "{session ends}"

टिप्पणियाँ:

  • यह नाम में ssh गंतव्य के साथ एक फ़ाइल में जोड़ता है
  • यह एक कुंजी लकड़हारा है: यदि आपने ssh कीज़ सेट नहीं की है, तो आपको लॉग फ़ाइल में उपयोगकर्ता का पासवर्ड मिलता है
  • यह टैब पूरा होने तक विफल रहता है: यदि उपयोगकर्ता प्रकार uptTab( uptimeकमांड के लिए), तो आपको लॉग फ़ाइल में "upt \ t" मिलेगा, न कि "uptime"
  • यह "कच्चे" मोड में वर्णों को पकड़ लेता है: यदि उपयोगकर्ता एक बुरा टाइपिस्ट है, तो आपको ^?लॉग फ़ाइल में बहुत सारे (बैकस्पेस वर्ण) मिलेंगे ।

उत्तर देने के लिए आपका धन्यवाद। यह दिलचस्प है कि इसके लिए एक आसान जवाब नहीं लगता है, शायद ssh क्लाइंट के मूल निवासी हैं। सीमाओं को समझाने के लिए धन्यवाद; मुझे लगता है कि टैब समापन / बैकस्पेस वर्ण लॉगिंग / पासवर्ड लॉगिंग मुझे अक्सर इसका उपयोग करने से रोकने के लिए पर्याप्त है। इसने मुझे मेरी प्राथमिकताओं के बारे में और अधिक सोचने के लिए प्रेरित किया, और मैं प्रश्न में उन लोगों को स्पष्ट करूँगा।
ओलेग

आपके द्वारा इच्छित कमांड को निकालने के लिए स्पैन्ड प्रक्रिया से आउटपुट पार्स किया जा सकता है। आपको इसे आसान बनाने के लिए उपयोगकर्ता के संकेत को जानना होगा।
ग्लेन जैकमैन

मैं टैब पूरा करने का उपयोग करता हूं। इसका मतलब यह नहीं है कि उन आदेशों को लॉग नहीं किया जाएगा?
ओलेग

आह, मैं देख रहा हूं कि तुम क्या कह रहे हो। आउटपुट कैसे पार्स किया जाएगा? प्रॉम्प्ट को कॉन्फ़िगरेशन विकल्प के रूप में कहीं दर्ज किया जा सकता है।
ओलेग

मैंने प्रश्न के निचले भाग में संभावित समाधानों की सूची जोड़ी। ssh ... | tee -ai <logfile> इनपुट और आउटपुट को सुरक्षित रूप से लॉग करने के लिए अच्छी तरह से काम करता है, लेकिन मुझे नहीं पता कि पृष्ठभूमि में टाइमस्टैम्प और / या आउटपुट को कैसे फ़िल्टर किया जाए।
ओलेग

3

मैं वर्तमान में नीचे bash स्क्रिप्ट का उपयोग कर रहा हूं। इसकी कई समस्याएं हैं, लेकिन यह एकमात्र समाधान है जो मैंने पाया है कि सभी आवश्यकताओं, प्राथमिकताओं, और "अच्छा से बाज़" (कम से कम अधिकांश समय) को संबोधित करता है।

यह उत्तर चर्चा करता है कि स्थानीय स्तर पर ssh सत्र लॉग करना इतना कठिन क्यों है।

अब तक मुझे मिली स्क्रिप्ट के मुद्दे:

  1. मल्टीलाइन कमांड के कारण समस्याएँ होती हैं:

    • यदि आप दूरस्थ इतिहास में एक बहुस्तरीय वस्तु (अप / डाउन कीज़ के साथ) के माध्यम से पृष्ठ करते हैं, तो यह नवीनतम कमांड के बजाय एक इतिहास आइटम लॉग करेगा। आप इसे उपयोग करने के तुरंत बाद किसी भी मल्टीलाइन कमांड को बैश इतिहास से हटाकर इससे बच सकते हैं।
    • केवल बहुस्तरीय आदेशों की पहली पंक्ति लॉग होती है।
  2. श्रृंखलित सत्र (का उपयोग कर sshया suदूरदराज के अंत पर आदेशों) इतिहास कारण वास्तविक आदेशों के बजाय स्क्रॉल-पारित कर आदेशों का इस्तेमाल किया रिकॉर्ड करने के लिए स्क्रॉल

  3. नियमित अभिव्यक्तियों में सुधार किया जा सकता है और कुछ वातावरणों के लिए इसे संशोधित करने की आवश्यकता हो सकती है:

    • मैं cat -vसफाई से पहले नॉनप्रिटिंग पात्रों को परिवर्तित करके धोखा देता हूं । परिणामस्वरूप, यदि आप कभी भी ^[[अपने आदेशों में तार का उपयोग करते हैं, तो मान्य सामग्री हटा दी जा सकती है ।
    • कभी-कभी आपको कमांड से पहले अतिरिक्त लॉग इन इनपुट मिलता है, जैसे कि आप इतिहास के माध्यम से बहुत तेजी से पृष्ठ बनाते हैं। यह आम तौर पर वास्तविक कमांड से पहले "^ M" द्वारा पीछा किया जाता है और यदि वांछित हो तो इस प्रकार दूर किया जा सकता है।
    • अन्य नियंत्रण वर्ण कभी-कभी होते हैं। मैं उन सभी को अब तक के लिए छोड़ रहा हूं जब तक मुझे पता नहीं है कि कौन से सुरक्षित हैं। ^ जैसा कि मैंने अभी उल्लेख किया है कि अमान्य लॉग इनपुट का पता लगाने के लिए उपयोगी है, और ^ सी आपको बताएगा कि क्या कमांड निरस्त किया गया था।
    • प्रॉम्प्ट रेगेक्स को विशेष संकेतों के लिए संशोधित करने की आवश्यकता हो सकती है, और मैं सोच सकता था कि विभिन्न दूरस्थ वातावरण में अलग-अलग नियंत्रण चरित्र पैटर्न हो सकते हैं।
  4. कोई ssh कमांड बैश पूरा नहीं करता है, जैसे hostname के लिए। यदि आप इस स्क्रिप्ट को उर्फ ​​के sshसाथ पूरा कर सकते हैं, तो आप बैश पूरा कर सकते हैंalias ssh="sshlog"

स्क्रिप्ट स्रोत और स्थापना:

स्थापित करने के लिए, निम्नलिखित को ~ / bin / sshlog में पेस्ट करें और निष्पादन योग्य बनाएं। के साथ बुलाओ sshlog <ssh command options>। वैकल्पिक रूप से उपयोगकर्ता .bashrc फ़ाइल में 'ssh' के लिए उपनाम।

#!/bin/bash
# A wrapper for the ssh command that produces a timestamped log of all ssh commands
declare -r logfile=~/logs/ssh.log
declare -r description="sshlog-${$} ${@}"
declare -r TAB=$'\t'

logdir=`dirname ${logfile}`
[ -d ${logdir} ] || mkdir "${logdir}";

clean_control_chars() {
    while IFS= read -r line; do
        # remove KNOWN control characters. Leave the rest for now.
        # line=$(echo "${line}" | sed 's/\^\[\[K//g')  # unkown control character: ^[[K
        # line=$(echo "${line}" | sed 's/\^\[\[[0-9]\+[P]//g')  # these are generated by up/down completion - e.g. ^[[2P
        line=$(echo "${line}" | sed 's/\^\[\[[0-9]*[A-Z]//g')  # all other ^[[..
        # replay character deletions (backspaces)
        while [[ $(echo "${line}" | grep -E --color=never '.\^H') != "" ]]; do
            line=$(echo "${line}" | sed 's/.\^H//')
        done
        # remove common control characters
        line=$(echo "${line}" | sed 's/\^M$//')  # remove end of line marker from end
        line=$(echo "${line}" | sed 's/^\^G//g')  # remove start marker from start
        # remove ^G from other locations - possibly a good idea
        # line=$(echo "${line}" | sed 's/\^G//g')
        # remove all other control characters - not recommended (many like ^C and ^M indicate which section was processed/ ignored)
        # line=$(echo "${line}" | sed 's/\^[A-Z]//g')
        echo ${line};
    done
}

filter_output() {
    while IFS= read -r line; do
        # convert nonprinting characters and filter out non-prompt (in Ubuntu 14.04 tests, ^G indicates prompt start)
        line=$(echo "${line}" | cat -v | grep -Eo '[\^][G].*[\$#].*')
        [[ ${line} != "" ]] && echo "${line}"
    done
}

format_line() {
    while IFS= read -r line; do
        raw=${line};
        line=$(echo "${line}" | clean_control_chars);
        prompt=$(echo "${line}" | grep -Po '^.*?(\$|#)[\s]*')
        command=${line:${#prompt}}
        timestamp=`date +"%Y-%m-%d %H:%M:%S %z"`
        echo -e "${timestamp}${TAB}${description}${TAB}${prompt}${TAB}${command}"
    done
}

echo "Logging ssh session: ${description}"
echo "[START]" | format_line >> ${logfile}
/usr/bin/ssh "$@" | tee >(filter_output | format_line >> ${logfile})
echo "[END]" | format_line >> ${logfile}

उदाहरण लॉग सामग्री:

2014-06-29 23:04:06 -0700   sshlog-24176 remote [START]
2014-06-29 23:04:12 -0700   sshlog-24176 remote oleg@remote:~$  cd test
2014-06-29 23:04:13 -0700   sshlog-24176 remote oleg@remote:~/test$     ls
2014-06-29 23:04:14 -0700   sshlog-24176 remote oleg@remote:~/test$     exit
2014-06-29 23:04:14 -0700   sshlog-24176 remote [END]

0

मेरे पास एक कम जटिल जवाब है, और निश्चित रूप से एक keylogger नहीं है। मुझे सर्वर लॉग इंडिपेंडेंट होने की आपकी बात नहीं आती (इसका मतलब है कि सभी कार्यों को सर्वर पर ले जाने की आवश्यकता है और सभी लॉग सर्वर साइड लॉग हैं), और इस प्रकार मैंने सोचा कि एक अच्छा विचार है सिस्टम बैश को पास करना एक त्वरित आदेश जैसे:


PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -t "$USER[$$] $SSH_CONNECTION")'

डेबियन में आपको फ़ाइल को संपादित करना चाहिए: /etc/bash.bashrc और फ़ाइल को सेंटोस में: / etc / bashrc

यदि आप जिस सत्र में हैं, उसके लिए लॉगिंग शुरू करना चाहते हैं, तो आपको अपने द्वारा संपादित की गई फ़ाइल को स्रोत करना होगा, उदाहरण के लिए निष्पादित करें:


source /etc/bash.bashrc

एक डेबियन प्रणाली में या


source /etc/bashrc
एक सेंटोस सिस्टम में।

अब से, प्रत्येक ssh सत्र का प्रत्येक कमांड, एक डेबियन सिस्टम पर / var / log / syslog पर और एक सेंटोस सिस्टम पर / var / log / संदेश में लॉग इन किया जाएगा

यदि आप उन्हें एक अलग फ़ाइल पर लॉग इन करना चाहते हैं, तो उन अन्य लॉग फ़ाइलों के साथ गड़बड़ न करें जिन्हें आप उपयोग कर सकते हैं:


PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -p local6.info -t "$USER[$$] $SSH_CONNECTION")'
पिछले PROMPT_COMMAND उदाहरण के बजाय और फिर आवश्यकतानुसार rsyslogd कॉन्फ़िगर करें।

उदाहरण के लिए डेबियन सिस्टम पर /etc/rsyslog.conf फ़ाइल संपादित करें : लाइन बदलें:


.;auth,authpriv.none           -/var/log/syslog
सेवा

.;auth,authpriv.none,local6           -/var/log/syslog
और फ़ाइल के अंत में निम्नलिखित पंक्ति जोड़ें:

local6.info                     /var/log/history.log

फिर निष्पादित करें:

touch /var/log/history.log && /etc/init.d/rsyslog restart


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

0

कैसे के बारे में strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)? यह सभी ssh सत्रों को लॉग करता है। आपको बाद में लॉग को पार्स करने के लिए एक उपकरण की आवश्यकता हो सकती है, या बस उपयोग कर सकते हैं grep, awkआदि।

  • -f: कांटे वाले बच्चों का पता लगाना
  • -ff: प्रत्येक बच्चे को अलग से लॉग इन करें ssh_log.PID
  • -s8192: स्ट्रिंग लॉगिंग सीमा बढ़ाएँ (यदि आवश्यक हो)
  • -T -ttt: एपोच के बाद से सेकंड में मुद्रांकन माइक्रोसेकंड
  • -p N: संलग्न करना N
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.