情報処理安全確保支援士 - SE娘の剣 -

左門至峰による情報処理安全確保支援士試験に合格するためのサイトです。 過去問を引用しながら、試験に出る基礎知識を体系的かつ詳細に整理します。

シングルサインオン

1.シングルサインオンとは

(1)シングルサインオンとは

シングルサインオンとは、一つの認証情報(ID/パスワードなど)で、複数のシステムにログインできるようにすることです。
過去問(H20SW午後1)に、シングルサインオンの目的に関する記述があるので、紹介します。

業務活動の統制の観点から,各社内システムのセキュリティ確保の問題が重要視されており,全社的に統一された認証情報の管理,統一されたアクセス制御の実施が望まれている。また,利用者である社員からも,個々のシステムを利用する際に,その都度IDとパスワードの入力を求められることの不便さを訴えられている。
情報システム部門では,こうした要求に応じるためにシングルサインオンの導入によって,利用者の利便性向上と統一的なセキュリティ管理を図ることにした。

ここにありますように、シングルサインオンの目的は、次の2つと考えられます。
 ①統一的なセキュリティ管理
 ②利用者の利便性の向上

(2)シングルサインオンのデメリット

こちらも、過去問(H20SUPM2問1)から引用します。

シングルサインオンの機能を導入することにした。この機能を導入することで、利用者の利便性は向上するが、万が一、利用者IDとパスワードが流出したり破られたりしてしまうと、シングルサインオンできるすべての業務アプリを簡単に不正利用されてしまうというリスクが伴う。

これは、シングルサインオンに限ったことではなく、IDパスワードを使いまわしている場合にも、同じことが言えます。

(3)シングルサインオンの2つの方式

シングルサインオンには、2つの方式があります。
❶エージェント方式(クッキーを使ったシングルサインオン)
 SSOを利用したいサーバに、エージェントと呼ばれるソフトウェアをインストールして行う。
また、過去問では、クッキーを使ったシングルサインオンは、「サーバごとの認証情報を含んだクッキーをサーバで作成し、各クライアント上で保存・管理する。(H18NW問47を一部修正)」方式であると記載されています。
 エージェントがやってくれるので、この後に記載するリバースプロキシ型のような新しい機器を設置したり構成を変更する必要がありません。ただ、システムにエージェントを入れることはすごく嫌がられる傾向にあり、その理由で、この方式は採用されないこともあります。

過去問(H27秋NW午後Ⅰ問1)に、エージェント方式の詳しい解説があるので紹介します。

C氏はHTTPを用いたSSOの方式と認証処理シーケンスについて検討した。SSOの方式を分類すると,SSOで利用したいサーバにエージェントと呼ばれるソフトウェアモジュールをインストールして実現するエージェント方式と, SSOサーバにおいて全ての通信の中継を行う〔 ア:リバースプロキシ 〕方式がある。C氏は,エージェント方式の検討を行い,エージェント方式を採用することにした。
エージェント方式におけるSSO認証処理のシーケンスは,次のとおりである。
 ① PCからWebアプリケーションサーバに,サービス要求を行う。
 ② Webアプリケーションサーバ内のエージェントは,サービス要求中のCookieに認証済資格情報(以下,アクセスチケットという)が含まれているか確認する。含まれていなければ,サービス要求はSSOサーバヘ〔 イ:リダイレクト 〕される。
 ③ SSOサーバからPCに,認証画面を送る。
 ④ PCからSSOサーバに,UserIDとPasswordを送出する。
 ⑤ SSOサーバは,UserIDとPasswordから利用者のアクセスの正当性を確認したら,アクセスチケットを発行して,Cookieに含めて応答を返す。サービス要求は,Webアプリケーションサーバヘ〔 イ:リダイレクト 〕される。
 ⑥ Webアプリケーションサーバ内のエージェントは,SSOサーバにアクセスチケット確認要求を送り,SSOサーバは,確認して応答を返す。
 ⑦ Webアプリケーションサーバは,⑥の応答によって利用者のアクセスの正当性が確認できた場合,Webアプリケーション画面を送出する。
エージェント方式におけるSSO認証処理のシーケンスの①~⑦を図示すると,図2のようになる。
sso

❷リバースプロキシを使ったシングルサインオン
リバースプロキシを使ったシングルサインオンは、シングルサインオン用に別途リバースプロキシサーバを立て、このサーバが代理で認証を行う方式である。情報処理安全確保支援士試験の対策としては、こちらの方式を基軸にしておきましょう。
情報処理安全確保支援士試験の過去問(H22SC秋AM2問1)では、「リバースプロキシを使ったシングルサインオンの場合、利用者認証においてパスワードの代わりにディジタル証明書を用いることができる」と述べられている。

2.SAML(Security Assertion Markup Language)

(1)SAMLとは

SAMLは、「認証情報に加え、属性情報とアクセス制御情報を異なるドメインに伝達するためのWebサービスプロトコル(H20SW午前 問79)」「標準化団体OASISが, Webサイトなどを運営するオンラインビジネスパートナ間で認証,属性及び認可の情報を安全に交換するために策定したもの(H31春SC午前2問3)」である。
例えば、通販の申し込みサイトと決済サイトが別会社で運営されている場合、ドメインが異なるので、クッキーによるシングルサインオンはできない。そこで、利便性を目的としたSSOの技術の一つに、SAML(Security Assertion Markup Language)がある。
 各WebサイトがSAMLプロトコルに対応していれば、サイト間で認証情報を引き継ぐことができる。つまり、異なるドメイン(= 異なるWebサイト)でのシングルサインオンが可能になる。正解はSAML。
f:id:seeeko:20200818124233j:plain



異なるドメインの場合のみに使うのですか?
いや、そう考えない方がいい。
 SAMLについて、別の情報処理安全確保支援士試験の過去問では、「標準化団体OASISが, Webサイト間で認証,属性及び認可の情報を安全に交換するために策定したフレームワーク(H24SC秋午前2問11)」、「SAMLは、認証、許可などの情報を安全に交換するためのフレームワークである(H29SC春午後1問2)」と述べている。
 つまり、認証のフレームワークである。ただ、同じ社内であれば、一つの認証の仕組み(たとえばADサーバ)で完結できる。他の連携するには、異なるメーカの認証サーバとも連携する必要があり、その標準規格がSAMLである。 

(2)登場人物

SAMLを用いた認証の登場人物を紹介します。

項番 登場人物 解説
SP(サービスプロバイダ) 利用者にサービスを提供するシステム。Office365などのクラウドサービスと考えてください。
IdP(IDプロバイダ) SPや認証サーバと連携して、利用者の認証結果などを安全に受け渡します。
認証サーバ (一般的には社内に設置される)認証サーバです。Microsoft社のADサーバや、LDAPサーバと考えてください。
Webブラウザ SPのサービスを利用するPCのブラウザです。

f:id:seeeko:20200818124233j:plain



ふつうのシステムは、利用者(❹)とアプリケーション(❶)と認証サーバ(❸)だけですよね。なぜIdP(❷)が必要ですか?
 もちろん、認証サーバ1台で実現してくれれば理想です。しかし、認証サーバは、ユーザIDとPWを管理する程度の単純な機能しかありません。今から詳しく仕組みを説明しますが、SPやブラウザおよび認証サーバの仲介役として必要です。

(3)構成例

SAMLを使って認証連携をする様子を、以下に示します。
クラウドサービスB,クラウドサービスCなどがSPです。IdPは、Microsoft社のAD FS(Active Directoryフェデレーションサービス)などをイメージしてもらうといいと思います。フェデレーション(Federation)は「連携」と考えてください。

f:id:seeeko:20210521194742j:plain
 PCからは複数のクラウドサービスを利用しますが、この仕組みにより、クラウドサービスごとにID管理をする必要がなく、A社の認証サーバで一元管理ができます。IDやパスワードを一元管理は、社内サーバを含みます。便利ですね。

(4)SAMLのフロー①

情報処理安全確保支援士試験の過去問に詳しい解説がある。

過去問
F氏:私は,SAML (Security Assertion Markup Language)2.0という標準技術を使ったID連携のシステム構築の経験があります。SAML 2.0では,異なる製品間の相互運用性について,技術標準を策定する団体が主導して試験を行い,検証結果を公表しています。
E君:相互運用性が高い技術であれば,X社の技術標準として採用しやすいですね。
F氏:そうですね。仕組みについてご説明します。図5が,SAML 2.0を使ってSSOを実現する場合のメッセージフローです。この図にあるSP (サーピスプロバイダ)は,認証された利用者に対して業務アプリケーションなどのサービスを提供する側の機能で,IDP(IDプロバイダ)は,利用者認証の結果をSPに提供する機能です。利用者がSP上のWebアプリケーションを利用する場合に,SPが利用者に対してWebアプリケーションのサービスを提供してよいかを判定する必要がありますが,この判定のためにSPは[ a ]をプラウザ経由でIDPから受け取ります。
sso
    図5 SAML 2.0によるSSOのメッセージフロー

E君:なるほど,分かりました。
F氏:Y社にもSAML 2.0のSPを導入したとします。この場合,X社の利用者が,X社情報システム群の認証サーバ,つまり,IDPで一度認証を受ければ,[ b ]するまでは,X社とY社のWebアプリケーションは,利用者が個別にサインオンしなくても利用可能となります。

設問1 ID連携技術について,本文中及び図5中の[ a ],[ b ]に入れる適切な字句を,それぞれ10字以内で答えよ。また,図5中の[ c ]には,ブラウザにおける動作を示す適切な字句を8字以内で答えよ。






試験センターの解答例は以下だ。
設問1
a 認証アサーション(または認証トークン)
b サインオフ
c リダイレクト

(5)SAMLのフロー②

もう一問、情報処理安全確保支援士試験の過去問(H22秋SC午後Ⅱ問2)を解いてみよう。

過去問(H22秋SC午後Ⅱ問2)
SAMLとは,記述言語として[ d ]を用いて,認証及び[ e ]に関する情報を交換するための標準規格である。今回, A社で採用したSAML型SSOシステムにおける認証及び[ e ]を実現するプロトコルは,図9のとおりである。 Webアプリ上には,SP(サービスプロバイダ)と呼ばれるモジュールが稼働しており,IdP(Idプロバイダ)と呼ばれるWebアプリと連携して,利用者認証を行う。IdPにおいては,様々な認証方式を採用できるが,A社では,入力フォームを活用した,利用者IDとパスワードを用いる方式を採用し,図8の統合認証システムにおけるLDAPサーバと連携させることにした。
22
次は,A社で採用したSAML型SSOシステムのプロトコルの動作概要である。ここで,各主体は,ほかの主体の公開鍵証明書を保持しているとする。
(a)利用者のブラウザは, Webアプリにサービスを要求する際,SP用のクッキーがあれば,それを提示する。提示したクッキーが有効であることが検証された場合は(f)に進む。
(b)SPは, SAMLRequestメッセージをエンコーディングした上でURIに含め,サービス要求をldPにリダイレクトする。
(c)利用者は,利用者IDとパスワードを入力し,認証を受ける。
(d)ldPは,利用者IDなどの属性を暗号化及びディジタル署名したSAMLResponseメッセージを発行し,ブラウザ上のJavaScriptを用いて,それをSPに転送する。
(e)SPは,SAMLResponseメッセージのディジタル署名などを検証し,有効であれば,SP用のクッキーを発行する。
(f)SPが稼働するWebアプリは,該当するサービスを提供する。






8412ebbb


あれ、さっきとはSPとIdPの位置が逆だ。
これでいいのかな?
図の上での配置は逆だが、内容は一緒だよ。よく見てみよう。
試験センターの解答例は以下だ。
d XML
e 認可

SPやIdpがどれかは必須のように問われているので、理屈を理解しておきましょう。

(6)SAMLのフロー③

情報処理安全確保支援士試験の過去問(H29春SC午後1問3)をもう一問見てみましょう。このように何度も問われていることから、SAMLの理解は情報処理安全確保支援士の試験対策として重要です。

過去問(H29春SC午後1問3)
----- 問題文ここから -----
〔SAMLを用いた認証連携と接続元制限方式の概要]
SAMLは,認証,認可などの情報を安全に交換するためのフレームワークである。SAMLを用いることによって,利用者にサービスを提供するサービスプロバイダ(以下,SPという)と,IDプロバイダ(以下, IdPという)との間で利用者の認証結果などの情報を安全に連携することができる。SAMLには複数の処理方式が存在する。今回F社で導入を検討している方式のシーケンスを図1に示す。図1中の各通信のプロトコルは, IdPとLDAPサーバ間はLDAPであり,それ以外はHTTP over TLSである。
idp

図1 導入を検討している方式のシーケンス

 SAMLを用いた認証連携を行うためには,事前にldPとSPとの間で様々な情報を共有することによって,信頼関係を構築しておく必要がある。事前に共有する情報としては,通信の方式や連携する属性情報などが記述されたメタデータ,[ e:処理1 ]で生成して送出するURL,[ f:処理4 ]において必要なIdPのディジタル証明書などがある。
 図1中の処理1~4の処理内容を表1に示す。

表1 処理内容

処理番号   処理内容
処理1 ・IdPに認証を要求するSAML Request を生成する。
・SAML Request をエンコードする。
・エンコード結果をIdPのログイン画面のURLと組み合わせて,リダイレクト先URLを生成する。
処理2 ・URL内の[ g:ウ:クエリ文字列 ]からSAML Request を取得する。
・信頼関係が構築されたSPからの認証要求であることを検証する。
処理3 ・利用者の認証が成功した場合,認証結果やSPとの間で連携する属性情報,有効期間,それらの情報に対するディジタル署名を含めたSAML Response を生成する。
処理4 ・SAML Response に含まれるディジタル署名を検証することによって,ディジタル署名が[ h:IdP ]によって署名されたものであること,及びデータの[ i:改ざん ]がないことを確認する。
・SAML Response 内の属性情報も検証することによって,サービスを提供すべきか決定する。

----- 問題文ここまで -----





まず、先に正解を言うと、
a:SP
b:利用者端末のブラウザ
c:IdP
d:LDAPサーバ
情報セキュリティスペシャリスト試験を目指す女性SE


問題文の3つで、すべて違うじゃないですかー
そうですね。ブラウザからSPに「サービス要求」が通信の始まり
これだけ覚えておけば、間違えないでしょう。

実際、たとえば、ZOOMというSPにアクセスするときは、ZOOMにアクセスしますよね。そこでSSO(というかIdP)を選んで、Idpで認証情報を入れる。IdPは本当に認証サーバで認証を行い、成功すれば、ZOOMというSPに接続できる。このとき、ZOOMにもアカウントは追加されるはず。(認証情報を完全に持たないのではなく、PWだけ(?)を持たないと思っていいかと思う)
また、この問題の場合、表1などを読めば、答えがわかるようにもなっていますので、知らなくても問題文から解答できます。

