Clear Linux のSSHサーバー構築

Clear LinuxにSSH接続するために設定をしようと思ったら /etc/ssh/ が空っぽで sshd_configファイルが見つかりませんでした。 これはClear Linuxが[Stateless](https://clearlinux.org/features/stateless) のコンセプトに基づいて設計されているからで、 このStatelessというのは /usr でデフォルト設定、/etc でカスタム設定をするようにして メンテナンス性を向上させるというものらしいです。

公式の解説ドキュメントに従ってsshd.socketの設定をし、 sshd_configファイルを作り、SSH接続できるようにするメモです。 Clear Linuxが起動しているSSHサーバを直接操作できる状況を想定しています。

参考にさせていただいたページ
①:A guide to stateless configuration in Clear Linux: https://github.com/clearlinux/clr-man-pages/blob/master/stateless.7.rst
②:Clear Linux documentation openssh-server: https://github.com/odwdinc/clear-linux-documentation/blob/5a75f485f42f02891fa0fdc841720fa55a4e8733/source/clear-linux/reference/bundles/openssh-server.rst
③:Document how to change OpenSSH default port. https://github.com/clearlinux/clear-linux-documentation/pull/262
④:Update openssh-server bundle documentation [was: Can't modify OpenSSH port] https://github.com/clearlinux/distribution/issues/220
# 0. openssh-serverがインストールされているか確認
多分デフォルトでインストールされていますが、インストールされていなければ

```
sudo swupd bundle-add openssh-server
```

でインストール。
# 1. ポートの設定

②のページの解説に従って設定します。 デフォルトではSSHソケットデーモンのListenStreamが22番ポートになっています。 このSSHソケットデーモンは指定されたポートでSSH接続を待機するプログラムです(多分)。

```:default
hoge@cleardesktop ~ $ cat /etc/systemd/system/sshd.socket
[Unit]
Description=OpenSSH Server Socket
Conflicts=sshd.service

[Socket]
ListenStream=22
Accept=yes

[Install]
WantedBy=sockets.target
```

これを変更するには、コマンド

```
sudo systemctl edit sshd.socket
```

を実行して、nanoエディタが開いたら、

```
[Socket]
ListenStream=
ListenStream=2718

```

と、3行＋空白1行を入力します。3行目のところに新しいポート番号（今は2718）を入れます。 入力したら`Ctrl+O`でファイル名を/etc/systemd/system/sshd.socket.d/override.conf として保存。`Ctrl+X`で終了。

設定ファイルを作ったら、システムデーモンのリロードをして、sshd.socketを再起動して、 sshd.socketが動いているか確認。

```
hoge@cleardesktop ~ $ sudo systemctl daemon-reload
hoge@cleardesktop ~ $ sudo systemctl restart sshd.socket
hoge@cleardesktop ~ $ systemctl status sshd.socket
● sshd.socket - OpenSSH Server Socket
   Loaded: loaded (/etc/systemd/system/sshd.socket; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/sshd.socket.d
           └─override.conf
   Active: active (listening) since Fri 2019-01-11 17:59:38 JST; 11s ago
   Listen: [::]:2718 (Stream)
 Accepted: 14; Connected: 2;
   CGroup: /system.slice/sshd.socket

Jan 11 17:59:38 cleardesktop systemd[1]: Closed OpenSSH Server Socket.
Jan 11 17:59:38 cleardesktop systemd[1]: Stopping OpenSSH Server Socket.
Jan 11 17:59:38 cleardesktop systemd[1]: Listening on OpenSSH Server Socket.
```

active(listening)となっていて、Listen:2718(Stream)となっているのでこれでOK。

# 2. sshd_configの作成

sshd_configファイルを作成します。デフォルトでは用意されていません。 おそらくsshdのマニュアルを読んで一つ一つ設定していくことが推奨されています （マニュアルは `man sshd` コマンドで見れます）。 

モデムのポートを開放してLAN外から接続できるようにする場合、必要な設定は 以下のようになります。

```
Protocol 2
PermitRootLogin no
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
X11Forwarding yes
```

root でのログインを許可せず、パスワード認証は使用しません。gnuplotを使うので X11Forwarding をyesにしました。

sshd_configファイルでポート番号を設定することもできますが、 SSHソケットデーモンが起動している場合、sshd_configファイルでのポート番号の設定は 無視されます（異なるポート番号をsshd.socketとsshd_configに設定して試したらそうなりました）。 この問題について公式ドキュメント①ではsshd.socketとsshd.serviceの2つのデーモンのうち、 先にsshd.socketが起動するようになっていたらsystemctl edit sshd.socketで設定をする、 先にsshd.serviceが起動するようになっていたらsshd_configで設定をする、 というように書いてあります。 ですが、何度か再起動とかして試してみたところ、どうやら勝手にsshd.socketが起動して systemctl edit sshd.socketで設定したポート番号が採用されるようです。 ④で議論されているのがこのことで、sshd.socket is active by defaultらしいです。
よって、sshd_configでポート番号を指定する必要はありませんが、 念の為sshd_configでも同じポート番号を指定しておけば問題ないかと思います。
# 3. 鍵の作成、登録

クライアントに使用するPCに移って鍵の作成をします。`ssh-keygen`コマンドで鍵を作ります。 せっかくなのでed25519鍵を作りましょう。

```
hoge@debian:~$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hoge/.ssh/id_ed25519.
Your public key has been saved in /home/hoge/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:PUQhz11mx/FG2c0k07na1/2rxBxyOZqAvqkamcKDwPo hoge@debian
The key's randomart image is:
+--[ED25519 256]--+
|        . o.  **X|
|         = . + BB|
|          + .   +|
|.       .o    .o |
|..     .S.o. =o o|
|=   o .   ..B.o.+|
|o+ +   .   o +  o|
| .o .   o   .   .|
|  E....o     ....|
+----[SHA256]-----+
```

.ssh ディレクトリに鍵のペア id_ed25519, id_ed25519.pub ができました。 秘密鍵id_ed25519は門外不出。 公開鍵id_ed25519.pubをUSBメモリを使ってサーバに移します（移せれば方法は何でもOK）。

サーバに移って公開鍵を.sshディレクトリのauthorized_keysファイルに登録します。 authorized_keysファイルにid_ed25519.pubの内容をコピペするだけです。 `cat` コマンドを使うと楽です。

```
hoge@cleardesktop:~$ cd .ssh
hoge@cleardesktop:~/.ssh$ ls
id_ed25519.pub
hoge@cleardesktop:~/.ssh$ cat id_ed25519.pub >> authorized_keys
```

ここまでできたらLAN内から接続できます。 クライアントPCに移って、秘密鍵、ポート番号を指定してSSH接続します。サーバのIPアドレスは `sudo ifconfig`で調べることができます。

```
hoge@debian:~$ ssh -i .ssh/id_ed25519 -p 2718 hoge@192.168.0.30
hoge@cleardesktop ~ $ 
```

これでSSH接続できました。初回の接続では、この接続先は初めてだが怪しいところじゃないよな？、 という感じのメッセージが出ますが、大丈夫なのでyesと答えれば接続できます。 毎回秘密鍵とポート番号の指定をするのは面倒なので、 /etc/ssh/ディレクトリ内のssh_configファイルに設定します。 今の場合、

```
Host clearlinux
	Hostname 192.168.0.30
	User hoge
	ForwardX11 yes
	ForwardX11Trusted yes
	Identityfile ~/.ssh/id_ed25519
	Port 2718
	Protocol 2
	ServerAliveInterval 15
	ServerAliveCountMax 3
```

と設定しておくと、`ssh clearlinux`でSSH接続できます （サーバのIPアドレスを固定しておく必要があります）。