🌃

ホームサーバー完全構築ガイド #1 OS導入とインフラ設定

2024/11/09に公開

記事シリーズ:
ホームサーバー完全構築ガイド #0 計画とハードウェア選定
ホームサーバー完全構築ガイド #2 サービス群の選定
ホームサーバー完全構築ガイド #3 WordPressのデプロイ

OSのインストール

ハードウェアを入手した後、プリインストールされたWindows OSをLinuxに置き換える必要があります。インストール手順は通常のコンピューターと同じです:OSが入ったUSBメモリを挿入し、BIOSでブートドライブを変更し、指示に従ってインストールを完了します。今回選択したLinuxディストリビューションは Ubuntu 22.04 Jammy Jellyfish です。

注意:インストール中にDockerのインストールを選択しないことをお勧めします。これは、古いバージョンがインストールされる可能性や、後の設定と競合する可能性があるためです。Dockerはインストール後、公式ドキュメントに従ってaptリポジトリまたは公式スクリプトを使用してインストールすることを推奨します。

OSのインストールが完了したら、インフラ設定を開始します。

OSバージョンについて
以下の内容は、私が使用しているLinuxディストリビューション、つまり Ubuntu 22.04 Jammy Jellyfish に基づいています。

基本設定

1. APT自動更新の設定

UbuntuはデフォルトでAPTパッケージ管理ツールを使用しています。APTの自動更新機能を有効にすることで、システムが常に最新のセキュリティパッチとソフトウェア更新を受け取ることができます。しかし、サーバー環境では、自動更新が予期せぬ問題を引き起こす可能性があります。特にカーネルや重要なサービスの更新に関しては注意が必要です。安全な更新のみを自動的にインストールし、他の更新は定期的に手動でチェックすることをお勧めします。

自動更新するパッケージの設定

/etc/apt/apt.conf.d/50unattended-upgrades ファイルを編集し、Unattended-Upgradeが自動更新するパッケージソースを制御します。

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
};

上記の設定はセキュリティ更新のみを自動的にインストールします:

  • ${distro_id}:${distro_codename}-security:Ubuntuのセキュリティ更新ソース
  • ${distro_id}ESM:${distro_codename}-infra-security:Ubuntu ESM(Extended Security Maintenance)からの追加のセキュリティメンテナンスサポートソース
  • ${distro_id}ESMApps:${distro_codename}-apps-security:Ubuntu ESMからのアプリケーションセキュリティ更新ソース

自動更新の頻度設定

/etc/apt/apt.conf.d/20auto-upgrades ファイルを編集し、以下の内容が含まれていることを確認します。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";

各項目の意味:

  • APT::Periodic::Update-Package-Lists "1";:毎日パッケージリストを更新
  • APT::Periodic::Unattended-Upgrade "1";:毎日自動アップグレードを実行
  • APT::Periodic::AutocleanInterval "7";:7日ごとにダウンロードしたパッケージを自動的にクリーンアップ

サービスの有効化

以下のコマンドを実行して、unattended-upgrades サービスが有効で実行中であることを確認します。

sudo systemctl enable unattended-upgrades
sudo systemctl start unattended-upgrades

ログの確認と通知の設定

自動更新の状況を確認するには、/var/log/unattended-upgrades/ ディレクトリ内のログファイルを参照できます。更新状況をタイムリーに把握するために、メール通知を設定することをお勧めします。/etc/apt/apt.conf.d/50unattended-upgrades に以下を追加します。

Unattended-Upgrade::Mail "your-email@example.com";

2. SSHの設定

サーバーが自宅にある場合でも、SSHを使用してリモートでログインする方が便利です。セキュリティを強化するために、以下の設定を行うことをお勧めします。

鍵の生成またはインポート

既にSSH鍵を持っている場合は、それをサーバーにコピーできます。新しい鍵を生成するには、以下のコマンドを使用します。

ssh-keygen -t rsa -b 4096

公開鍵をサーバーに追加

以下のコマンドを使用して、公開鍵をサーバーの ~/.ssh/authorized_keys ファイルに追加します。

ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip

sshd_config の設定

/etc/ssh/sshd_config ファイルを編集し、以下の設定を確認または追加します。

Port 2222                   # デフォルトの22以外のポートに変更
PermitRootLogin no          # rootログインを禁止
PasswordAuthentication no   # パスワード認証を無効化
PubkeyAuthentication yes    # 公開鍵認証を有効化
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

鍵の権限設定

~/.ssh ディレクトリと authorized_keys ファイルの権限を正しく設定します。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

