web-dev-qa-db-ja.com

Linuxでのリモートネットワーク介入のためのデッドマンスイッチ

リモートサーバーのネットワーク構成を変更するときに、サーバーの制御を誤って失うことから保護するためのセキュリティメカニズムをいくつか考えていました。

私が使用しているレベル0の保護は、スケジュールされたシステムの再起動です。

# at now+x minutes
> reboot
> ctrl+D

ここで、xは再起動前の遅延です。

これはiptablesで遊ぶような非常に単純なタスクに関連してうまく機能しますが、この方法には少なくとも2つの欠点があります。

  • これはあまり反応的ではありません。つまり、たとえば自動リモートsshコマンドが失敗した場合に接続の問題を自動的に検出する必要があります。x秒間機能しなくなります。
  • 一部の構成ファイルを変更してから再起動して変更をテストする必要がある場合は、明らかに機能しません。

2番目のポイントにツールを使用していますか?再起動後X分でサーバーに参加できない場合は、以前から知られている安定した状態でシステム構成を元に戻すことができるものが欲しいです。

ありがとう!

編集:

  • サーバーは、DebianのようなディストリビューションまたはRHELのようなディストリビューションを備えたリモートLinuxサーバーです。

  • ファイアウォールの背後にあるこの特定のサーバーにのみアクセスできます。ポート22(ssh)を除くすべてのポートがフィルタリングされます。したがって、KVMスイッチ、iDRACなどはありません。

  • 重大な障害が発生した場合は、このマシンでローカルサポートを受けることができますが、これには非常に長い時間がかかります。車でそこに着くまでに3時間かかります。そして、私はこの時間をserverfaultに費やしたり、そこに行かないように独自のツールを開発したりすることをお勧めします。

  • 私の実際の計画:Mercurialまたはgitに基づいて醜いツールを開発し、cronで「hgrevert; reboot」を呼び出します。十分にテストされたツールがすでに存在するのではないかと思いました。

5
ascobol

Ewwhiteが提案するような代替の接続方法がなければ、あなたの方法は問題ないと思います。シンプルで、必要な時間を自分に与えることができます。

注-変更を確認するためにサーバーを再起動する必要はないと思います-どうしても必要な場合は、代わりに適切なサービスを再起動してください。変更を「ロックイン」するために再起動は必要ありません。これを実現できるのは1つのオプションにすぎません。

おそらく、本番システムで直接変更を実験するべきではないことを付け加えておきます。予防措置としてスケジュールされた再起動を使用しますが、変更を適用する場合にのみ機能することが確実です。変更が機能したら、スケジュールされた再起動をキャンセルします。

5
dunxd

これは、 ILOまたはDRACカードまたはリモートIP KVM ?の形式での帯域外管理の場合です。それはあなたのシナリオのオプションですか?

6
ewwhite

自家製の帯域外管理が常にあります。 2つ目のシステムを入手し、シリアルケーブルを介してサーバーに接続します。 ttyS0またはいずれかのシリアルポートでgettyを実行します。これにより、シリアルポート経由でログインできます。インターネット経由で2番目のシステムにアクセスできるようにすると、サーバーからシステムを遮断すると、サーバーへの別のパスができます。

3
LawrenceC

帯域外管理が利用できない場合は、サーバーと調整内容に大きく依存する独自のスクリプトを作成します。

最も一般的なケースは、リモートルーターのファイアウォールを変更することです。 screen セッションを起動して、次を実行します。

./iptables.sh ;echo Rules applied;echo sleeping until flush...;sleep 5 && echo Sleeping 20 more seconds - rules worked if you\'re reading this press ctrl-c to cancel the flush && sleep 20 && ./iptables-flush.sh || echo Flush cancelled

そのため、iptables.shには新しいルールが含まれていますが、iptables-flush.shには基本的なルールのセットが含まれているため、失敗した場合にリモートで再接続できます。 ctrl-cを押してフラッシュをキャンセルしました。これは、ルールによって切断されなかった場合にのみ実行できます。

したがって、より詳細なスクリプトが必要になります。たとえば、ネットワークインターフェイスへの変更をテストする場合は、スクリプトを作成してrc.localに配置します。いくつかの異なるホストにpingを実行しようとしますが、いずれかが失敗した場合は、古いネットワークインターフェイスファイルをコピーして再起動する必要があります。

または、スクリプトがsshログをチェックする可能性があります。90秒以内にログインが表示されない場合は、構成ファイルを復元して再起動します。

つまり、簡単な答えは、bash-fuを増やすことです:-)

そして、バンド外の管理を機能させる方法を見つけます。それは本当に正しい答えであり、私は常にフォールバックとして望んでいます。たとえば、sshアクセス(できれば作業中のマシン以上のもの)があるので、sshポートフォワーディングを使用してファイアウォールを回避できますか?

2
Steven