ラズパイ「Raspberry Pi 3」で、HTTP/2サーバーをたててインターネットにタダで公開する手順 (セキュリティ評価:A+)


1.概要

「Raspberry Pi 3」に最新のNginx(1.9系)をインストールし、HTTP2サーバーの設置、無料のダイナミックDNSサービスとサーバー証明書を設定してタダでそのサーバーをインターネットに公開する手順です。

「Qualys SSL Report」のセキュリティ評価が「A+」がゴール。

  • 家庭のLANで動的に割り当てられるIPアドレスに対して固定のドメイン名でアクセスすために無料のダイナミックDNSサービスであるMyDNSを利用。
  • HTTPSアクセスをするために無料の証明書発行サービスのLet’s Encryptを利用。 ※2016/4/12にベータから正式サービス化

2.手順

2.1.最新のNginxを導入

2.1.1.パッケージのダウンロード元設定ファイルにRaspbian GNU/Linux 9 (コードネーム「stretch」) を追加

sudo su -
echo "deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi" >> /etc/apt/sources.list
cat /etc/apt/sources.list
exit

2.1.2./etc/apt/preferencesファイル作成

sudo su -
echo "Package: *" >> /etc/apt/preferences
echo "Pin: release n=jessie" >> /etc/apt/preferences
echo "Pin-Priority: 600" >> /etc/apt/preferences
cat /etc/apt/preferences
exit

2.1.3.Nginxの導入

sudo apt-get install -t stretch nginx

2.2.「Dynamic DNS」の設定

Qiita:ドメイン取得からDDNS設定までを参照。

cron設定

ドメインとIPアドレスの紐付けを定期的に更新。

*/10 * * * * wget -q -O /dev/null http://(ユーザID):(パスワード)@www.mydns.jp/login.html

2.2. サーバー証明書の取得

Let's Encrypt 総合ポータル:使い方を参照。

cron設定

証明書の期限は3ヶ月なので1ヶ月に1回証明書の更新を行う。

00 00 01 * * /(インストールパス)/letsencrypt/letsencrypt-auto certonly --webroot -w /(公開ディレクトリ)/ -d (ドメイン名)

2.3.Nginxの設定

ドメイン名で設定ファイルを「/etc/nginx/sites-available」の下にに作成して「/etc/nginx/sites-enabled」にシンボリックリンクを作成する。

ドメイン毎の設定ファイルの内容。

server {
    server_name (ドメイン名) www.(ドメイン名);
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

server {
    server_name (ドメイン名) www.(ドメイン名);
    listen 443 ssl http2; 
    listen [::]:443 ssl http2;

    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # Specifies the enabled ciphers.
    ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;

    # Certificate.
    ssl_certificate /etc/letsencrypt/live/(ドメイン名)/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/(ドメイン名)/privkey.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    # Enable SSL session resume.
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Perfect Forward Security (PFS).
    ssl_prefer_server_ciphers on;

    # Online Certificate Status Protocol (OCSP).
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/(ドメイン名)/fullchain.pem;
    resolver 8.8.4.4 8.8.8.8 valid=300s;
    resolver_timeout 10s;

    # HTTP Strict Transport Security (HSTS).
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

    # Do not allow this site to be displayed in iframes
    add_header X-Frame-Options DENY;

    # Do not permit Content-Type sniffing.
    add_header X-Content-Type-Options nosniff;

    # log
    access_log /(ログファイルのパス)/(ドメイン名).access.log;
    error_log /(ログファイルのパス)/(ドメイン名).error.log;

    # location
    location / {
        root   /(公開ディレクトリ);
        index  index.html index.htm index.php;
    }
}

ssl_dhparamファイルは「openssl dhparam 2048 -out dhparam.pem」で作成。

3.確認

3.1.Nginxを再起動してドメインにアクセス。

3.2.https://www.ssllabs.com/ssltest/ にアクセスして、セキュリティの評価を実施。

さぁ、準備は整った。

「OSのセキュリティ / ファイアウォール / 監視」の設定を忘れずに。