NETBOX — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
 
(не показано 13 промежуточных версий этого же участника)
Строка 2: Строка 2:
  
  
'''PostgreSQL'''<br>
+
'''<font color=blue>PostgreSQL</font>'''<br>
  
 
Ставим БД, в данном случае версия 17
 
Ставим БД, в данном случае версия 17
 
  apt install -y postgresql
 
  apt install -y postgresql
 
  sudo -u postgres psql
 
  sudo -u postgres psql
 +
  
 
Создаём базу и пользователя
 
Создаём базу и пользователя
Строка 15: Строка 16:
 
  \connect netbox;
 
  \connect netbox;
 
  GRANT CREATE ON SCHEMA public TO netbox;
 
  GRANT CREATE ON SCHEMA public TO netbox;
 +
  
 
Проверяем подключение
 
Проверяем подключение
Строка 28: Строка 30:
  
  
Redis<br>
+
'''<font color=blue>Redis</font>'''<br>
  
Устанавливаем редис сервер
+
Устанавливаем redis-сервер
  
 
  apt install -y redis-server
 
  apt install -y redis-server
 +
  
 
Проверяем
 
Проверяем
Строка 41: Строка 44:
  
  
NetBox components<br>
+
'''<font color=blue>Компоненты Netbox</font>'''<br>
  
 
Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше
 
Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше
  
  
Устанавливаем зависимости
+
Ставим зависимости
 
  apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
 
  apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev
  
Строка 61: Строка 64:
  
 
Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.
 
Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.
 +
  
 
Создаём пользователя и даём ему права
 
Создаём пользователя и даём ему права
Строка 84: Строка 88:
  
  
ALLOWED_HOSTS
+
'''ALLOWED_HOSTS'''<br>
This is a list of the valid hostnames and IP addresses by which this server can be reached. You must specify at least one name or IP address. (Note that this does not restrict the locations from which NetBox may be accessed: It is merely for HTTP host header validation.)
+
Это список допустимых имен хостов и IP-адресов, с помощью которых можно получить доступ к этому серверу. Надо указать хотя бы одно имя или IP-адрес(Для проверки заголовка HTTP-узла)
 +
ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']
  
ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']
 
  
If you are not yet sure what the domain name and/or IP address of the NetBox installation will be, you can set this to a wildcard (asterisk) to allow all host values:
+
'''API_TOKEN_PEPPERS'''<br>
 +
Код который будет использоваться для генерации контрольных сумм API-токенов
 +
API_TOKEN_PEPPERS = {
 +
    # DO NOT USE THIS EXAMPLE PEPPER IN PRODUCTION
 +
    1: 'kp7ht*76fiQAhUiiop086HfASLlYUE_S^gI^(7J^K5M!LfoH@vl&b_',
 +
}
  
ALLOWED_HOSTS = ['*']
+
Можем использовать generate_secret_key.py скрипт для генерации случайного pepper
 +
python3 ../generate_secret_key.py
  
API_TOKEN_PEPPERS
 
Define at least one random cryptographic pepper, identified by a numeric ID starting at 1. This will be used to generate SHA256 checksums for API tokens.
 
  
API_TOKEN_PEPPERS = {
+
'''DATABASES'''<br>
    # DO NOT USE THIS EXAMPLE PEPPER IN PRODUCTION
+
Задаём параметры подключения к БД
    1: 'kp7ht*76fiQAhUi5dHfASLlYUE_S^gI^(7J^K5M!LfoH@vl&b_',
+
DATABASES = {
}
+
    'default': {
 +
        'NAME': 'netbox',              # Database name
 +
        'USER': 'netbox',              # PostgreSQL username
 +
        'PASSWORD': 'STronGPassWord',  # PostgreSQL password
 +
        'HOST': 'localhost',            # Database server
 +
        'PORT': '',                      # Database port (leave blank for default)
 +
        'CONN_MAX_AGE': 300,           # Max database connection age (seconds)
 +
    }
 +
}
  
