Linode で仮想マシンを作ったらまずやること

## はじめに
Linode を使用すると簡単に仮想マシンを作成できます。しかし、作成後、デフォルトの状態ではセキュリティ上危険なままサーバーが公開されてしまいます。
そこで、この記事では Linode で最低限設定しておくべきセキュリティ設定と、その設定を自動化する方法についてご紹介します。

## なにが危険か？
最も危険なのは、root ユーザーがパスワードを利用してログインできる状態で公開される点です。


## どのように設定すればよいか？
具体的には管理用ユーザー作成と SSH 周りの設定をします。
例として Redhat 系 OS で説明します。流れは公式ガイドの通りです。

https://www.linode.com/docs/guides/set-up-and-secure/

### ユーザーの作成
管理コンソールなどでログインしたあと、まずはユーザーを作成します。
(example_user は作成するユーザー名、192.0.2.1 は作成した仮想マシンのIPアドレスと読み替えてください)

```
$ useradd example_user
```

次に、作成したユーザーのパスワードを設定します。

```
$ passwd example_user
```

今回は管理者ユーザーの作成なので、sudo 権限を付与します。

```
$ usermod -aG wheel example_user
```

作成したユーザーでログインしてみます。

```
$ ssh example_user@192.0.2.1
```

設定したパスワードでログインできたらOKです。

また、SSH の設定でパスワード認証を無効化して、ブルートフォース攻撃を防ぐために、公開鍵を登録します。
アクセスするユーザー側の環境により方法は異なります。
こちらは Linux や Mac での例です。

```
$ ssh-copy-id example_user@192.0.2.1
```

これでユーザー作成は完了です。

### SSH の設定 - root ユーザーでのログインとパスワード認証の無効化
OpenSSH Server はデフォルトで起動しているため、設定ファイル `/etc/ssh/sshd_config` を編集します。
今回は Root でのログインとパスワード認証を無効化します。

``` 
#PermitRootLogin yes
↓
PermitRootLogin no

PasswordAuthentication yes
↓
PasswordAuthentication no
```

設定反映のため、OpenSSH Server を再起動します。
```
$ systemctl restart sshd
```

こちらで完了です。
慣れていればなんてことはない作業ですが、なかなか面倒ですね。


## StackScripts とは？
StackScripts を使えば、ここまでの設定の投入も自動化できます。
StackScripts の概要はこちらの記事をご覧ください。

https://qiita.com/isss802/items/d6e59063d3473659983d

今回は StackScripts を利用してユーザー作成と SSH 設定を自動化したいと思います。

## StackScripts で設定してみよう
### 利用する StackScripts
早速ですが今回利用する StackScripts の内容です。
順番に解説していきます。

```bash
#!/bin/bash

#<UDF name="username" label="SSH Username" default="">
#<UDF name="password" label="SSH Password" default="">
#<UDF name="publickey" label="SSH Public Key" default="">
#<UDF name="disable_root" label="Disable root login for SSH" oneOf="Yes,No" default="Yes">

source <ssinclude StackScriptID=1>

if [ "$USERNAME" ] && [ "PASSWORD" ]; then
    user_add_sudo "$USERNAME" "$PASSWORD"
    
    if user_add_pubkey "$USERNAME" "$PUBLICKEY" && [ "$DISABLE_ROOT" == "Yes" ]; then
        ssh_disable_root
    fi
fi
```

`#<UDF 〜>` ではユーザー定義の変数を定義しています。
こちらを定義すると、仮想マシン作成時にフォーム形式でパラメーターを指定できます。
今回は作成するユーザー、パスワード、公開鍵、そして SSH での root ログインの無効化についてフォーム上で入力、または選択できるようにします。

`source <ssinclude StackScriptID=1>` ではコミュニティで公開されている StackScripts ID=1 をインポートしています。
こちらで利用している StackScripts は Linode 公式が提供している Bash ライブラリです。

https://cloud.linode.com/stackscripts/1

すでにある資産を利用できるため便利ですね。


その後はユーザー名やパスワードが入力されている場合に処理を走らせる形にしています。
if の中にある `user_add_sudo` や `user_add_pubkey`、`ssh_disable_root` は上記のライブラリで定義されている関数です。
名前のとおりですが、それぞれの役割は以下となります。

| 関数名 | 用途 |
|:-:|:-:|
| user_add_sudo | ユーザー作成、sudo 権限付与 | 
| user_add_pubkey | ユーザーの公開鍵登録 | 
| ssh_disable_root | root ログイン無効化、パスワード認証無効化 | 

### StackScripts を利用して仮想マシンを作成する
StackScripts の作成が完了したら仮想マシンを作成していきましょう。
さきほど定義した変数の入力フォームが表示されますので、必要情報を入力し仮想マシンを作成します。
![DeployStackScripts.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711428/950d42ff-f2f5-6d35-cb8e-2310e9c001ff.jpeg)

仮想マシンの作成が完了したら作成したユーザーにて公開鍵認証でログインします。
（公開鍵は利用しているものに読み替えてください）

```
$ ssh -i .ssh/id_rsa example_user@192.0.2.1
[example_user@192-0-2-1 ~]$
```

ログインできればOKです。
続いて sudo 権限が付与されているか確かめてみましょう。

```
$ groups
```
こちらのコマンドの結果に、Redhat 系では `wheel`、debian 系では `sudo` が含まれていれば OK です。

続いて root でログインできないことも確かめてみましょう。
`Permission denied` が表示されれば OK です。
```
$ ssh root@192.0.2.1
root@192.0.2.1: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

## さいごに
今回は Linode での最低限のセキュリティ設定と StackScripts での自動化についてご紹介しました。
設定した項目以外にも環境によっては必要なセキュリティ設定の追加が生じると思います。
その際も複数の仮想マシンで同じ作業を繰り返すのは生産的ではないので、ぜひ StackScripts をご活用ください。