Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

HSTS で詰まったのと一時的な解決策を見つけた話

概要

若手の構築課題を作っている最中に、 HTTP Strict Transport Security (HSTS) の強制適用により http://{ドメイン} が Web ブラウザで表示出来ない( https にリダイレクトしてしまう )問題に出会いました

最終的には https://{ドメイン} にするけど、その過程でどうしても http://{ドメイン} を Web ブラウザで表示したかったので自分なりに回避策を調べました

HSTS とは

RFC 6797 で定義される、Web サイトが Web ブラウザに HTTPS でのアクセスを指示することで中間者攻撃を防止するための技術で、要は HTTP でアクセスしようとしても Web ブラウザ側で強制的に HTTPS に変換してしまうものです

参考: JPRS用語辞典|HSTS(エイチエスティーエス、Hypertext Strict Transport Security)

現在の主要な Web ブラウザ (Chrome, Firefox, Opera, Safari, IE 11 and Edge) は対応しています

参考: HSTS Preload List Submission

HSTS の回避方法

Web ブラウザの設定で回避する設定をすることが出来ます

例えば、 Google Chrome の場合は

  1. chrome://net-internals/#hsts にアクセス
  2. Delete domain security policies に HSTS を除外したいドメインを入れる
  3. Delete を実行

で、出来るとのことです

参考: httpで表示したいサイトがhttpsにリダイレクトされ、サイトが表示できない - Google Chrome Community

ただし、今回はこれでもダメな場合の話です\(^o^)/

HSTS は全てのドメインに適用されているわけでは無い

そもそもの話ですが、 HSTS はすべてのドメインで適用になっている訳ではないので、まだ HSTS が強制適用されていないドメインを使えば HSTS を回避出来ます

  • 2023/11 時点ですでに強制適用されているドメイン
    • appdev
  • 2023/11 時点では HSTS が強制適用されていないドメイン
    • jporg

つまり、 hogehoge.jp とか fizzbuzz.org などのドメインならまだドメインを HTTP で運用可能です

fizzbuzz.org などは、お名前ドットコムで1年間1000円くらいから購入出来るので比較的にリーズナブルに運用が可能です

ただし、これは 2023/11 時点の話であり、いつ上記のドメインの HSTS が強制適用になるかは不明です

HSTS が強制適用されるか確認できるサイト

以下のサイトで自分で調べることが出来ます

hstspreload.org

HSTS が強制適用される場合

https://hstspreload.org/?domain=app

HSTS が強制適用されない場合

https://hstspreload.org/?domain=jp

まとめ

HSTS 自体はセキュリティを高めるための必須な仕様なので、それに準じた構築を心がけましょう :)

とはいえ、例外的に HTTP を使いたい時はあるので、HSTS 回避はあくまで一時的なものとしたほうがいいと思います ;)

[ 2024/02/01 から ] Google Cloud のネットワーク料金が一部修正( 値上げ )される件

概要

Google Cloud において、以下のサービスが 2024/02/01 から値上げ されるようです

  • External IPs
  • Cloud NAT
  • Network Egress
  • Cloud Interconnect Egress
  • Cloud Interconnect 100Gbps

External IPs

要約

  • 全てのリージョンにて料金が修正される
  • GCE の場合は VM instances のタイプ( Standard, Preemptible )によって、また IP アドレスのタイプ( Static and Ephemeral )によって料金が異なる( 元から違う )
    • Spot VM については記載が無いが、おそらく preemptible と同様になると思われる

Cloud NAT

要約

  • Cloud NAT ゲートウェイマッピングされた静的 IP アドレスと一時 IP アドレスが 今までは無料から $0.005/時間 になる
  • もともと、その Cloud NAT を使っている VM Instance の数で課金されていたが、追加で Cloud NAT に紐づく IP アドレスにも課金が必要になる

cloud.google.com

Network Egress

要約

cloud.google.com

cloud.google.com

Cloud Interconnect Egress

要約

  • 下り( Egress )の料金が いままでは無料だったのが課金対象になる
    • GiB 毎の課金
    • ロケーション( Asia とか Europe とかの単位 )で料金が異なる

cloud.google.com

Cloud Interconnect 100Gbps

要約

  • Dedicated Interconnect の 100-Gbps 利用時の料金が変更
    • $18.05/時間 ---> $ 23.28/時間 に変更

合わせて読んでおきたい

他のクラウドも同じく引き上げてきましたね 🤔

www.publickey1.jp

Cloud Run 上の phpMyAdmin を経由して Cloud SQL にアクセスする

概要

Cloud Run 上の phpMyAdmin を経由して Cloud SQL にアクセス環境を構築します

  • 使用する phpMyAdmin は Docker Hub の公式コンテナイメージを使用します
    • 現時点で最新の phpmyadmin:5.2.1-apache を使用します

hub.docker.com

github.com

⚠ 注意

元情報は Cloud Run 上の phpMyAdmin を経由して Cloud SQL にアクセスする環境を構築するハンズオン にあります ;)

作ってみる

0. 事前の定義

export _gc_pj_id='Your Google Cloud Project ID'

export _common='phpmyadmin'
export _zone='asia-northeast1-b'
export _region='asia-northeast1'
export _date=`date +"%Y%m%d%H%M"`
  • API の有効化をする
    • 一回やれば OK
gcloud beta services enable sqladmin.googleapis.com --project ${_gc_pj_id}

1. Cloud SQL の準備

  • Cloud SQL instance を作成する