[参考】SAMLの事例(学術認証フェデレーション)

複数の大学で、共同のe-Learningシステムを利用する場合、IDの管理をどうするか。これが課題となる。
共同のe-Learningシステム用にIDを作成すると、学生はIDが増えて煩雑だ。かといって、自分の大学のID情報を、他大学に教えることもできない。
そこで、SAML。以下がイメージ図だ。
素材3_4_SAMLの事例(学術認証フェデレーション)

少し補足する。

(1)SPについて
提供するサービス(メールや学内システム、eラーニングなど)のサーバがあるだろう。当然だ。
そこに、SPのモジュールを組み込むことで、認証画面をつける。このモジュール、多くはShibboleth(シボレスと読む)だ。
設定は以下。
https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=12158264

(2)IDPについて
認証の窓口となるサーバ。ADサーバやLDAPサーバそのものではない。SAMLの仕組みを使って、SPと認証サーバをつなぐための仕組みだ。
構築としては、WindowsやLinuxのサーバを立てて、IdPをインストールする。こちらも、多くはShibboleth(IdP)だ。
設定は以下
https://meatwiki.nii.ac.jp/confluence/pages/viewpage.action?pageId=12158257

(3)認証サーバ
従来の、大学にある認証サーバ。ActiveDirectoryやLDAPなどのサーバが多いだろう。IdPからの問い合わせ(LADPかKerberos)に対して、認証結果や属性(学部など)を返す。
この仕組み、便利ですね。
でも、便利すぎて、セキュリティ面で色々と疑問があります。

話が変わるが、大学での無線LANのローミング基盤はeduroam。

3.OAuth

 RFC6749で規定されているOAuth 2.0の仕組みについて解説します。H30年NW午後Ⅱ問1の図6は、まさにOAuth2.0の流れそのものです。また、支援士では、R5春午後Ⅱ問2で問われました。

(1)OAuth 2.0とは

・OAuth(Open Authorization)とは、複数のシステム(Webサービス)で、APIを使って認証を連携させる仕組みです。
・オープンな(Open)な許可(Authorization)という言葉が意味する通りで、企業に閉じた仕組みというよりは、複数のSNSで連携するなど、インターネットでの認証連携で利用されます。
・たとえば、FacebookとTwitterの連携です。Facebookでの投稿した記事を、Twitterにも投稿させたり、Twitterのプロフィールを更新したりできるのです。
・以下は、FacebookとTwitterの連携の設定画面です。


これは一例ですが、このように、複数のWebサービスで利用者認証を連携するときに、OAuthが必要になってきます。

(2)OAuth 2.0の具体例

・具体的に見ていきましょう。まずは以下の過去問(H27秋SC午前2)を見てください。

問17 OAuth 2.0において, WebサービスAの利用者Cが, WebサービスBにリソースDを所有している。利用者Cの承認の下, WebサービスAが,リソースDへの限定的なアクセス権限を取得するときのプロトコルOAuth 2.0の動作はどれか。
ア WebサービスAが,アクセストークンを発行する。
イ WebサービスAが,利用者Cのディジタル証明書をWebサービスBに送信する。
ウ WebサービスBが,アクセストークンを発行する。
エ WebサービスBが,利用者Cのディジタル証明書をWebサービスAに送信する。

先に答えだけお伝えすると、ウが正解です。
さて、この問題文の登場人物は以下です。わかりやすいように、具体例を入れています。

利用者C あなた
WebサービスA どこかのWebサイト
WebサービスB (Facebookなどの)SNS
リソースD SNSで公開しているあなたのプロフィール

 図にすると以下のようになります。
 問題文にあるようにWebサービスAが、リソースD(SNSのプロフィール)へのアクセス権限を取得し(下図➀)、WebサービスAにプロフィールを掲載します(下図②)。




WebサービスAがWebサービスBにアクセスするのですね。
 はい、そうです。では、WebサービスAはどうしてWebサービスBにアクセスできるのでしょうか?WebサービスA側に、WebサービスBのIDとパスワードを教えていると思いますか?



それはセキュリティ的に適切ではないと思います。

 ですよね。パスワードは利用者本人以外が知るべきではありません。そこで、ID/パスワードの代わりに、トークン(アクセストークン)という許可証をWebサービスA に渡します。WebサービスA は、このトークンを使ってWebサービスBにアクセスするのです。また、トークンを使えば、リソースD以外の例えば「Cさんの友達リストアクセスするための権限を付与したトークン、など、許可する資源(や情報)を細かく制御できます。
 このように、ユーザ認証をしてアクセストークンを発行するやりとりを標準化したものがOAuthです。2.0はバージョンを意味します。Oauth1.0はセキュリティ上の欠陥がありましたが、Oauth2.0ではその点などを含めて改良されています。現在の主流は2.0です。
 参考ですが、OAuthは、「認証」ではなく「認可」の仕組みと言われます。ユーザがAさんなのかBさんなのかを識別(=認証)するのではなく、どの資源や情報を使ってよいかを許可(=認可)するという意味です。以下は、OAuthの仕組み丸分かり体験サイト(https://contents.saitolab.org/oauth/)を利用させていただき、Facebook連携をした様子です。図にあるように、「受け取る情報」として「氏名」と「プロフィール写真」とあります。単にFacebookの情報を全て渡すのではなく、資源単位で認可をしている様子がわかると思います。

とはいえ、厳密に分けるとややこしくなるので、この解説では両者の区別を意識していません。

(3)OAuth 2.0の登場人物

 では、OAuth 2.0の登場人物を紹介します。

登場人物 解説 先の過去問の場合
Resource Owner クライアントPC(実際にはブラウザ)。情報資産(写真やメール、ファイルなど)へのアクセス権限を持っているのでオーナ(Owner)と言える。 利用者C      
OAuth Client 利用者が使用するシステムやサービス WebサービスA
Authorization Server 認可サーバ。ユーザ認証をしてアクセストークンを発行する。 WebサービスB
Resource Server Resource(プロフィールなどの情報)を持つサーバ。他のWebサービスから接続するためのAPIを用意する。 WebサービスB

 また、トークンにも2種類があります。

トークンの名称 説明 有効期間
アクセストークン 通常のトークン 短い(10分)※注
リフレッシュトークン アクセストークンの有効期間が切れた場合に利用する 長い(60分)※注

 ※注:有効期間は、過去問(H30午後Ⅱ問1)に記載があったものを使用。

 トークンについて少し補足します。アクセストークンは、すでに説明したように、Webサービスを利用する際の許可証です。リフレッシュトークンは、アクセストークンの有効期間が切れた場合の延長申請で利用します。アクセストークンの有効期間はわずか10分です。有効期間が終わる都度、利用者にユーザID/パスワードを再入力してもらうのは不便です。利用者に再認証してもらう代わりに、リフレッシュトークンで新しいアクセストークンを発行してもらいます(利用者は何もする必要がありません)。
 何点か、QAで補足説明します。

Q1.リフレッシュトークンは、いつ発行されるのですか?

 A1.認証成功時にアクセストークンと同時に発行されます。

Q2.アクセストークンの有効期間を長くすればいいのでは?

 A2.アクセストークンはサービスを利用する際に何度も流れます。盗聴のリスクがあります。不正利用されないためにも、有効期間は短くすべきです。

Q3.でも、リフレッシュトークンも盗聴される可能性がありませんか?

 A3.もちろんあります。しかし、アクセストークンに比べてネットワークを流れる機会は多くありません。盗聴されるリスクは少ないのです。

(4)OAuth 2.0のフロー

では、過去問(H30午後Ⅱ問1)をもとに、OAuth2.0のフローを確認しましょう。

先ほど挙げた、WebサービスAにプロフィールを載せる事例でシーケンスを説明します。
ⅰ)利用者がWebサービスAにアクセス(図の「情報要求」)します(❶)。
ⅱ)WebサービスBのリソースを使うので、WebサービスBにリダイレクト応答を行い、認可要求をします(❷)。ここで、「(a)認可要求」の内容は以下です。

