Superset 3.0: Talisman security. CSP требования. Что это?

Краткое интро

Вышла новая версия Apache Superset 3.0. При попытке установить non-dev версию суперсет не пускает внутрь (не логинится) и ругается по всякому:

flask_wtf.csrf.CSRFError: 400 Bad Request: The CSRF session token is missing.
WARNING:superset.views.base:Refresh CSRF token error

У кого-то возникают ошибки при попытки отобразить картинку в дашборде со стороннего сервера. Это происходит по причине новшеств в Superset 3.0.0. Был добавлен Talisman.

Ниже будут приведены выжимки из документации и настройка Apache Superset 3.0.0 для продуктивного сервера для http (незащищенного) и https (защищенного) вариантов.

Значения по-умолчанию файла config.py в версии Superset 3.0.0

Для дева и прода версии настроект отличаются.

# Enable/disable CSP warning
CONTENT_SECURITY_POLICY_WARNING = True

# Do you want Talisman enabled?
TALISMAN_ENABLED = utils.cast_to_boolean(os.environ.get("TALISMAN_ENABLED", True))

# If you want Talisman, how do you want it configured??
TALISMAN_CONFIG = {
    "content_security_policy": {
        "default-src": ["'self'"],
        "img-src": ["'self'", "data:"],
        "worker-src": ["'self'", "blob:"],
        "connect-src": [
            "'self'",
            "https://api.mapbox.com",
            "https://events.mapbox.com",
        ],
        "object-src": "'none'",
        "style-src": ["'self'", "'unsafe-inline'"],
        "script-src": ["'self'", "'strict-dynamic'"],
    },
    "content_security_policy_nonce_in": ["script-src"],
    "force_https": False,
}
# React requires `eval` to work correctly in dev mode
TALISMAN_DEV_CONFIG = {
    "content_security_policy": {
        "default-src": ["'self'"],
        "img-src": ["'self'", "data:"],
        "worker-src": ["'self'", "blob:"],
        "connect-src": [
            "'self'",
            "https://api.mapbox.com",
            "https://events.mapbox.com",
        ],
        "object-src": "'none'",
        "style-src": ["'self'", "'unsafe-inline'"],
        "script-src": ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
    },
    "content_security_policy_nonce_in": ["script-src"],
    "force_https": False,
}

#
# Flask session cookie options
#
# See https://flask.palletsprojects.com/en/1.1.x/security/#set-cookie-options
# for details
#
SESSION_COOKIE_HTTPONLY = True  # Prevent cookie from being read by frontend JS?
SESSION_COOKIE_SECURE = False  # Prevent cookie from being transmitted over non-tls?
SESSION_COOKIE_SAMESITE: Literal["None", "Lax", "Strict"] | None = "Lax"

Что такое Talisman?

Talisman — это расширение (middleware) для Flask (популярного веб-фреймворка на языке Python, на основе которого работает Apache Superset), которое обеспечивает дополнительный уровень безопасности для вашего веб-приложения. Оно позволяет вам легко внедрить различные меры безопасности, такие как Content Security Policy (Политика безопасности контента), HTTP Strict Transport Security (HTTP-строгая защита транспортного уровня), реализацию заголовков безопасности и другие.

После настройки Talisman в вашем инстансе Apache Superset, он будет автоматически добавлять соответствующие HTTP-заголовки безопасности к вашим HTTP-ответам, обеспечивая дополнительный уровень защиты от различных видов атак, таких как атаки внедрения скриптов (XSS) и другие угрозы безопасности.

Конфигурация Talisman по умолчанию

  • Принудительно все подключаются к https, если только они не работают в режиме debug.
  • Включает строгую транспортную безопасность HTTP.
  • Устанавливает для файла cookie сеанса Flask значение secure, поэтому он никогда не будет установлен, если к вашему приложению каким-либо образом осуществляется доступ через незащищенное соединение.
  • Устанавливает для файла cookie сеанса Flask значение httponly , предотвращая доступ JavaScript к его содержимому. CSRF через Ajax использует отдельный файл cookie и на него это не влияет.
  • Устанавливает для файла cookie сеанса Flask значение Lax, предотвращая утечку файла cookie в методах запроса, подверженных CSRF.
  • Устанавливает X-Frame-Options в SAMEORIGIN , чтобы избежать кликджекинга .
  • Устанавливает X-Content-Type-Options для предотвращения перехвата типов контента.
  • Устанавливает строгую политику безопасности контента default -src: 'self', 'object-src': 'none'. Это предназначено для почти полного предотвращения атак межсайтового скриптинга (XSS). Вероятно, это единственная настройка, которую вам следует разумно изменить. См. раздел «Политика безопасности контента» .
  • Устанавливает строгую политику реферера строгого происхождения при перекрестном происхождении, которая определяет, какую информацию о реферере следует включать в сделанные запросы.
  • По умолчанию отключает темы просмотра в политике разрешений, например Drupal, для повышения защиты конфиденциальности.

