So überwacht man Protokolldateien und erkennt bestimmte Texte unter Linux mithilfe eines Bash-Skripts

Das Monitoring von Protokollen und die Erkennung bestimmter Textmuster ist eine wichtige Aufgabe für IT-Experten, insbesondere im Zusammenhang mit der Systemverwaltung und der Cybersicherheit. Automatisierte Skripte, die auf bestimmte Textzeichenfolgen in Dateien aufmerksam machen können, sind unschätzbare Tools im Toolkit eines IT-Experten.

Das mitgelieferte Skript erfüllt diese Aufgabe auf effektive Weise und bietet eine zuverlässige Lösung für das Monitoring von Protokollen und die Benachrichtigung beim Auftreten bestimmter Textzeichenfolgen. In diesem Blogbeitrag werden die Funktionen des Skripts näher erläutert, seine praktischen Anwendungen untersucht und Best Practices für seine Verwendung erörtert.

Verständnis vom Skript und dessen Bedeutung

In IT-Umgebungen werden kontinuierlich Protokolldateien von verschiedenen Systemen, Anwendungen und Prozessen erzeugt. Diese Protokolle enthalten essenzielle Informationen über den Betrieb des Systems, Fehler, Sicherheitsereignisse und Benutzeraktivitäten. Das manuelle Monitoring dieser Dateien auf kritische Ereignisse oder Textzeichenfolgen ist jedoch unpraktisch und anfällig für menschliche Fehler. An dieser Stelle wird die Automatisierung durch Skripte unerlässlich.

Das mitgelieferte Skript ist so konzipiert, dass es nach einem bestimmten Text in einer Protokolldatei sucht und eine Warnmeldung erzeugt, wenn dieser Text gefunden wird. Dieses Skript ist besonders nützlich für Managed Service Provider (MSPs) und IT-Administratoren, die Protokolle auf Sicherheitsvorfälle, Anwendungsfehler oder andere wichtige Ereignisse überwachen müssen, die sofortige Aufmerksamkeit erfordern könnten.

Das Skript:

#!/usr/bin/env bash

# Description: Alert when the specified Text is found in a text file.
#
# Release Notes: Initial Release
#   By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
#   Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
#   Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
#   Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
#   Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
#   Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
#   Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
#   EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#
# Text to trigger on: [Alert]
#
# Below are all the valid parameters for this script.
# Preset Parameter: --file "/opt/MyLogFile.log" --text batman
#   Alerts when the text "batman" is found in the file /opt/MyLogFile.log
#    This is Case Sensitive
#     Example where it will alert: "I am batman!"
#     Example where it will alert: "Iambatman!"
#     Example where it will not alert: "IamBatman!"
#     Example where it will not alert: "I am Batman!"
#
# Preset Parameter: --file "/opt/MyLogFile.log" --text Batman --caseInsensitive true
#   Alerts when the text "Batman" is found in the file /opt/MyLogFile.log, but is case insensitive
#    This is Case Insensitive
#     Example where it will alert: "I am batman!"
#     Example where it will alert: "Iambatman!"
#
# Preset Parameter: --file "/opt/MyLogFile.log" --text Batman --wholeWord true
#   Alerts when the text "Batman" is found in the file /opt/MyLogFile.log, but only if it is a word in a sentence.
#    This is Case Sensitive
#     Example where it will alert: "I am Batman!"
#     Example where it will not alert: "IamBatman!"
#

# Determines whether or not help text is necessary and routes the output to stderr
die() {
    local _ret="${2:-1}"
    test "${_PRINT_HELP:-no}" = yes && print_help >&2
    echo "$1" >&2
    exit "${_ret}"
}

# Function that evaluates whether a value passed to it begins by a character
# that is a short option of an argument the script knows about.
# This is required in order to support getopts-like short options grouping.
begins_with_short_option() {
    local first_option all_short_options='ftiwh'
    first_option="${1:0:1}"
    test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0
}

# THE DEFAULTS INITIALIZATION - OPTIONALS
_arg_file=
_arg_text=
_arg_caseInsensitive="false"
_arg_wholeWord="false"

