Как сэкономить на покупках за счет купонов, промокодов и скидок Алиэкспресс

Одним из самых лучших способов делать выгодные покупки на Алиэкспресс, являются скидочные купоны, которые плейсмаркет щедро раздает не только новым покупателям, но и всем, в преддверии крупных распродаж. Вкратце расскажем, как можно сэкономить значительные суммы за счет купонов Алиэкспресс и промокодов.

Купоны Алиэкспресс и промокоды

Скидки и купоны Алиэкспресс

Читать

Как работать с CSV-файлами в Python

В этой статье будет рассмотрено руководство по работе с файлами «csv» с помощью Python. Термин «csv» означает «значения, разделенные запятыми», где каждая строка или строка содержат текстовые значения, разделенные запятыми. В некоторых случаях для разделения значений вместо запятой также используется «точка с запятой». Однако это не имеет большого значения для правил формата файлов, и логика обработки обоих типов разделителей остается той же.

Формат файла CSV обычно используется для обслуживания баз данных и электронных таблиц. Первая строка в CSV-файле чаще всего используется для определения полей столбцов, а все остальные оставшиеся строки считаются строками. Эта структура позволяет пользователям представлять табличные данные с помощью файлов CSV. Файлы CSV можно редактировать в любом текстовом редакторе. Однако такие приложения, как LibreOffice Calc, предоставляют расширенные инструменты редактирования, сортировки и фильтрации.

 

Чтение данных из файлов CSV с помощью Python

Модуль CSV в Python позволяет вам читать, записывать и управлять любыми данными, хранящимися в файлах CSV. Чтобы прочитать файл CSV, вам нужно будет использовать метод «reader» из модуля Python «csv», который включен в стандартную библиотеку Python.

Учтите, что у вас есть файл CSV, содержащий следующие данные:

Mango,Banana,Apple,Orange

50,70,30,90

 

Первая строка файла определяет категорию каждого столбца, в данном случае название фруктов. Во второй строке хранятся значения в каждом столбце (на складе). Все эти значения разделяются запятой. Если бы вы открыли этот файл в приложении для работы с электронными таблицами, таком как LibreOffice Calc, он бы выглядел так:

Как работать с CSV-файлами в Python

 

Теперь, чтобы прочитать значения из файла «fruit.csv» с помощью модуля Python «csv», вам нужно будет использовать метод «reader» в следующем формате:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for line in data_reader:

print (line)

 

Первая строка в приведенном выше примере импортирует модуль «csv». Затем оператор «with open» используется для безопасного открытия файла, хранящегося на вашем жестком диске (в данном случае «fruit.csv»). Новый объект «data_reader» создается путем вызова метода «reader» из модуля «csv». Этот метод «читателя» принимает имя файла в качестве обязательного аргумента, поэтому ему передается ссылка на «fruit.csv». Затем выполняется оператор цикла for для печати каждой строки из файла «fruit.csv». После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

['50', '70', '30', '90']

 

Если вы хотите назначить номера строк для вывода, вы можете использовать функцию «перечислить», которая присваивает номер каждому элементу в итерации (начиная с 0, если не было изменено).

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for index, line in enumerate(data_reader):

print (index, line)

 

Переменная index хранит счетчик для каждого элемента. После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

0 ['Mango', 'Banana', 'Apple', 'Orange']

1 ['50', '70', '30', '90']

 

Поскольку первая строка в файле «csv» обычно содержит заголовки столбцов, вы можете использовать функцию «перечислить» для извлечения этих заголовков:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for index, line in enumerate(data_reader):

if index == 0:

headings = line

print (headings)

 

Блок «if» в приведенном выше утверждении проверяет, равен ли индекс нулю (первая строка в файле «fruit.csv»). Если да, то значение переменной «строка» присваивается новой переменной «заголовки». После выполнения приведенного выше примера кода вы должны получить следующий результат:

['Mango', 'Banana', 'Apple', 'Orange']

 

Обратите внимание, что вы можете использовать свой собственный разделитель при вызове метода csv.reader, используя необязательный аргумент «разделитель» в следующем формате:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file, delimiter=";")

for line in data_reader:

print (line)

 

Поскольку в файле csv каждый столбец связан со значениями в строке, вы можете создать объект «словарь» Python при чтении данных из файла «csv». Для этого вам нужно использовать метод «DictReader», как показано в приведенном ниже коде:

import csv

with open("fruits.csv") as file:

data_reader = csv.DictReader(file)

for line in data_reader:

print (line)

 

После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}</cce_text>



So now you have a dictionary object that associates individual columns with their corresponding values in the rows. This works fine if you have only one row. Let's assume that the "fruits.csv" file now includes an additional row that specifies how many days it will take for the stock of fruit to perish.



[cce_text width="100%" height="100%" escaped="true" theme="blackboard" nowrap="0"]Mango,Banana,Apple,Orange

50,70,30,90

3,1,6,4

 



Если у вас несколько строк, выполнение одного и того же примера кода, приведенного выше, приведет к другому результату.

{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}

