| {/* |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| */} |
| |
| --- |
| title: AWS IAM Authentication |
| sidebar_label: AWS IAM Authentication |
| sidebar_position: 15 |
| --- |
| |
| # AWS IAM Authentication for AWS Databases |
| |
| Superset supports IAM-based authentication for **Amazon Aurora** (PostgreSQL and MySQL) and **Amazon Redshift**. IAM auth eliminates the need for database passwords — Superset generates a short-lived auth token using temporary AWS credentials instead. |
| |
| Cross-account IAM role assumption via STS `AssumeRole` is supported, allowing a Superset deployment in one AWS account to connect to databases in a different account. |
| |
| ## Prerequisites |
| |
| - Enable the `AWS_DATABASE_IAM_AUTH` feature flag in `superset_config.py`. IAM authentication is gated behind this flag; if it is disabled, connections using `aws_iam` fail with *"AWS IAM database authentication is not enabled."* |
| ```python |
| FEATURE_FLAGS = { |
| "AWS_DATABASE_IAM_AUTH": True, |
| } |
| ``` |
| - `boto3` must be installed in your Superset environment: |
| ```bash |
| pip install boto3 |
| ``` |
| - The Superset server's IAM role (or static credentials) must have permission to call `sts:AssumeRole` (for cross-account) or the same-account permissions for the target service: |
| - **Aurora (RDS)**: `rds-db:connect` |
| - **Redshift provisioned**: `redshift:GetClusterCredentials` |
| - **Redshift Serverless**: `redshift-serverless:GetCredentials` and `redshift-serverless:GetWorkgroup` |
| - SSL must be enabled on the Aurora / Redshift endpoint (required for IAM token auth). |
| |
| ## Configuration |
| |
| IAM authentication is configured via the **encrypted_extra** field of the database connection. Access this field in the **Advanced** → **Security** section of the database connection form, under **Secure Extra**. |
| |
| ### Aurora PostgreSQL or Aurora MySQL |
| |
| ```json |
| { |
| "aws_iam": { |
| "enabled": true, |
| "role_arn": "arn:aws:iam::222222222222:role/SupersetDatabaseAccess", |
| "external_id": "superset-prod-12345", |
| "region": "us-east-1", |
| "db_username": "superset_iam_user", |
| "session_duration": 3600 |
| } |
| } |
| ``` |
| |
| | Field | Required | Description | |
| |-------|----------|-------------| |
| | `enabled` | Yes | Set to `true` to activate IAM auth | |
| | `role_arn` | No | ARN of the cross-account IAM role to assume via STS. Omit for same-account auth | |
| | `external_id` | No | External ID for the STS `AssumeRole` call, if required by the target role's trust policy | |
| | `region` | Yes | AWS region of the database cluster | |
| | `db_username` | Yes | The database username associated with the IAM identity | |
| | `session_duration` | No | STS session duration in seconds (default: `3600`) | |
| |
| ### Redshift (Serverless) |
| |
| ```json |
| { |
| "aws_iam": { |
| "enabled": true, |
| "role_arn": "arn:aws:iam::222222222222:role/SupersetRedshiftAccess", |
| "region": "us-east-1", |
| "workgroup_name": "my-workgroup", |
| "db_name": "dev" |
| } |
| } |
| ``` |
| |
| ### Redshift (Provisioned Cluster) |
| |
| ```json |
| { |
| "aws_iam": { |
| "enabled": true, |
| "role_arn": "arn:aws:iam::222222222222:role/SupersetRedshiftAccess", |
| "region": "us-east-1", |
| "cluster_identifier": "my-cluster", |
| "db_username": "superset_iam_user", |
| "db_name": "dev" |
| } |
| } |
| ``` |
| |
| ## Cross-Account IAM Setup |
| |
| To connect to a database in Account B from a Superset deployment in Account A: |
| |
| **1. In Account B — create a database-access role:** |
| |
| ```json |
| { |
| "Version": "2012-10-17", |
| "Statement": [ |
| { |
| "Effect": "Allow", |
| "Action": ["rds-db:connect"], |
| "Resource": "arn:aws:rds-db:us-east-1:222222222222:dbuser/db-XXXXXXXXXXXX/superset_iam_user" |
| } |
| ] |
| } |
| ``` |
| |
| **Trust policy** (allows Account A's Superset role to assume it): |
| |
| ```json |
| { |
| "Version": "2012-10-17", |
| "Statement": [ |
| { |
| "Effect": "Allow", |
| "Principal": { |
| "AWS": "arn:aws:iam::111111111111:role/SupersetInstanceRole" |
| }, |
| "Action": "sts:AssumeRole", |
| "Condition": { |
| "StringEquals": { |
| "sts:ExternalId": "superset-prod-12345" |
| } |
| } |
| } |
| ] |
| } |
| ``` |
| |
| **2. In Account A — grant Superset's role permission to assume the Account B role:** |
| |
| ```json |
| { |
| "Effect": "Allow", |
| "Action": "sts:AssumeRole", |
| "Resource": "arn:aws:iam::222222222222:role/SupersetDatabaseAccess" |
| } |
| ``` |
| |
| **3. Configure the database connection in Superset** using the `role_arn` and `external_id` from the trust policy (as shown in the configuration example above). |
| |
| ## Credential Caching |
| |
| STS credentials are cached in memory keyed by `(role_arn, region, external_id)` with a 10-minute TTL. This reduces the number of STS API calls when multiple queries are executed with the same connection. Tokens are refreshed automatically before expiry. |