# Help text function for when invalid input is encountered
print_help() {
    printf '%s\n' "Alert when the specified Text is found in a text file."
    printf 'Usage: %s [-f|--file [path to file]] [-t|--text [text to search]] [-i|--caseInsensitive <true|false>] [-w|--wholeWord <true|false>] [-h|--help]\n' "$0"
    printf '\t%s\n' "-f, --file: path to a log file"
    printf '\t%s\n' "-t, --text: text to alert when found"
    printf '\t%s\n' "-i, --caseInsensitive: search text with case insensitivity (default: false)"
    printf '\t%s\n' "-w, --wholeWord: search for text as a whole word (default: false)"
    printf '\t%s\n' "-h, --help: Prints help"
}

# Grabbing the parameters and parsing through them.
parse_commandLine() {
    while test $# -gt 0; do
        _key="$1"
        case "$_key" in
        -f | --file)
            test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
            _arg_file="$2"
            shift
            ;;
        --file=*)
            _arg_file="${_key##--file=}"
            ;;
        -f*)
            _arg_file="${_key##-f}"
            ;;
        -t | --text)
            test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
            _arg_text="$2"
            shift
            ;;
        --text=*)
            _arg_text="${_key##--text=}"
            ;;
        -t*)
            _arg_text="${_key##-t}"
            ;;
        -i | --caseInsensitive)
            test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
            _arg_caseInsensitive="$2"
            shift
            ;;
        --caseInsensitive=*)
            _arg_caseInsensitive="${_key##--caseInsensitive=}"
            ;;
        -i*)
            _arg_caseInsensitive="${_key##-i}"
            ;;
        -w | --wholeWord)
            test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
            _arg_wholeWord="$2"
            shift
            ;;
        --wholeWord=*)
            _arg_wholeWord="${_key##--wholeWord=}"
            ;;
        -w*)
            _arg_wholeWord="${_key##-w}"
            ;;
        -h | --help)
            print_help
            exit 0
            ;;
        -h*)
            print_help
            exit 0
            ;;
        *)
            _PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1
            ;;
        esac
        shift
    done
}

parse_commandLine "$@"

text=$_arg_text
file=$_arg_file
caseInsensitive=$_arg_caseInsensitive
wholeWord=$_arg_wholeWord

# Check if Script Variables where used and overwrite command line parameters
if [[ -n "${textToMatch}" ]]; then
    text=$textToMatch
fi
if [[ -n "${textFile}" ]]; then
    file=$textFile
fi
if [[ -n "${matchWholeWord}" ]]; then
    wholeWord=$matchWholeWord
fi
if [[ -n "${insensitiveToCase}" ]]; then
    caseInsensitive=$insensitiveToCase
fi

# Check if text is not an empty string
if [[ -z "${text}" ]]; then
    echo "[Error] Text not specified"
    exit 2
fi

# Check if text is not an empty string
if [[ -z "${file}" ]]; then
    echo "[Error] File not specified"
    exit 2
fi

# Does file exit and is readable
if [ -f "${file}" ]; then
    echo "[Info] File \"${file}\" exists"
    if [ -r "${file}" ]; then
        echo "[Info] File \"${file}\" is readable"
    else
        echo "[Error] File \"${file}\" is not readable"
        exit 2
    fi
else
    echo "[Error] File \"${file}\" does not exists"
    exit 2
fi

# Detect
count=0
if [[ "${wholeWord}" == "true" ]]; then
    if [[ "${caseInsensitive}" == "true" ]]; then
        count=$(grep -c -i -n -w "$text" "$file")
    else
        count=$(grep -c -n -w "$text" "$file")
    fi
else
    if [[ "${caseInsensitive}" == "true" ]]; then
        count=$(grep -c -i -n -e "$text" "$file")
    else
        count=$(grep -c -n -e "$text" "$file")
    fi
fi

# Alert
if ((count > 0)); then
    echo "[Alert] Found text in file"
    exit 1
else
    echo "[Info] Not found text in file"
    exit 0
fi

 

Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.

Zugang erhalten

Detaillierte Aufschlüsselung des Skripts

Schauen wir uns genauer an, wie dieses Skript funktioniert:

