Windows10でのSSHの設定

# はじめに

## 環境

* ローカルマシン
    * Windows10
    * PowerShell
* リモートマシン
    * Linux

# 手順

## ローカルマシンでの作業

### 1. "ssh-keygen"コマンドで4096ビットRSA暗号の公開鍵・秘密鍵を生成。
* "-t"オプションで暗号の種類を示す。下の例はRSA暗号。
* "-b"オプションでビット数を示す。下の例は4096ビット。
* "-C"オプションの後はコメントを示す。メールアドレスなどを書くとよいかも。

```powershell
ssh-keygen -t rsa -b 4096 -C "[コメント]"
```

### 2. パスフレーズの入力を求められる。
* 何も入力しなくてもよい([セキュリティについて](https://docs.github.com/en/github/authenticating-to-github/working-with-ssh-key-passphrases))。

```
Enter file in which to save the key (C:\Users\[Windows10のユーザ名]/.ssh/id_rsa): [Type a passphrase]
```

### 3. 再度、パスフレーズの入力を求められる。
* 2.で入力したパスフレーズを入力

```
Enter passphrase (empty for no passphrase): [Type a passphrase]
```

### 4. 公開鍵と秘密鍵を確認
* ホームディレクトリ下の.ssh/ディレクトリに移動。
* .ssh/ディレクトリには先ほど生成した秘密鍵(id_rsa)と公開鍵(id_rsa.pub)がある。

```powershell
cd ~/.ssh
ls  
```

### 5. リモートマシンに公開鍵を転送
* "scp"コマンドでリモートマシンに公開鍵を転送。

```powershell
scp id_rsa.pub [リモートマシンのユーザ名]@[リモートマシンのホスト名]:~/.ssh/id_rsa_hoge.pub
```

## リモートマシンでの作業

### 1. ローカルマシンでリモートマシンにSSHで接続

```powershell
ssh [リモートマシンのユーザ名]@[リモートマシンのホスト名]
```

### 2. SSHの設定ディレクトリに移動
* Linuxでの"~"はホームディレクトリの意味

```bash
cd ~/.ssh
```

### 3. ローカルの新しい公開鍵をリモートマシンに登録
* 転送した公開鍵を"cat"コマンドで表示
* "autohrized_keys"は接続を許可する公開鍵を登録しておくサーバー側のファイル
* ">>"はリダイレクションと言い、指定したファイルの末尾に追記する
* 下の例では"cat"コマンドで公開鍵の中身を表示し、">>"で"authorized_keys"ファイルに追記している。

```bash
touch authorized_keys
cat id_rsa_hoge.pub >> authorized_keys
```

### 4. "authorized_keys"ファイルのパーミッションを変更

```bash
chmod 600 authorized_keys
```

### 5. 転送したローカルマシンの公開鍵を削除

```bash
rm -fv id_rsa_hoge.pub
```

## 再度、ローカルマシンでの作業

### 1. sshでローカルマシンからリモートマシンに接続

```powershell
ssh [リモートマシンのユーザ名]@[リモートマシンのホスト名]
```

### 2. 接続できたら、OK

## ローカルマシンの使い勝手を良くする（エイリアス）

### 1. Windows10のホームディレクトリ以下の~/.ssh/configを開く

```powershell
cd ~/.ssh
code config
```

### 2. ~/.ssh/configを編集

* 通常のエイリアス

```ssh
# ~/.ssh/config
Host remote1                         # エイリアス 
    HostName example1.com            # リモートマシンのホスト名
    User hoge                        # リモートマシンのユーザ名
    Port 22                          # リモートマシンのSSHポート
    IdentityFile ~/.ssh/id_rsa       # セットとなる秘密鍵
```

* 踏み台サーバがある場合のエイリアス

```ssh
# ~/.ssh/config
Host bastion                         # 踏み台のエイリアス 
  HostName example2.com              # リモートマシンのホスト名
  User fuga                          # リモートマシンのユーザ名
  Port 22                            # リモートマシンのSSHポート
  IdentityFile ~/.ssh/id_rsa         # セットとなる秘密鍵

Host remote2                         # エイリアス 
  HostName dst                       # リモートマシンのホスト名
  User fuga                          # リモートマシンのユーザ名
  Port 22                            # リモートマシンのSSHポート
  IdentityFile ~/.ssh/id_rsa         # セットとなる秘密鍵
  ProxyCommand ssh -W %h:%p bastion  # bastion経由でSSHする
```

### 3. エイリアスを使って接続

```powershell
ssh remote1
```

```powershell
ssh remote2
```

# 終わり

本記事は終了です。

# References
* [お前らのSSH Keysの作り方は間違っている](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)
* [Connecting to GitHub with SSH](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh)
* [SSHの鍵認証設定](https://qiita.com/gotohiro55/items/36a22516de2b381b3c6e)
* [Working with SSH key passphrases](https://docs.github.com/en/github/authenticating-to-github/working-with-ssh-key-passphrases)
* [リダイレクションの「>」「 >>」とパイプ「 | 」の違い。](https://qiita.com/i35_267/items/a19f065691fdc17ae476)