安全にラズパイWebサーバーを世界に公開するための手順

2022/01/23

Apache IoT PHP Python Web アウトドア キャンプ ラズパイ 開発

ラズパイWebサーバーを安全に公開する方法

こんにちはICHIKENです。

今回はラズパイをWebサーバーにしてページを安全に公開する手順を紹介します。

参考として、ラズパイWebサーバーで公開中の、アメリカ国立公園キャンプ場の空きまとめサイトのリンクを貼っておきます。

ラズパイWebサーバーで公開しているページはこちら >> https://ichiken.tplinkdns.com

Webアプリのソースコードも公開しています。

サンプルのGithubはこちら >> npcamp

公開Webサーバーとして機能させるだけならグローバルIPとApacheで事足ります。しかし公開することにより悪意ある攻撃にさらされるようになるため、それらからラズパイを守るための対策も一緒に実施しましょう。

安全を確保しつつ、ラズパイを公開するためにやることはザックリこんな感じです。

  • ラズパイにWebサーバー環境構築 PHP+Apache
  • ラズパイと、ラズパイに接続するPCの固定IP化
  • ラズパイのファイヤーウォール設定
  • ルーターのDDNS設定
  • ルーターのポートフォワーディング設定
  • 通信のSSL化(HTTPS化)

外に公開するのはルーターだけで、ルーターへのHTTP/HTTPSリクエストのみをラズパイに転送するようにします(ポートフォワーディング)。これにより、外からラズパイへ直接アクセスできないようにしておきます。

ポートフォワーディングだけで十分ですが、ついでにファイヤーウォールでHTTP/HTTPS以外を全てカットし、VNCやSSHなどラズパイにアクセスするために必要なポートをIPと一対一のセットで開けることにより、不正アクセスをシャットアウトします。

ではサクサク行きましょう。

前提条件

まず前提条件となる私の環境です。

ラズパイ 4 Model B 8GB
ラズパイOS Raspbian GNU/Linux 10 (buster)
PHP 7.3.31
Apache 2.4.38
ルーター TP-LINK Decoシリーズ
Decoファームウェア 1.5.1

ルーターはTP-LinkのDecoシリーズを使用しています。スマホアプリで簡単にDNS設定やポートフォワーディング設定ができます。接続可能台数も多く、IoT時代にうってつけのコスパ抜群ルーターですね。

ラズパイにWebサーバー環境構築 PHP+Apache

まずはサーバー環境を構築して、公開フォルダを設定します。

Apacheのインストールと動作確認

特に難しいところはないのでサクサク行きましょう。LXTerminalを開いて、定番のアップデートから。

sudo apt update
sudo apt upgrade

Apache2のインストール。

sudo apt install apache2

インストールが終わったらまずはラズパイでApacheの動作確認をします。ラズパイのブラウザでlocalhostへアクセスし、Apacheのページが見れるか確認。

http://localhost

次のようなページが表示されればOK。

Apacheのテストページ

ちなみに上記ページのパスは /var/www/html/index.html

PHPのインストールと動作確認

PHPを使わない人はすっ飛ばしてください。ただ、HTMLだけだと共通部分をファイル化して使ったりするのが手間なのでPHPは必須ですね。PHPはjavaScript等ブラウザ側に実行環境が入っているものと違って、サーバーサイドにインストールしておく必要があります。

sudo apt install php

ではPHPが動くか定番の確認。PHPの情報を吐き出すコードを書いたPHPファイルを作成してアクセスします。

テキストエディタでテスト用のphpファイルを新規作成してオープン。

sudo nano /var/www/html/info.php

確認用のコードを記述して保存。

<?php phpinfo(); ?>

とりあえずApacheの再起動

sudo systemctl restart apache2

PHPの情報ページが開けたら動作確認完了です。

http://localhost/info.php
PHPのテストページ

公開用フォルダ設定

環境の準備はできたので、次に実際に公開するWebフォルダを設定します。初期の/var/www/html/を使う人は変更不要です。今回は下記リンクのアプリの「Web」フォルダを公開する前提で解説します。