В дополнение к Talisman всегда следует использовать библиотеку межсайтовой подделки запросов (CSRF).

Пользовательские сессии в Apache Superset

Superset использует Flask и Flask-Login для управления сеансами пользователей.

Файлы cookie сеанса используются для сохранения информации о сеансе и состояния пользователя между запросами, хотя они не содержат личной информации пользователя, но служат для идентификации сеанса пользователя на стороне сервера. Файл cookie сеанса шифруется приложением SECRET_KEY и не может быть прочитан клиентом. Поэтому очень важно сохранить SECRET_KEY и установить безопасное уникальное сложное случайное значение.

Flask и Flask-Login предлагают ряд параметров конфигурации для управления поведением сеанса.

Соответствующие настройки Flask:

  • SESSION_COOKIE_HTTPONLY: (по умолчанию: False): определяет, следует ли устанавливать файлы cookie с этим HttpOnly флагом.
  • SESSION_COOKIE_SECURE: (по умолчанию: False) Браузеры будут отправлять файлы cookie с запросами через HTTPS только в том случае, если файл cookie помечен как «secure». Чтобы это имело смысл, приложение должно обслуживаться через HTTPS.
  • SESSION_COOKIE_SAMESITE: (по умолчанию: Lax) Не позволяет браузеру отправлять этот файл cookie вместе с межсайтовыми запросами.
  • PERMANENT_SESSION_LIFETIME: (по умолчанию: 31 days) Время существования постоянного сеанса как datetime.timedelta объекта.

SESSION_COOKIE_HTTPONLY

SESSION_COOKIE_HTTPONLY — это настройка, которая определяет, должен ли браузер отправлять куки сессии (session cookies) назад на сервер, когда происходит запрос к веб-приложению. Установка этой опции включает или отключает HTTPOnly атрибут для сессионных куки.

HTTPOnly — это атрибут куки, который предотвращает доступ к содержимому куки через JavaScript на стороне клиента. Это означает, что скрипты на веб-странице не могут прочитать или модифицировать содержимое сессионных куки. Это важная мера безопасности, которая помогает предотвратить атаки на основе куки, такие как атаки на сеанс (session hijacking).

SESSION_COOKIE_SECURE

SESSION_COOKIE_SECURE — это настройка, которая определяет, должны ли сессионные куки передаваться только через защищенное соединение (HTTPS). Установка этой опции включает или отключает атрибут Secure для сессионных куки.

Установка SESSION_COOKIE_SECURE в True означает, что сессионные куки будут отправляться только в том случае, если соединение между клиентом и сервером обеспечивается через протокол HTTPS. Это увеличивает безопасность, так как куки, содержащие данные сеанса, не будут передаваться через незашифрованные (HTTP) соединения, что делает их менее уязвимыми для перехвата и атак.

SESSION_COOKIE_SAMESITE

SESSION_COOKIE_SAMESITE — это настройка, которая определяет атрибут SameSite для сессионных куков (session cookies). Атрибут SameSite предназначен для контроля того, когда браузер должен отправлять сессионные куки в запросах на другие сайты или поддомены.

Существуют три возможных значения для SESSION_COOKIE_SAMESITE:

  1. None (по умолчанию): Это значение означает, что сессионные куки будут отправляться в запросах на другие сайты или поддомены. Это наиболее распространенное поведение и подходит для большинства случаев.
  2. Lax: Это значение означает, что браузер будет отправлять сессионные куки в запросах на другие сайты, если запрос инициирован из тега <a> (гиперссылки), но не при отправке запросов из скриптов, изображений и т. д. Это предостерегает от некоторых видов атак, таких как CSRF (межсайтовая подделка запросов).
  3. Strict: Это значение означает, что сессионные куки не будут отправляться в запросах на другие сайты, даже если они инициированы из тега <a>. Это обеспечивает наивысший уровень безопасности, но может вызвать проблемы с функциональностью, например, если ваше веб-приложение взаимодействует с другими доменами.

PERMANENT_SESSION_LIFETIME

PERMANENT_SESSION_LIFETIME — это настройка, которая определяет продолжительность сессии в вашем веб-приложении, выраженную в секундах. Она определяет, сколько времени сессионные данные пользователя будут храниться после его последней активности. Когда сессия истекает, пользователь будет вынужден снова войти в систему.

Политика безопасности контента (CSP)

Superset 3.0 использует расширение Talisman для реализации политики безопасности контента (CSP) — дополнительного уровня безопасности, который помогает обнаруживать и смягчать определенные типы атак, включая межсайтовый скриптинг (XSS) и атаки путем внедрения данных.

