<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NW Field Memo</title>
    <description>The latest articles on DEV Community by NW Field Memo (@nw_field_memo).</description>
    <link>https://dev.to/nw_field_memo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112039%2Fc27e4663-6f4b-494b-aa62-7d382106621e.png</url>
      <title>DEV Community: NW Field Memo</title>
      <link>https://dev.to/nw_field_memo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nw_field_memo"/>
    <language>en</language>
    <item>
      <title>TACACS+ Failover Testing: Rejection, Outage, and Recovery Are Different Tests</title>
      <dc:creator>NW Field Memo</dc:creator>
      <pubDate>Sun, 13 Sep 2026 13:18:45 +0000</pubDate>
      <link>https://dev.to/nw_field_memo/tacacs-failover-testing-rejection-outage-and-recovery-are-different-tests-207k</link>
      <guid>https://dev.to/nw_field_memo/tacacs-failover-testing-rejection-outage-and-recovery-are-different-tests-207k</guid>
      <description>&lt;p&gt;&lt;strong&gt;A TACACS+ rollout needs more than a successful login. Test what happens when one server is unavailable, when none can answer, and when the service returns. For each state, check who authenticated the user, what the user could do, and what evidence was recorded.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That last part is easy to miss. “I got a prompt” does not tell us which server answered—or whether a local account was used instead.&lt;/p&gt;

&lt;p&gt;I'm Goda, a network engineer in Japan. This article develops the outage-testing questions from my Japanese TACACS+ material. The examples below are &lt;strong&gt;illustrative test designs, not reported results from a customer environment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The focus is device administration through an SSH CLI. Product behavior depends on the device, software release, AAA configuration, and management path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with an expected outcome for each failure state
&lt;/h2&gt;

&lt;p&gt;Before interrupting anything, write down the behavior your design requires.&lt;/p&gt;

&lt;p&gt;The following is an &lt;strong&gt;example policy&lt;/strong&gt;, not a universal TACACS+ requirement. In this example, ordinary users rely on centralized authentication and a separate emergency account is available through a deliberately configured local recovery path.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test condition&lt;/th&gt;
&lt;th&gt;Expected result in this example&lt;/th&gt;
&lt;th&gt;Evidence to collect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Both servers available; valid ordinary account&lt;/td&gt;
&lt;td&gt;Normal centralized access with the intended permissions&lt;/td&gt;
&lt;td&gt;Device response, server that handled the request, authorization and accounting evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First server unavailable; second available&lt;/td&gt;
&lt;td&gt;Access through the remaining server, within the agreed time limit&lt;/td&gt;
&lt;td&gt;Failure condition, elapsed time, request handled by the remaining server, resulting permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All configured servers unreachable; ordinary account&lt;/td&gt;
&lt;td&gt;No unintended local access&lt;/td&gt;
&lt;td&gt;Device response and evidence explaining the authentication outcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All configured servers unreachable; designated emergency account&lt;/td&gt;
&lt;td&gt;The approved recovery path works with only its intended permissions&lt;/td&gt;
&lt;td&gt;Local authentication evidence, role or privilege, recovery-operation results, available audit evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Central service restored&lt;/td&gt;
&lt;td&gt;New sessions use the intended normal path and normal controls work again&lt;/td&gt;
&lt;td&gt;Authentication, permitted and prohibited operations, accounting, removal of temporary test changes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your design intentionally has &lt;strong&gt;no local fallback&lt;/strong&gt;, do not add one just to make the fourth row pass. Define how authorized recovery is supposed to work and test that arrangement.&lt;/p&gt;

&lt;p&gt;Also, “first server” means the server the device is expected to try under the recorded starting conditions. Do not assume that every implementation always selects a server with the label “primary.”&lt;/p&gt;

&lt;h2&gt;
  
  
  A rejection is different from a server that cannot answer
&lt;/h2&gt;

&lt;p&gt;Do not simulate a server outage by entering the wrong password.&lt;/p&gt;

&lt;p&gt;A server can be fully reachable and deliberately reject authentication. A timeout means no usable response arrived within the relevant limit. A protocol error is another condition again.&lt;/p&gt;

&lt;p&gt;RFC 8907 distinguishes a completed negative decision from an incomplete exchange: a FAIL result is applied as a decision, while an ERROR must be treated as though the server could not be reached. Available alternative methods may then be used. The details of redundancy, fallback, and timeouts are implementation-specific. &lt;a href="https://www.rfc-editor.org/rfc/rfc8907.html#section-4.4" rel="noopener noreferrer"&gt;RFC 8907, section 4.4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That gives us separate test items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A validly formed login request that receives an explicit authentication rejection.&lt;/li&gt;
&lt;li&gt;A request whose intended server does not respond.&lt;/li&gt;
&lt;li&gt;An error condition, if that condition is part of the test scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each one, record what actually happened. Do not label every failed login “server down,” and do not assume every failure should move on to a local account.&lt;/p&gt;

&lt;p&gt;Check the target platform's documented method-list behavior and your configured policy before writing the expected result.&lt;/p&gt;

&lt;h2&gt;
  
  
  A one-server outage should prove which server took over
&lt;/h2&gt;

&lt;p&gt;Suppose the design has two TACACS+ servers and access should continue when either one is unavailable.&lt;/p&gt;

&lt;p&gt;“I disconnected one server and could still log in” is incomplete evidence. The device might have used the other server, a local account, or an existing session that never performed a new login.&lt;/p&gt;

&lt;p&gt;A useful test sequence is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record the starting configuration and confirm normal access.&lt;/li&gt;
&lt;li&gt;Establish the approved failure condition for one server.&lt;/li&gt;
&lt;li&gt;Start a &lt;strong&gt;new&lt;/strong&gt; management session with the intended test account.&lt;/li&gt;
&lt;li&gt;Identify which authentication source handled that attempt.&lt;/li&gt;
&lt;li&gt;Check the resulting permissions and relevant records.&lt;/li&gt;
&lt;li&gt;Record the elapsed time and compare it with the acceptance limit chosen before the test.&lt;/li&gt;
&lt;li&gt;Restore the starting conditions before testing the opposite direction.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Choose the failure mechanism carefully. Dropping traffic, rejecting a connection, and stopping a service can produce different observations. Record which condition you created instead of calling all of them the same outage.&lt;/p&gt;

