Compare commits

...

3 commits

Author SHA1 Message Date
513e2810c9 Remove inventory wrapper for ansible-vault secrets
We don’t use them anymore and also the PR has been merged.
2025-10-22 14:46:38 +02:00
07264e6d90 access: prettify SNMP hashgen command and don’t log passwords 2025-10-22 14:28:16 +02:00
7a2223ea71 access: limit OIDs exposed over SNMP
Define a custom SNMP group with read access only to fields we need.

For D-Link switches, modifying the group must be handled the same as
user, i.e. the group (and user) must be removed and readded.

Untested for FS S5800.
2025-10-22 14:27:12 +02:00
7 changed files with 77 additions and 29 deletions

View file

@ -1,11 +0,0 @@
#!/bin/sh
# use this wrapper as your inventory if you have ansible-vault secrets in some config context
# thank you Dameon Wagner you magnificent beast
# https://github.com/netbox-community/ansible_modules/discussions/551
# remove this file if/when this gets to your computer
# https://github.com/netbox-community/ansible_modules/pull/1114
ANSIBLE_ASK_VAULT_PASS=no ansible-inventory -i inventory.yml "${@}"

View file

@ -4,22 +4,43 @@
- name: Generate SNMP passwords
delegate_to: localhost
command: 'snmpv3-hashgen --yaml --user {{ manager.snmp_user }} --auth {{ manager.snmp_pass }} --priv {{ manager.snmp_pass }} --hash sha1 --engine {{ snmp_engine_id }}'
command: >
snmpv3-hashgen --yaml
--engine {{ snmp_engine_id }}
--user {{ manager.snmp_user }}
--auth {{ manager.snmp_pass }}
--priv {{ manager.snmp_pass }}
--hash sha1
check_mode: false
changed_when: false
no_log: true
register: snmp_config
- name: Get SNMP password hash
set_fact:
snmp_hashes: '{{ (snmp_config.stdout | from_yaml).snmpv3.hashes }}'
- name: Get SNMP users
# check if the SNMP user and group we want to set differ from current switch config
# in this case we have to remove them before trying to chane password or settings
- name: Define SNMP user and group configuration commands
set_fact:
snmp_current: "{{ ansible_net_config | split('\n') | select('match', '^snmp-server user '+manager.snmp_user+' public v3') }}"
snmp_target: "snmp-server user {{ manager.snmp_user }} public v3 encrypted auth sha {{ snmp_hashes.auth }} priv {{ snmp_hashes.priv[:32] }} "
target_user: "snmp-server user {{ manager.snmp_user }} public v3 encrypted auth sha {{ snmp_hashes.auth }} priv {{ snmp_hashes.priv[:32] }} "
target_group: "snmp-server group public v3 priv read public "
- name: Get existing SNMP user and group entries from switch
set_fact:
current_user: "{{ ansible_net_config | split('\n')
| select('match', '^snmp-server user '+manager.snmp_user+' public v3') }}"
current_group: "{{ ansible_net_config | split('\n')
| select('match', '^snmp-server group public v3') }}"
- name: Check if existing SNMP user and/or group should be removed
set_fact:
remove_user: "{{ current_user and target_user is not in current_user }}"
remove_group: "{{ current_group and target_group is not in current_group }}"
- name: Remove existing SNMP user to reset password
when: 'snmp_current and snmp_target is not in snmp_current'
when: remove_user or remove_group # can’t change group with existing users
block:
- name: Remove SNMP user
ansible.netcommon.cli_config:
@ -27,10 +48,28 @@
notify: write config
- set_fact:
snmp_current: false
current_user: false
- name: Remove existing SNMP group to change parameters
when: remove_group
block:
- name: Remove existing SNMP group
ansible.netcommon.cli_config:
config: 'no snmp-server group public v3 priv'
notify: write config
- set_fact:
current_group: false
# create new SNMP user and group
- name: Create SNMP group and user
when: not current_group
ansible.netcommon.cli_config:
config: '{{ target_group }}'
notify: write config
- name: Create SNMP user
when: 'not snmp_current'
when: not current_user
ansible.netcommon.cli_config:
config: '{{ snmp_target }}'
config: '{{ target_user }}'
notify: write config

View file

@ -4,9 +4,16 @@
- name: Generate SNMP passwords
delegate_to: localhost
command: 'snmpv3-hashgen --yaml --user {{ manager.snmp_user }} --auth {{ manager.snmp_pass }} --priv {{ manager.snmp_pass }} --hash sha1 --engine {{ snmp_engine_id }}'
command: >
snmpv3-hashgen --yaml
--engine {{ snmp_engine_id }}
--user {{ manager.snmp_user }}
--auth {{ manager.snmp_pass }}
--priv {{ manager.snmp_pass }}
--hash sha1
check_mode: false
changed_when: false
no_log: true
register: snmp_config
- name: Get SNMP password hash

View file

@ -4,11 +4,11 @@
- name: Get existing SNMP users
set_fact:
snmp_current: "{{ ansible_net_config | split('\n') | select('match', '^snmp-server usm-user '+manager.snmp_user) }}"
snmp_target: "snmp-server usm-user {{ manager.snmp_user }} authentication sha {{ manager.snmp_pass }} privacy des {{ manager.snmp_pass }} "
current_user: "{{ ansible_net_config | split('\n') | select('match', '^snmp-server usm-user '+manager.snmp_user) }}"
target_user: "snmp-server usm-user {{ manager.snmp_user }} authentication sha {{ manager.snmp_pass }} privacy des {{ manager.snmp_pass }} "
- name: Remove existing SNMP user to reset password
when: "snmp_current and snmp_target is not in snmp_current"
when: "current_user and target_user is not in current_user"
block:
- name: Remove SNMP user
ansible.netcommon.cli_config:
@ -19,14 +19,14 @@
notify: write config
- set_fact:
snmp_current: false
current_user: false
- name: Create SNMP user
when: "not snmp_current"
when: "not current_user"
ansible.netcommon.cli_config:
config: "{{ item }}"
loop:
- "{{ snmp_target }}"
- "{{ target_user }}"
- "snmp-server group public user {{ manager.snmp_user }} security-model usm"
no_log: true
notify: write config

View file

@ -112,7 +112,11 @@ snmp-server name {{ inventory_hostname }}
snmp-server location {{ rack }}
{# SNMP engine ID must be exactly 24 hex digits #}
snmp-server engineID local {{ snmp_engine_id }}
snmp-server group public v3 priv read CommunityView
{# limit MIBs exposed over SNMP #}
snmp-server view public 1.3.6.1.2.1.1 included {# system +#}
snmp-server view public 1.3.6.1.2.1.2 included {# interfaces +#}
snmp-server view public 1.3.6.1.2.1.17.7 included {# qBridgeMIB +#}
snmp-server view public 1.3.6.1.2.1.31 included {# ifMIB +#}
sntp enable
{% for address in ntp %}

View file

@ -17,7 +17,11 @@ vlan database
snmp-server enable
snmp-server system-location {{ rack }}
snmp-server engineID {{ snmp_engine_id }}
snmp-server access public security-model usm priv read _all_
snmp-server view public included 1.3.6.1.2.1.1 {# system +#}
snmp-server view public included 1.3.6.1.2.1.2 {# interfaces +#}
snmp-server view public included 1.3.6.1.2.1.17.7 {# qBridgeMIB +#}
snmp-server view public included 1.3.6.1.2.1.31 {# ifMIB +#}
snmp-server access public security-model usm priv read public
{# sort to ensure LAG interfaces are added last #}
{% for iface in interfaces | sort(attribute="type.value") | sort(attribute="mgmt_only") %}

View file

@ -58,4 +58,9 @@ interface {{ iface.name }}
enable service snmp-agent
snmp-server location {{ rack }}
snmp-server group public v3 priv read default
{# limit MIBs exposed over SNMP #}
snmp-server view public 1.3.6.1.2.1.1 include {# system +#}
snmp-server view public 1.3.6.1.2.1.2 include {# interfaces +#}
snmp-server view public 1.3.6.1.2.1.17.7 include {# qBridgeMIB +#}
snmp-server view public 1.3.6.1.2.1.31 include {# ifMIB +#}
snmp-server group public v3 priv read public