ホームサーバー完全構築ガイド #1 OS導入とインフラ設定
記事シリーズ:
ホームサーバー完全構築ガイド #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をインストールすることをお勧めします。
インストール手順の概要
- 古いバージョンの削除
sudo apt remove docker docker-engine docker.io containerd runc
- リポジトリの設定
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
- Docker Engineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 現在のユーザーを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. バックアップと復元の戦略
データの安全性を確保するために、重要なデータや設定ファイルを定期的にバックアップすることをお勧めします。rsync
や tar
などのツールを使用してローカルバックアップを行うか、リモートストレージにアップロードします。
rsyncを使用したバックアップ例
rsync -av --delete /source/directory/ /backup/directory/
9. システム監視とログ管理
htop
や netdata
などの監視ツールをインストールして、システムリソースをリアルタイムで監視します。ログローテーション(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
-
システムとソフトウェアの定期的な更新:最新のセキュリティパッチを適用します。
-
不要なポートの閉鎖:必要最小限のポートのみを開放し、攻撃の表面積を最小化します。
-
侵入検知システムの導入:
Snort
やOSSEC
などを検討します。
11. Nginxのインストールと設定
Nginxの最新安定版インストール
Ubuntuのデフォルトリポジトリには最新の安定版Nginxが含まれていない場合があるため、Nginxの公式リポジトリを追加してインストールします。
-
Nginx公式署名キーのインポート
公式のリポジトリを利用するには、署名キーをインポートします。
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
-
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
-
Nginxのインストール
追加後、APTを更新してNginxをインストールします。
sudo apt update sudo apt install nginx
-
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:再起動せずにリロード
再起動を行わずに設定を反映するには、次のいずれかのコマンドを使用します。
-
systemctl reload nginx
:systemd
管理下でサービスをリロードする一般的な方法です。sudo systemctl reload nginx
-
nginx -s reload
:Nginx プロセスに直接リロード信号を送信する方法です。システムがsystemd
を使用していない場合に便利です。sudo nginx -s reload
どちらのコマンドも、Nginxプロセスを再起動せずに設定をリロードし、既存の接続が中断されることなく新しい設定が適用されます。
systemctl reload nginx
は、systemd
環境(例:Ubuntu 16.04以降)で推奨されます。systemd
の管理下でNginxが実行されている場合は、この方法が一般的です。nginx -s reload
はsystemd
がない環境や手動で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