HOSTが「認可サーバ」になっているので、接続先は「認可サーバ」です。



なぜ、顧客サーバ(WebAP)が「認可サーバ」の情報を知っているのですか?
 
当然ですよ。顧客サーバ(WebAP)は、連携する認可サーバを事前に選定しているでしょうし、その情報を事前に登録しています。だから、リダイレクトのHOSTに「認可サーバ」を指定できます。
説明に戻りますが、GET/authorize?redirect_url=【WebAPのURL】とあります。よって、このHTTPヘッダが意味することは、http://認可サーバ/authorize?redirect_uri=【WebAPのURI】へ通信することと同じです。http://認可サーバ/authorizeに接続し、引数としてredirect_uri=【WebAPのURI】を渡すという意味です。引数を付与しているので、認可サーバは「(b)認可応答」にてリダイレクト先のURIを指定することができます。
ⅲ)認可サーバにて、ID/パスワードを入力します。図の「アクセスの確認(省略)」の部分です。
ⅳ)認証が成功すると、認可応答として「認可コード」が発行されます。(❸)
 問題文には認可応答の中身も記載されています。code=の部分に認可コードが確認できます。

ⅴ)WebサービスAが受け取った認可コードを用いて、WebサービスBにアクセスできるようにトークン(=許可証)を要求します。(❹)
ⅵ)トークンがWebサービスAに発行され(❺)、アクセストークンを使って、WebサービスBにアクセスします(❻)


❸の「(b)認可応答」ですが、「認可コード」ではなく、いきなりトークンを受け取ってはいけないのですか?
 
技術的にはできそうですが、そうしない理由があるはずです。パッとは思いつきませんが、PC経由でアクセスさせることで、認証面やセキュリティ面で高まることでしょう。
それと、単純な理由として、たとえば、顧客サーバへの通信は、どこからでもアクセスできるのではなく、送信元やポートを絞っている可能性があります。つまり、認可サーバから顧客サーバ(WebAP)への直接的な通信が行えない可能性があるのです。だから、PC経由で接続させます。
それと、PCが保持しているものと顧客サーバが保持しているものは別物です。シーケンスをよく見てみましょう。PCが受け取るのは認可コードで、顧客サーバ(WebAP)が受け取るのはアクセストークンです。認可コードはPC(というかユーザ)を許可し、アクセストークンはシステムを許可します。なので、処理としては分けられています。

4.SAMLとOAuthの共通点

OAuthは複数のシステム(Webサービス)間で、APIを使って認可を連携させる仕組みです。インターネットでの認証連携にはSAMLがありますが、SAMLは、基本的に「認証」の機能しかありません。OAuthでは、「認可」の機能を実現します。とはいえ、認可をするためには「誰であるか」という識別が必要なので、OAuth2.0は認可の仕組みですが,認証もしていると考えてください。
以下、SAMLとOAuthのシーケンスを並べましたが、基本的には同じことをしています。SSOの仕組みで、認証サーバに問い合わせて許可をもらっている点が共通しているからです。

(1)SAMLのシーケンス

(2)OAuthのシーケンス

以下、共通点がわかりやすいように図にしました。上の2つを1つにまとめた感じです。

再確認ですが、上記の②と④でWebサービスと認証系システムが直接やりとりをせずにPCを経由しています。
PCから通信させることでなりすましの防止ができますし、直接やり取りさせないことで、一時的なチケットではなく、恒久的なIDパスワードなどの認証情報をWebサービスに渡さなくて済みます。

5.Kerberos認証によるシングルサインオン

db2fc28c



ケルベロスって、ギリシャ神話の門番でしたっけ。
門番が許可した人だけを中に入れた、つまりケルベロスによる認証だったわけですね。

 Kerberos認証というのはシングルサインオンに限った仕組みではないが、結果的にシングルサインオンと同様の機能を持つ。
私が解説するよりも、情報処理安全確保支援士試験の過去問(H22SC秋午後2問2)にてきれいに整理されているので、紹介する。
前半の図が、Kerberosを使わない場合で、後半の図が使った場合。あきらかに、認証が便利になっている。また、問題文に記載があるように「C-CR認証の場合,クライアントはサーバヘの接続のたびにDCにおいて認証を行う必要があるが, Kerberos認証の場合,有効期限内であればチケットをサーバに提示するだけでサービスを受けられる。」という点も利点である。

