SSH接続するための備忘録

# はじめに
Linuxでサーバーを立てる講義があってサーバー作りたい熱が再燃してしまったので、今後のためにどうやってSSH接続のセットアップを行うのか残したいと思います。
ただLinuxの扱いに慣れていないためまだまだ間違いなどあるとは思いますが温かい目で見守っていただけると幸いですm(_ _)m
# 環境
- SSHサーバー
    dynabook Satellite B65/R
    <table border="1">
    <tr><td>型番</td><td>PB65RNAAC27AD11</td></tr>
    <tr><td>CPU</td><td>インテル® Celeron® プロセッサー 3215U</td></tr>
    <tr><td>RAM</td><td>8GB</td></tr>
    <tr><td>ストレージ</td><td>500GB(HDD)</td></tr>
    <tr><td>OS</td><td>Lubuntu 24.04.1 LTS</td></tr>
    </table>

- SSHクライアント
    dynabook RZ/MW
    <table border="1">
    <tr><td>型番</td><td>W6RZMW7BAL</td></tr>
    <tr><td>CPU</td><td>13th Gen Intel(R) Core(TM) i7-1360P</td></tr>
    <tr><td>RAM</td><td>32.0GB</td></tr>
    <tr><td>ストレージ</td><td>1TB(SSD)</td></tr>
    <tr><td>OS</td><td>Windows 11 Home 24H2</td></tr>
    <tr><td>クライアント</td><td>Tera Term Version5.2 (Git 176aed267)</td></tr>
    </table>
- ネットワーク環境
    | マシン | IPアドレス |
    |:-:|:-:|
    | サーバー | 192.168.255.200/24(固定) |
    | クライアント | 192.168.255.58/24(DHCP) |
SSHサーバーとして格安でもらった色々と壊れてしまっている約10年落ちのノートパソコンを使用します。
SSHクライアントは普段大学でも使っているパソコンになります。
ネットワーク環境としては自分の部屋だけに張り巡らしたLANに接続してあります。そこから家全体のLANさらにマンション全体のLANと接続しているので二重ルーターどころではなく三重ルーターとなってしまっています。そのためいつか三重ルーターでも外部からアクセスできるようにしたいなと考えています。

:::note warn
ノートパソコンを24時間起動させることは火災のリスクなどもあり賛否両論があります。ご自身の責任で行うようにしてください。
:::

