見出し画像

🛠️ ミニPC x UbuntuServer でサーバー立てて、SSH接続するところまでやってみた


はじめに

この記事の対象

  • ローカルネットワーク内でサーバーを立ててみたい初心者の方

  • サーバーを立てる作業のイメージだけでも掴みたい方

  • 認証鍵を使ったssh接続の方法が知りたい方

ここでやること

  • ミニPC に Linux Server をインストールし、sshサーバーを有効化

  • クライアント側PC で サーバーへssh接続(rsa認証鍵使用)する

環境

  • ハードウェア

    • サーバー化するPC(ミニPC) : GMKtec NucBox G3(intel N100 8GB/256GB)

    • クライアントPC : MacBookPro (M1 late2021 macOS : Sonoma14.4.1)

    • USBフラッシュメモリ(USBBoot 用) : 32GB

  • ソフトウェア

    • Ubuntu Server 24.04

1. ミニPCにLinuxServerをインストール

1.1 Ubuntu Serverインストール用のUSBメモリ作成

usbブートでミニPCにLinuxServerをインストールします。
そのために、まずはUSBメモリを作成していきましょう。

  1. Ubuntu Server の ISOイメージ を 公式サイトからダウンロード

  2. Rufus や Etcher などの ISO書き込みツール で USBに ISO を書き込む

<Tips> なぜ書き込みツールを使うの?(ファイルコピーだけではダメなの?)
A. ファイルコピーでは、ミニPCでUSBブートする際に必要なブートセクタの情報が欠損してしまうので専用のISO書き込みツールで書き込む必要があるのです

1.2 Ubuntu Serverのインストール

bios画面>bootオプションからUSBメモリを使って起動するように設定し、Ubuntu Server のインストールを進めていきます

  1. USBメモリをミニPCに接続し、電源を入れます。

  2. BIOS設定画面に入ります(通常、起動時にF2やDelキーを押すことでアクセスできます)。

  3. Bootタブで、USBメモリから起動するように設定します。

    • NucBox の場合、「FIXED BOOT ORDER Priorities」欄の 「boot option #1」欄に USBを指定してください

  4. Ubuntu Serverのインストールが始まります。

    • 画面の指示通りに設定すれば問題なく完了できるかと思いますが、詳細な説明が欲しい方は以下参考になさってください。

3. SSHサーバー・クライアントの準備

3.1 SSHサーバーのインストール

外部から ssh接続 できるように SSHサーバーをインストールしましょう

  1. ミニPCにログイン(インストール時に設定したユーザー名とパスワードを使用)。

  2. 端末に以下のコマンドを入力してSSHサーバーをインストールします。

sudo apt update
sudo apt install openssh-server

<Tips> コマンドの内容説明
apt : Linuxでのパッケージ管理用コマンド

3 .インストールが完了したら、SSHサーバーが正常に動作しているか確認します。

sudo systemctl status ssh

「active (running)」と表示されていれば、SSHサーバーが動作しています。
「inactive(dead)」と表示されている場合は SSHサーバー が起動していないだけですので、落ち着いて起動しましょう

sudo systemctl start ssh

3.2 SSHクライアントの準備

• SSHクライアントを使用して接続する別のPCやラップトップ(Windows、macOS、Linuxなど)を準備します。
• Windowsの場合は、PuTTYやWindows Terminal、macOSやLinuxの場合は標準の端末(Terminal)を使用できます。

3.3 公開鍵と秘密鍵の生成

パスワードのみでのSSH接続を許可していると、セキュリティ性が低すぎるので 公開鍵暗号方式 を用いた接続に限定しましょう

1 . クライアントPC(SSH接続を行うPC)でターミナルを開き、以下のコマンドを実行して鍵ペアを生成します。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

<Tips> コマンドのオプション内容説明
-t : 暗号化方式を指定(ここでは rsa方式(巨大な数の素因数分解に膨大な時間がかかることを利用した方式。))
-b : 鍵のビット数を指定(ビット数が大きいほど、鍵の組み合わせの総数が増え、セキュリティが強固になる)
-C : コメントを指定


2 . 提示される質問に対して、ファイル名とパスフレーズを設定します(デフォルトのままでもOK)。
3. ~/.ssh/ディレクトリにid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が生成されます。