SSHサービスの再起動

sudo systemctl restart sshd

注意:SSHの設定を変更してサービスを再起動する前に、物理コンソールなど他の方法でサーバーにアクセスできることを確認してください。万が一設定ミスでログインできなくなった場合に備えます。

新しいSSH設定のテスト

新しいポートと設定を使用して、クライアントから接続を試みます。

ssh -p 2222 user@server_ip

3. UFWファイアウォールの設定

簡単なファイアウォールであるUFWを使用して、サーバーのセキュリティを向上させます。

UFWのインストール(必要な場合)

sudo apt update
sudo apt install ufw

デフォルトルールの設定

sudo ufw default deny incoming
sudo ufw default allow outgoing

必要なサービスを許可

必要に応じて、特定のポートやサービスを許可します。

sudo ufw allow 2222/tcp      # 新しいSSHポートを許可
sudo ufw allow http
sudo ufw allow https

SSHログイン速度の制限

ブルートフォース攻撃を防ぐために、SSHの接続速度を制限します。

sudo ufw limit 2222/tcp

UFWの有効化

sudo ufw enable

ルールの確認と管理

現在のルールを確認:

sudo ufw status verbose

ルールを削除:

sudo ufw delete allow 2222/tcp

4. Dockerのインストール

公式ドキュメントの手順に従って、Dockerをインストールすることをお勧めします。

インストール手順の概要

  1. 古いバージョンの削除
sudo apt remove docker docker-engine docker.io containerd runc
  1. リポジトリの設定
sudo apt update
sudo apt install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker Engineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER

注意:グループ変更を有効にするために、再ログインが必要です。

5. MySQLのインストール

MySQLのインストール

sudo apt update
sudo apt install mysql-server

セキュリティ設定

sudo mysql_secure_installation
  • rootパスワードの設定
  • 匿名ユーザーの削除
  • rootのリモートログインを禁止
  • テストデータベースの削除
  • 権限テーブルの再読み込み

新しいユーザーの作成

MySQLにログインして、新しいユーザーを作成し、必要な権限を付与します。

sudo mysql
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

リモートアクセスの設定(必要な場合)

/etc/mysql/mysql.conf.d/mysqld.cnf を編集し、bind-address を変更します。

bind-address = 0.0.0.0

警告:リモートアクセスを有効にするとセキュリティリスクが増加します。ファイアウォールでMySQLのポート(デフォルトは3306)へのアクセスを制限するか、SSHトンネルを使用して接続することをお勧めします。

6. Redisのインストール

Redisのインストール

sudo apt update
sudo apt install redis-server

セキュリティ設定

/etc/redis/redis.conf を編集し、以下の変更を行います。

  • デフォルトの bind 127.0.0.1 ::1 を維持し、ローカルインターフェイスのみをリッスン
  • アクセスパスワードを設定:
requirepass your_redis_password

サービスの有効化と確認

sudo systemctl enable redis-server
sudo systemctl start redis-server
sudo systemctl status redis-server

Redisのテスト

redis-cli
AUTH your_redis_password
PING

PONG と返されれば成功です。

7. ddclientを使用したDDNSの設定

ddclientのインストール

sudo apt update
sudo apt install ddclient

ddclientの設定

/etc/ddclient.conf を編集します。設定例:

daemon=300
syslog=yes
pid=/var/run/ddclient.pid
ssl=yes
use=web, web=dynamicdns.park-your-domain.com/getip

protocol=cloudflare
zone=yourdomain.com
login=your_email@example.com
password=your_api_token
subdomain.yourdomain.com

Cloudflare APIトークンの使用

CloudflareダッシュボードでDNS編集権限を持つAPIトークンを作成し、それを password として使用します。

設定ファイルの権限設定

sudo chmod 600 /etc/ddclient.conf

ddclientサービスの有効化と起動

sudo systemctl enable ddclient
sudo systemctl start ddclient

ddclientの状態確認

sudo systemctl status ddclient

8. バックアップと復元の戦略

データの安全性を確保するために、重要なデータや設定ファイルを定期的にバックアップすることをお勧めします。rsynctar などのツールを使用してローカルバックアップを行うか、リモートストレージにアップロードします。

rsyncを使用したバックアップ例

rsync -av --delete /source/directory/ /backup/directory/

9. システム監視とログ管理

htopnetdata などの監視ツールをインストールして、システムリソースをリアルタイムで監視します。ログローテーション(logrotate)とログ分析ツールを設定して、システムの異常を早期に発見します。

htopのインストール

sudo apt update
sudo apt install htop

