স্থানীয়, সমস্ত ssh কমান্ডের টাইমস্ট্যাম্পড লগিং?


12

আমি যে সমস্ত রিমোট কমান্ডগুলিতে ব্যবহার করি ssh(কমান্ড-লাইন ওপেনশায় ক্লায়েন্টের মাধ্যমে শুরু হয়েছিল bash) তার স্থানীয়, টাইমস্ট্যাম্পড রেকর্ড আমি কীভাবে রাখতে পারি ?

প্রয়োজনীয়তা:

  • আবশ্যিক:

    • সার্ভার লগিংয়ের উপর নির্ভর না করে 100% ক্লায়েন্ট-সাইড
    • ব্যবহারকারীর হোম ডিরেক্টরিতে সংরক্ষিত লগ সহ প্রতি ব্যবহারকারীকে কনফিগার করা বা ইনস্টল করা।
    • বিভিন্ন ব্যবহারকারী এবং হোস্টের সাথে একসাথে একাধিক সেশনের মধ্যে পার্থক্য করার জন্য সমর্থন।
    • অ-অনুপ্রবেশকারী (এটি প্রতিবার সক্রিয় করার প্রয়োজন হবে না এবং এসএসএস ব্যবহারে উল্লেখযোগ্যভাবে হস্তক্ষেপ করবে না)
  • বেশি অগ্রাধিকার:

    • হয় আউটপুট যতটা সম্ভব লগ ইন বা ফিল্টার আউট হয় না
    • হয় পাসওয়ার্ড এন্ট্রি লগ করা হয় না বা ফাইল এনক্রিপ্ট করা হয়
    • ব্যবহৃত প্রকৃত কমান্ডগুলি নির্দেশ করে (ট্যাব / ইতিহাস সমাপ্তির পরে, ব্যাকস্পেস, CTRL+ Cইত্যাদি ... প্রক্রিয়া করা হয়েছে)
  • আছে চমৎকার:

    • শৃঙ্খলাবদ্ধ সেশনে কমান্ডও লগ করে (দূরবর্তী sshবা su <user>সেশনের সময় কমান্ডগুলি প্রবেশ করা হয় )
    • সেশন শুরু এবং শেষ লগ করা উচিত
    • একটি সাধারণ- bashভিত্তিক, মূল ছাড়াই সমাধান সবচেয়ে ভাল হবে (সম্ভবত কমান্ডের জন্য একটি aliasবা bashমোড়ক স্ক্রিপ্ট ssh?)

আমার দক্ষতার স্তর:

  • আমি প্রোগ্রামিংয়ে নতুন নই, তবে এখনও শিখছি bashএবং "লিনাক্স ওয়ে", সুতরাং সংক্ষিপ্ত ব্যাখ্যা সহ কোড নমুনাগুলি সবচেয়ে প্রশংসা হবে।

সম্ভাব্য কৌশলসমূহ

  • কীলগার - সমস্যা: লগ পাসওয়ার্ড, লগ করে না ট্যাব / ইতিহাস সমাপ্তি ( গ্লেনের উত্তর দেখুন )
  • screenপ্রতি সেকেন্ডে একবার স্ক্রলব্যাক ডাম্পিং সহ এবং diffতাদের মধ্যে নতুন স্ক্রোলব্যাক লাইনগুলি খুঁজে পেতে - সমস্যা: কীভাবে এটি কার্যকর স্বয়ংক্রিয় পদ্ধতিতে প্রয়োগ করা যেতে পারে?
  • ssh "$@" | tee >(some_cleaner_function >> $logfile) - সমস্যা: জড়িত সেশনে মাল্টলাইন কমান্ড বা ইতিহাস পরিচালনা করতে পারে না, সতর্কতার সাথে পরিষ্কারের প্রয়োজন (আমার উত্তর দেখুন)
  • উপরের কিছু সংমিশ্রণ

একটি উদাহরণ

নিম্নলিখিত এসএসএইচ অধিবেশন:

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]

অথবা, ফাইলের শীর্ষে সেশন শুরু করতে ব্যবহৃত কমান্ড লাইন দিয়ে প্রতিটি সেশনের জন্য একটি পৃথক লগ তৈরি করা হবে।


এটি ন্যানো বা ভিম
ডেইজি

উত্তর:


4

আমি আপনার প্রশ্নে আগ্রহী ছিলাম। আমি প্রাথমিকভাবে কোনও উত্তর দিতে যাচ্ছিলাম না তবে আমি জড়িয়ে পড়েছি।

