Synology DiskStation で SSH 接続を公開鍵認証方式にする

## Synology DiskStation の DiskStation Manager (DSM) のウェブ管理画面で SSH 機能を設定する
### Synology DiskStation で SSH を有効にする

DiskStation Manager (DSM) のウェブ管理画面から「コントロールパネル」→「端末とSNMP」→「SSHサービスを有効化する」をクリック

![01_ssh.png](https://qiita-image-store.s3.amazonaws.com/0/41095/e5042143-4203-b5e2-64e0-de335df26720.png)


### Synology DiskStation でユーザーホームの設定を有効にする

**注意：「ユーザーホームのサービスを有効にする」が無効になっていると、後述の /var/services/homes/  ディレクトリにアクセスできないので注意**

DiskStation Manager (DSM) のウェブ管理画面から「コントロールパネル」→「ユーザー」→「詳細」→「ユーザーホーム」→「ユーザーホームサービスを有効にする」をクリック

![02_userhome.png](https://qiita-image-store.s3.amazonaws.com/0/41095/9652b0c2-614a-d9aa-d209-3b8940f07b93.png)


## Synology DiskStation に SSH ログインする

**注意：SSH/Telnet は、[administrators] グループに属するユーザーでしかシステムにログインできない**
**注意：root 昇格の方法が DiskStation Manager (DSM) 6．0 以降は　admin ユーザーでログイン後、`sudo -i` コマンドの実行に変更されている**

### サーバ に SSH ログインする

ローカルマシンのターミナルから、Synology DiskStation の admin ユーザーと DiskStation のサーバ IP アドレス（今回の例では 192.168.1.10 ）を指定して SSH ログインする

```:ローカルマシンのターミナル
### 192.168.1.10 のサーバーに SSH ログインする
$ ssh -p 22 admin@192.168.1.10
### admin ユーザーのパスワードを入力する
admin@192.168.1.10's password: 
### admin ユーザーでログインした状態で sudo -i と入力して root ユーザーに昇格する
admin@192.168.1.10:/$ sudo -i
### root ユーザーのパスワード（ admin ユーザーのパスワードと同じもの）を入力する
Password: 
### 成功するとプロンプトのユーザー表示が admin から root に変わる
root@192.168.1.10:~#
### 試しに OpenSSH のバージョンを ssh -V で確認してみる
root@192.168.1.10:~# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2r-fips  26 Feb 2019
```

### 【作業不要：デフォルト値で設定済み】　~~サーバの SSH 設定ファイルを編集~~ 

```shell
$ vim /etc/ssh/sshd_config
```

~~sshd_config ファイルの以下の部分のコメント（先頭にある#）を外して、SSHの設定をする~~

```shell:sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys
```
参考資料：[manページ  — SSHD_CONFIG](https://nxmnpg.lemoda.net/ja/5/sshd_config)
~~参考資料：[OpenSSH-7.3p1 日本語マニュアルページ (2016/10/15) SSHD_CONFIG (5)](https://euske.github.io/openssh-jman/sshd_config.html)~~
参考資料：[OpenSSH (sshd) のデフォルト値](https://qiita.com/bezeklik/items/b728ea2de4924f89a787)
参考資料：[SSH で root のみ公開鍵認証を強制する](https://operationslab.wordpress.com/2013/04/11/ssh-%E3%81%A7-root-%E3%81%AE%E3%81%BF%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%82%92%E5%BC%B7%E5%88%B6%E3%81%99%E3%82%8B/ "SSH で root のみ公開鍵認証を強制する")

### 秘密鍵・公開鍵を作る

ここでは、ローカルマシン上で、公開鍵・秘密鍵を生成する。ここでは、RSA を 4096bit 、コメントを fugafuga、ファイル名を hogehoge とした

```shell
$ ssh-keygen -t rsa -b 4096 -C "fugafuga" -f hogehoge
```
コマンドを実行すると作業ディレクトリに `hogehoge`（秘密鍵）と`hogehoge.pub`（公開鍵）ができる

参考資料：[2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方](https://qiita.com/wnoguchi/items/a72a042bb8159c35d056 "2017年版 SSH公開鍵認証で使用する秘密鍵ペアの作り方")

### 公開鍵を設置する

**注意：公開鍵は、`/var/services/homes/` 以下のユーザーディレクトリ（ SSH ログインしたいユーザー名のディレクトリ）に設置する。 今回、使用するユーザーが`user`なので、SSH 設定ファイルは`/var/services/homes/user/`に設置した。**

`.ssh`ディレクトリを作り、`authorized_keys`のファイルを作成する

```
$ mkdir /var/services/homes/user/.ssh
$ touch /var/services/homes/user/.ssh/authorized_keys
```

`vim` で `authorized_keys` を開き、公開鍵（上記で作成した`hogehoge.pub`の中身すべて）をコピペする

```
$ vim /var/services/homes/user/.ssh/authorized_keys
```

### サーバのディレクトリのパーミッションを設定する

**注意：パーミッションを正確に設定しないと、SSH ログインができない**
参考：[公式サイト](https://www.synology.com/ja-jp/knowledgebase/DSM/tutorial/Management/How_to_log_in_to_DSM_with_key_pairs_as_admin_or_root_permission_via_SSH_on_computers#t4)には .ssh ディレクトリと authorized_keys のパーミッションを`700`に設定する記述あり
参考：[公式サイト](https://www.synology.com/ja-jp/knowledgebase/DSM/tutorial/Management/How_to_log_in_to_DSM_with_key_pairs_as_admin_or_root_permission_via_SSH_on_computers#t4)には .ssh ディレクトリと authorized_keys の所有者とグループを`root`に設定する記述あり

以下は、筆者の設定例

```shell
$ chown -R user:users /var/services/homes/user/
$ chmod -R 755 /var/services/homes/user/
$ chmod 700 /var/services/homes/user/.ssh
$ chmod 644 /var/services/homes/user/.ssh/authorized_keys
```


### sshd の設定ファイルの文法チェック
コマンド実行後に何も表示されなければ、文法チェックは正常終了（デバッグ出力をするには `sshd -t -d` のように -d オプションを指定する）

```
$ sshd -t
```

#### sshd -t 実行時のエラーの一例

```
$ sshd -t
/etc/ssh/sshd_config line 113: Deprecated option UsePrivilegeSeparation
```

`UsePrivilegeSeparation` は `root` 権限の分離のこと。デフォルト設定値は、`yes` の `root` 権限分離状態である。
具体的には、`sshd` が受けもつネットワークトラフィック処理で `root` 権限をもたない子プロセスをつくるか、否かである。この目的は、問題になり得る処理を `root` 権限をもたないプロセスに限定することで、`root` 権限の乱用によるセキュリティ被害を防ぐためである。
ゆえに、この `sshd -t` のエラーを解消するには、`/etc/ssh/sshd_config` の113行目を削除するか、コメントアウトすればよい。


### sshd の再起動
**注意： ~~`synoservicectl --restart sshd`~~ は SSH のコネクションがロストする**
ロストした場合は、ウェブ管理画面から「SSHサービスを有効化する」のオン→ オフ→ オンで復活できる

```
# DSM7系から(一般ユーザの場合)
$ sudo synosystemctl restart sshd.service

# DSM7系から(rootユーザーの場合)
$ /usr/syno/bin/synosystemctl restart sshd.service

# DSM6系まで
$ synoservicectl --reload sshd
```

### TIPS: DSM7の基本コマンド
参考資料：[Synology: Basic Command Lines For DSM 7](https://mariushosting.com/synology-basic-command-lines-for-dsm-7/)

### ログインのテスト
初回は秘密鍵の指定が必須

```
$ ssh -i ~/.ssh/hogehoge user@hogehoge.com
```

次回からは秘密鍵の指定は不要

```
$ ssh user@hogehoge.com
```

### TIPS: `~/.ssh/config` を設定すると便利になる
参考資料：[~/.ssh/configについて](https://qiita.com/passol78/items/2ad123e39efeb1a5286b)
参考資料：[.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)
参考資料：[UseKeychainが設定されているMacのssh configをLinuxで使い回す](https://qiita.com/kter/items/fb76b18629a208b69306)

以上