ConoHa と CentOS7 でサーバー構築

# まえがき
あ＾〜！サーバーとかよくわからない〜！！！
でもなんか「美雲このはちゃん」っていう~~おっさん~~清楚可愛い娘がいるらしいじゃん！
兎にも角にも、お近づきになるにはVPS契約するしかないね！！！


# このドキュメントについて
Linux 初心者向けに [ConoHa VPS](https://www.conoha.jp/referral/?token=GSnzEuuq4sKditmUPXuUB09yaumCAkGKLHggrMI8hzGugEnkpUM-X45) で CentOS7 の環境構築を説明する記事です。
大半は CentOS の説明になると思うので、他の VPS についても適宜読み替えて頂ければ大丈夫かと思います。
決して GMO社 のステマではないので、AWS やさくらのVPS も良いかと思いますよ！(元も子もない)
VPS を契約する際は価格や性能、選択できるリージョンなどで比較するのが良いかと思いますが、個人的にはコントロールパネルの UI にこだわりが感じられるのと、このはちゃんというキャラクターを広報に利用しているという、まったくもって VPS と関係ない点において ConoHa に好感を持っています(こういうの地味に大事ですよね)。


# 前提条件
これから説明する作業を行うためには以下の知識や環境が必要です。

#### Terminal の基本操作
黒い画面に白や緑の文字がでてくるアレです。ハッカーみたいなやつ。
Windows の方は詳しくないですが、確か PuTTY や TeraTerm をインストールすれば良いはずです。
(知識のある人は zsh + zprezto あたりも導入しておくと快適かもですよ。)

#### vi (vim) の基本操作
vi (vim) はシンプルなテキストエディターです。
これからの作業を行う上で、何度も利用することがありますので予め覚えておくのが良いでしょう。
最低限下記のコマンドを理解すれば、これからの作業を行うことは可能です。

- `i` で編集モード開始
- `Esc` で編集モード終了
- `:wq + Enter` で保存して終了
- `:q! + Enter` で保存せずに終了
- `/文字列 + Enter` で文字列検索

他にも沢山コマンドがあるので詳しく知りたい方は調べてみてください。
(知識のある人は好きなエディターを使えばいいと思います。)

#### ssh の接続環境
ConoHa のコントロールパネルからコンソールを開いて作業することもできますが、慣れてくると面倒になってきますので、通常は Terminal から ssh を利用して ConoHa に接続します。
通常は問題ないかと思いますが、接続に失敗する場合はルーターやファイヤーウォールが 22番ポート を開放しているか確認してみてください。

#### Google先生
わからなくても諦めずにググるのが一番大事です(投げやり)。
このドキュメントは可能な限り初心者でも分かるように書いているつもりですが、網羅しきれていない項目があるかもしれません。
CentOS の操作は比較的ドキュメントが多いので、調べれば分かることも多いかと思いますので頑張ってみてください。


# サーバーを追加する
まずは ConoHa のアカウント登録をして、コントロールパネルにログインします。
支払設定や電話認証などを終えたら、メニューからサーバー追加を選択します。
今回追加するサーバーは以下の構成を想定しています(全てデフォルトのまま)。

- プラン
  - タイプ：VPS
  - リージョン：東京
  - メモリ：1GB
- イメージ
  - イメージタイプ：OS
  - OS：CentOS
  - バージョン：7.x (64bit)
  - rootパスワード：_強固なパスワードを指定_
- オプション
  - 自動バックアップ：無効
  - ディスク容量：SSD 50GB
  - 接続許可ポートIPv4：全て許可
  - 接続許可ポートIPv6：全て許可
  - SSH Key：使用しない
  - ネームタグ：_任意のサーバー名を指定_

追加してしばらくすると新しいサーバーが起動します。
起動したら設定内容を確認し、ネットワーク情報に表示されるIPアドレスをメモしておきましょう。


# ConoHa に接続する
Terminal を起動し、早速 ConoHa に接続してみましょう。

```
// ConoHa に接続する
$ ssh root@[IPアドレス]
```

`Password:` と表示されたら サーバー追加時に設定した root パスワードを入力すれば接続完了です。

#### Tips: `Are you sure you want to continue connecting?` が表示された場合
`yes` と入力するだけで大丈夫です。

#### Tips: `WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!` が表示された場合
`rm ~/.ssh/known_hosts` を実行してやり直してみてください。


# 一般ユーザーを作成する
あなたが普段 ConoHa を操作するためのユーザーを新規作成します。

```
// ユーザーを追加
$ useradd [好きなユーザー名を指定]
```

```
// パスワードを設定
$ passwd [ユーザー名]
```

#### Tips: 一般ユーザーを作成する理由
最初にログインした root ユーザーは最強の権限を持っており、ファイルの編集や削除など全ての操作を行うことが可能です。
しかしこのまま使い続けると、誤って Linux を動かすためのシステムファイルを消してしまうなどの事故が起こりかねません。
また最悪のケースとして何らかの理由でサーバーを乗っ取られてしまった場合に root 権限を奪われてしまうと大惨事です。
そのため権限の少ない一般ユーザーを作成して、普段はそちらを利用するのがお約束となっています。


# sudo コマンドを実行できるようにする
先程作成した一般ユーザーは少ない権限しか持っていません。
普段はそれで良いのですが、システムファイルを編集したい場合などは、一時的に権限が必要になることが有ります。
必要な時だけ root 権限を利用できる wheel グループにユーザーを追加し、`sudo` コマンドを実行できるようにします。

```
// ユーザーを wheel グループに追加する
$ gpasswd -a [ユーザー名] wheel
```

```
// wheel グループに属するユーザーが sudo コマンドを利用できるようにする
$ visudo

  // vi が起動するので、以下の行を探して編集する
  ## Allows people in group wheel to run all commands
  # %wheel ALL=(ALL) ALL     // この行の先頭にある # を消す
```

#### Tips: wheelグループへの追加について
- `gpasswd` ではなく `usermod -G wheel [ユーザー名]` でも wheel グループへの追加が可能です。  
  (ただし処理が若干異なりますので、特に理由がなければ `gpasswd` を使うのが良いかと思います。)
- "wheel" とは大物とか実力者という意味らしいです。

#### Tips: visudo について
- visudo で `# %wheel ALL=(ALL) NOPASSWD: ALL` のコメントを解除すれば `sudo` コマンドの実行時にパスワード入力が不要となります。


# su コマンドを制限する
`su` コマンドを利用するとユーザーを切り替えることが出来ます。
しかし自分以外のユーザーが `su` コマンドで root ユーザーに切り替えられてしまうのは困ります。
リスクを下げるために wheel グループのユーザー以外から root ユーザーへ切り替えできないように修正します。

```
// wheel グループ以外から su コマンドを実行できなくする
$ vim /etc/pam.d/su

  #auth required pam_wheel.so use_uid     // この行の先頭にある # を消す
```


# 確認する
ここまできたら一通り設定を確認してみましょう。
これらの設定が確認できたら、ひとまずの初期設定は完了です。

```
// root から作成したユーザーに切り替える
$ su [ユーザー名]
```

```
// sudo が使えることを確認する(以下の例ではパスワード入力すると"hello"と表示される)
$ sudo echo hello
```

```
// root ユーザーに戻る
$ exit
```

```
// ConoHa との接続を終了する
$ exit
```

```
// 一般ユーザーとしてログインできることを確認する
$ ssh [ユーザー名]@[IPアドレス]
```


# セキュリティーを強化する
ここまで出来たら、さらにセキュリティーを強化しておきましょう。

#### Tips: `Permit denied` が表示される場合
ここからの作業は一般ユーザーとして操作しますので、権限が必要なファイルを編集しようとするとエラーとなります。
その際はコマンドの先頭に `sudo` をつけることで、一時的に root 権限で命令を実行することが出来ます。


# 公開鍵と秘密鍵を生成する
いままではパスワードで ConoHa にログインしていましたが、鍵を使ってより強固にしましょう。
まずは ConoHa の鍵を生成します。

```
// ホームディレクトリに移動
$ cd ~/
```

```
// .ssh ディレクトリを作成
$ mkdir .ssh
```

```
// .ssh ディレクトリの権限を 700 に変更
$ chmod 700 .ssh
```

```
// .ssh ディレクトリに移動
$ cd .ssh
```

```
// 鍵を生成
$ ssh-keygen -t rsa -b 2048

  Enter file in which to save the key: [任意の鍵名を入力]
  Enter passphrase: [そのままEnterを押すか、パスワードを入力]
  Enter same passphrase again: [もう一度同じ入力をする]
```

```
$ chmod 600 [鍵名].pub
```


# リモートの SSH 設定を変更する
sshd_config を書き換えて、鍵認証でログインできるようにします。
加えてパスワードでのログインや root へのログインも制限します。

```
$ sudo vim /etc/ssh/sshd_config

  // 以下の行を探して、コメントを解除したり値を書き換えてください。

  // RSA認証を許可する
  RSAAuthentication yes

  // 公開鍵での認証を許可する
  PubkeyAuthentication yes

  // 公開鍵のファイル場所を指定する
  AuthorizedKeysFile .ssh/[鍵名].pub

  // パスワードでのログインを禁止する
  PasswordAuthentication no

  // root へ直接ログインを禁止する
  PermitRootLogin no
```

```
// SSH設定を反映する
$ sudo systemctl restart sshd.service
```

# 秘密鍵を保存する
先程生成した秘密鍵をローカルに保存します。

```
// 秘密鍵を表示 (表示されたら全てコピーしてください)
$ cat .ssh/[鍵名]
```

```
// ConoHa との接続を終了する
$ exit
```

```
// ローカルの .ssh ディレクトリへ移動
$ cd ~/.ssh
```

```
$ vim [鍵名]

  // vim が起動したら、先程コピーした秘密鍵をペーストします
  -----BEGIN RSA PRIVATE KEY-----
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
  -----END RSA PRIVATE KEY-----
```

```
// 鍵のパーミッションを600に変更
$ chmod 600 [鍵名]
```


# ローカルの SSH 設定を変更する
これからはパスワードではなく鍵認証でログインするようになります。
また毎回ユーザー名やIPアドレスを入力するのは面倒ですので、SSHの設定ファイルを作成します。

```
// ディレクトリ移動
$ cd ~/.ssh
```

```
// SSH の設定を追加する
$ vim config

  // 編集して以下の内容を入力する
  Host [任意の接続先名]
    HostName [IPアドレス]
    User [ユーザー名]
    Port 22
    IdentityFile ~/.ssh/[鍵名]
```


# 確認する
正しく設定できたか確認してみましょう。

```
// root でログインできないことを確認する
$ ssh root@[IPアドレス]
```

```
// 接続先名だけで接続できることを確認する
$ssh [接続先名]
```

#### Tips: `WARNING: UNPROTECTED PRIVATE KEY FILE!` が表示された場合
秘密鍵のパーミッションを 600 に変更したか確認してみましょう。

#### Tips: うまくいかない？
まだこの時点では ConoHa の初期設定しかしていませんので、もし上手く動かなくなっても大丈夫です。
もし SSH から接続できなくなった場合は、ConoHa コントロールパネルからコンソールが起動できます。
VPS は何度でもリセットできますし、覚えるためにも最初からやり直してしまっても良いかと思います。
一つずつ操作を再確認し、わからないことがあればGoogle先生で調べてみるのが近道です。


# システムを最新にする
最後は `yum` コマンドで CentOS を最新の状態にアップデートします。

```
// システムを最新にする
$ sudo yum -y update
```

#### Tips: yum コマンドについて
`yum` を利用すると機能を追加したり更新したりすることができます。
ここでは割愛しますが、例として以下を実行すると開発ツール群を追加することができます。

```
// 開発ツール群をインストールする
$ yum -y groupinstall base "Development tools"
```


# まとめ
お疲れ様でした！設定は問題なく出来たでしょうか？
他にもポート番号を変更したり、ファイアウォールの設定をしたりなど、用途に合わせて適宜設定するのが良いでしょう。
拙い文章で恐縮ですが、もし何らかのお役に立てたならば幸いです。
ここまでお読み頂き有難うございました！


# おさらい (いそがしい人向け)
ここまでの一連の流れをまとめました。
以下の設定を想定して記述しています。
確認などは省略していますので適宜宜しくお願いします。

- IPアドレス：999.999.999.999
- ユーザー名：conoha
- 秘密鍵名：conoha_key
- 公開鍵名：conoha_key.pub
- ローカルSSH接続先名：conoha_vps

```
$ ssh root@999.999.999.999

----------

$ useradd conoha

$ passwd conoha
    New password: **********
    Retype new password: **********

$ gpasswd -a conoha wheel

$ visudo

    # %wheel ALL=(ALL) ALL // コメント解除

$ vim /etc/pam.d/su

    # auth required pam_wheel.so use_uid // コメント解除

$ su conoha

$ cd ~/

$ mkdir .ssh

$ chmod 700 .ssh

$ cd .ssh

$ ssh-keygen -t rsa -b 2048

    Enter file in which to save the key: conoha_key
    Enter passphrase: **********
    Enter same passphrase again: **********

$ chmod 600 conoha_key.pub

$ sudo vim /etc/ssh/sshd_config

    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/conoha_key.pub
    PasswordAuthentication no
    PermitRootLogin no

$ sudo systemctl restart sshd.service

$ cat conoha_key // 秘密鍵をコピー

$ exit

$ exit

----------

$ cd ~/.ssh

$ vim conoha_key // 秘密鍵をペースト

$ chmod 600 conoha_key

$ vim config
  Host conoha_vps
    HostName 999.999.999.999
    User conoha
    Port 22
    IdentityFile ~/.ssh/conoha_key

$ ssh conoha_vps

$ sudo yum -y update
```

# あとがき
このはちゃんグッズほしいなぁ〜(ﾁﾗｯﾁﾗｯ

追記：↑って書いたら、このはちゃんから怒られました（ ＾ω＾）
https://twitter.com/MikumoConoHa/status/741082916713701376