サンプルのGithubはこちら >> npcamp
  • 権限設定 /etc/apache2/apache2.conf
  • 公開設定 /etc/apache2/sites-available/000-default.conf

解説で使うサンプルのパスは /home/ichi/VSCode/npcamp2/Web です。パスはご自身のものと置き換えてください。

公開するドキュメントルート

このWebフォルダ以下にあるファイルがWebページとして公開されます。今回の場合は/home/ichi/VSCode/npcamp2/Web/index.phpです。ではApacheの設定を変更していきます。

変更を加える場合はファイルのバックアップを取るようにしましょう。余計な文字等が入るとエラーでApacheが立ち上がらなくなります。どうしても解決できない場合に備え、稼働できていた状態に戻せるようにしておきます。

対象ファイルがあるフォルダへ移動して、コピーを作成。コピー先(バックアップファイル)の名前はなんでも良いですが、日付を付けておくのがよいです。

cd /etc/apache2
sudo cp apache2.conf apache2_date.conf
コピーでバックアップ作成

apache2.confをテキストエディタで開き、ドキュメントルートに対する権限を追加します。

sudo nano apache2.conf

Directory /var/www/を探します。

ドキュメントルート変更前

このパスを変更したいフォルダパスに書き換えます。

ドキュメントルート変更後

保存して終了します。

次にHTTPに対するドキュメントルートの設定を変更します。

変更対象の/etc/apache2/sites-available/000-default.confのバックアップを作成。

cd sites-available
sudo cp 000-default.conf 000-default_date.conf

テキストエディタで開いて/var/www/htmlを変更したいフォルダパスに書き換えます。

sudo nano 000-default.conf
ドキュメントルートをコメントアウトし新規追加した状態

保存して終了します。これでnpcamp2/Web下に置いてあるindex.htmlまたはindex.phpが表示されるようになります。

設定変更を反映させるためにApacheを再起動します。

sudo systemctl restart apache2

すでにindex.htmlを置いてある場合は下記で表示確認できます。

http://localhost

今回のサンプルではnpcamp2/Web/index.phpを配置しているのでそれが表示されます。

localhostアクセス

環境構築と設定変更は以上です。簡単ですね。でもこのままだと自宅のネットワーク内からしかアクセスできないので、公開するための設定をしていきます。

ラズパイの固定IP化

ファイヤーウォールやポートフォワーディングを設定するためにラズパイと、ラズパイにアクセスするPCのIPアドレスを固定化していきます。

設定はもちろんルーターによりけりです。今回はうちで使っているTP-LinkのDecoシリーズで解説します。たいていのルーターはDHCPになっており、自動的にIPを動的に割り当てます。ファイヤーウォールやポートフォワーディングはIPに対して設定するので、IPがコロコロ変わられると困りますよね。というわけでIPを固定化する必要があります。

Decoアプリの「詳細」から「アドレス予約」に移動します。

Decoのアドレス予約

右上の+ボタンで追加したい機器を選択します。今回の場合はWebサーバーにするラズパイと、ラズパイにアクセスするためのPCを追加します。

Decoのアドレス予約に機器を追加

これで再接続時にも毎回同じIPアドレスでルーターに接続されるようになります。

ファイヤーウォール設定

次にファイヤーウォールを設定します。これをやっておかないと65535まである全ポートをあっぱっぱーで世界に公開してしまうことになります。特にSSH、RDP、VNCなどはラズパイのコントロールを取られるので好き勝手されてしまいますよね。

必要なもの以外はファイヤーウォールでアクセスをシャットアウトしましょう。

Ubuntuデフォルトのufwを使います。

sudo apt install ufw

HTTP 80とHTTPS 443以外は不要なので閉じます。SSHやVNCなどはアクセスするPCのIPアドレス限定で開放することにより不正アクセスを防止することができます。

sudo ufw allow 80
sudo ufw allow 443
sudo ufw default deny

