主頁(yè) > 知識(shí)庫(kù) > 等保測(cè)評(píng):Centos超時(shí)退出問(wèn)題

等保測(cè)評(píng):Centos超時(shí)退出問(wèn)題

熱門標(biāo)簽:征服者快捷酒店地圖標(biāo)注 蕪湖呼叫中心外呼系統(tǒng)哪家強(qiáng) 貴港市機(jī)器人外呼系統(tǒng)團(tuán)隊(duì) 貴陽(yáng)語(yǔ)音電銷機(jī)器人 電銷機(jī)器人怎么錄音 咸陽(yáng)穩(wěn)定外呼系統(tǒng)公司 漯河電銷外呼系統(tǒng)價(jià)格 天津外呼系統(tǒng)運(yùn)營(yíng)商 ec外呼系統(tǒng)怎么樣

一、說(shuō)明

等保測(cè)評(píng)主機(jī)測(cè)評(píng)中需要查詢主機(jī)的超時(shí)退出配置,具體在Centos中的話,主要有兩種方式可以實(shí)現(xiàn)超時(shí)退出的功能。其實(shí)這方面的資料很多,但是仍然存在一些地方?jīng)]有說(shuō)清楚(sshd_config的一個(gè)參數(shù)),所以本文的目的之一就是把那些問(wèn)題說(shuō)清楚。

注:我使用的是Centos6

另外本文也順便說(shuō)一說(shuō)在linux系統(tǒng)中,查詢配置的一個(gè)注意點(diǎn)。

二、設(shè)置TMOUT方式

這個(gè)是比較通用、簡(jiǎn)單的方式,通過(guò)設(shè)置TMOUT,就可以至少對(duì)本地tty登錄和遠(yuǎn)程使用ssh登錄的用戶起作用,但應(yīng)該對(duì)圖形化界面無(wú)效,當(dāng)然進(jìn)入圖形化界面你再打開(kāi)終端,對(duì)于打開(kāi)的終端也是起作用的。

2.1. 實(shí)現(xiàn)方式

在/etc/profile、~/.bashrc、~/.bash_profile等文件的最后加入export TMOUT=900語(yǔ)句即可(單位是秒),然后想要不重新登錄就起效就,還需要用source命令解析上述文件。

上述文件中,/etc/profile針對(duì)所有用戶其效果,而~/.bashrc、~/.bash_profile則只對(duì)當(dāng)前用戶其效果,實(shí)際上從文件位置就能看出來(lái)。

2.2. 具體查詢方式

從上面可以知道,理論上可以在好幾個(gè)地方對(duì)TMOUT進(jìn)行配置,不過(guò)一般應(yīng)該是在/etc/profile這個(gè)文件中對(duì)所有用戶進(jìn)行設(shè)置,可能有極個(gè)別的會(huì)單獨(dú)為每個(gè)用戶配置超時(shí)時(shí)間。

所以直接查看/etc/profile文件內(nèi)容,然后再用echo $TMOUT語(yǔ)句看看運(yùn)行環(huán)境中的TMOUT變量到底是多少。

2.3. 配置查詢的注意點(diǎn)

這里多說(shuō)一點(diǎn),在查配置時(shí),對(duì)于linux系統(tǒng)最好是 配置文件 以及 實(shí)際情況 一塊查。 

為什么要一塊查?

因?yàn)榕渲梦募飳懥瞬淮砭推鹦Я?,比?etc/profile修改后需要用source命令才能起效。另外,配置文件中的配置即使起效了,但未必就等同于現(xiàn)在實(shí)際執(zhí)行的規(guī)則。

比如iptables的規(guī)則可以用命令動(dòng)態(tài)修改,當(dāng)然如果沒(méi)有使用命令持久化(也就是將當(dāng)前規(guī)則存入iptables的配置文件中)的話,重啟iptables服務(wù)那些臨時(shí)的規(guī)則就沒(méi)了。

所以同樣的,配置文件里啥都沒(méi)寫,不代表現(xiàn)在運(yùn)行的環(huán)境中沒(méi)有規(guī)則,比如iptables的規(guī)則可以用命令臨時(shí)添加進(jìn)來(lái)。

所以如果想在測(cè)評(píng)的時(shí)候更全面的了解情況,最好就是一塊查。

三、修改sshd_config文件方式

一般來(lái)說(shuō),遠(yuǎn)程對(duì)linux服務(wù)器進(jìn)行管理都是通過(guò)ssh協(xié)議,所以對(duì)sshd_config文件進(jìn)行配置,也是一種方法,雖然只對(duì)通過(guò)ssh登錄的所有用戶有效。

記住修改完sshd_config文件后需要重啟才能生效。

在sshd_config文件中有兩個(gè)參數(shù),分別是ClientAliveInterval和ClientAliveCountMax。

這里網(wǎng)上好像沒(méi)說(shuō)清楚,這里根據(jù)ClientAliveCountMax的取值是不是0,會(huì)有兩種效果。