tip
 
As with SECRET_KEY below, you can use the generate_secret_key.py script to generate a random pepper:
 
  
python3 ../generate_secret_key.py
+
'''REDIS'''<br>
 +
Задаём параметры подключения к redis-серверу
 +
REDIS = {
 +
    'tasks': {
 +
        'HOST': 'localhost',      # Redis server
 +
        'PORT': 6379,            # Redis port
 +
        'PASSWORD': '',          # Redis password (optional)
 +
        'DATABASE': 0,            # Database ID
 +
        'SSL': False,            # Use SSL (optional)
 +
    },
 +
    'caching': {
 +
        'HOST': 'localhost',
 +
        'PORT': 6379,
 +
        'PASSWORD': '',
 +
        'DATABASE': 1,            # Unique ID for second database
 +
        'SSL': False,
 +
    }
 +
}
  
DATABASES
+
'''SECRET_KEY'''<br>
This parameter holds the PostgreSQL database configuration details. The default database must be defined; additional databases may be defined as needed e.g. by plugins.
+
Создаём secret-key
 +
python3 ../generate_secret_key.py
  
A username and password must be defined for the default database. If the service is running on a remote host, update the HOST and PORT parameters accordingly. See the configuration documentation for more detail on individual parameters.
 
  
DATABASES = {
+
Пример конфига
    'default': {
+
ALLOWED_HOSTS = ['netbox.iwad.ru', '172.16.37.28', '172.16.37.10']
        'NAME': 'netbox',              # Database name
+
        'USER': 'netbox',              # PostgreSQL username
+
DATABASES = {
        'PASSWORD': 'J5brHrAXFLQSif0K', # PostgreSQL password
+
    'default': {
        'HOST': 'localhost',            # Database server
+
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
        'PORT': '',                    # Database port (leave blank for default)
+
        'NAME': 'netbox',        # Database name
        'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
+
        'USER': 'netbox',         # PostgreSQL username
    }
+
        'PASSWORD': 'PASSWORD',   # PostgreSQL password
}
+
        'HOST': 'localhost',      # Database server
 
+
        'PORT': '',              # Database port (leave blank for default)
REDIS
+
        'CONN_MAX_AGE': 300,      # Max database connection age
Redis is an in-memory key-value store used by NetBox for caching and background task queuing. Redis typically requires minimal configuration; the values below should suffice for most installations. See the configuration documentation for more detail on individual parameters.
+
    }
 
+
}
Note that NetBox requires the specification of two separate Redis databases: tasks and caching. These may both be provided by the same Redis service, however each should have a unique numeric database ID.
+
 
+
REDIS = {
REDIS = {
+
    'tasks': {
    'tasks': {
+
        'HOST': 'localhost',
        'HOST': 'localhost',      # Redis server
+
        'PORT': 6379,
        'PORT': 6379,            # Redis port
+
        'USERNAME': '',
        'PASSWORD': '',          # Redis password (optional)
+
        'PASSWORD': '',
        'DATABASE': 0,            # Database ID
+
        'DATABASE': 0,
        'SSL': False,            # Use SSL (optional)
+
        'SSL': False,
    },
+
    },
    'caching': {
+
    'caching': {
        'HOST': 'localhost',
+
        'HOST': 'localhost',
        'PORT': 6379,
+
        'PORT': 6379,
        'PASSWORD': '',
+
        'USERNAME': '',
        'DATABASE': 1,            # Unique ID for second database
+
        'PASSWORD': '',
        'SSL': False,
+
        'DATABASE': 1,
    }
+
        'SSL': False,
}
+
    }
 
+
}
SECRET_KEY
+
This parameter must be assigned a randomly-generated key employed as a salt for hashing and related cryptographic functions. (Note, however, that it is never directly used in the encryption of secret data.) This key must be unique to this installation and is recommended to be at least 50 characters long. It should not be shared outside the local system.
+
SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNn897gdfg0bs%P8bHzEYUw2xrg73Ja4'
 