gcloud beta sql instances create ${_common}-insrance-${_date} \
  --database-version=MYSQL_8_0 \
  --tier=db-custom-1-3840 \
  --zone=${_zone} \
  --root-password=password123 \
  --project ${_gc_pj_id} \
  --async
  • Cloud SQL database を作成する
gcloud beta sql databases create ${_common}-db \
  --instance=${_common}-insrance-${_date} \
  --project ${_gc_pj_id} \
  --async
  • Cloud SQL 用の User を作成する
gcloud sql users create ${_common} \
  --instance=${_common}-insrance-${_date} \
  --password=${_gc_pj_id} \
  --project ${_gc_pj_id} \
  --async

2. Service Account の作成

  • Cloud Run 用の Service Account を発行し、 Cloud SQL に接続できる最低限の Role を付与する
gcloud beta iam service-accounts create ${_common}-sa \
  --description="Cloud Run 用のサービスアカウント" \
  --display-name="${_common}-sa" \
  --project ${_gc_pj_id}
gcloud beta projects add-iam-policy-binding ${_gc_pj_id} \
  --member="serviceAccount:${_common}-sa@${_gc_pj_id}.iam.gserviceaccount.com" \
  --role="roles/cloudsql.client"

3. Cloud Run にデプロイをする

  • Cloud Run の Service をデプロイする
    • phpMyaAmin の最新ののコンテナイメージ phpmyadmin:5.2.1-apache を使う
    • --session-affinity : phpMyAdmin がセッションを必要とするため。
    • --service-account : Cloud Run の Service Account の指定
    • --set-env-vars : phpmyadmin:5.2.1-apache が読み込める設定を Cloud Run の環境変数として設定
    • --allow-unauthenticated : サンプルなので allUser からのアクセスを許可
gcloud beta run deploy ${_common} \
  --project ${_gc_pj_id} \
  --image phpmyadmin:5.2.1-apache \
  --region ${_region} \
  --service-account "${_common}-sa@${_gc_pj_id}.iam.gserviceaccount.com" \
  --add-cloudsql-instances ${_gc_pj_id}:${_region}:${_common}-insrance-${_date} \
  --set-env-vars DB_USERNAME=${_common} \
  --set-env-vars DB_PASSWORD=${_gc_pj_id} \
  --set-env-vars PMA_HOST=localhost \
  --set-env-vars PMA_SOCKET="/cloudsql/${_gc_pj_id}:${_region}:${_common}-insrance-${_date}" \
  --set-env-vars APACHE_PORT=8080 \
  --session-affinity \
  --allow-unauthenticated
  • Cloud Run の Service の状態を確認する
gcloud beta run services describe phpadmin \
  --region ${_region} \
  --project ${_gc_pj_id}

4. Web ブラウザから確認する

---> Cloud Run 上の phpMyAdmin 経由して Cloud SQL にアクセスすることが出来ました :)

5. セキュリティを強化する

今のままだと誰からもアクセス出来てしまうので非常にリスクの高いままです

Cloud Run の前に Cloud Load Balancing を設置し Cloud IAP にて Cloud IAM による認証をするか、 ID トークンを使って Cloud Run にて Cloud IAM による認証をしましょう

iganari.hatenablog.com

クリーンアップ

  • Cloud Run の Service を削除する
gcloud beta run services delete ${_common} \
  --region ${_region} \
  --project ${_gc_pj_id}
  • Cloud SQL のリソースを削除する
gcloud sql users delete ${_common} \
  --instance=${_common}-insrance-${_date} \
  --project ${_gc_pj_id} \
  --async

gcloud beta sql databases delete ${_common}-db \
  --instance=${_common}-insrance-${_date} \
  --project ${_gc_pj_id}

gcloud beta sql instances delete ${_common}-insrance-${_date} \
  --project ${_gc_pj_id}

追記

元情報のリンクを修正しました (2023/11/30)

Windows on GCE で文字コードを UTF-8 にする

事象

Windows on GCE から Cloud SQL for PostgreSQL に接続する際に文字コードの差異による Warning が出ます

これはコマンドプロンプト文字コードのみを UTF-8 にしても同様に出ます

コマンドプロンプト文字コードUTF-8 の確認

chcp 65001

Cloud SQL for PostgreSQL のデータベースの文字コードはデフォルトで UTF-8 の確認

問題点と解決方法

Warning が出る理由は Windows の自体のシステムの文字コードUTF-8 ではないためであり、コマンドプロンプト文字コードを変更してもシステムの文字コードを変更しない限りは Warning は消えません

故に、Windows のシステム全体の文字コードUTF-8 に変更する手順をまとめました ;)

修正手順

1. 左下にある Windows のロゴ をクリック

2. 歯車のロゴ をクリック

3. Time & Language をクリック

4. Region をクリック

6. Region 配下の Change date, time, or number formats をクリック

7. タブの Administrative をクリック

8. Language for non-Unicode programs の Change system locale をクリック

9. Bata: Use Unicode UTF-8 for worldwide language support にチェックをいれて、 OK をクリック

10. システムの再起動を促されるので Restart now をクリック

※ クリックしても何も起きないので次項に進む

11. GCE Instance を再起動 ( stop -> start ) する

確認

コマンドプロンプトにて同じ操作を行った際に同じエラーが出ていないのが確認出来れば OK です

システム全体の文字コードUTF-8 に統一されたので、 文字コードの差異の Warning は出なくなりました :D

まとめ

Windows on GCE で文字コードの Warning が出る際は、この記事の手順でシステム全体の文字コードUTF-8 に変更してみてください :)