<Tips> パスワードのみでのSSH接続を許可しているとどんなリスクがあるの?
A. 以下のようなリスクがあります

  • ブルートフォース攻撃のリスク

    • パスワードは、攻撃者が多くのパスワード候補を試すブルートフォース攻撃に対して脆弱です。特に短く、簡単なパスワードは容易に破られる可能性があります。

  • パスワードの推測

    •  「123456」や「password」のようなパスワードを使用している場合、攻撃者がこれを推測することで簡単にアクセスできる可能性があります。

  • フィッシングやソーシャルエンジニアリング

    • パスワードは、フィッシング攻撃やソーシャルエンジニアリング(覗き見とか)を通じて盗まれる可能性があります。これは、攻撃者がユーザーをだましてパスワードを提供させる手法で、技術的なスキルが不要なため広く行われています。

  • 使い回しパスワードの漏洩

    • パスワードは、フィッシング攻撃やソーシャルエンジニアリングを通じて盗まれる可能性があります。これは、攻撃者がユーザーをだましてパスワードを提供させる手法で、技術的なスキルが不要なため広く行われています。

  • 中間攻撃者のリスク

    • パスワードがネットワーク上で盗聴される可能性があります。SSHはデータを暗号化しますが、万が一暗号が破られたり、サーバーの秘密鍵が漏洩したりした場合、パスワードが傍受されるリスクがあります。

  • ログ追跡・監査の難しさ

    • 複数のユーザーが同じパスワードを共有している場合、誰がアクセスしたかを正確に追跡することが難しくなります。公開鍵認証を使用することで、より正確な追跡が可能になります。

3.4 公開鍵をサーバーへ転送

クライアント側で作成したキーペアの内、公開鍵をサーバーに取り込みましょう。

1 . 以下のコマンドをクライアントPCで実行し、公開鍵をサーバーへ転送します(userはミニPCのユーザー名、ip_addressはサーバーのIPアドレスです)。

ssh-copy-id -i rsa.pub user@ip_address

<Tips> コマンドのオプション内容説明
-i 転送する公開鍵の ファイル名を指定(未指定の場合、デフォルトで rsa.pub が転送される)

2 . パスワードを入力し、転送が完了します。

3.5 サーバー側の sshd_configの書き換え

セキュリティ強化のため、認証鍵を使わないとサーバーに接続できないように設定しましょう

1. サーバーの/etc/ssh/sshd_configファイルを編集します。

sudo nano /etc/ssh/sshd_config

2. 以下の設定を確認または追加します。(筆者の手元では初期状態ではコメントアウトされてました)

PasswordAuthentication no

3. ファイルを保存して終了します(Ctrl + X、Y、Enterキー)。
4. SSHサービスを再起動します。

sudo systemctl restart ssh

4. SSH接続してみよう

4.1 接続

1. クライアントPCから、公開鍵を使用してサーバーへSSH接続を試みます。

ssh user@ip_address

2. パスフレーズを入力し、以下のようなメッセージが表示されれば成功です!

Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-40-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Sun Aug 11 10:43:53 AM UTC 2024

  System load:             0.0
  Usage of /:              6.7% of 97.87GB
  Memory usage:            4%
  Swap usage:              0%
  Temperature:             48.0 C
  Processes:               143
  Users logged in:         1
  IPv4 address for wlp1s0: ***.***.**.**
  IPv6 address for wlp1s0: ****:****:****:****::****:****
  IPv6 address for wlp1s0: ****:****:****:****:****:****:****:****

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

44 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


Last login: Sun Aug 11 10:25:28 2024 from ***.***.**.**

5. 番外編

5.1 ssh config でラクにssh接続しましょう

.ssh/config に ssh config を作成しておくと、以下のように任意のフレーズでssh接続することができ、ipアドレスなどの入力の手間が省けます

ssh hoge

1 . .ssh/configを作成。クライアント側PCのコマンドラインツールで以下コマンドを実行してください(すでにconfigファイル作成済みの方は飛ばしてください)

cd .ssh
touch config
open config

2 . config の編集

Host <任意の接続名>
  HostName <接続先のipアドレス>
  IdentityFile <秘密鍵の場所>
  Port 22
  User <接続先のユーザー名(LinuxServerの初期設定の時に設定したやつ)>

3 . 変更の反映

source config

4 . 接続確認して、接続できたらconfig設定完了!

5.2 結局、公開鍵暗号方式って何やってるの?

「相手の公開鍵」でメッセージを暗号化 し、送信
-> 相手はメッセージ受信後、「相手の秘密鍵」でメッセージを復号化

クライアント側:                            サーバー側:
+----------------+                     +----------------+
| 公開鍵(送信)     |-------------------->| 公開鍵(受信)     |
| 秘密鍵(作成・保管) |                     | 秘密鍵(作成・保管) |
+----------------+                     +----------------+

クライアント側:
1. 公開鍵・秘密鍵ペアの生成
2. 公開鍵をサーバーに送信

サーバー側:
1. クライアントの公開鍵を受信
2. 公開鍵を使ってメッセージを暗号化し、クライアントに送信

クライアント側:
3. 暗号化メッセージを受信
4. 秘密鍵を使ってメッセージを復号

6. おわりに

おことわり

この記事は、駆け出しインフラエンジニアの筆者が自分自身の知識の備忘録として書いている側面が強いです。
したがって、「これ他の記事でも書いてあるやん」「なんでこんな回りくどいことしとるんやろ」と感じられても優しい目で見守ってください

次は今回新しく作成したサーバーにredmine、gitlabの構築をしてみる予定

この記事が気に入ったらサポートをしてみませんか?