Amazon Lightsail で作業用ユーザーを作成してssh接続してみた。

Amazon Lightsail(OSは Amazon Linux 2023)ではデフォルトのユーザーとして ec2-user が作成されていますが、これとは別の作業用ユーザーを新規作成してssh接続できるようにしてみます。鍵ファイルは自作して、ssh接続ではポート22から任意のポートに変更をします。

作業手順としては、以下です。

  1. 作業用ユーザーの鍵ファイルの作成
  2. サーバーに作業用ユーザーを作成
  3. サーバーに .ssh フォルダを作成
  4. 鍵ファイルをサーバーに送る
  5. いったん、疎通確認
  6. ファイアーウォールの設定変更
  7. sshd_config の設定変更
  8. 最終確認

【 1 】鍵ファイルを作成します。作成はクライアント側で行います。

[ クライアント側作業 ]
ubuntuにログインしてホームディレクトリ配下の .ssh ディレクトリに移動します。ssh-keygen コマンドで鍵生成をします。鍵の形式は RSA、ビット長は 4096、鍵ファイルの名前は id_rsa.j です。


$ pwd
/home/tak/.ssh
$ ssh-keygen -t rsa -b 4096

カレントディレクトリの配下(/home/tak/.ssh)に以下の名前で鍵ファイルが作成されます。

秘密鍵ファイル・・・id_rsa.j
公開鍵ファイル・・・id_rsa.j.pub

【 2 】サーバーで作業用ユーザーを新規作成します。

[ サーバー側作業 ]
ec2-user でサーバーにログインします。その後、root にスイッチして作業します。adduser で tak ユーザーの作成をし、パスワードの設定をします。LightsailDefaultKey.pem は ec2-user の秘密鍵ファイルです。この鍵ファイルは(クライアント側の)ホームディレクトリ配下の .ssh フォルダに配置している例です。


$ ssh -i .ssh/LightsailDefaultKey.pem ec2-user@xxx.xxx.xxx.xxx
$ su -
# adduser tak
# passwd tak

【 3 】サーバーに.ssh フォルダを作成します。

[ サーバー側作業 ]
rootでの作業をいったん終えて、作業用ユーザーにスイッチしてホームディレクトリ配下に .ssh フォルダを作成します。.ssh フォルダは自身しかアクセスできないように700の権限とします。


# exit
$ su tak
$ pwd
/home/tak
$ mkdir .ssh
$ chmod 700 .ssh

【 4 】鍵ファイルをサーバーに送ります。

[ クライアント側作業 ]
scp コマンドで公開鍵ファイルをサーバーにアップロードします。アップロードには ec2-user のアカウントを使います。


$ scp -i .ssh/LightsailDefaultKey.pem .ssh/id_rsa.j.pub ec2-user@xxx.xxx.xxx.xxx:~/.ssh/

上記の scp コマンドでは公開鍵ファイル(id_rsa.j.pub)を ec2-user のホームディレクトリ配下の .ssh フォルダに配置しています。

[ サーバー側作業 ]
送信された鍵ファイルを【3】で作成した tak の .ssh フォルダ配下に移動させます。rootで作業します。


$ su -
# mv /home/ec2-user/.ssh/id_rsa.j.pub /home/tak/.ssh/
# cd /home/tak/.ssh
# chown tak:tak id_rsa.j.pub
# chmod 600 id_rsa.j.pub
# mv id_rsa.j.pub authorized_keys

ファイルの所有者を ec2-user から tak に変更して、アクセス権限を tak のみ(600)に変更しています。そして、ファイル名を authorized_keys に変更します。

これで ec2-user と同様に tak でも公開鍵認証ができるようになります。

【 5 】tak アカウントでsshログインできることの確認をします。

[ クライアント側作業 ]
ec2-user ではなく tak ユーザーでサーバーにログインできることを確認します。鍵ファイルは作成したもの(id_rsa.j)を使います。


$ ssh -i .ssh/id_rsa.j tak@xxx.xxx.xxx.xxx

問題なく接続できれば、作業を続けます。

