Linux (SSH) の監視

最終更新日: 12 年 2024 月 XNUMX 日

LogicMonitor は、SSH プロトコルを利用して CPU、メモリ、ファイルシステムの使用率などのさまざまなメトリクスを収集する Linux システムの監視を提供します。稼働時間。いくつか例を挙げると、スループットなどです。ただし、この監視は SNMP が構成されていないシステム専用に設計されています。 SNMP が構成されている場合は、すぐに使用できるより堅牢な監視が有効になり、この Linux SSH パッケージによって提供される SSH 監視を構成する必要はありません。

要件

  • Linux ホストを監視に追加します
    監視にリソースを追加する方法の詳細については、を参照してください。 デバイスの追加.
  • データソースを適用するには、Linux ホスト上で SSH を構成する必要があります。
    パスワードの代わりに SSH 公開キーと秘密キーのペアを使用して、コレクターのデバイスへのアクセスを認証できます。これには、SSH キー ペアを生成し、LogicMonitor のデバイスとデバイスに割り当てられているコレクタのホストに公開キーをコピーする必要があります。
    SSH キー ペアを使用するには、次のものが必要です。
    • 有効なホーム ディレクトリSSH サーバーは次の方法で検証します。  ~/.ssh/authorized_keys 受信接続を認証するとき。
    • 従来の OpenSSH 形式 (.pem) のキー ペア

注: ssh-keygen を使用して新しい SSH キーを生成するにはどうすればよいですか? SSH からのドキュメントと次のコマンドを使用して、従来の OpenSSH 形式でキー ペアを生成します。

ssh-keygen -m PEM

  • LogicMonitorパブリックリポジトリから、にリストされているすべてのLinux SSHLogicModuleをインポートします。 パッケージ内のLogicModules このサポート記事のセクション。これらの LogicModule がすでに存在する場合は、最新バージョンであることを確認してください。 LogicModule がインポートされると (以前のセットアップ要件がすべて満たされていると仮定して)、DataSource スイートは自動的にデータの収集を開始します。

リソースへのプロパティの割り当て

SSH資格情報は、LogicMonitor内のLinuxリソースのプロパティとして設定する必要があります。 これらのプロパティにより、LogicMonitorは認証のために適切な資格情報をLinuxホストに渡すことができます。 特権ユーザーを提供しないことを強くお勧めします。

SSH認証資格情報をプロパティとして設定する方法の詳細については、を参照してください。 認証資格情報の定義.

このパッケージのLogicModuleは、SSH経由でLinuxを監視するための特別な権限を必要としません。 他の監視パッケージのLogicModuleには、追加のアクセス許可が必要な場合があります。 これらは、それぞれのサポート記事で指定されます。 特別な権限が必要ないことは、Debian、Ubuntu Server、CentOSのクリーンインストールに対するテストを通じて確認されていますが、システムに適用された可能性のある追加の強化手順は考慮されていません。

LinuxSSHコントロールグループとサービスステータスのインスタンスの追加

  コントロールグループ & サービスステータス データソースでは、データソース定義からActive Discoveryが有効になっていないため、インスタンスを手動で追加するか、以下のスクリプトを使用してActiveDiscoveryを有効にする必要があります。 特定のホスト上のすべてのcgroupおよびサービスに対してActiveDiscoveryを自動的に有効にすると、生成されるインスタンスが多すぎて、LogicMonitorプラットフォームでアラートフラッディングが急速に発生したり、インスタンスのリストが管理できなくなったりする可能性があるため、これらのデータソースはこのように構成されています。

このため、次のXNUMXつのセクションで概説するように、選択したcgroupとサービスを監視対象インスタンスとして手動で追加することをお勧めします。

次の手順は、Linuxカーネル2.6.24の最小バージョンのインストールを前提としています。 LogicMonitorの コントロールグループ & サービスステータス データソースは、次のLinuxディストリビューションと互換性があることが確認されています。

  • CentOSの
  • Debianの
  • Oracle Linux
  • RHEL
  • Ubuntu

