自治体情報システム担当者のためのNginx導入実践:HTTPSとリバースプロキシによるセキュアなWeb環境構築
はじめに:自治体におけるWebサーバーの重要性とNginxの可能性
自治体情報システムにおいて、Webサーバーは市民向けの情報公開、庁内向け情報共有、各種申請システム連携など、多岐にわたる重要な役割を担っています。これらのサービスは、安定稼働、高いセキュリティ、そして効率的な運用が求められます。
オープンソースソフトウェア(OSS)であるNginx(エンジンエックス)は、軽量でありながら高パフォーマンスを発揮するWebサーバーとして広く利用されています。静的コンテンツの高速配信に加えて、リバースプロキシ、ロードバランサー、HTTPキャッシュなど多機能なため、自治体情報システムにおける様々なニーズに応えることが可能です。
本記事では、自治体情報システム部門の担当者様がNginxを効果的に導入し、特にセキュリティ強化のためのHTTPS設定と、既存システムとの連携を円滑にするリバースプロキシ機能の活用に焦点を当て、具体的な手順と自治体環境特有の考慮点を解説します。
Nginxの基本的な導入手順
Nginxは、主要なLinuxディストリビューションで利用可能です。ここでは、多くの環境で採用されているUbuntu Server 22.04 LTSを例に導入手順を説明します。
1. システムの更新
まず、システムのパッケージリストを更新し、既存のパッケージをアップグレードします。
sudo apt update
sudo apt upgrade -y
2. Nginxのインストール
aptパッケージマネージャーを使用してNginxをインストールします。
sudo apt install nginx -y
3. Nginxサービスの起動と自動起動設定
インストール後、Nginxサービスを起動し、システム起動時に自動的に起動するよう設定します。
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
sudo systemctl status nginx
コマンドの出力で「active (running)」と表示されていれば、Nginxは正常に稼働しています。
4. ファイアウォールの設定
Ubuntu環境では、UFW(Uncomplicated Firewall)が標準で利用できます。Nginxをインストールすると、UFWはNginxに関連するプロファイルを自動的に登録します。HTTP(80番ポート)およびHTTPS(443番ポート)の通信を許可するよう設定します。
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'
sudo ufw enable
sudo ufw status
sudo ufw status
コマンドで「Nginx HTTP」と「Nginx HTTPS」が許可されていることを確認してください。
この段階で、サーバーのIPアドレスまたはドメイン名にWebブラウザからアクセスすると、Nginxのデフォルトのウェルカムページが表示されるはずです。
Webサーバーとしての基本設定と静的コンテンツ配信
Nginxの主要な設定ファイルは /etc/nginx/nginx.conf
です。しかし、サイトごとの設定は通常 /etc/nginx/sites-available/
ディレクトリに個別の設定ファイルを作成し、/etc/nginx/sites-enabled/
にシンボリックリンクを作成して有効化します。
1. デフォルト設定ファイルの確認
/etc/nginx/sites-available/default
がNginxの初期設定ファイルです。
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html; # Webコンテンツのルートディレクトリ
index index.html index.htm index.nginx-debian.html; # デフォルトで表示するファイル
server_name _; # 任意のドメイン名
location / {
try_files $uri $uri/ =404;
}
# その他の設定...
}
2. 静的コンテンツの配置
デフォルト設定では、/var/www/html
ディレクトリにWebコンテンツ(HTML、CSS、JavaScriptファイルなど)を配置します。例えば、index.html
ファイルを作成して配置すると、その内容がWebブラウザに表示されます。
echo "<h1>Hello from Nginx on your Local Government Server!</h1>" | sudo tee /var/www/html/index.html
WebブラウザからサーバーのIPアドレスにアクセスし、上記の内容が表示されることを確認してください。
3. 新しいサイト設定ファイルの作成(推奨)
複数のWebサイトをホストする場合や、設定を明確に管理したい場合は、専用の設定ファイルを作成します。
sudo nano /etc/nginx/sites-available/your_domain.conf
例:your_domain.conf
の内容
server {
listen 80;
listen [::]:80;
server_name your_domain.example.jp www.your_domain.example.jp;
root /var/www/your_domain;
index index.html;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
# セキュリティヘッダーの追加 (自治体サイトで特に重要)
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options "SAMEORIGIN";
# Content-Security-Policy などはサイトの要件に応じて追加
}
新しいサイトのWebコンテンツディレクトリを作成します。
sudo mkdir -p /var/www/your_domain
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain
4. 設定の有効化とNginxの再読み込み
作成した設定ファイルを有効化し、Nginxに設定を再読み込みさせます。
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/
sudo nginx -t # 設定ファイルの文法チェック
sudo systemctl reload nginx
nginx -t
コマンドで「syntax is ok」と表示されれば、設定に問題はありません。
HTTPSによるセキュリティ強化
自治体Webサイトにおいて、HTTPS(HTTP Secure)は市民の個人情報保護、通信の盗聴・改ざん防止のために必須です。NginxではSSL/TLS証明書を設定することで簡単にHTTPSに対応できます。ここでは、無償のSSL/TLS証明書を提供するLet's EncryptとCertbotを利用する方法を説明します。
1. Certbotのインストール
CertbotはLet's Encrypt証明書の取得と設定を自動化するツールです。Snapd経由でインストールすることを推奨します。
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
2. 証明書の取得とNginxへの適用
CertbotをNginxプラグインとともに実行し、ドメインの証明書を取得・適用します。
sudo certbot --nginx -d your_domain.example.jp -d www.your_domain.example.jp
コマンド実行中に、メールアドレスの入力、利用規約への同意、HTTPアクセスをHTTPSへリダイレクトするかどうかの選択を求められます。通常、HTTPアクセスをHTTPSへ強制リダイレクトすることを選択します(「2: Redirect」)。
成功すると、Nginxの設定ファイルが自動的に更新され、HTTPSが有効になります。/etc/nginx/sites-available/your_domain.conf
を確認すると、listen 443 ssl;
や ssl_certificate
ディレクティブが追加されているはずです。
3. 証明書の自動更新設定
Let's Encrypt証明書は90日間で期限切れとなります。Certbotは自動更新のためのcronジョブまたはsystemdタイマーを自動的に設定します。テスト実行で更新が可能か確認できます。
sudo certbot renew --dry-run
このコマンドでエラーが出なければ、自動更新は正しく機能するはずです。
リバースプロキシとしての活用
Nginxのリバースプロキシ機能は、自治体環境において、既存のWebアプリケーションや内部システムへの安全なアクセスを提供し、ネットワーク構成の柔軟性を高める上で非常に有用です。
リバースプロキシの概念とメリット
- セキュリティの向上: 内部ネットワークのWebアプリケーションを直接公開せず、Nginxが外部からのアクセスを受け付けるため、内部システムのIPアドレスやポートを隠蔽できます。
- 負荷分散: 複数のバックエンドサーバーにリクエストを分散させ、システム全体の可用性とパフォーマンスを向上させることができます。
- SSL/TLSオフロード: NginxでHTTPS終端を行い、バックエンドのアプリケーションサーバーはHTTPで通信することで、アプリケーションサーバーの負荷を軽減できます。
- 既存システムとの連携: 古いWebアプリケーションや、SSL/TLSに対応していない内部システムに対しても、Nginxを介してHTTPSアクセスを提供できます。
リバースプロキシ設定例:内部Webアプリケーションへのプロキシ
ここでは、内部ネットワーク上にあるIPアドレス 192.168.1.100
のポート 8080
で動作するWebアプリケーションを、Nginxを介して internalapp.your_city.jp
というドメインでHTTPS公開する例を示します。
server {
listen 80;
server_name internalapp.your_city.jp;
return 301 https://$host$request_uri; # HTTPアクセスをHTTPSへリダイレクト
}
server {
listen 443 ssl;
server_name internalapp.your_city.jp;
# Certbotで取得したSSL/TLS証明書パスを指定
ssl_certificate /etc/letsencrypt/live/internalapp.your_city.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/internalapp.your_city.jp/privkey.pem;
# SSL/TLS設定の強化 (自治体セキュリティポリシーに合わせ調整)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNSリゾルバ (自治体内部DNSを優先)
resolver_timeout 5s;
location / {
proxy_pass http://192.168.1.100:8080; # バックエンドアプリケーションのURL
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900s; # 必要に応じてタイムアウト値を調整
proxy_send_timeout 900s;
proxy_connect_timeout 75s;
}
}
この設定では、外部からの internalapp.your_city.jp
へのHTTPSリクエストがNginxで受け付けられ、Nginxがそのリクエストを内部の 192.168.1.100:8080
へ転送します。バックエンドアプリケーションは外部に直接公開されることなく、Nginxがゲートウェイとして機能します。
設定を保存後、sudo nginx -t
で文法チェックを行い、sudo systemctl reload nginx
でNginxを再読み込みしてください。
自治体環境における運用上の考慮点
自治体システムでNginxを運用する際には、長期的な安定稼働とセキュリティ維持のために、以下の点を考慮することが重要です。
1. セキュリティポリシーへの準拠
- SSL/TLSの強度維持: 自治体の情報セキュリティポリシーに従い、最新の安全なSSL/TLSプロトコル(TLSv1.2以降を推奨)と暗号スイートを設定し、古い脆弱なものは無効化してください。
- アクセス制御: 必要なIPアドレス帯域からのアクセスのみを許可する(例:庁内LAN、特定のVPN接続元)など、ファイアウォールやNginxのアクセス制限機能(
allow
/deny
ディレクティブ)を適切に設定します。 - セキュリティヘッダー:
X-Frame-Options
、X-XSS-Protection
、X-Content-Type-Options
、Content-Security-Policy
などのHTTPセキュリティヘッダーを適切に設定し、クリックジャッキングやXSS(クロスサイトスクリプティング)といった攻撃から保護します。
2. 既存システムとの連携
- IPアドレスとポートの確認: プロキシ先の内部システムのIPアドレスとポートが正しいことを確認します。
- HTTPヘッダーの調整:
X-Real-IP
やX-Forwarded-For
ヘッダーを適切に設定することで、バックエンドのアプリケーションがクライアントの正しいIPアドレスを認識できるようになります。古いアプリケーションによっては、これらのヘッダーの処理に注意が必要です。 - 認証連携: 必要に応じて、Nginx側でHTTP Basic認証を設定したり、SAMLやOpenID ConnectなどのSSO(シングルサインオン)連携を検討したりすることも可能です。
3. ログ管理と監視
- アクセスログ・エラーログの確認: Nginxのアクセスログ(
/var/log/nginx/access.log
)とエラーログ(/var/log/nginx/error.log
)を定期的に確認し、異常がないか監視します。ログローテーション設定(/etc/logrotate.d/nginx
)を確認し、ディスク容量を圧迫しないよう適切に管理してください。 - 監視ツールとの連携: Zabbixなどの監視ツールを導入し、Nginxプロセスの稼働状況、ポートの死活監視、アクセス数の推移、エラーログの検知などを自動化することで、障害の早期発見・対応が可能になります。
4. 長期運用とアップデート
- 定期的なアップデート: Nginx本体、OS、Certbotなどの関連ソフトウェアは、セキュリティ脆弱性への対応や機能改善のために定期的にアップデートが必要です。本番環境への適用前にテスト環境で検証し、計画的に実施してください。
- バックアップ: Nginxの設定ファイル(
/etc/nginx/
ディレクトリ全体)、SSL/TLS証明書、Webコンテンツは定期的にバックアップを取得し、障害発生時に迅速に復旧できるよう備えてください。
5. パフォーマンスとスケーラビリティ
- workerプロセスの調整:
/etc/nginx/nginx.conf
内のworker_processes
ディレクティブは、CPUコア数に合わせて調整することでパフォーマンスを最適化できます。 - キャッシュの利用: 静的コンテンツの配信速度向上のため、
expires
ディレクティブによるブラウザキャッシュや、Nginxのプロキシキャッシュ機能の利用を検討してください。
まとめ
Nginxは、自治体情報システムにおいて、静的Webサイトの公開から、既存システムのセキュリティ強化、サービス連携の中継まで、幅広い用途で活用できる強力なOSSです。
本記事で解説したNginxの導入、HTTPSによるセキュリティ強化、そしてリバースプロキシとしての具体的な活用法は、自治体情報システム部門の担当者様が日々の業務で直面するWeb環境の課題解決の一助となるでしょう。特に、セキュリティと安定稼働が求められる自治体環境においては、Nginxの特性を理解し、適切な設定と運用を心がけることが重要です。
OSSの柔軟性とコストメリットを最大限に活かし、より安全で効率的な自治体情報システム構築を進めていただければ幸いです。