Hi All,

Assuming lazy consensus, I approved [2802] and propose to merge tomorrow,
unless other reviewers raise concerns.

[2802] https://github.com/apache/polaris/pull/2802

Cheers,
Dmitri.

On Thu, Nov 20, 2025 at 11:30 AM Dmitri Bourlatchkov <[email protected]>
wrote:

> Hi All,
>
> I think Fabio made great progress on the KMS work [2802] and the PR is
> approaching a mergeable state. Please have a look.
>
> From my POV, the only concern is exposing new Storage Config properties to
> older clients (even when they were not set explicitly). WDYT?
>
> If that is not an issue for the community, I think we can merge.
>
> [2802] https://github.com/apache/polaris/pull/2802
>
> Thanks,
> Dmitri.
>
> On Mon, Nov 17, 2025 at 1:23 PM Dmitri Bourlatchkov <[email protected]>
> wrote:
>
>> Hi All,
>>
>> Heads up: Fabio made some progress on [2802] (thanks!) and as for me, the
>> PR is almost ready to merge. Please have another look and comment if you
>> have any concerns.
>>
>> We can certainly follow-up with additional feature PRs to enhance KMS
>> support later (as discussed).
>>
>> [2802] https://github.com/apache/polaris/pull/2802
>>
>> Cheers,
>> Dmitri.
>>
>> On Fri, Oct 31, 2025 at 2:00 PM Michael Collado <[email protected]>
>> wrote:
>>
>>> I'm fine with postponing the full implementation for table-level
>>> overrides,
>>> but I think it's worth pointing out that the only real change needed is
>>> on
>>> one in AccessConfigProvider. My primary ask was to ensure that the API be
>>> only changed once so that the implementation under the hood can support
>>> the
>>> new feature without another API change and I think the current PR
>>> supports
>>> that. I'd be happy to build on this to add table-level support with
>>> tests.
>>>
>>> Mike
>>>
>>> On Thu, Oct 30, 2025 at 10:36 AM Dmitri Bourlatchkov <[email protected]>
>>> wrote:
>>>
>>> > To recap the KMS discussion in the community sync meeting today:
>>> >
>>> > Using per-catalog and per-table KMS config was discussed. IIRC, the
>>> general
>>> > agreement was that both options are worth supporting.
>>> >
>>> > However, from the practical perspective, the agreement was to implement
>>> > only per-catalog configuration in the current PR and work on per-table
>>> > support later.
>>> >
>>> > Options for per-table support (need more discussion):
>>> >
>>> > a) Use table properties received via REST API and copy them into
>>> Polaris
>>> > properties in table entities. Use entity properties for producing
>>> > StorageAccessConfig and policies associated with vended credentials.
>>> >
>>> > Option (a) appears to be easier to implement and more flexible (allows
>>> > users to define per-table config using existing SQL-based clients).
>>> >
>>> > b) Use entity-specific Storage Config
>>> >
>>> > Option (b) is also worth considering, but it needs more changes /
>>> > refactoring in Polaris code and it is not clear ATM how clients can
>>> provide
>>> > per-table config in this case.
>>> >
>>> > Cheers,
>>> > Dmitri.
>>> >
>>> >
>>> > On Thu, Oct 30, 2025 at 10:07 AM Dmitri Bourlatchkov <[email protected]
>>> >
>>> > wrote:
>>> >
>>> > > Heads up: I put an item on today's Community Sync agenda for KMS.
>>> > >
>>> > > On Fri, Oct 24, 2025 at 3:20 PM Dmitri Bourlatchkov <
>>> [email protected]>
>>> > > wrote:
>>> > >
>>> > >> Hi All,
>>> > >>
>>> > >> At the high level, both engines and Polaris need to declare one
>>> specific
>>> > >> KMS key ARN for writes (both data and metadata files) and have
>>> policies
>>> > >> that allow accessing any previous KMS keys for reads.
>>> > >>
>>> > >> Do we really need to have that configurable per-table? From my POV
>>> it
>>> > >> feels like a catalog-level concern.
>>> > >>
>>> > >> In any case, even if we support using different keys for new writes
>>> in
>>> > >> different tables, the list of previous KMS ARNs for reads is
>>> probably
>>> > still
>>> > >> a catalog-level concern. Relying on _current_ table metadata
>>> properties
>>> > to
>>> > >> always correctly reflect all possible previous KMS ARNs seems
>>> excessive
>>> > and
>>> > >> risky to me. It would also increase the binding of the table to a
>>> > >> particular storage location / technology. On the other hand,
>>> > catalog-level
>>> > >> config can be adjusted by the Polaris admin user at any time to
>>> correct
>>> > the
>>> > >> list of KMS ARNs so that clients get the right access policies
>>> applied
>>> > to
>>> > >> their session credentials.
>>> > >>
>>> > >> In summary, I think Fabio's example for "storageConfigInfo" goes in
>>> the
>>> > >> right direction conceptually. I'd just propose a couple minor
>>> changes:
>>> > >> * defaultKmsKey -> currentKmsKey ("current" meaning used for new
>>> writes)
>>> > >> * allowedKmsKeys -> make it optional, if not set, allow any KMS ARN
>>> for
>>> > >> reads.
>>> > >>
>>> > >> If we want to have fine-grained per-table configuration, I like
>>> > Michael's
>>> > >> proposal for per-entity (per-table) storage config overrides, but I
>>> also
>>> > >> agree that it's a bigger change (requires some refactoring in the
>>> core
>>> > >> code), so it might be best to address it in follow-up PRs.
>>> > >>
>>> > >> Inspecting table properties could be a convenience feature to allow
>>> for
>>> > >> simpler user-level workflows (e.g. setting them in SQL), but I tend
>>> to
>>> > >> think that ultimately Polaris should keep the "authoritative" data
>>> about
>>> > >> KMS in its own structures (e.g. Storage Config) and use table
>>> properties
>>> > >> only as a source of changes to that data. In that regard, I believe
>>> it
>>> > >> might be preferable to use Polaris-specific properties names (NOT
>>> > >> "s3.sse.key").
>>> > >>
>>> > >> As for the "s3.sse.key" property, I do not think that Iceberg itself
>>> > >> loads it from table metadata properties. AFAIK, Iceberg java code
>>> gets
>>> > it
>>> > >> from loadTable REST API responses.
>>> > >>
>>> > >> WDYT?
>>> > >>
>>> > >> Thanks,
>>> > >> Dmitri.
>>> > >>
>>> > >>
>>> > >> On Fri, Oct 24, 2025 at 12:28 PM Rizzo Cascio, Fabio
>>> > >> <[email protected]> wrote:
>>> > >>
>>> > >>> Hi Michael,
>>> > >>>
>>> > >>> For the APIs are you thinking something like this?
>>> > >>>
>>> > >>>
>>> > >>> '{
>>> > >>>    "catalog": {
>>> > >>>      "name": "quickstart_catalog",
>>> > >>>     "type": "INTERNAL",
>>> > >>>     "readOnly": false,
>>> > >>>     "properties": {
>>> > >>>       "default-base-location": "'$STORAGE_LOCATION'"
>>> > >>>     },
>>> > >>>     "storageConfigInfo": {
>>> > >>>       "storageType": "'$STORAGE_TYPE'",
>>> > >>>       "allowedLocations": ["'$STORAGE_LOCATION'"],
>>> > >>>       "allowedKmsKeys": ["arn:aws:kms:us-east-1:***:key/mykey"],
>>> > >>>       "defaultKmsKey": "arn:aws:kms:us-east-1:***:key/mykey"
>>> > >>>     }
>>> > >>>   }
>>> > >>> }'
>>> > >>>
>>> > >>>
>>> > >>> Can you clarify the part where you are referring to the PR #2735 ,
>>> > cause
>>> > >>> I’m not super familiar with that part of the code ?
>>> > >>>
>>> > >>>
>>> > >>> Thanks
>>> > >>>
>>> > >>> Fabio
>>> > >>>
>>> > >>> From: Michael Collado <[email protected]>
>>> > >>> Date: Thursday, 23 October 2025 at 18:04
>>> > >>> To: [email protected] <[email protected]>
>>> > >>> Subject: Re: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>>
>>> > >>> Maybe I caused more confusion than I meant to 😅
>>> > >>>
>>> > >>> In my mind, there are two ways to support table-level overrides
>>> for KMS
>>> > >>> keys:
>>> > >>> 1. We can support StorageConfig overrides at the table level - I
>>> think
>>> > we
>>> > >>> previously talked about this being the right long term approach,
>>> as it
>>> > >>> would be great to allow overrides for more than just KMS keys (for
>>> > >>> example,
>>> > >>> using a base location that's in the catalog's allowed locations,
>>> but
>>> > not
>>> > >>> the default base location). This is a bigger change, however. We
>>> also
>>> > >>> haven't defined an easy way for users to create tables with these
>>> > storage
>>> > >>> overrides.
>>> > >>> 2. Support existing S3FileIO table properties. This feels like a
>>> > >>> necessary
>>> > >>> change anyway, as I think this would be necessary for users to
>>> migrate
>>> > >>> existing tables into Polaris. It's also a smaller change, so I was
>>> > kinda
>>> > >>> hoping we could sneak it in here :)
>>> > >>>
>>> > >>> I think Dmitri's question of whether the metadata.json file is
>>> stored
>>> > >>> encrypted is an important one, as we'd need to know which KMS key
>>> to
>>> > add
>>> > >>> to
>>> > >>> the IAM policy before we can read the metadata.json file to read
>>> the
>>> > >>> table's properties 🤪 . Maybe we can continue with work like #2735
>>> and
>>> > >>> add
>>> > >>> the TableMetadata properties to the Table Entity's properties map?
>>> That
>>> > >>> would allow us to read the encryption properties before we read the
>>> > file
>>> > >>> from storage. This supports existing CREATE TABLE syntax, as users
>>> can
>>> > >>> use
>>> > >>> something like this to specify a table-level override:
>>> > >>>
>>> > >>> CREATE TABLE ... TBLPROPERTIES("s3.sse.type": "kms", "s3.sse.key":
>>> > >>> "arn:aws:kms:us-east-1:***:key/mykey)
>>> > >>>
>>> > >>> However, that doesn't fix the registerTable issue raised. The only
>>> way
>>> > I
>>> > >>> can see to support registering tables that use a different KMS key
>>> from
>>> > >>> the
>>> > >>> catalog default is to follow the pattern we established with
>>> > >>> allowedLocations and defaultBaseLocation. The catalog can support a
>>> > list
>>> > >>> of
>>> > >>> KMS keys that can be used for decryption with one specified as the
>>> > >>> default.
>>> > >>> Again, this feels like an issue that needs to be tackled anyway as
>>> > there
>>> > >>> are definitely catalogs that use a mix of encryption keys.
>>> > >>>
>>> > >>> The encryption keys do need to be returned in the
>>> LoadTableResponse,
>>> > >>> which
>>> > >>> I think the current PR does. That should eliminate the need to
>>> specify
>>> > >>> the
>>> > >>> --conf spark.sql.catalog.polaris.s3.sse.* key/value pairs in the
>>> client
>>> > >>> configuration. Only cases like CREATE TABLE AS SELECT... would
>>> need to
>>> > >>> know
>>> > >>> about the KMS keys beforehand. Simple CREATE TABLE statements can
>>> use
>>> > the
>>> > >>> TBLPROPERTIES config, as in the above example.
>>> > >>>
>>> > >>> This is maybe a lot for one PR, so I'm open to hear about how we
>>> can
>>> > >>> split
>>> > >>> this up and move forward incrementally. But I think it would be
>>> good
>>> > for
>>> > >>> the APIs to be thought of up front.
>>> > >>>
>>> > >>> Mike
>>> > >>>
>>> > >>> On Thu, Oct 23, 2025 at 7:42 AM Rizzo Cascio, Fabio
>>> > >>> <[email protected]> wrote:
>>> > >>>
>>> > >>> > Hi Dmitri,
>>> > >>> >
>>> > >>> > You mean doing a read table data I assume, like this:
>>> > >>> >
>>> > >>> >
>>> > >>>
>>> >
>>> http://localhost:8181/api/catalog/v1/test_catalog/namespaces/fns/tables/t3
>>> > >>> >
>>> > >>> > The answer is yes;  the key it is used to do server-side
>>> encryption
>>> > so
>>> > >>> if
>>> > >>> > the role running the pod has the correct entitlement to use the
>>> key
>>> > to
>>> > >>> > decrypt the data there would be no issue.
>>> > >>> >
>>> > >>> > Btw, this is also the case using mini on docker.
>>> > >>> >
>>> > >>> > Response is:
>>> > >>> > {
>>> > >>> >     "metadata-location":
>>> > >>> "s3://mybucket/fns/t3/metadata/a.metadata.json",
>>> > >>> >     "metadata": {
>>> > >>> >         "format-version": 2,
>>> > >>> >         "table-uuid": "4d452e08-cf39-434b-b003-a21ccd6c4a42",
>>> > >>> >         "location": "s3://mybucket/fns/t3",
>>> > >>> >         "last-sequence-number": 1,
>>> > >>> >         "last-updated-ms": 1761059868331,
>>> > >>> >         "last-column-id": 2,
>>> > >>> >         "current-schema-id": 0,
>>> > >>> >         "schemas": [
>>> > >>> >             {
>>> > >>> >                 "type": "struct",
>>> > >>> >                 "schema-id": 0,
>>> > >>> >                 "fields": [
>>> > >>> >                     {
>>> > >>> >                         "id": 1,
>>> > >>> >                         "name": "field1",
>>> > >>> >                         "required": false,
>>> > >>> >                         "type": "int"
>>> > >>> >                     },
>>> > >>> >                     {
>>> > >>> >                         "id": 2,
>>> > >>> >                         "name": "field2",
>>> > >>> >                         "required": false,
>>> > >>> >                         "type": "int"
>>> > >>> >                     }
>>> > >>> >                 ]
>>> > >>> >             }
>>> > >>> >         ],
>>> > >>> >         "default-spec-id": 0,
>>> > >>> >         "partition-specs": [
>>> > >>> >             {
>>> > >>> >                 "spec-id": 0,
>>> > >>> >                 "fields": []
>>> > >>> >             }
>>> > >>> >         ],
>>> > >>> >         "last-partition-id": 999,
>>> > >>> >         "default-sort-order-id": 0,
>>> > >>> >         "sort-orders": [
>>> > >>> >             {
>>> > >>> >                 "order-id": 0,
>>> > >>> >                 "fields": []
>>> > >>> >             }
>>> > >>> >         ],
>>> > >>> >         "properties": {
>>> > >>> >             "created-at": "2025-10-21T15:14:52.093498193Z",
>>> > >>> >             "s3.sse.type": "kms",
>>> > >>> >             "s3.sse.key": "arn:aws:kms:us-east-1:***:key/mykey,
>>> > >>> >             "write.parquet.compression-codec": "zstd"
>>> > >>> >         },
>>> > >>> >         "current-snapshot-id": 2031898559602022053,
>>> > >>> >         "refs": {
>>> > >>> >             "main": {
>>> > >>> >                 "snapshot-id": 2031898559602022053,
>>> > >>> >                 "type": "branch"
>>> > >>> >             }
>>> > >>> >         },
>>> > >>> >         "snapshots": [
>>> > >>> >             {
>>> > >>> >                 "sequence-number": 1,
>>> > >>> >                 "snapshot-id": 2031898559602022053,
>>> > >>> >                 "timestamp-ms": 1761059868331,
>>> > >>> >                 "summary": {
>>> > >>> >                     "operation": "append",
>>> > >>> >                     "spark.app.id": "local-1761059845206",
>>> > >>> >                     "added-data-files": "1",
>>> > >>> >                     "added-records": "1",
>>> > >>> >                     "added-files-size": "657",
>>> > >>> >                     "changed-partition-count": "1",
>>> > >>> >                     "total-records": "1",
>>> > >>> >                     "total-files-size": "657",
>>> > >>> >                     "total-data-files": "1",
>>> > >>> >                     "total-delete-files": "0",
>>> > >>> >                     "total-position-deletes": "0",
>>> > >>> >                     "total-equality-deletes": "0",
>>> > >>> >                     "engine-version": "3.5.7",
>>> > >>> >                     "app-id": "local-1761059845206",
>>> > >>> >                     "engine-name": "spark",
>>> > >>> >                     "iceberg-version": "Apache Iceberg
>>> unspecified
>>> > >>> (commit
>>> > >>> > 7dbafb438ee1e68d0047bebcb587265d7d87d8a1)"
>>> > >>> >                 },
>>> > >>> >                 "manifest-list":
>>> > >>> > "s3://mybucket/fns/t3/metadata/snap-1.avro",
>>> > >>> >                 "schema-id": 0
>>> > >>> >             }
>>> > >>> >         ],
>>> > >>> >         "statistics": [],
>>> > >>> >         "partition-statistics": [],
>>> > >>> >         "snapshot-log": [
>>> > >>> >             {
>>> > >>> >                 "timestamp-ms": 1761059868331,
>>> > >>> >                 "snapshot-id": 2031898559602022053
>>> > >>> >             }
>>> > >>> >         ],
>>> > >>> >         "metadata-log": [
>>> > >>> >             {
>>> > >>> >                 "timestamp-ms": 1761059692095,
>>> > >>> >                 "metadata-file":
>>> > >>> > "s3://mybucket/fns/t3/metadata/0.metadata.json"
>>> > >>> >             }
>>> > >>> >         ]
>>> > >>> >     }
>>> > >>> > }
>>> > >>> >
>>> > >>> > Thanks
>>> > >>> >
>>> > >>> > Fabio
>>> > >>> >
>>> > >>> >
>>> > >>> > From: Dmitri Bourlatchkov <[email protected]>
>>> > >>> > Date: Thursday, 23 October 2025 at 15:24
>>> > >>> > To: [email protected] <[email protected]>
>>> > >>> > Subject: Re: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>> >
>>> > >>> > Hi Fabio,
>>> > >>> >
>>> > >>> > Thanks for the detailed explanation! It helps a lot.
>>> > >>> >
>>> > >>> > A couple of things are still not clear to me, though :)
>>> > >>> >
>>> > >>> > Are table metadata JSON files ever encrypted with KMS?
>>> > >>> >
>>> > >>> > If so, can Polaris read them without knowing the KMS FileIO
>>> > properties
>>> > >>> > (e.g. if the table came via registerTable with pre-encrypted
>>> > metadata)?
>>> > >>> >
>>> > >>> > Sorry, if these are trivial things and I missed some doc
>>> somewhere...
>>> > >>> > please give a pointer if so.
>>> > >>> >
>>> > >>> > Thanks,
>>> > >>> > Dmitri.
>>> > >>> >
>>> > >>> > On Thu, Oct 23, 2025 at 5:28 AM Rizzo Cascio, Fabio
>>> > >>> > <[email protected]> wrote:
>>> > >>> >
>>> > >>> > > Hi Dmitri,
>>> > >>> > >
>>> > >>> > > Let me try to explain what I mean:
>>> > >>> > >
>>> > >>> > > Let’s say we’re creating a catalog using AWS S3, just using the
>>> > >>> FileIo
>>> > >>> > > Iceberg properties (see:
>>> > >>> > >
>>> > >>>
>>> https://iceberg.apache.org/docs/nightly/aws/#s3-server-side-encryption
>>> > ).
>>> > >>> > >
>>> > >>> > > First, we create the catalog with a request like this:
>>> > >>> > >
>>> > >>> > > POST http://localhost:8181/api/management/v1/catalogs
>>> > >>> > >
>>> > >>> > > {
>>> > >>> > >     "catalog": {
>>> > >>> > >     "name": "test_catalog",
>>> > >>> > >     "type": "INTERNAL",
>>> > >>> > >     "readOnly": true,
>>> > >>> > >     "properties": {
>>> > >>> > >         "default-base-location": "s3://mybucket"
>>> > >>> > >     },
>>> > >>> > >     "storageConfigInfo": {
>>> > >>> > >         "storageType": "S3",
>>> > >>> > >         "roleArn": "arn:aws:iam::*****:role/myrole",
>>> > >>> > >         "region": "us-east-1"
>>> > >>> > >     }
>>> > >>> > >     }
>>> > >>> > > }
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > Next, we create a namespace:
>>> > >>> > >
>>> > >>> > > POST
>>> http://localhost:8181/api/catalog/v1/test_catalog/namespaces
>>> > >>> > >
>>> > >>> > > {
>>> > >>> > >     "namespace": ["fns"],
>>> > >>> > >     "properties": {
>>> > >>> > >     "location": "s3://mybucket/fns/"
>>> > >>> > >     }
>>> > >>> > > }
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > Then, we create a table:
>>> > >>> > >
>>> > >>> > > POST
>>> > >>> > >
>>> > >>>
>>> >
>>> http://localhost:8181/api/catalog/v1/test_catalog/namespaces/fns/tables
>>> > >>> > >
>>> > >>> > > {
>>> > >>> > >     "name": "t3",
>>> > >>> > >     "schema": {
>>> > >>> > >     "type": "struct",
>>> > >>> > >     "fields": [
>>> > >>> > >         {"id": 1, "name": "field1", "type": "int", "required":
>>> > >>> false},
>>> > >>> > >         {"id": 2, "name": "field2", "type": "int", "required":
>>> > false}
>>> > >>> > >     ]
>>> > >>> > >     },
>>> > >>> > >     "stage-create": false
>>> > >>> > > }
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > To insert data into the table using Spark with a KMS key:
>>> > >>> > >
>>> > >>> > > bin/spark-sql \
>>> > >>> > >     --packages
>>> > >>> > >
>>> > >>> >
>>> > >>>
>>> >
>>> org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.9.0,org.apache.iceberg:iceberg-aws-bundle:1.9.0
>>> > >>> > > \
>>> > >>> > >     --conf
>>> > >>> > >
>>> > >>> >
>>> > >>>
>>> >
>>> spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
>>> > >>> > > \
>>> > >>> > >     --conf
>>> > >>> > spark.sql.catalog.polaris=org.apache.iceberg.spark.SparkCatalog
>>> > >>> > > \
>>> > >>> > >     --conf spark.sql.catalog.polaris.type=rest \
>>> > >>> > >     --conf spark.sql.catalog.polaris.uri=
>>> > >>> > http://localhost:8181/api/catalog
>>> > >>> > > \
>>> > >>> > >     --conf
>>> spark.sql.catalog.polaris.token-refresh-enabled=false \
>>> > >>> > >     --conf spark.sql.catalog.polaris.warehouse=test_catalog \
>>> > >>> > >     --conf spark.sql.catalog.polaris.scope=PRINCIPAL_ROLE:ALL \
>>> > >>> > >     --conf
>>> > >>> > >
>>> > >>> >
>>> > >>>
>>> >
>>> spark.sql.catalog.polaris.header.X-Iceberg-Access-Delegation=vended-credentials
>>> > >>> > > \
>>> > >>> > >     --conf
>>> > >>> > >
>>> > >>> >
>>> > >>>
>>> >
>>> spark.sql.catalog.polaris.s3.sse.key=arn:aws:kms:us-east-1:****:key/mykey \
>>> > >>> > >     --conf spark.sql.catalog.polaris.s3.sse.type=kms \
>>> > >>> > >     --conf
>>> > >>> > >
>>> > >>> >
>>> > >>>
>>> >
>>> spark.sql.catalog.polaris.credential=38a0ebdbcc97c58f:654af690485a32f02ce17dda7cd2c36d
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > Then run:
>>> > >>> > >
>>> > >>> > > insert into t3 values (7,9);
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > This will create an entry in the bucket with the data encrypted
>>> > >>> using the
>>> > >>> > > specified key.
>>> > >>> > >
>>> > >>> > > If you remove these two properties from the connection command:
>>> > >>> > >
>>> > >>> > >   *   --conf
>>> > >>> > >
>>> > >>>
>>> >
>>> spark.sql.catalog.polaris.s3.sse.key=arn:aws:kms:us-east-1:****:key/mykey
>>> > >>> > >
>>> > >>> > >   *   --conf spark.sql.catalog.polaris.s3.sse.type=kms
>>> > >>> > >
>>> > >>> > > then you can insert data into the table without encryption.
>>> > >>> > >
>>> > >>> > > In Polaris, at the point of the insert, we don’t know the KMS
>>> key,
>>> > so
>>> > >>> > > there’s no way to add that key in the policy. This is where
>>> adding
>>> > >>> > > arn:aws:kms:%s:%s:key/* helps.
>>> > >>> > >
>>> > >>> > > Adding a new property in the storageConfigInfo for the KMS key
>>> will
>>> > >>> help
>>> > >>> > > with creating a more restrictive IAM policy, but we also need
>>> to
>>> > >>> support
>>> > >>> > > the existing properties defined in Iceberg.
>>> > >>> > >
>>> > >>> > > The reason for my changes—passing the properties down to
>>> > >>> > > AwsCredentialsStorageIntegration—is because you can pass extra
>>> > >>> properties
>>> > >>> > > to any Polaris request, and those will feed down to Iceberg.
>>> For
>>> > >>> example:
>>> > >>> > >
>>> > >>> > > {
>>> > >>> > >     "name": "t3",
>>> > >>> > >     "schema": {
>>> > >>> > >     "type": "struct",
>>> > >>> > >     "fields": [
>>> > >>> > >         {"id": 1, "name": "field1", "type": "int", "required":
>>> > >>> false},
>>> > >>> > >         {"id": 2, "name": "field2", "type": "int", "required":
>>> > false}
>>> > >>> > >     ]
>>> > >>> > >     },
>>> > >>> > >     "properties": {
>>> > >>> > >     "s3.sse.type": "kms",
>>> > >>> > >     "s3.sse.key": "arn:aws:kms:us-east-1:***:key/mykey"
>>> > >>> > >     },
>>> > >>> > >     "stage-create": false
>>> > >>> > > }
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > With my changes I was trying to support both ways, not sure if
>>> this
>>> > >>> is
>>> > >>> > the
>>> > >>> > > best approach or just going for the easier way of allowing all
>>> the
>>> > >>> keys
>>> > >>> > > under the account is better.
>>> > >>> > >
>>> > >>> > > Let me know if you need any more details.
>>> > >>> > >
>>> > >>> > > Thanks
>>> > >>> > >
>>> > >>> > > Fabio
>>> > >>> > >
>>> > >>> > >
>>> > >>> > >
>>> > >>> > >
>>> > >>> > >   1.
>>> > >>> > >
>>> > >>> > >
>>> > >>> > >
>>> > >>> > > From: Dmitri Bourlatchkov <[email protected]>
>>> > >>> > > Date: Wednesday, 22 October 2025 at 18:50
>>> > >>> > > To: [email protected] <[email protected]>
>>> > >>> > > Subject: Re: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>> > >
>>> > >>> > > Hi Fabio,
>>> > >>> > >
>>> > >>> > > I agree that we seem to have some confusion here :) let's try
>>> and
>>> > >>> > clarify.
>>> > >>> > >
>>> > >>> > > What do you mean exactly by "s3 iceberg properties"? Are they
>>> > Iceberg
>>> > >>> > table
>>> > >>> > > metadata properties? Iceberg (REST) Catalog properties? FileIO
>>> > >>> > properties?
>>> > >>> > >
>>> > >>> > > Why would Polaris need to support them? What would an
>>> end-to-end
>>> > >>> flow be
>>> > >>> > > between Polaris and the client (e.g. Spark)?
>>> > >>> > >
>>> > >>> > > Thanks,
>>> > >>> > > Dmitri.
>>> > >>> > >
>>> > >>> > > On Wed, Oct 22, 2025 at 12:08 PM Rizzo Cascio, Fabio
>>> > >>> > > <[email protected]> wrote:
>>> > >>> > >
>>> > >>> > > > I feel like there’s something I’m overlooking.
>>> > >>> > > > Setting the kms property at the catalog level works, but it
>>> > doesn’t
>>> > >>> > > > support the s3 iceberg properties, right?
>>> > >>> > > >
>>> > >>> > > > To support those, the best approach is to let clients use
>>> the s3
>>> > >>> > iceberg
>>> > >>> > > > properties directly. Then, in
>>> AwsCredentialsStorageIntegration,
>>> > we
>>> > >>> can
>>> > >>> > > > simply add a policy that allows any key within that account.
>>> This
>>> > >>> way,
>>> > >>> > we
>>> > >>> > > > don’t need to rely on metadata properties to retrieve the key
>>> > >>> value.
>>> > >>> > > >
>>> > >>> > > > Does that make sense?
>>> > >>> > > >
>>> > >>> > > >
>>> > >>> > > > Thanks
>>> > >>> > > > Fabio
>>> > >>> > > >
>>> > >>> > > >
>>> > >>> > > > From: Dmitri Bourlatchkov <[email protected]>
>>> > >>> > > > Date: Wednesday, 22 October 2025 at 15:42
>>> > >>> > > > To: [email protected] <[email protected]>
>>> > >>> > > > Subject: Re: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>> > > >
>>> > >>> > > > Hi Fabio,
>>> > >>> > > >
>>> > >>> > > > Yes, that would be the preferable solution for KMS from my
>>> POV.
>>> > >>> > > >
>>> > >>> > > > I wonder what other people think about this too :)
>>> > >>> > > >
>>> > >>> > > > Cheers,
>>> > >>> > > > Dmitri.
>>> > >>> > > >
>>> > >>> > > > On Wed, Oct 22, 2025 at 9:45 AM Rizzo Cascio, Fabio
>>> > >>> > > > <[email protected]> wrote:
>>> > >>> > > >
>>> > >>> > > > > Hi Dmitri,
>>> > >>> > > > >
>>> > >>> > > > > If I add the kms props to  AccessConfig in
>>> AWSCredentialStorage
>>> > >>> I can
>>> > >>> > > see
>>> > >>> > > > > it in the LoadTable response coming from Polaris.
>>> > >>> > > > >
>>> > >>> > > > > Fabio
>>> > >>> > > > >
>>> > >>> > > > > From: Dmitri Bourlatchkov <[email protected]>
>>> > >>> > > > > Date: Tuesday, 21 October 2025 at 15:23
>>> > >>> > > > > To: [email protected] <[email protected]>
>>> > >>> > > > > Subject: Re: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>> > > > >
>>> > >>> > > > > Hi Fabio,
>>> > >>> > > > >
>>> > >>> > > > > Yes, I glimpsed that from your email. Sorry if my post
>>> caused
>>> > >>> > > confusion.
>>> > >>> > > > I
>>> > >>> > > > > just wanted to reply to the top email as what I'm proposing
>>> > >>> seems to
>>> > >>> > > be a
>>> > >>> > > > > key feature for KMS support.
>>> > >>> > > > >
>>> > >>> > > > > Would you be able to validate whether sending KMS FileIO
>>> > >>> properties
>>> > >>> > to
>>> > >>> > > > > clients from LoadTable responses work in practice (e.g. in
>>> > >>> Spark)?
>>> > >>> > > > >
>>> > >>> > > > > I believe this can be done by adding KMS properties as
>>> "extra"
>>> > >>> > > properties
>>> > >>> > > > > to AccessConfig.
>>> > >>> > > > >
>>> > >>> > > > > Thanks,
>>> > >>> > > > > Dmitri.
>>> > >>> > > > >
>>> > >>> > > > > On Tue, Oct 21, 2025 at 4:15 AM Rizzo Cascio, Fabio
>>> > >>> > > > > <[email protected]> wrote:
>>> > >>> > > > >
>>> > >>> > > > > > Hi Dmitri,
>>> > >>> > > > > >
>>> > >>> > > > > > This is what I was saying in my other email. Anyway I’m
>>> gonna
>>> > >>> > update
>>> > >>> > > my
>>> > >>> > > > > PR
>>> > >>> > > > > > with the changes I have made to get it working,  the
>>> project
>>> > >>> won’t
>>> > >>> > > > build
>>> > >>> > > > > > because I haven’t update the tests etc, I just want to
>>> show
>>> > my
>>> > >>> > > changes
>>> > >>> > > > > and
>>> > >>> > > > > > see if we can agree on a direction before I make all the
>>> > >>> changes.
>>> > >>> > > > > >
>>> > >>> > > > > > Thanks
>>> > >>> > > > > >
>>> > >>> > > > > > Fabio
>>> > >>> > > > > >
>>> > >>> > > > > >
>>> > >>> > > > > >
>>> > >>> > > > > >
>>> > >>> > > > > > From: Dmitri Bourlatchkov <[email protected]>
>>> > >>> > > > > > Date: Monday, 20 October 2025 at 17:38
>>> > >>> > > > > > To: [email protected] <[email protected]>
>>> > >>> > > > > > Subject: [EXTERNAL]Re: KMS Key addition for s3
>>> > >>> > > > > >
>>> > >>> > > > > > Hi Fabio, Ashok and All,
>>> > >>> > > > > >
>>> > >>> > > > > > Apologies if I'm missing something obvious, but the two
>>> WIP
>>> > >>> KMS PRs
>>> > >>> > > > > [1424]
>>> > >>> > > > > > [2802] appear to be dealing only with AWS policies on the
>>> > >>> vended
>>> > >>> > > > > credential
>>> > >>> > > > > > session. They do not appear to deal with client
>>> configuration
>>> > >>> (in
>>> > >>> > > > > LoadTable
>>> > >>> > > > > > responses).
>>> > >>> > > > > >
>>> > >>> > > > > > As far as I understand, Iceberg clients need certain
>>> FileIO
>>> > >>> > > properties
>>> > >>> > > > to
>>> > >>> > > > > > be set in order to utilize KMS.
>>> > >>> > > > > >
>>> > >>> > > > > > I'd imagine that Polaris ought to provide these FileIO
>>> > >>> properties
>>> > >>> > in
>>> > >>> > > > > > LoadTable responses in addition to granting privileges
>>> for
>>> > KMS
>>> > >>> > access
>>> > >>> > > > to
>>> > >>> > > > > > the vended (session) credentials.
>>> > >>> > > > > >
>>> > >>> > > > > > In other words, the decision whether to use KMS rests
>>> with
>>> > >>> Polaris
>>> > >>> > > (we
>>> > >>> > > > > can
>>> > >>> > > > > > discuss how to configure that). If that is enabled,
>>> clients
>>> > >>> should
>>> > >>> > > not
>>> > >>> > > > > need
>>> > >>> > > > > > any extra configuration, they should get complete and
>>> usable
>>> > >>> > > > > > configuration + credentials from Polaris.
>>> > >>> > > > > >
>>> > >>> > > > > > WDYT?
>>> > >>> > > > > >
>>> > >>> > > > > > [1424] https://github.com/apache/polaris/pull/1424
>>> > >>> > > > > > [2802] https://github.com/apache/polaris/pull/2802
>>> > >>> > > > > >
>>> > >>> > > > > > Thanks,
>>> > >>> > > > > > Dmitri.
>>> > >>> > > > > >
>>> > >>> > > > > >
>>> > >>> > > > > > On Mon, Oct 13, 2025 at 3:50 AM Rizzo Cascio, Fabio
>>> > >>> > > > > > <[email protected]> wrote:
>>> > >>> > > > > >
>>> > >>> > > > > > > Hi guys,
>>> > >>> > > > > > >
>>> > >>> > > > > > > I have created a new PR to be able to use a kms key
>>> for the
>>> > >>> S3
>>> > >>> > > > bucket,
>>> > >>> > > > > it
>>> > >>> > > > > > > is mandatory for me to use any S3 storage and
>>> hopefully a
>>> > >>> good
>>> > >>> > > > addition
>>> > >>> > > > > > for
>>> > >>> > > > > > > other people that want to use it.
>>> > >>> > > > > > >
>>> > >>> > > > > > > PR link: https://github.com/apache/polaris/pull/2802
>>> > >>> > > > > > >
>>> > >>> > > > > > > Thanks
>>> > >>> > > > > > >
>>> > >>> > > > > > > Fabio
>>> > >>> > > > > > >
>>> > >>> > > > > > > This message is confidential and subject to terms at:
>>> > >>> > > > > > > https://www.jpmorgan.com/emaildisclaimer including on
>>> > >>> > > confidential,
>>> > >>> > > > > > > privileged or legal entity information, malicious
>>> content
>>> > and
>>> > >>> > > > > monitoring
>>> > >>> > > > > > of
>>> > >>> > > > > > > electronic messages. If you are not the intended
>>> recipient,
>>> > >>> > please
>>> > >>> > > > > delete
>>> > >>> > > > > > > this message and notify the sender immediately. Any
>>> > >>> unauthorized
>>> > >>> > > use
>>> > >>> > > > is
>>> > >>> > > > > > > strictly prohibited.
>>> > >>> > > > > > >
>>> > >>> > > > > >
>>> > >>> > > > > > This message is confidential and subject to terms at:
>>> > >>> > > > > > https://www.jpmorgan.com/emaildisclaimer including on
>>> > >>> > confidential,
>>> > >>> > > > > > privileged or legal entity information, malicious
>>> content and
>>> > >>> > > > monitoring
>>> > >>> > > > > of
>>> > >>> > > > > > electronic messages. If you are not the intended
>>> recipient,
>>> > >>> please
>>> > >>> > > > delete
>>> > >>> > > > > > this message and notify the sender immediately. Any
>>> > >>> unauthorized
>>> > >>> > use
>>> > >>> > > is
>>> > >>> > > > > > strictly prohibited.
>>> > >>> > > > > >
>>> > >>> > > > >
>>> > >>> > > > > This message is confidential and subject to terms at:
>>> > >>> > > > > https://www.jpmorgan.com/emaildisclaimer including on
>>> > >>> confidential,
>>> > >>> > > > > privileged or legal entity information, malicious content
>>> and
>>> > >>> > > monitoring
>>> > >>> > > > of
>>> > >>> > > > > electronic messages. If you are not the intended recipient,
>>> > >>> please
>>> > >>> > > delete
>>> > >>> > > > > this message and notify the sender immediately. Any
>>> > unauthorized
>>> > >>> use
>>> > >>> > is
>>> > >>> > > > > strictly prohibited.
>>> > >>> > > > >
>>> > >>> > > >
>>> > >>> > > > This message is confidential and subject to terms at:
>>> > >>> > > > https://www.jpmorgan.com/emaildisclaimer including on
>>> > >>> confidential,
>>> > >>> > > > privileged or legal entity information, malicious content and
>>> > >>> > monitoring
>>> > >>> > > of
>>> > >>> > > > electronic messages. If you are not the intended recipient,
>>> > please
>>> > >>> > delete
>>> > >>> > > > this message and notify the sender immediately. Any
>>> unauthorized
>>> > >>> use is
>>> > >>> > > > strictly prohibited.
>>> > >>> > > >
>>> > >>> > >
>>> > >>> > > This message is confidential and subject to terms at:
>>> > >>> > > https://www.jpmorgan.com/emaildisclaimer including on
>>> > confidential,
>>> > >>> > > privileged or legal entity information, malicious content and
>>> > >>> monitoring
>>> > >>> > of
>>> > >>> > > electronic messages. If you are not the intended recipient,
>>> please
>>> > >>> delete
>>> > >>> > > this message and notify the sender immediately. Any
>>> unauthorized
>>> > use
>>> > >>> is
>>> > >>> > > strictly prohibited.
>>> > >>> > >
>>> > >>> >
>>> > >>> > This message is confidential and subject to terms at:
>>> > >>> > https://www.jpmorgan.com/emaildisclaimer including on
>>> confidential,
>>> > >>> > privileged or legal entity information, malicious content and
>>> > >>> monitoring of
>>> > >>> > electronic messages. If you are not the intended recipient,
>>> please
>>> > >>> delete
>>> > >>> > this message and notify the sender immediately. Any unauthorized
>>> use
>>> > is
>>> > >>> > strictly prohibited.
>>> > >>> >
>>> > >>>
>>> > >>> This message is confidential and subject to terms at:
>>> > >>> https://www.jpmorgan.com/emaildisclaimer including on
>>> confidential,
>>> > >>> privileged or legal entity information, malicious content and
>>> > monitoring of
>>> > >>> electronic messages. If you are not the intended recipient, please
>>> > delete
>>> > >>> this message and notify the sender immediately. Any unauthorized
>>> use is
>>> > >>> strictly prohibited.
>>> > >>>
>>> > >>
>>> >
>>>
>>

Reply via email to