sshを使うための各設定


# sshにまつわる設定変更集
[sshログイン方法を選択する場合のなんとなくな感覚](http://qiita.com/kobin/items/a79a356af2ba8418261c)で紹介した設定変更の実際の手順をご紹介します。
長いので必要な場所だけ見てもらえればいいと思います。

# sshを変更する際のお約束
ここで説明する各設定手順を実行後は、sshdの再起動を実行してください。

```bash
$ sudo service sshd restart
```

ここで注意事項です。
OS搭載機器を目の前にしてローカルのコンソールを使って設定する場合は、失敗したら元に戻せばいいので特に気にする必要はありません。
しかし、sshを使ってsshdの変更をしなければいけないケースが多々有ります。
当然記述ミスや設定値の間違いなどで、再起動後につながらなくなっていまうおそれがあります。

そんな困った状況を避けるため、sshdは再起動しても接続済みのセッションは維持してくれる親切設計になっています。
この機能を保険として、何かを変更する際にはターミナルを2つ起動して、接続済みセッションを用意しておくよう心がけましょう。

# rootログインの禁止

rootログインを禁止しないとrootログインを試みるアタックがきます。
この手のエントリには必ず書いてあることなのですが必ず来ます。
よっぽどな事情が無い限り、これは必ず設定しましょう。
*/etc/ssh/sshd_config* を下記の通りに設定します。

```/etc/ssh/sshd_config
PermitRootLogin no
```

CentOSがこの設定を標準にしてくれたらいいのにと、設定するたびに思います。

# ポート番号の変更
ポート番号の変更は、インターネット側から接続できるようにする場合は必ずやります。
インターネットに開放しておくと当たり前のように知らない人からログイン要求がやってきますので、やらないと大変危険です。
*/etc/ssh/sshd_config* を下記の通りに設定します。

```/etc/ssh/sshd_config
Port xxxxx #1024-65535の間で任意の数字
```

数字は1023以下を使ってはいけません。必ず1024以上の数字を使うようにしましょう。
このポート番号の変更と、前述したrootログインの禁止を行うだけで、アタックされるリスクがぐっと減ります。

ちなみに、「2022」や「20022」といった、末尾を「22」にするパターンは避けるようにしています。なんとなく嫌だから。

# IP制限
接続する端末や環境のIPが確定できるなら、このIPアドレスからしかsshを受け付けないよ！という宣言をすることにより、ssh接続するネットワークやホストを制限できます。

固定IPを持っている場合にとても有効ですが、外出先からつなぐとか、お家帰って風呂あがりのビール飲んでる時にメンテナンスしろとか言われた時に困りますから、状況によって設定してください。

Linuxの設定ファイルである、 */etc/hosts.allow* と */etc/host.deny* を使って設定していきます。
まず、hosts.denyで以下のように記述して、sshdは原則的に全員から拒否しますよ。と宣言します。

```/etc/hosts.deny
sshd : ALL
```

denyの発音は、でぬぁい（艶やかに）

上記設定に併せて、hosts.allowで、許可するIPアドレスを記載していきます。この設定が「他みんな拒否するけどおまえだけ特別許したるで」というIPアドレスを指定できます。

```/etc/hosts.allow
sshd : IPアドレス #利用を許可するIPアドレス
```

IP制限は特にインターネットを経由する場合など安心感があってよいですね。

# ポートフォワードの禁止
sshにはポートフォワード機能という、それはそれは便利な機能があります。
便利すぎるので、一度ssh接続を許可してしまうとさまざまなことに利用されてしまう可能性があります。
sshを経由した他のシステムへの影響を小さくするためにも、機能を停止させます。
停止させるには */etc/ssh/sshd_config* の設定を以下のとおりにします。

```/etc/ssh/sshd_config
AllowTcpForwarding no
```

この設定が反映されれば、便利機能は使用できなくなります。

# 公開鍵認証
実際にLinux側のアカウントのパスワードは使わず、鍵ファイルとよばれるファイルを使ってsshログインをする手法です。
この認証方式を確保した後、パスワード認証を禁止することにより、パスワードを使ったログインが禁止され、パスワードが関連するアタックや不正侵入に対して非常に強い耐性を持ちます。
ちょっと長いですけど、手順を書きます。

## 公開鍵認証の許可
まずはじめに、公開鍵が利用できるように */etc/ssh/sshd_config* を以下のとおりに書き換えます。

```/etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
```

この設定を反映させると、公開鍵認証の許可されるようになります。

## 鍵の作成
公開鍵認証を利用させたいユーザーでログインして実行します。
もちろん、ssh接続上でやっても問題ありません。
まずは、ssh-keygenコマンドを利用して、鍵ファイルを作成していきます。

```bash
$ ssh-keygen -t rsa
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): #保存場所を入力
Enter passphrase (empty for no passphrase): #鍵ファイルのパスワードを入力
Enter same passphrase again: #パスワード確認
...
...

```

保存場所と、鍵ファイルに対してつけるパスワードを入力します。
ここで設定するパスワードは **Linuxアカウントのパスワードではなく、鍵ファイル自体につけるパスワードです。** 
ここで新たにパスワードを作成します。
もちろん、アカウントとは違うパスワードで設定しましょう。

以上の手順を行うと以下のファイルが作成されます。

```bash
$ ls ~/.ssh
id_rsa id_rsa.pub
```

id_rsaが秘密鍵、id_rsa.pubが公開鍵と呼ばれるファイルになります。
この2つのファイルがペアで動作し、それぞれが鍵と錠前のような役割をします。

## 公開鍵の登録
鍵ペアの作成が終わったら、公開鍵を公開鍵認証で利用できるように、 *~/.ssh/authorized_keys* というファイルに公開鍵を登録していきます。
併せて、パーミッションの設定も行います。これをちゃんと設定しないと、セキュリティが甘いという認識になり、ログインできません。

```bash
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600  ~/.ssh/authorized_keys

```

これで、公開鍵(id_rsa.pub)が登録された状態になりました。

## 秘密鍵の取得
公開鍵が登録されたので、ペアとなる秘密鍵(id_rsa)を取得します。
これは、クライアント側で利用されるファイルになるので、何らかの手段でローカル端末に持ってくる必要があります。
各種ファイル転送でダウンロードするのも良いですが、catでファイルの中身を表示してコピペしたものをローカル端末で保存するのも手っ取り早くて良いかと思います。

```bash
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,8370A47B40649787

3B7T0R9Po5ITBd0BUIgn4F7tabB64/dcyVfCbwGFPqZC+16i8IjvymIOSrqIZ+1K
...
...
-----END RSA PRIVATE KEY-----

```

中身はテキストファイルなので、ターミナルの表示をコピーしてメモ帳などのテキストエディタにペタリと貼って保存しましょう。
なんとなくでお分かりかと思いますが、 **-----BEGIN RSA PRIVATE KEY-----** から **-----END RSA PRIVATE KEY-----** をコピーすれば大丈夫です。
ファイル名は何でもかまいませんが、僕は端末名を記述するようにしています。

例: sv01.id_rsa

## 秘密鍵ファイルを使ったsshログイン
公開鍵をサーバーに登録して、秘密鍵ファイルが手元にくればもうログインは目の前です。

### MacやLinuxの場合
MacやLinuxの場合はターミナルから利用が可能ですが、公開鍵同様、秘密鍵ファイルのパーミッション設定を正しくしておく必要があります。
chmodコマンドを利用して、ローカル端末で保存した秘密鍵ファイルのパーミッションを変更しましょう。

```bash
$ chmod 400 sv01.id_rsa
```

パーミッションが正しく設定できれば、sshのコマンドに-iをつけて、秘密鍵を指定してあげるだけです。

```bash
$ ssh -i sv01.id_rsa ユーザー@ホスト
```

この際パスワードを聞かれますが、鍵ファイル生成時に設定したパスワードを入力すれば、目的のホストにログインすることができます。

### Windowsの場合
Windowsの場合は使っているソフトウェア毎に設定が変わります。
Tera Termはそのまま鍵ファイルが利用できるようですので、そちらを使うのがよさそうですね。

## パスワードログインの禁止
ここまでの作業で公開鍵認証ができるようになったら、最後の作業としてパスワードログインの停止を行います。
この作業が終われば、秘密鍵ファイルを持っている人だけしかsshが使えない環境ができあがります。

サーバーに管理者権限でログインして */etc/ssh/sshd_config* を書き換えます。

```/etc/ssh/sshd_config
PasswordAuthentication no
```

以上で公開鍵認証の設定は終わりです。
パスワードの管理と同様に、鍵の管理は厳重にしておくよう心がけてください。

以上で公開鍵認証の設定は終了です。
サービスをリスタートして、設定を反映させてください。

# おわりに
説明長かったけど、よいsshライフを！