{'Mango': '3', 'Banana': '1', 'Apple': '6', 'Orange': '4'}

 

Это может быть не идеально, поскольку вы можете сопоставить все значения, относящиеся к одному столбцу, к одной паре ключ-значение в словаре Python. Вместо этого попробуйте этот пример кода:

import csv

with open("fruits.csv") as file:

data_reader = csv.DictReader(file)

data_dict = {}

for line in data_reader:

for key, value in line.items():

data_dict.setdefault(key, [])

data_dict[key].append(value)

print (data_dict)

 

После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

{'Mango': ['50', '3'], 'Banana': ['70', '1'], 'Apple': ['30', '6'], 'Orange': ['90', '4']}

 

Цикл «for» используется для каждого элемента объекта «DictReader» для перебора пар ключ-значение. Перед этим определяется новая переменная словаря Python «data_dict». Он будет хранить окончательные сопоставления данных. Во втором блоке цикла for используется метод setdefault словаря Python. Этот метод присваивает значение ключу словаря. Если пара «ключ-значение» не существует, создается новая из указанных аргументов. Таким образом, в этом случае новый пустой список будет назначен ключу, если он еще не существует. Наконец, «значение» добавляется к соответствующему ключу в конечном объекте «data_dict».

 

Запись данных в файл CSV

Чтобы записать данные в файл «csv», вам нужно будет использовать метод «writer» из модуля «csv». В приведенном ниже примере к существующему файлу «fruit.csv» будет добавлена ​​новая строка.

import csv

with open("fruits.csv", "a") as file:

data_writer = csv.writer(file)

data_writer.writerow([3,1,6,4])

 

Первый оператор открывает файл в режиме «добавления», обозначенном аргументом «а». Затем вызывается метод «писателя», и ему передается ссылка на файл «fruit.csv» в качестве аргумента. Метод «writerow» записывает или добавляет новую строку в файл.

Если вы хотите преобразовать словарь Python в файловую структуру «csv» и сохранить вывод в файле «csv», попробуйте этот код:

import csv

with open("fruits.csv", "w") as file:

    headings = ["Mango", "Banana", "Apple", "Orange"]

    data_writer = csv.DictWriter(file, fieldnames=headings)

    data_writer.writeheader()

    data_writer.writerow({"Mango": 50, "Banana": 70, "Apple": 30, "Orange": 90})

    data_writer.writerow({"Mango": 3, "Banana": 1, "Apple": 6, "Orange": 4})

 

После открытия пустого файла «fruit.csv» с помощью оператора «with open» определяется новая переменная «заголовки», которая содержит заголовки столбцов. Новый объект «data_writer» создается путем вызова метода «DictWriter» и передачи ему ссылки на файл «fruit.csv» и аргумент «fieldnames». В следующей строке заголовки столбцов записываются в файл с помощью метода «writeheader». Последние два оператора добавляют новые строки к соответствующим заголовкам, созданным на предыдущем шаге.

 

Заключение

Файлы CSV предоставляют удобный способ записи данных в табличном формате. Встроенный в Python модуль «csv» позволяет легко обрабатывать данные, доступные в файлах «csv», и реализовывать на них дополнительную логику.



2021-04-02T16:38:35
Python

MikroTik – статические маршруты.

В нашей организации есть две не связанные локальные сети каждая со своим шлюзом. Была поставлена задача их объединить. О том как это происходило написано далее.

Освоить MikroTik Вы можете с помощью онлайн-куса
«Настройка оборудования MikroTik». Курс содержит все темы, которые изучаются на официальном курсе MTCNA. Автор курса – официальный тренер MikroTik. Подходит и тем, кто уже давно работает с микротиками, и тем, кто еще их не держал в руках. В курс входит 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.

Схема сетей.

В обоих сетях работают роутеры MikroTik RB750Gr3 с прошивкой 6.48.

В первые порты подключены патч-корды внешних сетей.

Во вторые порты подключен патч-корд между двумя роутерами (красный).

В пятые порты подключены патч-корды до коммутаторов ЛВС (синие).

Для понятности описаны подробные настройки для обоих роутеров.

Обозначим роутеры №1 и №2.

Базовые настройки помещены под спойлер.


СПОЙЛЕР Настройки роутера №1.

Подключаемся к роутеру через WinBox из локальной сети. (как это сделать)

Reset Configuration.

Сбрасываем конфигурацию без сохранения настроек по умолчанию.

Через командную строку терминала:



Подключаемся к роутеру по MAC-адресу.

 

Ports.

Переименуем порты, чтоб не путаться в процессе настройки.

ether1-WAN (внешняя сеть – Интернет)

ether2-ROUTE (роутер №2)

ether3-ether5 – LAN (локальная сеть)

Через командную строку терминала:



 

Bridge.

Создаем мост для внутренней локальной сети.

Через командную строку терминала:



 

Bridge ports.

Добавляем в мост порты ether3-ether5

Через командную строку терминала:



 

Bridge address.

Назначим мосту статический IP-адрес.

Через командную строку терминала:



 

Ether2-ROUTE address.

Назначим статический адрес порту в направлении второго роутера.

