Gerir intervalos de endereços IP utilizando a API

Aplica-se a: Microsoft Cloud App Security

Importante

Os nomes dos produtos de proteção contra ameaças da Microsoft estão a mudar. Leia mais sobre esta e outras atualizações aqui. Vamos atualizar nomes em produtos e nos documentos num futuro próximo.

Pode utilizar as APIs de Enriquecimento de Dados para gerir os intervalos de endereços IP.

Para utilizar o script de gamas de endereços IP de gestão

  1. Crie um ficheiro CSV com os seguintes campos esperados: Nome, IP_Address_Ranges, Categoria, Tag (id) e Override_ISP_Name.

  2. Atualize os valores para as seguintes variáveis de script: OPTION_DELETE_ENABLED, IP_RANGES_BASE_URL, CSV_ABSOLUTE_PATH, YOUR_TOKEN

    Importante

    Se definir OPTION_DELETE_ENABLED à True, quaisquer intervalos de endereço IP definidos no seu inquilino mas que não existam nos ficheiros CSV serão eliminados do arrendatário pelo script. Se utilizar esta opção, certifique-se de que o ficheiro CSV define todas as gamas de endereços IP que deseja no seu inquilino.

  3. Executar o script para criar novos registos e atualizar as regras existentes com o nome correspondente.

Solicitar parâmetros corporais

  • "Filtros": Filtrar objetos com todos os filtros de pesquisa para o pedido, consulte os filtros de Enriquecimento de Dados para obter mais informações. Para evitar que os seus pedidos sejam estrangulados, certifique-se de que inclui uma limitação na sua consulta.
  • "Limite": Inteiro. No modo de digitalização, entre 500 e 5000 (predefinição a 500). Controla o número de iterações utilizadas para digitalizar todos os dados.

Parâmetros de resposta

  • "Dados": os dados devolvidos. Irá conter até "limitar" o número de registos de cada iteração. Se houver mais registos a serem retirados (hasNext=true), os últimos registos serão retirados para garantir que todos os dados sejam listados apenas uma vez.
  • "hasNext": Boolean. Denota se é necessária outra iteração dos dados.
  • "NextQueryFilters": Se for necessária outra iteração, contém a consulta JSON consecutiva a ser executada. Utilize isto como parâmetro "filtros" no próximo pedido.

O exemplo python a seguir utiliza o conteúdo de um ficheiro CSV para gerir (criar, atualizar ou eliminar) intervalos de endereços IP no seu ambiente de Segurança da Aplicação cloud.

import csv
import requests
import json

OPTION_DELETE_ENABLED = False
IP_RANGES_BASE_URL = 'https://<tenant_id>.<tenant_region>.contoso.com/api/v1/subnet/'
IP_RANGES_UPDATE_SUFFIX = 'update_rule/'
IP_RANGES_CREATE_SUFFIX = 'create_rule/'
CSV_ABSOLUTE_PATH = 'rules.csv'
YOUR_TOKEN = '<your_token>'
HEADERS = {
  'Authorization': 'Token {}'.format(YOUR_TOKEN),
}

# Get all records.
def get_records():
  list_request_data = {
    # Optionally, edit to match your filters
    'filters': {},
    "skip": 0,
    "limit": 20
  }
  records = []
  has_next = True
  while has_next:
    content = json.loads(requests.post(IP_RANGES_BASE_URL, json=list_request_data, headers=HEADERS).content)
    response_data = content.get('data', [])
    records += response_data
    has_next = content.get('hasNext', False)
    list_request_data["skip"] += len(response_data)
  return records

# Rule fields are compared to the CSV row.
def rule_matching(record, ip_address_ranges, category, tag, isp_name, ):
  rule_exists_conditions = [sorted([subnet.get('originalString', False) for subnet in record.get('subnets', [])]) !=
                            sorted(ip_address_ranges.split(' ')),
                            str(record.get('category', False)) != category,
                            len(record.get('tags', [])) != len(tag.split(' ')) and
                            (len(record.get('tags', [])) != 0 and len(tag) == 1),
                            bool(record.get('organization', False)) != bool(isp_name) or
                            (record.get('organization', False) is not None and not isp_name)]
  if any(rule_exists_conditions):
    return False
  for tag in record.get('tags', []):
    tag_id = tag.get('id')
    if tag_id and tag_id not in tag.split(' '):
      return False
  return True

def create_update_rule(name, ip_address_ranges, category, tag, isp_name, records, request_data):
  for record in records:
    # Records are compared by name(unique).
    # This can be changed to id (to update the name), it will include adding id to the CSV and changing row shape.
    if record["name"] == name:
      # request_data["_tid"] = record["_tid"]
      if not rule_matching(record, ip_address_ranges, category, tag, isp_name):
        # Update existing rule
        json.loads(
          requests.post(f"{IP_RANGES_BASE_URL}{record['_id']}/{IP_RANGES_UPDATE_SUFFIX}", json=request_data, headers=HEADERS).content)
        return record
      else:
        # The exact same rule exists. no need for change.
        return record
  # Create new rule.
  requests.post(f"{IP_RANGES_BASE_URL}{IP_RANGES_CREATE_SUFFIX}", json=request_data, headers=HEADERS)

# Request data creation.
def create_request_data(name, ip_address_ranges, category, tag, isp_name):
  request_data = {"name": name, "subnets": ip_address_ranges.split(' '), "category": category,
                  "tags": tag.split(' ') if tag else ''}
  if isp_name:
    request_data["overrideOrganization"] = True
    request_data["organization"] = isp_name
  return request_data

def main():
  # CSV fields are: Name,IP_Address_Ranges,Category,Tag(id),Override_ISP_Name
  # Multiple values (eg: multiple subnets) will be space-separated. (eg: value1 value2)
  records = get_records()
  with open(CSV_ABSOLUTE_PATH, newline='\n') as your_file:
    reader = csv.reader(your_file, delimiter=',')
    for row in reader:
      name, ip_address_ranges, category, tag, isp_name = row
      request_data = create_request_data(name, ip_address_ranges, category, tag, isp_name)
      if records:
        # Existing records were retrieved from your tenant
        record = create_update_rule(name, ip_address_ranges, category, tag, isp_name, records, request_data)
        record_id = record['_id']
      else:
        # No existing records were retrieved from your tenant
        record_id = json.loads(requests.post(f"{IP_RANGES_BASE_URL}{IP_RANGES_CREATE_SUFFIX}", json=request_data, headers=HEADERS).content)
      if OPTION_DELETE_ENABLED:
        # Remove CSV file record from tenant records.
        if record_id:
          for record in records:
            if record['_id'] == record_id:
              records.remove(record)
  if OPTION_DELETE_ENABLED:
    # Delete remaining tenant records, i.e. records that aren't in the CSV file.
    for record in records:
      requests.delete(f"{IP_RANGES_BASE_URL}{record['_id']}/", headers=HEADERS)
  
if __name__ == '__main__':
  main()

Passos seguintes

Se tiver algum problema, estamos aqui para ajudar. Para obter assistência ou suporte para o seu problema de produto, abra um bilhete de apoio.