&lt;p&gt;Existing sessions can be a separate test item. Whether an already-open session can run its next command may depend on a different authorization exchange.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local login is only the first part of emergency access
&lt;/h2&gt;

&lt;p&gt;An emergency account is useful only if it supports the recovery work it was designed for.&lt;/p&gt;

&lt;p&gt;Check these questions separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did local authentication succeed?&lt;/li&gt;
&lt;li&gt;Was a management session actually established?&lt;/li&gt;
&lt;li&gt;Which role or privilege was applied?&lt;/li&gt;
&lt;li&gt;Could the account perform the explicitly approved recovery operations?&lt;/li&gt;
&lt;li&gt;Were operations outside that scope controlled as designed?&lt;/li&gt;
&lt;li&gt;What record of the activity remained available?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TACACS+ treats authentication, authorization, and accounting as separate functions. Passing one stage does not establish the outcome of the others. &lt;a href="https://www.rfc-editor.org/rfc/rfc8907.html#section-1" rel="noopener noreferrer"&gt;RFC 8907, section 1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a concrete platform example in the &lt;strong&gt;Nexus 9000 NX-OS 10.4(x)&lt;/strong&gt; guide. Command authorization has its own fallback configuration. Local command authorization is used only when the configured server groups fail to respond and local fallback has been configured; without that fallback, authorization fails. Console command authorization is configured separately as well. &lt;a href="https://www.cisco.com/c/en/us/td/docs/dcn/nx-os/nexus9000/104x/configuration/security/cisco-nexus-9000-series-nx-os-security-configuration-guide-release-104x/m-configuring-tacacs.html" rel="noopener noreferrer"&gt;Cisco NX-OS 10.4(x): Configuring TACACS+&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why a locally accepted password can still leave you unable to do the intended recovery work. Use the documentation for the actual product rather than copying NX-OS behavior to another platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide how to test safely before creating the outage
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Use a suitable lab or an explicitly approved maintenance procedure. Establish an independent recovery path, define stop conditions, and prepare restoration steps before changing connectivity or AAA behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A session that is already open is not automatically a sufficient recovery path: its next operation may still depend on the service you are about to interrupt.&lt;/p&gt;

&lt;p&gt;Prefer harmless operations that demonstrate the required permission boundary. Do not try a restart, deletion, or disruptive configuration change on production equipment merely because the account is supposed to be denied.&lt;/p&gt;

&lt;p&gt;For each disruptive test, identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What will be changed or interrupted.&lt;/li&gt;
&lt;li&gt;What could be affected if the assumption is wrong.&lt;/li&gt;
&lt;li&gt;How recovery can be performed if the tested management path fails.&lt;/li&gt;
&lt;li&gt;When to stop, who restores the environment, and what evidence to preserve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those conditions are missing, record the item as not performed and state what is needed to run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  “The server responds again” is not a complete recovery test
&lt;/h2&gt;

&lt;p&gt;Restoring connectivity is a step toward recovery. It does not prove that normal administration has returned.&lt;/p&gt;

&lt;p&gt;My suggested recovery checks are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New authentication:&lt;/strong&gt; Start a new session and identify the source that authenticates it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions:&lt;/strong&gt; Repeat a representative permitted operation and a safely designed prohibited-operation test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounting:&lt;/strong&gt; Confirm that the expected new activity reaches the intended records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emergency access:&lt;/strong&gt; Check that its post-recovery behavior matches the design. This does not necessarily mean deleting a deliberately retained emergency account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup:&lt;/strong&gt; Remove temporary failure-injection settings and verify the resulting configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handover:&lt;/strong&gt; Record remaining gaps and the evidence that supports closure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not require immediate return to a preferred server unless the product and configuration actually promise it. Server reactivation follows platform-specific policies and timers. For example, ASA 9.16 documents different reactivation modes, while NX-OS documents dead-time and probing behavior. Record the chosen settings and observed server selection. &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/asa/asa916/configuration/general/asa-916-general-config/aaa-tacacs.html" rel="noopener noreferrer"&gt;Cisco ASA 9.16: TACACS+ Servers for AAA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For ISE, use the report appropriate to the event. Its &lt;strong&gt;3.5&lt;/strong&gt; guide lists separate TACACS Authentication, Authorization, Accounting, and Command Accounting reports. A login record does not substitute for command-accounting evidence. &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_device_admin.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5: Device Administration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also distinguish &lt;strong&gt;new records after restoration&lt;/strong&gt; from &lt;strong&gt;records of activity during the outage&lt;/strong&gt;. Seeing new records does not prove that every missing event was buffered and resent. If outage-period audit coverage is required, verify that behavior separately or document the approved alternative evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the failed run when the retest passes
&lt;/h2&gt;

&lt;p&gt;Here is a fictional example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;First run:&lt;/strong&gt; The emergency account passes local authentication, but a required recovery operation fails because its command authorization still depends on the unavailable service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judgment:&lt;/strong&gt; Fail for the emergency-operation requirement. Keep the authentication success as an observation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next action:&lt;/strong&gt; Review and correct the approved recovery design, then repeat the relevant test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retest:&lt;/strong&gt; Add a new result linked to the original failure and the correction. Do not replace the failed row with “Pass.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This makes the conclusion reviewable: someone can see the original condition, the issue, what changed, and what the next attempt demonstrated.&lt;/p&gt;

&lt;p&gt;The same applies when evidence is incomplete. A test with an unexplained error is inconclusive, not automatically a successful denial.&lt;/p&gt;

&lt;p&gt;The questions I want the record to answer are simple: &lt;strong&gt;Who authenticated the user? What could they do? What was recorded? What proves normal operation has returned?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional worksheets: free sample and paid kit
&lt;/h2&gt;

