多少ハマったけれどAWS EC2にシリアルコンソール接続できた

前回はインスタンスタイプの制限でシリアルコンソール接続に失敗して悔しい思いをしました。Nitro System上で動くt3世代のインスタンスを立ち上げて、今度こそシリアルコンソール接続したいのです。

結論から言うと、多少ハマったものの無事接続できました。Twitterでも報告しましたしね。

で、ハマりポイントの原因とその解消方法を先にお伝えしておきます。

  • 原因:最近のOpenSSHではデフォルトでは許可されていない公開鍵認証で使うアルゴリズムしかAWS側が対応していない
  • 解消方法:~/.ssh/config で接続先ホストのオプションにPubkeyAcceptedKeyTypes +ssh-rsaを書く
  • 対象環境:(多分)OpenSSH 8.8以降

さて、どんなふうにハマってどう解決したのか、振り返りです。

まずは接続先となるインスタンスを起動します。もちろん、オレゴンリージョンのPhoneixゾーンです。でも、インスタンスタイプはt3.nanoです。お遊びですから。OSというかAMIはMinimal Ubuntu 22.04 LTS – Jammyを選びます。まずは普通にセキュリティグループを設定して、OSのsshdにssh接続です。当然ログインできます。ログイン時に下記のメッセージが表示されるあたりがMinimalなところでしょうか。

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

うむ、nanoインスタンス。

ubuntu@my-Phoneix-server:~$ free -h
total used free shared buff/cache available
Mem: 445Mi 119Mi 20Mi 0.0Ki 305Mi 308Mi
Swap: 0B 0B 0B

マジメに使う、構築する、運用するつもりはないけど、JSTじゃないのは気持ち悪いので直します。

$ sudo /usr/bin/timedatectl set-timezone Asia/Tokyo

シリアルコンソール接続を待ち受けていることを確認します。

$ systemctl list-units --type=service | grep ttyS0
serial-getty@ttyS0.service loaded active running Serial Getty on ttyS0

さぁ、ワクワクしてきました。ubuntuユーザのパスワードを自分が分かるものに変更します。

ubuntu@my-Phoneix-server:~$ sudo passwd ubuntu
New password:
Retype new password:
passwd: password updated successfully

もう一個ターミナルを立ち上げて接続します。ちなみにターミナルはWSL2のUbuntu22.04です。OpenSSHのバージョンは下記の通りです。

$ ssh -V
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022

そう、ここがプチハマりの始まりでした。

こちらを参照して、SSH パブリックキーをインスタンスにプッシュします。
長くて 覚えられないので 面倒なので、スクリプトにします。下記にない3,4行目でインスタンスIDと鍵ファイルを変数に入れています。

$ sed -n '1p;5,$p' ./bin/aws-addkey.sh
#!/bin/bash

/usr/bin/aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id ${IncetanceID} \
--ssh-public-key ${KEYFILE} \
--region us-west-2 \
--serial-port 0 | /usr/bin/jq '.Success'

ユーザ名と接続先のホスト名も長くて面倒なので、~/.ssh/config に ec2-2s として登録しました。

いざ、鍵をプッシュ・・・!今度は成功しました。例え nano と言えど、さすがNitro Systemで動くt3世代です。

$ ./bin/aws-addkey.sh
true

が、いざssh接続しようとしても、Permission denied (publickey).言われて接続できませんでした。ssh -vvしてリトライすると、最後の方はこんな感じ。

debug1: send_pubkey_test: no mutual signature algorithm
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.

鍵のプッシュは成功しているし、クライアント側から切っているので、こちらの設定次第で何とかなりそう、というのが第一印象です。
さらに-vvで出てきたメッセージを眺めていると、公開鍵認証に関わるアルゴリズムが気に入らないらしいことが分かります。

ssh “send_pubkey_test: no mutual signature algorithm” でGoogle先生に聞いてみて出てきた記事をいくつか眺めてみて、下記が参考になりました。

Bitbucket サポートSSH-RSA key rejected with message “no mutual signature algorithm”

ECDSAとED25519のキーペアを作って試してみたのですが、シリアルコンソールにキーをプッシュする段階で失敗します。どうやらRSAの鍵しかダメっぽい。AWSCLI力が強ければサポートしてるアルゴリズムを調べたりできるのかもしれませんが、今の僕にはできません。そこで、上記のサポートページで紹介されてるワークアラウンドPubkeyAcceptedKeyTypes +ssh-rsaを使うことにしました。

いざ、.ssh/config にワークアラウンドを突っ込んで、リトライ!
最初は何も出力されなくて、ん?と思いましたが一回Enterを押してやると無事にログインプロンプトが表示されました。

$ ssh ec2-2s
<ENTER>
my-Phoneix-server login:

ログインして、ログインユーザをみてみます。

ubuntu@my-Phoneix-server:~$ w | sed 1d| awk '{print $1,$2}'
USER TTY
ubuntu ttyS0

ちゃんとttyS0からログインしてみます。確認出来たら、shutdown -r nowを試してみます。ワクワクします。shutdown実行しても、ssh接続が切られることはありません。モニタ・キーボード接続しているときのように、終了時のメッセージが、つづいて起動時のメッセージが見られます。感動ですね。再起動時のメッセージの流れ方を見ていると、nanoインスタンスと言えど割とCPUは速い気がします。メモリは少ないけどね。

再起動後にcpuinfoを見てみたら、2.5GHzのXeonが2コア割り当てられてました。ハイパースレッディング考えると1コア2スレッドかな。

ubuntu@my-Phoneix-server:~$ cat /proc/cpuinfo | grep "model name" | uniq -c
2 model name : Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz

何世代かはパッと分からないけど、2020年Q1頃から存在しているそうです。
site:intel.com をつけてGoogle先生に聞いても、近いモデルナンバーの製品しか出てきませんでした。
24コア48スレッド。物理マシンには何個搭載されてるんだろう?希望カスタマー価格 $8244.00、日本円にして約112万円強・・・円安・・・。ケース温度 90°C ・・・目玉焼き焼けますね。

しかし、こういうログイン経路があることを知ってしまうと、デフォルトのユーザ名は使いたくなくなりますね。rootは必要だけど、nologinにしておきたくなります。というわけで

ubuntu@my-Phoneix-server:~$ sudo usermod -s /usr/sbin/nologin root
ubuntu@my-Phoneix-server:~$ grep ^root: /etc/passwd
root:x:0:0:root:/root:/usr/sbin/nologin

まあ、検証が終わったらシャットダウンしちゃうわけで、AWSコンソールやアクセスキーの方がよっぽど重要です。

今日はこのくらいで、また来週です。