Перейти к содержанию

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

Описание

Это требование подразумевает, что веб-сервер или сервер приложений должен быть настроен с использованием белого списка (allow list) ресурсов или систем, к которым он может отправлять запросы. Это помогает ограничить доступ к внешним системам и ресурсам, предотвращая несанкционированные или вредоносные запросы.

Почему это важно

  1. Безопасность: Белый список помогает предотвратить атаки, такие как SSRF (Server-Side Request Forgery), когда злоумышленник может заставить сервер отправить запросы на нежелательные или вредоносные адреса.
  2. Контроль доступа: Позволяет администраторам контролировать, к каким ресурсам может обращаться сервер, что снижает риск утечек данных.
  3. Соблюдение стандартов безопасности: Многие организации требуют использования белых списков для защиты от несанкционированного доступа к системам.
  4. Улучшение надежности: Ограничение запросов к известным и проверенным ресурсам может повысить стабильность и производительность приложения.

Способы реализации с примерами

Использование белого списка URL-адресов: Реализуйте проверку URL-адресов перед отправкой запросов, чтобы убедиться, что они находятся в белом списке.

Пример:

import requests

# Белый список разрешенных URL
ALLOWED_URLS = [
    "https://api.example.com",
    "https://service.example.com"
]

def is_url_allowed(url):
    return any(url.startswith(allowed_url) for allowed_url in ALLOWED_URLS)

def fetch_data(url):
    if not is_url_allowed(url):
        raise ValueError("URL is not allowed.")

    response = requests.get(url)
    return response.json()

# Пример использования
try:
    data = fetch_data("https://api.example.com/data")
    print(data)
except ValueError as e:
    print(e)

Использование прокси-сервера: Настройте прокси-сервер, который будет фильтровать запросы и разрешать только те, которые находятся в белом списке.

Пример:

from flask import Flask, request, jsonify

app = Flask(__name__)

ALLOWED_URLS = [
    "https://api.example.com",
    "https://service.example.com"
]

@app.route('/proxy', methods=['POST'])
def proxy_request():
    url = request.json.get('url')
    if not is_url_allowed(url):
        return jsonify({'error': 'URL is not allowed.'}), 403

    response = requests.get(url)
    return jsonify(response.json()), response.status_code

Логирование и мониторинг: Ведите журнал всех запросов, отправленных на внешние ресурсы, и любых ошибок, связанных с доступом.

Пример:

import logging

logging.basicConfig(level=logging.INFO)

def fetch_data(url):
    if not is_url_allowed(url):
        logging.warning(f"Blocked request to {url}")
        raise ValueError("URL is not allowed.")

    response = requests.get(url)
    logging.info(f"Fetched data from {url}")
    return response.json()

Примеры уязвимого кода

# Пример уязвимого кода на Python
def fetch_data(url):
    # Отсутствие проверки URL
    response = requests.get(url)  # Уязвимость к SSRF
    return response.json()

Проблема: В этом коде отсутствует проверка URL, что может привести к атакам SSRF и другим уязвимостям.

Причины, к которым может привести несоблюдение требования

  1. Уязвимость к SSRF: Неограниченные запросы могут быть использованы злоумышленниками для доступа к внутренним системам или ресурсам.
  2. Проблемы с доверием: Пользователи могут потерять доверие к системе, если они столкнутся с проблемами безопасности или некорректной работой приложения.
  3. Проблемы с соблюдением стандартов: Несоблюдение требований по контролю доступа может привести к юридическим последствиям и штрафам.

Рекомендации

  • Реализуйте белый список URL-адресов для контроля доступа к внешним ресурсам.
  • Используйте прокси-сервер для фильтрации запросов и разрешения только тех, которые находятся в белом списке.
  • Ведите журнал всех запросов к внешним ресурсам и ошибок, связанных с доступом.
  • Регулярно проверяйте систему на наличие уязвимостей, связанных с отправкой запросов и безопасностью данных.