3.1. ClientAliveCountMax的值是0

這種情況下,就是我們想要的操作超時(shí)自動(dòng)退出的效果,也就是當(dāng)客戶端多久沒(méi)有操作,服務(wù)器端就直接斷開(kāi)ssh連接。

這個(gè)“多久”當(dāng)然就是由ClientAliveInterval的值來(lái)決定,它的單位是秒。

比如ClientAliveInterval是600,ClientAliveCountMax是0,則代表著如果600秒內(nèi)終端沒(méi)有操作,則斷開(kāi)ssh連接。

3.2. ClientAliveCountMax的值大于0

這種情況下,和我們想要的效果有區(qū)別:

ClientAliveInterval:指定了服務(wù)器端向客戶端請(qǐng)求消息的時(shí)間間隔,默認(rèn)值是0;
ClientAliveCountMax:則指定這種請(qǐng)求服務(wù)器端發(fā)送后,客戶端最多的無(wú)響應(yīng)次數(shù)(但網(wǎng)上一般是說(shuō)服務(wù)器端最多向客戶端發(fā)送這種消息多少次,我覺(jué)得不太對(duì)),默認(rèn)值是3。

如果ClientAliveInterval是60,ClientAliveCountMax是1,表面上看它的意思就是如果60s內(nèi)客戶端沒(méi)有響應(yīng),服務(wù)器端就會(huì)給客戶端發(fā)送一個(gè)請(qǐng)求判斷還它存不存在,如果1次也就是60秒都沒(méi)有任何回復(fù),就斷開(kāi)連接。

所以咋一看上去,和ClientAliveCountMax的值是0時(shí)沒(méi)啥區(qū)別,還是60秒后不操作就自動(dòng)斷開(kāi)不了啊。

但實(shí)際上壓根不一樣,因?yàn)楫?dāng)服務(wù)器端給客戶端發(fā)送一個(gè)請(qǐng)求判斷還它存不存在時(shí),客戶端應(yīng)該是會(huì) 自動(dòng)回復(fù) 的,同時(shí),ClientAliveCountMax并不是指會(huì)發(fā)送這種消息多少次,或者好像和這個(gè)壓根就沒(méi)關(guān)系,它應(yīng)該是指 服務(wù)器端發(fā)送這種請(qǐng)求后,客戶端最多的無(wú)響應(yīng)次數(shù) ,而且還得是連續(xù)的,因?yàn)閺脑创a里面看(見(jiàn)下文),只要有一次正常相應(yīng),這個(gè)次數(shù)就會(huì)被清空。

也就是說(shuō), 這里判斷的應(yīng)該是客戶端那邊網(wǎng)絡(luò)有沒(méi)有出現(xiàn)問(wèn)題,比如斷線了之類的 。 

因?yàn)橹灰W(wǎng)絡(luò)正常,客戶端這邊永遠(yuǎn)會(huì)自動(dòng)回復(fù)服務(wù)器端發(fā)送過(guò)來(lái)的請(qǐng)求,則這個(gè)計(jì)數(shù)永遠(yuǎn)達(dá)不到限定的閾值1,也永遠(yuǎn)不會(huì)自動(dòng)退出(理想情況下?。?,和你有沒(méi)有進(jìn)行操作沒(méi)有任何關(guān)系……

我自己測(cè)試過(guò),將ClientAliveInterval設(shè)置為60,ClientAliveCountMax設(shè)置1,然后我一直不操作,同時(shí)我把xshell里保持活動(dòng)狀態(tài)的選項(xiàng)關(guān)掉:

結(jié)果就是到了60秒后根本不會(huì)自動(dòng)退出……

然后我又把ClientAliveInterval和ClientAliveCountMax都設(shè)置成1,結(jié)果就是服務(wù)器那邊每隔1秒就發(fā)個(gè)消息過(guò)來(lái)(有消息傳輸?shù)臅r(shí)候那個(gè)箭頭會(huì)亮):

要是按照網(wǎng)上的解釋,最多只發(fā)送1次這種消息就結(jié)束會(huì)話,那壓根解釋不通,這都給我發(fā)了無(wú)數(shù)次了……

