こんにちはICHIKENです。
今回はラズパイをWebサーバーにしてページを安全に公開する手順を紹介します。
参考として、ラズパイWebサーバーで公開中の、アメリカ国立公園キャンプ場の空きまとめサイトのリンクを貼っておきます。
ラズパイWebサーバーで公開しているページはこちら >> https://ichiken.tplinkdns.comWebアプリのソースコードも公開しています。
サンプルのGithubはこちら >> npcamp国立公園キャンプ場の空き情報まとめWebアプリのプロトタイプ改公開😊
— ICHIKEN@🇺🇸エンジニアキャンパー🏕 (@IchikenUsa) January 17, 2022
フロント: #HTML #JS
バック: #PHP #Python
Webサーバ: #Apache
ハードはうちのガレージで走ってるラズパイ。IoT機器の可能性に是非触れてみてください😉https://t.co/lUEM3n4WM3#アメリカキャンプ #ラズパイ #Web開発 pic.twitter.com/Gf09GhnsD2
公開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。
ちなみに上記ページのパスは /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公開用フォルダ設定
環境の準備はできたので、次に実際に公開する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を配置しているのでそれが表示されます。
環境構築と設定変更は以上です。簡単ですね。でもこのままだと自宅のネットワーク内からしかアクセスできないので、公開するための設定をしていきます。
ラズパイの固定IP化
ファイヤーウォールやポートフォワーディングを設定するためにラズパイと、ラズパイにアクセスするPCのIPアドレスを固定化していきます。
設定はもちろんルーターによりけりです。今回はうちで使っているTP-LinkのDecoシリーズで解説します。たいていのルーターはDHCPになっており、自動的にIPを動的に割り当てます。ファイヤーウォールやポートフォワーディングはIPに対して設定するので、IPがコロコロ変わられると困りますよね。というわけでIPを固定化する必要があります。
Decoアプリの「詳細」から「アドレス予約」に移動します。
右上の+ボタンで追加したい機器を選択します。今回の場合はWebサーバーにするラズパイと、ラズパイにアクセスするためのPCを追加します。
これで再接続時にも毎回同じ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」
ここで好きなドメイン名を設定します。これが公開するラズパイのページのアドレスになります。
ポートフォワーディング設定
安全性を高めるために、ポートフォワーディングによってラズパイをローカルネットワーク状態のままWebサーバーとして機能させます。
そもそもポートフォワーディングってなんぞというかたはこちらをどうぞ。
ポートフォワーディングって何? その役割とは【2022年版ガイド】先程設定したDNS(つまりルーターのアドレス)にHTTP/HTTPSのアクセスがあったら、ルーターがラズパイにリクエストを転送してくれます。つまりラズパイをグローバルIPで公開しなくてもHTTPのレスポンスを返すことができるということです。コンシェルジュさんが外からの来客とのやりとりを全て代理してくれて、自分は部屋にこもったままなので安全、みたいなイメージです。
Decoの場合はこれもアプリで簡単に設定可能です。
「詳細」→「ポート転送」
HTTPとHTTPSをラズパイに転送するように設定を追加します。
この時点でWebページを表示できるようになっているので、先程設定したドメイン名にアクセスしてみてください。
サンプルはこちら >> http://ichiken.tplinkdns.comちゃんとページが表示されれば安全にラズパイを公開することに成功です!試しにスマホのWiFiを切ってアクセスしてみてください。スマホの電波経由でページを表示できると「やったった感」があってちょっとうれしくなりますよ。
通信のSSL化(HTTPS化)
アクセスしてみて気づいたと思いますが、ブラウザに「安全じゃない」とディスられます。これは通信方式がHTTPで暗号化されていないためのです。
最後にHTTPS化して終わりにしましょう。こちらの通りにやって成功しました。
ただしSSLのパス記述行にコメントがあるとエラーになるので消しましょう。
ラズパイwebサーバをhttpsに対応させた - QiitaHTTPS対応させたページはこちら
サンプルはこちら >> https://ichiken.tplinkdns.com最後に
お疲れさまです。これで安全にラズパイをWebサーバーとして公開することができました。IoT機器でサーバー運営できちゃうんだからすごいですよね。ますますラズパイ依存症になりそうです。
質問、ご指摘等はお気軽にコメント欄からどうぞ。
0 件のコメント:
コメントを投稿