監視とかで定期的に SSH するなら ControlMaster を設定するとスッキリするけど常用はちょっと

Cacti の Percona のテンプレートを使う場合、Cacti から監視対象のサーバに SSH で接続してメトリクスを取ってくることになるのですが・・・普通にやると都度サーバにSSH接続する事になりますし、対象サーバの /var/log/secure にログが無駄に記録されて辛いです。

そこで ControlMaster を使います。

ControlMaster とは

適当なディレクトリに ssh_config を下記のように作成します。

ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 10m

ssh -F ssh_config ... のようにこのファイルを指定して対象サーバに接続します。すると・・・

  • 最初に接続しようとしたときにバックグラウンドでマスター接続を張るプロセスが起動する
  • このマスター接続は ~/.ssh/mux-%r@%h:%p というファイル名でソケットファイルを作る
  • このソケットファイル上のマスター接続を用いて実際に SSH セッションは執り行われる
  • 次回以降の接続もソケットファイルが存在するなら自動的に使用される
  • 10m 以上マスター接続が使われなかったら切断されてソケットファイルも消える

つまり、1つの TCP のセッション上で複数の SSH のセッションが張られるようになる、みたいな感じです。

# バックグラウンドでマスター接続を張るプロセスが起動してその接続上で SSH セッションが張られる
ssh 192.0.2.123 uname -n

# ↑で作られたマスター接続のソケットファイルの接続上で SSH セッションが張られる
ssh 192.0.2.123 uname -n

# 同上
ssh 192.0.2.123 uname -n

:
:

# しばらく(↑の設定だと 10 分)放置するとマスター接続が切断される

# 新たにマスター接続を張るプロセスが起動する
ssh 192.0.2.123 uname -n

詳しくは・・・ControlMaster とか参照。

ControlMaster が有効な場合は /var/log/secure には最初のマスター接続のときだけログが記録されるので、ログもスッキリします。

常用はしないほうが良い

とても便利な ControlMaster ですが、普段から有効にしておけば同じサーバに何度も接続するときに接続のオーバーヘッドが小さくなるので、ユーザーの ~/.ssh/config で下記のようにしたくなりますが・・・

ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 10m

正直オススメしません。。。次のようなケースで大事故の元になります。

  • 本番系と検証系で同じ IP アドレスになっている
  • 直接接続することはできず中継サーバを挟む必要がある
  • どちらの系に接続するかは経由する中継サーバによって変わる
  • 例えば中継サーバは下記のアドレスだとすると・・・
    • 本番系に接続するときは 192.0.2.100 を経由
    • 検証系に接続するときは 192.0.2.200 を経由

ProxyCommand を使って下記のように本番系に接続したとします。

ssh -o "ProxyCommand ssh hj@192.0.2.100 -W %h:%p 2>/dev/null" ore@10.21.10.4

このとき、下記のようなソケットファイルが作成されます。

  • ~/.ssh/mux-ore@192.0.2.100:22
  • ~/.ssh/mux-ore@10.21.10.4:22

次に、検証系に次のように接続しようとします。サーバのアドレスは同じ(10.21.10.4)ですが、中継サーバのアドレスが異なるので検証系に接続されるはずです。

ssh -o "ProxyCommand ssh hj@192.0.2.200 -W %h:%p 2>/dev/null" ore@10.21.10.4

がしかし、実際には ControlMaster の機能により ~/.ssh/mux-ore@10.21.10.4:22 というソケットファイルが発見され、このソケットファイルを使用して SSH セッションが張られます。その接続先は本番系です。

つまり、検証系に接続するつもりが、本番系に接続されます。

さいごに

Nagios の check_ssh プラグインは ssh コマンドではなくプラグインが直接 TCP で接続しにいくので ControlMaster とか全然関係ないですしそもそも ControlMaster が有効では監視の意味がないです。

ので、Cacti からのアクセスで ControlMaster を有効にして /var/log/secure への出力を抑止したとしても、Nagios のせいでわりと /var/log/secure が汚れました。

ssh なんてサービスに必要なものではないし、Nagios の SSH 監視は頻度を下げるとかで良いかと。


社内用に書いていたメモからのコピペ、1年ぐらい前に書いたメモでした。そもそも Cacti はもうほとんど使ってないです(概ね Prometheus にした)。

「本番と検証でIPアドレスが同じで中継サーバが違う」という状況はよくあるように思うので(あんまり無い?)、常用はしないようにしてます。検証系のつもりで本番系に接続したことはないですけど、本番系のつもりで検証系に接続しててヒヤリしたことがあるので。