+
A simple Python script named generate_secret_key.py is provided in the parent directory to assist in generating a suitable key:
+
# Optional settings  #
 
+
ADMINS = [
python3 ../generate_secret_key.py
+
    # ('John Doe', 'jdoe@example.com'),
 
+
]
 
+
<spoiler>
+
# Permit the retrieval of API tokens after their creation.
ALLOWED_HOSTS = ['netbox.iwad.ru', '172.16.37.28', '172.16.37.10']
+
ALLOW_TOKEN_RETRIEVAL = False
DATABASES = {
+
    'default': {
+
# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
+
# BASE_PATH = 'netbox/'
        'NAME': 'netbox',        # Database name
+
BASE_PATH = ''
        'USER': 'netbox',               # PostgreSQL username
+
        'PASSWORD': 'PASSWORD',           # PostgreSQL password
+
# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
        'HOST': 'localhost',      # Database server
+
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
        'PORT': '',              # Database port (leave blank for default)
+
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
        'CONN_MAX_AGE': 300,      # Max database connection age
+
CORS_ORIGIN_ALLOW_ALL = False
    }
+
CORS_ORIGIN_WHITELIST = [
}
+
  #    'https://hostname.example.com'',
 
+
]
REDIS = {
+
CORS_ORIGIN_REGEX_WHITELIST = [
    'tasks': {
+
    # r'^(https?://)?(\w+\.)?example\.com$',
        'HOST': 'localhost',
+
]
        'PORT': 6379,
+
        'USERNAME': '',
+
# The name to use for the CSRF token cookie.
        'PASSWORD': '',
+
#CSRF_COOKIE_NAME = 'csrftoken'
        'DATABASE': 0,
+
        'SSL': False,
+
CSRF_TRUSTED_ORIGINS = ['https://netbox.iwad.ru']
    },
+
    'caching': {
+
# Enable installed plugins. Add the name of each plugin to the list.
        'HOST': 'localhost',
+
PLUGINS = [
        'PORT': 6379,
+
#"netbox_ipcalculator",
        'USERNAME': '',
+
]
        'PASSWORD': '',
+
        'DATABASE': 1,
+
# Remote authentication support
        'SSL': False,
+
REMOTE_AUTH_ENABLED = False
    }
+
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
}
+
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
 
+
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNnR2r!uqV0bs%P8bHzEYUw2xrg73Ja4'
+
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
 
+
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
#   Optional settings  #
+
REMOTE_AUTH_AUTO_CREATE_USER = True
 
+
REMOTE_AUTH_DEFAULT_GROUPS = []
# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
+
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
# application errors (assuming correct email settings are provided).
 
ADMINS = [
 
    # ('John Doe', 'jdoe@example.com'),
 
]
 
 
 
# Permit the retrieval of API tokens after their creation.
 
ALLOW_TOKEN_RETRIEVAL = False
 
 
 
 
 
# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
 
# BASE_PATH = 'netbox/'
 
BASE_PATH = ''
 
 
 
# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
 
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
 
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
 
CORS_ORIGIN_ALLOW_ALL = False
 
CORS_ORIGIN_WHITELIST = [
 
#    'https://netbox.iwad.ru',
 
]
 
CORS_ORIGIN_REGEX_WHITELIST = [
 
    # r'^(https?://)?(\w+\.)?example\.com$',
 
]
 
 
 
# The name to use for the CSRF token cookie.
 
#CSRF_COOKIE_NAME = 'csrftoken'
 
 
 
CSRF_TRUSTED_ORIGINS = ['https://netbox.iwad.ru']
 
 
 
# Enable installed plugins. Add the name of each plugin to the list.
 
PLUGINS = [
 
#"netbox_ipcalculator",
 
]
 
 
 
# Remote authentication support
 
REMOTE_AUTH_ENABLED = True
 
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
 
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
 
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
 
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
 
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
 
REMOTE_AUTH_AUTO_CREATE_USER = True
 
