Как повысить безопасность удалённого доступа, путем ограничения разрешенных IP адресов

от автора

Если в компании есть сотрудники, работающие из дома через удалённый доступ, можно усилить безопасность, ограничивая разрешенные IP адреса.
На первый взгляд, можно разрешить только адреса из одной страны если все сотрудники в одной стране. И такие решения есть.
Второй вариант, ограничить доступ только адресами провайдеров через которых сотрудники подключаются.
Эта задача разбивается на две. Во первых, нужен список всех провайдеров. Во вторых, нужны все IP префиксы этих провайдеров.
Выполнение всех этих шагов вручную может оказаться сложной и трудоёмкой задачей. Однако с помощью автоматизации и Python-программы весь процесс можно упростить и ускорить, сведя рутинную работу к минимуму.

  • Сбор данных из логов:
    Найдите в логах все IP-адреса, с которых сотрудники подключались к серверу удалённого доступа.

  • Анализ провайдеров:
    Составьте список интернет провайдеров, которыми пользуются сотрудники для удалённого доступа.

  • Создание списка IP-префиксов:
    Для каждого провайдера определите IP-префиксы, используемые для подключения.

  • Настройка фильтрации на маршрутизаторе:
    На пограничном маршрутизаторе создайте Access-лист, разрешающий доступ только с IP-адресов доверенных провайдеров.

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

    Первая python программа коннектится к API https://api.bgpview.io/ip/{ip_address} и возвращает BGP AS, имя, описание. Хотя есть и другие возможности включая подключение к открытым серверам BGP looking glass.

import requests, csv, time  def get_asn_from_ip(ip_address):     url = f"https://api.bgpview.io/ip/{ip_address}"     response = requests.get(url)     time.sleep(2)     if response.status_code == 200:         data1 = response.json()         data5 = data1["data"]         asn_info , name , description = '', '', ''         if data5["prefixes"]>[]:             data7 = data5["prefixes"]             data8 = data7[0]             data9 = data8["asn"]             name = data9['name']             description = data9['description']         return asn_info if asn_info else 'Not found', name , description     else:         return 'Error fetching ASN'  def process_ip_file(input_file, output_file):     with open(input_file, 'r') as infile, open(output_file, 'w', newline='') as csvfile:         csv_writer = csv.writer(csvfile)         csv_writer.writerow(['IP Address', 'AS Number','Name','Description'])          for line in infile:             ip_address = line.strip()             if ip_address:                 asn ,name, desc = get_asn_from_ip(ip_address)                 csv_writer.writerow([ip_address, asn, name, desc])                 print(f"{ip_address} -> ASN {asn}")  if __name__ == "__main__":     input_file = '1.txt' #input("Enter the input file path (with IP addresses): ")     output_file = '1_out.txt' #input("Enter the output CSV file path: ")     process_ip_file(input_file, output_file)     print(f"CSV file '{output_file}' created successfully!")

и результат выглядит так

IP Address,AS Number,Name,Description 1.1.1.1,13335,CLOUDFLARENET,"Cloudflare, Inc." 2.2.2.2,Not found,, 3.3.3.3,14618,AMAZON-AES,"Amazon.com, Inc." 8.8.8.8,15169,GOOGLE,Google LLC 9.9.9.9,19281,QUAD9-AS-1,Quad9 98.67.54.23,8075,MICROSOFT-CORP-MSN-AS-BLOCK,Microsoft Corporation

следующая программа коннектится к API https://api.bgpview.io/asn/{asn}/prefixes и возвращает список префиксов

import requests , csv  def get_prefixes_by_asn(asn):     url = f"https://api.bgpview.io/asn/{asn}/prefixes"     response = requests.get(url)      if response.status_code == 200:         data = response.json()         ipv4_prefixes = data['data']['ipv4_prefixes']          # Save to CSV         csv_filename = f"asn_{asn}_prefixes.csv"         with open(csv_filename, mode='w', newline='') as file:             writer = csv.writer(file)             writer.writerow(['AS Number', 'IPv4 Prefix'])             # Write prefixes to CSV             for prefix in ipv4_prefixes:                 writer.writerow([asn, prefix['prefix']])         print(f"CSV file '{csv_filename}' created successfully!")     else:         print(f"Failed to fetch data for ASN {asn}. Status code: {response.status_code}")  if __name__ == "__main__":     asn = input("Enter BGP ASN (e.g., 15169 for Google): ")     get_prefixes_by_asn(asn)

и результат

AS Number,IPv4 Prefix 19281,9.9.9.0/24 19281,149.112.112.0/24 19281,149.112.149.0/24 19281,199.249.255.0/24

следующая программа создает оъект для Cisco ASA который можно использовать в аксес-листе

import csv  def generate_asa_config(csv_file):     as_groups = {}      # Read the CSV file and group prefixes by AS number     with open(csv_file, 'r') as file:         reader = csv.DictReader(file)         for row in reader:             as_number = row['AS Number']             prefix = row['IPv4 Prefix']              if as_number not in as_groups:                 as_groups[as_number] = []             as_groups[as_number].append(prefix)     # Generate ASA configuration     asa_config = []     for as_number, prefixes in as_groups.items():         asa_config.append(f"object-group network obj_{as_number}")         for prefix in prefixes:             asa_config.append(f"  network-object {prefix}")         asa_config.append("!")      return '\n'.join(asa_config)  # Example usage: csv_file = 'asn_19281_prefixes.csv'  # Replace with your actual file name  asn_19281_prefixes.csv asa_config = generate_asa_config(csv_file) print(asa_config)  # If you want to save it to a file: with open('asa_config.txt', 'w') as f:     f.write(asa_config)

Cisco ASA объект

object-group network obj_19281   network-object 9.9.9.0/24   network-object 149.112.112.0/24   network-object 149.112.149.0/24   network-object 199.249.255.0/24 !


ссылка на оригинал статьи https://habr.com/ru/articles/891328/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *