Skip to main content

DNS Security Profile Models

Overview​

The DNS Security Profile models provide a structured way to manage DNS Security profiles in Palo Alto Networks' Strata Cloud Manager. These models support configuration of profiles that protect against DNS-based threats, including domain filtering and DNS sinkhole operations. The models handle validation of inputs and outputs when interacting with the SCM API.

Models​

The module provides the following Pydantic models:

  • DNSSecurityProfileBaseModel: Base model with fields common to all profile operations
  • DNSSecurityProfileCreateModel: Model for creating new DNS security profiles
  • DNSSecurityProfileUpdateModel: Model for updating existing DNS security profiles
  • DNSSecurityProfileResponseModel: Response model for DNS security profile operations
  • BotnetDomainsModel: Model for botnet domains configuration
  • DNSSecurityCategoryEntryModel: Model for DNS security category entries
  • ListEntryBaseModel: Model for custom domain list entries
  • SinkholeSettingsModel: Model for sinkhole configuration
  • WhitelistEntryModel: Model for whitelist entries

All models use extra="forbid" configuration, which rejects any fields not explicitly defined in the model.

Model Attributes​

DNSSecurityProfileBaseModel​

AttributeTypeRequiredDefaultDescription
namestrYesNoneProfile name. Pattern: ^[a-zA-Z0-9][a-zA-Z0-9_\-\.\s]*$
descriptionstrNoNoneDescription of the profile
botnet_domainsBotnetDomainsModelNoNoneBotnet domains settings
folderstrNo**NoneFolder location. Max 64 chars
snippetstrNo**NoneSnippet location. Max 64 chars
devicestrNo**NoneDevice location. Max 64 chars

** Exactly one container (folder/snippet/device) must be provided for create operations

DNSSecurityProfileCreateModel​

Inherits all fields from DNSSecurityProfileBaseModel and enforces that exactly one of folder, snippet, or device is provided during creation.

DNSSecurityProfileUpdateModel​

Extends DNSSecurityProfileBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the profile

DNSSecurityProfileResponseModel​

Extends DNSSecurityProfileBaseModel by adding:

AttributeTypeRequiredDefaultDescription
idUUIDYesNoneThe unique identifier of the profile

Enum Types​

ActionEnum​

Defines the allowed actions for DNS security categories:

ValueDescription
defaultUse default action
allowAllow the traffic
blockBlock the traffic
sinkholeSinkhole the domain

LogLevelEnum​

Defines the log levels:

ValueDescription
defaultDefault log level
noneNo logging
lowLow priority logging
informationalInformational logging
mediumMedium priority logging
highHigh priority logging
criticalCritical priority logging

PacketCaptureEnum​

Defines the packet capture options:

ValueDescription
disableDisable packet capture
single-packetCapture a single packet
extended-captureExtended packet capture

IPv4AddressEnum​

Defines the allowed IPv4 sinkhole addresses:

ValueDescription
pan-sinkhole-default-ipDefault sinkhole IP
127.0.0.1Localhost

IPv6AddressEnum​

Defines the allowed IPv6 sinkhole addresses:

ValueDescription
::1Localhost

Component Models​

BotnetDomainsModel​

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

DNSSecurityCategoryEntryModel​

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

ListEntryBaseModel​

AttributeTypeRequiredDefaultDescription
namestrYesNoneList name
packet_capturePacketCaptureEnumNoNonePacket capture setting
actionListActionRequestModelYesNoneAction

SinkholeSettingsModel​

AttributeTypeRequiredDefaultDescription
ipv4_addressIPv4AddressEnumYesNoneIPv4 address for sinkhole
ipv6_addressIPv6AddressEnumYesNoneIPv6 address for sinkhole

WhitelistEntryModel​

AttributeTypeRequiredDefaultDescription
namestrYesNoneDNS domain or FQDN to be whitelisted
descriptionstrNoNoneDescription

Exceptions​