Через командную строку терминала:



 

DHCPclient.

Создадим получение IP-адреса от вышестоящего роутера (провайдера) в автоматическом режиме.

Создаем DHCP Client соединение.

Через командную строку терминала:



 

DHCPserver для локальной сети.

Создаем пул IP-адресов, которые будут раздаваться автоматически.

Через командную строку терминала:



 

Укажем сеть для DHCP-сервера.

Через командную строку терминала:



 

Создадим DHCP Server.

Через командную строку терминала:



 

Привяжем полученный IP-адрес к MAC-адресу ПК пользователя.

Через командную строку терминала:



 

DNS.

Динамический DNS будет присвоен автоматически, или его можно указать вручную.

Allow Remote Requests – отмечаем галочкой.

Через командную строку терминала:



 

NAT.

NAT masquerade подменяет IP-адреса локальной сети на внешний IP при отправке запросов и обратная ситуация при возвращении ответов.

Через командную строку терминала:



После этих действий Интернет заработает в локальной сети.

Для полноценной работы необходимо выполнить настройки по безопасности, и некоторые другие настройки (см.базовая настройка роутера MikroTik).


Routes.

Создадим маршрут от первого до второго роутера. Это можно сделать в меню  IP >> Routes.

Через командную строку терминала:



Этот маршрут означает что при необходимости попасть в сеть 192.168.20.0/24 будет использован шлюз 172.16.0.20.

 


СПОЙЛЕР Настройки роутера №2.

Подключаемся к роутеру через WinBox из локальной сети. (как это сделать)

Reset Configuration.

Сбрасываем конфигурацию без сохранения настроек по умолчанию.

Через командную строку терминала:



Подключаемся к роутеру по MAC-адресу.

 

Ports.

Переименуем порты, чтоб не путаться в процессе настройки.

ether1-WAN (внешняя сеть – Интернет)

ether2-ROUTE (роутер №1)

ether3-ether5 – LAN (локальная сеть)

Через командную строку терминала:



 

Bridge.

Создаем мост для внутренней локальной сети.

Через командную строку терминала:



 

Bridge ports.

Добавляем в мост порты ether3-ether5

Через командную строку терминала:



 

Bridge address.

Назначим мосту статический IP-адрес.

Через командную строку терминала:



 

Ether2-ROUTE address.

Назначим статический адрес порту в направлении первого роутера.

Через командную строку терминала:



 

DHCPclient.

Создадим получение IP-адреса от вышестоящего роутера (провайдера) в автоматическом режиме.

Создаем DHCP Client соединение.

Через командную строку терминала:



 

DHCPserver для локальной сети.

Создаем пул IP-адресов, которые будут раздаваться автоматически.

Через командную строку терминала:



 

Укажем сеть для DHCP-сервера.

Через командную строку терминала:



 

Создадим DHCP Server.

Через командную строку терминала:



 

Привяжем полученный IP-адрес к MAC-адресу ПК пользователя.

Через командную строку терминала:



 

DNS.

Динамический DNS будет присвоен автоматически, или его можно указать вручную.

Allow Remote Requests – отмечаем галочкой.

Через командную строку терминала:



 

NAT masquerade.

Через командную строку терминала:



После этих действий Интернет заработает в локальной сети.

Не забываем выполнять базовые настройки по безопасности.


Routes.

Создадим маршрут от второго роутера к первому роутера. Переходим в боковом меню в  IP >> Routes.

Через командную строку терминала:



Этот маршрут означает что при необходимости попасть в сеть 192.168.10.0/24 будет использован шлюз 172.16.0.10.

Настроенная система прошла успешное тестирование. Доступ между сетями может ограничивать антивирус или правила Firewall в роутерах.

Освоить MikroTik Вы можете с помощью онлайн-куса
«Настройка оборудования MikroTik». Курс содержит все темы, которые изучаются на официальном курсе MTCNA. Автор курса – официальный тренер MikroTik. Подходит и тем, кто уже давно работает с микротиками, и тем, кто еще их не держал в руках. В курс входит 162 видеоурока, 45 лабораторных работ, вопросы для самопроверки и конспект.



2021-04-02T16:37:28
Настройка ПО

POP! _OS против Linux Mint

Дистрибутивы Linux разработаны для обеспечения отличной совместимости, функций и расширенных возможностей администрирования. Однако всегда сложно выбрать один из этих дистрибутивов Linux, который может удовлетворить требования, поскольку в Интернете доступно несколько типов ОС Linux. Мы рассмотрели наиболее важную информацию о двух известных Pop! _OS и Linux Mint. К концу статьи вы получите все необходимые сведения о Pop! _OS и Linux Mint, которые помогут вам выбрать одну из этих ОС Linux.

 

POP! _OS

Pop! _OS основан на Ubuntu и предлагает среду с открытым исходным кодом в качестве операционной системы Linux. Эта ОС Linux по умолчанию состоит из настраиваемого рабочего стола GNOME и разработана американским производителем компьютеров Linux System76.

Pop! _OS против Zorin OS

 

