Здесь все манипуляции проводятся на Debian Wheezy.
Установка net-snmp
root@deb# apt-get install snmp snmpd
snmp — SNMP (Simple Network Management Protocol) applications
snmpd — SNMP (Simple Network Management Protocol) agents
snmpd.conf — конфигурационный файл для Net-SNMP SNMP агента.
Редактируем файл /etc/snmp/snmpd.conf:
root@deb# nano /etc/snmp/snmpd.conf
Рестартуем демон snmpd:
root@deb# service snmpd restart
Проверяем (например):
root@deb# snmpwalk -v2c -c public localhost
Контроль доступа к snmpd можно организовать двумя способами:
- Traditional Access Control — традиционный контроль доступа
- VACM Configuration — View-Based Access Control Model
SNMPv1 и SNMPv2c
Традиционный контроль доступа
Создание read-only и read-write community:
rocommunity COMMUNITY [SOURCE [OID | -V VIEW [CONTEXT]]]
rwcommunity COMMUNITY [SOURCE [OID | -V VIEW [CONTEXT]]]
Создать read-only комьюнити с именем public, дать доступ ко всему дереву OID’ов, не ограничивая доступ к snmpd:
rocommunity public
Создать read-only комьюнити с именем public, дать доступ ко всему дереву OID’ов, разрешив доступ к snmpd только localhost:
rocommunity public localhost
Создать read-only комьюнити public, разрешить доступ с localhost’а к ветке .1.3.6.1.2.1.1:
rocommunity public localhost .1.3.6.1.2.1.1
Если нам нужно объединить несколько разных веток дерева OID’ов для одного community, используем именованые «view»:
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.2
rocommunity public localhost -V systemview
Если нужна более гибкое управление доступом к SNMP, следует использовать другую модель управления — VACM.
Контроль доступа VACM
Для того, чтобы настроить доступ к snmpd по модели VACM, необходимо определить 4 директивы:
- com2sec
- group
- view
- access
com2sec определяет некое имя (security name), к нему привязываются ip-адрес и комьюнити, с которыми можно получить доступ к snmpd:
com2sec [-Cn CONTEXT] SECNAME SOURCE COMMUNITY
SECNAME — security name;
SOURCE — имя хоста, ip-адрес хоста, или подсеть в формате ip/mask, с которого разрешен доступ к snmpd;
COMMUNITY — строка community;
CONTEXT — используется в SNMPv3
group определяет группу, к которой привязываются ранее созданные secname:
group GROUP {v1|v2c|usm|tsm|ksm} SECNAME
view определяет ветки дерева MIB, к которым будем давать доступ:
view VNAME TYPE OID [MASK]
VNAME — произвольное имя вьюшки. Имена могут повторятся, таким образом создается вьюшка в набором «веток» дерева OID’ов;
TYPE — included или excluded — действие: включить или исключить ветку с view;
OID — определенный OID или ветка;
access даем ранее созданной группе права на доступ к просмотру/записи определенной вьюшки — связка group — view:
access GROUP CONTEXT {any|v1|v2c|usm|tsm|ksm} LEVEL PREFX READ WRITE NOTIFY
GROUP — имя группы, определенное в шаге 2;
CONTEXT — default context — «»
Пример:
«Пользователь» local — это пользователь локалхоста с комьюнити secret33, который входит в группу rwgroup. Пользователи группы rwgroup имеют read-write права на view с названием all. Вьюшке all соответствует дерево .1.
«Пользователь» rouser1 может получить доступ с сети 10.10.10.0/24, а «пользователь» rouser2 — с ip-адреса 11.11.11.11/32. Комьюнити — public. «Пользователи» rouser1 и rouser2 входят в группу rogroup. Группа rogroup имеет read-only права на view с названием systemview, в которую входят такие ветки дерева — 1.3.6.1.2.1.1, 1.3.6.1.2.1.2, 1.3.6.1.2.1.25:
###############################################################################
# Access Control - VACM
###############################################################################
####
# First, map the "community name" into a "security name"
# sec.name source community
com2sec local localhost secret33
com2sec rouser1 10.10.10.0/24 public
com2sec rouser2 11.11.11.11/32 public
####
# Second, map the "security name" into a "group name":
# groupName securityModel securityName
group rwgroup v2c local
group rogroup v2c rouser1
group rogroup v2c rouser2
####
# Third, create a view for us to let the group have rights to:
# name incl/excl subtree mask(optional)
view all included .1
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.2
view systemview included .1.3.6.1.2.1.25
####
# Finally, grant the groups access to the view:
# group context sec.model sec.level prefix read write notif
access rwgroup "" any noauth exact all all none
access rogroup "" any noauth exact systemview none none
# -----------------------------------------------------------------------------
SNMPv3
В SNMPv3 главным действующим «лицом» выступает не community, а user. Поэтому перед манипуляциями с контролем доступа, нужно сначала создать пользователя. При создании пользователя, мы также определяем уровень безопасности.
В SNMPv3 предусмотрено три уровня безопасности:
- noAuthNoPriv — без аутентификации, без шифрования
- authNoPriv — с аутентификацией (SHA|MD5), без шифрования
- authPriv — с аутентификацией (SHA|MD5),с шифрованием (DES|AES)
Тип аутентификации — MD5 или SHA; Алгоритм шифрования — DES или AES;
SHA-аутентификация и DES/AES-шифрование используют OpenSSL — OpenSSL должен быть установлен, snmpd должен иметь поддержку OpenSSL.
Узнать, с какими опциями был собран net-snmp можно с помощью следующей команды:
root@deb# net-snmp-config --configure-options
Если —with-openssl в выводе есть, значит net-snmp собран с поддержкой openssl, если кто не догадался.
MD5 не использует OpenSSL.
Создание пользователя snmpv3
Для этого используется следующая команда:
net-snmp-config —create-snmpv3-user [-ro] [-A authpass] [-X privpass] [-a MD5|SHA] [-x DES|AES] [username]
Минимальная длина authpass и privpass — 8 символов.
Сначала останавливаем демон snmpd:
root@deb# service snmpd stop
Затем создаем пользователя, например, rouserv3:
root@deb# net-snmp-config --create-snmpv3-user -ro -A testtest -X testtest -a MD5 -x DES rouserv3
adding the following line to /var/lib/snmp/snmpd.conf:
createUser rouserv3 MD5 "testtest" DES testtest
adding the following line to /usr/share/snmp/snmpd.conf:
rouser rouserv3
При этом создается 2 записи в двух дефолтных конфигурационных файлах, о чем и пишет net-snmp-config в своем выводе. Если вы, не запуская snmpd, посмотрите на файл /var/lib/snmp/snmpd.conf, то в конце файла вы действительно увидите там строку «createUser rouserv3 MD5 «testtest» DES testtest». При запуске демона snmpd эта строка удаляется, появляется вместо нее ключ.
Запись «rouser rouserv3» в файле /usr/share/snmp/snmpd.conf — это настройка контроля доступа. Мало ведь создать пользователя, нужно дать ему какие-то права. Запись «rouser rouserv3» можно перенести в /etc/snmp/snmpd.conf (что я и делаю), а дальше использовать либо традиционный контроль доступа (оставив эту строку «rouser rouserv3»), либо VACM (по аналогии, как это настраивалось выше с SNMPv2c, только там были rocommunity и rwcommunity, а здесь rouser и rwuser).
Традиционный контроль доступа
Создание read-only и read-write-пользователя:
rouser USER [noauth|auth|priv [OID | -V VIEW [CONTEXT]]]
rwuser USER [noauth|auth|priv [OID | -V VIEW [CONTEXT]]]
noauth, auth, priv — помним про три уровня безопасности? было описано выше. Как по мне, так тут не хватает опции SOURCE, как в варианте в SNMP v1 и v2c с комьюнити. Для ограничения доступа с определенных ip-адресов нужно будет использовать фаервол. Ну и дальше примеры.
Дать пользователю rouser1 read-only права на ветку .1.3.6.1.2.1.1, без аутентификации и без шифрования:
rouser rouser1 noauth .1.3.6.1.2.1.1
Проверка:
root@deb# snmpwalk -v3 -u rouser1 -l noAuthNoPriv localhost
Дать пользователю rouser1 read-only права на ветку .1.3.6.1.2.1.1, с аутентификацией, но без шифрования:
rouser rouser1 auth .1.3.6.1.2.1.1
Проверка:
root@deb# snmpwalk -v3 -u rouser1 -l authNoPriv -a MD5 -A testtest localhost
Дать пользователю rouser1 read-only права на ветку .1.3.6.1.2.1.1, с аутентификацией и с шифрованием:
rouser rouser1 priv .1.3.6.1.2.1.1
Проверка:
root@deb# snmpwalk -v3 -u rouser1 -l authPriv -a MD5 -A testtest -x DES -X testtest localhost
Контроль доступа VACM
В варианте с SNMP v1 и v2c для настройки VACM нужно было использовать 4 директивы: com2sec, group, view и access. В варианте с SNMP v3 — только три, com2sec использовать не нужно, у нас уже создан snmpv3-пользователь (он уже и есть «security name»), которого можно добавить в группу.
###############################################################################
# Access Control - VACM for SNMPv3
###############################################################################
####
# First, создаем snmpv3-пользователей, как было описано выше.
####
# Second, map the "security name" into a "group name":
# groupName securityModel securityName
group rwgroup usm rwuser1
group rogroup usm rouser1
####
# Third, create a view for us to let the group have rights to:
# name incl/excl subtree mask(optional)
view all included .1
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.2
view systemview included .1.3.6.1.2.1.25
####
# Finally, grant the groups access to the view:
# group context sec.model sec.level prefix read write notif
access rwgroup "" any noauth exact all all none
access rogroup "" any priv exact systemview none none
Отличие от настройки VACM в SNMP v1 и v2c — это указание securityModel — usm в директве group и указани sec.level в директиве access (sec.level может быть noauth, auth или priv)
snmpwalk
Опрос оборудования с помощью утилиты snmpwalk для SNMPv3:
# snmpwalk -v3 -l authPriv -u username-SNMPv3 -a SHA -A authpassword -x AES -X encryptionpassword 10.10.10.10