&lt;p&gt;If you want an editable starting point, I publish two resources on note. &lt;strong&gt;Both the worksheets and their accompanying material are in Japanese. These are my own products.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://note.com/nw_field_memo/n/n980e683d7854" rel="noopener noreferrer"&gt;Free sample: five basic TACACS+ administration checks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://note.com/nw_field_memo/n/n8bfe0882afeb" rel="noopener noreferrer"&gt;Standard kit: 24 tests covering normal access, failure conditions, emergency access, and recovery&lt;/a&gt;. It is a &lt;strong&gt;one-time ¥800 purchase&lt;/strong&gt; at the time of writing, with Excel worksheets, worked examples, a PDF guide, and fictional evidence examples. Purchase and download take place on note.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The kit is a test-design template, not a set of validated device configurations. Adapt the conditions, operations, and acceptance criteria to your equipment. Check the product page for the current price, contents, and usage terms.&lt;/p&gt;

&lt;p&gt;For the permission checks discussed here, see my earlier article: &lt;a href="https://dev.to/nw_field_memo/read-only-access-testing-a-successful-login-is-not-enough-c60"&gt;Read-Only Access Testing: A Successful Login Is Not Enough&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prepared with AI-assisted translation and editing of my Japanese material, with the additional protocol and product explanations checked against the official sources linked above.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>Read-Only Access Testing: A Successful Login Is Not Enough</title>
      <dc:creator>NW Field Memo</dc:creator>
      <pubDate>Sun, 13 Sep 2026 12:59:25 +0000</pubDate>
      <link>https://dev.to/nw_field_memo/read-only-access-testing-a-successful-login-is-not-enough-c60</link>
      <guid>https://dev.to/nw_field_memo/read-only-access-testing-a-successful-login-is-not-enough-c60</guid>
      <description>&lt;p&gt;&lt;strong&gt;A read-only account needs to pass three separate checks: it can log in, it can read the information required for the job, and it cannot make the changes your requirements prohibit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A successful login proves only part of that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Adapted from &lt;a href="https://note.com/nw_field_memo/n/n851747a67910" rel="noopener noreferrer"&gt;my original Japanese article&lt;/a&gt;, with AI-assisted translation and editing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm Goda, a network engineer in Japan. My Japanese blog has recently drifted into TFT and experimenting with AI, so this is also an attempt to remember what my job is.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/nw_field_memo/cisco-ise-command-sets-not-working-check-authorization-before-your-deny-rules-2on0"&gt;previous article&lt;/a&gt;, I covered what to check when Cisco ISE Command Sets do not work as expected.&lt;/p&gt;

&lt;p&gt;This time, the question is what we should put in a test plan before signing off on read-only access.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Turn “read-only” into three testable requirements
&lt;/h2&gt;

&lt;p&gt;You sign in with the account. The management screen opens. You write “Pass.”&lt;/p&gt;

&lt;p&gt;So far, so straightforward.&lt;/p&gt;

&lt;p&gt;But can that account read the logs needed to investigate an incident? And can it really not change the settings it is supposed to leave alone?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Example acceptance criterion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can log in&lt;/td&gt;
&lt;td&gt;A management session starts using the intended authentication source, user, and permissions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can read what is needed&lt;/td&gt;
&lt;td&gt;The account can view the required status and logs for the resources it is allowed to access.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cannot make prohibited changes&lt;/td&gt;
&lt;td&gt;A valid prohibited operation is rejected by the applicable permission control, and the target remains unchanged.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are examples for designing tests, not results from a device test. Choose actual operations and acceptance criteria for your product and requirements.&lt;/p&gt;

&lt;p&gt;“Nothing could be changed” is not sufficient if the account also cannot read the logs that its operator needs. Likewise, being able to read logs does not establish that changes are blocked.&lt;/p&gt;

&lt;p&gt;TACACS+ separates authentication, authorization, and accounting. A successful authentication record therefore cannot, by itself, establish which subsequent operations were permitted. &lt;a href="https://www.rfc-editor.org/rfc/rfc8907.html#section-1" rel="noopener noreferrer"&gt;RFC 8907, section 1&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Define what the account may read and what it must not do
&lt;/h2&gt;

&lt;p&gt;“It is a read-only user. Should I just try some show commands?”&lt;/p&gt;

&lt;p&gt;First, define the job the account is intended to support.&lt;/p&gt;

&lt;p&gt;Before testing, decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which devices or resources are in scope.&lt;/li&gt;
&lt;li&gt;Which status, logs, and configuration information the operator needs.&lt;/li&gt;
&lt;li&gt;Which information or resource scopes must remain inaccessible.&lt;/li&gt;
&lt;li&gt;Which operations are prohibited, such as configuration changes, saving changes, restarting, or user administration.&lt;/li&gt;
&lt;li&gt;Which management interfaces are actually provided: CLI, GUI, or API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read-only does not necessarily mean permission to read every piece of information. A read operation can still expose sensitive information or impose processing load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Translate the requirement into operations before deriving tests from the role name.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“Can view the status and necessary logs of the assigned resources” gives us a more useful scope than “has read-only access.”&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Do not try a dangerous operation because it “should be denied”
&lt;/h2&gt;

&lt;p&gt;This needs to come before the negative tests:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;For tests involving configuration changes, saving, restarting, or other potentially disruptive operations, establish the impact and recovery procedure if the operation succeeds. Use a suitable test environment. Do not try a dangerous operation on a production device on the assumption that it will be rejected.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are testing whether the permission control is correct. If it is wrong, the action may go through.&lt;/p&gt;

&lt;p&gt;If the device restarts at that moment, we will certainly have a test result. We will also have another problem.&lt;/p&gt;

&lt;p&gt;Before testing a change, identify the test resource, possible impact, recovery method, and stop conditions. If an operation cannot be tested safely, record why it was not performed and what remains unverified.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. An error message does not automatically mean “Pass”
&lt;/h2&gt;

&lt;p&gt;You attempt a prohibited operation. An error appears.&lt;/p&gt;

&lt;p&gt;That looks promising. But what if you simply mistyped the command?&lt;/p&gt;

&lt;p&gt;A syntax error does not prove that authorization would reject a valid operation.&lt;/p&gt;

