2
0

More than 1 year has passed since last update.

SecurityHubのAPIでセキュリティ情報を取得してみる

Posted at

SecurityHubのAPIを使って、AWSの画面に出ている情報を収集しようとしてみた。

やりたいこと

AWS Security Hubのセキュリティ基準から確認できる、以下の情報を取得したい。
(1) 各ベンチマークの各項目のステータス(成功とか失敗とか)
以下の「ステータス」とか「タイトル」とか。
image.png
(2) 各ベンチマークの各項目の、リソースごとのステータス
各項目の詳細画面では、以下のように項目に関係のあるリソースとリソースごとのステータスが表示されるので、それを取得したい。
image.png

まずは何も考えずに情報取得

言語はC#で、AWS SDKのSecurityHubを使用する。
image.png
GetFindingsメソッドで情報を取得する。nextTokenがある場合は、すべて情報を取得するまでループすることも忘れずに。
※ APIの呼び出しにはSecurityHubのClientを適切に生成する必要がある。

string nextToken = null;

do
  {
    var request = new GetFindingsRequest();
    request.MaxResults = 100;
    request.NextToken = nextToken;

    var response = securityHubClient.GetFindingsAsync(request).Result;

    var data = response.Findings;
    SecurityFindings.AddRange(data);

    nextToken = response.NextToken;
    request.NextToken = nextToken;

    response = securityHubClient.GetFindingsAsync(request).Result;

  } while (nextToken != null);

取得した結果が以下。
image.png
ちょっと多くないですか・・・・?
ベストプラクティスが113項目、CISが43項目だから、全部で156項目だと思っていたけど。。。。

いったい何が多いのか

データの中身を追ってみたところ、以下二つが原因っぽい。
※ ちゃんとSecurityHubのドキュメントを事前に読めばすぐわかったことかもしれない。。。

(1) レコードの状態が「ARCHIVE」のものが混じっている。
どうやら過去のステータスを内部的に保持している様子。確かによくよく見ると、各項目に「更新日時」みたいなものがある。
しかしARCHIVEのものを除外した結果、画面に表示されているものがなくなる、みたいなことは避けたい。。。

(2) 1つの項目に複数のリソースの結果がある場合、GetFindingsの結果(インスタンス)が別になる
レスポンスの中身を読むと、1項目1リソースで1オブジェクトの様子。なので、これらを解析すれば求めるものが得られるはず。
ただ、レスポンス内のResourcesは、名前の通り複数形なので、将来同じ結果はここにまとめるなんて構想があるのかも・・・?

条件を決めてフィルタする

とりあえず調査結果から、レコードの状態がACTIVEに等しいものだけ取得してみる。
すると、245あった結果が215になった。少しだけ減ったけど、もうここから考えるのもめんどいからいったん表示してみる。

コンソールに出力する

出力用に適当なモデルを作成し、取得した情報をコンソールに出力させてみた。

image.png

どうやら、取れた様子。よかったよかった。

項目の説明とか対処方法も取得できているので、出そうと思えば出せる。

ほかのサービス(Inspector)と連携していれば、そこの情報も取得できそう・・・

以上。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0