IBM Cloud VPC Gen 2上のUbuntuサーバのログイン周りのセキュリティ設定

# 当記事の概要
[IBM Cloud VPC Gen 2上にUbuntuのVSIを立てた](https://qiita.com/hisato_imanishi/items/48ce52f11a46973fc83b)際に、セキュリティ確保のために実施したことを備忘録としてまとめました。

実施した内容は以下になります。

- 一般ユーザの作成
- 一般ユーザのsudoの設定
- 一般ユーザでのSSH公開鍵認証の設定
- rootでのSSHログインを禁止
- パスワード認証を無効化
- デフォルトセキュリティグループの変更（アクセス元IPアドレスの限定）

また、当記事では以下の記事を参考にしています。

- [HTTP Proxy経由でSSH接続する方法(Mac)](https://qiita.com/testnin2/items/1584e5863c3b149feb71)
- [プロキシ環境下のWindows10から外部へSSHでアクセスする方法](https://qiita.com/chacco38/items/873c48fbfefa0facc403)
- [SSH公開鍵認証で接続するまで](https://qiita.com/kazokmr/items/754169cfa996b24fcbf5)
- [Ubuntuでsshのrootログインを禁止する](https://qiita.com/patao-tech/items/3ed828d6769a7adf5a12)

# 前提事項
当記事では以下を前提としています。

- VSIのOSはUbuntuである
- ローカルの端末がMacである

# 一般ユーザの作成
初期状態ではrootでのSSHログインになりますが、rootをそのまま使用し続けるのは危険なため、一般ユーザを作成します。
Ubuntuでは``useradd``コマンド、``adduser``コマンドの2種類が使用可能ですが、``useradd``コマンドではホームディレクトリが作成されないなどの不都合があるため、``adduser``コマンドを使用します。
``adduser``コマンドを実行すると、対話式にパスワードの設定などが行えます。

```
# adduser <ユーザID>
```

# 一般ユーザのsudoの設定
この後rootでのSSHログインを禁止するため、一般ユーザが``sudo su``でrootになれるようにします。
ユーザをsudoグループに追加することで可能になるため、以下のコマンドを実行します。オプションが``-G``だけだと指定したグループを追加ではなく置き換えになるため、``-aG``を指定します。

```
# usermod -aG sudo <ユーザID>
```

# 一般ユーザでのSSH公開鍵認証の設定
ローカルの端末でSSH鍵を作成します。

```
ssh-keygen -t rsa -b 4096 -f id_rsa_ubuntu
```

上記コマンドにより、id_rsa_ubuntuファイル(秘密鍵)、id_rsa_ubuntu.pubファイル(公開鍵)が作成されるので、id_rsa_ubuntu.pubファイル(公開鍵)の内容をコピーします。

次にUbuntu側で、対象の一般ユーザにsuし、``.ssh/authorized_keys``ファイルを作成・編集し、コピーした公開鍵の内容をペーストします。

```
# su - <ユーザID>
$ mkdir ~/.ssh
$ vi ~/.ssh/authorized_keys
```

この後一旦ログアウトし、一般ユーザでSSHアクセスできることを確認します。

```
ssh -i <秘密鍵ファイルのパス> <ユーザID>@<VSIのIPアドレス>
```

# rootでのSSHログインを禁止 & パスワード認証を無効化
rootでのSSHログインを禁止、パスワード認証を無効化するため、``/etc/ssh/sshd_config``ファイルを以下の通り編集します。

```
# rootのログイン許可設定。yes -> no に変更する。コメントアウトされている場合は解除して変更する。
PermitRootLogin no

# パスワード認証の設定。yes -> no に変更する。コメントアウトされている場合は解除して変更する。
PasswordAuthentication no
```

ファイルを保存した後、以下のコマンドでsshdを再起動します。

```bash
sudo /etc/init.d/ssh restart
```

[2021年5月追記]
なお、Ubuntu 20.04のインスタンスを作成した際、上記の設定だけではrootでのSSHログイン、および、パスワード認証を無効化できませんでした。``/etc/ssh/sshd_config.d/50-cloudimg-settings.conf`` というファイルにも同様の設定が記述されており、こちらも上記の通り yes -> no に変更する必要がありました。(/etc/ssh/sshd_config において、``/etc/ssh/sshd_config.d/*.conf`` をincludeする指定がされているので、実際のファイル名は前述とは異なっているかもしれません)


# デフォルトセキュリティグループの変更（アクセス元IPアドレスの限定）
VPCのセキュリティグループの設定で、アクセス元IPアドレスを特定のIPアドレスのみに限定します。

[VPCのセキュリティグループのページ](https://cloud.ibm.com/vpc-ext/network/securityGroups)にアクセスします。

対象のVPCにはデフォルトのセキュリティグループが存在するため、それを選択します。（この例ではsamplevpcというVPCのデフォルトセキュリティグループを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/b15172dd-39ef-35f7-7f9e-9a8a4143c313.png)

「ルール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/9398b3b5-6fad-3b7c-84c1-62cb40f2274c.png)

デフォルトのセキュリティグループのインバウンド・ルールでは、VPC作成時にデフォルト指定から変更していなければ、ポート22（SSH）のアクセスを任意のIPアドレスから受け付けています。これを特定のIPアドレスレンジのみに限定します。
「TCP」の行の右端の3点ブロックをクリックし、「削除」を選択して削除します。
次に、「作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/8a56748a-e43a-a294-7fc4-ca33ca0e026d.png)

新規のインバウンド・ルールとして、「プロトコル」に「TCP」、「ポート範囲」に最小値「22」、最大値「22」を指定します。
また、「CIDRブロック」を選択し、許可するアクセス元IPアドレスのレンジを指定し、「保存」ボタンをクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/523089e9-9d60-93f5-b9fe-0fc6e27215c6.png">

以下は、2種類のレンジを指定したルールを作成した後の状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/5d9e9799-431f-c0d7-974c-4dfe3fe76e05.png)

以上により、特定のIPアドレスからしかSSHアクセスできず、rootでのSSHログインが禁止され、パスワード認証も無効化された状態になりました。

# プロキシ指定でのSSHアクセス
昨今のリモート業務では自宅からサーバにアクセスするケースがありますが、その場合、インターネットプロバイダーにより動的にIPアドレスが割り振られ、IPアドレスレンジを絞れないケースがあります。会社でリモート用のHTTPプロキシが提供されている場合、そのプロキシを経由することで、IPアドレスを許可対象のIPアドレスに限定できる場合があります。

[HTTP Proxy経由でSSH接続する方法(Mac)](https://qiita.com/testnin2/items/1584e5863c3b149feb71)では、Macを使用した場合のHTTPプロキシ経由のSSHアクセスが紹介されています。これに沿って以下のコマンドを実行することで、アクセス元IPアドレスを許可対象のアドレスにすることが可能となります。

```
ssh -i <秘密鍵ファイルのパス> <ユーザID>@<VSIのIPアドレス> -o ProxyCommand='nc -X connect -x <HTTPプロキシのホスト名>:<HTTPプロキシのポート番号> %h %p'
```

なお、Windowsの場合は[プロキシ環境下のWindows10から外部へSSHでアクセスする方法](https://qiita.com/chacco38/items/873c48fbfefa0facc403)で同様に実施可能です。