athome-developer’s blog

不動産情報サービスのアットホームの開発者が発信するブログ

ASP.NET Coreの環境はASPNETCORE_ENVIRONMENT未設定の場合Productionになる

情報システム部のやまだです。

大分久しぶりに書きますが、これを機にまた書き始めようかな、と。

さて、以前弊社の高野が下記の記事にて

dblog.athome.co.jp

なんでデフォルトがProductionなんだろうか? なにか変な設定が入っているのかな?

と書いていたのですが、その理由も含めてわかったので書き留めておきます。

What happened?

上記にもあるように、アプリケーションの設定をappsettings.jsonに記載してありまして、ステージングや本番など環境ごとにさらに下記のようなファイルを作成していました。

  • ステージング環境(appsettings.staging.json)
  • 本番環境(appsettings.production.json)

appsettingsのあとのファイル名は環境変数のASPNETCORE_ENVIRONMENTの値で決まり、値がstagingならばappsettings.jsonに加えてappsettings.staging.jsonも読み込まれるという、環境変数によって設定を変えるというよくある感じです。RailsだとRAILS_ENV、ExpressだとNODE_ENVですね。

で、ある日、IISで設定したはずのASPNETCORE_ENVIRONMENTの設定が消えていて、気が付いたら本番の設定が適用されていて危機一髪ということがありました。

why?

そもそもIISの設定が無くなったのかはともかくとして、

「そもそもデフォルトってProductionなの?」

「なぜデフォルトがProductionなの?」

ということでちょっと調べて(ググって)みたら見つかりました。

デフォルトってProductionなの?

下記の通りProductionでした。

Hosting/HostingEnvironment.cs at dev · aspnet/Hosting · GitHub

なぜデフォルトだとProductionなの?

TL; DR セキュリティ的によろしくないからProductionにしている

なんでDevelopmentじゃなくてProductionなの?

RailsやExpressはDevelopmentなのに。

ということでさらにググってみたところ、なんかそのものズバリなissueを発見。

Why is hosting environment default value "production"? · Issue #863 · aspnet/Hosting · GitHub

以下、関係ありそうな部分を引用してみます。

blowdart commented on 14 Oct 2016
So, the reason we went with production by default is because both our templates, and in general other people's code add detailed error messages, debug logging, and other things that can cause information disclosure vulnerabilities (at best), or things like auth bypass at worst, depending on what you wrapped in an env.IsDevelopment() check.

By defaulting to production we remove that risk.

In addition launching from inside VS and VS Code sets the environment as development, and best practice generally acknowledges developers should not have every day access to production assets, the risk of defaulting to development is far greater than defaulting to release/production.

 よし、翻訳だ。

ブローダート はコメントしました on 14 Oct 2016
だから、我々がデフォルトでプロダクションを行ったのは、テンプレートと一般的に他の人のコードの両方が、詳細なエラーメッセージ、デバッグログ、および情報漏えいの脆弱性を引き起こす可能性のあるもの、あなたがenv.IsDevelopment()チェックでラップした内容に応じて、最悪です。

デフォルトでは、プロダクションはそのリスクを排除します。

さらに、VSとVSコードの内部からの起動は、開発環境として環境を設定し、開発者が毎回運用資産にアクセスする必要がないことを一般的に認めているため、開発の不履行リスクはリリース/生産のデフォルトよりもはるかに大きくなります。

デバッグ情報とかだだもれしちゃうから安全な方に振っておくよ、ということですね。

ほか、こちらのコメントの方が端的でわかりやすいかもしれません。

DefaultEnvironmentName should be development · Issue #712 · aspnet/Home · GitHub

blowdart commented on 1 Jul 2015
Yes, but your example of web.config is precisely why files don't work. People didn't build in release and publish because it wasn't the default. The amount of debug web sites, with detailed error messages out there is awful. 

ブローダート はコメントしました on 1 Jul 2015
はい。しかし、web.configの例は、ファイルが機能しない理由です。人々はデフォルトではなかったので、リリースでビルドして公開しませんでした。詳細なエラーメッセージが表示されたデバッグWebサイトの量はひどいです。

あー、なるほど。

この辺の方針というか思想というかデザインというかは、言語やフレームワークによって違いそうなので、気を付けたいですね。