2014年12月1日月曜日

Amazon Linuxでsshをアップデートしたらつながらなかった件w (解決法も)


ども、なのまるです。

結構古めの「Amazon Linux」を最新の「2014.09」にアップデートしてみました!
そしたらハマりました~


もくじ



「Amazon Linux」をアップデートしたらハマった!

この古い「Amazon Linux」をアップデートしたら、SSHだけつながらなくなったので困りました。
結果、解決したんですがその顛末を残しておきたいと思います。


前提条件


  • Amazon Linux が2年以上前のもの (今回は「2012.09」)
  • OpenSSHがバージョン「openssh-5.3p1」


OSの状態

アップデート前
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2012.09-release-notes/

アップデート後
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/

原因は「OpenSSH」のアップデート

アップデート前
openssh-5.3p1-81.19.amzn1.x86_64(おそらくw)

アップデート後
openssh-6.2p2-8.42.amzn1.x86_64

/etc/ssh/sshd_configの差分
--- sshd_config.bak     2013-01-21 06:32:06.064836211 +0000
+++ sshd_config 2014-12-01 09:28:43.518105312 +0000
@@ -1,4 +1,4 @@
-#      $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
+#      $OpenBSD: sshd_config,v 1.89 2013/02/06 00:20:42 dtucker Exp $

 # This is the sshd server system-wide configuration file.  See
 # sshd_config(5) for more information.
@@ -7,24 +7,27 @@

 # The strategy used for options in the default sshd_config shipped with
 # OpenSSH is to specify options with their default value where
-# possible, but leave them commented.  Uncommented options change a
+# possible, but leave them commented.  Uncommented options override the
 # default value.

+# If you want to change the port on a SELinux system, you have to tell
+# SELinux about this change.
+# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
+#
 #Port 22
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::

-# Disable legacy (protocol version 1) support in the server for new
-# installations. In future the default will change to require explicit
-# activation of protocol 1
-Protocol 2
+# The default requires explicit activation of protocol 1
+#Protocol 2

 # HostKey for protocol version 1
 #HostKey /etc/ssh/ssh_host_key
 # HostKeys for protocol version 2
 #HostKey /etc/ssh/ssh_host_rsa_key
 #HostKey /etc/ssh/ssh_host_dsa_key
+#HostKey /etc/ssh/ssh_host_ecdsa_key

 # Lifetime and size of ephemeral version 1 server key
 #KeyRegenerationInterval 1h
@@ -47,11 +50,17 @@
 #MaxAuthTries 6
 #MaxSessions 10

-RSAAuthentication yes
-PubkeyAuthentication yes
+#RSAAuthentication yes
+#PubkeyAuthentication yes
+
+# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
+# but this is overridden so installations will only check .ssh/authorized_keys
 AuthorizedKeysFile     .ssh/authorized_keys
-AuthorizedKeysCommand none
-AuthorizedKeysCommandRunAs nobody
+
+#AuthorizedPrincipalsFile none
+
+#AuthorizedKeysCommand none
+#AuthorizedKeysCommandUser nobody

 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
 #RhostsRSAAuthentication no
@@ -65,7 +74,6 @@

 # To disable tunneled clear text passwords, change to no here!
 #PasswordAuthentication yes
-PasswordAuthentication no
 #PermitEmptyPasswords no
 # EC2 uses keys for remote access
 PasswordAuthentication no
@@ -83,8 +91,6 @@

 # GSSAPI options
 #GSSAPIAuthentication no
-#GSSAPIAuthentication yes
-#GSSAPICleanupCredentials yes
 #GSSAPICleanupCredentials yes
 #GSSAPIStrictAcceptorCheck yes
 #GSSAPIKeyExchange no
@@ -98,16 +104,12 @@
 # If you just want the PAM account and session checks to run without
 # PAM authentication, then enable this but set PasswordAuthentication
 # and ChallengeResponseAuthentication to 'no'.
+# WARNING: 'UsePAM no' is not supported in Fedora and may cause several
+# problems.
 #UsePAM no
 # Leaving enabled as described so that account and session checks are run
 UsePAM yes

