はじめに
Linuxでサーバーを立てる講義があってサーバー作りたい熱が再燃してしまったので、今後のためにどうやってSSH接続のセットアップを行うのか残したいと思います。
ただLinuxの扱いに慣れていないためまだまだ間違いなどあるとは思いますが温かい目で見守っていただけると幸いですm(_ _)m
環境
-
SSHサーバー
dynabook Satellite B65/R型番 PB65RNAAC27AD11 CPU インテル® Celeron® プロセッサー 3215U RAM 8GB ストレージ 500GB(HDD) OS Lubuntu 24.04.1 LTS -
SSHクライアント
dynabook RZ/MW型番 W6RZMW7BAL CPU 13th Gen Intel(R) Core(TM) i7-1360P RAM 32.0GB ストレージ 1TB(SSD) OS Windows 11 Home 24H2 クライアント Tera Term Version5.2 (Git 176aed267) -
ネットワーク環境
マシン IPアドレス サーバー 192.168.255.200/24(固定) クライアント 192.168.255.58/24(DHCP)
SSHサーバーとして格安でもらった色々と壊れてしまっている約10年落ちのノートパソコンを使用します。
SSHクライアントは普段大学でも使っているパソコンになります。
ネットワーク環境としては自分の部屋だけに張り巡らしたLANに接続してあります。そこから家全体のLANさらにマンション全体のLANと接続しているので二重ルーターどころではなく三重ルーターとなってしまっています。そのためいつか三重ルーターでも外部からアクセスできるようにしたいなと考えています。
ノートパソコンを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やLubuntuをインストールした段階ではsshのクライアントは入っていてもサーバーは入っていないのでOpenSSHをインストールします。
詳しくはこちらなどをご覧ください SSHについて #Linux - Qiita
# 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自体のインストールは前述の手順で完了となります。しかしこのままではユーザー名とパスワードが判ればアクセスできてしまうなどのセキュリティリスクがあります。以下の事も最低限行うようにします。
- #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ユーザーのログインを許可するかどうかを設定します。オプションとしては以下のようなものがあります。yes rootユーザのログインを許可 prohibit-password 通常のパスワード認証と、キーボードインタラクティブ認証を拒否するが、公開鍵認証とホストベースのGSSAPI認証だけは許可される。 no rootユーザのログインを許可しない -
38行目(PubkeyAuthentication)
公開鍵認証を利用するか否かです。後ほど設定するのでマストでyesにしておいてください。 -
58行目(PermitEmptyPasswords)
あんまり無いとは思いますがパスワードが設定されていないユーザーのログインを禁止するものです。
sshd -t
と構文チェックを行い何もエラーが表示されなかったら「構文上」は問題はありません。そしたらsshの設定を再読み込みします。
# sshd -t
# systemctl restart sshd
以上で設定したことが機能しているか10022ポートでの接続ならびにrootユーザーでの認証ができるかを確かめてください。
できるようになったことを確認するのは大切ですができないようになったことを確認することも同じように大切なので…
公開鍵認証
「公開鍵認証????ナニソレオイシイノ」って人はここを見てみてください
公開鍵認証方式とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
コマンドラインで公開鍵と秘密鍵を作成することもできますがここでは簡単のためTera Termの機能を利用したいと思います。
Tera Termでは[設定]>[SSH鍵生成]と選択することで以下のフォームが出てきます。
RSAやED25519などのような暗号化方式を選ぶことができますがここではED25519を選択しました。
どうやらRSAよりED25519のほうが高速かつセキュアらしいので…
「なにそれ!詳しく知りたいよー!」って方はここも見てみると良いでしょう。
気付けばssh-keygen -t の後にrsaでなくed25519と打つことが推奨されていた | ABC DX Tech Blog
RSA暗号ではビット数を選択する必要があります。世の中的には2048ビット以上が推奨となってきているみたいです。
またパスフレーズは認証のたびに求められますが一応空欄にすることもできます。
そして[公開鍵の保存]、[秘密鍵の保存]をそれぞれクリックし覚えやすい場所に保存しましよう。(特に秘密鍵はログインのたびに使用するので…)
そして作成した公開鍵ファイルをサーバーに転送します。
(*.pub)形式の公開鍵ファイルをアップロードしてください。秘密鍵はアップロードしないようにしてください。
ファイルをTera Termにドラッグ&ドロップすることで以下のダイアログが起動します。転送先は自由ですがわかりやすい場所にしましょう。
ファイルサイズが小さいのでアップロード自体はすぐに終了すると思います。
終了したらコマンドラインの操作に戻りましょう。ここでは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に設定したら完了です。
ここで一度ログアウトしてみて公開鍵認証できるかを試してみましょう。
もしできない場合は先に進まないでもう一度やり直してみましょう。
さて公開鍵認証が設定できたら公開鍵認証以外のログインを塞ぎます。
- #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を使うための各設定
とのことなので以下の作業を実行する際にはもう一つウィンドウを開いておいて作業を戻せるようにしてください。
# ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)
# ufw allow 10022
ルールを追加しました
ルールを追加しました (v6)
# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
許可するポート番号を間違えないように注意してください。
ここではデフォルトポリシーとしてパケットを棄却するようにしています。
しかし10022/TCPに来るIPv4,IPv6のパケットのみ通過するようにしました。ここで開くポートは/etc/ssh/sshd_configの14行目で設定したポートと合わせるようにします。
そして最後に新しくウィンドウを開き公開鍵認証でログインできることを確かめられば成功となります。
最後に
この記事では新しく作成したLubuntuのサーバーにsshするための手順を解説しました。しかしsshの脆弱性を利用してサーバーをハッキングされてしまうこともあります。ここで説明したのは基本的なセキュリティ対策ですがスマホアプリ(Google Authenticator等)を使った2要素認証(TOTP)やIPアドレス(CIDR表記)によるアクセス制限も設定できるようです。これからはそういった対策やAdGuard Homeのインストール、三重ルーター下のNAT越えなどにも取り組んでみたいと思います。
この記事は以上となります。ご覧いただきありがとうございました。
参考文献