&lt;p&gt;The following are illustrative interpretations, not actual test results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;What the evidence supports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A valid operation is rejected for insufficient permissions, and the target is unchanged&lt;/td&gt;
&lt;td&gt;Denial was verified for that operation under those test conditions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The input produces a syntax error&lt;/td&gt;
&lt;td&gt;The attempted operation was invalid. Permission-based denial remains unverified.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The connection drops before execution&lt;/td&gt;
&lt;td&gt;There is a connection or processing problem. This is not evidence of authorization denial.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A change button is hidden&lt;/td&gt;
&lt;td&gt;That screen hides the button. Other management paths remain unverified.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization permits the operation, but execution fails for another reason&lt;/td&gt;
&lt;td&gt;The operation was not stopped by the permission control.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If button visibility is itself a requirement, testing it can satisfy that requirement. It does not establish that the same change is impossible through another interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Separate what failed from why it failed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use an operation valid for the product, identify the reason for rejection, and check the target's state. “An error appeared” is too broad an acceptance criterion.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. “Cannot deploy” and “cannot edit” are different restrictions
&lt;/h2&gt;

&lt;p&gt;Cisco NDFC provides a useful documented example.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;NDFC 12.2.2/12.2.3&lt;/strong&gt; guide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network Operator&lt;/strong&gt; can view configuration information but cannot change expected switch configurations or deploy them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Stager&lt;/strong&gt; can prepare configuration changes inside NDFC but cannot deploy them to switches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Stager deployment restriction includes deployment-related Web UI and REST API actions. These are NDFC application roles; do not assume that a similarly named device role behaves identically. &lt;a href="https://www.cisco.com/c/en/us/td/docs/dcn/ndfc/1222/articles/ndfc-add-switches-lan/add-switches-for-lan-operational-mode.html" rel="noopener noreferrer"&gt;Cisco NDFC role documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A result of “could not deploy to the switch” does not tell us whether the user could edit configuration intent inside the management system.&lt;/p&gt;

&lt;p&gt;Editing in the interface, saving in the management system, and applying to a device may be separate operations. Test the stages your requirements prohibit.&lt;/p&gt;

&lt;p&gt;This example is scoped to the documented NDFC versions. Do not transfer it unchanged to another product or release.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Connect the operation, permission decision, and actual outcome
&lt;/h2&gt;

&lt;p&gt;“Changes blocked: OK” is not a useful record when someone later asks what happened.&lt;/p&gt;

&lt;p&gt;Which operation? Which user? Did a permission check reject it? Was the target actually unchanged?&lt;/p&gt;

&lt;p&gt;Keep these pieces of evidence connected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target, management interface, user, and applied permissions.&lt;/li&gt;
&lt;li&gt;Exact operation and arguments, execution time, and device or UI response.&lt;/li&gt;
&lt;li&gt;The corresponding authorization decision, or evidence of the device's own permission enforcement.&lt;/li&gt;
&lt;li&gt;The target-state check and the location of the supporting evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the device requests per-command authorization from ISE, trace the corresponding request and authorization result.&lt;/p&gt;

&lt;p&gt;If the device enforces an assigned role locally, check the assigned role and the device's execution results and audit records.&lt;/p&gt;

&lt;p&gt;ISE provides separate TACACS authentication, authorization, accounting, and command-accounting reports. Choose records appropriate to the control method and the accounting actually configured. &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_device_admin.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5: Monitor Device Administration Activity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do not make “every operation appears in ISE command authorization logs” a universal acceptance criterion for every product. Do not assume that every denied operation produces a command-accounting record either.&lt;/p&gt;

&lt;p&gt;Correlate the target and operation as well as the time and username.&lt;/p&gt;

&lt;p&gt;Here is a &lt;strong&gt;fictional example&lt;/strong&gt; of a test record:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; Lab resource A, accessed through the GUI with the read-only test account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operation:&lt;/strong&gt; Attempt a valid change to a setting that the requirements prohibit this account from changing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Rejected for insufficient permissions. Verified that the setting remained unchanged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence:&lt;/strong&gt; The operation's UI response, the corresponding audit record, and the before/after setting checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope of conclusion:&lt;/strong&gt; This user, resource, interface, and operation. CLI and API checks are separate test items.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For an actual record, fill in the timestamp, evidence IDs, exact setting, and other identifying details required by the test plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Keep untested scope out of the pass result
&lt;/h2&gt;

&lt;p&gt;A CLI test is not a GUI test or an API test.&lt;/p&gt;

&lt;p&gt;For each management path that is provided and used, verify the necessary read operations and the prohibited actions. You do not need to enable an unused management interface just to test it.&lt;/p&gt;

&lt;p&gt;If permissions have recently changed, record the session state too. Whether a permission change affects an existing session, and when, depends on the product. Keep those results distinct from tests using a new session.&lt;/p&gt;

&lt;p&gt;Finally, do not turn every empty cell into “OK.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not performed:&lt;/strong&gt; Record the reason and the conditions needed to run it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not applicable:&lt;/strong&gt; Explain why the item is outside the relevant scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconclusive:&lt;/strong&gt; Record the missing evidence needed for a decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want the test plan to show &lt;strong&gt;how far the verification actually goes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Can log in. Can read what is needed. Cannot make prohibited changes.&lt;/p&gt;

&lt;p&gt;Separating those three questions gives us something concrete to write after “Read-only login: successful.”&lt;/p&gt;

&lt;h2&gt;
  
  
  A sample worksheet
&lt;/h2&gt;

&lt;p&gt;I have published a &lt;a href="https://note.com/nw_field_memo/n/n980e683d7854" rel="noopener noreferrer"&gt;free TACACS+ test checklist sample in Japanese&lt;/a&gt; for turning these ideas into test items.&lt;/p&gt;

&lt;p&gt;It covers five basic CLI administration checks. It is a test-design template that has &lt;strong&gt;not been validated on actual devices&lt;/strong&gt;, not a ready-made certification of your environment. Adapt the operations, acceptance criteria, and evidence to the target equipment. GUI and API tests need separate design.&lt;/p&gt;