10. セキュリティ強化

  • Fail2Banのインストールと設定:ブルートフォース攻撃を防ぎます。
sudo apt update
sudo apt install fail2ban
  • Fail2Banの設定ファイルを編集

/etc/fail2ban/jail.local を作成または編集し、SSHの保護を有効にします。

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
  • システムとソフトウェアの定期的な更新:最新のセキュリティパッチを適用します。

  • 不要なポートの閉鎖:必要最小限のポートのみを開放し、攻撃の表面積を最小化します。

  • 侵入検知システムの導入SnortOSSEC などを検討します。

11. Nginxのインストールと設定

Nginxの最新安定版インストール

Ubuntuのデフォルトリポジトリには最新の安定版Nginxが含まれていない場合があるため、Nginxの公式リポジトリを追加してインストールします。

  1. Nginx公式署名キーのインポート

    公式のリポジトリを利用するには、署名キーをインポートします。

    curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
    
  2. Nginxのリポジトリ追加

    次に、リポジトリのソースリストを追加します。安定版が必要な場合は以下を実行してください。

    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
    
  3. Nginxのインストール

    追加後、APTを更新してNginxをインストールします。

    sudo apt update
    sudo apt install nginx
    
  4. Nginxのサービス状態確認

    インストール後、自動的に起動されるため、以下のコマンドで起動を確認します。

    sudo systemctl status nginx
    

Nginxの基本設定

Nginxの主な設定ファイルは /etc/nginx/nginx.conf にあり、個別のWebサイト設定は /etc/nginx/sites-available/ に配置されます。ここで基本的なサーバーブロック設定を行います。

sudo nano /etc/nginx/sites-available/your_domain

以下の例は、Nginxでの基本的なサーバーブロック設定です。

server {
    listen 80;
    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

#### サーバーブロックの有効化

次に、サーバーブロックを有効化するために、上記で作成した設定ファイルを `sites-enabled` ディレクトリにシンボリックリンクします。

```bash
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

設定にエラーがないかチェックします。

sudo nginx -t

設定ファイルにエラーがなければ、Nginxの設定を反映するための方法は以下の2つがあります。

設定を反映する方法1:再起動せずにリロード

再起動を行わずに設定を反映するには、次のいずれかのコマンドを使用します。

  1. systemctl reload nginxsystemd 管理下でサービスをリロードする一般的な方法です。

    sudo systemctl reload nginx
    
  2. nginx -s reload:Nginx プロセスに直接リロード信号を送信する方法です。システムが systemd を使用していない場合に便利です。

    sudo nginx -s reload
    

どちらのコマンドも、Nginxプロセスを再起動せずに設定をリロードし、既存の接続が中断されることなく新しい設定が適用されます。

  • systemctl reload nginx は、systemd 環境(例:Ubuntu 16.04以降)で推奨されます。systemd の管理下でNginxが実行されている場合は、この方法が一般的です。
  • nginx -s reloadsystemd がない環境や手動でNginxを管理する場合に適しています。

設定を反映する方法2:サービスを再起動して反映

完全な再起動で設定を反映する場合は、以下のコマンドを実行します。この方法ではNginxサービスが停止し、再度起動されるため、一瞬ですが既存の接続が切断される可能性があります。

sudo systemctl restart nginx

通常、設定変更後のリロードでは、サービス停止が発生しない reload コマンドを利用するのが推奨されますが、重大な設定変更やトラブルシューティング時には再起動が必要な場合もあります。

ファイアウォール設定

Nginxをインストールすると、ファイアウォールでHTTP(80番ポート)とHTTPS(443番ポート)を許可する必要があります。

sudo ufw allow 'Nginx Full'

SSLの設定(Let’s Encryptを使用)

sudo apt install certbot python3-certbot-nginx

次に以下のコマンドを実行してSSL証明書を取得し、Nginxに適用します。

sudo certbot --nginx -d your_domain -d www.your_domain

SSL証明書の自動更新

Let’s EncryptのSSL証明書は90日間有効です。Certbotには自動更新機能が備わっており、以下のコマンドで更新が正しく動作するかテストできます。

sudo certbot renew --dry-run

以上の手順で、Ubuntuで最新のNginx安定版をインストールし、基本的なサーバー設定およびSSL設定を完了できます。

まとめ

これで、自宅サーバーの基本設定が完了しました。適切な設定とセキュリティ強化により、サーバーを安定して安全に運用できます。次回の記事では、各種サービスのデプロイと最適化について詳しく説明します。

参考資料

Discussion