# 手順
このノートパソコンはディスプレイを閉じてヘッドレスで使用したいため以下の呪文を詠唱します。
```
# systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Created symlink /etc/systemd/system/sleep.target → /dev/null.
Created symlink /etc/systemd/system/suspend.target → /dev/null.
Created symlink /etc/systemd/system/hibernate.target → /dev/null.
Created symlink /etc/systemd/system/hybrid-sleep.target → /dev/null.
```
これによりディスプレイを閉じて使用してもスリープモードやスクリーンセーバーに移行することがなくなります。
### インストールする
最初[Ubuntu](https://www.ubuntulinux.jp/)や[Lubuntu](https://lubuntu.me/)をインストールした段階ではsshのクライアントは入っていてもサーバーは入っていないので[OpenSSH](https://www.openssh.com/)をインストールします。
詳しくはこちらなどをご覧ください [SSHについて #Linux - Qiita](https://qiita.com/pyon_kiti_jp/items/75eed749e14aaf52cec6)
```
# apt install openssh-server
# systemctl status ssh
○ ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
     Active: inactive (dead)
TriggeredBy: ● ssh.socket
       Docs: man:sshd(8)
             man:sshd_config(5)
```
これでOpenSSHサーバーをインストールすることができました。しかしこのままではインストールしただけで起動していないので手動でスタートしてやる必要があります。
```
# systemctl start ssh
# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
     Active: active (running) since Wed 2024-11-06 17:41:59 JST; 3min 13s ago
TriggeredBy: ● ssh.socket
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 19675 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 19676 (sshd)
      Tasks: 1 (limit: 9322)
     Memory: 1.2M (peak: 1.4M)
        CPU: 32ms
     CGroup: /system.slice/ssh.service
             └─19676 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

11月 06 17:41:59 dynabook systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
11月 06 17:41:59 dynabook sshd[19676]: Server listening on :: port 22.
11月 06 17:41:59 dynabook systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
# ssh -V
OpenSSH_9.6p1 Ubuntu-3ubuntu13.5, OpenSSL 3.0.13 30 Jan 2024
```
`Active: active (running)`となり緑色の丸が表示されていれば無事成功となります。
そして最後にOSを起動した際に自動でサーバーも起動できるようにします
```
# systemctl enable ssh
```
これでインストール自体は完了です。
### セキュリティを高める
OpenSSH自体のインストールは前述の手順で完了となります。しかしこのままではユーザー名とパスワードが判ればアクセスできてしまうなどのセキュリティリスクがあります。以下の事も最低限行うようにします。
```diff:/etc/ssh/sshd_config
- #port 22
- #PermitRootLogin prohibit-password
- #PubkeyAuthentication yes
- #PermitEmptyPasswords no
+ port 10022
+ PermitRootLogin no
+ PubkeyAuthentication yes
+ PermitEmptyPasswords no
```
以上のように14,33,38,58行目をそれぞれ書き換えます。
一つづつ説明すると
- 14行目(port)
    sshする際のポートを変更する。これによってBrute Force Attackを受ける可能性が低くなることが期待されます。
- 33行目(PermitRootLogin)
    ここではrootユーザーのログインを許可するかどうかを設定します。オプションとしての一例として以下のようなものがあります。
    <table>
    
    <tr><td>yes</td><td>rootユーザのログインを許可</td></tr>
    <tr><td>prohibit-password</td><td>通常のパスワード認証と、キーボードインタラクティブ認証（2要素認証など）を拒否するが、公開鍵認証とGSSAPI認証（Kerberos認証など）だけは許可される。</td></tr>
    <tr><td>no</td><td>rootユーザのログインを許可しない</td></tr>
    </table>
- 38行目(PubkeyAuthentication)
    公開鍵認証を利用するか否かです。
    デフォルトでyesに設定されていますがここでは明示的にyesにしてあります。
- 58行目(PermitEmptyPasswords)
    あんまり無いとは思いますがパスワードが設定されていないユーザーのログインを禁止するものです。

`sshd -t`と構文チェックを行い何もエラーが表示されなかったら「構文上」は問題はありません。そしたらsshの設定を再読み込みします。
```
# sshd -t
# systemctl restart sshd
```
以上で設定したことが機能しているか10022ポートでの接続ならびにrootユーザーでの認証ができるかを確かめてください。
できるようになったことを確認するのは大切ですができないようになったことを確認することも同じように大切なので…
またtipとして`sshd -T`と実行することで今現在の設定を確認することができます。
### 公開鍵認証
ここでは公開鍵認証についての説明は省こうと思います。ただ公開鍵認証について全く何も知識がなければ次のサイトを見てみて「こんなことをしてるんだなー」と理解してみたほうがいいかもしれません。
[公開鍵認証方式とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word17549.html)

コマンドラインで公開鍵と秘密鍵を作成することもできますがここでは簡単のためTera Termの機能を利用したいと思います。
![スクリーンショット 2024-11-06 223129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911300/a7a7b906-bbed-3ac6-28f5-9ff1908f25d8.png)
Tera Termでは[設定]>[SSH鍵生成]と選択することで以下のフォームが出てきます。
![鍵の作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911300/6beb3bcf-bfae-08fa-f80f-ce0162fb68b9.png)
RSAやED25519などのような暗号化方式を選ぶことができますがここではED25519を選択しました。
どうやらRSAよりED25519のほうが高速かつセキュアらしいので…
「なにそれ！詳しく知りたいよー！」って方はここも見てみると良いでしょう。
[気付けばssh-keygen -t の後にrsaでなくed25519と打つことが推奨されていた | ABC DX Tech Blog](https://tech.asahi.co.jp/posts/20231005-bbf6)

RSA暗号ではビット数を選択する必要があります。世の中的には2048ビット以上が推奨となってきているみたいです。
またパスフレーズは認証のたびに求められますが一応空欄にすることもできます。
そして[公開鍵の保存]、[秘密鍵の保存]をそれぞれクリックし覚えやすい場所に保存しましよう。（特に秘密鍵はログインのたびに使用するので…）
そして作成した**公開鍵ファイル**をサーバーに転送します。

:::note warn
(*.pub)形式の**公開鍵ファイル**をアップロードしてください。秘密鍵はアップロードしないようにしてください。
:::
ファイルをTera Termにドラッグ＆ドロップすることで以下のダイアログが起動します。転送先は自由ですがわかりやすい場所にしましょう。
<img width=70% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911300/2eca4c89-6a82-1809-4568-7bfece7b0a3f.png"></img>
ファイルサイズが小さいのでアップロード自体はすぐに終了すると思います。
終了したらコマンドラインの操作に戻りましょう。ここではrootユーザーではなくログインしたいユーザーで操作しましょう。
```
$ pwd
/home/<ユーザー名>
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ cat /tmp/id_ed25519.pub >> authorized_keys
$ chmod 600 authorized_keys
```
ユーザーディレクトリ直下に`.ssh`というディレクトリを作成します。ここには公開鍵を保存するので権限を700か600に設定します。そしたら転送したファイルの中身をそのまま`authorized_keys`というファイルに書き込みます。最後に同じように権限を600に設定したら完了です。

:::note warn
ここで一度ログアウトしてみて公開鍵認証できるかを試してみましょう。
**もしできない場合は先に進まないでもう一度やり直してみましょう。**
:::

さて公開鍵認証が設定できたら公開鍵認証以外のログインを塞ぎます。
```diff:/etc/ssh/sshd_config
- #PasswordAuthentication yes
+ PasswordAuthentication no
```
57行目を上のように書き換えます。
```
# sshd -t
# systemctl restart sshd
```
そして呼吸をするように構文チェックと設定の再読み込みを行います。こうすることでパスワード認証ができなくなるので以降は公開鍵認証を使ってログインしなければなりません。
### ファイアウォール
最後にファイアウォールを設定したいと思います。UbuntuやLubuntuにはufwという簡単なツールが入っています。
```
# systemctl status ufw
● ufw.service - Uncomplicated firewall
     Loaded: loaded (/usr/lib/systemd/system/ufw.service; enabled; preset: enabled)
     Active: active (exited) since Wed 2024-11-06 18:10:16 JST; 52min ago
       Docs: man:ufw(8)
   Main PID: 525 (code=exited, status=0/SUCCESS)
        CPU: 8ms

11月 06 18:10:16 dynabook systemd[1]: Starting ufw.service - Uncomplicated firewall...
11月 06 18:10:16 dynabook systemd[1]: Finished ufw.service - Uncomplicated firewall.
```

>OS搭載機器を目の前にしてローカルのコンソールを使って設定する場合は、失敗したら元に戻せばいいので特に気にする必要はありません。
>しかし、sshを使ってsshdの変更をしなければいけないケースが多々有ります。
>当然記述ミスや設定値の間違いなどで、再起動後につながらなくなっていまうおそれがあります。
>そんな困った状況を避けるため、sshdは再起動しても接続済みのセッションは維持してくれる親切設計になっています。
>この機能を保険として、何かを変更する際にはターミナルを2つ起動して、接続済みセッションを用意しておくよう心がけましょう。
[sshを使うための各設定](https://qiita.com/kaw404/items/a4550190e6f27ff565a5)

とのことなので以下の作業を実行する際にはもう一つウィンドウを開いておいて作業を戻せるようにしてください。
```
# ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)
# ufw allow 10022
ルールを追加しました
ルールを追加しました (v6)
# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
```
:::note warn
許可するポート番号を間違えないように注意してください。
:::
ここではデフォルトポリシーとしてパケットを棄却するようにしています。
しかし10022/TCPに来るIPv4,IPv6のパケットのみ通過するようにしました。ここで開くポートは/etc/ssh/sshd_configの14行目で設定したポートと合わせるようにします。
そして最後に新しくウィンドウを開き公開鍵認証でログインできることを確かめられば成功となります。
# 最後に
この記事では新しく作成したLubuntuのサーバーにsshするための手順を解説しました。しかしsshの脆弱性を利用してサーバーをハッキングされてしまうこともあります。ここで説明したのは基本的なセキュリティ対策ですがスマホアプリ(Google Authenticator等)を使った2要素認証(TOTP)やIPアドレス(CIDR表記)によるアクセス制限も設定できるようです。これからはそういった対策やAdGuard Homeのインストール、三重ルーター下のNAT越えなどにも取り組んでみたいと思います。
この記事は以上となります。ご覧いただきありがとうございました。
# 参考文献
[Linuxサーバー構築標準教科書(Ver.4.0.0)](https://linuc.org/textbooks/server/)

https://qiita.com/daisei0311/items/3b32a16faf3c2de826b9

https://qiita.com/pyon_kiti_jp/items/75eed749e14aaf52cec6

https://www.miraiserver.ne.jp/column/about_ubuntu-ssh/

https://qiita.com/ine1127/items/b50b9a8f831736cf14ea

https://wa3.i-3-i.info/word17549.html

https://happynap.net/2022-10-08-220946/

https://tech.asahi.co.jp/posts/20231005-bbf6

https://ccportal.ims.ac.jp/quickstartguide/teraterm

https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7

https://qiita.com/kumaGoro_95/items/d5a4ad035c1de68a59e3

https://qiita.com/mountcedar/items/43157ff1225c56500655

https://qiita.com/kaw404/items/a4550190e6f27ff565a5

[SSHサーバーの設定 - Linux技術者認定 LinuC | LPI-Japan](https://linuc.org/study/column/5707/)