Skip to content

Security

The security domain covers 27 resources: admin users, groups, roles, and permissions; authentication policy; approval workflows; authentication services (CA cert, RADIUS, TACACS+, LDAP, SAML, local users, certificate-based); Active Directory auth; RADIUS users and NAS clients; SNMP/FTP/network users; parental-control subscribers, policies and AVPs; and HSM groups.

Access via client.security.


Admin users

import asyncio
from ibx_nios_sdk import NiosClient

async def main():
    async with NiosClient() as client:
        # List all admin users
        async for user in client.security.adminuser.list():
            print(user.name, user.status)

        # Create a read-only admin user
        user = await client.security.adminuser.create({
            "name": "readonly-ops",
            "password": "S3cur3P@ss!",
            "status": "ENABLED",
            "admin_groups": ["readonly-group"],
            "comment": "Ops read-only account",
        })
        print(user._ref)

        # Disable an account
        await client.security.adminuser.update(user._ref, {"status": "DISABLED"})

asyncio.run(main())

Admin groups

Admin groups control what operations users can perform.

async with NiosClient() as client:
    # List all groups
    groups = await client.security.admingroup.list().all()
    for g in groups:
        print(g.name, g.comment)

    # Create a custom group
    grp = await client.security.admingroup.create({
        "name": "dns-admins",
        "comment": "DNS administration team",
        "superuser": False,
        "roles": ["dns-role"],
    })

Admin roles

Roles aggregate permissions into reusable policies.

async with NiosClient() as client:
    roles = await client.security.adminrole.list().all()
    for r in roles:
        print(r.name, r.comment)

    new_role = await client.security.adminrole.create({
        "name": "dns-readonly",
        "comment": "Read-only DNS access",
    })

Permissions

Permissions map a role to a specific WAPI resource type and access level.

async with NiosClient() as client:
    # List permissions for a role
    perms = await client.security.permission.list(role="dns-readonly").all()
    for p in perms:
        print(p.resource_type, p.permission)

    # Grant read access to zone_auth
    perm = await client.security.permission.create({
        "role": "dns-readonly",
        "resource_type": "zone_auth",
        "permission": "READ",
    })

Authentication policy

The auth policy determines the order in which auth services are tried.

async with NiosClient() as client:
    # Get the single auth policy
    policies = await client.security.authpolicy.list().all()
    policy = policies[0]

    # Update auth service order
    await client.security.authpolicy.update(
        policy._ref,
        {"auth_services": ["local_authservice", "radius_authservice"]},
    )

Authentication services

Resource Auth service type
localuser_authservice Local NIOS user database
radius_authservice RADIUS server
tacacsplus_authservice TACACS+ server
ldap_auth_service LDAP / Active Directory
saml_authservice SAML 2.0 IdP
certificate_authservice Certificate-based auth
cacertificate CA certificate store
ad_auth_service Active Directory auth service
async with NiosClient() as client:
    # RADIUS auth service
    radius = await client.security.radius_authservice.create({
        "name": "corp-radius",
        "auth_servers": [
            {
                "address": "10.0.0.50",
                "shared_secret": "r@d1us_secret",
                "port": 1812,
            }
        ],
        "comment": "Corporate RADIUS",
    })

    # LDAP auth service
    ldap = await client.security.ldap_auth_service.create({
        "name": "corp-ad",
        "ldap_user_attribute": "sAMAccountName",
        "servers": [{"address": "dc1.corp.example.com", "port": 389}],
        "comment": "Active Directory LDAP",
    })

Approval workflows

Approval workflows require a second admin to approve changes before they are applied.

async with NiosClient() as client:
    # List workflows
    workflows = await client.security.approvalworkflow.list().all()
    for wf in workflows:
        print(wf.approver_type, wf.approved_type)

    # Create a workflow requiring approval for zone_auth changes
    wf = await client.security.approvalworkflow.create({
        "approved_type": "zone_auth",
        "approver_type": "GROUP",
        "approver": "dns-approvers",
        "rascal_task_id": "auto",
    })

SNMP, FTP, and network users

async with NiosClient() as client:
    # SNMP users (SNMPv3)
    snmp_users = await client.security.snmpuser.list().all()

    # FTP users (for file distribution)
    ftp_users = await client.security.ftpuser.list().all()

    # Network users (DHCP lease-based auth)
    net_users = await client.security.networkuser.list().all()

    # User profile (current session's profile)
    profile = await client.security.userprofile.list().all()

Parental control

Parental control applies per-subscriber DNS policies - useful for ISPs and managed service providers. Five resources cooperate to express a policy.

Resource Purpose
parentalcontrol_subscribersite Site-level configuration (per deployment)
parentalcontrol_subscriber Subscriber schema definitions
parentalcontrol_subscriberrecord Individual subscriber → policy bindings
parentalcontrol_blockingpolicy Named blocking policies referenced by records
parentalcontrol_avp RADIUS AVPs used to correlate sessions to subscribers
async with NiosClient() as client:
    # Blocking policies available to subscribers
    policies = await client.security.parentalcontrol_blockingpolicy.list().all()
    for p in policies:
        print(p.name, p.value)

    # Subscriber records (per-subscriber policy bindings)
    async for rec in client.security.parentalcontrol_subscriberrecord.list():
        print(rec.subscriber_id, rec.parental_control_policy)

    # AVP definitions (RADIUS attribute-value pair mappings)
    avps = await client.security.parentalcontrol_avp.list().all()

    # Site and subscriber schema singletons
    sites = await client.security.parentalcontrol_subscribersite.list().all()
    subscribers = await client.security.parentalcontrol_subscriber.list().all()

Note

Parental-control objects are NIOS 8.x+ features and require the appropriate license. Expect 404s from the WAPI if the feature is not enabled on your grid.


HSM groups

Hardware Security Module groups store DNSSEC private keys off-appliance.

async with NiosClient() as client:
    # All HSM groups (any vendor)
    all_hsm = await client.security.hsm_allgroups.list().all()

    # Entrust nShield groups
    entrust = await client.security.hsm_entrustnshieldgroup.list().all()

    # Thales Luna groups
    thales = await client.security.hsm_thaleslunagroup.list().all()