1. Parameter -Parsen: 

  • Das Skript beginnt mit der Definition von Standardparametern wie _arg_file, _arg_text, _arg_caseInsensitive und _arg_wholeWord. Diese Parameter werden dann von der Befehlszeile geparst, sodass die Benutzer:innen die zu überwachende Datei und den zu suchenden Text angeben können. Es lässt sich außerdem festlegen, ob bei der Suche die Groß- und Kleinschreibung nicht beachtet werden soll oder nur ganze Wörter berücksichtigt werden sollen.

2. Befehlszeilen-Argumente: 

  • Benutzer:innen können verschiedene Argumente wie –file, –text, –caseInsensitive und –wholeWord übergeben, um das Verhalten des Skripts anzupassen. So gibt beispielsweise –file den Pfad zur Protokolldatei an, während –text den Text angibt, nach dem gesucht werden soll. Das Skript unterstützt auch die Suche ohne Berücksichtigung der Groß- und Kleinschreibung und die Suche nach ganzen Wörtern.

3. Validierung:

  • Das Skript führt mehrere Validierungschecks durch, z. B. stellt es sicher, dass sowohl der zu suchende Text als auch der Dateipfad angegeben sind. Es wird auch geprüft, ob die angegebene Datei existiert und lesbar ist. Diese Validierungen verhindern, dass das Skript unter unzulässigen Bedingungen ausgeführt wird, und vermeiden so mögliche Fehler.

4. Text-Suche:

  • Die Kernfunktion des Skripts ist der Befehl grep, der im Protokoll nach dem angegebenen Text sucht. Je nach den angegebenen Parametern kann das Skript eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchführen oder nur nach ganzen Wörtern suchen. Das Ergebnis des grep-Befehls wird in der Variablen count gespeichert, die angibt, wie oft der angegebene Text gefunden wurde.

5. Warnmechanismus:

  • Wenn der Text in der Datei gefunden wird, erzeugt das Skript eine Warnmeldung und wird mit einem Statuscode von 1 beendet. Wird der Text nicht gefunden, wird der Vorgang mit dem Statuscode 0 beendet und keine Warnmeldung gezeigt.

Anwendungsfälle aus der Praxis

Nehmen wir an, ein MSP hat die Aufgabe, die Serverprotokolle eines Kunden auf bestimmte Sicherheitsbedrohungen zu überwachen, z. B. fehlgeschlagene Login-Versuche. Dieses Skript könnte so konfiguriert werden, dass es die Protokolldateien nach Ausdrücken wie „Passwort fehlgeschlagen“ oder „Authentifizierungsfehler“ durchsucht. Wenn das Skript diese Ausdrücke entdeckt, würde es den MSP sofort benachrichtigen, sodass dieser rasch Maßnahmen ergreifen kann, um potenzielle Sicherheitsverletzungen zu untersuchen und zu entschärfen.

Ein anderes Beispiel wäre ein Systemadministrator, der die Anwendungsprotokolle auf kritische Fehler überwachen muss. Indem der Administrator das Skript so konfiguriert, dass es nach Schlüsselwörtern wie „ERROR“ oder „CRITICAL“ sucht, kann er sicherstellen, dass er umgehend über Probleme informiert wird, die die Leistung oder Verfügbarkeit der Anwendung beeinträchtigen könnten.

Vergleiche mit anderen Methoden

Es gibt zwar verschiedene Tools und Methoden für das Monitoring von Protokolldateien, z. B. zentralisierte Protokoll-Management-Lösungen wie ELK Stack (Elasticsearch, Logstash, Kibana) oder Cloud-basierte Monitoring-Tools, aber dieses Skript bietet eine kompakte und unkomplizierte Lösung, die keine zusätzliche Infrastruktur erfordert. Es ist ideal für Szenarien, in denen es auf Einfachheit und schnelle Bereitstellung ankommt, oder in denen ein vollwertiges Monitoring-System zu viel des Guten wäre.