Последняя версия этой ОС Linux — 20.04, основанная на последней версии Ubuntu: 20.04 LTS. Таким образом, POP! _OS обеспечивает надежную и стабильную поддержку программного обеспечения, устраняя все предыдущие ошибки. Последняя версия Pop! _ OS также включает новую систему поддержки библиотек для управления репозиториями; пользователи могут легко изменить зеркала системного репозитория по умолчанию и восстановить зеркала по умолчанию.

 

Особенности Pop! _OS

Итак, вот список функций, включенных в последнюю версию Pop! _OS:

  • Эта операционная система Linux имеет автоматическую мозаику окон.
  • Пользователи могут использовать последнюю версию средства запуска новых приложений.
  • Эта ОС Linux имеет функцию стекирования и расширенную поддержку гибридной графики.
  • Pop! _Shop теперь поддерживает плоские пакеты.
  • Он имеет поддержку GNOME 3.36 и Linux Kernel 5.8.

 

Linux Mint

Linux Mint также основан на Ubuntu, и это операционная система Linux, управляемая сообществом. Этот дистрибутив Linux наполнен различными типами приложений с открытым исходным кодом и бесплатными приложениями, поэтому Linux Mint может легко предлагать готовую поддержку мультимедиа. Этот дистрибутив Linux призван предоставить платформу, которая проста в использовании, элегантна и эффективна для любого оборудования.

Как полностью удалить пакет в Linux Mint 20

 

Согласно отзывам пользователей, Linux mint — один из предпочтительных вариантов для перехода с Windows или Mac на среду Linux. Этот дистрибутив Linux существует с 2006 года и теперь стал одной из лучших операционных систем, удобных для пользователя.

 

Особенности Linux Mint

Linux Mint предлагает несколько функций, поэтому вот их список:

  • В последней версии улучшены Cinnamon 3.8 и XApps.
  • В Linux Mint есть великолепный экран приветствия и менеджер обновлений.
  • В последней версии есть exFat, который поддерживается инструментом форматирования USB-накопителей.
  • В этом дистрибутиве Linux есть фантастический менеджер программного обеспечения.
  • Linux Mint имеет мультимедийные кодеки, включая шрифты Microsoft.

 

POP! _OS против Linux Mint: системные требования







Минимальные требованияLinux MintPop! _OS
Лучше всего дляУстройство среднего уровняУстройство среднего уровня
Требования к оперативной памятиТребуется минимум 1 ГБ, но рекомендуется 2 ГБТребуется минимум 2 ГБ, но рекомендуется 4 ГБ
Требования к процессору32-битный процессор X86Рекомендуется двухъядерный 64-битный

 

POP! _OS против Linux Mint: таблица сравнения













ФакторыLinux MintPop! _OS
СозданДистрибутив, управляемый сообществом, на основе Ubuntu.System76 (производитель AmericanLinux)
Требуется навыкНовичокНовичок
На основеUbuntu и DebianВыпуск Ubuntu LTS
Лучше всего дляЛучше всего для общих целей.Лучше всего для общих целей.
Поддержка программного обеспеченияУ него отличная система поддержки программного обеспечения.Система поддержки программного обеспечения не лучше Linux Mint.
Требования к оборудованиюТребования к оборудованию среднего уровняТребования к оборудованию среднего уровня
Легкость использованияЭто простая в использовании операционная система Linux.Лучше всего для начинающих пользователей.
СтабильностьЭто очень стабильная ОС Linux.Стабильность не лучше, чем у Linux Mint.
Циклы выпускаУ него есть фиксированный цикл выпуска, который происходит один раз в месяц.У него фиксированный цикл выпуска: раз в два года.

 

Заключение

Это завершает полное сравнение POP! _OS и Linux Mint, которое поможет вам выбрать один из этих дистрибутивов Linux в соответствии с вашими требованиями. Эти дистрибутивы Linux предлагают отличную совместимость и функции для новичков. Если вы переключитесь с Windows или Mac на Linux, вы можете выбрать одну из этих ОС Linux, чтобы предложить пользователям простые в использовании параметры и пользовательский интерфейс. На наш взгляд, Linux Mint лучше всего подходит для тех, кому нужен дистрибутив для рабочей станции, но Pop! _OS лучше всего для тех, кто хочет иметь игровой дистрибутив на основе Ubuntu.



2021-04-02T16:30:23
Linux Mint

Уязвимости состояния гонки в веб-приложениях

Когда веб-приложению, настроенному для управления функциями в фиксированной последовательности, требуется выполнить две или более операций одновременно, происходит атака состояния гонки. Этот метод использует преимущество временной задержки между введением услуги и началом контроля безопасности. Эта атака может быть осуществлена одним из двух способов, основанных на многопоточных приложениях: вторжение, вызванное ненадежными процессами, и вторжение, вызванное заслуживающим доверия процессом, который может иметь одинаковые и равные права.