-# Accept locale-related environment variables
-AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
-AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
-AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
-AcceptEnv XMODIFIERS
-
 #AllowAgentForwarding yes
 #AllowTcpForwarding yes
 #GatewayPorts no
@@ -116,12 +118,11 @@
 #X11DisplayOffset 10
 #X11UseLocalhost yes
 #PrintMotd yes
-#PrintLastLog yes
 # Explicitly enable
 PrintLastLog yes
 #TCPKeepAlive yes
 #UseLogin no
-#UsePrivilegeSeparation yes
+UsePrivilegeSeparation sandbox         # Default for new installations.
 #PermitUserEnvironment no
 #Compression delayed
 #ClientAliveInterval 0
@@ -129,16 +130,27 @@
 #ShowPatchLevel no
 #UseDNS yes
 #PidFile /var/run/sshd.pid
-#MaxStartups 10
+#MaxStartups 10:30:100
 #PermitTunnel no
 #ChrootDirectory none
+#VersionAddendum none

 # no default banner path
 #Banner none

+# Accept locale-related environment variables
+AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
+AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
+AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
+AcceptEnv XMODIFIERS
+
 # override default of no subsystems
 Subsystem      sftp    /usr/libexec/openssh/sftp-server

+# Uncomment this if you want to use .local domain
+#Host *.local
+#      CheckHostIP no
+
 # Example of overriding settings on a per-user basis
 #Match User anoncvs
 #      X11Forwarding no

このsshd_configを「openssh-6.2p2-8.42.amzn1.x86_64」のものに入れ替えることで、動作させました。

詳細な原因は追い切れていないのですが、ちょうど同じ現象になったことがあるということで、この対応になりました。


対処方法

再起動してしまったあとでは、AWSは直接接続できる「コンソール」を用意していないためどうにもなりませんでした。(方法はあるのかも・・・)

そこで、新しいインスタンスにEBSをマウントしてファイルを編集するという方法をとりました。

復旧手順


  • 対象の接続できないEC2インスタンス(A)をSTOP
  • EC2インスタンス(A)のRoot device名を確認する
  • 新しいEC2インスタンス(B)を作成・起動
  • EC2インスタンス(A)のEBS VolumeをDetach
  • EC2インスタンス(B)にEC2インスタンス(A)のEBS Volumeをattach
  • EC2インスタンス(B)で、マウント・ファイル編集
  • EC2インスタンス(B)からDetach
  • EC2インスタンス(A)にattachしなおす

スクリーンショット入れようとしましたが、大人の事情で載せられない情報がたくさんで「モザイクだらけ」になるのでやめましたw

対象の接続できないEC2インスタンス(A)をSTOP

ManagementConsoleか、何かしらの形でインスタンスをSTOPしてください

EC2インスタンス(A)のRoot device名を確認する

インスタンスの詳細画面から「Root device」名を確認しておいてください。やってなくてハマったw

新しいEC2インスタンス(B)を作成・起動

新しいインスタンスを立ち上げます。
既存のインスタンスでもいいですw

EC2インスタンス(A)のEBS VolumeをDetach

修正したいインスタンスの「EBS ID」を確認してVolumeメニューから「Detach」

EBS IDを確認


EC2インスタンス(B)にEC2インスタンス(A)のEBS Volumeをattach

Volumeメニューから対象のEBSをマウントします。
マウント先はデフォルトのままにしました。「/dev/sdf」

EC2インスタンス(B)で、マウント・ファイル編集

こんな感じで編集しました。
mount /dev/sdf /media
cd /media/etc/ssh/
mv sshd_config sshd_config.bak
cp -a sshd_config.rpmnew sshd_config
cd /
umount /media


EC2インスタンス(B)からDetach

書き換えが終わったら、アンマウントして「Detach」します

EC2インスタンス(A)にattachしなおす

元のインスタンスにattachし直しますが、Deviceの指定で以前のものを使いましょうw

これちゃんと設定しないと起動しませんでした~


まとめ


  • アップデート前にsnapshotを取るべきでしたw
  • うーん、このハマり方結構レアっぽいです~
  • こうやって、EBSマウントしてほかのEC2インスタンスからファイル編集するんだ!って勉強になりました

参考サイト


Zenback