DatadogでサーバのSSH接続を監視する
こんにちは、虎塚です。
この記事では、DatadogでサーバのSSH接続を監視するための設定手順と、動作確認の方法を紹介します。
DatadogでのSSH監視
DatadogにはSSHインテグレーションという機能があり、次の項目を監視できます。
検知できるもの | 検知目的 |
---|---|
SSHデーモンが接続可能な状態か | システム障害の兆候であるSSH接続エラーを検知するため |
SFTPのレスポンスタイム | 接続トラブルや遅延を検知するため |
鍵のフィンガープリントが意図せず変更されていないか | 中間者攻撃などが発生した可能性を検知するため |
Datadogでは、監視対象サーバにインストールしたDatadog agentから同じサーバ内のSSHサーバに接続を試みることで、SSH接続状態を監視します。
設定手順
DatadogでSSH接続監視をするための設定手順を説明します。次のバージョンで動作確認しました。
- 監視対象サーバのAMI: amzn-ami-hvm-2016.09.0.20160923-x86_64-gp2
- 監視対象サーバのPython: 2.7.12
- Datadog agent: (Collector, Dogstatsd, Forwarderともに) 5.9.1
1. SSH監視用の鍵の生成
SSH監視のために既存の鍵を流用すると、運用中にユーザが誤って監視用の鍵を削除してしまい、監視が失敗するかもしれません。そこで、DatadogがSSH監視に使うための鍵を新規に用意します。
1.1. 鍵を置くディレクトリの作成
Datadogはdd-agentというユーザで実行されるので、監視対象のサーバでdd-agentのホームディレクトリを確認します。Amazon Linuxの場合、デフォルトの設定でインストールしていれば/opt/datadog-agentです。
次のコマンドを実行して、dd-agentのホームディレクトリのすぐ下に.sshディレクトリを作成し、dd-agentユーザがアクセスできるように権限を設定します。
sudo mkdir /opt/datadog-agent/.ssh sudo chown dd-agent /opt/datadog-agent/.ssh sudo chmod 700 /opt/datadog-agent/.ssh
このディレクトリに、次のステップで生成する鍵を格納します。
1.2. 鍵の新規作成
次のコマンドを実行して、鍵を新規に作成します。
sudo ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /opt/datadog-agent/.ssh/id_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /opt/datadog-agent/.ssh/id_rsa. Your public key has been saved in /opt/datadog-agent/.ssh/id_rsa.pub. The key fingerprint is: [...]
ステップ1.1で作成したディレクトリに鍵が作成されたことを確認します。
ls -la /opt/datadog-agent/.ssh total 16 drwxr-xr-x 2 root root 4096 Nov 8 17:25 . drwxr-xr-x 9 root root 4096 Nov 8 17:21 .. -rw------- 1 root root 1679 Nov 8 17:25 id_rsa -rw-r--r-- 1 root root 401 Nov 8 17:25 id_rsa.pub
1.3. 鍵の権限設定
dd-agentユーザがアクセスできるように、公開鍵と秘密鍵の所有者と権限を変更します。
sudo chown dd-agent /opt/datadog-agent/.ssh/id_rsa.pub sudo chgrp dd-agent /opt/datadog-agent/.ssh/id_rsa.pub sudo chmod 600 /opt/datadog-agent/.ssh/id_rsa.pub sudo chown dd-agent /opt/datadog-agent/.ssh/id_rsa sudo chgrp dd-agent /opt/datadog-agent/.ssh/id_rsa sudo chmod 600 /opt/datadog-agent/.ssh/id_rsa
公開鍵の名前をauthorized_keysに変更します。
sudo mv /opt/datadog-agent/.ssh/id_rsa.pub /opt/datadog-agent/.ssh/authorized_keys
2. agentの設定
監視対象サーバ内でDatadog agentがSSHホストに接続できるように設定します。conf.d/ssh_ceck.yaml.exampleを元に設定ファイルを作成します。
cd /etc/dd-agent/conf.d/ sudo cp ssh_check.yaml.example ssh_check.yaml
設定ファイルにある設定項目を次に示します。
init_config: instances: - host: localhost # 必須 port: 22 # オプション。空白にするとデフォルトで22 username: test # 必須 password: abcd # オプション。パスワード認証を使うときに設定 sftp_check: True # オプション。空白にするとデフォルトでTrue private_key_file: # オプション。鍵認証を使うときにプライベートキーへのファイルパスを設定 private_key_type: # オプション。プライベートキーの種別をrsaかecdsaで設定 (デフォルトはrsa) add_missing_keys: True # オプション。空白にするとデフォルトでFalse
add_missing_keysをTrueにすると、SSH接続のホスト認証時に接続先サーバーがどのホスト鍵にも見つからなかった場合に、missing host key policyが使われます。デフォルト (False) の動作では、鍵を拒否して例外を投げます。設定ファイルに記載したhostの値がknown_hostsリストにないときにどのような動作をさせるかを設定する値だと考えればよいでしょう。
今回は鍵認証を使うため、次のように設定します。
init_config: instances: - host: localhost port: 22 username: dd-agent sftp_check: True private_key_file: /opt/datadog-agent/.ssh/id_rsa add_missing_keys: True
トラブルシュートの節で後述しますが、add_missing_keysの値をFalseにするとエラーになるため、Trueを設定します。
2. agentの再起動
Datadog agentを再起動します。
sudo /etc/init.d/datadog-agent restart
3. 設定結果の確認
Datadog agentのinfoコマンドを実行します。
sudo /etc/init.d/datadog-agent info
次のような実行結果が表示されれば、成功です。
[...] Checks ====== [...] ssh_check --------- - instance #0 [OK] - Collected 1 metric, 0 events & 3 service checks [...]
4. SSHインテグレーションの有効化
Datadogにログインした状態で、次のページを開きます。
Secure Shell Integration | Setup | Datadog
[Configuration]タブで[Install Integration]ボタンをクリックします。その後、最低5分間待ちます。
Datadog agent設定時のトラブルシュート
設定手順のステップ3でエラーが出た場合の原因と解決策を示します。
次のエラーが出る場合は、Datadog agentの設定ファイル (ssh_check.yaml) でadd_missing_keysの値をTrueにします。(本記事を書くにあたりFalseにして動かす方法を探しましたが、見つかりませんでした。解決されたい方は参考資料を参照してください)
ssh_check --------- - instance #0 [ERROR]: "Server 'localhost' not found in known_hosts" - Collected 0 metrics, 0 events & 3 service checks
次のエラーが出る場合は、設定ファイルに指定した秘密鍵のファイルパスに、Datadogの実行ユーザであるdd-agentがアクセスできていません。鍵を格納したディレクトリのパーミッションを適切に設定します。
ssh_check --------- - instance #0 [ERROR]: 'No authentication methods available' - Collected 0 metrics, 0 events & 3 service checks
次のエラーが出る場合は、SSHのホスト認証に失敗しています。たとえば、公開鍵を見つけられないのかもしれません。SSHサーバの設定ファイル (/etc/ssh/sshd_config) でAuthorizedKeysFileに設定している値に、公開鍵の格納先と名前を変更します。デフォルトでは.ssh/authorized_keysです。
ssh_check --------- - instance #0 [ERROR]: 'Authentication failed.' - Collected 0 metrics, 0 events & 3 service checks
次のようなエラーが出る場合は、yamlのパースエラーです。設定ファイルの内容をYAMLlintなどにコピーアンドペーストして、エラー箇所を確認します。
ssh_check --------- - initialize check class [ERROR]: 'while scanning a simple key\n in "<byte string>", line 8, column 5\ncould not find expected \' :\'\n in "<byte string>", line 9, column 5'
動作確認手順
DatadogでSSH接続を監視して、障害が発生した時に検知と通知ができることを確認します。
1. Monitorの作成
SSH接続の失敗時にアラートを上げる監視設定をDatadog上で作成します。
Datadogのログイン後画面で、左メニューから[Monitors]→[Manage Monitors]を選択し、[New Monitor]ボタンをクリックします。
[Select a monitor type]で[Integration]を選択し。[Search for an integration to monitor or select below.]でSSHインテグレーションのアイコンを選択します。
[Pick a Check]で[ssh.can_connect]を選択します。 [Pick monitor scope]で[All Monitored Hosts]を選択します。 [Set alert conditions]で[Status: Critical]、[Status: OK]ともにデフォルトの[1]を指定します。これは、チェック結果がどれくらい継続した場合にエラーまたは正常とみなすかの設定です。
[Say what's happening]でMonitor Nameとして「The agent cannot connect to SSH」と入力します。また、Monitor Messageとして次のような内容を入力します。
{{#is_alert}}SSH接続に失敗しました。{{/is_alert}} {{#is_recovery}}SSH接続が回復しました。{{/is_recovery}}
[Notify your team]で任意の通知先を指定します。ここではログインユーザにします。[Save]ボタンをクリックします。
Monitorの[Status]タブでデータが表示されることを確認します。データの取得から表示まで、数分かかる場合があります。
データが表示されたら、アラートが上がっていないことを確認します。
2. 障害状態の作成
サーバは起動しているがsshdのプロセスがダウンしている状態を人為的に作り、SSH接続監視のアラートを上げます。
監視対象サーバにログインしてsshdのPIDを確認し、プロセスを落とします。
ps -ef | grep sshd | grep root | grep sbin root 2432 1 0 19:46 ? 00:00:00 /usr/sbin/sshd sudo kill -9 2432
3. アラート状態の確認
少し待つと、ステップ1で作成したMonitorの[Status]タブで、エラーが表示されます。
また、設定した通知先にDatadogkからメールが届いたことを確認します。
4. 擬似障害の復旧
監視対象サーバをRebootして、sshdを元に戻します。
おわりに
サーバやネットワークの障害を見つける上で、SSH接続監視は大事ですね。必要に応じてSSHインテグレーションを有効にして、サーバの運用監視に役立てましょう。
それでは、また。