Различные процессы могут взаимодействовать друг с другом без адекватных мер. Эти атаки также известны как атака Time of Check, атака Time of Use или атаки TOC/TOU. Уязвимости в условиях гонки возникают в первую очередь из-за базовых программных ошибок, которые обычно создают разработчики, и эти сбои оказались дорогостоящими. Злонамеренные организации использовали расовые условия для множества злонамеренных целей, например, от получения бесплатных ваучеров до кражи денег с онлайн-счетов и инвестиционных фирм.

Предположим, что два параллельных потока выполнения пытаются поднять значение глобальной переменной на 5. В конечном счете, тогда глобальная переменная будет иметь значение 10. Однако если все потоки выполняются одновременно, выполнение может быть неправильным без блокировки ресурсов или синхронизации. Когда первый поток выполняет некоторые манипуляции с этой глобальной переменной, второй поток читает ее и начинает выполнять некоторые другие манипуляции. В этом случае конечное значение будет не таким, как ожидалось.

Это происходит, так как эффект завершения одного потока зависит от результата другого. Когда два потока выполняются одновременно, будут непредвиденные последствия.

 

Объем атак на состояние расы:

Представьте себе, что что-то более важное выполняется двумя потоками из приведенного выше примера, например обмен деньгами между банковскими счетами. Чтобы правильно отправить деньги, программа должна будет выполнить эти задачи в следующей последовательности: проверить, достаточно ли остатка на счете отправителя, добавить деньги на счет получателя, а затем вычесть со счета отправителя. Но если вы одновременно отправляете два запроса, вы можете вызвать условие, при котором последовательность выполнения потока изменится. В подобной ситуации вы получите совсем другую сумму, чем ожидали.

Уязвимость Race condition была обнаружена Егором Хомаковым на сайте Starbucks. Он нашел способ создать бесконечное количество кредитов на подарочные ваучеры Starbucks бесплатно, используя разные браузеры с разными файлами cookie.

Выдающаяся атака Meltdown является примером уязвимости состояния расы. В атаке meltdown слабость вызывается параллельной обработкой извлечения данных из памяти и проверкой подлинности того, разрешен ли пользователю доступ к памяти. Этот недостаток позволяет инструменту избежать стандартных проверок привилегий, которые отделяют механизм атаки от доступа к данным ОС. Эта лазейка позволяет любому несанкционированному процессу просматривать данные и информацию с любого другого адреса, связанного с текущим состоянием прогресса в памяти. В процессе неправильного выполнения информация с неутвержденного адреса часто быстро складывается в кэш центрального процессора, из которого эта информация может быть восстановлена.

 

Реальные сценарии атак:

Постоянно отправляя многочисленные запросы на веб-сервер, вы можете искать и манипулировать условиями гонки в веб-приложениях. Если вы хотите узнать, можете ли вы снять больше денег, чем у вас есть на банковском счете, используя функцию curl, вы можете одновременно отправить несколько запросов на вывод средств на сервер.

curl (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000)

 

Чем больше требований вы подадите за короткий промежуток времени, тем выше вероятность того, что ваша атака сработает.

Более того, если вы отправляете асинхронные последующие запросы, вы будете следовать за пользователем несколько раз вместо отправки ответа об ошибке, то есть если вы добавите поддельный заголовок, содержащий %s, отбрасывая запросы с помощью turbo intruder, и вставите следующий код python:

def followReqs(target, wordlists):

engine = RequestEngine(endpoint=target.endpoint,

concurrentConnections=40,

requestsPerConnection=100,

pipeline=False

)



for i in range(40):

engine.queue(target.req, str(i), gate='check')



engine.openGate('check')

.complete(timeout=60)

def responseHandle(req, interesting):

table.add(req)

Вы увидите кнопку атаки. После нажатия этой кнопки Turbo Intruder отправляет 40 запросов и сканирует коды состояния. Если вы видите несколько ответов со статусом 201 сгенерированный, это означает, что вы несколько раз следили за этим человеком.

Существует уязвимость race condition, при которой вы можете получить доступ к нескольким консолям, предлагаемым для бесплатных учетных записей. Большинство сайтов, предоставляющих бесплатные консоли, имеют бесплатные учетные записи, стандартные и премиальные пакеты. Бесплатные аккаунты предоставляют только 2 или 3 консоли на одного пользователя. Чтобы нарушить это ограничение и использовать неограниченное количество консолей, вторгнитесь в запрос GET, используя нулевые полезные нагрузки несколько раз, например 100 или 200. А затем удалите любую из консолей вручную из пользовательского интерфейса во время выполнения потоков.

 

Вывод:

В качестве средства подрыва контроля доступа включаются условия гонки. Любая программа, зависящая от механизмов контроля доступа, может оказаться уязвимой. Большую часть времени на сайтах финансовых учреждений хакеры используют расовые условия. Поскольку это может привести к неограниченным финансовым выгодам для хакера, если состояние гонки может быть обнаружено на жизненно важной функции, такой как снятие наличных, денежный перевод или оплата кредитной картой. Платформы электронной коммерции, видеоигры и услуги онлайн-голосования-это другие технологии высокого риска. Реализация безопасного параллелизма-это секрет избежания гоночных условий. И вы также можете использовать блокировки ресурсов. Также будет встроена функция блокировки для языков программирования с возможностями параллелизма, которые помогают предотвратить такие условия. Кроме того, соблюдение стандартов безопасного кодирования, т. е. концепции наименьших привилегий и кода аудита, уменьшит вероятность нарушения программы.



