メインコンテンツにスキップ
GitHub でこのページを編集する

Superset の設定

superset_config.py

Superset は、config.py モジュールを通じて数百もの設定可能なパラメータを公開しています。公開されている変数とオブジェクトは、設定、変更、およびインターフェースしたい内容の大部分のパブリックインターフェースとして機能します。この Python モジュールには、これらすべてのパラメータ、妥当なデフォルト値、およびコメント形式の豊富なドキュメントがあります。

アプリケーションを設定するには、独自の設定モジュールを作成する必要があります。これにより、これらのパラメータのいくつかまたは多くをオーバーライドできます。コアモジュールを変更する代わりに、独自のモジュール(通常は `superset_config.py` という名前のファイル)を定義します。このファイルを `PYTHONPATH` に追加するか、`superset_config.py` のフルパスを指定する環境変数 `SUPERSET_CONFIG_PATH` を作成します。

たとえば、`superset_config.py` が `/app` ディレクトリにある Linux ベースのシステムに Superset を直接デプロイする場合、次のように実行できます。

export SUPERSET_CONFIG_PATH=/app/superset_config.py

公式の Superset イメージをベースイメージとして使用して独自の Dockerfile を使用している場合は、以下に示すようにオーバーライドを追加できます。

COPY --chown=superset superset_config.py /app/
ENV SUPERSET_CONFIG_PATH /app/superset_config.py

Docker Compose デプロイメントは、特定の規則を使用してアプリケーション設定を異なる方法で処理します。詳細は、Docker Compose のヒントと設定を参照してください。

以下は、`superset_config.py` ファイルで設定できるパラメータのほんかの例です。

# Superset specific config
ROW_LIMIT = 5000

# Flask App Builder configuration
# Your App secret key will be used for securely signing the session cookie
# and encrypting sensitive information on the database
# Make sure you are changing this key for your deployment with a strong key.
# Alternatively you can set it with `SUPERSET_SECRET_KEY` environment variable.
# You MUST set this for production environments or the server will refuse
# to start and you will see an error in the logs accordingly.
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'

# The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
# The check_same_thread=false property ensures the sqlite client does not attempt
# to enforce single-threaded access, which may be problematic in some edge cases
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db?check_same_thread=false'

# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365

# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''
ヒント

通常は、変更したいコアの superset/config.py の部分と関連するコメントのみを独自の `superset_config.py` ファイルにコピーして貼り付けることに注意してください。

superset/config.py で定義されているすべてのパラメータとデフォルト値は、ローカルの `superset_config.py` で変更できます。管理者は、ファイルを熟読して、ローカルで設定できる内容とデフォルト値を理解する必要があります。

`superset_config.py` は Flask 設定モジュールとして機能するため、Flask 自体の設定と、Superset がバンドルする `flask-wtf`、`flask-caching`、`flask-migrate`、`flask-appbuilder` などの Flask 拡張機能の設定を変更するために使用できます。これらの拡張機能はそれぞれ、複雑な設定を提供します。Superset で使用されている Web フレームワークである Flask App Builder も、多くの設定を提供しています。設定方法の詳細については、Flask App Builder のドキュメントを参照してください。

少なくとも、`SECRET_KEY` と `SQLALCHEMY_DATABASE_URI` は変更する必要があります。これらの詳細については、以下をお読みください。

SECRET_KEY の指定

初期 SECRET_KEY の追加

Superset を起動するには、ユーザーが指定した SECRET_KEY が必要です。この要件は、バージョン 2.1.0 で追加され、安全な設定を強制しました。`superset_config.py` ファイルに、次のような強力な SECRET_KEY を追加します。

SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'

強力な安全なキーは、`openssl rand -base64 42` で生成できます。

強力な秘密鍵を使用する

このキーは、セッション Cookie の安全な署名と、Superset のアプリケーションメタデータデータベースに保存されている機密情報の暗号化に使用されます。デプロイメントでは、複雑で一意のキーを使用する必要があります。

新しい SECRET_KEY へのローテーション

