CentOS7.3でSSH接続(公開鍵認証)する方法

## はじめに

[こちらの記事](http://qiita.com/uhooi/items/ab845b06b136e623e51d)ではパスワード認証を用いてSSH接続する方法を紹介しました。しかし、パスワード認証はセキュリティ上望ましくないため、第三者がアクセスする可能性があるサーバーでは、公開鍵認証を用いてSSH接続するのが一般的です。

## 環境

- サーバーOS：CentOS 7.3-1611 64bit Minimal
- クライアントOS：Windows 8.1 Pro 64bit

## 前提条件

- `sudo` できる一般ユーザーでログインしている  
対象の一般ユーザーが存在しない場合、[こちら](http://qiita.com/uhooi/items/ab845b06b136e623e51d#%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90)を参照して作成してください。

## セットアップ(クライアント)

まずはクライアント側の作業です。

### 鍵ペアの作成

公開鍵認証に必要な秘密鍵(id_rsa)と公開鍵(id_rsa.pub)のペアを作成します。
鍵ペアはクライアント側で作成し、サーバーへ公開鍵を送信するのが望ましいです。サーバー側や他の端末でも作成できますが、秘密鍵をクライアントへ送信するときに外部へ漏れないように注意する必要があります。

Macの場合はターミナル、Windowsの場合はGit bashを起動し、 `ssh-keygen` コマンドを実行して作成します。

```shell-session
$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
…
```

`-t` オプションで、作成する鍵の種類を指定します。 `rsa` を指定すると、SSHプロトコルバージョン2のRSA鍵が作成されます。公開鍵暗号方式は主にRSAが使用されています。
`-b` オプションで、作成する鍵のサイズを指定します。2048bit以上なら問題ない強度ですが、より強固にするためにここでは4096bitを指定します。

`-f` オプションで鍵ペアの保存先を指定しない場合、デフォルトのパス `/c/Users/{ユーザー名}/.ssh/id_rsa` でいいか確認されます。問題なければそのまま<kbd>Enter</kbd>キーを押下します。公開鍵の名前は秘密鍵の名前の末尾に `.pub` が付いたものになります。

```shell-session
Enter file in which to save the key (/c/Users/{ユーザー名}/.ssh/id_rsa):
```

秘密鍵に設定するパスフレーズの入力を求められるので、2回入力します。このパスフレーズは秘密鍵の使用時(SSHログイン時)に必要であり、接続先の端末には送信されません。

```shell-session
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

### 公開鍵のアップロード

公開鍵をサーバーへアップロードします。サーバーへ登録したら削除するため、ここでは一時ファイル置き場である `/tmp` フォルダへアップロードします。

```shell-session
$ scp ~/.ssh/id_rsa.pub {ユーザー名}@{ホスト名}:/tmp
```

サーバーへアップロードする方法は何でも構いません。もっというと、公開鍵の文字列をサーバーに入力できればアップロードしなくてもいいです。

## セットアップ(サーバー)

ここからはサーバー側の作業です。

### SSHサーバーのインストール

CentOS 7.3では `openssh-server` がプリインストールされているため、インストール作業は不要です。

### SSHの設定

SSHの設定ファイルを表の通りに修正し、セキュリティの強度を上げます。

```shell-session
$ sudo vi /etc/ssh/sshd_config
```

|説明|変更前|変更後|
|:--|:--|:--|
|rootユーザーによるログインを許可するか|`#PermitRootLogin yes`|`PermitRootLogin no`|
|パスワード認証を許可するか|`#PasswordAuthentication yes`|`PasswordAuthentication no`|
|パスワードなしを許可するか|`#PermitEmptyPasswords no`|`PermitEmptyPasswords no`|

### SSHサービスの起動

SSHのサービスを起動します。

```shell-session
$ sudo systemctl start sshd.service
```

サービスが起動したか確認します。

```shell-session
$ sudo systemctl status sshd.service
```

緑の字で `active (running)` と表示されたらSSHのサービスが起動しています。

### ファイアウォールの設定

CentOS 7.3ではSSH用のポートが元から開放されているため、設定は不要です。

### ネットワークの設定

OSの起動時に自動でネットワークに接続するようにします。

```shell-session
$ sudo nmcli c mod enp0s3 connection.autoconnect yes
```

`c` は `connection` の略です。

### IPアドレスの確認

```shell-session
$ ip a show enp0s3
```

`inet` から始まる箇所がサーバーのIPアドレス(IPv4)です。

### 公開鍵の登録

クライアントからアップロードした公開鍵を登録します。 `~/.ssh/authorized_keys` に公開鍵の内容を追記することで登録が完了します。 `authorized_keys` には複数の公開鍵を登録することもできます。そのため、`mv` でなく `cat` で追記します。

```bash
# `~/.ssh` フォルダが存在しない場合、作成する
$ mkdir ~/.ssh

# `~/.ssh/authorized_keys` に公開鍵の内容を追記する
$ cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

# 所有者(今ログインしているユーザー)以外のアクセスを許可しない
$ chmod 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys

# 登録済の公開鍵は削除しておく
$ rm /tmp/id_rsa.pub
```

## SSH接続方法(クライアント)

Macの場合はターミナル、Windowsの場合はGit bashの他、Tera TermやPuTTYなどのSSHクライアントからSSH接続できます。

### SSH接続の開始

```shell-session
$ ssh -i ~/.ssh/id_rsa {ユーザー名}@{ホスト名}
```

`-i` オプションで接続先に登録した公開鍵とペアになっている秘密鍵を指定します。

パスフレーズの入力を求められますので、秘密鍵に設定したパスフレーズを入力して<kbd>Enter</kbd>キーを押下します。

```shell-session
Enter passphrase for key '/c/Users/{ユーザー名}/.ssh/id_rsa':
```

### SSH接続の終了

```shell-session
$ exit
```

## 参考リンク

- [CentOS7.2 64bit SSHで公開鍵認証を使用 | kakiro-web カキローウェブ](http://www.kakiro-web.com/memo/centos-ssh-public-key-auth.html)
- [お前らのSSH Keysの作り方は間違っている - Qiita](http://qiita.com/suthio/items/2760e4cff0e185fe2db9)
- [サーバー作成直後に設定しておくべき初期セキュリティ設定 — さくらの VPS マニュアル](https://manual.sakura.ad.jp/vps/support/security/firstsecurity.html)