EC2のユーザーデータを使用してlinuxユーザーの追加を行ってみた

EC2作成時にユーザーを追加してsudo権限を与えて…と毎回やるのは面倒なので、EC2のユーザーデータを使用して初期化作業をサクっと完了させる。

# 準備・必要なもの

* AWSアカウント
* SSHキー（公開鍵・秘密鍵） - SSHで接続するため必要
* vscode - WindowsからのSSH接続で使用

# EC2インスタンス作成

コンソール画面からインスタンスを起動。

イメージで Amazon Linux 2023 を選択
インスタンスタイプ、キーペア、セキュリティーグループを良しなに選択。

![ec2-userdata-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/ba9b3418-30ea-423b-9575-8d48068f8e14.png)


高度な詳細　＞　ユーザーデータに以下を入力

```sh
#!/bin/bash

# init config
echo "%wheel  ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
hostnamectl set-hostname myserver1

# add user
adduser myuser1
usermod -aG wheel myuser1
mkdir /home/myuser1/.ssh
touch /home/myuser1/.ssh/authorized_keys
chown -R myuser1:myuser1 /home/myuser1
echo "ssh-rsa XXXXX..." >> /home/myuser1/.ssh/authorized_keys
```

![ec2-userdata-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/a5acf43b-3a0e-3405-f4c8-8fbea8d9d19e.png)

※myserver1, myuser1はお好みで設定する。

最後の`"ssh-rsa XXXXX..."`の箇所にはあらかじめ準備したSSH公開鍵(id_rsa.pub)の内容を貼り付ける。

これで、sudoのパスワードスキップ、ホスト名の設定、ユーザーの追加とsudo許可、SSHキーの設定が完了する。

# SSH接続

インスタンスが起動したらvscodeに`Remote - SSH` Extensionを追加する。
Remote ExplorerからSSHの横の歯車で`~/.ssh/config`ファイルを開く。
（もしくは、直接`~/.ssh/config`ファイルを作成・編集する）

![ec2-userdata-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/6df98ea5-b543-904c-331d-d4d75d910faa.png)

`~/.ssh/config`に以下のように設定を追加

```
Host myserver1
  HostName ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com
  User myuser1
  IdentityFile "C:\temp\ssh\id_rsa"
```

![ec2-userdata-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/e4f4479b-c967-f0f5-5906-2d89c81f1565.png)

設定名・ホスト名・ユーザー名・SSH秘密鍵のパスを指定する。
ホスト名は起動後にAWSコンソールでパブリック IPv4 DNSまたはパブリック IPv4 アドレスを確認して設定する。
ユーザー名はサーバー作成時に指定したユーザー名と合わせる。
（IdentityFileで秘密鍵を指定しなければ デフォルトの`~/.ssh/id_rsa`が使用される。）
設定追加後にExtensionのRefreshボタンで反映される。

追加した設定を右クリックし、接続する。
![ec2-userdata-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/494ddd3d-39d8-bab6-fb83-06a069b3951d.png)

初回接続時はサーバのタイプとfingerprintの確認が表示される。
Amazon LinuxならLinuxを選択する。
![ec2-userdata-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/7cc5e4af-f2a3-4877-c967-6df4b4a483cb.png)
![ec2-userdata-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/2b30016e-94cd-f654-44b4-167a542d8485.png)

接続が完了したら、メニューの`Terminal`から`New Terminal`で新しいターミナル画面が下に開く。
![ec2-userdata-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/3d53e00e-f3b3-42de-208c-de30061cbdee.png)

# 補足： SSHキーの作成(Windows)

SSHキーがない場合、dockerがインストール済みなら以下のコマンドで作成できる。
```batch
docker run -it -v c:\temp\ssh:/var/ssh alpine sh -c "apk add openssh && ssh-keygen -N '' -f /var/ssh/id_rsa"
```
これで`c:\temp\ssh`以下に`id_rsa`と`id_rsa.pub`出力される。

# 補足： SSH秘密鍵のアクセス権限

WindowsのvscodeからSSHで接続する場合、SSH秘密鍵を自分以外のユーザーが読み取りできると接続時にエラーになる。

ログを見ると`WARNING: UNPROTECTED PRIVATE KEY FILE!`とか`Load key "C:\\temp\\ssh\\id_rsa": bad permissions`とエラーが表示されている。

この場合、ファイルのアクセス許可を修正し、自分以外からアクセスできないようにする必要がある。

自分のユーザーにフルアクセス権限を指定した後、`Authenticated Users`と`Users`グループ等からアクセスできないようアクセス権限を削除する。
![ec2-userdata-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372771/5a9a1d3d-91ba-8ca6-e1ee-47ce772e0c85.png)