CSP позволяет администраторам серверов уменьшить или исключить векторы возникновения XSS, указав домены, которые браузер должен считать действительными источниками исполняемых сценариев. Тогда CSP-совместимый браузер будет выполнять только сценарии, загруженные в исходные файлы, полученные из этих разрешенных доменов, игнорируя все остальные сценарии (включая встроенные сценарии и HTML-атрибуты обработки событий).

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

Начиная с версии 2.1.1 в логах вы можете обнаружить следующие Warnings:

WARNING:superset.initialization:We haven’t found any Content Security Policy (CSP) defined in the configurations. Please make sure to configure CSP using the TALISMAN_ENABLED and TALISMAN_CONFIG keys or any other external software. Failing to configure CSP have serious security implications. Check https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP for more information. You can disable this warning using the CONTENT_SECURITY_POLICY_WARNING key.

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

Superset предоставляет две переменные config.py для развертывания CSP:

  • TALISMAN_ENABLED по умолчанию True; установите это значение False, чтобы отключить CSP
  • TALISMAN_CONFIG содержит фактическое определение политики (см. пример ниже), а также любые другие аргументы, которые должны быть переданы Talisman.

При работе в производственном режиме Superset при запуске проверяет наличие CSP. Если он не найден, он выдаст предупреждение об угрозах безопасности. В средах, где политики CSP определены вне Superset с использованием другого программного обеспечения, администраторы могут отключить это предупреждение, используя ключ CONTENT_SECURITY_POLICY_WARNING в config.py.

Требования к CSP

Для работы Superset необходима директива CSP style-src unsafe-inline

style-src 'self' 'unsafe-inline'

Только сценарии, отмеченные nonce, могут быть загружены и выполнены. Nonce — это случайная строка, автоматически генерируемая Talisman при каждой загрузке страницы. Вы можете получить текущее значение nonce, вызвав макрос jinja csp_nonce().

<script nonce="{{ csp_nonce() }}">
/* my script */
</script>

Некоторые информационные панели загружают изображения с помощью URI данных и data: требуют img-src

img-src 'self' data:

Диаграммы MapBox используют рабочие процессы и требуют подключения к серверам MapBox в дополнение к источнику Superset.

worker-src 'self' blob:
connect-src 'self' https://api.mapbox.com https://events.mapbox.com

Другие директивы CSP по умолчанию 'self' ограничивают содержимое тем же источником, что и сервер Superset.

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

Настройки TALISMAN_ENABLED

Установка TALISMAN_ENABLED = True активирует защиту Талисмана с его аргументами по умолчанию, из которых content_security_policy только один. Их можно найти в документации Талисмана в разделе «Параметры». Обычно они повышают безопасность, но администраторы должны знать об их существовании.

В частности, опция force_https = True (False по-умолчанию) может привести к поломке оповещений и отчетов Superset, если workers настроены на доступ к диаграммам через WEBDRIVER_BASEURL, который начинается с http://. Пока развертывание Superset обеспечивает https upstream, например, через балансировщик загрузчика или шлюз приложений, можно оставить эту опцию отключенной. В противном случае вы можете включить force_https следующее:

TALISMAN_CONFIG = {
    "force_https": True,
    "content_security_policy": { ...

TALISMAN_CONFIG — это словарь с настройками для Talisman.

  1. "force_https": True: Эта настройка указывает, что вы хотите принудительно перенаправлять все HTTP-запросы на HTTPS. Таким образом, она обеспечивает обязательное использование защищенного соединения (HTTPS) для вашего веб-приложения. Это важная мера безопасности, так как HTTPS обеспечивает шифрование данных между клиентом и сервером, что помогает защитить данные в пути от перехвата и вмешательства злоумышленников.
  2. "content_security_policy": Эта часть настроек определяет политику безопасности контента (CSP) для вашего веб-приложения. Она позволяет вам указать, откуда разрешено загружать ресурсы, такие как скрипты, стили, изображения и другие. Ваш пример предоставляет заголовок CSP, который необходимо настроить в соответствии с конкретными требованиями вашего приложения и уровнем безопасности, который вы хотите обеспечить.

Настройки Apache Superset 3.0.0

для http при настройке TALISMAN_ENABLED = False

Для того, чтобы Superset прекратил ругаться на CSRF, достаточно отключить Talisman с помощью команды:

TALISMAN_ENABLED = False

Как на картинке:

для https при настройке TALISMAN_ENABLED = True

todo

Ivan Shamaev (Admin)
Работаю с Apache Superset с 2021 года. Веду этот блог, чтобы систематизировать свои знания и поделиться ими с другими специалистами. Подписывайтесь на мой телеграм канал @apache_superset_bi
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x