サポートセンターホーム


Linux(SSH経由)モニタリング

概要

Secure Shell(SSH)は、セキュリティで保護されていないネットワーク上でネットワークサービスを安全に運用するための暗号化ネットワークプロトコルです。 SSHクライアントは、ほとんどのLinuxベースのマシンに配布されています。 一般的なSSHアプリケーションには、リモートコマンドライン、ログイン、およびリモートコマンドの実行が含まれますが、SSHを介して任意のネットワークサービスを保護できます。

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

セットアップ要件

モニタリングへのリソースの追加

Linuxホストを監視に追加します。 監視にリソースを追加する方法の詳細については、を参照してください。 デバイスの追加.

SSHを有効にする

データソースを適用するには、LinuxホストでSSHを構成する必要があります。

SSHキーを生成する

(パスワードではなく)SSHキーを使用してデバイスへのコレクターのアクセスを認証する場合は、SSH公開鍵と秘密鍵のペアを生成し、デバイスに割り当てられているコレクターホスト間で公開鍵をコピーする必要があります。 LogicMonitorとデバイス自体で。 キーベースの認証を使用する場合、SSHサーバーが着信接続を認証するときに〜/ .ssh / authorized_keysを参照するため、ユーザーは有効なホームディレクトリを持っている必要があります。

SSHキーペアの生成と公開キーのコピーの手順については、を参照してください。 新しいSSHキーを生成する.

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

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

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

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

LogicModulesをインポートする

LogicMonitorパブリックリポジトリから、にリストされているすべてのLinux SSHLogicModuleをインポートします。 パッケージ内のLogicModules このサポート記事のセクション。 これらのLogicModuleがすでに存在する場合は、最新バージョンであることを確認してください。

LogicModulesがインポートされると(以前のすべてのセットアップ要件が満たされていると想定)、データソースのスイートは自動的にデータの収集を開始します。

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によって表示されるデータは不完全になります。

  3. [リソース]ページでLinuxホストに移動し、横にあるドロップダウンメニューから[監視対象インスタンスの追加]を選択します。 管理 メニュー。

    注意: インスタンスを手動で追加する方法の詳細については、を参照してください。 インスタンスの追加.

  4. [監視対象インスタンスの追加]ダイアログで、[コントロールグループ]と入力します。 データソース フィールドに入力し、「atd.service」と入力します。 ワイルドカード値 フィールド。 このインスタンスを呼び出すものを入力します お名前 フィールド(必要に応じてワイルドカード値を使用できます)。 オプションで、説明を追加することもできます。
  5. ダイアログが完了したら、をクリックします セールで節約。 アクションが成功した場合は、[リソース]ページの[データソース]の下にインスタンスが表示されます。

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

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

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

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

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

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

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

システムが管理できない数のインスタンスに圧倒されないことが確実な場合は、データソース定義からアクティブディスカバリーを有効にし、対応する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-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 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)

command_output.eachLine { line ->
    def matcher = line_pattern.matcher(line) ?: [:]
    // Process lines that contain a match
    if (matcher.size() > 0) {
        def wildvalue   = matcher[0][1]
        def description = matcher[0][5]?.trim() ?: ""
        println "${wildvalue}##${wildvalue}####${description}##"
    }
}


// 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で構成されています。 完全にカバーするには、これらのLogicModuleがすべてLogicMonitorプラットフォームにインポートされていることを確認してください。

表示名 種類 製品説明
addCategory_Linux_SSH プロパティソース 「Linux_SSH」の値をに割り当てます system.categories SNMPが構成されていないために正しく識別されなかったホスト(AWSとAzureを除く)のプロパティであり、リソース/コレクターに設定されたプロパティを使用してSSH経由で接続を試みます。
Linux_SSH_Info プロパティソース カーネル名、カーネルリリース、カーネルバージョン、ハードウェア名、ハードウェアプラットフォーム、ノード名、プロセッサタイプ、オペレーティングシステムなどの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ホストの稼働時間を監視します。

このパッケージのデータソースによって追跡されるさまざまなメトリックに静的データポイントのしきい値を設定する場合、LogicMonitorはテクノロジ所有者のベストプラクティスのKPI推奨事項に従います。 必要に応じて、これらの事前定義されたしきい値を調整して、環境固有のニーズを満たすことをお勧めします。 データポイントのしきい値の調整の詳細については、を参照してください。 データポイントの静的しきい値の調整.

記事上で