既存の SECRET_KEY を変更する場合は、既存の SECRET_KEY を `PREVIOUS_SECRET_KEY = ` として `superset_config.py` ファイルに追加し、新しいキーを `SECRET_KEY =` として指定します。現在の SECRET_KEY は、次のコマンドで見つけることができます。Superset を Docker で実行している場合は、Superset アプリケーションコンテナ内から実行します。

superset shell
from flask import current_app; print(current_app.config["SECRET_KEY"])

これらの値で `superset_config.py` を保存し、`superset re-encrypt-secrets` を実行します。

本番メタデータデータベースの設定

Superset は、チャート、ダッシュボード、その他多くのものの定義など、管理する情報を保存するためのデータベースが必要です。

デフォルトでは、Superset は、シンプルで高速な開始方法を提供する(インストールを必要としない)自己完結型の単一ファイルデータベースである SQLite を使用するように設定されています。ただし、本番環境では、セキュリティ、スケーラビリティ、およびデータの整合性の理由から、SQLite の使用は強くお勧めしません。サポートされているデータベースエンジンのみを使用し、別のホストまたはコンテナで別のデータベースエンジンを使用することを検討することが重要です。.

Superset は、次のデータベースエンジン/バージョンをサポートしています。

データベースエンジンサポートされているバージョン
PostgreSQL10.X、11.X、12.X、13.X、14.X、15.X
MySQL5.7、8.X

次のデータベースドライバーと接続文字列を使用します。

データベースPyPI パッケージ接続文字列
PostgreSQLpip install psycopg2postgresql://<ユーザー名>:<DBパスワード>@<データベースホスト>/<データベース名>
MySQLpip install mysqlclientmysql://<ユーザー名>:<DBパスワード>@<データベースホスト>/<データベース名>
ヒント

メタデータストアの適切な設定はこのドキュメントの範囲外です。サービスとサポートインフラストラクチャおよびバックアップ戦略を処理するために、Amazon RDSGoogle Cloud Databases などのホスト型マネージドサービスを使用することをお勧めします。

Superset メタストアを設定するには、`superset_config` の `SQLALCHEMY_DATABASE_URI` 設定キーを適切な接続文字列に設定します。

WSGI HTTP サーバーでの実行

Superset は NGINX または Apache で実行できますが、非同期モードで Gunicorn を使用することをお勧めします。これにより、優れた並行性が実現し、インストールと設定が非常に簡単になります。お使いの環境で適切に機能する方法でこの Flask WSGI アプリケーションを設定する方法については、ご希望のテクノロジーのドキュメントを参照してください。本番環境でうまく機能することが知られている非同期設定を次に示します。

      -w 10 \
-k gevent \
--worker-connections 1000 \
--timeout 120 \
-b 0.0.0.0:6666 \
--limit-request-line 0 \
--limit-request-field_size 0 \
--statsd-host localhost:8125 \
"superset.app:create_app()"

詳細については、Gunicorn のドキュメントを参照してください。*開発 Web サーバー(`superset run` または `flask run`)は、本番環境での使用を意図したものではないことに注意してください。*

Gunicorn を使用していない場合は、`superset_config.py` で `COMPRESS_REGISTER = False` を設定することにより、`flask-compress` の使用を無効にすることができます。

現在、Google BigQuery Python SDK は、`gevent` による Python コアライブラリの一部の動的モンキーパッチにより、`gevent` と互換性がありません。そのため、Superset で `BigQuery` データソースを使用する場合は、`gevent` 以外の `gunicorn` ワーカタイプを使用する必要があります。

HTTPS 設定

ロードバランサーまたはリバースプロキシ(nginx など)を介して HTTPS アップストリームを設定し、トラフィックが Superset アプリケーションに到達する前に SSL/TLS オフロードを実行できます。この設定では、アラートとレポートのチャートのスナップショットを取得する Celery ワーカからのローカルトラフィックは、イングレスポイントの背後から `http://` URL で Superset にアクセスできます。公式の Superset Docker イメージを使用している場合は、Gunicorn で SSL を設定することもできます(Python Web サーバー)。

ロードバランサーの背後での設定

