同等の保険評価:Centosタイムアウト終了の詳細な説明

1.説明

**同等保護評価ホストの評価では、ホストのタイムアウト終了構成を照会する必要があります。Centosでは、タイムアウト終了機能を実現する方法は主に2つあります。実際、この領域には多くの情報がありますが、まだ明確でない場所(sshd_configのパラメーター)がいくつかあるため、この記事の目的の1つは、これらの問題を明確にすることです。 ****

注:私はCentos6を使用しています

また、この記事では、Linuxシステムでのクエリ構成に関する注意事項についても触れています。

2.TMOUTモードを設定します

これは、より一般的で簡単な方法です。TMOUTを設定することで、少なくともローカルttyログインユーザーとリモートsshログインユーザーに対して作業できますが、グラフィカルインターフェイスでは無効になります。もちろん、グラフィカルインターフェイスに入り、ターミナルを再度開きます。ターミナルも機能しています。

2.1. 実現する方法

/etc/profile、〜/.bashrc、〜/.bash_profileおよびその他のファイルの最後にexport TMOUT = 900ステートメントを追加すると(秒単位)、再度ログインしなくても有効になります。ソースコマンドを使用して解析する必要があります。上記のファイル。

上記のファイルでは、/ etc / profileはすべてのユーザーに影響しますが、〜/ .bashrcと〜/ .bash_profileは現在のユーザーにのみ影響し、実際にはファイルの場所から確認できます。

2.2. 特定のクエリ方法

上記から、理論的にはTMOUTは複数の場所で構成できることがわかりますが、通常は/ etc / profileファイルですべてのユーザーに設定する必要があり、各ユーザーのタイムアウト期間を個別に構成するものはごくわずかです。

したがって、/ etc / profileファイルの内容を直接確認してから、echo $ TMOUTステートメントを使用して、実行環境にあるTMOUT変数を確認します。

2.3. 構成クエリに関する注意事項

ここでもう少し話させてください。構成を確認するときは、構成ファイル実際の状況を一緒に確認することをお勧めします。

なぜ一緒にチェックしたいのですか?

構成ファイルはそれが有効であることを意味しないためです。たとえば、/ etc / profileが変更された後に有効にするには、sourceコマンドを使用する必要があります。また、構成ファイル内の構成が有効であっても、実際のルールの実装と同等ではない場合があります。

たとえば、iptablesルールはコマンドを使用して動的に変更できます。もちろん、コマンドの永続性を使用しない場合(つまり、現在のルールをiptables構成ファイルに保存する場合)、それらの一時ルールに対してiptablesサービスを再起動します。

したがって、同じように、構成ファイルには何も書き込まれません。これは、現在の動作環境にルールがないことを意味するわけではありません。たとえば、iptablesのルールをコマンドで一時的に追加できます。

したがって、評価中に状況をより包括的に理解したい場合は、一緒に確認することをお勧めします。

3つ目は、sshd_configファイルメソッドを変更する

一般的に、Linuxサーバーのリモート管理はsshプロトコルを介して行われるため、sshd_configファイルの構成も方法ですが、sshを介してログインするすべてのユーザーにのみ有効です。

有効にするには、sshd_configファイルを変更した後に再起動する必要があることに注意してください。

sshd_configファイルには、ClientAliveIntervalとClientAliveCountMaxの2つのパラメーターがあります。

ここのインターネットでは、ClientAliveCountMaxの値が0であるかどうかに応じて、2つの影響があることは明らかではないようです。

**3.1. ClientAliveCountMaxの値は0 ** ###です。

この場合、操作の有効期限が切れたとき、つまりクライアントが長時間操作されていないときにサーバーがssh接続を直接切断したときに、自動的に終了するという効果があります。

もちろん、この「長さ」はClientAliveIntervalの値によって決定され、その単位は秒です。

たとえば、ClientAliveIntervalが600でClientAliveCountMaxが0の場合、端末が600秒以内に動作しない場合、ssh接続が切断されます。

