VPSのユーザー追加とrootログイン禁止（ConoHaの場合）

## 用意するもの
* Conoha VPS
  * OS > CentOS 6.5
  * rootパスワード > 任意
  * 他デフォルト
* VPSにsshする [.ssh/config と秘密鍵 conoha_default.key][1]
* ターミナルか、cmder推奨

### やること
1. rootでユーザーを作成して、
2. そのユーザーで鍵認証できたら、
3. そのユーザーの鍵認証以外を禁止する。

### 前提
以下のような`.ssh/config`

```bash
Host myvps
 HostName      myvps.example.com
 IdentityFile  ~/Download/conoha_default.key
 Port          22
 User          root
```

で、vpsが`ssh myvps`コマンドから、rootログイン出来る状態。もしくは

```bash
ssh root@myvps.example.com -p 22 -i ~/Download/conoha_default.key
```
でrootログインできる状態

## 1 ユーザーの作成

__`ssh myvps`__

```bash
adduser 59naga
passwd 59naga # 任意
gpasswd -a 59naga wheel

id 59naga
# uid=500(59naga) gid=500(59naga) groups=500(59naga),10(wheel)
```

以上で、wheelグループの59nagaユーザーを作成できた。

### 認証用のディレクトリを作成する

```bash
cd /home/59naga/
mkdir .ssh
chmod 700 .ssh
chown 59naga .ssh

ls -la
# drwx------  2 59naga root   4096 Mar  1 14:59 .ssh
```

`/home/59naga/.ssh`ディレクトリを700で作成できた。

### wheelグループに特権を与える

__`visudo`__

```bash
# %wheel ALL=(ALL)       ALL
%wheel ALL=(ALL)       ALL
```

以上で、作成したユーザーで`su`コマンドを使用できるようになった。

> [sudoを使えるようにします(wheelグループが)][2]

## 2 秘密鍵・公開鍵の作成

ログアウトして、ローカルの`~/.ssh`で作業する。

```bash
cd ~/.ssh
ssh-keygen -t rsa -b 2048
```

ssh-keygen後の

* Enter file in which to save the key は `myvps`
* Enter passphrase と Enter same passphrase againは（空）とした

```bash
ls -la
#-rw-------   1 59naga  staff  1766 Mar  1 09:55 myvps
#-rw-r--r--   1 59naga  staff   399 Mar  1 09:55 myvps.pub
```

以上でローカルに、秘密鍵`~/.ssh/myvps`と、公開鍵`~/.ssh/myvps.pub`が作成できた。

### 公開鍵をサーバーへアップロードする

```bash
scp myvps.pub myvps:/home/59naga/.ssh/
# myvps.pub     100%  399     0.4KB/s   00:00
```

で、公開鍵をユーザーの`~/.ssh`ディレクトリにアップロードできた。

### サーバーに認識させる

アップロードしただけでは公開鍵を見てくれないので、公開鍵と、その設定を修正する

__`ssh myvps`__

```bash
cd /home/59naga/.ssh/
mv myvps.pub authorized_keys
chmod 600 authorized_keys
chown 59naga authorized_keys

ls -la
# -rw------- 1 59naga root    399 Mar  1 10:00 authorized_keys
```

authorized_keysを600で、所有者を作成したユーザーに変更した。

__`sudo vi /etc/ssh/sshd_config`__

```bash
#RSAAuthentication yes
RSAAuthentication yes
#PubkeyAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile      .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys
```

以上のパラメータを書き換え、`/etc/ssh/sshd_config`を適用するため、sshdを再起動する

```bash
sudo service sshd restart
```

正しく設定できていれば

```bash
ssh 59naga@myvps.example.com -p 22 -i myvps
# Identity added: myvps (myvps)
[59naga@myvps ~]$ 
```

で、秘密鍵を提示して、作成したユーザーとしてログインできるようになった。

configを書き換える場合は、IdentityFileの値を`~/.ssh/myvps`、Userの値を`59naga`に変えることで、`ssh myvps`できる。

## 3 そのユーザーの鍵認証以外を禁止する

![睡眠はしっかり取ろう](https://pbs.twimg.com/media/B-9O4Y7U0AEpKJI.png)

以降の作業、手順を間違えるとsshに入れなくなったりするので、取り扱いに注意すること。

まず、rootに戻るために`su`でrootパスワードを入力し、rootユーザーに戻る。その後
__`sudo vi /etc/ssh/sshd_config`__

```bash
#PermitRootLogin yes
PermitRootLogin no # コメント外しただけではyesなのでnoにする

#RhostsRSAAuthentication no
RhostsRSAAuthentication no

#PasswordAuthentication yes
PasswordAuthentication no # コメント外しただけではyesなのでnoにする

#PermitEmptyPasswords no
PermitEmptyPasswords no
```

再起動して適用する

```bash
service sshd restart
```

以上で、これまで使っていたrootユーザーのログインが禁止されるようになった。

```bash
ssh root@myvps.example.com -p 22 -i ~/Download/conoha_default.key
# Received disconnect from *.*.*.*: 2: Too many authentication failures for root
```

以降は作成したユーザーから秘密鍵でログインする。

> [RSA公開鍵認証の有効化とパスワード認証の無効化][3]

### 認証ポートを22から10022に変更する

__`sudo vi /etc/ssh/sshd_config`__

```bash
#Port 22
Port 10022
```

__`sudo vi /etc/sysconfig/iptables`__

```bash
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
```

再起動して上記２ファイルを適用する

```bash
service sshd restart && service iptables restart
#sshd を停止中:                                             [  OK  ]
#sshd を起動中:                                             [  OK  ]
#iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
#iptables: ファイアウォールルールを消去中:                  [  OK  ]
#iptables: モジュールを取り外し中:                          [  OK  ]
#iptables: ファイアウォールルールを適用中:                  [  OK  ]
```

configやsshコマンドの`-p`も忘れず10022に変えること。

> [SSH 接続のポート番号を変更 〜 CentOS6][4]

### ついでに warning: setlocale を黙らせる

__`vim /etc/sysconfig/i18n`__

before

```bash
LANG=en_US.UTF-8
SYSFONT=latarcyrheb-sun16
```

after

```bash
#LANG=en_US.UTF-8
SYSFONT=latarcyrheb-sun16

LC_CTYPE="ja_JP.utf8"

LANG="ja_JP.utf8"
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
```

> [sshでログインした時、localeまわりでエラーが出た場合の対処法][5]

## はしがき
久しぶりにvps触ったら、わりと迷子になったので、上から下にコピペで環境整うような文書を書いた。

そのほか、

* sshコマンドの`-vvv`オプションで、デバッグログが拾えるので、詰まった時ググりやすかった
* sshしたとき、WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!みたいなメッセージが出たら、`~/.ssh/known_hosts`の`myvps.example.com`の行を消して再認証させると黙る

<!-- あとは、ドメインを当てて、サブドメインを切って、それにDockerを割り当てて、サービスを量産したい -->

[1]: http://qiita.com/harapeko_wktk/items/ad4a2e0cb7f00fdfbf0d#2-13
[2]: http://qiita.com/harapeko_wktk/items/ad4a2e0cb7f00fdfbf0d#1-7
[3]: http://gentoo.reichsarchiv.jp/item/17
[4]: http://easyramble.com/change-ssh-port-number.html
[5]: http://qiita.com/kuronuko/items/ae84ffa8e61c054320fd