目次


セキュリティー・アラートを IBM DevOps Services の Track & Plan で管理する

REST インターフェースを使用して問題をレポートする

Comments

IBM Bluemix Track & Plan サービスは、主に開発目的で設計されていますが、アプリケーションでもこのサービスを利用することで、特定されたセキュリティー違反を含め、アプリケーション自体のステータスをレポートすることができます。このチュートリアルでは、REST インターフェースを使用することにより、Node.js Bluemix アプリケーションが自動的に Track & Plan にアクセスして問題をレポートするよう、セットアップする方法を説明します。

このチュートリアルはセキュリティーの観点から作成されていますが、この手法を適用できる対象はセキュリティーに限りません。アプリケーションでエラー条件をレポートするためや、リソース不足を警告するためなどに、この手法を適用することができます。

アプリケーションを作成するために必要となるもの

  • Bluemix アカウント
  • HTML および JavaScript の知識
  • MEAN アプリケーション・スタック (そのうち、少なくとも Node.js と Express) の知識 (MEAN についてよく知らない場合は、IBM developerWorks に掲載されている全 3 回からなる連載記事「Bluemix と MEAN スタックを使用して自動投稿 Facebook アプリケーションを作成する」を参照してください。)
  • Node.js アプリケーションを Bluemix にアップロードできる開発環境 (Eclipse など)。

アプリを実行するコードを入手する

このチュートリアルでは、IBM DevOps Services の Track & Plan を使用して、アプリケーションが攻撃にさらされていることを管理者に通知するためのコードの作成方法を説明します。

デモ・アプリケーション

このアプリケーションは、ログイン画面からなるアプリケーションです。正規のユーザーとしてログインするには、ユーザー名として「jdoe」、パスワードとして「object00」と入力する必要があります。レポート可能なセキュリティー・イベントを生成するには、ログインする際に誤ったユーザー名またはパスワードを入力します。Track & Plan を構成するためのフィールドもあるので、皆さんがログを表示できるシステムに、セキュリティー・イベントをログとして記録することができます。

ステップ 1. Track & Plan を構成する

注: このステップの詳細な説明は、「Bluemix AppScan の結果を Bluemix Track & Plan サービスに取り込む」のステップ 1 とステップ 2 を参照してください。

  1. Bluemix コンソールにログインして、Web アプリケーションを開きます。
  2. Git リポジトリーを追加します。
  3. IBM DevOps Services を開き、上記 Web アプリケーションに該当するプロジェクトの設定画面から、追加したリポジトリーに対して Track & Plan を有効にします。
  4. Bluemix で使用しているスペースに DevOps の Delivery Pipeline サービスと Track & Plan サービスがまだ含まれていない場合は、この両方を追加します。
  5. 必要に応じて、Git リポジトリーのファイルを当該アプリケーションのソース・ファイルで置き換えます。
  6. アプリケーションをプッシュ、ビルド、デプロイします。
  7. 「TRACK & PLAN」をクリックします。
  8. 「My Work (自分のワーク)」をクリックし、 (左側のプラス・アイコンをクリックして) オープンなワークアイテムを作成します。要約フィールドに「test #alert #security」と入力して、「alert」と「security」というタグを作成します。
  9. 正しいタグが設定された状態で新規ワークアイテムがオープンされていることを確認します。新規ワークアイテムを示す画面のスクリーン・キャプチャー
    新規ワークアイテムを示す画面のスクリーン・キャプチャー

ステップ 2. Track & Plan のデータを取得する

次のステップでは、REST インターフェースを使用してサーバーと通信するために、Track & Plan のデータを取得します。そのための方法は「Bluemix AppScan の結果を Bluemix Track & Plan サービスに取り込む」のステップ 2 で説明していますが、今回は作業のほとんどを任せられるユーティリティーを用意しておきました。以下の図に、このユーティリティーのスクリーン・キャプチャーを示します。.