【 6 】sshのポートを変更するためファイアーウォールの穴あけをしておきます。

[ サーバー側作業 ]
Lightsail の管理画面に入り、インスタンス → ネットワーキングとたどってファイアーウォールの設定画面にいきます。デフォルトでは、SSHのポート22とHTTPのポート80が開いています。

「+ルールを追加」をクリックしてカスタムとしてポートを追加します。SSHのポートは、このあとにここで開ける番号に変更します。以下が追加したものです。

【 7 】sshd_config の修正をします。

[ サーバー側作業 ]
rootにスイッチして、作業を行います。sshd_config はバックアップを取っておきましょう。


$ su -
# cd /etc/ssh
# cp -p sshd_config sshd_config.20240505
# vi sshd_config

viエディタで sshd_config を編集をします。編集項目は以下です。ポート番号の変更と root でのリモートログインを不許可にしておきます。

編集前
Port 22
#PermitRootLogin prohibit-password

編集後
Port yyyyy(任意)
PermitRootLogin no

なお、Lightsail では PubkeyAuthentication、および、PasswordAuthentication はデフォルトで以下となっています。

#PubkeyAuthentication yes
PasswordAuthentication no

PubkeyAuthentication がコメントにされていますが、PubkeyAuthentication のコメントにされたときのデフォルト値はyesなので、鍵認証は有効、パスワード認証は無効という設定です。

編集をしたら sshd_config を保存します。sshdを再起動します。


# systemctl restart sshd

作業しているセッションは再起動しても維持されます。

【 8 】SSHのポート変更後の接続を確認します。

[ クライアント側作業 ]
別のターミナルを開いて、ssh接続できることを確認します。ポートを変更しているので、-p オプションでポート指定をしてください。


$ ssh -i .ssh/id_rsa.j tak@xxx.xxx.xxx.xxx -p yyyyy

接続ができればポートの変更も完了です。

ただしポートを変更しているので Lightsail からのブラウザでのssh接続はできなくなります。

使用するとエラーになるのでポート変更は各自の責任でお願いします。

Amazon Lightsail のインスタンスの作り方

Amazon Lightsail を使ってみました。インスタンスを作成してsshでログインするところまでやりましたので、それについて書いておきます。Amazon Linux 2023の初期設定も少しほど記載しています。

まずはAmazonのアカウントを作成します。AWSアカウント作成の流れを参考にすると良いです。

アカウントを作成したら Amazon Lightsail のホームサイトにある「無料でお試しください」をクリックします。

サインインの画面に移るので、ルートユーザーを選びアカウント作成時のEメールアドレスを入力します。「次へ」ボタンをクリックします。

Amazon Lightsail の画面に遷移します。言語は日本語を選んでおきましょう。右上にはアカウント作成時のアカウント名が表示されます(赤丸のところです)。

インスタンスイメージを選択します。プラットフォームは「Linux/Unix」にして、設計図の選択では「オペレーティングシステム(OS)のみ」を選び、OSは「Amazon Linux 2023」にしました。

インスタンスプランの選択をします。ネットワークタイプを選択では「Dual-stack」にします。サイズを選択では目的に応じてサイズを選んでください。

なお、2024年5月1日以降はデュアルスタックの料金(メモリ512MB)は$3.50から$5.00に値上げされているようです。IPv6のみの場合は料金の変更はないようです。

インスタンスを確認のところでリソース名と数量を入力します。リソース名は任意で大丈夫です。最後に「インスタンスの作成」をクリックします。

インスタンスが作成されるとLightsailの管理画面が表示されます。この状態だとインスタンスはまだ「保留中」の状態です。

インスタンスにIPアドレスの紐付けをします。左側のリストの「ネットワーキング」を選び「静的IPの作成」をクリックします。

静的IPアドレスの作成の画面に移ります。インスタンスへのアタッチのところで作成したインスタンスが表示されていることを確認します。もしインスタンス名が表示されていない場合はAWSのコンソールのホーム画面に一度戻ってみてください(後述します)。

静的IPの指定をします。任意の名前(デフォルトのまま)でも良いです。「作成」ボタンをクリックします。