REMOTE_AUTH_DEFAULT_GROUPS = []
 
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
 
 
 
</spoiler>
 
  
  
Строка 249: Строка 234:
  
  
NetBox работает как WSGI-приложение за HTTP-сервером. В этой документации показано, как установить и настроить uWSGI для этой роли, однако доступны и другие WSGI-серверы, которые должны работать аналогично.
+
Netbox работает как WSGI-приложение за HTTP-сервером. В нашем примере показано, как установить и настроить uWSGI для этой роли, однако доступны и другие WSGI-серверы, которые должны работать аналогично.
  
 
Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим pyuwsgi
 
Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим pyuwsgi
Строка 256: Строка 241:
  
  
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды:
+
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды
 
  echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt
 
  echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt
 
  
  
Строка 267: Строка 251:
 
Далее скопируем файлы systemd для управления uWSGI и фоновым рабочим процессом NetBox
 
Далее скопируем файлы systemd для управления uWSGI и фоновым рабочим процессом NetBox
 
  cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
 
  cp -v /opt/netbox/contrib/*.service /etc/systemd/system/
 +
  
 
Отредактируем файл netbox.service, удалив строку начинающуюся с ExecStart=/opt/netbox/venv/bin/gunicorn, и раскомментируем строку с ExecStart=/opt/netbox/venv/bin/uwsgi
 
Отредактируем файл netbox.service, удалив строку начинающуюся с ExecStart=/opt/netbox/venv/bin/gunicorn, и раскомментируем строку с ExecStart=/opt/netbox/venv/bin/uwsgi
 
   systemctl daemon-reload
 
   systemctl daemon-reload
  
Стартуем сервис и проверяем он запустился
+
 
 +
Стартуем сервис и проверяем, что он запустился
 
  systemctl enable --now netbox netbox-rq
 
  systemctl enable --now netbox netbox-rq
 
  systemctl status netbox.service
 
  systemctl status netbox.service
Строка 315: Строка 301:
  
  
LDAP authentication (optional)<br>
+
<font color=blue>'''LDAP аутентификация'''</font><br>
 
 
  
 
Ставим нужные пакеты
 
Ставим нужные пакеты
Строка 327: Строка 312:
  
  
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды:
+
После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды
 
  echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt
 
  echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt
  
  
Конфигурируем
+
Включаем ldap-аутентификацию в <code>configuration.py</code>
 
 
First, enable the LDAP authentication backend in configuration.py. (Be sure to overwrite this definition if it is already set to RemoteUserBackend.)
 
 
  REMOTE_AUTH_ENABLED = True
 
  REMOTE_AUTH_ENABLED = True
 
  REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
 
  REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
  
  
Далее создаём файл в той же директории, что и configuration.py (обычно /opt/netbox/netbox/netbox/), с именем ldap_config.py и определяем все необходимые параметры
+
Далее создаём файл в той же директории, что и configuration.py(обычно /opt/netbox/netbox/netbox/), с именем ldap_config.py и определяем все необходимые параметры
 +
import ldap
 +
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, LDAPGroupQuery
 
   
 
   
import ldap
+
# включение логирования
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, LDAPGroupQuery
+
#import logging
 
+
#logger = logging.getLogger('django_auth_ldap')
# включение логирования
+
#logger.addHandler(logging.StreamHandler())
#import logging
+
#logger.setLevel(logging.DEBUG)
#logger = logging.getLogger('django_auth_ldap')
+
#logger.addHandler(logging.StreamHandler())
+
# Server URI
#logger.setLevel(logging.DEBUG)
+
AUTH_LDAP_SERVER_URI = "ldap://ldap.iwad.ru"
 
+
 
# Server URI
+
# Set the DN and password for the NetBox service account.
AUTH_LDAP_SERVER_URI = "ldap://ldap.iwad.ru"
+
AUTH_LDAP_BIND_DN = "cn=admin,dc=iwad,dc=ru"
 
+
AUTH_LDAP_BIND_PASSWORD = "kQN5UVz3jISa9LLvk2q5"
# The following may be needed if you are binding to Active Directory.
+
#AUTH_LDAP_BIND_DN = "cn=netbox,dc=iwad,dc=ru"
AUTH_LDAP_CONNECTION_OPTIONS = {
+
#AUTH_LDAP_BIND_PASSWORD = "FepfLVh8xjd9xnN7fZqv"
    ldap.OPT_REFERRALS: 0
 
}
 
 
 
# Set the DN and password for the NetBox service account.
 
AUTH_LDAP_BIND_DN = "cn=admin,dc=iwad,dc=ru"
 
AUTH_LDAP_BIND_PASSWORD = "kQN5UVz3jISa9LLvk2q5"
 
#AUTH_LDAP_BIND_DN = "cn=netbox,dc=iwad,dc=ru"
 
#AUTH_LDAP_BIND_PASSWORD = "FepfLVh8xjd9xnN7fZqv"
 
 
 
 
 
 
 
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
 
# Note that this is a NetBox-specific setting which sets:
 
#    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
 
LDAP_IGNORE_CERT_ERRORS = True
 
 
 
# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
 
# Note that this is a NetBox-specific setting which sets:
 
#    ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
 
LDAP_CA_CERT_DIR = '/etc/ssl/certs'
 
 
 
# Include this setting if you want to validate the LDAP server certificates against your own CA.
 
# Note that this is a NetBox-specific setting which sets:
 
#    ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, LDAP_CA_CERT_FILE)
 
LDAP_CA_CERT_FILE = '/path/to/example-CA.crt'
 
 
 
 
 
# User configuration
 
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
 
AUTH_LDAP_USER_DN_TEMPLATE = None
 
AUTH_LDAP_USER_ATTR_MAP = {
 
    "first_name": "givenName",
 
    "last_name": "sn",
 
    "email": "mail"
 
}
 
 
 
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("groups,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
 
# Ограничение доступа только для группы netbox_users
 
AUTH_LDAP_REQUIRE_GROUP = "cn=netbox_users,ou=groups,dc=iwad,dc=ru"
 
 
 
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
 
AUTH_LDAP_CACHE_TIMEOUT = 3600
 
  
 +
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
 +
# Note that this is a NetBox-specific setting which sets:
 +
#    ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
 +
LDAP_IGNORE_CERT_ERRORS = True
 +
 +
# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
 +
# Note that this is a NetBox-specific setting which sets:
 +
#    ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
 +
LDAP_CA_CERT_DIR = '/etc/ssl/certs'
 +
 +
# User configuration
 +
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
 +
AUTH_LDAP_USER_DN_TEMPLATE = None
 +
AUTH_LDAP_USER_ATTR_MAP = {
 +
    "first_name": "givenName",
 +
    "last_name": "sn",
 +
    "email": "mail"
 +
}
 +
 +
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("groups,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
 +
# Ограничение доступа только для группы netbox_users
 +
AUTH_LDAP_REQUIRE_GROUP = "cn=netbox_users,ou=groups,dc=iwad,dc=ru"
 +
 +
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
 +
AUTH_LDAP_CACHE_TIMEOUT = 3600
  
  
 
Перезагружаем Netbox и проверяем авторизацию
 
Перезагружаем Netbox и проверяем авторизацию
 
  systemctl restart netbox
 
  systemctl restart netbox
 
 
 
 
 
 
 
  
  
 
Здесь тоже самое на англицком https://netboxlabs.com/docs/netbox/installation/
 
Здесь тоже самое на англицком https://netboxlabs.com/docs/netbox/installation/

Текущая версия на 16:19, 15 марта 2026

Установим Netbox на Debian 13


PostgreSQL

Ставим БД, в данном случае версия 17

apt install -y postgresql
sudo -u postgres psql


Создаём базу и пользователя

CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'пароль';
ALTER DATABASE netbox OWNER TO netbox;
-- the next two commands are needed on PostgreSQL 15 and later
\connect netbox;
GRANT CREATE ON SCHEMA public TO netbox;


Проверяем подключение

root@netbox ~ # psql --username netbox --password --host localhost netbox
Password: 
psql (17.8 (Debian 17.8-1.pgdg13+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)
Type "help" for help.

netbox=> \conninfo
You are connected to database "netbox" as user "netbox" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)


Redis

Устанавливаем redis-сервер

apt install -y redis-server


Проверяем

# redis-server -v
Redis server v=8.0.2 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=3951f4e1c0288395
# redis-cli ping
PONG


Компоненты Netbox

Переходим к установке Netbox. Устанавливаемая версия 4.5 поддерживает Python 3.12 и выше


Ставим зависимости

apt install -y python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev libffi-dev libpq-dev libssl-dev zlib1g-dev


Проверяем версию Python после установки

python3 -V
Python 3.13.5


Определяемся с версией Netbox https://github.com/netbox-community/netbox/releases и скачиваем

wget https://github.com/netbox-community/netbox/archive/refs/tags/vX.Y.Z.tar.gz
tar -xzf vX.Y.Z.tar.gz -C /opt
ln -s /opt/netbox-X.Y.Z/ /opt/netbox

Рекомендуется устанавливать NetBox в каталог, названный в соответствии с номером его версии. Например, NetBox v4.5.0 следует установить в /opt/netbox-4.5.0, а симлинк из /opt/netbox/ будет указывать на это местоположение. Это позволяет устанавливать будущие версии параллельно, не прерывая текущую установку. При переходе на новую версию необходимо обновить только симлинк.


Создаём пользователя и даём ему права

adduser --system --group netbox
chown --recursive netbox /opt/netbox/netbox/media/
chown --recursive netbox /opt/netbox/netbox/reports/
chown --recursive netbox /opt/netbox/netbox/scripts/


Переходим к конфигурационному файлу

cd /opt/netbox/netbox/netbox/
cp configuration_example.py configuration.py


Готовим конфиг

Основное блоки

  • ALLOWED_HOSTS
  • API_TOKEN_PEPPERS
  • DATABASES
  • REDIS
  • SECRET_KEY


ALLOWED_HOSTS
Это список допустимых имен хостов и IP-адресов, с помощью которых можно получить доступ к этому серверу. Надо указать хотя бы одно имя или IP-адрес(Для проверки заголовка HTTP-узла)

ALLOWED_HOSTS = ['netbox.example.com', '192.0.2.123']


API_TOKEN_PEPPERS
Код который будет использоваться для генерации контрольных сумм API-токенов

API_TOKEN_PEPPERS = {
    # DO NOT USE THIS EXAMPLE PEPPER IN PRODUCTION
    1: 'kp7ht*76fiQAhUiiop086HfASLlYUE_S^gI^(7J^K5M!LfoH@vl&b_',
}

Можем использовать generate_secret_key.py скрипт для генерации случайного pepper

python3 ../generate_secret_key.py


DATABASES
Задаём параметры подключения к БД

DATABASES = {
    'default': {
        'NAME': 'netbox',               # Database name
        'USER': 'netbox',               # PostgreSQL username
        'PASSWORD': 'STronGPassWord',   # PostgreSQL password
        'HOST': 'localhost',            # Database server
        'PORT': ,                      # Database port (leave blank for default)
        'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
    }
}


REDIS
Задаём параметры подключения к redis-серверу

REDIS = {
    'tasks': {
        'HOST': 'localhost',      # Redis server
        'PORT': 6379,             # Redis port
        'PASSWORD': ,           # Redis password (optional)
        'DATABASE': 0,            # Database ID
        'SSL': False,             # Use SSL (optional)
    },
    'caching': {
        'HOST': 'localhost',
        'PORT': 6379,
        'PASSWORD': ,
        'DATABASE': 1,            # Unique ID for second database
        'SSL': False,
    }
}

SECRET_KEY
Создаём secret-key

python3 ../generate_secret_key.py


Пример конфига

ALLOWED_HOSTS = ['netbox.iwad.ru', '172.16.37.28', '172.16.37.10']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',  # Database engine
        'NAME': 'netbox',         # Database name
        'USER': 'netbox',         # PostgreSQL username
        'PASSWORD': 'PASSWORD',   # PostgreSQL password
        'HOST': 'localhost',      # Database server
        'PORT': ,               # Database port (leave blank for default)
        'CONN_MAX_AGE': 300,      # Max database connection age
    }
}

REDIS = {
    'tasks': {
        'HOST': 'localhost',
        'PORT': 6379,
        'USERNAME': ,
        'PASSWORD': ,
        'DATABASE': 0,
        'SSL': False,
    },
    'caching': {
        'HOST': 'localhost',
        'PORT': 6379,
        'USERNAME': ,
        'PASSWORD': ,
        'DATABASE': 1,
        'SSL': False,
    }
}

SECRET_KEY = 'N9-)X8OWr^aLQ-BL+dpNn897gdfg0bs%P8bHzEYUw2xrg73Ja4'

# Optional settings   #
ADMINS = [
    # ('John Doe', 'jdoe@example.com'),
]

# Permit the retrieval of API tokens after their creation.
ALLOW_TOKEN_RETRIEVAL = False

# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
# BASE_PATH = 'netbox/'
BASE_PATH = 

# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
 #     'https://hostname.example.com,
]
CORS_ORIGIN_REGEX_WHITELIST = [
    # r'^(https?://)?(\w+\.)?example\.com$',
]

# The name to use for the CSRF token cookie.
#CSRF_COOKIE_NAME = 'csrftoken'

CSRF_TRUSTED_ORIGINS = ['https://netbox.iwad.ru']

# Enable installed plugins. Add the name of each plugin to the list.
PLUGINS = [
#"netbox_ipcalculator",
]

# Remote authentication support
REMOTE_AUTH_ENABLED = False
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
REMOTE_AUTH_USER_FIRST_NAME = 'HTTP_REMOTE_USER_FIRST_NAME'
REMOTE_AUTH_USER_LAST_NAME = 'HTTP_REMOTE_USER_LAST_NAME'
REMOTE_AUTH_USER_EMAIL = 'HTTP_REMOTE_USER_EMAIL'
REMOTE_AUTH_AUTO_CREATE_USER = True
REMOTE_AUTH_DEFAULT_GROUPS = []
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}


Запускаем установку Netbox

/opt/netbox/upgrade.sh


Запускаем виртуальное окружение и создаём суперпользователя

source /opt/netbox/venv/bin/activate

cd /opt/netbox/netbox
python3 manage.py createsuperuser


Netbox работает как WSGI-приложение за HTTP-сервером. В нашем примере показано, как установить и настроить uWSGI для этой роли, однако доступны и другие WSGI-серверы, которые должны работать аналогично.

Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим pyuwsgi

source /opt/netbox/venv/bin/activate
pip3 install pyuwsgi


После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды

echo 'pyuwsgi' >> /opt/netbox/local_requirements.txt


Копируем дефолтный конфиг, его вполне достаточно для работы

cp /opt/netbox/contrib/uwsgi.ini /opt/netbox/uwsgi.ini


Далее скопируем файлы systemd для управления uWSGI и фоновым рабочим процессом NetBox

cp -v /opt/netbox/contrib/*.service /etc/systemd/system/


Отредактируем файл netbox.service, удалив строку начинающуюся с ExecStart=/opt/netbox/venv/bin/gunicorn, и раскомментируем строку с ExecStart=/opt/netbox/venv/bin/uwsgi

 systemctl daemon-reload


Стартуем сервис и проверяем, что он запустился

systemctl enable --now netbox netbox-rq
systemctl status netbox.service


Для удобства поставим Nginx и добавим конфиг для Netbox

server {
        listen 80;
        server_name netboxold.iwad.ru;

location /static/ {
        alias /opt/netbox/netbox/static/;
    }

location / {
        # proxy_pass http://127.0.0.1:8001;
        # proxy_set_header X-Forwarded-Host $http_host;
        # proxy_set_header X-Real-IP $remote_addr;
        # proxy_set_header X-Forwarded-Proto $scheme;
        # comment the lines above and uncomment the lines below if using uWSGI
        include uwsgi_params;
        uwsgi_pass  127.0.0.1:8001;
        uwsgi_param Host $host;
        uwsgi_param X-Real-IP $remote_addr;
        uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
        uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;

        access_log /var/log/nginx/netbox.access.log;
        error_log  /var/log/nginx/netbox.error.log;
       
        location = /favicon.ico {
            log_not_found off;
            access_log off;
               }
         location ~ /\.ht {
            deny all;
              }
    }
}


Установка завершена, заходим в браузер и смотрим картинки


LDAP аутентификация

Ставим нужные пакеты

apt install -y libldap2-dev libsasl2-dev libssl-dev


Запускаем виртуальное окружение, если вышли на прошлом шаге, и ставим django-auth-ldap

source /opt/netbox/venv/bin/activate
pip3 install django-auth-ldap


После установки добавим пакет в файл local_requirements.txt, чтобы обеспечить его повторную установку при последующих пересборках виртуальной среды

echo 'django-auth-ldap' >> /opt/netbox/local_requirements.txt


Включаем ldap-аутентификацию в configuration.py

REMOTE_AUTH_ENABLED = True
REMOTE_AUTH_BACKEND = 'netbox.authentication.LDAPBackend'


Далее создаём файл в той же директории, что и configuration.py(обычно /opt/netbox/netbox/netbox/), с именем ldap_config.py и определяем все необходимые параметры

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, LDAPGroupQuery

# включение логирования
#import logging
#logger = logging.getLogger('django_auth_ldap')
#logger.addHandler(logging.StreamHandler())
#logger.setLevel(logging.DEBUG)

# Server URI
AUTH_LDAP_SERVER_URI = "ldap://ldap.iwad.ru"
 
# Set the DN and password for the NetBox service account.
AUTH_LDAP_BIND_DN = "cn=admin,dc=iwad,dc=ru"
AUTH_LDAP_BIND_PASSWORD = "kQN5UVz3jISa9LLvk2q5"
#AUTH_LDAP_BIND_DN = "cn=netbox,dc=iwad,dc=ru"
#AUTH_LDAP_BIND_PASSWORD = "FepfLVh8xjd9xnN7fZqv"
# Include this setting if you want to ignore certificate errors. This might be needed to accept a self-signed cert.
# Note that this is a NetBox-specific setting which sets:
#     ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
LDAP_IGNORE_CERT_ERRORS = True

# Include this setting if you want to validate the LDAP server certificates against a CA certificate directory on your server
# Note that this is a NetBox-specific setting which sets:
#     ldap.set_option(ldap.OPT_X_TLS_CACERTDIR, LDAP_CA_CERT_DIR)
LDAP_CA_CERT_DIR = '/etc/ssl/certs'

# User configuration
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE,"(uid=%(user)s)")
AUTH_LDAP_USER_DN_TEMPLATE = None
AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail"
}

AUTH_LDAP_GROUP_SEARCH = LDAPSearch("groups,dc=iwad,dc=ru", ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)")
# Ограничение доступа только для группы netbox_users
AUTH_LDAP_REQUIRE_GROUP = "cn=netbox_users,ou=groups,dc=iwad,dc=ru"

AUTH_LDAP_GROUP_TYPE = GroupOfNamesType()
AUTH_LDAP_CACHE_TIMEOUT = 3600


Перезагружаем Netbox и проверяем авторизацию

systemctl restart netbox


Здесь тоже самое на англицком https://netboxlabs.com/docs/netbox/installation/