Skip to main content

DNS Security Profile Configuration Object

Manages DNS security profiles for protecting against DNS-based threats in Palo Alto Networks Strata Cloud Manager.

Class Overview

The DNSSecurityProfile class inherits from BaseObject and provides CRUD operations for DNS security profiles that protect against DNS-based threats including botnet domains, malware, and phishing attempts.

Methods

MethodDescriptionParametersReturn Type
create()Creates a new profiledata: Dict[str, Any]DNSSecurityProfileResponseModel
get()Retrieves a profile by IDobject_id: strDNSSecurityProfileResponseModel
update()Updates an existing profileprofile: DNSSecurityProfileUpdateModelDNSSecurityProfileResponseModel
delete()Deletes a profileobject_id: strNone
list()Lists profiles with filteringfolder: str, **filtersList[DNSSecurityProfileResponseModel]
fetch()Gets profile by name and foldername: str, folder: strDNSSecurityProfileResponseModel

Model Attributes

AttributeTypeRequiredDefaultDescription
namestrYesNoneProfile name. Pattern: ^[a-zA-Z0-9][a-zA-Z0-9_\-\.\s]*$
idUUIDYes*NoneUnique identifier (*response/update only)
descriptionstrNoNoneProfile description
botnet_domainsBotnetDomainsModelNoNoneBotnet domains configuration
folderstrNo**NoneFolder location. Max 64 chars
snippetstrNo**NoneSnippet location. Max 64 chars
devicestrNo**NoneDevice location. Max 64 chars

* Only required for response and update models ** Exactly one container (folder, snippet, or device) must be provided for create operations

BotnetDomainsModel Attributes

AttributeTypeRequiredDefaultDescription
dns_security_categoriesList[DNSSecurityCategoryEntryModel]NoNoneDNS security categories
listsList[ListEntryBaseModel]NoNoneLists of DNS domains
sinkholeSinkholeSettingsModelNoNoneDNS sinkhole settings
whitelistList[WhitelistEntryModel]NoNoneDNS security overrides

DNSSecurityCategoryEntryModel Attributes

AttributeTypeRequiredDefaultDescription
namestrYesNoneDNS Security Category Name
actionActionEnumNodefaultAction to be taken
log_levelLogLevelEnumNodefaultLog level
packet_capturePacketCaptureEnumNoNonePacket capture setting

Exceptions

ExceptionHTTP CodeDescription
InvalidObjectError400Invalid profile data or format
MissingQueryParameterError400Missing required parameters
NameNotUniqueError409Profile name already exists
ObjectNotPresentError404Profile not found
ReferenceNotZeroError409Profile still referenced
AuthenticationError401Authentication failed
ServerError500Internal server error

Basic Configuration

from scm.client import Scm

client = Scm(
client_id="your_client_id",
client_secret="your_client_secret",
tsg_id="your_tsg_id"
)

profiles = client.dns_security_profile

Methods

List DNS Security Profiles

filtered_profiles = client.dns_security_profile.list(
folder='Texas',
dns_security_categories=['pan-dns-sec-malware']
)

for profile in filtered_profiles:
print(f"Name: {profile.name}")
if profile.botnet_domains and profile.botnet_domains.dns_security_categories:
for category in profile.botnet_domains.dns_security_categories:
print(f"Category: {category.name}, Action: {category.action}")

Filtering responses:

exact_profiles = client.dns_security_profile.list(
folder='Texas',
exact_match=True
)

combined_filters = client.dns_security_profile.list(
folder='Texas',
exact_match=True,
exclude_folders=['All'],
exclude_snippets=['default'],
exclude_devices=['DeviceA']
)

Controlling pagination with max_limit:

client.dns_security_profile.max_limit = 4000

all_profiles = client.dns_security_profile.list(folder='Texas')

Fetch a DNS Security Profile

profile = client.dns_security_profile.fetch(name="basic-profile", folder="Texas")
print(f"Found profile: {profile.name}")

Create a DNS Security Profile

# Basic profile with DNS security categories
basic_profile = {
'name': 'basic-profile',
'description': 'Basic DNS security profile',
'botnet_domains': {
'dns_security_categories': [
{
'name': 'pan-dns-sec-malware',
'action': 'block',
'log_level': 'high',
'packet_capture': 'single-packet'
}
]
},
'folder': 'Texas'
}
basic_profile_obj = client.dns_security_profile.create(basic_profile)

# Advanced profile with sinkhole and whitelist
advanced_profile = {
'name': 'advanced-profile',
'description': 'Advanced DNS security profile',
'botnet_domains': {
'dns_security_categories': [
{
'name': 'pan-dns-sec-malware',
'action': 'sinkhole',
'log_level': 'high'
},
{
'name': 'pan-dns-sec-phishing',
'action': 'block',
'log_level': 'critical'
}
],
'sinkhole': {
'ipv4_address': 'pan-sinkhole-default-ip',
'ipv6_address': '::1'
},
'whitelist': [
{
'name': 'trusted.example.com',
'description': 'Trusted domain'
}
]
},
'folder': 'Texas'
}
advanced_profile_obj = client.dns_security_profile.create(advanced_profile)

Update a DNS Security Profile

existing_profile = client.dns_security_profile.fetch(name="basic-profile", folder="Texas")

existing_profile.description = "Updated DNS security profile"
existing_profile.botnet_domains.dns_security_categories.append({
'name': 'pan-dns-sec-grayware',
'action': 'block',
'log_level': 'high'
})

updated_profile = client.dns_security_profile.update(existing_profile)

Delete a DNS Security Profile

client.dns_security_profile.delete("123e4567-e89b-12d3-a456-426655440000")

Get a DNS Security Profile by ID

profile_by_id = client.dns_security_profile.get(profile.id)
print(f"Retrieved profile: {profile_by_id.name}")
print(f"Categories: {profile_by_id.botnet_domains.dns_security_categories}")

Use Cases

Committing Changes

result = client.commit(
folders=["Texas"],
description="Updated DNS security profiles",
sync=True,
timeout=300
)
print(f"Commit job ID: {result.job_id}")

Monitoring Jobs

job_status = client.get_job_status(result.job_id)
print(f"Job status: {job_status.data[0].status_str}")

recent_jobs = client.list_jobs(limit=10)
for job in recent_jobs.data:
print(f"Job {job.id}: {job.type_str} - {job.status_str}")

Error Handling

from scm.exceptions import (
InvalidObjectError,
MissingQueryParameterError,
NameNotUniqueError,
ObjectNotPresentError,
ReferenceNotZeroError
)

try:
profile_config = {
"name": "test-profile",
"description": "Test DNS security profile",
"botnet_domains": {
"dns_security_categories": [
{
"name": "pan-dns-sec-malware",
"action": "block",
"log_level": "high"
}
]
},
"folder": "Texas"
}
new_profile = client.dns_security_profile.create(profile_config)
result = client.commit(
folders=["Texas"],
description="Added test profile",
sync=True
)
status = client.get_job_status(result.job_id)

except InvalidObjectError as e:
print(f"Invalid profile data: {e.message}")
except NameNotUniqueError as e:
print(f"Profile name already exists: {e.message}")
except ObjectNotPresentError as e:
print(f"Profile not found: {e.message}")
except ReferenceNotZeroError as e:
print(f"Profile still in use: {e.message}")
except MissingQueryParameterError as e:
print(f"Missing parameter: {e.message}")