インスタンスへの静的IPのアタッチが完了します。静的IPアドレスのところにIPアドレスが表示されます。

左側のリストのインスタンスをクリックすると、インスタンスの状態が「実行中」になっています。インスタンスをクリックします。

インスタンスの画面に移ります。右上の停止、再起動でインスタンスを操作できます。「SSHを使用して接続」をクリックするとブラウザからSSH接続ができます。

「SSHを使用して接続」をクリックしてインスタンスに入ったときは、こんな感じです。

ブラウザからのSSH接続ではなく、SSHクライアントソフトから接続をする場合は秘密鍵をダウンロードします。接続に必要な情報は、接続先(IPアドレス)、ユーザー名、鍵ファイルとなります。IPアドレス、ユーザー名は画像では伏せています。

公開鍵はLightsailの接続ユーザーのホームディレクトリ配下 .ssh フォルダの authorized_keys に登録済みとなっています。ですので、以下のコマンドで(クライアントがLinuxの場合)接続できます。

$ ssh -i ダウンロードした鍵ファイル ユーザー名@IPアドレス

具体的には以下ような感じです。

$ ssh -i ./LightsailDefaultKey.pem LightsailUser@10.245.10.12

ダウンロードした鍵ファイルですが、権限が弱いとエラーになります。

Permissions 0664 for ‘./LightsailDefaultKey.pem’ are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

この場合は権限をSSH接続する所有者しかアクセスできないように変更すれば、エラーは出なくなります(0664を0600にする)。

これで、SSH接続をしてLightsailのインスタンスを操作できるようになります。

静的IPアドレスの画面でインスタンスが表示されていない(アタッチできていない)場合ですが、AWSのコンソールのホーム画面に一度戻ってみてください。最近アクセスしたサービスにLightsailが表示されているので、そこをクリックして再度、静的IPアドレスの画面に移ります。インスタンスの表示がされるときがあります。

Amazon Linux 2023 の初期設定をしておきます。

まずはrootユーザーのパスワードを変更しておきましょう。Lightsailのデフォルトではrootのパスワードは設定されていません。ですので、suコマンドでrootにスイッチユーザーしたあとに、passwdコマンドでパスワードを変更します。

以下のようにします。


$ sudo su - ← rootにスイッチユーザーする(パスワードなしのためrootになれる)
# 
# passwd ← rootのパスワードを設定する
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
# (ここからrootユーザーでの作業となる)

ロケールの変更をします。rootユーザーで作業します。


# localectl status
System Locale: LANG=C.UTF-8 ← 現設定の確認
    VC Keymap: (unset)
   X11 Layout: (unset)
#
# localectl set-locale LANG=ja_JP.utf8 ← ロケールの変更
#
# localectl status
System Locale: LANG=ja_JP.utf8 ← 変更後の確認
    VC Keymap: (unset)
   X11 Layout: (unset)
#

タイムゾーンも変更します。


# date
Sun May  5 07:08:04 UTC 2024 ← 現時刻の確認
#
# cd /etc 
# ls -l localtime
-rw-r--r--. 1 root root 114 Apr 25 19:29 localtime
#
# mv localtime localtime.20240505 ← バックアップの取得
# 
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ← Asia/Tokyoのゾーンファイルのシンボリックリンクを作成
# 
# ls -l localtime*
lrwxrwxrwx. 1 root root  30 May  5 16:27 localtime -> /usr/share/zoneinfo/Asia/Tokyo
-rw-r--r--. 1 root root 114 Apr 26 04:29 localtime.20240505
# 
# date
Sun May  5 16:27:29 JST 2024 ← 時刻が変わっている事が確認できます
# 

# shutdown -r now でサーバーを再起動して、sshで再度、接続を行います。dateで時刻を改めて確認すると、ロケールの変更も反映されて日本語で表示されるようになります。


$ date
2024年  5月  5日 日曜日 16:34:47 JST ← 日本語表示になる
$ 
$ su -
パスワード:
最終ログイン: 2024/05/05 (日) 15:58:39 JST 日時 pts/0 ← 日本語表示になる
#