QNAP SSH接続を公開鍵認証にできた。

#TL;DR
- /mnt/HDA_ROOT/.config/ssh/sshd_configを修正することで一般的な方法でsshdの設定を変更できる
- ユーザーのhomeディレクトリのオーナーはadminなので速やかに修正する

#きっかけ
##SSHログイン出来なくなった
ファームウェア更新通知が来たのでバージョンを`4.2.2`に上げて再起動したら、
SSHログイン出来なくなったのでいろいろ調査した結果、公開鍵認証でログインできるようになった。


#やったこと
##あわてず騒がずtelnetでログイン
普段はtelnet切っているので設定でEnableにしてからログイン
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/109103/7f28ba06-5e8a-c0c0-bfbe-4c742f2eb84f.png)

##SSHの設定を確認
```bash:telnet
$ cat /etc/ssh/sshd_config | more
```
特に問題は無いようだ。(rootでログインするのは問題だけど仕様です)

##んじゃ立ち上げなおしてみるか。
```bash:telnet
$ daemon_mgr sshd stop sshd
$ daemon_mgr sshd start "/usr/sbin/sshd -f /etc/ssh/sshd_config -p 22"
```
お、SSHでログインできるようになった。
でもWeb上からSSHのEnable/Disableをするとまた繋がらなくなる。
こりゃどこか他のsshd_configを読んでるな。

##恒久的な対策をする
って事でsshd_configを探す

```bash:telnet
$ cd /
$ find -name 'sshd_config'
```
しばし待つ。
・・・
帰ってきた。

```bash:telnet
./etc/ssh/sshd_config
./mnt/HDA_ROOT/.config/ssh/sshd_config
./share/MD0_DATA/.qpkg/Optware/etc/openssh/sshd_config
./share/MD0_DATA/.qpkg/Entware-ng/etc/ssh/sshd_config
```
パッケージのSSH/OpenSSHは入れたけどQNAPが意地悪して起動するたびに自分の設定に書き換えてしまうので使っていない。
なので怪しいのは`/mnt/HDA_ROOT/.config/ssh/sshd_config`だな

```:telnet
$ cp /etc/ssh/sshd_config /mnt/HDA_ROOT/.config/ssh/sshd_config
```
これでWeb上からSSHのEnable/Disableしても、問題なくなった。
HDA_ROOTって事は再起動しても消えないはず。
・・・
再起動してもSSHログイン出来るぞ。
**ん？これはもしかしてSSH設定を弄れるのではないか？:smirk:**

#公開鍵認証の設定
いままで再起動のたびに/etc/ssh/sshd_configを初期化されていたので諦めていたけど、今回はいけそうな気がする。

##まずはadminを公開鍵認証
sshd_configを編集して下のコメント(#)を外す

```vi:/mnt/HDA_ROOT/.config/ssh/sshd_config
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
```
次に鍵生成。ほんとはクライアントで鍵生成して公開鍵をサーバに送るのだけど
簡単のためサーバ側のssh-keygenを使用する。
**秘密鍵(qnap_rsa)**は絶対に秘密なので本当は/share/Public/においてはいけない。

```bash:ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa -f qnap_rsa
$ mv qnap_rsa.pub authorized_keys
$ chmod 600 authorized_keys
$ chmod 666 qnap_rsa
$ mv qnap_rsa /share/Public/qnap_rsa
```
出来た秘密鍵はありがたくクライアントで使用させていただく。
ここまでやればWeb上でSSHのEnable/Disableをすれば、公開鍵認証でつながるようになる。

##一般ユーザーを追加
一般ユーザーであるnakさんにsshを開放する手順。
まずはadminで下準備。
sshd_configにnakさんを追加。

```vi:/mnt/HDA_ROOT/.config/ssh/sshd_config
AllowUsers admin nak
```

まだadmin。
`su`も`sudo`も入っていないのでインストール。

```bash:admin
$ opkg install coreutils sudo
```
まだまだadmin。
nakさんのHomeディレクトリをssh readyにする。

```bash:admin
$ cd /share/homes/
$ chown nak:everyone nak
$ chmod 711 nak
```

ここからnakさん。
.sshの設定をadminと同じように行い、できた秘密鍵(nak_qnap_rsa)をクライアントで利用する。

```bash:nak
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ ssh-keygen -t rsa -f qnap_rsa
$ mv qnap_rsa.pub authorized_keys
$ chmod 600 authorized_keys
$ chmod 666 qnap_rsa
$ mv qnap_rsa /share/Public/nak_qnap_rsa
```
これで一般ユーザーが公開鍵認証でログインできるようになったのでsshd_configを変更して、さらに守りを固めればよい。

```
PermitRootLogin no
PasswordAuthentication no
```
またnakさんのシェルを変更するためのpasswdの場所はここ。

```vi:/mnt/HDA_ROOT/.config/passwd
nak:x:1001:100:Linux User,,,:/share/homes/nak:/bin/bash
```

#参考文献
[QNAP SSH接続を公開鍵認証にする](http://qiita.com/qurage/items/de71ae01969f52c05b92)
[SSHの鍵認証設定](http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e)
[SSH用のユーザー追加手順と注意点のまとめ](http://qiita.com/tattn/items/a03cbf7c185d7efa6769)
[QNAP forum : su or sudo "command not found"](https://wiki.qnap.com/wiki/SSH:_How_To_Set_Up_Authorized_Keys)
[QNAP forum : how to enable ssh history](https://forum.qnap.com/viewtopic.php?t=104329)