PCからラズパイにアクセスするために、特定IPに対するポートを開放します。今回はSSHとVNCを開ける例です。入力するIPはアクセスもとのPCのIPです。

sudo ufw allow from 192.168.xxx.xxx to any port 22
sudo ufw allow from 192.168.xxx.xxx to any port 5900
sudo ufw allow from 192.168.xxx.xxx to any port 5901
sudo ufw allow from 192.168.xxx.xxx to any port 5902

最後にファイヤーウォールを有効化します。

sudo ufw enable

設定を確認するには以下のコマンド。

sudo ufw status

これで一応ラズパイをWebサーバーとして公開するための最低限のセキュリティ設定は完了です。

ルーターのDDNS設定

大抵の場合、ネットワークのプロバイダーから提供されているルーター用グローバルIPは定期的に変わります。なのでそのたびにページのアドレス変わりましたよ、なんて連絡するのはありえないのでDDNSを使用します。

DDNSってなんぞというかたはこちら。

ダイナミックDNS (DDNS)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

Decoの場合はこれもアプリで簡単に設定可能です。ただし独自ドメインではありませんのでご注意ください。

「詳細」→「TP-Link DDNS」

ここで好きなドメイン名を設定します。これが公開するラズパイのページのアドレスになります。

DecoのDDNS設定追加

ポートフォワーディング設定

安全性を高めるために、ポートフォワーディングによってラズパイをローカルネットワーク状態のままWebサーバーとして機能させます。

そもそもポートフォワーディングってなんぞというかたはこちらをどうぞ。

ポートフォワーディングって何? その役割とは【2022年版ガイド】

先程設定したDNS(つまりルーターのアドレス)にHTTP/HTTPSのアクセスがあったら、ルーターがラズパイにリクエストを転送してくれます。つまりラズパイをグローバルIPで公開しなくてもHTTPのレスポンスを返すことができるということです。コンシェルジュさんが外からの来客とのやりとりを全て代理してくれて、自分は部屋にこもったままなので安全、みたいなイメージです。

Decoの場合はこれもアプリで簡単に設定可能です。

「詳細」→「ポート転送」

Decoのポート転送設定

HTTPとHTTPSをラズパイに転送するように設定を追加します。

ポート転送にHTTPとHTTPSを追加

この時点でWebページを表示できるようになっているので、先程設定したドメイン名にアクセスしてみてください。

サンプルはこちら >> http://ichiken.tplinkdns.com

ちゃんとページが表示されれば安全にラズパイを公開することに成功です!試しにスマホのWiFiを切ってアクセスしてみてください。スマホの電波経由でページを表示できると「やったった感」があってちょっとうれしくなりますよ。

通信のSSL化(HTTPS化)

アクセスしてみて気づいたと思いますが、ブラウザに「安全じゃない」とディスられます。これは通信方式がHTTPで暗号化されていないためのです。

最後にHTTPS化して終わりにしましょう。こちらの通りにやって成功しました。

ただしSSLのパス記述行にコメントがあるとエラーになるので消しましょう。

ラズパイwebサーバをhttpsに対応させた - Qiita

HTTPS対応させたページはこちら

サンプルはこちら >> https://ichiken.tplinkdns.com

最後に

お疲れさまです。これで安全にラズパイをWebサーバーとして公開することができました。IoT機器でサーバー運営できちゃうんだからすごいですよね。ますますラズパイ依存症になりそうです。

質問、ご指摘等はお気軽にコメント欄からどうぞ。

スポンサーリンク

フォロワー

Labels

Amazon (3) Apache (3) Apple (9) AppleSilicon (7) Bloggerカスタマイズ (12) EchoShow15 (1) IoT (25) Jetson (1) MySQL (1) PHP (3) Python (20) Web (3) アウトドア (11) アメリカ生活 (19) ガジェット (35) キャンプ (9) ディープラーニング (1) らずキャン△ (11) ラズパイ (24) 暗号資産 (5) 開発 (31) 旅行 (8)

QooQ