2

我正在使用Microsoft Azure Security Center (ASC) Management Client Library获取订阅的安全分数。库中的所有操作都表明

您不应直接实例化此类,而应创建一个 Client 实例,该实例将为您创建它并将其附加为属性。

因此,我正在创建一个具有以下规范的SecurityCenter客户端:

SecurityCenter(credentials, subscription_id, asc_location, base_url=None)

但是,在我看来,asc_location正确获取信息的唯一方法是使用 SecurityCenter 客户端来获取它......规范与上面的引用相同,You should not instantiate.... 所以我无法创建客户端,因为我需要 ASC 位置来执行此操作,并且我需要创建客户端来获取 ASC 位置。

文档提到

ASC 存储订阅数据的位置。可以从获取位置检索

谷歌搜索和搜索这个“获取位置”的 Python SDK 文档没有给我任何东西(除了 REST API)。我错过了什么吗?我们是否应该像此 SO 帖子或SDK 存储库中的此 GitHub 问题那样对位置进行硬编码?

4

3 回答 3

1

正如官方 API 参考列表位置所示:

特定订阅的负责 ASC 的位置(主区域)。对于每个订阅,只有一个负责的位置。

它不会改变,因此如果您已经知道asc_location订阅的价值,则可以硬编码此值。

但是每个订阅可能有不同的 asc_location 值(我的 2 个 Azure 订阅有不同的 asc_location 值)。因此,如果您有很多 Azure 订阅,您可以asc_location通过 API 查询(据我所知,这是我能找到的唯一方法),然后使用 SDK 获取安全分数,请尝试以下代码:

from azure.mgmt.security import SecurityCenter
from azure.identity import ClientSecretCredential
import requests
from requests.api import head, request 

TENANT_ID = ''
CLIENT = ''
KEY = ''
subscription_id= ''
getLocationsURL = "https://management.azure.com/subscriptions/"+subscription_id+"/providers/Microsoft.Security/locations?api-version=2015-06-01-preview"


credentials = ClientSecretCredential(
    client_id = CLIENT,
    client_secret = KEY,
    tenant_id = TENANT_ID
)

#request for asc_location for a subscription
azure_access_token = credentials.get_token('https://management.azure.com/.default')
r = requests.get(getLocationsURL,headers={"Authorization":"Bearer " +  azure_access_token.token}).json()
location = r['value'][0]['name']
print("location:" + location)

client = SecurityCenter(credentials, subscription_id, asc_location=location)
for score in client.secure_scores.list():
    print(score)

结果: 在此处输入图像描述 在此处输入图像描述

于 2021-01-08T04:37:32.030 回答
0

我最近遇到了这个问题。

根据我的观察,我可以使用订阅下的任何位置来启动 SecurityCenter 客户端。然后稍后client.locations.list()给了我一个 ASC 位置。

# Any of SubscriptionClient.subscriptions.list_locations will do
location = 'eastasia'

client = SecurityCenter(
            credential, my_subscription_id,
            asc_location=location
        )

data = client.locations.list().next().as_dict()
pprint(f"Asc location: {data}")

就我而言,westcentralus无论我的输入是eastasia.

请注意,如果您使用 get 而不是 list,则会出现异常

data = client.locations.get().as_dict()
pprint(f"Asc location: {data}")
# azure.core.exceptions.ResourceNotFoundError: (ResourceNotFound) Could not find location 'eastasia'

所以我做的有点尴尬

  1. 使用我的订阅下的位置创建 SecurityCenter 客户端
  2. client.locations.list() 获取 ASC 位置
  3. 使用检索到的 ASC 位置再次创建 SecurityCenter 客户端。
于 2021-05-24T11:15:35.860 回答
0

我最近也遇到了这个问题,最初是根据@stanley-gong的回答做了一些事情。但感觉有点尴尬,我查看了 Azure CLI 是如何做到的。我注意到他们硬编码了一个值asc_location

def _cf_security(cli_ctx, **_):
    from azure.cli.core.commands.client_factory import get_mgmt_service_client
    from azure.mgmt.security import SecurityCenter


    return get_mgmt_service_client(cli_ctx, SecurityCenter, asc_location="centralus")

以及提供更多上下文的 PR 实施:

我们的任务是从客户端的初始化中删除 asc_location。目前我们对用户隐藏了 asc_location 的使用。centralus 是一个任意值,是我们最常见的区域。

所以......也许双重初始化客户端或拉订阅的主区域的舞蹈并没有给我们带来任何好处?

于 2022-02-24T14:38:21.850 回答