ssh公開鍵認証設定まとめ

# ssh 公開鍵認証設定まとめ

sshでLinuxサーバーへ接続する際のまとめ。
クライアント: Mac
サーバー: CentOS 6.5
を想定

## 公開鍵、秘密鍵を生成する

```bash
# このコマンドの後にパスワードの設定を聞かれる。
# パスワード無しの場合は何も入力せずにEnterを押す (非推奨)
ssh-keygen -t rsa
```

デフォルトの設定では、

公開鍵: ~/.ssh/id_rsa.pub
秘密鍵: ~/.ssh/id_rsa

秘密鍵は **絶対に流出させない** ようにすること。
流出したら鍵を作りなおして、サーバーに登録した公開鍵を削除して登録しなおせば良い。


※2018/10/02追記
最近はrsa鍵を使うのは古い。
おすすめはecdsa、CentOS5等古い環境にアクセスするならrsa、ssh周りの知識があるならed25519が良さげ。
* ecdsa 521bit(512bitではない) `ssh-keygen -t ecdsa -b 521`
* ed25519 `ssh-keygen -t ed25519`


### 秘密鍵をキーチェインに登録しておく(Mac限定)

sshするたびに秘密鍵のパスワード打つのは面倒臭いので、
Macの場合はキーチェインに登録が便利に使える。
ただし、Macを乗っ取られた際のリスクは増すので注意すること。

```bash
# ssh-agentへ登録する (-KオプションはMacのみ使用できる)
ssh-add -K ~/.ssh/id_rsa
```

※2019/06/11追記  
最近のMacに載ってる `ssh-add` では `-K` オプションは少し違うらしい。  
`-K` オプションでキーチェーンに鍵を登録、 `ssh-add -A` でキーチェーンに登録してある鍵をエージェントに追加になっている。

## 公開鍵をサーバーに登録する

公開鍵を対象サーバーの`~/.ssh/authorized_keys`へ登録する。

### ssh-copy-id を使用して登録

最も簡単な方法。
MacではHomebrewを使用すれば、`ssh-copy-id`コマンドを簡単にインストールできる。

```bash
# コマンド入れてなければ入れる。
brew install ssh-copy-id
# sshするのと同じ感覚でオプションを入れる
# -i オプションを使うと、登録する公開鍵を選べる。
ssh-copy-id hoge_user@hogehoge.hoge.com
```

### 手動で登録

手動で登録する際は少々面倒くさい。
対象サーバーのユーザーへ初めて鍵登録する際は、パーミッションの設定が必要になる。
とりあえず、フォルダとファイルを作る

```bash
# ログイン
ssh hoge_user@hogehoge.hoge.com
# フォルダとファイルを作る(既に存在している場合は実行しなくても可)
mkdir .ssh
touch .ssh/authorized_keys
# 権限の設定。個々を間違えると、公開鍵認証でログイン出来ないので注意
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
```

この後、公開鍵をサーバーへ持って行ってauthorized_keysへ追記する必要がある。
主に2パターン方法がある。

#### ワンライナーで対象サーバーのauthorized_keysへ追記する

推奨。簡単にできる。

```bash
cat ~/.ssh/id_rsa.pub | ssh hoge_user@hogehoge.hoge.com 'cat >> .ssh/authorized_keys'
```

#### scpで公開鍵を対象サーバーへ持って行ってauthorized_keysへ追記する

ちょっと面倒臭いが、初心者でも動作を追っていくことが簡単にできる。

```bash
scp ~/.ssh/id_rsa.pub hoge_user@hogehoge.hoge.com:
ssh hoge_user@hogehoge.hoge.com
# ログイン後
cat id_rsa.pub >> .ssh/authorized_keys
```

## 公開鍵認証で接続できるか確認

無事、鍵認証設定ができていれば、サーバーのパスフレーズを入力せずにログインができる。

```bash
ssh hoge_user@hogehoge.hoge.com
```

## パスワード認証を禁止する

せっかく公開鍵認証を設定したのだから、パスフレーズ認証を禁止してしまおう。

```bash
# 対象サーバーへログインした状態
sudo vi /etc/ssh/sshd_config
# PasswordAuthentication no
# ChallengeResponseAuthentication no
# へ設定する
```

この後、sshdを再起動させることになるが **すぐにログアウトはしないこと**

```bash
# CentOS 6
sudo service sshd restart
# CentOS 7
sudo systemctl restart sshd
```

**ログアウトせずに、** ターミナル等の別タブで開いてssh接続ができるか確認する。
無事、接続できたらログアウトして良い。
公開鍵認証設定OK!

※sshd再起動後、鍵登録が正常にできていなかった場合、サーバーへVNCできるか物理アクセスできないと **詰みます**


## 番外編

### ssh configの設定

少しだけ触れておきます。
sshで毎回

```bash
ssh hoge@hogehoge.com
```

とか手打ちするのは結構面倒くさい。
クライアント側で `~/.ssh/config` を設定すると、

```bash
ssh hg
```

とかで接続できるようになる。
設定方法は

```bash
vi ~/.ssh/config
```

```
Host hg
  HostName hogehoge.com
  User hoge
  IdentityFile ~/.ssh/id_rsa
```

のような形式。
その他、使用する鍵ファイルの設定や多段sshの設定もできたりするので、覚えておくと吉。

※2018/10/02追記 多段sshとは
いわゆる踏み台にsshしてさらにsshすること。
localhost -> サーバーA -> サーバーB
のような接続が簡単にできるようになる。
また、サーバーAに鍵を置かないで済むようになるのでセキュア。
詳しい説明は他に譲ります。
https://qiita.com/ik-fib/items/12e4fab4478e360a82a1

### なんか警告っぽいメッセージが出て接続できないんだけど

すっごく目立つ形式の警告メッセージが出てたら多分これ。
サーバーのフィンガープリントが変わってしまうと起きる。

hogehoge.com -> サーバーA
から
hogehoge.com -> サーバーB

へドメインの向き先を変えると起きる。
理由は、気付かずに異なるサーバーへ接続することを防ぐため。
`~/.ssh/known_hosts` に記述されているので、`ssh-keygen`コマンドか`vi`を使って該当の行を削除すれば良い。

なんかめんどいと思ったら、rmで`~/.ssh/known_hosts`を削除しても動くが、
複数のサーバーを運用しているならやめておいたほうが良いかも。


## 上級者編

個人的メモかも。

### sshエージェントを使用しないでsshしたい

sshdの設定変更ができたかどうか確認したい時など。

```
ssh -o 'IdentitiesOnly=yes' hoge.com
```

sshの -o オプションを使用すると、ssh_configに書いたものと同じような効果を得られる。
`man ssh` すればオプションが全部掲載されてるっぽい。