ロードバランサーまたはリバースプロキシ(AWS の NGINX または ELB など)の背後で superset を実行している場合は、ロードバランサーが superset インスタンスが実行されているかどうかを認識できるように、ヘルスチェックエンドポイントを使用する必要がある場合があります。これは `/health` で提供され、Web サーバーが実行されている場合は「OK」を含む 200 応答を返します。

ロードバランサーが `X-Forwarded-For/X-Forwarded-Proto` ヘッダーを挿入している場合は、superset 設定ファイル(`superset_config.py`)で `ENABLE_PROXY_FIX = True` を設定して、ヘッダーを抽出して使用する必要があります。

リバースプロキシが SSL 暗号化を提供するために使用されている場合は、`X-Forwarded-Proto` を明示的に定義する必要がある場合があります。Apache Web サーバーの場合、これは次のように設定できます。

RequestHeader set X-Forwarded-Proto "https"

カスタムOAuth2設定

SupersetはFlask-AppBuilder (FAB)上に構築されており、多くのプロバイダー(GitHub、Twitter、LinkedIn、Google、Azureなど)を標準でサポートしています。それらに加えて、Supersetは「code」認証をサポートする他のOAuth2認証サーバー実装と接続するように設定できます。

pipパッケージAuthlibがWebサーバーにインストールされていることを確認してください。

まず、Supersetのsuperset_config.pyで認証を設定します。

from flask_appbuilder.security.manager import AUTH_OAUTH

# Set the authentication type to OAuth
AUTH_TYPE = AUTH_OAUTH

OAUTH_PROVIDERS = [
{ 'name':'egaSSO',
'token_key':'access_token', # Name of the token in the response of access_token_url
'icon':'fa-address-card', # Icon for the provider
'remote_app': {
'client_id':'myClientId', # Client Id (Identify Superset application)
'client_secret':'MySecret', # Secret for this Client Id (Identify Superset application)
'client_kwargs':{
'scope': 'read' # Scope for the Authorization
},
'access_token_method':'POST', # HTTP Method to call access_token_url
'access_token_params':{ # Additional parameters for calls to access_token_url
'client_id':'myClientId'
},
'jwks_uri':'https://myAuthorizationServe/adfs/discovery/keys', # may be required to generate token
'access_token_headers':{ # Additional headers for calls to access_token_url
'Authorization': 'Basic Base64EncodedClientIdAndSecret'
},
'api_base_url':'https://myAuthorizationServer/oauth2AuthorizationServer/',
'access_token_url':'https://myAuthorizationServer/oauth2AuthorizationServer/token',
'authorize_url':'https://myAuthorizationServer/oauth2AuthorizationServer/authorize'
}
}
]

# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True

# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = "Public"

次に、SupersetSecurityManagerを拡張し、oauth_user_infoをオーバーライドするCustomSsoSecurityManagerを作成します。

import logging
from superset.security import SupersetSecurityManager

class CustomSsoSecurityManager(SupersetSecurityManager):

def oauth_user_info(self, provider, response=None):
logging.debug("Oauth2 provider: {0}.".format(provider))
if provider == 'egaSSO':
# As example, this line request a GET to base_url + '/' + userDetails with Bearer Authentication,
# and expects that authorization server checks the token, and response with user details
me = self.appbuilder.sm.oauth_remotes[provider].get('userDetails').data
logging.debug("user_data: {0}".format(me))
return { 'name' : me['name'], 'email' : me['email'], 'id' : me['user_name'], 'username' : me['user_name'], 'first_name':'', 'last_name':''}
...

このファイルは、superset_config.pyと同じディレクトリにcustom_sso_security_manager.pyという名前で配置する必要があります。最後に、superset_config.pyに次の2行を追加します。

from custom_sso_security_manager import CustomSsoSecurityManager
CUSTOM_SECURITY_MANAGER = CustomSsoSecurityManager

