Краткое интро
Вышла новая версия 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
:
None
(по умолчанию): Это значение означает, что сессионные куки будут отправляться в запросах на другие сайты или поддомены. Это наиболее распространенное поведение и подходит для большинства случаев.Lax
: Это значение означает, что браузер будет отправлять сессионные куки в запросах на другие сайты, если запрос инициирован из тега<a>
(гиперссылки), но не при отправке запросов из скриптов, изображений и т. д. Это предостерегает от некоторых видов атак, таких как CSRF (межсайтовая подделка запросов).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
, чтобы отключить CSPTALISMAN_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.
"force_https": True
: Эта настройка указывает, что вы хотите принудительно перенаправлять все HTTP-запросы на HTTPS. Таким образом, она обеспечивает обязательное использование защищенного соединения (HTTPS) для вашего веб-приложения. Это важная мера безопасности, так как HTTPS обеспечивает шифрование данных между клиентом и сервером, что помогает защитить данные в пути от перехвата и вмешательства злоумышленников."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
Leave a Reply