2020年6月25日木曜日

セキュリティ対策 XSS, CSRF, ポップアップブロック そして・・

サードパーティークッキー・ブロック

Webサーバーがコンテンツをブラウザーにレスポンスする際、ヘッダー情報にクッキー ( cookie ) というセッション識別情報を付加することがあります。HTTPプロトコルはブラウザーからのリクエストに対してサーバーがコンテンツをレスポンスして終了です。1ページで終わらないようなアプリケーションの場合、継続しているセッションを知る必要があります。HTMLに識別情報を埋め込んでもよいのですが、コンテンツとは別にヘッダー部にセッション識別情報を組み入れたのが cookie です。

その cookie 、長年の問題がありました。ユーザーが意図していないタイミングで受け取ったり、送ったりしてしまうのです。
例えばニュースサイトをみて通販商品のコンテンツがあったとします。そのコンテンツは別のサイトのものだったとします。ユーザーはニュースサイトを見ているつもりですが、通販サイトはユーザーがニュースサイトのどのページをいつ見たかを記録します(できます)。通販サイトへのリンクをたどらずとも記録されます。ニュースサイトに通販コンテンツがあることを事前にユーザーはわかりません。また一度クリックすると別サイトでも同じ商品の広告が出てくるのはサイトを越えてクッキーの使い回しができるからです(事前にユーザーはわかりません)。このリンクが書き換え、悪用されてもそれっきりです。

この例のようなセキュリティの問題をはらむクッキーをサードパーティクッキーといいます。実はブラウザーの設定でサードパーティークッキーの受け取りを拒否することができます。高い、不便、遅くなるで不評のセキュリティ対策としては、例外的にただ、簡単、遅くならない、しかも強力なものです。ただブラウザーのクッキー設定を変更しているユーザーは少ないのではないでしょうか?会社のPCどうですか

しかし朗報です。Appleは2020年3月に Webブラウザ Safari の初期設定を “サードパーティークッキーの受け取り拒否” としました。サードパーティークッキーの主たる用途は広告宣伝なのです。セキュリティもですが追っかけ広告も鬱陶しいですよね。サードパーティークッキーの濫用というか、そもそもネットマナー、エチケットとしてどうなのかと思っていました。広告宣伝行為として後ろめたさありますよね。会社のマーケティング部門に勤めている知人も個人的にはやりたくないし、自宅のPCはサードパーティクッキーをブロックしているそうです(私もです)。Apple やりますね。マイクロソフト、Google も諦めて欲しいものです。

ブラウザーの設定画面のキャプチャーを貼りました。設定した後は、過去のクッキーをクリアしましょう。クッキー・ブロックは受信拒否であり送信拒否ではありません。過去の設定でブラウザーに保存されているクッキーは有効期限まで送信され続けます

Chromeの設定


Edgeの設定


サイト運営者、Webエンジニアのみなさま、自主的にクッキーポリシー SameSite=Lax  を明示しましょう。Apache であれば mod_header で append SameSite=Lax とするだけです。 php でも jsp でも HTTPヘッダーに反映されます。簡単です。Apache 知っていると得することまたご紹介します。枯れた技術に宝ありですね。
永島志津夫

全社のシステムを少ない人数で見ていれば時に見落としもあるかもしれません。
オフィスエヌ ショートレビュー5万円から。
連絡先 office.nagasima#gmail.com (#を@に変えてメールをお願い致します)

2020年6月21日日曜日

外部認証 OAuth2 業務サービスのクラウドでは?

外部認証、身近なものでは “Facebookでログイン” とか “Googleでログイン” のことです。ユーザ登録は面倒ですし、パスワードも覚えていられないのであれば使われている方も多いかと思います。OAuth2 なのですがコンシューマ向けと業務サービスでは構成、シーケンスに違いがあります。なぜか?というお話です。


最初に業務サービスのの場合の認証シーケンスの例をご紹介しましょう。

ユーザーは認証サイトBにログインし業務サービスを利用していますが、あるオプション機能はサイトAのものだとします。まだサイトAにログインしていないので、オプションメニューをクリックすると、認証トークンが埋め込まれたサイトAへのログインページがサイトBから返されます。ここがポイントで、サイトAへのログインページをサイトAのセッションで返されると、認証トークンをサイトBから得るセッションがブロックされます。なのでサイトAにログインするページはサイトBから返してもらう必要があります。サイトBは有効なセッションをもつユーザー(ブラウザー)に対してサイトAの認証を代行します。認証OKの場合はトークンを返します。トークンはサイトAから提供された秘密台帳による署名付きです。

ログインページはブラウザーのリダイレクション機能を使って直ちにサイトAにアクセスします。認証トークンはサイトAの秘密台帳で検証されログインが成立、ユーザーはサイトAの提供するオプション機能を利用できるようになります。

さて同じことをコンシューマ向けサービスで出来るでしょうか?サイトBを Facebook 、サイトA を転職情報サイトとでもしましょう。Facebookにログインしているユーザーが転職情報サイトのバナー広告をみてクリックします。しかしここで引っ掛かります。サイトAへのログインページです。Facebookに自由にWebページを配置することはできません。このようなシーケンスになります。