我跑去看man里的解釋,也沒(méi)看出所以然:

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 from TCPKeepAlive (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. 源代碼解釋

于是我就去翻了翻源代碼,不過(guò)我對(duì)c語(yǔ)言不熟,只能大概猜一猜了(有錯(cuò)誤請(qǐng)見(jiàn)諒):

wait_until_can_do_something函數(shù)里有這么一段:

/* 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函數(shù)定義是這樣的:

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

它能夠監(jiān)視我們需要監(jiān)視的文件描述符的變化情況——讀寫或是異常,它的最后一個(gè)參數(shù)timeval*timeout是一個(gè)超時(shí)時(shí)間,如果timeout的值大于0,這就是等待的超時(shí)時(shí)間,即select在timeout時(shí)間內(nèi)阻塞,超時(shí)時(shí)間之內(nèi)有事件到來(lái)就返回了,否則在超時(shí)后不管怎樣一定返回。

如果timeout的值是null,則代表將select置于阻塞狀態(tài),一定等到監(jiān)視文件描述符集合中某個(gè)文件描述符發(fā)生變化為止。

而返回值為-1代表出異常了,為0則代表超時(shí)時(shí)間內(nèi),監(jiān)視的這些文件即沒(méi)有可寫的也沒(méi)有可讀的,換句話說(shuō),為0就是意味著客戶端那沒(méi)有任何操作。

在代碼中,在一定的條件下,這個(gè)timeout的值就是我們?cè)O(shè)置的ClientAliveInterval的值(如果設(shè)置值大于0),如果ClientAliveInterval是0,則timeout的值根據(jù)一些條件則為null。

然后根據(jù)client_alive_scheduled的值,就有可能調(diào)用client_alive_check(),不過(guò)如果是使用ssh2協(xié)議然后設(shè)置了ClientAliveInterval,應(yīng)該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的定義如下:

static void
client_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("keepalive@openssh.com");
		packet_put_char(1);	/* boolean: want reply */
	} else {
		channel_request_start(channel_id, "keepalive@openssh.com", 1);
	}
	packet_send();
}

可以看到如果packet_inc_alive_timeouts()大于options.client_alive_count_max,則就結(jié)束了。

packet_inc_alive_timeouts的定義很簡(jiǎn)單,就是把累積的timeouts加個(gè)1,然后返回。

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

所以,如果設(shè)置的ClientAliveCountMax是0,到這里就直接結(jié)束了(0+1>0),不會(huì)執(zhí)行下面的發(fā)送請(qǐng)求的代碼。

如果(channel_id = channel_find_open())不為-1,應(yīng)該代表channel沒(méi)問(wèn)題的話,就會(huì)執(zhí)行:

channel_request_start(channel_id, "keepalive@openssh.com", 1);

channel_request_start中有這么一句:

packet_start(SSH2_MSG_CHANNEL_REQUEST);

而SSH2_MSG_CHANNEL_REQUEST應(yīng)該是綁定了一個(gè)函數(shù)

dispatch_set(SSH2_MSG_CHANNEL_REQUEST, &server_input_channel_req); 

所以就會(huì)調(diào)用server_input_channel_req函數(shù),server_input_channel_req函數(shù)在有這么一段:

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();
	}

這里根據(jù)success的值又會(huì)調(diào)用一個(gè)函數(shù),其實(shí)好像調(diào)用的函數(shù)是一樣的:

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函數(shù),這個(gè)函數(shù)的意思就很簡(jiǎn)單了:

static void
server_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的值設(shè)為0,也就是重置了這個(gè)計(jì)數(shù)。

所以饒了一圈,這些代碼的意思大概應(yīng)該是這樣,如果客戶端在規(guī)定時(shí)間內(nèi)沒(méi)有響應(yīng),就先判斷未響應(yīng)次數(shù)是否超過(guò)設(shè)置的值,如果超過(guò)就結(jié)束。

如果沒(méi)超過(guò),就把這個(gè)次數(shù)加1,然后發(fā)送一個(gè)請(qǐng)求,看看客戶端還在不在,如果客戶端網(wǎng)絡(luò)正常(應(yīng)該會(huì)自動(dòng)回復(fù)),就會(huì)得到客戶端的回復(fù),于是就重置這個(gè)未響應(yīng)計(jì)數(shù)。

四、兩個(gè)方式的不同

TMOUT方式可以針對(duì)所有用戶通過(guò)本地tty或遠(yuǎn)程ssh登錄時(shí)起作用,而修改sshd_config只針對(duì)使用ssh登錄的用戶。

另外一點(diǎn)就是TMOUT判斷你有沒(méi)有在操作,好像是看你有沒(méi)有輸入什么字符然后敲回車執(zhí)行,你輸入正確的命令敲回車執(zhí)行命令,就算。輸入無(wú)意義的字符敲回車沒(méi)有找到可執(zhí)行的命令,那也算。光輸入字符不敲回車就不算,而判斷你處于空閑狀態(tài),超時(shí)就會(huì)登出。

而ssh是基于網(wǎng)絡(luò)來(lái)判斷,只要客戶端對(duì)服務(wù)器有發(fā)送信息,那就算有在操作。

這也是兩者的一些細(xì)微的不同之處。

總結(jié)

以上所述是小編給大家介紹的等保測(cè)評(píng):Centos超時(shí)退出,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

標(biāo)簽:怒江 淮北 香港 東營(yíng) 濰坊 攀枝花 西藏 西寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《等保測(cè)評(píng):Centos超時(shí)退出問(wèn)題》,本文關(guān)鍵詞  等,保,測(cè)評(píng),Centos,超時(shí),退,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《等保測(cè)評(píng):Centos超時(shí)退出問(wèn)題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于等保測(cè)評(píng):Centos超時(shí)退出問(wèn)題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章