注記

  • リダイレクトURLはhttps://<superset-webserver>/oauth-authorized/<provider-name>となります。必要に応じて、OAuth2認証プロバイダーを設定する際に使用します。たとえば、上記の設定では、リダイレクトURLはhttps://<superset-webserver>/oauth-authorized/egaSSOとなります。

  • OAuth2認証サーバーがOpenID Connect 1.0をサポートしている場合、api_base_urlaccess_token_urlauthorize_url、およびユーザー情報エンドポイント、jwks uriなどの他の必須オプションを提供せずに、設定ドキュメントURLのみを設定できます。例えば

    OAUTH_PROVIDERS = [
    { 'name':'egaSSO',
    'token_key':'access_token', # Name of the token in the response of access_token_url
    'icon':'fa-address-card', # Icon for the provider
    'remote_app': {
    'client_id':'myClientId', # Client Id (Identify Superset application)
    'client_secret':'MySecret', # Secret for this Client Id (Identify Superset application)
    'server_metadata_url': 'https://myAuthorizationServer/.well-known/openid-configuration'
    }
    }
    ]

Flask-OIDCを使用したKeycloak固有の設定

OpenID Connect 1.0プロバイダーとしてKeycloakを使用している場合、Authlibに基づく上記の設定は機能しない場合があります。この場合、Flask-OIDCを使用することが有効な選択肢となります。

pipパッケージFlask-OIDCがWebサーバーにインストールされていることを確認してください。これはバージョン2.2.0を使用して正常にテストされました。このパッケージは、依存関係としてFlask-OpenIDが必要です。

以下のコードは、新しいセキュリティマネージャーを定義しています。superset_config.pyファイルと同じディレクトリに配置された、keycloak_security_manager.pyという名前の新しいファイルに、これを追加します。

from flask_appbuilder.security.manager import AUTH_OID
from superset.security import SupersetSecurityManager
from flask_oidc import OpenIDConnect
from flask_appbuilder.security.views import AuthOIDView
from flask_login import login_user
from urllib.parse import quote
from flask_appbuilder.views import ModelView, SimpleFormView, expose
from flask import (
redirect,
request
)
import logging

class OIDCSecurityManager(SupersetSecurityManager):

def __init__(self, appbuilder):
super(OIDCSecurityManager, self).__init__(appbuilder)
if self.auth_type == AUTH_OID:
self.oid = OpenIDConnect(self.appbuilder.get_app)
self.authoidview = AuthOIDCView

class AuthOIDCView(AuthOIDView):

@expose('/login/', methods=['GET', 'POST'])
def login(self, flag=True):
sm = self.appbuilder.sm
oidc = sm.oid

@self.appbuilder.sm.oid.require_login
def handle_login():
user = sm.auth_user_oid(oidc.user_getfield('email'))

if user is None:
info = oidc.user_getinfo(['preferred_username', 'given_name', 'family_name', 'email'])
user = sm.add_user(info.get('preferred_username'), info.get('given_name'), info.get('family_name'),
info.get('email'), sm.find_role('Gamma'))

login_user(user, remember=False)
return redirect(self.appbuilder.get_url_for_index)

return handle_login()

@expose('/logout/', methods=['GET', 'POST'])
def logout(self):
oidc = self.appbuilder.sm.oid

oidc.logout()
super(AuthOIDCView, self).logout()
redirect_url = request.url_root.strip('/') + self.appbuilder.get_url_for_login

return redirect(
oidc.client_secrets.get('issuer') + '/protocol/openid-connect/logout?redirect_uri=' + quote(redirect_url))

次に、superset_config.pyファイルに以下を追加します。

from keycloak_security_manager import OIDCSecurityManager
from flask_appbuilder.security.manager import AUTH_OID, AUTH_REMOTE_USER, AUTH_DB, AUTH_LDAP, AUTH_OAUTH
import os

AUTH_TYPE = AUTH_OID
SECRET_KEY: 'SomethingNotEntirelySecret'
OIDC_CLIENT_SECRETS = '/path/to/client_secret.json'
OIDC_ID_TOKEN_COOKIE_SECURE = False
OIDC_OPENID_REALM: '<myRealm>'
OIDC_INTROSPECTION_AUTH_METHOD: 'client_secret_post'
CUSTOM_SECURITY_MANAGER = OIDCSecurityManager

# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True

# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = 'Public'

クライアント固有のOpenID情報をclient_secret.jsonというファイルに保存します。このファイルをsuperset_config.pyと同じディレクトリに作成します。

