boto3でSecurity Hubを有効化する際に統合コントロール結果をオフにしてみた

boto3で統合コントロール結果をオフの状態でAWS Security Hubを有効化する方法を検証しました
2023.03.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

みなさん、AWSのセキュリティチェックしてますか?(挨拶

今回は、先日以下の記事のように統合コントロールビューと統合コントロール結果に対応したAWS Security Hubについて、boto3で有効化する際にデフォルトの設定から変更し、統合コントロール結果をオフにする方法を検証したのでまとめます。

背景

今回のアップデートでは、新しく統合コントロール結果という、複数のセキュリティチェックのスタンダード(基準)にまたがるコントロールの結果を1つにまとめる機能が実装され、これに伴い、新しいAWS Security Hubはデフォルトでこの機能が有効になるという変更がありました。

既存のAWS Security Hubの環境では、引き続き統合コントロール結果の機能がオフであり、このオンオフで検知したFindingsのフォーマットが変わることから、その動作の違いに注意が必要です。

なので、既存環境と同じ状態でセットアップがしたいと思い、これをboto3で実現する方法を検証することにしました。

やってみた

設定方法はboto3のドキュメントに記載があります。

enable_security_hub()のパラメータとして、ControlFindingGenerator='STANDARD_CONTROL'を指定すればよさそうです。デフォルトでは'SECURITY_CONTROL'になるとのことで、こちらでも仕様どおりですね。

ではまず、私は既存の環境があるのでSecurity Hubを無効化しておき、CloudShellを立ち上げます。

準備しつつboto3のバージョンを確認します。'1.26.49'ですね。describe_hub()してエラーが出ることから無効化されていることも確認しました。

[cloudshell-user@ip-10-4-91-167 ~]$ python3
Python 3.7.16 (default, Dec 15 2022, 23:24:54) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>> boto3.__version__
'1.26.49'
>>> sh = boto3.client('securityhub')
>>> sh.describe_hub()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/cloudshell-user/.local/lib/python3.7/site-packages/botocore/client.py", line 530, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/cloudshell-user/.local/lib/python3.7/site-packages/botocore/client.py", line 960, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.InvalidAccessException: An error occurred (InvalidAccessException) when calling the DescribeHub operation: Account 999999999999 is not subscribed to AWS Security Hub

最初はそのまま有効化してみましょう。スタンダードは有効化するためEnableDefaultStandards=Trueを指定しています。

>>> sh.enable_security_hub(EnableDefaultStandards=True)
{'ResponseMetadata': {'RequestId': 'd7169cd8-cf17-4d40-81b2-61e75acdd05d', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 20 Mar 2023 12:50:37 GMT', 'content-type': 'application/json', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': 'd7169cd8-cf17-4d40-81b2-61e75acdd05d', 'access-control-allow-origin': '*', 'access-control-allow-headers': 'Authorization,Date,X-Amz-Date,X-Amz-Security-Token,X-Amz-Target,content-type,x-amz-content-sha256,x-amz-user-agent,x-amzn-platform-id,x-amzn-trace-id', 'x-amz-apigw-id': 'CFJ4mHCRtjMF8HA=', 'access-control-allow-methods': 'GET,POST,OPTIONS,PUT,PATCH,DELETE', 'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date', 'x-amzn-trace-id': 'Root=1-6418569d-5b1885ab7ec8faea1f8dc438', 'access-control-max-age': '86400'}, 'RetryAttempts': 0}}
>>> sh.describe_hub()
{'ResponseMetadata': {'RequestId': '170db026-af21-455f-b9b0-fcc4af4ee897', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 20 Mar 2023 12:51:29 GMT', 'content-type': 'application/json', 'content-length': '185', 'connection': 'keep-alive', 'x-amzn-requestid': '170db026-af21-455f-b9b0-fcc4af4ee897', 'access-control-allow-origin': '*', 'access-control-allow-headers': 'Authorization,Date,X-Amz-Date,X-Amz-Security-Token,X-Amz-Target,content-type,x-amz-content-sha256,x-amz-user-agent,x-amzn-platform-id,x-amzn-trace-id', 'x-amz-apigw-id': 'CFKAqGERNjMFplg=', 'access-control-allow-methods': 'GET,POST,OPTIONS,PUT,PATCH,DELETE', 'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date', 'x-amzn-trace-id': 'Root=1-641856d0-4715a0077754527f53835f38', 'access-control-max-age': '86400'}, 'RetryAttempts': 0}, 'HubArn': 'arn:aws:securityhub:ap-northeast-1:999999999999:hub/default', 'SubscribedAt': '2023-03-20T12:50:37.356Z', 'AutoEnableControls': True, 'ControlFindingGenerator': 'SECURITY_CONTROL'}

'ControlFindingGenerator': 'SECURITY_CONTROL'となっており、統合コントロール結果が有効であることが確認できました。画面上でも以下のようにオンになっていました。

では無効化して、今度はControlFindingGenerator='STANDARD_CONTROL'を指定して有効化します。

>>> sh.disable_security_hub()
{'ResponseMetadata': {'RequestId': 'fd6d5602-fbb5-4379-8372-4cdc41ea6330', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 20 Mar 2023 12:52:00 GMT', 'content-type': 'application/json', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': 'fd6d5602-fbb5-4379-8372-4cdc41ea6330', 'access-control-allow-origin': '*', 'access-control-allow-headers': 'Authorization,Date,X-Amz-Date,X-Amz-Security-Token,X-Amz-Target,content-type,x-amz-content-sha256,x-amz-user-agent,x-amzn-platform-id,x-amzn-trace-id', 'x-amz-apigw-id': 'CFKFlGuItjMF9mw=', 'access-control-allow-methods': 'GET,POST,OPTIONS,PUT,PATCH,DELETE', 'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date', 'x-amzn-trace-id': 'Root=1-641856f0-3e2bcf3a25d21c3626c57deb', 'access-control-max-age': '86400'}, 'RetryAttempts': 0}}
>>> sh.describe_hub()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/cloudshell-user/.local/lib/python3.7/site-packages/botocore/client.py", line 530, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/cloudshell-user/.local/lib/python3.7/site-packages/botocore/client.py", line 960, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.InvalidAccessException: An error occurred (InvalidAccessException) when calling the DescribeHub operation: Account 999999999999 is not subscribed to AWS Security Hub
>>> sh.enable_security_hub(EnableDefaultStandards=True, ControlFindingGenerator='STANDARD_CONTROL')
{'ResponseMetadata': {'RequestId': '3d39e190-63d1-4f10-9d76-55a46437ebf8', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 20 Mar 2023 12:53:30 GMT', 'content-type': 'application/json', 'content-length': '2', 'connection': 'keep-alive', 'x-amzn-requestid': '3d39e190-63d1-4f10-9d76-55a46437ebf8', 'access-control-allow-origin': '*', 'access-control-allow-headers': 'Authorization,Date,X-Amz-Date,X-Amz-Security-Token,X-Amz-Target,content-type,x-amz-content-sha256,x-amz-user-agent,x-amzn-platform-id,x-amzn-trace-id', 'x-amz-apigw-id': 'CFKToHL9NjMFsPw=', 'access-control-allow-methods': 'GET,POST,OPTIONS,PUT,PATCH,DELETE', 'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date', 'x-amzn-trace-id': 'Root=1-6418574a-1f15c98e30d720b2150015b9', 'access-control-max-age': '86400'}, 'RetryAttempts': 0}}
>>> sh.describe_hub()
{'ResponseMetadata': {'RequestId': 'ee14e86b-6a22-4aae-a4d0-2a9e4838fb20', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 20 Mar 2023 12:54:18 GMT', 'content-type': 'application/json', 'content-length': '185', 'connection': 'keep-alive', 'x-amzn-requestid': 'ee14e86b-6a22-4aae-a4d0-2a9e4838fb20', 'access-control-allow-origin': '*', 'access-control-allow-headers': 'Authorization,Date,X-Amz-Date,X-Amz-Security-Token,X-Amz-Target,content-type,x-amz-content-sha256,x-amz-user-agent,x-amzn-platform-id,x-amzn-trace-id', 'x-amz-apigw-id': 'CFKbKH2yNjMFz-w=', 'access-control-allow-methods': 'GET,POST,OPTIONS,PUT,PATCH,DELETE', 'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amz-apigw-id,date', 'x-amzn-trace-id': 'Root=1-6418577a-70d0bb0872c37dce490e87f4', 'access-control-max-age': '86400'}, 'RetryAttempts': 0}, 'HubArn': 'arn:aws:securityhub:ap-northeast-1:999999999999:hub/default', 'SubscribedAt': '2023-03-20T12:53:30.430Z', 'AutoEnableControls': True, 'ControlFindingGenerator': 'STANDARD_CONTROL'}

'ControlFindingGenerator': 'STANDARD_CONTROL'となり、従来どおりの状態になりました。画面上でも以下のようにオフに見えます。

まとめ

boto3で統合コントロール結果をオフの状態でAWS Security Hubを有効化する方法を検証しました。新しいASFFを利用できる場合には新しいデフォルトの設定で問題ありませんが、既存の仕組みに影響がある場合などは、このような方法を利用しましょう。