এটি ব্যবহার করে 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" পাবেন, "আপটাইম" নয়
  • এটি "কাঁচা" মোডে অক্ষরগুলি ধরে ফেলে: ব্যবহারকারী যদি খারাপ টাইপবাদক ^?হন তবে লগ ফাইলটিতে আপনি প্রচুর (ব্যাকস্পেস অক্ষর) পাবেন।

উত্তরের জন্য তোমাকে অনেক ধন্যবাদ. এটি আকর্ষণীয় যে এটির পক্ষে সহজ উত্তর বলে মনে হয় না, সম্ভবত এটি ssh ক্লায়েন্টের স্থানীয়। সীমাবদ্ধতা ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ; আমি মনে করি ট্যাব সমাপ্তি / ব্যাকস্পেস অক্ষর লগিং / পাসওয়ার্ড লগিং আমাকে প্রায়শই এটি ব্যবহার থেকে বিরত রাখতে যথেষ্ট। এটি আমাকে আমার অগ্রাধিকারগুলি সম্পর্কে আরও চিন্তাভাবনা করতে বাধ্য করেছিল এবং আমি প্রশ্নে সেগুলি পরিষ্কার করব।
ওলেগ

বানানো প্রক্রিয়াটি থেকে আউটপুটটি আপনার চান কমান্ডটি বের করতে পার্স করা যায়। এটিকে আরও সহজ করার জন্য আপনার ব্যবহারকারীর প্রম্পটটি জানতে হবে।
গ্লেন জ্যাকম্যান

আমি ট্যাব সমাপ্তি অনেক ব্যবহার করি। এর অর্থ এই নয় যে এই কমান্ডগুলি লগ হবে না?
ওলেগ

আহ, আমি যা বলছি তা আমি দেখতে পাচ্ছি। কিভাবে আউটপুট পার্স করা হবে? কনফিগারেশন বিকল্প হিসাবে প্রম্পটটি কোথাও প্রবেশ করা যেতে পারে।
ওলেগ

আমি প্রশ্নের নীচে সম্ভাব্য সমাধানগুলির তালিকা যুক্ত করেছি। ssh ... | ইন-ইন <লগফিল> নিরাপদে ইনপুট এবং আউটপুট লগ করতে ভাল কাজ করে তবে আমি কীভাবে টাইমস্ট্যাম্পগুলি যুক্ত করব এবং / অথবা পটভূমিতে আউটপুট ফিল্টার করব তা জানি না।
ওলেগ

2

আমি বর্তমানে নীচে ব্যাশ স্ক্রিপ্ট ব্যবহার করছি। এটির অনেকগুলি সমস্যা রয়েছে তবে এটি কেবলমাত্র একটি সমাধানই আমি খুঁজে পেয়েছি যা সমস্ত প্রয়োজনীয়তা, অগ্রাধিকার এবং "সুন্দর থেকে সুন্দর থাকতে হবে" (কমপক্ষে বেশিরভাগ সময়) এর সমস্ত বিষয়কেই সম্বোধন করে।

এই উত্তরে আলোচনা করা হয় যে স্থানীয়ভাবে এসএস সেশনের লগিং কেন এতটা কঠিন is

