ASP.NET MVC: HTTPSリダイレクトとHSTS設定

 ASP.NET MVCを使ったWebアプリでの、セキュリティ処置をしておく。処置は全ページでのHTTPSへのリダイレクトと、HSTS(ブラウザにHTTPSアクセスを強制するもの)の設定。

 web.configを開いて適切な場所に下記を追加。
 
<system.webServer>


<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security"
pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000" />
</rule>
</outboundRules>
</rewrite>

<handlers>


http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx
 上記の場所にあったコードをいただいた。HSTSをHTTPSアクセスにしか返さないようにしているが、これは仕様上の正しい実装になっているらしい。HSTS仕様を確認したところ、確かに、HSTS設定されたヘッダはセキュアな通信で返送してねと書かれていた。
comment: 0

C#, ASP.NET MVC: Cookieの設定

 ASP.NET MVCでCookieを設定する。オプションは文字通りオプションなのであってもなくても。ただし今回はセッションIDを入れてるので、そんな場合はオプションでsecureにするのはほぼ必須だろう。

var cookieOption = new CookieOptions()

{
Secure = true
};
Response.Cookies.Append("_sid", token, cookieOption);
comment: 0

C#, ASP.NET MVC: セキュアなトークンを取得する

 Webアプリで認証機能がある場合、認証成功時にセキュアなトークンを付与する必要がある。セキュアとはこのケースの場合、悪意のある第三者に予想がつかないということとする。
 参考になるものがすでにあったので、セキュアなトークンの取得方法のコードは書かない。
http://dobon.net/vb/dotnet/programing/random.html
http://stackoverflow.com/questions/1668353/how-can-i-generate-a-cryptographically-secure-pseudorandom-number-in-c

 たまーにセキュアであるべきトークンにUUID4系を使っているのを見かける。UUID4はまず重複することのない、ランダムなID、およびその生成方法である。これを使うのはセキュリティ的にはまずいとされている。
 UUID4は重複することはないだろうねというものである。予想がつかないものだとはされていない。セキュアであるトークンとは予想がついてはいけないものなので、UUID4はセキュアなトークンとして使うことはできない。
comment: 0

このブログの技術的要素

 先月に.NET Coreの正式版リリースが迫っているという報を聞いて、このブログをぼちぼちと作り始めて形になってきた。ブログを作るというのは既存のサービス上で開設するのではなく、できあいのブログエンジンを使うでもなく、正式リリースがせまっていた.NET Coreを使って作った。

 自作なので自分で必要なものを選んでいった。ちなみに自分の使いたいと思っていたサービスを使いつつ、月額費用がタダになるように選んでいった。
 まずAzure。もうクラウドが話題になって久しい。クラウドサービスはAWSが圧倒的なシェアを持ちつつもAzureがそれを追うという状態。そして大企業がリソースをローカルからクラウドへ移すという事例をメールマガジンでよく読むようになってきた。そんな中で仕事でクラウドを触る機会はなく、このままいっさいクラウドに触れないというのはまずいかなと思った。なのでクラウドサービスを使いたいと考えていた。あとはVPSでDocker上でコンテナとしてWebアプリを動かそうと考えていたが、そうなるとタダとはいかなくなるので別の機会にやることに。とりあえず本ブログはAzure WebAppServiceの無料枠で。
 続いてデータベースはmlabというMongoDBのホスティングサービスを使った。Azureで金を払ってデータベースを用意するのもいいが、MongoDBを使いたいと思っていたところ、軽い使い方(使用可能領域がぼちぼちのサイズでリソースが共用だったり)ならタダだったのでホスティングサービスmlabを利用。サーバのリージョンを選べるが、タダだと日本のサーバは選べない。なのでタダの米国西部を選択。これに合わせてAzureのほうのサーバも米国西部にした。
 画像などの容量の多いファイルのサーブについて。クラウドだと回線でデータを送受信した分も金をとられる。そしてmlabでタダの範囲内に容量を収めることを考えると、画像ファイルは敵である。そこでそれらのファイルはOneDriveに入れることにした。最初はMongoDBにGridFSという仕組みがあるのでそっちを使おうとしたけど。OneDriveについては通常のOneDriveサービス画面でファイルをアップして、埋め込みリンクを取得してという手順で今は使っている。ここらはAPIがあるので近々管理者ページでうまく連携できるようにしたい。
 ASP.NET MVC周りについて。現状は.NET Coreでも、.NET Frameworkベースで動作するものを使っている。MongoDBのドライバがまだ.NET Core対応のものが出ていないので。対応版が近々リリースされるので、それが出たら純粋な?.NET Coreに切り替える。

 このブログのベースにある技術的なところをとりあえず大まかに並べて書いていった。続いてブログを作るためにどんなC#コードを書いたかを記事にしていきたい。
comment: 0