A社は, PC端末,ファイルサーバ及び一部のWebアプリにおける認証の仕組み,並びにディレクトリとして,c社製ディレクトリシステム(以下,C-DIRという)を,導入している。C-DIRでは,利用者. PC端末,プリンタ及びサーバから構成されるドメインという管理単位を定め,ドメインコントローラ(以下,DCという)によって管理する。また, DCでは, C-DIRのディレクトリに保持されるアカウント情報を用いて認証を行う。認証には,C社独自仕様のチャレンジレスポンス認証(以下, C-CR認証という),又はKerberos認証を利用することが可能である。
 C-CR認証では,図3に示すプロトコルの(b)-1~(b)-4において,DCが生成した疑似乱数をチャレンジとし,それを受信したクライアントで,利用者ID,パスワード及びチャレンジの連結をハッシュ化したレスポンスをDCに返信し,アクセス許可を受ける。k1
他方, Kerberos認証では,図4に示すように,クライアントが, DCにおける認証後,有効期限付のチケットが発行され,それをサーバに提示し,アクセス許可を受ける。k2
C-CR認証の場合,クライアントはサーバヘの接続のたびにDCにおいて認証を行う必要があるが,  Kerberos認証の場合,有効期限内であればチケットをサーバに提示するだけでサービスを受けられる。A社では,トラフィックが少なくなるなどのメリットが多いKerberos認証だけを利用している。また, Kerberos認証において、②有効期限切れのチケットが悪用されないように,DCとサーバを[ a ]させて運用している。

設問2 (2)本文中の下線②を実現するために,[ a ]に入れる適切な字句を10字以内で答えよ。






これは、Windowsにて、AD(AcriveDirecory)の認証が終わると、AD配下の各サーバにアクセスする際に、再認証が不要という仕組みだ。日頃利用されている人が多いだろうから、理解がしやすいだろう。
aに入るのは、「時刻同期」だ。

参考ですが、WindowsのADの認証には、Kerberos以外にNTLMv2がある。しかし、Windows 2000以降は、Active DirectoryではNTLMは脆弱性が発見されていることもあって非推奨で、Kerberos認証が使われる

SQLインジェクション

1.SQLインジェクションとは

過去問では、SQLインジェクションに関して、以下のように述べられている。

SQLインジェクションに関して(H22AP秋午前問43より)
「Webアプリケーションに悪意ある入力データを与えてデータベースの問合せや操作を行う命令文を組み立てて、データを改ざんしたり不正に情報取得したりする攻撃」

SQLインジェクションは、SQL文を操作する文字列をWebフォームなどに注入(Injection)し、データベースに不正にアクセスする攻撃。
例えば、以下のようなフォームがある。

サーバの認証プログラムとして、以下のSQL文が入っているとします。

SELECT user_id,passwd FROM users WHERE user_id='$user_id' AND passwd='$passwd';  

ここで、フォームに以下を入力する

1' or '1' = '1'; -- (最後は半角スペース)

SQL文は以下になる。

SELECT user_id,passwd FROM users WHERE user_id='1' or '1' = '1'; -- ' AND passwd='$passwd';  

コメントを意味する「--」を付ければ、それ以降が無視されます。結果、どんなユーザを入れても成立してしまいます。
コマンドを成功させるだけでなく、SQLのUNION句を使って別のSQL文をくっつければ、DBの中身を表示することも可能だ。

2.SQLインジェクションの対策

2.1 対策の全体像

SQLインジェクションの対策に関しては、IPAのサイトから以下が公開されています。
https://www.ipa.go.jp/security/vuln/websecurity/sql.html

根本的解決
1-(i)-a SQL文の組み立ては全てプレースホルダで実装する。
SQLには通常、プレースホルダを用いてSQL文を組み立てる仕組みがあります。SQL文の雛形の中に変数の場所を示す記号(プレースホルダ)を置いて、後に、そこに実際の値を機械的な処理で割り当てるものです。ウェブアプリケーションで直接、文字列連結処理によってSQL文を組み立てる方法に比べて、プレースホルダでは、機械的な処理でSQL文が組み立てられるので、SQLインジェクションの脆弱性を解消できます。

プレースホルダに実際の値を割り当てる処理をバインドと呼びます。バインドの方式には、プレースホルダのままSQL文をコンパイルしておき、データベースエンジン側で値を割り当てる方式(静的プレースホルダ)と、アプリケーション側のデータベース接続ライブラリ内で値をエスケープ処理してプレースホルダにはめ込む方式(動的プレースホルダ)があります。静的プレースホルダは、SQLのISO/JIS規格では、準備された文(Prepared Statement)と呼ばれます。

どちらを用いてもSQLインジェクション脆弱性を解消できますが、原理的にSQLインジェクション脆弱性の可能性がなくなるという点で、静的プレースホルダの方が優ります。詳しくは本書別冊の「安全なSQLの呼び出し方」のプレースホルダの項(3.2節)を参照してください。

