데이터 보강 API를 사용하여 IP 주소 범위를 관리할 수 있습니다.
IP 주소 범위 관리 스크립트를 사용하려면
이름, IP_Address_Ranges, 범주, 태그(id) 및 Override_ISP_Name 예상 필드를 사용하여 CSV 파일을 만듭니다.
다음은 CSV 파일 콘텐츠의 예입니다.name, ip_address_ranges, category, tag(id), isp_name Test 1,200.200.200.200/24 201.201.201.201/24,1, , Test 2,1.1.1.5/32 31.31.31.4/24,1,000000290000000000000000 0000002d0000000000000000 , Test 3,2.2.2.2/32,1,0000002d0000000000000000, Test 4,5.6.5.4/32,2,,test
OPTION_DELETE_ENABLED, IP_RANGES_BASE_URL, CSV_ABSOLUTE_PATH, YOUR_TOKEN 스크립트 변수의 값을 업데이트합니다.
중요
OPTION_DELETE_ENABLEDTrue로 설정하면 테넌트에서 정의되었지만 CSV 파일에 없는 IP 주소 범위는 스크립트에 의해 테넌트에서 삭제됩니다. 이 옵션을 사용하는 경우 CSV 파일이 테넌트에서 원하는 모든 IP 주소 범위를 정의해야 합니다.
스크립트를 실행하여 새 레코드를 만들고 일치하는 이름으로 기존 규칙을 업데이트합니다.
요청 본문 매개 변수
- "필터": 요청에 대한 모든 검색 필터를 사용하여 개체를 필터링합니다. 자세한 내용은 데이터 보강 필터를 참조하세요 . 요청이 제한되지 않도록 하려면 쿼리에 제한을 포함해야 합니다.
- "limit": 정수입니다. 스캔 모드에서 500에서 5000 사이(기본값은 500)입니다. 모든 데이터를 검사하는 데 사용되는 반복 횟수를 제어합니다.
응답 매개 변수
- "data": 반환된 데이터입니다. 각 반복마다 최대 "제한" 수의 레코드를 포함합니다. 끌어올 레코드가 더 많은 경우(hasNext=true) 모든 데이터가 한 번만 나열되도록 마지막 몇 레코드가 삭제됩니다.
- "hasNext": 부울입니다. 데이터에 대한 다른 반복이 필요한지 여부를 표시합니다.
- "nextQueryFilters": 다른 반복이 필요한 경우 실행할 연속 JSON 쿼리가 포함됩니다. 다음 요청에서 이를 "필터" 매개 변수로 사용합니다.
다음 Python 예제에서는 CSV 파일의 내용을 사용하여 Defender for Cloud Apps 환경에서 IP 주소 범위를 관리(만들기, 업데이트 또는 삭제)합니다.
import csv
import http
import requests
import json
OPTION_DELETE_ENABLED = False
IP_RANGES_BASE_URL = 'https://<tenant_id>.<tenant_region>.portal.cloudappsecurity.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),
'Content-Type': 'application/json'
}
# 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:
response = requests.post(IP_RANGES_BASE_URL, json=list_request_data, headers=HEADERS)
if response.status_code != http.HTTPStatus.OK:
raise Exception(f'Error getting existing subnets from tenant. Stopping script run. Error: {response.content}')
content = json.loads(response.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, ):
new_tags = sorted([new_tag for new_tag in tag.split(' ') if new_tag != ''])
existing_tags = sorted([existing_tag.get('id') for existing_tag in record.get('tags', [])])
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,
existing_tags != new_tags,
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
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
request_data['_id'] = record['_id']
response = requests.post(f"{IP_RANGES_BASE_URL}{record['_id']}/{IP_RANGES_UPDATE_SUFFIX}", json=request_data, headers=HEADERS)
if response.status_code == http.HTTPStatus.OK:
print('Rule updated', request_data)
else:
print('Error updating rule. Request data:', request_data, ' Response:', response.content)
json.loads(response.content)
return record
else:
# The exact same rule exists. no need for change.
print('The exact same rule exists. no need for change. Rule name: ', name)
return record
# Create new rule.
response = requests.post(f"{IP_RANGES_BASE_URL}{IP_RANGES_CREATE_SUFFIX}", json=request_data, headers=HEADERS)
if response.status_code == http.HTTPStatus.OK:
print('Rule created:', request_data)
else:
print('Error creating rule. Request data:', request_data, ' Response:', response.content)
# added record
return record
# Request data creation.
def create_request_data(name, ip_address_ranges, category, tag, isp_name):
tags = [new_tag for new_tag in tag.split(' ') if new_tag != '']
request_data = {"name": name, "subnets": ip_address_ranges.split(' '), "category": category, "tags": tags}
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=',')
# move the reader object to point on the next row, headers are not needed
next(reader)
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
response = requests.post(f"{IP_RANGES_BASE_URL}{IP_RANGES_CREATE_SUFFIX}", json=request_data, headers=HEADERS)
if response.status_code == http.HTTPStatus.OK:
record_id = json.loads(response.content)
print('Rule created:', request_data)
else:
print('Error creating rule. Request data:', request_data, ' Response:', response.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()
다음 단계
문제가 발생하면 도움을 드리겠습니다. 제품 문제에 대한 지원 또는 지원을 받으려면 지원 티켓을 여세요.