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