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}")