【IBM Cloud】cloud-initを使ってrootユーザーを無効化した仮想サーバーを作成する

## はじめに
IBM Cloudの仮想サーバーはデフォルトでrootログインが可能ですが、セキュリティ強化のため、rootユーザーを無効化して別のユーザーとして利用したいというニーズがあるかと思います。

IBM CloudのVPCはcloud-initを利用して仮想サーバーを構成しており、オーダー時に、このcloud-initにユーザーデータを送り込むことができます。
今回はこの機能を使って、IBM CloudでRed Hat Enterprise Linux 9.x の仮想サーバーをオーダーする際、以下の設定を行うcloud-config(YAML形式)の適用を試してみます。
- rootユーザーのSSHログインを禁止する
- root以外のユーザーを追加する

:::note info
cloud-initは、クラウド環境や仮想マシン（VM）のインスタンス初期設定を自動化するためのOSSです。インスタンスが起動する際に実行され、設定やカスタマイズを行います。
:::

## 1. cloud-configの作成
cloud-initで使用できる書式については[こちらの記事](https://qiita.com/yamada-hakase/items/40fa2cbb5ed669aaa85b#3-1-cloud-init%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E6%9B%B8%E5%BC%8F)で分かりやすく解説されています。

今回はcloud-configの以下のセクションに必要な情報を指定していきます。
- users：システムユーザーの作成・設定や、SSH 公開鍵の登録やパスワード設定
- write_files：特定のファイルを作成または編集
- runcmd：起動後に実行するコマンドを指定

この他にも、必要なソフトウェアパッケージをインストールするpackageセクションや、言語やロケールを設定できるlocaleセクションなどを設定することができます。

```diff_yaml
#cloud-config
users:
  - name: foobar
    groups: [wheel]  # sudo 権限を付与
    shell: /bin/bash
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]  # パスワードなしでsudoを使用可能
    ssh_authorized_keys:
      - "ssh-rsa AAAAB3Nza...SSH公開鍵..."  # foobarユーザー用の公開鍵

write_files:
  - path: /etc/ssh/sshd_config.d/disable-root.conf
    content: |
      PermitRootLogin no  # rootのSSHログインを無効化
      PasswordAuthentication no  # パスワード認証を無効化

runcmd:
  - systemctl restart sshd  # sshdの設定変更を反映
```

## 2. IBM Cloudの仮想サーバー注文画面でcloud-configを適用
IBM Cloud VPC(Virtual Private Cloud)で仮想サーバーをオーダーする画面です。
仮想サーバーをデプロイする場所や、コア/メモリ、OSなどを指定していきます。
![スクリーンショット 2024-12-09 23.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1396951/3bcd5520-1a8e-6852-4ef3-6aa14a3c8d89.png)

このページの下部にAdvanced optionsを設定する箇所があり、その中にUser dataという項目があります。
ここに、先ほど作成したcloud-configをペースト、もしくはファイルをドラッグ&ドロップします。
![スクリーンショット 2024-12-09 23.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1396951/abdfa19d-202c-7f4b-a574-f7746eb5a4d4.png)

[Create virtual server]を押すと、仮想サーバーのオーダーが完了します。
数十秒で仮想サーバーがRunning状態になるので、CLIでアクセスしてみましょう。
![スクリーンショット 2024-12-10 0.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1396951/f4d28332-52fc-2697-d9f9-68a6fa5c56da.png)

## 3. CLIでsshログインテスト
まず、cloud-configで指定したユーザー”foobar”としてログインできるか確認します。
このIBM Cloudアカウントでは仮想サーバーにはVPN経由でアクセスするルールになっているため、以下のコマンドでログインを試みていますが、仮想サーバーに浮動IP(グローバルIP)を付与している場合には、`ssh <ユーザー名>@<グローバルIP>`でログインできます。
```
ssh -i /Users/.../key-nakayama_rsa.prv foobar@10.xx.xx.xx
```

結果：foobarというユーザーでログインできました！
```
~ % ssh -i /Users/.../key-nakayama_rsa.prv foobar@10.xx.xx.xx
The authenticity of host '10.xx.xx.xx (10.xx.xx.xx)' can't be established.
ED25519 key fingerprint is SHA256:6go/wyh+8Vq2zHOZ0egBzkgbWXvA9nM9jEwUUFT9uT0.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.xx.xx.xx' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
[foobar@cloud-init-test ~]$
```
次に、ユーザー"foobar"でsudoを使用できるかも確認します。
「/root」ディレクトリは、スーパーユーザーしか閲覧できないディレクトリです。
sudoを使用していない場合と使用した場合の両方で`ls /root`が実行できるか試してみます。

結果：sudoを使用してコマンド実行した場合のみ、/rootディレクトリを閲覧できました。
```
[foobar@cloud-init-test ~]$ ls /root
ls: cannot open directory '/root': Permission denied
[foobar@cloud-init-test ~]$ sudo ls /root
redhat_subscription.log
```
最後に、rootユーザーでログインしようとした時の挙動も確認します。
結果：Permission deniedでログインが拒否されていることがわかります。
```
 ~ % ssh -i /Users/.../key-nakayama_rsa.prv root@10.xx.xx.xx
root@10.xx.xx.xx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

以上、IBM CloudでRHEL OSの仮想サーバーをオーダーする際の、cloud-initを利用した初期設定を試してみました。

## 4. 参考
- [Cloud-init documentation](https://cloudinit.readthedocs.io/en/latest/#)
- [Red Hat Documentation：RHEL 9 の cloud-init の設定および管理](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html-single/configuring_and_managing_cloud-init_for_rhel_9/index)
- [IBM Cloud Docs：仮想プライベート・クラウド (VPC) > ユーザーデータ](https://cloud.ibm.com/docs/vpc?topic=vpc-user-data)
- [Qiita記事：cloud-initを使ったLinux OSの初期設定](https://qiita.com/yamada-hakase/items/40fa2cbb5ed669aaa85b#3-cloud-init%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8)
- [Qiita記事：IBM Cloud: VPCのサーバー・プロビジョニング時に指定したスクリプトを自動実行する](https://qiita.com/testnin2/items/bcefff6c61f089d01f25)