The DNS Security Profile models can raise the following exceptions during validation:

  • ValueError: Raised in several scenarios:
    • When multiple container types (folder/snippet/device) are specified for create operations
    • When no container type is specified for create operations
    • When name pattern validation fails
    • When container field pattern validation fails
    • When field length limits are exceeded
    • When invalid action or log level values are provided
    • When invalid packet capture settings are provided
    • When multiple actions are specified in list entry action field

Model Validators​

Container Type Validation​

For create operations, exactly one container type must be specified:

from scm.models.security import DNSSecurityProfileCreateModel

# Error: multiple containers specified
try:
profile = DNSSecurityProfileCreateModel(
name="dns-security-profile",
folder="Texas",
device="fw01" # Can't specify both folder and device
)
except ValueError as e:
print(e) # "Exactly one of 'folder', 'snippet', or 'device' must be provided."

# Error: no container specified
try:
profile = DNSSecurityProfileCreateModel(
name="dns-security-profile"
)
except ValueError as e:
print(e) # "Exactly one of 'folder', 'snippet', or 'device' must be provided."

Action Validation​

For list entries, exactly one action type must be specified:

from scm.models.security import ListActionRequestModel

# Error: multiple actions specified
try:
action = ListActionRequestModel(root={
"alert": {},
"block": {} # Can't specify multiple actions
})
except ValueError as e:
print(e) # "Exactly one action must be provided in 'action' field."

# Correct way to specify an action
action = ListActionRequestModel(root={"block": {}})

Usage Examples​

Creating a DNS Security Profile​

from scm.client import Scm

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

# Using dictionary
profile_dict = {
"name": "dns-sec-profile",
"description": "DNS security profile for production",
"botnet_domains": {
"dns_security_categories": [
{
"name": "pan-dns-sec-malware",
"action": "block",
"log_level": "critical",
"packet_capture": "extended-capture"
},
{
"name": "pan-dns-sec-phishing",
"action": "sinkhole",
"log_level": "high",
"packet_capture": "single-packet"
}
],
"sinkhole": {
"ipv4_address": "pan-sinkhole-default-ip",
"ipv6_address": "::1"
},
"whitelist": [
{"name": "trusted-domain.com", "description": "Trusted domain"}
]
},
"folder": "Texas"
}

response = client.dns_security_profile.create(profile_dict)
print(f"Created profile: {response.name}")

Creating a Profile with Multiple Categories​

from scm.client import Scm

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

# Using dictionary
profile_dict = {
"name": "comprehensive-dns-profile",
"description": "Comprehensive DNS security profile",
"botnet_domains": {
"dns_security_categories": [
{
"name": "pan-dns-sec-cc",
"action": "block",
"log_level": "critical"
},
{
"name": "pan-dns-sec-malware",
"action": "sinkhole",
"log_level": "high"
},
{
"name": "pan-dns-sec-phishing",
"action": "block",
"log_level": "high"
},
{
"name": "pan-dns-sec-grayware",
"action": "alert",
"log_level": "medium"
}
],
"sinkhole": {
"ipv4_address": "pan-sinkhole-default-ip",
"ipv6_address": "::1"
}
},
"folder": "Texas"
}

response = client.dns_security_profile.create(profile_dict)
print(f"Created profile with {len(response.botnet_domains.dns_security_categories)} categories")

Updating a DNS Security Profile​

from scm.client import Scm

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

# Fetch existing profile
existing = client.dns_security_profile.fetch(name="dns-sec-profile", folder="Texas")

# Modify attributes using dot notation
existing.description = "Updated DNS security profile"

# Add a new category to the existing list
if existing.botnet_domains and existing.botnet_domains.dns_security_categories:
existing.botnet_domains.dns_security_categories.append({
"name": "pan-dns-sec-recent",
"action": "alert",
"log_level": "medium"
})

# Add whitelist entry if needed
if existing.botnet_domains:
if existing.botnet_domains.whitelist is None:
existing.botnet_domains.whitelist = []
existing.botnet_domains.whitelist.append({
"name": "new-trusted.com",
"description": "Newly trusted domain"
})

# Pass modified object to update()
updated = client.dns_security_profile.update(existing)
print(f"Updated profile: {updated.name}")