{
"<myOpenIDProvider>": {
"issuer": "https://<myKeycloakDomain>/realms/<myRealm>",
"auth_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/auth",
"client_id": "https://<myKeycloakDomain>",
"client_secret": "<myClientSecret>",
"redirect_uris": [
"https://<SupersetWebserver>/oauth-authorized/<myOpenIDProvider>"
],
"userinfo_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/userinfo",
"token_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/token",
"token_introspection_uri": "https://<myKeycloakDomain>/realms/<myRealm>/protocol/openid-connect/token/introspect"
}
}

LDAP認証

FABは、LDAPサーバーに対するユーザー資格情報の認証をサポートしています。LDAPを使用するには、python-ldapパッケージをインストールする必要があります。詳細は、FABのLDAPドキュメントを参照してください。

LDAPまたはOAUTHグループをSupersetロールにマッピングする

Flask-AppBuilderのAUTH_ROLES_MAPPINGは、LDAP/OAUTHグループ名をFABロールにマッピングする辞書です。LDAPまたはOAuthを使用して認証するユーザーにロールを割り当てるために使用されます。

OAUTHグループをSupersetロールにマッピングする

以下のAUTH_ROLES_MAPPING辞書は、OAUTHグループ「superset_users」をSupersetロール「Gamma」と「Alpha」に、OAUTHグループ「superset_admins」をSupersetロール「Admin」にマッピングします。

AUTH_ROLES_MAPPING = {
"superset_users": ["Gamma","Alpha"],
"superset_admins": ["Admin"],
}

LDAPグループをSupersetロールにマッピングする

以下のAUTH_ROLES_MAPPING辞書は、LDAP DN「cn=superset_users,ou=groups,dc=example,dc=com」をSupersetロール「Gamma」と「Alpha」に、LDAP DN「cn=superset_admins,ou=groups,dc=example,dc=com」をSupersetロール「Admin」にマッピングします。

AUTH_ROLES_MAPPING = {
"cn=superset_users,ou=groups,dc=example,dc=com": ["Gamma","Alpha"],
"cn=superset_admins,ou=groups,dc=example,dc=com": ["Admin"],
}

注:これには、AUTH_LDAP_SEARCHの設定が必要です。詳細については、FABセキュリティドキュメントを参照してください。

ログイン時のロールの同期

AUTH_ROLES_SYNC_AT_LOGIN設定変数を使用して、Flask-AppBuilderがユーザーのロールをLDAP/OAUTHグループと同期する頻度を制御することもできます。AUTH_ROLES_SYNC_AT_LOGINがTrueに設定されている場合、Flask-AppBuilderはユーザーがログインするたびにユーザーのロールを同期します。AUTH_ROLES_SYNC_AT_LOGINがFalseに設定されている場合、Flask-AppBuilderはユーザーが最初に登録したときのみユーザーのロールを同期します。

Flaskアプリ設定フック

FLASK_APP_MUTATORは、環境内で提供できる設定関数であり、アプリオブジェクトを受け取り、任意の方法で変更できます。たとえば、セッションCookieの有効期限を24時間に設定するには、superset_config.pyFLASK_APP_MUTATORを追加します。

from flask import session
from flask import Flask


def make_session_permanent():
'''
Enable maxAge for the cookie 'session'
'''
session.permanent = True

# Set up max age of session to 24 hours
PERMANENT_SESSION_LIFETIME = timedelta(hours=24)
def FLASK_APP_MUTATOR(app: Flask) -> None:
app.before_request_funcs.setdefault(None, []).append(make_session_permanent)

機能フラグ

多様なユーザーセットをサポートするために、Supersetにはデフォルトで有効になっていない機能がいくつかあります。たとえば、一部のユーザーはセキュリティ制限が厳しく、そうでないユーザーもいます。そのため、Supersetでは、設定によって一部の機能を有効または無効にすることができます。機能所有者の場合、Supersetにオプションの機能を追加できますが、ユーザーのサブセットのみに影響します。

superset_config.pyからフラグを使用して機能を有効または無効にできます。

FEATURE_FLAGS = {
'PRESTO_EXPAND_DATA': False,
}

機能フラグの現在のリストは、RESOURCES/FEATURE_FLAGS.mdにあります。