{"id":353801,"date":"2024-10-02T11:48:24","date_gmt":"2024-10-02T11:48:24","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/monitorizar-los-archivos-de-registro-linux\/"},"modified":"2024-10-13T19:04:40","modified_gmt":"2024-10-13T19:04:40","slug":"monitorizar-los-archivos-de-registro-linux","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/monitorizar-los-archivos-de-registro-linux\/","title":{"rendered":"C\u00f3mo monitorizar los archivos de registro y detectar patrones de texto espec\u00edficos en Linux usando un script bash"},"content":{"rendered":"<p>Monitorizar los archivos de registro y detectar patrones de texto espec\u00edficos es una tarea crucial para los profesionales de TI, especialmente en el contexto de la administraci\u00f3n de sistemas y la <a href=\"https:\/\/www.ninjaone.com\/es\/it-hub\/endpoint-security\/ciberseguridad\/\" target=\"_blank\" rel=\"noopener\">ciberseguridad<\/a>. Los scripts automatizados que pueden alertar sobre cadenas de texto espec\u00edficas dentro de los archivos son herramientas muy valiosas en la caja de herramientas de cualquier profesional de TI.<\/p>\n<p>El script proporcionado cumple esta tarea eficazmente, ofreciendo una soluci\u00f3n robusta para\u00a0<strong>monitorizar los archivos de registro y alertar de la aparici\u00f3n de cadenas de texto espec\u00edficas<\/strong>. Este post profundizar\u00e1 en la funcionalidad del script, explorar\u00e1 sus aplicaciones en el mundo real y discutir\u00e1 las mejores pr\u00e1cticas para su uso.<\/p>\n<h2>Comprender el script y su significado<\/h2>\n<p>En los entornos de TI, diversos sistemas, aplicaciones y procesos generan continuamente archivos de registro. Estos registros contienen informaci\u00f3n vital sobre las operaciones del sistema, errores, eventos de seguridad y actividades de los usuarios. Sin embargo, supervisar manualmente estos archivos en busca de eventos cr\u00edticos o cadenas de texto es poco pr\u00e1ctico y <a href=\"https:\/\/www.ninjaone.com\/blog\/how-human-error-relates-to-cybersecurity-risks\/\" target=\"_blank\" rel=\"noopener\">propenso a errores<\/a>. Aqu\u00ed es donde la automatizaci\u00f3n mediante scripts resulta esencial.<\/p>\n<p>El script proporcionado est\u00e1 dise\u00f1ado para buscar un texto espec\u00edfico dentro de un archivo de registro y generar una alerta cuando se encuentra ese texto. Este script es especialmente \u00fatil para <a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\" target=\"_blank\" rel=\"noopener\">proveedores de servicios gestionados (MSP)<\/a> y administradores de TI que necesitan monitorizar los archivos de registro para detectar incidentes de seguridad, errores de aplicaciones o cualquier otro evento significativo que pueda requerir atenci\u00f3n inmediata.<\/p>\n<h2>El script para monitorizar los archivos de registro<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">#!\/usr\/bin\/env bash\r\n\r\n# Description: Alert when the specified Text is found in a text file.\r\n#\r\n# Release Notes: Initial Release\r\n#   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.\r\n#   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. \r\n#   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. \r\n#   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. \r\n#   Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, 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. \r\n#   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. \r\n#   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. \r\n#   EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n#\r\n# Text to trigger on: [Alert]\r\n#\r\n# Below are all the valid parameters for this script.\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text batman\r\n#   Alerts when the text \"batman\" is found in the file \/opt\/MyLogFile.log\r\n#    This is Case Sensitive\r\n#     Example where it will alert: \"I am batman!\"\r\n#     Example where it will alert: \"Iambatman!\"\r\n#     Example where it will not alert: \"IamBatman!\"\r\n#     Example where it will not alert: \"I am Batman!\"\r\n#\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text Batman --caseInsensitive true\r\n#   Alerts when the text \"Batman\" is found in the file \/opt\/MyLogFile.log, but is case insensitive\r\n#    This is Case Insensitive\r\n#     Example where it will alert: \"I am batman!\"\r\n#     Example where it will alert: \"Iambatman!\"\r\n#\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text Batman --wholeWord true\r\n#   Alerts when the text \"Batman\" is found in the file \/opt\/MyLogFile.log, but only if it is a word in a sentence.\r\n#    This is Case Sensitive\r\n#     Example where it will alert: \"I am Batman!\"\r\n#     Example where it will not alert: \"IamBatman!\"\r\n#\r\n\r\n# Determines whether or not help text is necessary and routes the output to stderr\r\ndie() {\r\n    local _ret=\"${2:-1}\"\r\n    test \"${_PRINT_HELP:-no}\" = yes &amp;&amp; print_help &gt;&amp;2\r\n    echo \"$1\" &gt;&amp;2\r\n    exit \"${_ret}\"\r\n}\r\n\r\n# Function that evaluates whether a value passed to it begins by a character\r\n# that is a short option of an argument the script knows about.\r\n# This is required in order to support getopts-like short options grouping.\r\nbegins_with_short_option() {\r\n    local first_option all_short_options='ftiwh'\r\n    first_option=\"${1:0:1}\"\r\n    test \"$all_short_options\" = \"${all_short_options\/$first_option\/}\" &amp;&amp; return 1 || return 0\r\n}\r\n\r\n# THE DEFAULTS INITIALIZATION - OPTIONALS\r\n_arg_file=\r\n_arg_text=\r\n_arg_caseInsensitive=\"false\"\r\n_arg_wholeWord=\"false\"\r\n\r\n# Help text function for when invalid input is encountered\r\nprint_help() {\r\n    printf '%s\\n' \"Alert when the specified Text is found in a text file.\"\r\n    printf 'Usage: %s [-f|--file [path to file]] [-t|--text [text to search]] [-i|--caseInsensitive &lt;true|false&gt;] [-w|--wholeWord &lt;true|false&gt;] [-h|--help]\\n' \"$0\"\r\n    printf '\\t%s\\n' \"-f, --file: path to a log file\"\r\n    printf '\\t%s\\n' \"-t, --text: text to alert when found\"\r\n    printf '\\t%s\\n' \"-i, --caseInsensitive: search text with case insensitivity (default: false)\"\r\n    printf '\\t%s\\n' \"-w, --wholeWord: search for text as a whole word (default: false)\"\r\n    printf '\\t%s\\n' \"-h, --help: Prints help\"\r\n}\r\n\r\n# Grabbing the parameters and parsing through them.\r\nparse_commandLine() {\r\n    while test $# -gt 0; do\r\n        _key=\"$1\"\r\n        case \"$_key\" in\r\n        -f | --file)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_file=\"$2\"\r\n            shift\r\n            ;;\r\n        --file=*)\r\n            _arg_file=\"${_key##--file=}\"\r\n            ;;\r\n        -f*)\r\n            _arg_file=\"${_key##-f}\"\r\n            ;;\r\n        -t | --text)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_text=\"$2\"\r\n            shift\r\n            ;;\r\n        --text=*)\r\n            _arg_text=\"${_key##--text=}\"\r\n            ;;\r\n        -t*)\r\n            _arg_text=\"${_key##-t}\"\r\n            ;;\r\n        -i | --caseInsensitive)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_caseInsensitive=\"$2\"\r\n            shift\r\n            ;;\r\n        --caseInsensitive=*)\r\n            _arg_caseInsensitive=\"${_key##--caseInsensitive=}\"\r\n            ;;\r\n        -i*)\r\n            _arg_caseInsensitive=\"${_key##-i}\"\r\n            ;;\r\n        -w | --wholeWord)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_wholeWord=\"$2\"\r\n            shift\r\n            ;;\r\n        --wholeWord=*)\r\n            _arg_wholeWord=\"${_key##--wholeWord=}\"\r\n            ;;\r\n        -w*)\r\n            _arg_wholeWord=\"${_key##-w}\"\r\n            ;;\r\n        -h | --help)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        -h*)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        *)\r\n            _PRINT_HELP=yes die \"FATAL ERROR: Got an unexpected argument '$1'\" 1\r\n            ;;\r\n        esac\r\n        shift\r\n    done\r\n}\r\n\r\nparse_commandLine \"$@\"\r\n\r\ntext=$_arg_text\r\nfile=$_arg_file\r\ncaseInsensitive=$_arg_caseInsensitive\r\nwholeWord=$_arg_wholeWord\r\n\r\n# Check if Script Variables where used and overwrite command line parameters\r\nif [[ -n \"${textToMatch}\" ]]; then\r\n    text=$textToMatch\r\nfi\r\nif [[ -n \"${textFile}\" ]]; then\r\n    file=$textFile\r\nfi\r\nif [[ -n \"${matchWholeWord}\" ]]; then\r\n    wholeWord=$matchWholeWord\r\nfi\r\nif [[ -n \"${insensitiveToCase}\" ]]; then\r\n    caseInsensitive=$insensitiveToCase\r\nfi\r\n\r\n# Check if text is not an empty string\r\nif [[ -z \"${text}\" ]]; then\r\n    echo \"[Error] Text not specified\"\r\n    exit 2\r\nfi\r\n\r\n# Check if text is not an empty string\r\nif [[ -z \"${file}\" ]]; then\r\n    echo \"[Error] File not specified\"\r\n    exit 2\r\nfi\r\n\r\n# Does file exit and is readable\r\nif [ -f \"${file}\" ]; then\r\n    echo \"[Info] File \\\"${file}\\\" exists\"\r\n    if [ -r \"${file}\" ]; then\r\n        echo \"[Info] File \\\"${file}\\\" is readable\"\r\n    else\r\n        echo \"[Error] File \\\"${file}\\\" is not readable\"\r\n        exit 2\r\n    fi\r\nelse\r\n    echo \"[Error] File \\\"${file}\\\" does not exists\"\r\n    exit 2\r\nfi\r\n\r\n# Detect\r\ncount=0\r\nif [[ \"${wholeWord}\" == \"true\" ]]; then\r\n    if [[ \"${caseInsensitive}\" == \"true\" ]]; then\r\n        count=$(grep -c -i -n -w \"$text\" \"$file\")\r\n    else\r\n        count=$(grep -c -n -w \"$text\" \"$file\")\r\n    fi\r\nelse\r\n    if [[ \"${caseInsensitive}\" == \"true\" ]]; then\r\n        count=$(grep -c -i -n -e \"$text\" \"$file\")\r\n    else\r\n        count=$(grep -c -n -e \"$text\" \"$file\")\r\n    fi\r\nfi\r\n\r\n# Alert\r\nif ((count &gt; 0)); then\r\n    echo \"[Alert] Found text in file\"\r\n    exit 1\r\nelse\r\n    echo \"[Info] Not found text in file\"\r\n    exit 0\r\nfi<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"in-context-cta\"><\/div>\n<h2>Desglose detallado del script<\/h2>\n<p>Veamos con m\u00e1s detalle c\u00f3mo funciona este script:<\/p>\n<p>1. <strong>Parsing de los\u00a0par\u00e1metros<\/strong><strong>:\u00a0<\/strong><\/p>\n<ul>\n<li>El script comienza definiendo par\u00e1metros por defecto como _arg_file, _arg_text, _arg_caseInsensitive y _arg_wholeWord. A continuaci\u00f3n, estos par\u00e1metros se analizan desde la l\u00ednea de comandos, lo que permite al usuario especificar el archivo que se va a supervisar, el texto que se va a buscar y si la b\u00fasqueda debe distinguir entre may\u00fasculas y min\u00fasculas o limitarse a palabras enteras.<\/li>\n<\/ul>\n<p>2. <strong>\u00a0Argumentos de la l\u00ednea de comandos:\u00a0<\/strong><\/p>\n<ul>\n<li>Los usuarios pueden utilizar varios argumentos como &#8211;file, &#8211;text, &#8211;caseInsensitive y &#8211;wholeWord para personalizar el comportamiento del script. Por ejemplo, &#8211;file especifica la ruta al archivo de registro, mientras que &#8211;text indica el texto que se debe buscar. El script tambi\u00e9n admite b\u00fasquedas sin distinci\u00f3n entre may\u00fasculas y min\u00fasculas y b\u00fasquedas restringidas a palabras completas.<\/li>\n<\/ul>\n<p>3. <strong>\u00a0Validaci\u00f3n<\/strong>:<\/p>\n<ul>\n<li>El script realiza varias comprobaciones de validaci\u00f3n, como asegurarse de que se proporciona tanto el texto a buscar como la ruta del archivo. Tambi\u00e9n comprueba si el archivo especificado existe y es legible. Estas validaciones impiden que el script se ejecute en condiciones inadecuadas, evitando as\u00ed posibles errores.<\/li>\n<\/ul>\n<p>4.<strong>\u00a0B\u00fasqueda del texto<\/strong>:<\/p>\n<ul>\n<li>La funcionalidad principal del script gira en torno al comando grep, que busca el texto especificado dentro del archivo de registro. Dependiendo de los par\u00e1metros proporcionados, el script puede realizar b\u00fasquedas sin distinguir entre may\u00fasculas y min\u00fasculas o buscar s\u00f3lo palabras completas. El resultado del comando grep se almacena en la variable count, que indica cu\u00e1ntas veces se ha encontrado el texto especificado.<\/li>\n<\/ul>\n<p>5. <strong>\u00a0Mecanismo de alerta<\/strong>:<\/p>\n<ul>\n<li>Si el texto se encuentra dentro del archivo, el script genera una alerta imprimiendo un mensaje y saliendo con un c\u00f3digo de estado 1. Si no se encuentra el texto, sale con un c\u00f3digo de estado 0, indicando que no hay condici\u00f3n de alerta.<\/li>\n<\/ul>\n<h2>Casos de uso concretos<\/h2>\n<p>Piensa en un MSP encargado de supervisar los registros del servidor de un cliente para detectar amenazas de seguridad espec\u00edficas, como intentos fallidos de inicio de sesi\u00f3n. Este script podr\u00eda configurarse para buscar en los archivos de registro frases como \u00abContrase\u00f1a fallida\u00bb o \u00abFallo de autenticaci\u00f3n\u00bb. Cuando el script detecte estas frases, alertar\u00e1 inmediatamente al MSP, permiti\u00e9ndole tomar medidas r\u00e1pidas para investigar y <a href=\"https:\/\/www.ninjaone.com\/es\/it-hub\/endpoint-security\/que-es-una-violacion-de-datos\/\" target=\"_blank\" rel=\"noopener\">mitigar posibles brechas de seguridad<\/a>.<\/p>\n<p>Otro ejemplo podr\u00eda ser un administrador de sistemas que necesita supervisar los registros de aplicaciones en busca de errores cr\u00edticos. Configurando el script para que busque palabras clave como \u00abERROR\u00bb o \u00abCR\u00cdTICO\u00bb, el administrador puede asegurarse de que se le avisa r\u00e1pidamente de cualquier problema que pueda afectar al rendimiento o la disponibilidad de la aplicaci\u00f3n.<\/p>\n<h2>Comparaci\u00f3n con otros m\u00e9todos<\/h2>\n<p>Aunque hay varias herramientas y m\u00e9todos disponibles para la monitorizaci\u00f3n de archivos de registro, como el uso de soluciones de gesti\u00f3n de registros centralizadas como <a href=\"https:\/\/www.elastic.co\/elastic-stack\" target=\"_blank\" rel=\"noopener\">ELK Stack (Elasticsearch, Logstash, Kibana)<\/a> o herramientas de monitorizaci\u00f3n basadas en la nube, este script ofrece una soluci\u00f3n ligera y directa que no requiere infraestructura adicional. Es ideal para situaciones en las que la sencillez y la rapidez de implantaci\u00f3n son fundamentales, o en las que un sistema de supervisi\u00f3n completo puede resultar excesivo.<\/p>\n<h2>Preguntas frecuentes<\/h2>\n<ul>\n<li><strong>P: \u00bfSe puede utilizar este script en sistemas que no sean Linux?<\/strong><\/li>\n<li>R: Este script est\u00e1 dise\u00f1ado para sistemas tipo Unix, como <a href=\"https:\/\/www.ninjaone.com\/blog\/linux-filesystems\/\" target=\"_blank\" rel=\"noopener\">Linux<\/a>. Se basa en comandos como grep, que son est\u00e1ndar en estos entornos. Aunque en teor\u00eda podr\u00eda adaptarse a otros sistemas, requerir\u00eda modificaciones.<\/li>\n<li><strong>P: \u00bfC\u00f3mo gestiona el script los archivos de registro de gran tama\u00f1o?<\/strong><\/li>\n<li>R: El script utiliza grep, que es eficaz incluso con archivos de gran tama\u00f1o. Sin embargo, en el caso de archivos extremadamente grandes, el rendimiento podr\u00eda verse afectado. En estos casos, puede ser aconsejable utilizar un mecanismo de rotaci\u00f3n de registros o herramientas de gesti\u00f3n de registros m\u00e1s avanzadas.<\/li>\n<li><strong>P: \u00bfQu\u00e9 ocurre si se encuentran varias instancias del texto?<\/strong><\/li>\n<li>R: El script cuenta todas las instancias del texto en el archivo y activa una alerta si se encuentra alguna coincidencia, independientemente del n\u00famero de ocurrencias.<\/li>\n<\/ul>\n<h2>Implicaciones para la seguridad inform\u00e1tica<\/h2>\n<p>La capacidad de supervisar los archivos de registro en busca de cadenas de texto espec\u00edficas es crucial para <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/lista-de-verificacion-de-seguridad-de-ti\/\" target=\"_blank\" rel=\"noopener\">mantener la seguridad<\/a> y la estabilidad de los sistemas inform\u00e1ticos. Este script puede ser un componente cr\u00edtico de una estrategia de seguridad m\u00e1s amplia, ayudando a los profesionales de TI a detectar y <a href=\"https:\/\/www.ninjaone.com\/blog\/defeat-cyber-security-threats\/\" target=\"_blank\" rel=\"noopener\">responder r\u00e1pidamente a las amenazas potenciales<\/a>. Al <a href=\"https:\/\/www.ninjaone.com\/es\/rmm\/automatizacion-de-ti\/\" target=\"_blank\" rel=\"noopener\">automatizar<\/a> el proceso de supervisi\u00f3n, el script reduce el riesgo de que se pasen por alto alertas y garantiza que los problemas cr\u00edticos se se\u00f1alen en tiempo real.<\/p>\n<h2>Recomendaciones para utilizar el script<\/h2>\n<ul>\n<li><strong>Actualiza regularmente el script<\/strong>: aseg\u00farate de que el script se mantiene actualizado con las \u00faltimas funciones y mejoras. Las actualizaciones peri\u00f3dicas tambi\u00e9n pueden ayudar a abordar posibles vulnerabilidades de seguridad.<\/li>\n<li><strong>Int\u00e9gralo con otras herramientas<\/strong>: considera la posibilidad de integrar este script con herramientas de notificaci\u00f3n, como alertas por correo electr\u00f3nico o SMS, para garantizar que las alertas se reciban con prontitud, incluso cuando el administrador no est\u00e9 supervisando activamente el sistema.<\/li>\n<li><strong>Prueba en un entorno seguro<\/strong>: antes de desplegar el script en un entorno de producci\u00f3n, pru\u00e9balo en un entorno controlado para asegurarte de que se comporta como se espera con tus archivos de registro y casos de uso espec\u00edficos.<\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p>Monitorizar los archivos de registro en busca de cadenas de texto espec\u00edficas es una pr\u00e1ctica fundamental en la administraci\u00f3n y seguridad de TI. Este script proporciona una soluci\u00f3n sencilla pero potente para automatizar este proceso, facilitando a los profesionales de TI la detecci\u00f3n y respuesta a eventos cr\u00edticos en tiempo real. Para aquellos que utilizan <a href=\"https:\/\/www.ninjaone.com\/es\/\" target=\"_blank\" rel=\"noopener\">NinjaOne<\/a>, este tipo de script podr\u00eda ser una parte integral de su estrategia global de monitoreo de TI, asegurando que sus sistemas permanezcan seguros y operativos en todo momento.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":""},"operating_system":[4211],"use_cases":[4263],"class_list":["post-353801","script_hub","type-script_hub","status-publish","hentry","script_hub_category-linux","use_cases-supervision"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/353801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=353801"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=353801"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=353801"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=353801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}