**3.2. ClientAliveCountMaxの値が0 ** ###より大きい

この場合、効果は私たちが望むものとは異なります。

ClientAliveInterval:サーバーがクライアントからのメッセージを要求する時間間隔を指定します。デフォルト値は0です。
ClientAliveCountMax:この要求がサーバーによって送信された後にクライアントが応答しない最大回数を指定します(ただし、インターネットは通常、サーバーがこのメッセージをクライアントに送信する回数を示します。これは正しいとは思いません)。デフォルト値は3です。

ClientAliveIntervalが60で、ClientAliveCountMaxが1の場合、表面上、クライアントが60秒以内に応答しない場合、サーバーはクライアントに要求を送信して、存在するかどうかを判断します。1回の場合は、60秒以内に応答がないことを意味します。返信はすべて切断されます。

したがって、一見したところ、値が0の場合はClientAliveCountMaxとの違いはありません。または、操作を行わないと60秒後に自動的に切断されません。

ただし、実際にはまったく同じではありません。サーバーがクライアントにリクエストを送信して、それがまだ存在するかどうかを判断する場合、クライアントは自動的に返信する必要があります。同時に、ClientAliveCountMaxは、そのようなメッセージがいくつ送信されるかを意味しません。時間、またはこれとはまったく関係がないようです。サーバーがこの要求を送信した後のクライアントによる無応答時間の最大数を参照する必要があり、ソースコードからのものであるため、連続している必要があります(以下を参照) )、通常の応答がある限り、このカウントはクリアされます。

言い換えれば、ここでの判断は、切断など、クライアント側のネットワークに問題があるかどうかである必要があります。

ネットワークが正常である限り、クライアント側は常にサーバー側から送信された要求に自動的に応答するため、このカウントが制限されたしきい値1に達することはなく、自動的に終了することもありません(理想的には)。操作は何の関係もありません...

ClientAliveIntervalを60に設定し、ClientAliveCountMaxを1に設定して、自分でテストしましたが、操作しませんでした。同時に、xshellでキープアライブオプションをオフにしました。

その結果、60秒後に自動的に終了しません...

次に、ClientAliveIntervalとClientAliveCountMaxの両方を1に設定します。その結果、サーバーは1秒ごとにメッセージを送信します(メッセージが送信されると矢印が点灯します)。

オンラインの説明によると、このメッセージを最大で1回送信するだけで会話を終了できる場合、説明はまったく意味がなく、何度も送信されています...

私はその男の説明を見に走りましたが、理由はわかりませんでした。

ClientAliveCountMax
    Sets the number of client alive messages(see below) which may be sent without sshd(8) receiving any messages back from the client. If this threshold is reached while client alive messages are being sent, sshd will disconnect the client, terminating the session. It is important to note that the use of client alive messages is very different fromTCPKeepAlive(below). The client alive messages are sent through the encrypted channel and therefore will not be spoofable. The TCP keepalive option enabled by TCPKeepAlive is spoofable.  The client alive mechanism is valuable when the client or server depend on knowing when a connection has become inactive. The default value is 3\. If ClientAliveInterval(see below) is set to 15, and ClientAliveCountMax is left at the default, unresponsive SSH clients will be disconnected after approximately 45 seconds. This option applies to protocol version 2 only.

ClientAliveInterval
   Sets a timeout interval in seconds after which if no data has been received from the client,sshd(8) will send a message through the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent to the client. This option applies to protocol version 2 only.

3.3. ソースコードの説明

そこで、ソースコードを調べましたが、C言語に慣れていないため、推測しかできません(エラーについてはご容赦ください)。

wait_until_can_do_something関数には次のような段落があります。