コントロールグループを見つけて手動でインスタンスとして追加する

次の一連の手順では、監視するcgroupの例としてDockerコンテナを使用しています。

  1. コマンドラインから、次のコマンドを実行します。 systemd-cgtop -n1 -b

    このコマンドは、最も多くのリソースを使用しているcgroupを表示します。 ザ・ -n1 フラグ(の省略形 --iterations=1)は、コマンドをXNUMX回だけ実行することを示します。 ザ・ -b フラグ(略して --batch)コマンドを強制的に「バッチ」モードで実行します。つまり、入力を受け入れず、反復制限セットが使い果たされるか、強制終了されるまで実行します)。

  2. 結果の出力から、親コンテナーを除いて、モニターするコントロール・グループの名前をコピーします。 以下の例では、追加します atd.service 除外 system.slice/.

注: 問題のサービスに対して「CPUAccounting = 1」と「MemoryAccounting = 1」が有効になっていないと、リソースアカウンティングは使用できず、systemd-cgtopによって表示されるデータは不完全になります。

  1. [リソース]ページでLinuxホストに移動し、横にあるドロップダウンメニューから[監視対象インスタンスの追加]を選択します。 管理 メニュー。 インスタンスを手動で追加する方法の詳細については、次を参照してください。 インスタンスの追加.
  2. [監視対象インスタンスの追加]ダイアログで、[コントロールグループ]と入力します。 データソース フィールドに入力し、「atd.service」と入力します。 ワイルドカード値 フィールド。 このインスタンスを呼び出すものを入力します お名前 フィールド(必要に応じてワイルドカード値を使用できます)。 オプションで、説明を追加することもできます。
  3. ダイアログが完了したら、をクリックします Save。 アクションが成功した場合は、[リソース]ページの[データソース]の下にインスタンスが表示されます。


  4. データ収集が成功したことを確認するには、このインスタンスの[生データ]タブに移動して、[ 今すぐ投票.

インスタンスとしてのサービスの検索と手動追加

  1. コマンドラインから、次のコマンドを実行します。 systemctl list-units -a --type=service

    このコマンドは、システムの現在の状態に関係なく、systemdがロードした、またはロードを試みたすべてのユニットを表示します。 ザ・ -a フラグ(の省略形 --all)非アクティブなユニットを含むすべてのユニットがリストされていることを確認します。 ザ・ --type=service フラグはサービスユニットのみを返します。

  2. 結果の出力から、監視するサービスの名前をUNIT列からコピーします。

  3. 上記のコントロールグループにリストされている手順に従って、の「サービスステータス」を使用してサービスのインスタンスを手動で作成します。 データソース フィールドとコピーされたサービス名 ワイルドバリュー フィールド。

注: を指定することにより、サービスを手動で追加できます。 linux.ssh.services リソースのプロパティ。

自動インスタンス追加のアクティブ検出の有効化

システムが管理できない数のインスタンスに圧倒されないことが確実な場合は、データソース定義からアクティブディスカバリーを有効にし、対応するGroovyスクリプトを「SCRIPT」ディスカバリーメソッドのパラメーターとして埋め込むことができます。 (見る アクティブディスカバリーとは何ですか? データソースのActiveDiscoveryの構成の詳細については。)

Linux_SSH_Cgroupsデータソース定義のアクティブディスカバリスクリプト

/*******************************************************************************
 *  © 2007-2020 - LogicMonitor, Inc. All rights reserved.
 ******************************************************************************/

import com.jcraft.jsch.JSch
import com.santaba.agent.util.Settings

host = hostProps.get("system.hostname")
user = hostProps.get("ssh.user")
pass = hostProps.get("ssh.pass")
port = hostProps.get("ssh.port")?.toInteger() ?: 22
cert = hostProps.get("ssh.cert") ?: '~/.ssh/id_rsa'
timeout = 15000 // timeout in milliseconds


// Expected output pattern capturing cgroup name, tasks, CPU, memory, input, output.
// Unless "CPUAccounting=1" and "MemoryAccounting=1" are enabled for the services in question, 
// no resource accounting will be available and the data shown by systemd-cgtop will be incomplete.
def line_pattern = ~/^\/?([^\/]+)\/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/

def command = 'systemd-cgtop -n1 -b --cpu=percentage'
def command_output = getCommandOutput(command)

command_output.eachLine { line ->
    def matcher = line_pattern.matcher(line) ?: [:]
    // Process lines that contain a match except cgroups in user.slice
    if (matcher.size() > 0 && matcher[0][1] != "user.slice" && matcher[0][1] != "docker") {
        // Replace invalid wildvalue characters with underscores
        def wildvalue   = matcher[0][2].replaceAll(/[:|\\|\s|=]+/,"_")
        def cgroupPath  = matcher[0][1].replaceAll(/[:|\\|\s|=]+/,"_")
        println "${wildvalue}##${wildvalue}######" +
                "auto.cgroup.path=${cgroupPath}"
    }
}
return 0


// Helper function for SSH connection and command passing
def getCommandOutput(String input_command) {
    try {
        // instantiate JSCH object.
        jsch = new JSch()

        // do we have an user and no pass ?
        if (user && !pass) {
            // Yes, so lets try connecting via cert.
            jsch.addIdentity(cert)
        }

        // create session.
        session = jsch.getSession(user, host, port)

        // given we are running non-interactively, we will automatically accept new host keys.
        session.setConfig("StrictHostKeyChecking", "no");
        String authMethod = Settings.getSetting(Settings.SSH_PREFEREDAUTHENTICATION, Settings.DEFAULT_SSH_PREFEREDAUTHENTICATION);
        session.setConfig("PreferredAuthentications", authMethod);

        // set session timeout, in milliseconds.
        session.setTimeout(timeout)

        // is host configured with a user & password?
        if (pass) {
            // set password.
            session.setPassword(pass);
        }

        // connect
        session.connect()

        // execute command.
        channel = session.openChannel("exec")
        channel.setCommand(input_command)

        // collect command output.
        def commandOutput = channel.getInputStream()
        channel.connect()

        def output = commandOutput.text;

        // disconnect
        channel.disconnect()

        return output
    }
    // ensure we disconnect the session.
    finally {
        session.disconnect()
    }
}
Groovy

Linux_SSH_ServiceStatusデータソース定義のアクティブディスカバリスクリプト

  サービスステータス データソースには、すべてのサービスを監視するときに調整したいデフォルトのアラートがあります。

/*******************************************************************************
 *  © 2007-2022 - LogicMonitor, Inc. All rights reserved.
 ******************************************************************************/

import com.jcraft.jsch.JSch
import com.santaba.agent.util.Settings

host = hostProps.get("system.hostname")
user = hostProps.get("ssh.user")
pass = hostProps.get("ssh.pass")
port = hostProps.get("ssh.port")?.toInteger() ?: 22
cert = hostProps.get("ssh.cert") ?: '~/.ssh/id_rsa'
timeout = 15000 // timeout in milliseconds

def azureHost = hostProps.get("system.azure.privateIpAddress")
if (azureHost && hostProps.get("auto.network.resolves") == "false") host = azureHost

// To run in debug mode, set to true
def debug = false

//Pull in the list of services to monitor from the device properties
ArrayList<String> services = hostProps.get("linux.ssh.services")?.split(",") ?: []

// Expected pattern of output lines with data
def line_pattern = ~/^\/?\s*(\S+)\s+(\w*loaded|not-found|masked\w*)\s+(\w*active|inactive|failed\w*)\s+(\S+)\s+(.*)$/

// Run command to show any unit that systemd loaded or attempted to load, regardless of its current state on the system.
def command = 'systemctl list-units --all --type=service --plain'
def command_output = getCommandOutput(command)

// Turn on debug mode to get the following info about services running on this device
if (debug) {
    println "DEBUG MODE -- LIST OF AVAILABLE SERVICES"
    command_output.eachLine { line ->
        def matcher = line_pattern.matcher(line) ?: [:]
        // Process lines that contain a match
        if (matcher.size() > 0) {
            def service = matcher[0][1]
            def description = matcher[0][5]
            println String.format("%-30s %-30s", service, description)
            println "----------------------------------------"
        }
    }
}

if (services.size() > 0) {
    command_output.eachLine { line ->
        def match= line_pattern.matcher(line) ?: [:]
        if (match.size() > 0 && services.contains(match[0][1])) {
            def service = match[0][1]
            def description = match[0][5].trim() ?: ""
            println "${service}##${service}##${description}####"
        }
    }
}

return 0

// Helper function for SSH connection and command passing
def getCommandOutput(String input_command) {
    try {
        // instantiate JSCH object.
        jsch = new JSch()

        // do we have an user and no pass ?
        if (user && !pass) {
            // Yes, so lets try connecting via cert.
            jsch.addIdentity(cert)
        }

        // create session.
        session = jsch.getSession(user, host, port)

        // given we are running non-interactively, we will automatically accept new host keys.
        session.setConfig("StrictHostKeyChecking", "no");
        String authMethod = Settings.getSetting(Settings.SSH_PREFEREDAUTHENTICATION, Settings.DEFAULT_SSH_PREFEREDAUTHENTICATION);
        session.setConfig("PreferredAuthentications", authMethod);

        // set session timeout, in milliseconds.
        session.setTimeout(timeout)

        // is host configured with a user & password?
        if (pass) {
            // set password.
            session.setPassword(pass);
        }

        // connect
        session.connect()

        // execute command.
        channel = session.openChannel("exec")
        channel.setCommand(input_command)

        // collect command output.
        def commandOutput = channel.getInputStream()
        channel.connect()

        def output = commandOutput.text;

        // disconnect
        channel.disconnect()

        return output
    }
    // ensure we disconnect the session.
    finally {
        session.disconnect()
    }
}
Groovy

パッケージ内のLogicModules

SSH 経由で Linux を監視する LogicMonitor のパッケージは、次の LogicModule で構成されます。 完全にカバーするには、これらの LogicModules がすべて LogicMonitor プラットフォームにインポートされていることを確認してください。

表示名 説明
addCategory_Linux_SSHプロパティソース「Linux_SSH」の値を system.categories SNMPが構成されていないために正しく識別されなかったホスト(AWSとAzureを除く)のプロパティであり、リソース/コレクターに設定されたプロパティを使用してSSH経由で接続を試みます。
Linux_SSH_情報プロパティソースカーネル名、カーネルリリース、カーネルバージョン、ハードウェア名、ハードウェアプラットフォーム、ノード名、プロセッサタイプ、オペレーティングシステムなどのLinuxシステム情報を収集します。
デバイスパフォーマンスのブロックデータソースSSH経由でLinuxシステム上のディスクとパーティションのI / Oを監視します。
コントロールグループデータソースLinuxコントロールグループのリソースとタスクの使用法 systemd-cgtop
コントロールグループのステータスデータソース(2020年XNUMX月に非推奨)Linuxコントロールグループのステータス監視 systemd-cgtop
CPUコアデータソースSSHを介してコアごとのCPU使用率を監視します。
CPU /メモリデータソースSSH経由でLinuxのCPUとメモリの統計を監視します。
ファイルシステムデータソースLinuxファイルシステムの使用率メト​​リックを監視します。
ネットワークインターフェイスデータソーススループット、パケット送信、エラー、パケットドロップ、衝突、動作ステータスなどのLinuxネットワークインターフェイスメトリックを監視します。
サービスステータスデータソースLinuxsystemdサービス systemctl
TCP / UDP統計データソースnetstatからTCPおよびUDP統計を取得します。
稼働時間データソースSSH経由でLinuxホストの稼働時間を監視します。
記事上で