1-(i)-b SQL文の組み立てを文字列連結により行う場合は、エスケープ処理等を行うデータベースエンジンのAPIを用いて、SQL文のリテラルを正しく構成する。
SQL文の組み立てを文字列連結により行う場合は、SQL文中で可変となる値をリテラル(定数)の形で埋め込みます。値を文字列型として埋め込む場合は、値をシングルクォートで囲んで記述しますが、その際に文字列リテラル内で特別な意味を持つ記号文字をエスケープ処理します(たとえば、「'」→「''」、「\」→「\\」等)。値を数値型として埋め込む場合は、数値リテラルであることを確実にする処理(数値型へのキャスト等)を行います。

こうした処理で具体的に何をすべきかは、データベースエンジンの種類や設定によって異なるため、それにあわせた実装が必要です。データベースエンジンによっては、リテラルを文字列として生成する専用のAPI(*4)を提供しているものがありますので、それを利用することをお勧めします。詳しくは、「安全なSQLの呼び出し方」の4.1節を参照してください。

なお、この処理は、外部からの入力の影響を受ける値のみに限定して行うのではなく、SQL文を構成する全てのリテラル生成に対して行うべきです。

1-(ii) ウェブアプリケーションに渡されるパラメータにSQL文を直接指定しない。
これは、いわば「論外」の実装ですが、hiddenパラメータ等にSQL文をそのまま指定するという事例の届出がありましたので、避けるべき実装として紹介します。ウェブアプリケーションに渡されるパラメータにSQL文を直接指定する実装は、そのパラメータ値の改変により、データベースの不正利用につながる可能性があります。
保険的対策
1-(iii) エラーメッセージをそのままブラウザに表示しない。
エラーメッセージの内容に、データベースの種類やエラーの原因、実行エラーを起こしたSQL文等の情報が含まれる場合、これらはSQLインジェクション攻撃につながる有用な情報となりえます。また、エラーメッセージは、攻撃の手がかりを与えるだけでなく、実際に攻撃された結果を表示する情報源として悪用される場合があります。データベースに関連するエラーメッセージは、利用者のブラウザ上に表示させないことをお勧めします。

1-(iv) データベースアカウントに適切な権限を与える。

ウェブアプリケーションがデータベースに接続する際に使用するアカウントの権限が必要以上に高い場合、攻撃による被害が深刻化する恐れがあります。ウェブアプリケーションからデータベースに渡す命令文を洗い出し、その命令文の実行に必要な最小限の権限をデータベースアカウントに与えてください。|

整理すると、こんな感じ
#### (1)根本的解決
〔1〕エスケープ処理
  ①バインド機構の利用
  ②プログラムでのエスケープ処理
   入力フォームによる入口でのチェックも有用

#### (2)保険的対策
〔1〕エラーメッセージを非表示
 エラーメッセージは、攻撃者に情報を与えてしまう。
また、ブラインドSQLインジェクション(Blind SQL injection)という手法があり、入力値と応答結果から、脆弱性を把握する。たとえば、ID/Passを入力したときに、「IDが存在しません」「パスワードが間違っています」と丁寧にエラーを返せば、攻撃者にもIDが違うのかPassが違うのかの情報を与えてしまう。

〔2〕データベースアカウント
 権限の見直し。必要最小限の権限しか与えておかなければ、被害も少なくなる。

過去問をみてみましょう。

過去問(H21SC春午前Ⅱ問14)
SQLインジェクション対策について、Webアプリケーションの実装における対策とWebアプリケーションの実装以外の対策の組合せとして、適切なものはどれか。20231007002906






今回の内容はとても難しい内容ですが、SQLインジェクションというキーワードから、「データベース」に関する対策を選ぶと、ウのみになります。

2.2 静的プレースホルダ(バインド機構)

これを使えば、エスケープ処理は不要だ。
http://www.ipa.go.jp/files/000024396.pdf

静的プレースホルダは情報処理技術者試験で問われるキーワードです。バインド機構や、プリペアドステートメントという言葉を使う場合もあります。Prepared Statementなので「用意された構文」です。用意された構文が変化することなく、入力された文字は文字列として理解されるので不正な文字を入れるという攻撃を防げます。

過去問(H18秋SU午後Ⅱ問1)では、「バインド機構を利用する」ことの解説として、「プレースホルダと呼ばれる一時的な特殊文字を使用してSQL文のひな形を用意しておき,後で実際の値(変数)を割り当ててSQL文を完成させる方法です。変数は自動的にエスケープ処理されるので,DBMSの種類によって異なるエスケープ処理を意識する必要がなくなります」とあります。

具体例をみましょう。以下は、上記サイトの引用であるが、入力されたデータは「?」で表わされます。そして、入力されたデータが文字として直接実行されるのだ。

具体例
$sth = $dbh->prepare(
"SELECT id, name, tel, address, mail FROM usr WHERE uid=? AND passwd=?");
$sth->execute($uid, $passwd);

1


わかったような…

これまでは、上記のuidのところに、以下のように入力されると、構文が変わってしまう。
1' or 'a'='a' --
しかし、?で処理し、値だけを判断するので、 「1' or 'a'='a' --」という文字列で処理される。

2.3 サニタイジング(エスケープ)処理

(1)サニタイジング(エスケープ)処理とは

SQL インジェクション対策はサニタイジング(エスケープ)処理が一般的です。
過去問では、SQLインジェクション攻撃を防ぐ方法として、「入力値から,データベースへの問合せや操作において特別な意味をもつ文字を解釈されないように保護する。(H20SU 午前問題 問26より)」と述べられている。

また、過去問(H18秋SU午後Ⅱ問1)では、「SQLインジェクション対策のためのエスケープ処理とは,利用者から入力される値が、SQL文にとって特別な意味をもつ記号文字の場合に,例えば,"'"であれば"''"のように"'"を二つ続けた文字列に置換する処理のことです。」とあります。

Webフォームなどに、<script> のようなスクリプトが埋め込まれた場合、HTMLではスクリプトと判断してスクリプトが実行されます。単純な例を挙げます。以下の記載をしたとします。
<script>alert("こんにちは");</script>
すると、画面に以下のようなポップアップ画面(アラート)が表示されます。あなたが掲示板の管理者だとして、このような書き込みをされたとすると、その掲示板を開くたびにこのアラートが出てしまいます。困りますよね。
alert_情報セキュリティスペシャリスト試験

掲示板でのポップアップレベルならいいですが、個人情報を抜かれたり、サーバを乗っ取るようなコマンドを仕掛けられることもあります。これは防がなければいけません。

(2)サニタイジング(エスケープ)処理の方法1

対策(エスケープ処理)として、<script>などの文字を、Webサーバ上ではプログラム用の言葉ではなく、単なる文字として認識させます。具体的には「<」を「<」としてエスケープ処理をします。すると、Webサーバ側では、&lt;script&gt; となりますので、これはプログラム用の言葉ではないと判断されるのです。
7a536a8a

&lt;script&gt; 書いたとしても、
ブラウザ上では <script> と表示されるのですね。

はいそうです。ブラウザがきちんと自動で認識をしてくれます。掲示板などに&lt;script&gt;と書き込んで試してみるといいでしょう。
エスケープ処理(サニタイジング処理)における、文字の変換例は以下です。

   表2 文字の置換

元の文字 置換後の文字列
& &amp;
< &lt;
> &gt;
' &#39;
" &quot;

(H18年SV午後Ⅰ問1表2より引用)

これを丸暗記しようとすると難しいが、意味を理解すると覚えやすい。例えば「&」であれば、本来の名称であるampersand、「<」であれば、less than(~より小さい)のltである。
セキュアプログラミングに関しては、IPAのサイトに充実した解説がされている。[http://www.ipa.go.jp/security/awareness/vendor/programming/index.html](http://www.ipa.go.jp/security/awareness/vendor/programming/index.html)

(3)サニタイジング(エスケープ)処理の方法2

別の例を見ましょう。SQLインジェクション対策としてのエスケープ処理の具体的な処理としては、 ' を '' に変換します。サニタイジングをしない場合、UserNameに a' or '1'='1' と入力すると、データベース側では、
 SELECT * FROM USER WHERE UserName = 'a' or '1'='1'
と判断され、'1'='1'は正しいことから、不正なアクセスが可能だ。
一方で、サニタイジングをすると、同じ入力をした場合、以下になる。
 SELECT * FROM USER WHERE UserName = 'a'' or ''1''=''1'
こうなると、SQLの構文として不適切であり、この部分は「文字列」として扱われる。
なおかつ、データベース側では、''は'という文字列として自動認識してくれるので、入力した通りの文字として正常に処理される。
情報セキュリティスペシャリスト試験を目指すSE成子

サニタイジングとエスケープ処理との違いはなんですか?
同じですか?

まあ、一緒と思ってもいいだろう。
サニタイジング(無害化)の方法の一つが文字の変換などによるエスケープ処理。サニタイジングの方法は、エスケープ処理以外に、特殊文字は入力させない、処理を強制終了させるなどがある。
又は、もっと単純に、’などの特殊文字をそもそも受け付けず、入力フォームにてエラーを出すことも方法の一つ。

◆参考:Taintモード
Perlの場合、Taintモード(汚染検出用のモード)がある。
IPAの以下の資料には、次のような効果が記載されている。http://www.ipa.go.jp/security/awareness/vendor/programmingv1/pdf/a04_03.pdf

IPA資料
このモードでは,フォームからのデータのみでなく,コマンドライン引数,環境変数,ロカール情報 ,幾つかのシステムコール(readdir,readlink,getpw* 呼び出しのgecos フィールド)の結果,すべてのファイル入力などを汚染データとして扱い,これらのデータをサブシェルを起動するコマンド(system,exec など)や,ファイルやディレクトリ,プロセスに変更を加えるようなコマンド(unlink,umask など)の引数として使用した場合,エラーとしてくれる。

設定は簡単
\#!/usr/bin/perl -T ←これをつけるだけ
ただ、万能ではないし、実装されていることも少ない(気がする)。

メールヘッダインジェクション攻撃

1.攻撃概要

具体的な攻撃事例を紹介します。たとえば、店舗が以下の問い合わせフォームを用意していたとします。利用者が名前やメールアドレス、タイトルなどを入れると、右のメールが店舗に自動送信されます。
ではここで、問い合わせフォームのタイトルに、改行コードである「%0D%0A」を加え、以下を入力したとします。

お買い得%0D%0ABcc:<user1@example.com

すると、メールヘッダは以下のようになり、Bccに指定した宛先にメールを送信することが可能です。

メールヘッダ
MIME-Version: 1.0
Message-ID: <xxx@mail.gmail.com>
Subject: お買い得
Bcc:<user1@ example.com>
From: <malware@gmail.dom>
To: <support@shop.dom>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

名前:お買い得ショップ
問い合わせ:以下、お買い得情報をお知らせします。是非リンクをクリックしてね
      ・・・・・

攻撃者は、BCCにSPAMメール送りたい宛先を入れ、このようなフォームを踏み台にしてSPAMメールを送信できます。

2.対策

情報処理安全確保支援士の過去問(R3春午後1問1)をもとに整理します。

 参考までに、表1の「メールヘッダインジェクション」に関するその他の対策を解説します。
①メールヘッダを固定値にする
 メールヘッダを固定値にすれば、メールヘッダインジェクションにより、不正なコードを入力することができません。
②外部からの入力を適切に処理する
 メール送信用APIを使用するインジェクションを引き起こすような文字がないかをチェックする安全なAPI(=プログラム、と考えましょう!)を用意し,そのAPIを用いてメール送信処理を行います。
③外部からの入力の全てについて、改行コードを削除する
 改行コードを削除することで、攻撃者のよる不正な処理を防ぎます。具体的な攻撃例は先に述べたようなBccを自由に設定するような攻撃です。