SecurityHubのAPIを使って、AWSの画面に出ている情報を収集しようとしてみた。
やりたいこと
AWS Security Hubのセキュリティ基準から確認できる、以下の情報を取得したい。
(1) 各ベンチマークの各項目のステータス(成功とか失敗とか)
以下の「ステータス」とか「タイトル」とか。
(2) 各ベンチマークの各項目の、リソースごとのステータス
各項目の詳細画面では、以下のように項目に関係のあるリソースとリソースごとのステータスが表示されるので、それを取得したい。
まずは何も考えずに情報取得
言語はC#で、AWS SDKのSecurityHubを使用する。
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);
取得した結果が以下。
ちょっと多くないですか・・・・?
ベストプラクティスが113項目、CISが43項目だから、全部で156項目だと思っていたけど。。。。
いったい何が多いのか
データの中身を追ってみたところ、以下二つが原因っぽい。
※ ちゃんとSecurityHubのドキュメントを事前に読めばすぐわかったことかもしれない。。。
(1) レコードの状態が「ARCHIVE」のものが混じっている。
どうやら過去のステータスを内部的に保持している様子。確かによくよく見ると、各項目に「更新日時」みたいなものがある。
しかしARCHIVEのものを除外した結果、画面に表示されているものがなくなる、みたいなことは避けたい。。。
(2) 1つの項目に複数のリソースの結果がある場合、GetFindingsの結果(インスタンス)が別になる
レスポンスの中身を読むと、1項目1リソースで1オブジェクトの様子。なので、これらを解析すれば求めるものが得られるはず。
ただ、レスポンス内のResourcesは、名前の通り複数形なので、将来同じ結果はここにまとめるなんて構想があるのかも・・・?
条件を決めてフィルタする
とりあえず調査結果から、レコードの状態がACTIVEに等しいものだけ取得してみる。
すると、245あった結果が215になった。少しだけ減ったけど、もうここから考えるのもめんどいからいったん表示してみる。
コンソールに出力する
出力用に適当なモデルを作成し、取得した情報をコンソールに出力させてみた。
どうやら、取れた様子。よかったよかった。
項目の説明とか対処方法も取得できているので、出そうと思えば出せる。
ほかのサービス(Inspector)と連携していれば、そこの情報も取得できそう・・・
以上。