স্ক্রিপ্টটি নিয়ে আমি এখনও অবধি সমস্যাগুলি পেয়েছি:

  1. মাল্টলাইন কমান্ডগুলি সমস্যার কারণ:

    • যদি আপনি দূরবর্তী ইতিহাসের একাধিক লাইন আইটেমের মাধ্যমে পৃষ্ঠা আপ করেন (আপ / ডাউন কীগুলি), এটি সর্বশেষতম কমান্ডের পরিবর্তে কোনও ইতিহাস আইটেম লগ করবে। ব্যাশ ইতিহাস থেকে কোনও মাল্টলাইন কমান্ড ব্যবহার করার পরে তা মুছে ফেলা আপনি এড়াতে পারেন ।
    • মাল্টলাইন কমান্ডের কেবল প্রথম লাইনটি লগ হয়েছে।
  2. শৃঙ্খলাবদ্ধ সেশনগুলি ( রিমোট প্রান্তে কমান্ডগুলি ব্যবহার sshবা ব্যবহার করে su) ব্যবহার করা প্রকৃত কমান্ডের পরিবর্তে ইতিহাস স্ক্রোলিংকে স্ক্রোলড-পাস হওয়া কমান্ডগুলি রেকর্ড করে তোলে

  3. নিয়মিত প্রকাশগুলি উন্নত করা যেতে পারে এবং নির্দিষ্ট পরিবেশের জন্য এটি সংশোধন করার প্রয়োজন হতে পারে:

    • cat -vপরিষ্কারের আগে নন-প্রিন্টিং অক্ষরকে রূপান্তর করে আমি প্রতারণা করি । ফলস্বরূপ, আপনি ^[[যদি আপনার আদেশের মতো স্ট্রিং ব্যবহার করেন তবে বৈধ সামগ্রী মুছে ফেলা হতে পারে ।
    • কখনও কখনও আপনি কমান্ডের আগে অতিরিক্ত লগ ইনপুট পান, যেমন আপনি ইতিহাসের মাধ্যমে খুব দ্রুত পৃষ্ঠাগ্রহণ করেন। এটি প্রকৃত কমান্ডের আগে সাধারণত একটি "^ এম" অনুসরণ করে এবং এটি ইচ্ছা করলে সরিয়ে ফেলা যায়।
    • অন্যান্য নিয়ন্ত্রণের অক্ষর কখনও কখনও ঘটে। কোনটি অপসারণ করা নিরাপদ তা না জানা পর্যন্ত আমি এগুলিকে আপাতত রেখে দিচ্ছি। আমি যেমনটি উল্লেখ করেছি এম এম অবৈধ লগ ইনপুট সনাক্ত করার জন্য দরকারী, এবং the সি আপনাকে আদেশটি বাতিল করে দেওয়া হয়েছে কিনা তা জানাতে পারে।
    • নির্দিষ্ট প্রম্পটের জন্য প্রম্পট রেজেক্সে সংশোধন করা দরকার হতে পারে এবং আমি ভাবতে পারি যে বিভিন্ন দূরবর্তী পরিবেশে বিভিন্ন নিয়ন্ত্রণ চরিত্রের ধরণ থাকতে পারে।
  4. হোস্ট-নেম হিসাবে কোনও ssh কমান্ড বাশ সম্পূর্ণ নয়। আপনি যদি এই স্ক্রিপ্টটি sshদিয়ে থাকেন তবে আপনি বাশ সম্পূর্ণ করতে পারবেনalias ssh="sshlog"

স্ক্রিপ্ট উত্স এবং ইনস্টলেশন:

ইনস্টল করতে, নিম্নলিখিতগুলিকে ~ / bin / sshlog এ পেস্ট করুন এবং কার্যকর করতে পারেন। সাথে কল sshlog <ssh command options>। ব্যবহারকারীর .bashrc ফাইলে sচ্ছিকভাবে '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

আমার একটি কম জটিল উত্তর আছে, এবং অবশ্যই কোনও কিলোগ্রাগার নয়। আমি আপনার সার্ভার লগটি স্বাধীন হওয়ার বিষয়টি পাই না (এর অর্থ এই যে সমস্ত ক্রিয়াটি সার্ভারে নেওয়া দরকার এবং সমস্ত লগগুলি সার্ভারের সাইড লগ হয়), এবং এইভাবে আমি ভেবেছিলাম যে সিস্টেম ওয়াইড বাশার্কে যাওয়ার জন্য একটি ভাল ধারণা একটি প্রম্পট কমান্ড যেমন:


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 / লগ / বার্তাগুলিতে লগ করা হবে।

আপনি যদি এগুলিকে পৃথক ফাইলে লগ করতে চান এবং অন্যান্য লগ ফাইলগুলি ব্যবহার করতে পারেন তবে তাতে গণ্ডগোল না ঘটলে:


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


এই প্রশ্নটি বিশেষত প্রতিটি স্থানীয় দূরবর্তী সার্ভারটি কনফিগার করার জন্য (মনে রাখতে / অনুমতি দেওয়া) বা আপনি সংযুক্ত সমস্ত দূরবর্তী সার্ভার থেকে ম্যানুয়ালি লগগুলি ডাউনলোড না করেই শুরু / স্থানীয় / ক্লায়েন্ট কম্পিউটারের পাশ দিয়ে স্যাশ সেশনগুলি লগ করার সমস্যা সম্পর্কে about প্রতি. আমি মনে করি আপনার উত্তরটি যদিও এই প্রশ্নের উত্তর দেয় না তবে তাদের সার্ভারের নিরীক্ষণ উন্নত করতে আগ্রহী এমন ব্যক্তির পক্ষে কার্যকর হবে এবং সম্ভবত আরও প্রাসঙ্গিক প্রশ্নে সরিয়ে নেওয়া উচিত।
ওলেগ

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.