/* Wait for something to happen, or the timeout to expire. */
 ret =select((*maxfdp)+1,*readsetp,*writesetp, NULL, tvp);if(ret ==-1){memset(*readsetp,0,*nallocp);memset(*writesetp,0,*nallocp);if(errno != EINTR)error("select: %.100s",strerror(errno));}else{if(ret ==0&& client_alive_scheduled)client_alive_check();if(!compat20 && program_alive_scheduled && fdin_is_tty){if(!fdout_eof)FD_SET(fdout,*readsetp);if(!fderr_eof)FD_SET(fderr,*readsetp);}}

内部のselect関数の定義は次のようになります。

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);

監視する必要のあるファイル記述子の変更を監視できます-読み取りと書き込みまたは異常。最後のパラメータtimeval * timeoutはタイムアウト期間です。timeoutの値が0より大きい場合、これは待機タイムアウト期間です。つまり、selectタイムアウト期間内にブロックされ、タイムアウト期間内にイベントが到着すると戻ります。それ以外の場合は、タイムアウト期間後に戻る必要があります。

timeoutの値がnullの場合、選択がブロッキング状態になり、監視ファイル記述子セットのファイル記述子が変更されるまで待機する必要があることを意味します。

戻り値-1は異常を意味し、値0は、監視対象ファイルがタイムアウト期間内に書き込みも読み取りもできないことを意味します。つまり、0はクライアントで操作がないことを意味します。

コードでは、特定の条件下では、このタイムアウトの値は設定したClientAliveIntervalの値です(設定値が0より大きい場合)。ClientAliveIntervalが0の場合、タイムアウトの値は条件によってはnullになります。

次に、client_alive_scheduledの値に応じて、client_alive_check()を呼び出すことができますが、ssh2プロトコルを使用してClientAliveIntervalを設定すると、client_alive_scheduledの値は1になり、コードは次のようになります。

if(compat20 &&
  max_time_milliseconds ==0&& options.client_alive_interval){
  client_alive_scheduled =1;
  max_time_milliseconds = options.client_alive_interval *1000;}

client_alive_checkの定義は次のとおりです。

staticvoidclient_alive_check(void){
 int channel_id;/* timeout, check to see how many we have had */if(packet_inc_alive_timeouts()> options.client_alive_count_max){logit("Timeout, client not responding.");cleanup_exit(255);}/*
  * send a bogus global/channel request with "wantreply",
  * we should get back a failure
  * /if((channel_id =channel_find_open())==-1){packet_start(SSH2_MSG_GLOBAL_REQUEST);packet_put_cstring("[email protected]");packet_put_char(1);/* boolean: want reply */}else{channel_request_start(channel_id,"[email protected]",1);}packet_send();}

packet_inc_alive_timeouts()がoptions.client_alive_count_maxより大きい場合は、終了していることがわかります。

packet_inc_alive_timeoutsの定義は非常に単純です。つまり、累積タイムアウトです。
1を追加して戻ります。

intpacket_inc_alive_timeouts(void){return++active_state->keep_alive_timeouts;}

したがって、設定されたClientAliveCountMaxが0の場合、ここで直接終了し(0 + 1> 0)、要求を送信するための次のコードは実行されません。

(channel_id = channel_find_open())が-1でない場合、チャネルに問題がないことを意味するはずです。次のように実行されます。

channel_request_start(channel_id,"[email protected]",1);

channel_request_startにそのような文があります:

packet_start(SSH2_MSG_CHANNEL_REQUEST);

また、SSH2_MSG_CHANNEL_REQUESTは関数にバインドする必要があります

dispatch_set(SSH2_MSG_CHANNEL_REQUEST,&server_input_channel_req);

したがって、server_input_channel_req関数が呼び出されます。server_input_channel_req関数には次のセクションがあります。

reply =packet_get_char();

…………

if(reply){packet_start(success ?
   SSH2_MSG_CHANNEL_SUCCESS : SSH2_MSG_CHANNEL_FAILURE);packet_put_int(c->remote_id);packet_send();}

