Lightsailの初期ユーザ名をデフォルトから変える
経緯
ユーザ名をデフォルトから変えたい
Lightsailの(Linuxの)ユーザ名は起動時にはadmin
(Debian)やubuntu
(Ubuntu)といったデフォルト名[^default]が設定されている。
Linuxでは一般的にroot
でのログインが非推奨だと言われているが、そうであれば、root
ほどではないにしろ、デフォルトとして多くのサーバで使われ、さらにパスワード無しでsudo
ができるデフォルトユーザも避けられるなら避けたほうがいい気がする。
ユーザ名変えるとWebクライアントが使えない
変えることはできるが、そうするとLightsailコンソール上のブラウザベースのsshクライアントが使えなくなる。 というのもこのクライアント、以下のような仕様になっている。
- デフォルトのユーザー名、デフォルトのポート、デフォルトのキーによりアクセスする
- ターミナル側の設定は変えられない
- ポートやユーザー名をサーバー側で変更すると接続できない
そのためこれを維持するのにデフォルトのユーザー名を変更できなくなったり、ポートも変えられなくなったり(22ポートをWebコンソール限定にして他のポートを追加で開けるならできる)と融通が聞かなかった。
Webクライアントを常用するつもりはもちろんなかったが、かと言って素人が手探りで設定している以上、いざというときの緊急アクセス手段として1ブラウザからのアクセス手段があるにこしたことはない。ということで、これまでWebコンソールを維持するためデフォルトユーザ名をそのまま使っていた。
AWS CloudShellつかうなら変えても問題なさそう
しかし最近になってAWS CloudShellという別のWebコンソールがあることを知った。
ここからアクセスするならLightsailコンソールのターミナル使えなくても問題ない、ということで、改めてユーザ名(と公開鍵)を変えて作ることにした。
スクリプト
これをLightsailの新規インスタンスの初期設定時に起動スクリプトとして設定すれば、一度もデフォルトのユーザ名でログインすることなく、はじめから別のユーザ名でログインできる。
すでに動かしているサーバ、ユーザ名で実行するのは非推奨だが、一応処理自体は起動スクリプトではなく運用中に動かしても機能するはず。
# デフォルトのユーザ名 Ubuntuならubuntu debian なら admin
OLD_USER=admin
# 新しくしたいユーザ名
NEW_USER=fluo10
# ユーザ名の変更、ホームディレクトリの移動
usermod -l $NEW_USER -md /home/$NEW_USER -c $NEW_USER $OLD_USER
# グループ名の変更
groupmod -n $NEW_USER $OLD_USER
# パスワードの設定(詳細は後述)
echo $NEW_USER:$NEW_USER | chpasswd
passwd -e $NEW_USER
# 公開鍵の追加(詳細は後述)
# 新規ユーザ名がgithubのアカウントと違うなら適宜書き換える必要あり
curl https://github.com/$NEW_USER.keys > /home/$NEW_USER/.ssh/authorized_keys
補足1: パスワードの設定
Lightsailのデフォルトユーザはパスワード無しでsudo
できる。そのためユーザー名の変更を試すまで気づかなかったのだが、このデフォルトユーザは以下のように名指しでパスワードなしでsudo
ができるように設定されている
# User rules for admin
admin ALL=(ALL) NOPASSWD:ALL
そして、この初期パスワード、確認する手段がないので、ユーザー名を変えたが最後sudo
ができなくなり最悪詰む。
そこでパスワードを暫定的にユーザー名にし、次回ログイン時に再設定を強制するようにしている。
補足2: 公開鍵の追加
Lightsail の鍵はデフォルトだとリージョンごとに秘密鍵と公開鍵のペアが作られ、秘密鍵をダウンロードして使うという形になっている。
そもそも秘密鍵を共有するのはありなのだろうか…名前的にはだめっぽいが実際の運用上はよくやってる感じなのだろうか?
AWSがアリだというならアリなのだろうが、個人的には抵抗があるので、LightSailの鍵は使わず自分の既存の公開鍵をgithubから引っ張ってきて上書きした。
参考: 複数人のSSHの鍵をGitHubに登録している鍵を使ってシュッと鯖にいれる - 冬のソフトウェア海岸
-
設定ミスで外部からのアクセスが締め出されたり、クライアントの機器でトラブルが起き自己所有でない機器からアクセスする必要ができたり ↩︎