2021-04-01T23:42:08
Python

Резервное копирование Mikrotik через Oxidized

Итак сегодня речь пойдет об инструменте в задачу которого входит выполнение централизованного резервного копирования конфигурационных файлов (те которые выполняются с расширением rsc) оборудования Mikrotik. Плюс инструмент умеет отображать разницу в изменениях, а делает он это через складирование изменений посредством системы контроля версий GIT. Я если честно давно искал такой инструмент и вот я воплотил свою задумку разобрав от и до все шаги по разворачиванию сервиса oxidized в систему Ubuntu 18.04 Server amd64. Узнал я о нем это просматривая опубликованные презентации посвященные Mikrotik, к примеру если через поисковую систему Google ввести «Автоматизируем бэкап — MUM — MikroTik»




Предварительные действия: На всех Mikrotik(ах) для которых Вы хотите осуществлять резервное копирование нужно сделать учетную записи с минимальными правами, к примеру только на чтение:




ekzorchik@srv-bionic:~$ ssh -l admin 172.33.33.22
 
[admin@MikroTik] > user add name=test password=Aa1234567 group=read
 
[admin@MikroTik] > quit




Connection to 172.33.33.22 closed.




ekzorchik@srv-bionic:~$




Шаг №1: Настраиваю систему





ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject
 
ekzorchik@srv-bionic:~$ sudo ./dproject/default




Полученная текущая система с учетом моего скрипта настройки который я применяю в своей локальной сети:




ekzorchik@srv-bionic:~$ uname -a && lsb_release -a




Linux srv-bionic 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux




No LSB modules are available.




Distributor ID: Ubuntu




Description: Ubuntu 18.04.2 LTS




Release: 18.04




Codename: bionic




ekzorchik@srv-bionic:~




Шаг №2: Устанавливаю пакет Oxidized в систему Ubuntu 18.04 Server amd64:




ekzorchik@srv-bionic:~$ sudo apt-get install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev -y
 
ekzorchik@srv-bionic:~$ gem install oxidized oxidized-script oxidized-web




Fetching: asetus-0.3.0.gem (100%)




ERROR: While executing gem ... (Gem::FilePermissionError)




You don't have write permissions for the /var/lib/gems/2.5.0 directory.




ekzorchik@srv-bionic:~$ sudo gem install oxidized oxidized-script oxidized-web




Done installing documentation for charlock_holmes, rack, tilt, rack-protection, sinatra, emk-sinatra-url-for, temple, haml, htmlentities, puma, rb-fsevent, ffi, rb-inotify, sass-listen, sass, backports, rack-test, multi_json, sinatra-contrib, oxidized-web after 675 seconds




22 gems installed




ekzorchik@srv-bionic:~$




Шаг №3: Cоздаю пользователя oxidized, с правами которого будет запускаться система бэкапа:




ekzorchik@srv-bionic:~$ sudo useradd -m -p 712mbddr@ -s /bin/bash oxidized




На время даю права повышения привилегий, в конце заметки заберу.




ekzorchik@srv-bionic:~$ sudo usermod -aG sudo oxidized




Шаг №4: Создаю структуру запуска приложения oxidized




ekzorchik@srv-bionic:~$ sudo su - oxidized




oxidized@srv-bionic:~$ oxidized -v




0.26.1




oxidized@srv-bionic:~$




oxidized@srv-bionic:~$ whereis oxidized




oxidized: /usr/local/bin/oxidized




oxidized@srv-bionic:~$ oxidized




edit ~/.config/oxidized/config




oxidized@srv-bionic:~$ mkdir ~/.config/oxidized/crashes




oxidized@srv-bionic:~$ mkdir ~/.config/oxidized/mikrotik/




oxidized@srv-bionic:~$ sudo find / -name oxidized




/home/oxidized




/home/oxidized/.config/oxidized




/run/sudo/ts/oxidized




/usr/local/bin/oxidized




/var/lib/gems/2.5.0/gems/oxidized-web-0.13.1/lib/oxidized




/var/lib/gems/2.5.0/gems/oxidized-0.26.1/lib/oxidized




/var/lib/gems/2.5.0/gems/oxidized-0.26.1/bin/oxidized




/var/lib/gems/2.5.0/gems/oxidized-script-0.6.0/lib/oxidized




/var/lib/gems/2.5.0/doc/oxidized-web-0.13.1/ri/lib/oxidized




oxidized@srv-bionic:~$




Шаг №5: Преднастраиваем GIT для устройств Mikrotik бекапы которых будут хранится в репозитарии:




oxidized@srv-bionic:~$ sudo apt-get install git -y




oxidized@srv-bionic:~$ git config --global user.email "oxidized@ekzorchik.ru"




oxidized@srv-bionic:~$ git config --global user.name "oxidized"