ここでは、成功の値に応じて別の関数が呼び出されます。実際、呼び出される関数は同じように見えます。

dispatch_set(SSH2_MSG_CHANNEL_SUCCESS,&server_input_keep_alive);dispatch_set(SSH2_MSG_CHANNEL_FAILURE,&server_input_keep_alive);dispatch_set(SSH2_MSG_REQUEST_SUCCESS,&server_input_keep_alive);dispatch_set(SSH2_MSG_REQUEST_FAILURE,&server_input_keep_alive);

どちらもserver_input_keep_alive関数であり、この関数の意味は非常に単純です。

staticvoidserver_input_keep_alive(int type, u_int32_t seq,void*ctxt){debug("Got %d/%u for keepalive", type, seq);/*
  * reset timeout, since we got a sane answer from the client.
  * even if this was generated by something other than
  * the bogus CHANNEL_REQUEST we send for keepalives.
  * /packet_set_alive_timeouts(0);}

packet_set_alive_timeouts(0)は、active_state-> keep_alive_timeoutsの値を0に設定します。これにより、カウントがリセットされます。

したがって、しばらくの間、これらのコードの意味はおそらく次のようになります。クライアントが指定された時間内に応答しない場合、最初に無応答の数が設定値を超えているかどうかを判断し、超えている場合は終了します。

超えていない場合は、回数に1を足して、クライアントがまだ存在するかどうかを確認するリクエストを送信します。クライアントのネットワークが正常な場合(自動的に応答する必要があります)、クライアントは応答するため、無応答をリセットします。カウント。

第四に、2つの方法の違い

TMOUTモードは、ローカルttyまたはリモートsshを介してログインするすべてのユーザーに対して機能しますが、sshd_configの変更は、sshを使用してログインするユーザーのみを対象としています。

もう1つのポイントは、TMOUTが操作しているかどうかを判断することです。文字を入力したかどうかを確認し、Enterキーを押して実行します。正しいコマンドを入力し、Enterキーを押してコマンドを実行します。意味のない文字を入力してEnterキーを押すと、実行可能なコマンドが見つからないため、カウントされます。 Enterキーを押さずに文字を入力している限りカウントされません。アイドル状態の場合は、タイムアウト後にログアウトされます。

また、sshはネットワークに基づいて判断し、クライアントがサーバーに情報を送信している限り、動作していると見なされます。

これらはまた、2つの間のいくつかの微妙な違いです。

*この記事の原作者:紙ではなく、どこからどこへ、FreeBufのオリジナルのインセンティブプログラムが許可なく複製された

Recommended Posts

同等の保険評価:Centosタイムアウト終了の詳細な説明
CentOS6.5でのHadoop環境の構築に関する詳細な説明
Centos7システム仮想マシンブリッジングモードの詳細な説明
vmwareでのCentOS7ネットワーク設定チュートリアルの詳細な説明
centOS7でのSparkのインストールと構成のチュートリアルの詳細な説明
pythonバックトラッキングテンプレートの詳細な説明
pythonシーケンスタイプの詳細な説明
gpg2を使用したubuntuの詳細な説明
CentOS8インストールMariaDB詳細チュートリアル
CentOS8でのnmcliの詳細な使用
Centos6ネットワーク構成の詳細な例
Centos 7 RAID5の詳細な説明と構成
PythonIOポート多重化の詳細な説明
Python推測アルゴリズムの問題の詳細な説明
Centos7のインストールとAirflowの展開の詳細
CentOS7自動インストールCD制作の詳細な説明
Python super()メソッドの原理の詳細な説明
python標準ライブラリOSモジュールの詳細な説明
Centos7によるPHPのインストールとNginxのチュートリアルの詳細
Pythondecimalモジュールの使用法の詳細な説明
pythonがコンカレントメソッドをサポートする方法の詳細な説明
Pythonに基づくデータタイプの詳細な説明
centos8にnginxをインストールするための詳細なチュートリアル(グラフィック)