始まり
Organizations移行に伴い、セキュリティ対応状況を全社範囲で管理することが現実的になりました。
基準となるもの(AWS FSBP)が存在しているものの、今までほぼセキュリティ対応していない状態から全社範囲で対応するにはハードルが高い、最終的にSecurityHub CSPMデータを利用し、独自システム構築することで対応しましたので、経緯をこちらに記載します。
背景
- セキュリティ状況が異なる100以上のAWSアカウントを統制管理する必要がある
母数がある分、アカウントベースでの管理が非現実的で、統制管理が必要になります。 - 案件によってセキュリティ対応可能リソースが大きく変わる
SecurityHub CSPMのOrganizations下運用はセキュリティ基準が1つの場合が多いですが、社内事情によって全アカウント最低限対応とさらにセキュリティを強化したい2つのニーズに対応するセキュリティ基準が必要にある一方、SecurityHub CSPM純正機能だけでは対応が難しい部分があって、独自システム構築の需要が発生しました。
なぜ個別実装が必要
アカウントによって保守担当部署が異なり、最低限のセキュリティ基準を守ってほしい要望があれば、高めに設定してほしいアカウントが両方あって、後述のSecurityHub CSPMポリシーを活用して対応でいます。
運用によって特定セキュリティ基準を設定しているアカウントのセキュリティ状況を定期的に取得する必要がありますが、SecurityHub CSPMはSecurityHub CSPMポリシー・OUベースでの表示をサポートしていないため、別途データを集めて再表示する必要があります。
また非エンジニアの管理メンバーがセキュリティスコアを確認したい場合、都度コンソールアクセスが必要、複数案件担当している場合アカウント切り替えしないと、アカウントごとのスコアを把握できないなど実用の面で問題があるため、一括で全アカウントのセキュリティ状況の表示でき、特定OUのアカウントのみを表示できるダッシュボードの需要があります。
コンセプト
- OrganizationsとSecurityHub CSPMのAPIから最新の検出情報を取得、ダッシュボードサイト表示向けにデータを加工、永続化
- CloudFront+S3+API Gatewayでフロントデータ表示用ダッシュボードを構築、日常のセキュリティ状況確認は基本ダッシュボード、詳細情報確認時のみAWSを確認
構成図
詳しい解説
異なる基準のSecurityHub設定
社内基準ではありますが、FSBPのCriticalと一部Highの項目を全アカウントに適用するベーシックスタンダード、
重点PJ向けに、さらに厳選したHighとMedium項目を追加したものをアドバンスドスタンダード2種類で運用しています。
Organizations環境のSecurityHubはOU単位でSecurityHubを同じ設定に適用させることができます。
適用したいスタンダード(中身の項目も個別設定可能)、適用対象のOU・AWSアカウントは自由で設定できます。
さらにSecurityHubのホームリージョン機能を利用することで、例えば全初期有効リージョンに対して一括設定することが可能になります。
OU設計
ポリシーに合わせて、適用したい基準のアカウントを1つのOUに配置することで、特定スタンダード対象のアカウントをまとめ取得することが可能になります。
※ポリシーの干渉を避けるため、1つのOUに1つのポリシーしか適用できないため、新しいセキュリティスタンダードを増やしたい場合はそれに対応するOUを用意するか、アカウント単位でポリシーを設定などの対応が必要です。

AWSデータ取得について
キーとなるのは以下2つのAWS API
Organizations.list_accounts_for_parent(OUに所属している全アカウント情報を取得)
以下のパラメータを設定しています。
'ParentId': ou_id
リクエストパラメータは簡単なので、特に補足する内容はないが、一応アカウント情報はこちらのみで取得しているので、IDだけでなく、ダッシュボードサイト表示用にアカウント名も取得しています。
*** SecurityHub.get_findings(SecurityHubの検出情報を取得)
以下のパラメータを設定しています。
'Filters': {
"AwsAccountId": [
{
"Value": account_id, "Comparison": "EQUALS"
}
],
"ComplianceStatus": [
{
"Value": "FAILED", "Comparison": "EQUALS"
}
],
"ProductName": [
{
"Value": "Security Hub", "Comparison": "EQUALS"
}
],
"WorkflowStatus": [
{
"Value": "NEW", "Comparison": "EQUALS"
},
{
"Value": "NOTIFIED", "Comparison": "EQUALS"
}
],
"RecordState": [
{
"Value": "ACTIVE", "Comparison": "EQUALS"
}
],
"UpdatedAt": [
{
"DateRange": {
"Value": 1,
"Unit": "DAYS",
}
}
]
}
各パラメータの役割について
| パラメータ | 役割 |
|---|---|
| AwsAccountId | 取得対象アカウントID |
| ComplianceStatus | Ngで検出した項目のみを取得 |
| ProductName | Security Hubが検出した内容に限定する |
| WorkflowStatus | 初回検出時と一度抑制したものを後から戻る場合両方が対象 |
| RecordState | 廃止になって項目を除外するため、検出結果が有効のものだけを取得 |
| UpdatedAt | 更新日が1日以内のものだけを取得、検出結果は日次で行うため、処理時の最新情報のみを取得 |
ダッシュボードサイト
※フロントは別実装になっているため、この記事では詳細を記載しません。

監視対象アカウント数、検出上位のアカウント数などを可視化
改善点
複数スタンダードの対応
FSBPに加え、CIS、PCI DSSなど他の基準での対応状況の対応も予定しています。
継続的のデータ取得
現状は最新1日分のデータのみ、DBに永続化保守していますが、今後一定期間のデータを保守できる対応を想定しています。
参考資料
AWS Organizations API
https://docs.aws.amazon.com/boto3/latest/reference/services/organizations/client/list_accounts_for_parent.html
SecurityHub CSPM API
https://docs.aws.amazon.com/boto3/latest/reference/services/securityhub/client/get_findings.html
AWS Foundational Security Best Practices (FSBP)
https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/fsbp-standard.html
SecurityHub CSPM ポリシー
https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/configuration-policies-overview.html
SecurityHub CSPM Findings Workflow status
https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/findings-workflow-status.html