ユーティリティーのスクリーン・キャプチャー
ユーティリティーのスクリーン・キャプチャー

Track & Plan ユーザー・インターフェースに URL (例えば、https://hub.jazz.net/ccm19/quickplanner/jazzhub.html#items:planType=mywork&projectId=_CtzTlXn5EeWL9uPUvTiukg) と Track & Plan のユーザー名およびパスワードを入力します。すると、app.js 内のコードが構成の残りの部分を判断して、その構成情報をクッキーの中に保管します。このクッキーから、index.html コードが構成情報を読み取ることになります。

仕組み

注: このセクションの内容は、Track & Plan にアラートを送信するために必要となるものではないので、このセクションをスキップして、Track & Plan が提供する値をアプリケーションにハードコーディングしていただいて構いませんが、読者が app.js 内のコードが構成を判断する仕組みを理解したいという場合に備えて記載しておきます。

以下のコード・セグメントは、/getConf への POST リクエストに応答する関数と、util.html フォームに対するアクションを宣言するものです。serverIDprojectID はどちらも Track & Plan の URL の一部となるので、これらの値は正規表現を使用して取得されます。この 2 つのフィールドとは対照的に、カテゴリーを取得するには Track & Plan に対して REST リクエストを発行する必要があります。以下の関数は、この REST リクエストを作成し、その後でそのリクエストを解釈するという処理を、その大部分で行っています。

app.post("/getConf", function(req, res) {
	var serverID = RegExp("https://hub.jazz.net/(ccm[0-9]*)/").exec(req.body.url)[1];
	var projectID = RegExp("projectId=(_[0-9A-Za-z]*)&").exec(req.body.url)[1];

以下の HTTPS オプションは、そのほとんどが標準的な情報なので URL に指定することもできますが、いくつかの例外があります。auth フィールドは、ユーサー名とパスワードです。REST リクエストで重要となる 2 つのヘッダー・フィールドもあります。その 1 つは、Content-Type です。これは、リクエストのタイプを指定するヘッダーです (また、追加のデータがある場合は、そのフォーマットも指定します)。もう 1 つの Accept ヘッダーは、レスポンスのフォーマットを指定します。.

	var httpsOpts = {
		hostname: 'hub.jazz.net',
		port: 443,
  		path: "/" + serverID + "/oslc/contexts/" + projectID + "/workitems",
  		method: 'GET',
  		auth: req.body.uid + ":" + req.body.passwd,
  		headers: {
	  		Accept: "text/json",
  			"Content-Type": "application/x-oslc-cm-change-request+json"
  			}
	};

以下に示すコード・フラグメントは、リクエストを送信し、レスポンスで呼び出される関数を宣言しています。この関数は、Node.js がサーバーからレスポンスのヘッダーを受け取ると同時に呼び出されますが、その時点ではまだ、この関数が有用な処理を行うことはできません。幸いなことに、このレスポンスは HTTP 本体の各構成部分を TCP から受信するたびにデータ・イベントを発行します。このことから、完全な本体を取得するために、これらすべてのイベントからのデータを追加しています。

	var httpsReq = https.request(httpsOpts, function(httpsRes) {
		var data = "";

		httpsRes.on("data", function(d) {
			data += d.toString();
			
		});

本体が完全に配信された後に HTTP 接続が閉じられると、レスポンスが end イベントを発行します。HTTP ヘッダー Accept では、データのフォーマットとして JSON を指定しているので、レスポンスを解釈するには JSON.parse() を使用します。すべての照会結果 (つまりすべてのワークアイテム) は、oslc_cm:results フィールドに格納されます。この最初のエントリー (0 の番号が付けられたエントリー) をここでは使用しますが、他にもエントリーがあれば、そのどれを使用しても構いません。カテゴリーを識別するには、rtc_cm:filedAgainst 構造体に含まれている rdf:resource 値を使用します。

		httpsRes.on("end", function() {
			var categoryID =
			JSON.parse(data)["oslc_cm:results"][0]["rtc_cm:filedAgainst"]["rdf:resource"];

本番環境では、このすべての情報をデータベースに保管することになるでしょう。そしてユーザーはこれらの情報を使用するためにアカウントにログインすることになります (情報を取得することが目的ではありません。これらの情報をブラウザーに提供しても意味がないからです)。しかしながら、今取り組んでいるのは本番環境ではありません。このアプリケーションで目的としているのは、ユーザーにパラメーターを表示して、ユーザーがそれらのパラメーターを自分のアプリケーションで使用できるようにすることです。パラメーターの情報を提供するために、このアプリケーションはパラメーター用のクッキーを設定しています (パラメーター用のクッキーを JavaScript コードで読み取る方法については、w3schools.com Web サイトの「JavaScript Cookies」を参照してください)。

		res.setHeader("Set-Cookie",
				["serverID=" + serverID, "projectID=" + projectID,
					"categoryID=" + categoryID,
					"userID=" + req.body.uid]);
			res.send('<a href="index.html">Configuration retrieved</a>');
		});

ステップ 3. Track & Plan にアラートを送信する

最後のステップでは、REST インターフェースを使用して Track & Plan にアラートを送信するようにします。そのために使用する関数は、sendNotice(msg, conf) です。この関数の conf パラメーターは構成情報であり、/login で Web の「ページ」に対して送信されるクエリーとして提供されます。

以下のセグメントは、Track & Plan に送信されるレポートを示しています。Track & Plan のタイプの中にセキュリティー・アラートに相当するものはないので、セキュリティー・アラートに最も近い、task というタイプを選びました。dc:subject フィールドは task 用のタグです。このアプリケーションでそれに該当するのは、securityalert です。

	var report = {
		"dc:title": "Security violation",
		"dc:description": msg,
		"dc:type": "task",
		"dc:subject": "alert, security",
		"rtc_cm:filedAgainst": {
			"rdf:resource": conf.categoryID
		}
	};

HTTPS オプションの内容は一目瞭然です。この場合は新しいエンティティーを作成しているので、HTTP メソッドとして POST を使用します。auth フィールドには、Track & Plan の認証情報を含めます。通常、このフィールドの値は明示的にコーディングするか、パラメーターにするかのいずれかです (「Bluemix と MEAN スタックを使用して自動投稿 Facebook アプリケーションを作成する: パート 3」のステップ 5 を参照してください)。この例での値は、ユーザーが入力した構成項目から成るので、皆さんが結果を見られない私の Track & Plan ではなく、皆さんが結果を見られる皆さんの Track & Plan にアプリケーションのログを記録させることができます。

追加されている 2 つのヘッダー・フィールドは、リクエストのアプリケーション・タイプと、レスポンスで必要なフォーマットを記述するために、REST で使用されるものです。

	var httpsOpts = {
		hostname: 'hub.jazz.net',
		port: 443,
  		path: "/" + conf.serverID + "/oslc/contexts/" + conf.projectID + "/workitems",
  		method: 'POST',
  		auth: conf.ibm_uid + ":" + conf.ibm_passwd,		
  		headers: {
	  		Accept: "text/json",
  			"Content-Type": "application/x-oslc-cm-change-request+json"
  		}
	};

以下に記載するセクションが、最終的に HTTPS リクエストを Track & Plan に送信します。このリクエストに、コールバックはありません。というのも、私たちはレスポンスには関心がないからです。従って、新しく作成するワークアイテムの詳細だけを指定し、次の行で HTTP リクエストの本体に JSON フォーマットでレポートを書き込みます。そして最後の行で、リクエストを終了して送信します。

 	var httpsReq = https.request(httpsOpts);
	httpsReq.write(JSON.stringify(report));
	httpsReq.end();

不正な資格情報を入力して、テスト・アプリケーションにログインしてみてください。エラー・メッセージが表示されるはずです。

ログイン試行結果のスクリーン・キャプチャー
ログイン試行結果のスクリーン・キャプチャー

続いて、IBM Bluemix DevOps Services インターフェースで「TRACK & PLAN」をクリックして表示し、「INCOMING WORK (着信作業)」をクリックします。新規タスクのタイルをクリックすると、アラートの詳細が表示されます。

「INCOMING WORK (着信作業)」を示す画面のスクリーン・キャプチャー
「INCOMING WORK (着信作業)」を示す画面のスクリーン・キャプチャー

ステップ 4. ワークアイテムの所有者を自動的に割り当てる

ワークアイテムの所有者を自動的に割り当てられるようにすると便利な場合が多いです。そうすると、誰かがそのワークアイテムの担当者となり、ワークアイテムがオープンされた時点で、その人に (作成者と同じように) 通知が送られます。

  1. まず、ワークアイテムの所有者が設定されるフィールドを識別する必要があります。それには、新しいワークアイテムを作成し、そのワークアイテムを手作業で誰かに割り当てます。この作業を Track & Plan ユーザー・インターフェースから行うには、「unique_string @:<ユーザー名>」というタイトルを入力します。入力されたタイトルを示す画面のスクリーン・キャプチャー
    入力されたタイトルを示す画面のスクリーン・キャプチャー
  2. 次のステップでは、手作業でワークアイテムのリストを取得します。POST リクエストで使用したのと同じ URL をブラウザーに入力します。URL を入力するには、サブステップ 1 で使用したブラウザーを使用してください。このブラウザーでは、すでに認証が完了しているからです。ブラウザーは GET リクエストを生成して、オープンなワーク・チケットのリストを表示します。
    https://hub.jazz.net/<Server ID>/oslc/contexts/<Project ID>/workitems
  3. 作成したワークアイテムを見つけます (タイトルに固有のストリングが含まれていると、見分けやすくなります)。以下のスクリーン・キャプチャーを見るとわかるように、ワークアイテムの所有者に該当するフィールドは rtc_cm:ownedBy であり、その中に rdf:resource という属性があります。また、この属性の値は、単なるユーザー名でなく、ユーザー名とその他の情報からなる URL であることもわかります。この値をメモしておきます。ユーザー名とその他の情報からなる URL を示す画面のスクリーン・キャプチャー
    ユーザー名とその他の情報からなる URL を示す画面のスクリーン・キャプチャー
  4. コード内で、レポートに rtc_cm:ownedBy フィールドを含めるように変更を加えます (ライン 9 と 10 にそのコードを追加し、リソースを独自の値で置き換えます)。
    	var report = {
    		"dc:title": "Security violation",
    		"dc:description": msg,
    		"dc:type": "task",
    		"dc:subject": "alert, security",
    		"rtc_cm:filedAgainst": {
    			"rdf:resource": conf.categoryID
    		},
    		"rtc_cm:ownedBy": {
    			"rdf:resource": "https://hub.jazz.net/jts19/users/oripomerantz"			
    		}
    	};
  5. 新規アイテムに適切な所有者が割り当てられていることを確認します。割り当てられた所有者は、数分で e-メールを受け取ります。
セキュリティー違反に関するメッセージを示す画面のスクリーン・キャプチャー
セキュリティー違反に関するメッセージを示す画面のスクリーン・キャプチャー

まとめ

これで、皆さんのアプリケーションから Bluemix Track & Plan にセキュリティー・アラートを送信できるようになったはずです。このツールは、認証失敗 (ユーザーがログオンに失敗した場合) や許可違反 (ユーザーが自分に許可されていない操作を実行しようとした場合) などにも使用することができます。ステップ 4 の手法を適用すれば、優先順位や問題解決の期限などといった他の関連する情報のフィールドも自動的に指定することができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=セキュリティ
ArticleID=1027323
ArticleTitle=セキュリティー・アラートを IBM DevOps Services の Track & Plan で管理する
publish-date=02252016