いったん、ただのアンカーリンクでサイトAのページを表示します(ページ要求)。そのページはサイトB( Facebook )にリダイレクし認証トークンを受け取ります( 認証要求(1) )。ブラウザーは再度リダイレクしサイトAに認証要求(2)、めでたくログインとなります。
1.サイトBページ→サイトA(バナー広告のクリック)
2.サイトAページ→サイトB(リダイレクション、認証要求、トークン発行)
3.サイトBページ→サイトA(リダイレクション、認証トークン検証、ログイン成立)
4.サイトAページ

これが本来のOAuthの流れなのですが、業務系の場合は1と2をセットで行い、3へ行くことができます。被認証サイトへのログインページを認証サイトに配置できるとシーケンスを簡略化、認証処理の開発、テストも簡素化できます。高品質、安定稼働で安上がりです。業務サービス、企業向けクラウドの場合はこれが可能です。ちょっとしたことなのですが一考の価値ありです。

もう一つ。これはどうでしょう?



先に結論を言うとクロスサイトスクリプティングなので、そのままでは動きません(動いてはいけません)。サイトAのセッションの間にあるサイトBとのセッション(Javascriptで張られたセッション)が、サイトA以外にトークンを渡しうるからです。サイトCもしくは別のユーザーからこのトークンで認証要求されてもサイトAにはわかりません。なりすましでサイトAにログインできます。

postMessage による制限つきの処理も可能ではあるのですが、リダイレクションのような安全かつ一般的な手法を採用しない理由を説明できません。一見構成も簡単なのですが postMessage は特殊なケースに限定されると思います。
ITの世界は流行り、廃りが速いので変化にロバストであるよう、一般的な要素でシステムを構成、簡素化するよう心がけています。寿命の長いシステムはエンジニアの誇りです。ユースケースに応じた簡素な設計、費用対効果の高いシステムほど長持ちです。

永島志津夫

全社のシステムを少ない人数で見ていれば時に見落としもあるかもしれません。
オフィスエヌ ショートレビュー5万円から。
連絡先 office.nagasima#gmail.com (#を@に変えてメールをお願い致します)

2020年6月1日月曜日

マルチホーミング

マルチホーミング、わかります?ITの世界でマルチホーミングといえば物理的なネットワークの冗長化です。最近とんと聞かなくなりましたが、可用性確保で案外落とし穴かもしれません。クラウド流行りでエンジニアも希少化しているのではないでしょうか。インフラ担当としてアサインされたら焦りますよね。。


クラウドへのアクセスはアプリケーションプロバイダーの責任範囲から外れるのまずネットワークの冗長化要件が来ることはないのですが、以前は自前でマシンを設置してアクセス回線を手配していたので、冗長化も仕事の範囲でした。

最初に確認することは、NTT以外の幹線が建屋の近くの(道路の下)に来ているかで、来ていれば建屋への引き込みを依頼します。大技で有線回線と無線回線を併用するなんてのもありました。冗長化の趣旨からするとできるだけ異なる特性のものを組み合わせたほうが良いので悪くないアイデアです。

さて難しいのは、なじみの薄いL1,L2レイヤーを意識しないといけない点ですが、現在はフルIPなのでまだましですね。それでもルーターを用意してBGPの設定となると、なかなか手ごわいですね。できればパスしたいです。できるのでしょうか?
ことと場合によると出来ます。負荷分散としても割りと悪くない方式だと思います。概略を紹介します。

フロントウェッブは一般的なクラウドサービスに配置し、アプリケーションサービスを別のサービスサイトから提供することとします。マルチホーミングの対象はサービスサイトのみです。
ネームサーバーに www.***.com (フロント), svc1.***.com (サービス1), svc2.***.com (サービス2)の3ホストを登録します。フロントはサービス1、サービス2をタイムアウト付きでコールする javascript を組み込んだページを返します。
もうお分かりですね。サービス1が障害されていれば、タイムアウトしてサービス2にアクセスするという簡単なものです。サービス1のホストが回線A経由で、サービス2のホストが回線B経由でアクセスされます。2つのホストが同一DC内であれば疑似マルチホームで、別々のDCであればDC可用性確保になります。
* サービス1、サービス2のIPアドレスがクラスター共有されていれば元々の定義のマルチホーミングらしくなりますが、やるかどうかはユーザーメリット次第ですね。

何も難しいことはありませんし安上がりですぐに適用できますね。というか、DC可用性確保は基本しておいた方がいいです。有名なクラウドサービスもダウン前提ですから(フロントも複数のホストに配置し、ネームサーバーに登録ですよ)。
タイトルと書きだしを否定するようですが、ルーターでマルチホーミングなんて割りが合いません。ajax のおかげで手軽にサービスレベルを上げることができます。
システム設計は、ユースケース、アーキテクチュア、インフラトータルで見ましょう。

永島志津夫

全社のシステムを少ない人数で見ていれば時に見落としもあるかもしれません。
オフィスエヌ ショートレビュー5万円から。
連絡先 office.nagasima#gmail.com (#を@に変えてメールをお願い致します)