SSH接続がSELinuxの設定ミスによって遮断されていた

SSHが強制切断されるという連絡

私の手伝っているプロジェクトで、SSHが強制切断されるという報告がありました。

ssh test02
Last login: Thu Apr  4 18:51:35 2013 from 192.168.0.2
Connection to test02 closed.

上記のような感じで強制終了されてしまう。どのユーザーでも発生しているようです。

SSHデバッグモードで実行

とりあえずデバッグモードでクライアント側のログを調べて見ました。

ssh -vvv test02
(中略)
debug2: shell request accepted on channel 0
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug1: channel 0: forcing write
Last login: Fri Apr  5 04:39:06 2013 from 192.168.0.2
debug3: channel 0: will not send data after close
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cfd -1)

debug3: channel 0: close_fds r -1 w -1 e 6 c -1
debug3: Wrote 32 bytes for a total of 2885
debug3: Wrote 64 bytes for a total of 2949
Connection to stg06 closed.
Transferred: sent 2736, received 2536 bytes, in 0.0 seconds
Bytes per second: sent 166414.6, received 154249.8
debug1: Exit status 254

シェルがリクエストしているのに、チャンネル0がそれをうまく処理できず、emptyが返ってきてエラーになるようです。これらのエラー、けっこうググってみて、ユーザーを変えたり、シェルを変えたり、言語設定を変えたり、鍵を変えたり、色々試したのですが、解決しませんでした。

データセンターへ直行

データセンターへ行って該当サーバーの状態を調べてきました。コンソールからのログインも受け付けなくなっていて、ログインしようとすると、すぐログアウトされてしまいました。SSH設定が原因では無さそう。ログインが出来なかったので、やむを得ず再起動させたら、今度はカーネルパニックで起動途中で終了しました。

CentOSのインストールDVDでRescue modeを立ち上げ、HDDをマウントして、カーネルパラメータ系の設定の調査を開始しました。

原因はSELinuxの設定ミス

原因はSELinuxの設定ミスでした。このサーバーを設定された方が、/etc/sysconfig/selinux に、以下のように記述されているのを発見しました。

SELINUX=enforcing
SELINUXTYPE=disabled

この指定は間違いです。正しくSELinuxを無効にするには下記の記述になります。

SELINUX=disabled
SELINUXTYPE=targeted

こちらに書き直して、OSの正常起動とSSH疎通を確認、担当者に連絡しました。しかしSElinuxの設定をちょっと間違えるだけで、SSHもコンソールからのログインも不可能になるなんて、カーネルパラメーターって注意が必要ですね。ちなみに、/var/log/secure には、ログイン失敗時、以下のようなログが出力されていました。

Accepted publickey for saito from 192.168.0.2 port 42105 ssh2
pam_selinux(sshd:session): conversation failed
pam_selinux(sshd:session): No response to query: Would you like to enter a security context? [N] 
pam_selinux(sshd:session): Unable to get valid context for saito
pam_unix(sshd:session): session opened for user saito by (uid=0)
error: PAM: pam_open_session(): Authentication failure
error: ssh_selinux_setup_pty: security_compute_relabel: Invalid argument

SELinuxの記述間違いに関しては、sshd_config並の注意が必要かもしれません。