Как экспортировать активы Центра безопасности GCP в облачное хранилище с помощью облачной функции?
У меня есть облачная функция, вызывающая SCC list_assets и конвертирующая вывод с разбивкой на страницы в список (для получения всех результатов). Однако, поскольку у меня довольно много ресурсов в дереве организации, на выборку уходит много времени, а время ожидания облачной функции истекает (максимальный тайм-аут 540 секунд).
asset_iterator = security_client.list_assets(org_name)
asset_fetch_all=list(asset_iterator)
Я попытался экспортировать через WebUI, все работает нормально (около 5 минут). Есть ли способ экспортировать активы из SCC напрямую в корзину облачного хранилища с помощью API?
2 ответа
Попробуйте что-то вроде этого: мы используем его для загрузки результатов поиска в корзину. Убедитесь, что вы предоставили SP, чтобы функция запускала правильные разрешения для корзины.
def test_list_medium_findings(source_name):
# [START list_findings_at_a_time]
from google.cloud import securitycenter
from google.cloud import storage
# Create a new client.
client = securitycenter.SecurityCenterClient()
#Set query paramaters
organization_id = "11112222333344444"
org_name = "organizations/{org_id}".format(org_id=organization_id)
all_sources = "{org_name}/sources/-".format(org_name=org_name)
#Query Security Command Center
finding_result_iterator = client.list_findings(all_sources,filter_=YourFilter)
#Set output file settings
bucket="YourBucketName"
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket)
output_file_name = "YourFileName"
my_file = bucket.blob(output_file_name)
with open('/tmp/data.txt', 'w') as file:
for i, finding_result in enumerate(finding_result_iterator):
file.write(
"{}: name: {} resource: {}".format(
i, finding_result.finding.name, finding_result.finding.resource_name
)
)
#Upload to bucket
my_file.upload_from_filename("/tmp/data.txt")
Я разрабатываю то же самое на Python для экспорта в BQ. Искать в BigQuery проще, чем в файле. Код очень похож на хранилище GCS. Вот мой рабочий код с BQ
import os
from google.cloud import asset_v1
from google.cloud.asset_v1.proto import asset_service_pb2
from google.cloud.asset_v1 import enums
def GCF_ASSET_TO_BQ(request):
client = asset_v1.AssetServiceClient()
parent = 'organizations/{}'.format(os.getenv('ORGANIZATION_ID'))
output_config = asset_service_pb2.OutputConfig()
output_config.bigquery_destination.dataset = 'projects/{}/datasets/{}'.format(os.getenv('PROJECT_ID'),os.getenv('DATASET'))
content_type = enums.ContentType.RESOURCE
output_config.bigquery_destination.table = 'asset_export'
output_config.bigquery_destination.force = True
response = client.export_assets(parent, output_config, content_type=content_type)
# For waiting the finish
# response.result()
# Do stuff after export
return "done", 200
if __name__ == "__main__":
GCF_ASSET_TO_BQ('')
Как видите, в Env Var есть несколько значений (OrganizationID, projectId и Dataset). Для экспорта в облачное хранилище вам необходимо изменить определениеoutput_config
нравится
output_config = asset_service_pb2.OutputConfig()
output_config.gcs_destination.uri = 'gs://path/to/file'
У вас есть пример на других языках здесь