SSHのログイン通知メールが頻繁に来る(FileZillaクライアントでSFTP接続中)

スポンサーリンク

FileZillaでのSFTP接続

FileZilla ClientのSFTP接続の自動切断

FileZillaクライアントでのSFTP接続は「何らかの転送完了後」に「1分経過」すると自動で切断されます。

転送後に1分経過なので、接続しただけで放置している場合は1分では自動切断されません。

他のFTPクライアントでは「ダミーコマンドの送信」とか「KeepAliveパケットの送信」などの設定があり、接続を維持できますが、FileZillaには現在のところ無いようで転送終了後1分経過すると切断されてしまいます(SFTPでなくFTPにはキープアライブコマンド送信機能があります)

このため、少し経過してから再びFileZilla上で操作を行うとログインから行うため、SSHのログイン通知が頻繁に来てしまいます。

/var/log/secure を確認すると以下のような接続ログが頻繁に出ていました。

Nov 20 11:30:36 sshd[22935]: Connection from 192.168.2.2 port 4271 on 192.168.2.200 port 60000
Nov 20 11:30:36 sshd[22935]: Accepted password for root from 192.168.2.2 port 4271 ssh2

以下に試した事を記載しますが、いずれもSFTP接続では効果がなく、最終的にSSHログイン通知で無視するIPの判定を加えて解決しました。

sshd_configでのキープアライブ設定(サーバー側)

サーバ側でキープアライブの設定をしてみましたが、FileZillaのSFTP接続は維持してくれませんでした。

PoderosaなどのSSHクライアントでは有効なので接続が切れなくなりますね。

# サーバー側からのキープアライブパケット送信
ClientAliveInterval 15
ClientAliveCountMax 10

# TCPのキープアライブ
TCPKeepAlive yes

FileZillaのFTPキープアライブ設定

FTPの設定項目内にありますが、もしかするとSFTPでも有効かも?と思ったので試しましたが駄目でした。

他のFTPクライアントのダミーコマンドなどに相当するものだと思ったのですが、SFTPでは効きません。

FileZillaのタイムアウト設定

FileZilla設定の「接続」にある「タイムアウト」を大きくしてみましたが、これは「操作中」のタイムアウトなので自動切断とは無関係でした。

SSHのログイン通知スクリプトを修正

FileZillaやサーバー側のsshd設定では対処できなさそうなので、メール通知スクリプト側で対処します。

従来のsshrc

以下のように書いておくとSSH接続があるとメールで通知してくれますが、何度も再接続されるとメールがどんどん来てしまいます。

/etc/ssh/sshrc

#!/bin/bash

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`
hostname=`hostname`
fqdn=`hostname -f`

logger -t ssh-wrapper $USER login from $ip

sendmail -t <<EOF
To: hoge <hoge@example.com>
From: ${hostname} <no-reply@${fqdn}>
Subject: SSH Login $USER from $ip
User $USER just logged in from $ip

アクセス元:$ip
ユーザー:$USER

EOF

修正版sshrc(無視するIPのリストを追加)

自分以外の端末の場合だけメールでログイン通知してくれれば良いので、信頼するIPとして普段自分が使う端末のIPを列挙し、一致しなかった場合にのみ通知するようにします。

/etc/ssh/sshrc

#!/bin/bash

# 信頼するIP(半角スペース区切りで列挙)
TRUST_LIST="192.168.2.1 192.168.2.2"

# メール送信元
MAIL_FROM="piyo <piyo@example.com>"

# メール宛先
MAIL_TO="hoge <hoge@example.com>"

# SSH接続中のIP取り出し
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

# ログ出力
logger -t ssh-wrapper $USER login from $ip

# リストと比較して信頼していないIPからならメール
for HOST in $TRUST_LIST
do
   # 信頼するIPと一致したら終了(メール送信しない)
   if [ $HOST == $ip ]; then
      exit 0
   fi
done

# メール送信
sendmail -t <<EOF
To: $MAIL_TO
From: $MAIL_FROM
Subject: SSH Login $USER from $ip
User $USER just logged in from $ip

アクセス元:$ip
ユーザー:$USER

EOF

コメントフォーム

タイトルとURLをコピーしました