oxidized@srv-bionic:~/.config/oxidized$ git init oxidized.git




Initialized empty Git repository in /home/oxidized/.config/oxidized/oxidized.git/.git/




oxidized@srv-bionic:~/.config/oxidized$ git init devices.git




Initialized empty Git repository in /home/oxidized/.config/oxidized/devices.git/.git/




Шаг №6: Настраиваем конфигурационный файл




oxidized@srv-bionic:~$ nano ~/.config/oxidized/config




---
 
model: routeros
resolve_dns: true
 
#Как часто делать бекапы

interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([w.@-]+[#>]s?)$/
rest: 0.0.0.0:8888
next_adds_job: false
vars: {}
groups: {}
models: {}
pid: "/home/oxidized/.config/oxidized/pid"
log: "/home/oxidized/.config/oxidized/log"
crash:
directory: "/home/oxidized/.config/oxidized/crashes"
hostnames: false
stats:
history_size: 10
input:

#Тип подключения к устройству

default: ssh
 
#Расширенное логирование отключено
 
debug: false
ssh:
secure: false
map:
verify_host_key: never
utf8_encoded: true
 
#где хранится конфигурации GIT
 
output:
default: git
git:
user: oxidized
email: oxidized@ekzorchik.ru
repo: "/home/oxidized/.config/oxidized/oxidized.git"
git:
user: oxidized
email: oxidized@ekzorchik.ru
repo: "/home/oxidized/.config/oxidized/devices/devices.git"

#Откуда берется информация об устройства которые бекапятся
 
source:
default: csv
csv:
file: "/home/oxidized/.config/oxidized/mikrotik/router.db"
delimiter: !ruby/regexp /:/
 
#Структура строки в router.db: name:model:ip:port:username:password
 
map:
name: 0
model: 1
ip: 2
port: 3
username: 4
password: 5
model_map:
cisco: ios
juniper: junos
mikrotik: routeros




На заметку: Если не настроена авторизация на Mikrotik через публичный ключ, т. е. Вход на Mikrotik с одним лишь указанием логина, то в конфигурационный файл oxidized следует добавить параметр: verify_host_key: never




Шаг №7: Копируем публичный ssh—ключ на Mikrotik:




oxidized@srv-bionic:~$ ssh-keygen




Your identification has been saved in /home/oxidized/.ssh/id_rsa.




Your public key has been saved in /home/oxidized/.ssh/id_rsa.pub.




oxidized@srv-bionic:~$ cp ~/.ssh/id_rsa.pub idrsa
 
oxidized@srv-bionic:~$ ftp 172.33.33.22




Connected to 172.33.33.22.




220 MikroTik FTP server (MikroTik 6.42.5) ready




Name (172.33.33.22:ekzorchik): admin




ftp> put idrsa




ftp> quit




oxidized@srv-bionic:~$
 
oxidized@srv-bionic:~$ ssh admin@172.33.33.22
 
[admin@MikroTik] > user ssh-keys import public-key-file=idrsa user=test
 
[admin@MikroTik] > quit




Connection to 172.33.33.22 closed.




oxidized@srv-bionic:~$




oxidized@srv-bionic:~$ ssh test@172.33.33.22 — подключение проходит без каких либо запросов на ввод пароля.




Шаг №8: Теперь создаю файл подключения к оборудованию Mikrotik:





oxidized@srv-bionic:~$ nano ~/.config/oxidized/mikrotik/router.db
 
mikrotik:routeros:172.33.33.22:22:test:Aa1234567




Шаг №9: Проверяю запуск и соответственно на предмет каких-либо ошибок препятствующих запуску:




oxidized@srv-bionic:~$ oxidized ~/.config/oxidized/config




Puma starting in single mode...




* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song




* Min threads: 0, max threads: 16




* Environment: development




* Listening on tcp://0.0.0.0:8888




Use Ctrl-C to stop







У каждой строчке есть колонка «Actions»







  • Первая иконка: Посмотреть текущий конфигурационный файл
  • Вторая иконка: Посмотреть историю изменений конфигурационного файла
  • Третья иконка: Это запуск процедуры снятия изменения в репозитарий




Шаг №10: См.логи если что-то пошло не так




ekzorchik@srv-bionic:~$ tail -f /home/oxidized/.config/oxidized/log




W, [2019-03-04T11:34:49.491810 #28328] WARN -- : /mikrotik status no_connection, retries exhausted, giving up




I, [2019-03-04T11:36:11.666786 #28380] INFO -- : Oxidized starting, running as pid 28380




I, [2019-03-04T11:36:11.669229 #28380] INFO -- : lib/oxidized/nodes.rb: Loading nodes




I, [2019-03-04T11:36:11.812262 #28380] INFO -- : lib/oxidized/nodes.rb: Loaded 1 nodes




I, [2019-03-04T11:36:14.351899 #28380] INFO -- : Configuration updated for /mikrotik




Шаг №11: Для того, чтобы oxidized стартовал как служба, сделайте следующее:




oxidized@srv-bionic:~$ sudo find / -name oxidized.service




/var/lib/gems/2.5.0/gems/oxidized-0.26.1/extra/oxidized.service




oxidized@srv-bionic:~$ sudo cp /var/lib/gems/2.5.0/gems/oxidized-0.26.1/extra/oxidized.service /lib/systemd/system/




oxidized@srv-bionic:~$ sudo nano /lib/systemd/system/oxidized.service




[Unit]
Description=Oxidized - Network Device Configuration Backup Tool
After=network-online.target multi-user.target
Wants=network-online.target
 
[Service]
ExecStart=/usr/local/bin/oxidized
User=oxidized
KillSignal=SIGKILL
Environment="OXIDIZED_HOME=/home/oxidized/.config/oxidized/"
 
[Install]
WantedBy=multi-user.target




oxidized@srv-bionic:~$ sudo systemctl enable oxidized.service




Created symlink /etc/systemd/system/multi-user.target.wants/oxidized.service → /lib/systemd/system/oxidized.service.




oxidized@srv-bionic:~$ sudo systemctl start oxidized




oxidized@srv-bionic:~$ sudo systemctl status oxidized | head -n5




● oxidized.service - Oxidized - Network Device Configuration Backup Tool




Loaded: loaded (/lib/systemd/system/oxidized.service; enabled; vendor preset: enabled)




Active: active (running) since Mon 2019-03-04 12:16:53 MSK; 9s ago




Main PID: 29039 (oxidized)




Tasks: 7 (limit: 2322)




Проверяю, что ожидаются соединения на порт 8888




oxidized@srv-bionic:~$ sudo netstat -tulpn | grep :8888




tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 29039/puma 3.11.4 (




oxidized@srv-bionic:~$




Шаг №12: По умолчанию у сервиса нет возможности указать авторизацию, а потому в конфиге config изменяю доступ на 172.0.0.1




oxidized@srv-bionic:~$ nano ~/.config/oxidized/config




#rest: 0.0.0.0:8888

rest: 127.0.0.1:8888




oxidized@srv-bionic:~$ sudo apt-get install nginx -y




oxidized@srv-bionic:~$ sudo rm /var/www/html/index.nginx-debian.html




oxidized@srv-bionic:~$ sudo unlink /etc/nginx/sites-available/default




oxidized@srv-bionic:~$ sudo unlink /etc/nginx/sites-enabled/default




Создаю файл связки логина и пароля для аутентификации через Web—интерфейс:




oxidized@srv-bionic:~$ sudo sh -c "echo -n 'ekzorchik:' >> /var/www/html/.htpasswd"




oxidized@srv-bionic:~$ openssl passwd -apr1




Password: 712mbddr@




Verifying - Password: 712mbddr@




$apr1$rwseclUD$ANBsXcpdvR.07mthC2PLO.




oxidized@srv-bionic:~$ sudo sh -c "openssl passwd -apr1 >> /var/www/html/.htpasswd"




Password: 712mbddr@




Verifying - Password: 712mbddr@




oxidized@srv-bionic:~$ cat /var/www/html/.htpasswd




ekzorchik:$apr1$V6ZTHWcF$bdDbxqPJAQAzfdXw7Z9n/0




oxidized@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/.htpasswd




oxidized@srv-bionic:~$ sudo nano /etc/nginx/sites-available/oxidized




server { 
listen 172.33.33.4:80; 
server_name _; 
root /usr/share/nginx/html; 
include /etc/nginx/default.d/*.conf; 
location / { 
auth_basic "UserName and Password Please"; 
auth_basic_user_file /var/www/html/.htpasswd; 
proxy_pass http://127.0.0.1:8888/; 
} 
}




oxidized@srv-bionic:~$ sudo ln -s /etc/nginx/sites-available/oxidized /etc/nginx/sites-enabled/oxidized




oxidized@srv-bionic:~$ sudo nginx -t




nginx: the configuration file /etc/nginx/nginx.conf syntax is ok




nginx: configuration file /etc/nginx/nginx.conf test is successful




oxidized@srv-bionic:~$ sudo systemctl restart nginx && sudo systemctl status nginx | head -n5




● nginx.service - A high performance web server and a reverse proxy server




Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)




Active: active (running) since Mon 2019-03-04 12:19:27 MSK; 34ms ago




Docs: man:nginx(8)




Process: 29084 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)




oxidized@srv-bionic:~$




Auth Basic авторизация в Oxidizing через NGINX




Вход успешно выполнен в систему Oxidizing на Ubuntu 18.04 Server




Работает! Итого я для себя разобрал, как использовать инструмент oxidized на Ubuntu 18.04 Server amd64 для создания резервных копий с оборудования Mikrotik и просмотра внесенных изменений через Web-интерфейс с применением системы контроля версий на базе GIT. Жалко что нельзя использовать Mercurial — мне данная система контроля версий ближе, у меня все на ней построено: скрипты, конфигурационные файлы и т. д. А пока на этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.













Источник: https://www.ekzorchik.ru/2019/03/backing-up-mikrotik-via-oxidized/







Git проекта: https://github.com/ytti/oxidized



2021-04-01T22:40:19
Software