サーバーに SSH でログインしたまま離席し、セッションが放置されることはセキュリティリスクになります。無操作のまま端末が開き続けると、第三者に操作される可能性があるためです。Linux では、一定時間無操作の状態が続いたときに自動でログアウトさせる仕組みを設定できます。
自動ログアウトの仕組みを理解する
Linux の自動ログアウトには、主に二つのアプローチがあります。
- シェル側の設定(TMOUT):bash や zsh に組み込まれた変数で、無操作が続いた場合にシェル自体が終了します。
- SSH サーバー側の設定(sshd_config):SSH 接続のアイドルタイムアウトをサーバー側で強制します。
どちらか一方だけでも効果はありますが、両方を組み合わせるとより確実です。なお、本記事では「無操作時間による自動ログアウト」に絞って説明します。接続中のセッションを手動で特定・切断する方法は対象外です。
TMOUT でシェルのタイムアウトを設定する
TMOUT は bash・zsh が参照する組み込み変数で、秒単位で無操作タイムアウトを指定します。設定した秒数だけキー入力がなければ、シェルが自動的に終了します。
まず動作を確認したい場合は、ログイン中のシェルで直接実行できます。
export TMOUT=300
この例では 300 秒(5 分)無操作で自動ログアウトします。設定後、何も操作せずに待つと 5 分後にセッションが終了します。
ただし export で設定した変数はそのセッション限りです。永続化するには /etc/profile.d/ 配下にファイルを作成するのが一般的です。
sudo vi /etc/profile.d/autologout.sh
ファイルの内容は次のとおりです。
TMOUT=600
readonly TMOUT
export TMOUT
readonly をつけると、ログインしたユーザーが unset TMOUT などで解除できなくなります。値は秒単位で、運用ポリシーに合わせて変更してください。
ファイルを保存後、次回ログインから有効になります。即時に確認したい場合は一度ログアウトして再接続してください。
sshd_config でサーバー側からタイムアウトを設定する
シェル設定では、ユーザーが bash --norc などで起動した場合や、/etc/profile.d/ を読み込まないシェルでは効かないことがあります。SSH サーバー側でタイムアウトを設定すると、シェルの種類によらず適用できます。
sudo vi /etc/ssh/sshd_config
以下の二つのパラメータを設定します。
ClientAliveInterval 60
ClientAliveCountMax 5
- ClientAliveInterval:クライアントからの応答を確認する間隔(秒)
- ClientAliveCountMax:応答がなかった場合に切断するまでの試行回数
上記の例では、60 秒ごとに応答確認を送り、5 回(300 秒)応答がなければ SSH 接続を切断します。実質 5 分のタイムアウトです。
設定を反映するには sshd を再起動します。
sudo systemctl restart sshd
再起動前に sshd -t で設定ファイルの構文チェックを行うと、接続不能になるミスを防げます。
sudo sshd -t
エラーが表示されなければ設定ファイルに問題はありません。
設定が正しく反映されているか確認する
TMOUT の確認は、ログイン後に次のコマンドで確認できます。
echo $TMOUT
設定した秒数が表示されれば正しく読み込まれています。値が空の場合は /etc/profile.d/autologout.sh が読み込まれていないか、ファイルに構文エラーがある可能性があります。
sshd_config の設定確認は、現在のサービスが読み込んでいる設定を次のコマンドで確認できます。
sudo sshd -T | grep -i clientalive
設定した値が出力されれば、sshd に反映されています。
よくあるつまずき
TMOUT を設定したのに自動ログアウトされない
ログインシェルが bash や zsh 以外(例:sh、dash)の場合、TMOUT 変数に対応していないことがあります。また、/etc/profile.d/ が読み込まれるのはログインシェルのみです。su - ではなく su でユーザーを切り替えた場合、ログインシェルとして起動されないためプロファイルが読み込まれません。
tmux や screen の中では TMOUT が働かない
一般的には、tmux や GNU screen の中で動作しているシェルにも TMOUT は適用されます。ただし、tmux のペインが複数開いていると、他のペインで操作が続いている間はアイドル扱いにならないため、タイムアウトの挙動が期待と異なることがあります。セッションの完全な切断が必要な場合は、SSH サーバー側の設定と組み合わせて検討してください。
sshd 再起動後に既存のセッションが切れた
systemctl restart sshd は既存の SSH 接続には影響しない設計になっています(新規接続のみ新しい設定を適用)。ただし、ディストリビューションやバージョンによって動作が異なる場合があります。本番環境での sshd 再起動は、接続が切れた場合に備えて別のアクセス手段(コンソールアクセスなど)を確保した上で実施するとよいでしょう。
readonly TMOUT を設定したら解除できなくなった
これは意図した動作です。管理者がポリシーとして設定する場合は readonly で固定しますが、特定のユーザーだけ長い値を許可したい場合は /etc/profile.d/ に readonly を付けず、ユーザーの ~/.bashrc 等で上書きできるようにしておく方法もあります。
設定値の目安
タイムアウト値は運用環境のポリシーによって異なりますが、一般的なセキュリティガイドラインでは 10〜15 分(600〜900 秒)が参考値として挙げられることがよくあります。短すぎると長時間の作業中に意図せずログアウトされる不便さが生じます。ログが記録されるジャンプサーバーやパブリックな環境では短め、管理者が専用で使う作業端末では長めに設定するなど、用途に合わせて調整してください。
TMOUT と sshd_config の設定を組み合わせることで、シェルレベルとネットワークレベルの両面から放置セッションを制御できます。どちらか一方だけでも有効ですが、確実に端末を閉じたい場合は両方設定しておくと安心です。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