Häufig gestellte Fragen

  • F: Kann dieses Skript auch auf Nicht-Linux-Systemen verwendet werden?
  • A: Dieses Skript ist für Unix-ähnliche Systeme, wie Linux, konzipiert. Es stützt sich auf Befehle wie grep, die in diesen Umgebungen Standard sind. Es könnte zwar theoretisch auch für andere Systeme angepasst werden, würde aber Änderungen erfordern.
  • F: Wie geht das Skript mit großen Protokolldateien um?
  • A: Das Skript verwendet grep, das auch bei großen Dateien effizient ist. Bei extrem großen Dateien kann die Leistung jedoch beeinträchtigt werden. In solchen Fällen kann es ratsam sein, einen Mechanismus zur Protokollrotation oder leistungsfähigere Tools zum Protokoll-Management einzusetzen.
  • F: Was geschieht, wenn mehrere Versionen des Textes gefunden werden?
  • A: Das Skript zählt alle Vorkommen des Textes in der Datei und löst eine Warnmeldung aus, wenn eine Übereinstimmung gefunden wird, unabhängig von der Anzahl der Vorkommen.

Auswirkungen auf die IT-Sicherheit

Die Fähigkeit, Protokolldateien auf bestimmte Textzeichenfolgen zu überwachen, ist für die Aufrechterhaltung der Sicherheit und Stabilität von IT-Systemen von entscheidender Bedeutung. Dieses Skript kann eine wichtige Komponente einer umfassenderen Sicherheitsstrategie sein und IT-Experten dabei helfen, potenzielle Bedrohungen schnell zu erkennen und darauf zu reagieren. Durch die Automatisierung des Monitoring-Prozesses verringert das Skript das Risiko verpasster Warnmeldungen und stellt sicher, dass kritische Probleme in Echtzeit gemeldet werden.

Empfehlungen für die Verwendung des Skripts

  • Aktualisieren Sie das Skript regelmäßig: Stellen Sie sicher, dass das Skript mit den neuesten Funktionen und Verbesserungen auf dem neuesten Stand gehalten wird. Regelmäßige Updates können auch dazu beitragen, potenzielle Sicherheitslücken zu schließen.
  • Integrieren Sie es mit anderen Tools: Ziehen Sie in Erwägung, dieses Skript mit Benachrichtigungs-Tools wie E-Mail oder SMS zu integrieren, um sicherzustellen, dass Warnmeldungen sofort eingehen, auch wenn der Administrator das System nicht aktiv überwacht.
  • Testen Sie es in einer sicheren Umgebung: Bevor Sie das Skript in einer Produktionsumgebung einsetzen, testen Sie es in einer kontrollierten Umgebung, um sicher zu sein, dass es sich mit Ihren spezifischen Protokolldateien und Anwendungsfällen wie erwartet verhält.

Abschließende Überlegungen

Das Monitoring von Protokolldateien auf bestimmte Textzeichenfolgen ist ein grundlegendes Verfahren in der IT-Verwaltung und -Sicherheit. Dieses Skript bietet eine einfache, aber leistungsstarke Lösung zur Automatisierung dieses Prozesses, die es IT-Experten erleichtert, kritische Ereignisse in Echtzeit zu erkennen und darauf zu reagieren. Für diejenigen, die NinjaOne verwenden, könnte diese Art von Skript ein integraler Bestandteil ihrer gesamten IT-Monitoring-Strategie sein. Dadurch wird gewährleistet, dass Ihre Systeme jederzeit sicher und betriebsbereit bleiben.

Nächste Schritte

Der Aufbau eines effizienten und effektiven IT-Teams erfordert eine zentralisierte Lösung, die als einheitliches Tool zur Bereitstellung von IT-Dienstleistungen fungiert. NinjaOne ermöglicht es IT-Teams, all ihre Geräte zu überwachen, verwalten, sichern und zu unterstützen, unabhängig von ihrem Ort und komplexer Infrastruktur vor Ort.

Erfahren Sie mehr über NinjaOne Endpoint Management schauen Sie sich eine Live-Tour an oder starten Sie Ihre kostenlose Testversion der NinjaOne Plattform.

Kategorien:

Das könnte Sie auch interessieren

Demo ansehen×
×

Sehen Sie NinjaOne in Aktion!

Mit dem Absenden dieses Formulars akzeptiere ich die Datenschutzerklärung von NinjaOne.

NinjaOne Terms & Conditions

By clicking the “I Accept” button below, you indicate your acceptance of the following legal terms as well as our Terms of Use:

  • Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms.
  • Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party.
  • Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library belonging to or under the control of any other software provider.
  • Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations.
  • Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks.
  • Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script.
  • EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).