&lt;p&gt;For troubleshooting restrictions that are not behaving as intended, see &lt;a href="https://dev.to/nw_field_memo/cisco-ise-command-sets-not-working-check-authorization-before-your-deny-rules-2on0"&gt;Cisco ISE Command Sets Not Working? Check Authorization Before Your Deny Rules&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The examples in this article were created for explanation and are not reported results from tests performed on actual equipment. Product-specific statements are limited to the versions identified in the linked documentation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>security</category>
      <category>testing</category>
    </item>
    <item>
      <title>Cisco ISE Command Sets Not Working? Check Authorization Before Your Deny Rules</title>
      <dc:creator>NW Field Memo</dc:creator>
      <pubDate>Mon, 07 Sep 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/nw_field_memo/cisco-ise-command-sets-not-working-check-authorization-before-your-deny-rules-2on0</link>
      <guid>https://dev.to/nw_field_memo/cisco-ise-command-sets-not-working-check-authorization-before-your-deny-rules-2on0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Boss: “No overtime. (But finish the work.)”&lt;/p&gt;

&lt;p&gt;Me, a lowly network engineer: “Understood. (Overtime wouldn't be enough anyway.)”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hi, I'm Goda, the network engineer behind NW Field Memo.&lt;/p&gt;

&lt;p&gt;When you work with TACACS+ authorization in Cisco ISE, you come across &lt;strong&gt;Command Sets&lt;/strong&gt;. Put simply, they let you define which commands to allow and which to deny.&lt;/p&gt;

&lt;p&gt;My first impression was straightforward:&lt;/p&gt;

&lt;p&gt;Create a Command Set for a read-only user → allow the required &lt;code&gt;show&lt;/code&gt; commands → select it in the authorization policy → read-only access, done.&lt;/p&gt;

&lt;p&gt;It turned out to be less straightforward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating a Command Set does not prove that an operation is being controlled by it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the order I use to investigate when an ISE Command Set does not restrict an operation as expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a Command Set actually do?
&lt;/h2&gt;

&lt;p&gt;A Command Set is an authorization result used in ISE Device Administration. It defines permit/deny decisions for commands.&lt;/p&gt;

&lt;p&gt;An illustrative policy might allow &lt;code&gt;show&lt;/code&gt; and &lt;code&gt;ping&lt;/code&gt;, while denying &lt;code&gt;configure&lt;/code&gt; and &lt;code&gt;reload&lt;/code&gt;. This is a conceptual example, not a complete read-only policy or a configuration to copy into production.&lt;/p&gt;

&lt;p&gt;The key dependency is the network device: &lt;strong&gt;it must request command authorization from ISE for the operation you want to control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is tempting to jump straight to the ISE configuration screen. I certainly did. But first, separate two questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Can I log in?” and “Can I run this command?” are different questions
&lt;/h2&gt;

&lt;p&gt;TACACS+ separates the three parts of AAA:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Who are you?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorization&lt;/td&gt;
&lt;td&gt;What are you allowed to do?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accounting&lt;/td&gt;
&lt;td&gt;What did you do?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A successful login with an ISE user does &lt;strong&gt;not&lt;/strong&gt; demonstrate that Command Set authorization works.&lt;/p&gt;

&lt;p&gt;A simplified authentication flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User attempts to log in
  → Network device asks ISE to authenticate the user
  → Authentication succeeds
  → User logs in
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Command authorization involves another decision:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User enters a command, such as show running-config
  → Network device asks ISE whether that command is allowed
  → ISE returns a permit/deny decision
  → Network device handles the operation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are simplified flows, not packet traces. The point is that the first successful exchange does not prove the second exchange happened. &lt;a href="https://www.rfc-editor.org/rfc/rfc8907.html" rel="noopener noreferrer"&gt;RFC 8907&lt;/a&gt; defines authentication, authorization, and accounting separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make “the Command Set doesn't work” more specific
&lt;/h2&gt;

&lt;p&gt;These observations are different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prohibited CLI command ran.&lt;/li&gt;
&lt;li&gt;A user could change a setting in the GUI.&lt;/li&gt;
&lt;li&gt;A configuration page opened.&lt;/li&gt;
&lt;li&gt;A change button could be clicked.&lt;/li&gt;
&lt;li&gt;The change was actually saved or applied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start by recording &lt;strong&gt;what the user did, what should have happened, and what actually happened&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A read-only user logged in through the CLI. The user entered &lt;code&gt;configure terminal&lt;/code&gt;. It was expected to be denied, but the device accepted it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives you something concrete to trace. Also record the product, OS version, and access method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before editing the Command Set, find the authorization request
&lt;/h2&gt;

&lt;p&gt;This is the main point of this article.&lt;/p&gt;

&lt;p&gt;When a prohibited command runs, it is tempting to think, “Maybe I wrote the Deny rule incorrectly,” and immediately edit the Command Set.&lt;/p&gt;

&lt;p&gt;Before doing that, ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did ISE receive a command authorization request for that operation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the operation is not being submitted to ISE for command authorization, rewriting its Command Set cannot control that operation.&lt;/p&gt;

&lt;p&gt;A useful sequence is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the exact operation being tested.&lt;/li&gt;
&lt;li&gt;Find its corresponding authorization request in ISE.&lt;/li&gt;
&lt;li&gt;Check which authorization policy rule matched.&lt;/li&gt;
&lt;li&gt;Check which Command Sets were selected.&lt;/li&gt;
&lt;li&gt;Then inspect the Command Set rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When reproducing an operation, use an authorized test environment and consider what happens if the operation succeeds. The read-only testing section below explains why this matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  “I cannot find a request” does not immediately mean “unsupported”
&lt;/h2&gt;

&lt;p&gt;An authorization record may be missing from the logs you are looking at. That alone does not prove that the product lacks command authorization support.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether command authorization is configured on the device.&lt;/li&gt;
&lt;li&gt;Whether you are tracing the same user and session.&lt;/li&gt;
&lt;li&gt;Whether the log type, time range, and filters are correct.&lt;/li&gt;
&lt;li&gt;Whether that access method and operation use command authorization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“I could not find the log entry” is an observation.&lt;/p&gt;

&lt;p&gt;“This product does not support that function” is a conclusion that requires further investigation.&lt;/p&gt;

&lt;p&gt;Keeping those separate also makes a TAC case much easier to write.&lt;/p&gt;

&lt;h2&gt;
  
  
  TACACS Profiles and Command Sets are different, too
&lt;/h2&gt;

&lt;p&gt;A simplified distinction is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TACACS Profile:&lt;/strong&gt; returns session attributes or privilege information for the device to interpret.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Sets:&lt;/strong&gt; determine whether a requested command is permitted or denied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different products may use privilege levels, roles, or vendor-specific attributes. A profile named “Read-Only” is not proof of read-only behavior.&lt;/p&gt;

&lt;p&gt;You need to understand &lt;strong&gt;how that device interprets the returned attributes and which authorization mechanisms it uses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I plan to cover privilege levels, roles, and custom attributes separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Once the right Command Sets are selected, inspect their evaluation
&lt;/h2&gt;

&lt;p&gt;Suppose the request arrived and the expected policy and Command Sets were selected. Now examine the command and arguments the device actually sent.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_device_admin.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5 guide&lt;/a&gt;, the &lt;strong&gt;Command&lt;/strong&gt; field uses wildcard matching, while &lt;strong&gt;Arguments&lt;/strong&gt; uses regular expressions.&lt;/p&gt;

&lt;p&gt;Do not assume the same expression means the same thing in both fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  An ordinary Deny does not always win across multiple Command Sets
&lt;/h3&gt;

&lt;p&gt;Imagine two sets are evaluated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set A returns an ordinary &lt;strong&gt;Deny&lt;/strong&gt; for a command.&lt;/li&gt;
&lt;li&gt;Set B returns &lt;strong&gt;Permit&lt;/strong&gt; for the same request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is easy to assume that A must win. That is not how the documented multi-set evaluation works.&lt;/p&gt;

&lt;p&gt;In brief:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A matching &lt;strong&gt;Deny Always&lt;/strong&gt; takes precedence.&lt;/li&gt;
&lt;li&gt;Without one, a &lt;strong&gt;Permit&lt;/strong&gt; from any evaluated set allows the command.&lt;/li&gt;
&lt;li&gt;Otherwise, it is denied, subject to the unmatched-command permission setting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within a set, matching and rule order also matter. Inspect the actual request and the complete combination of sets.&lt;/p&gt;

&lt;p&gt;The answer is not to replace every Deny with Deny Always. First determine what matched, what permitted the request, and whether permission for unmatched commands affected the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  GUI access may use a different authorization mechanism
&lt;/h2&gt;

&lt;p&gt;Restricting commands in the CLI does not prove that the same account is read-only in the GUI.&lt;/p&gt;

&lt;p&gt;Cisco's &lt;a href="https://www.cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/214490-configure-radius-and-tacacs-for-gui-and.html" rel="noopener noreferrer"&gt;Catalyst 9800 configuration article&lt;/a&gt;, based on &lt;strong&gt;C9800-CL 17.9.2 and ISE 3.2.0&lt;/strong&gt;, documents these WebUI restrictions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privilege levels 1–14 can access only the Monitor tab.&lt;/li&gt;
&lt;li&gt;Privilege level 15 provides full access.&lt;/li&gt;
&lt;li&gt;Using privilege level 15 with a restricted Command Set to enforce WebUI read-only access is unsupported; configuration changes may still be possible through the WebUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a very different situation from a typo in a Command Set.&lt;/p&gt;

&lt;p&gt;Do not generalize the example to every WLC, release, or access method. Check support at the level of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product × OS version × access method (CLI, GUI, API, and so on).&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My troubleshooting checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you have established&lt;/th&gt;
&lt;th&gt;What to check next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TACACS+ login succeeds&lt;/td&gt;
&lt;td&gt;Authorization request for the target operation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No corresponding authorization request is visible&lt;/td&gt;
&lt;td&gt;Device configuration, supported method, and log filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An unexpected policy rule matched&lt;/td&gt;
&lt;td&gt;Policy conditions and evaluation order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The expected policy rule matched&lt;/td&gt;
&lt;td&gt;Selected Profile / Command Sets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The expected Command Sets were selected, but the operation was allowed&lt;/td&gt;
&lt;td&gt;Command, Arguments, multiple-set evaluation, and unmatched-command handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The CLI is restricted, but the GUI allows changes&lt;/td&gt;
&lt;td&gt;GUI authorization mechanism and product documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISE shows Deny, but the operation appears to have succeeded&lt;/td&gt;
&lt;td&gt;Same operation and session? Was a change actually applied?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This turns “Command Sets don't work!” into something closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The authorization request reaches ISE and matches the expected rule, but the result of evaluating multiple Command Sets differs from what we intended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is easier to investigate—and easier for TAC to respond to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same principle applies to read-only testing
&lt;/h2&gt;

&lt;p&gt;If the goal is a read-only account, successful login is not the end of the test.&lt;/p&gt;

&lt;p&gt;Check both sides:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operations that should work&lt;/th&gt;
&lt;th&gt;Operations that should be denied&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Required show commands&lt;/td&gt;
&lt;td&gt;Configuration changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Troubleshooting checks&lt;/td&gt;
&lt;td&gt;Reloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required log access&lt;/td&gt;
&lt;td&gt;Saving configuration or changing users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Choose the actual test cases from your requirements and the product's supported controls. This table is illustrative, not a universal permissions list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For tests involving configuration changes, saving, or reloading, assess the impact and recovery procedure in case the operation is unexpectedly allowed. Use a lab or another authorized test environment. Do not try such operations on production equipment on the assumption that “they should be denied.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If people use both the CLI and GUI, test each access method.&lt;/p&gt;

&lt;p&gt;The next topic in this series is why “the read-only user can log in” is not enough to finish an access-control test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the operation, not just the configuration screen
&lt;/h2&gt;

&lt;p&gt;The lesson I took from working with Command Sets was simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“I created the configuration” and “that configuration controls this operation” are different claims.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before changing Permit/Deny rules, work through these questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What operation was unexpectedly allowed?&lt;/li&gt;
&lt;li&gt;Did its authorization request reach ISE?&lt;/li&gt;
&lt;li&gt;Which policy rule matched?&lt;/li&gt;
&lt;li&gt;Which Profile / Command Sets were selected?&lt;/li&gt;
&lt;li&gt;What command and arguments did the device send?&lt;/li&gt;
&lt;li&gt;How were multiple Command Sets evaluated?&lt;/li&gt;
&lt;li&gt;Does that access method use the mechanism you are investigating?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Looking only at the Command Set configuration screen cannot answer all of them.&lt;/p&gt;

&lt;p&gt;That is this week's field memo.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href="https://dev.to/nw_field_memo/snmpwalk-works-is-your-monitoring-actually-ready-51m5"&gt;snmpwalk Works. Is Your Monitoring Actually Ready?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original Japanese article:&lt;/strong&gt; &lt;a href="https://note.com/nw_field_memo/n/n4ee634b3970d" rel="noopener noreferrer"&gt;ISEでCommand Setsを作ったのに効かない？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is an English adaptation of my Japanese article, prepared with AI translation assistance. Examples are generalized and contain no customer configurations or logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Official references
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_device_admin.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5 — Device Administration&lt;/a&gt;: Command Sets, matching, evaluation, and TACACS Profiles.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rfc-editor.org/rfc/rfc8907.html" rel="noopener noreferrer"&gt;RFC 8907 — TACACS+&lt;/a&gt;: authentication, authorization, and accounting.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.cisco.com/c/en/us/support/docs/wireless/catalyst-9800-series-wireless-controllers/214490-configure-radius-and-tacacs-for-gui-and.html" rel="noopener noreferrer"&gt;Cisco — Configure RADIUS &amp;amp; TACACS+ for GUI &amp;amp; CLI Authentication on Catalyst 9800 WLCs&lt;/a&gt;: the version-specific WebUI example.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Support and behavior depend on the product, OS version, and access method. Check the official documentation for the version you actually use.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>security</category>
      <category>beginners</category>
    </item>
    <item>
      <title>snmpwalk Works. Is Your Monitoring Actually Ready?</title>
      <dc:creator>NW Field Memo</dc:creator>
      <pubDate>Sun, 06 Sep 2026 09:17:12 +0000</pubDate>
      <link>https://dev.to/nw_field_memo/snmpwalk-works-is-your-monitoring-actually-ready-51m5</link>
      <guid>https://dev.to/nw_field_memo/snmpwalk-works-is-your-monitoring-actually-ready-51m5</guid>
      <description>&lt;p&gt;&lt;em&gt;Adapted from &lt;a href="https://note.com/nw_field_memo/n/n543cd0eb4a7d" rel="noopener noreferrer"&gt;my original Japanese article&lt;/a&gt;, with AI-assisted translation and editing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My manager: “Test this device.” (Doesn't really know the product or the technology.)&lt;/p&gt;

&lt;p&gt;Me: “Sure.” (Also doesn't really know the product or the technology.)&lt;/p&gt;

&lt;p&gt;If you've worked in infrastructure, that may sound familiar. I'm Goda, a network engineer sharing things I learned while figuring out the job.&lt;/p&gt;

&lt;p&gt;SNMP comes up in a lot of network device testing. For a while, my idea of an SNMP test was simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;snmpwalk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Watch a pile of OIDs and values scroll past.&lt;/li&gt;
&lt;li&gt;Mark SNMP as working.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A screen full of output is reassuring. It certainly &lt;em&gt;looks&lt;/em&gt; like something is being monitored.&lt;/p&gt;

&lt;p&gt;Then I was asked to write a test plan for a device. I added an item along the lines of “Confirm that information can be retrieved using SNMP” and sent it for review.&lt;/p&gt;

&lt;p&gt;The feedback was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which OIDs will you use for CPU and memory?&lt;/p&gt;

&lt;p&gt;The customer will probably ask. You should at least cover those.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was when it clicked: &lt;strong&gt;a successful walk and successful retrieval of the metrics we need are two different things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;My other thought was, “Fine, you write the test plan, then.”&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;But the feedback was fair. Getting &lt;em&gt;something&lt;/em&gt; back is not the same as getting what you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did the successful walk actually prove?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;snmpwalk&lt;/code&gt; is useful. Net-SNMP's tool uses GETNEXT requests to walk through a subtree starting from a specified OID. &lt;a href="https://www.net-snmp.org/docs/man/snmpwalk.html" rel="noopener noreferrer"&gt;Net-SNMP manual&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it successfully returns values, you've established that &lt;strong&gt;you could read those values under those test conditions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That matters. It does not, by itself, establish that your CPU and memory monitoring requirements are satisfied, or that every required OID is available.&lt;/p&gt;

&lt;p&gt;I had been treating a successful command as a much broader result than it actually was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break “SNMP testing” into specific checks
&lt;/h2&gt;

&lt;p&gt;Today, I'd separate at least these questions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can I communicate over SNMP?&lt;/td&gt;
&lt;td&gt;Whether the device responds to the intended request under the defined conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can I monitor CPU?&lt;/td&gt;
&lt;td&gt;The processor or resource being measured, the meaning of the value, and its averaging period&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can I monitor memory?&lt;/td&gt;
&lt;td&gt;The resource being measured, its units, and any required conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can the monitoring server collect the data?&lt;/td&gt;
&lt;td&gt;Results from the actual monitoring server and monitoring application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can I receive the required trap?&lt;/td&gt;
&lt;td&gt;The notification produced by the relevant event and its documented trigger conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“SNMP polling: &lt;code&gt;snmpwalk&lt;/code&gt; returns values” leaves a lot of room for interpretation.&lt;/p&gt;

&lt;p&gt;It can be a perfectly reasonable connectivity check if you define its scope. If the goal includes CPU or memory monitoring, the acceptance criteria need to go further.&lt;/p&gt;

&lt;h2&gt;
  
  
  A number needs a definition
&lt;/h2&gt;

&lt;p&gt;Suppose you retrieve:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;123456
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What does it mean? Which resource does it describe? What are the units? Is it an instantaneous measurement or an average?&lt;/p&gt;

&lt;p&gt;The following examples use HOST-RESOURCES-MIB to illustrate why those questions matter. Check what your actual device and software release support.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hrProcessorLoad&lt;/code&gt; reports an individual processor's non-idle time as a percentage, averaged over roughly the preceding minute. It is not simply an instantaneous, whole-device CPU percentage. The definition permits implementations to approximate that averaging period. &lt;a href="https://www.rfc-editor.org/rfc/rfc2790.html" rel="noopener noreferrer"&gt;RFC 2790&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it differs from the number on the device's GUI, first ask whether both displays measure the same thing over the same period.&lt;/p&gt;

&lt;p&gt;For memory, &lt;code&gt;hrStorageUsed&lt;/code&gt; is a count of allocation units. To express usage in bytes, multiply it by &lt;code&gt;hrStorageAllocationUnits&lt;/code&gt; from the &lt;strong&gt;same table row&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Used bytes = allocation units in use × bytes per allocation unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You also need to identify whether that row represents the memory area you intended to monitor. A readable OID is not enough; the interpretation needs to be right. &lt;a href="https://www.rfc-editor.org/rfc/rfc2790.html" rel="noopener noreferrer"&gt;RFC 2790&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My laptop can read it. Can the monitoring server?
&lt;/h2&gt;

&lt;p&gt;These are separate checks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My laptop can retrieve the value.&lt;/li&gt;
&lt;li&gt;The actual monitoring server can retrieve the value.&lt;/li&gt;
&lt;li&gt;The monitoring application records it.&lt;/li&gt;
&lt;li&gt;The application displays it as the metric we intended.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Don't sign off on more than your evidence supports.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A successful walk from a laptop does not establish that the monitoring system is working end to end.&lt;/p&gt;

&lt;p&gt;That doesn't mean every device test has to cover the entire monitoring system. It means the test plan should state what this test covers, and what belongs to a later test or another team.&lt;/p&gt;

&lt;p&gt;If end-to-end monitoring is in scope, the requirements may also call for checking threshold evaluation and alert delivery.&lt;/p&gt;

&lt;p&gt;Network conditions matter, too. A laptop on the device's subnet and a monitoring server that reaches it through a router do not necessarily exercise the same path or access controls. Success from one does not prove access from the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polling and traps need separate tests
&lt;/h2&gt;

&lt;p&gt;Polling is the monitoring side asking, “What's the current value?”&lt;/p&gt;

&lt;p&gt;A trap is the device reporting, “This event happened.”&lt;/p&gt;

&lt;p&gt;Retrieval requests and SNMPv2 traps are distinct protocol operations. Reading an OID successfully does not prove that a trap exists for that condition, or that the device will send it in your test. &lt;a href="https://www.rfc-editor.org/rfc/rfc3416.html" rel="noopener noreferrer"&gt;RFC 3416&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need to check whether the product implements the notification and what triggers it.&lt;/p&gt;

&lt;p&gt;Cisco ISE provides a useful documented example. The &lt;strong&gt;ISE 3.5&lt;/strong&gt; administration guide explains that manually stopping a process also stops Monit's monitoring of that process, so that operation does not produce the process-stop trap. It describes the trap as applying to an unexpected process stop that is not automatically recovered. &lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_troubleshooting.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5: Process-Monitoring SNMP Traps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So “I stopped the process and received no trap” is not enough to conclude that SNMP is broken.&lt;/p&gt;

&lt;p&gt;This is an example from the ISE 3.5 documentation, not a rule for every product, release, or trap. Match your test to the documented behavior of the version you're testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I'd write the test items now
&lt;/h2&gt;

&lt;p&gt;My old test item was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SNMP polling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confirm that &lt;code&gt;snmpwalk&lt;/code&gt; returns values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'd now separate it into more specific checks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CPU monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Retrieve the CPU-related metrics used by the monitoring design. Confirm that the measured resource, the meaning of the value, and the averaging period match that design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Retrieve the memory-related metrics used by the monitoring design. Confirm that the resource, units, and any required conversion match that design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring system collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Collect the required metrics through the actual monitoring system and confirm that they are recorded and displayed as intended.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the design specifies the OIDs, include them in the test plan. For table values, also record which instances to use and how to identify them.&lt;/p&gt;

&lt;p&gt;That gives you an answer when someone later asks, “What exactly did we verify?”&lt;/p&gt;

&lt;h2&gt;
  
  
  A successful command is one piece of evidence
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;snmpwalk&lt;/code&gt; returns data. A ping succeeds. An SSH login works.&lt;/p&gt;

&lt;p&gt;Each result is useful. Whether it is enough depends on the purpose of the test.&lt;/p&gt;

&lt;p&gt;For monitoring, the question is whether we can monitor the things we're supposed to monitor. Anything outside the current test's scope should be explicitly handed over to the next test or the responsible team.&lt;/p&gt;

&lt;p&gt;It sounds obvious now. I didn't really understand it until I had to write the test plan myself.&lt;/p&gt;

&lt;p&gt;If your current SNMP test plan is basically “run a walk and see what happens,” I hope this gives you a few useful questions to add.&lt;/p&gt;

&lt;p&gt;A related topic I plan to write about is whether knowing an OID tells you anything about the traps a device can send. That's another distinction I initially missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.net-snmp.org/docs/man/snmpwalk.html" rel="noopener noreferrer"&gt;Net-SNMP: snmpwalk manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc2790.html" rel="noopener noreferrer"&gt;RFC 2790: Host Resources MIB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc3416.html" rel="noopener noreferrer"&gt;RFC 3416: SNMP protocol operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisco.com/c/en/us/td/docs/security/ise/3-5/admin_guide/b_ise_admin_3_5/b_ISE_admin_troubleshooting.html" rel="noopener noreferrer"&gt;Cisco ISE 3.5 Administration Guide: Troubleshoot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>networking</category>
      <category>monitoring</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
