Skip to content

Implement SAML custom attributes support for Identity Provider #128176

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 19 commits into from
Jun 3, 2025

Conversation

lloydmeta
Copy link
Member

@lloydmeta lloydmeta commented May 20, 2025

This commit adds support for custom attributes in SAML single sign-on requests in the Elasticsearch X-Pack Identity Provider plugin. This feature allows passage of custom key-value attributes in SAML responses from the init endpoint.

I opted for an array of attributes instead of an object/map because it felt easier and avoid mapping explosion if ingested somewhere, but could go the other way as well.

Example

POST /_idp/saml/init
// Body
{
  "entity_id": "https://example.com/saml/sp",
  "acs": "https://example.com/saml/acs",
  "authn_state": "some-authn-state-value",
  // Added
  "attributes": { 
    "department": [ "engineering", "product" ],
    "region": [ "APJ" ] }
  }
}

Key components:

  • Added SamlInitiateSingleSignOnAttributes class for holding attributes
  • Added validation for null, and empty attribute keys
  • Updated request and response objects to handle attributes
  • Added test coverage to validate attributes functionality

Note : this PR was generated with the help of Windsurf as part of our internal pilot.

Related to IAM-1789

@elasticsearchmachine elasticsearchmachine added external-contributor Pull request authored by a developer outside the Elasticsearch team v9.1.0 labels May 20, 2025
@lloydmeta

This comment was marked as outdated.

@lloydmeta lloydmeta force-pushed the add-arbitrary-attribute-support branch from 341d949 to f44a0a2 Compare May 20, 2025 09:05
@igor-kupczynski igor-kupczynski requested a review from Copilot May 20, 2025 09:50
Copilot

This comment was marked as outdated.

@lloydmeta lloydmeta marked this pull request as ready for review May 20, 2025 12:22
@elasticsearchmachine elasticsearchmachine added the needs:triage Requires assignment of a team area label label May 20, 2025
@mayya-sharipova mayya-sharipova added :Security/Authentication Logging in, Usernames/passwords, Realms (Native/LDAP/AD/SAML/PKI/etc) and removed needs:triage Requires assignment of a team area label labels May 20, 2025
@elasticsearchmachine elasticsearchmachine added the Team:Security Meta label for security team label May 20, 2025
@elasticsearchmachine
Copy link
Collaborator

Pinging @elastic/es-security (Team:Security)

lloydmeta added 5 commits May 21, 2025 11:48
This commit adds support for custom attributes in SAML single sign-on requests
in the Elasticsearch X-Pack Identity Provider plugin. This feature allows
passage of custom key-value attributes in SAML requests and responses.

Key components:
- Added SamlInitiateSingleSignOnAttributes class for holding attributes
- Added validation for null and empty attribute keys
- Updated request and response objects to handle attributes
- Modified authentication flow to process attributes
- Added test coverage to validate attributes functionality

The implementation follows Elasticsearch patterns with robust validation
and serialization mechanisms, while maintaining backward compatibility.
This commit adds a comprehensive test that verifies SAML custom attributes
are correctly handled in the authentication response builder. The test ensures:

1. Custom attributes with single and multiple values are properly included
2. The response with custom attributes is still correctly signed
3. The XML schema validation still passes with custom attributes
4. We can locate and verify individual attribute values in the response

This provides critical test coverage for the SAML custom attributes
feature implementation.
…nseMessageBuilder.build

This commit adds an overloaded build method that accepts only two parameters
(user and authenticationState) and forwards the call to the three-parameter
version with null for the customAttributes parameter. This maintains backward
compatibility with existing code that doesn't use custom attributes.

This fixes a compilation error in ServerlessSsoIT.java which was still using
the two-parameter method signature.

Signed-off-by: lloydmeta <[email protected]>
This commit enhances the SAML attributes implementation by adding validation
for duplicate attribute keys. When the same attribute key appears multiple
times in a request, the validation will now fail with a clear error message.

Signed-off-by: lloydmeta <[email protected]>
This commit improves the SAML attributes validation by:

1. Adding a dedicated validate() method to SamlInitiateSingleSignOnAttributes
   that centralizes validation logic in one place
2. Moving validation from constructor to dedicated method for better error reporting
3. Checking both for null/empty keys and duplicate keys in the validate() method
4. Updating SamlInitiateSingleSignOnRequest to use the new validation method
5. Adding comprehensive tests for the new validation approach

These changes follow standard Elasticsearch validation patterns, making the
code more maintainable and consistent with the rest of the codebase.
@elasticsearchmachine
Copy link
Collaborator

Hi @lloydmeta, I've created a changelog YAML for you.

@lloydmeta lloydmeta requested review from tvernum and n1v0lg May 21, 2025 05:31
Enhanced the testCustomAttributesInIdpInitiatedSso test to properly validate
both SAML response structure and custom attributes using DOM parsing and XPath.

Key improvements:
- Validate SAML Response/Assertion elements exist
- Precisely validate custom attributes (department, region) and their values
- Use namespace-aware XML parsing for resilience to format changes

Signed-off-by: lloydmeta <[email protected]>
Also, replace internal Attribute class list with a simpler Map<String, List<String>>
structure

This change:

- Removes the redundant Attribute class and replaces it with a direct Map
  implementation for storing attribute key-value pairs
- Eliminates the duplicate "attributes" nesting in the JSON structure
- Simplifies attribute validation without needing duplicate key checking

- Updates all related tests and integration points to work with the new structure

Before:

```js
{
  // others
  "attributes": {
    "attributes": [
      {
        "key": "department",
        "values": ["engineering", "product"]
      }
    ]
  }
}

After:

```js
{
  // other
  "attributes": {
    "department": ["engineering", "product"]
  }
}
```

(Verified by spitting out JSON entity in IdentityProviderAuthenticationIT.generateSamlResponseWithAttributes
... saw `{"entity_id":"ec:123456:abcdefg","acs":"https://sp1.test.es.elasticsearch.org/saml/acs","attributes":{"department":["engineering","product"],"region":["APJ"]}}`)

Signed-off-by: lloydmeta <[email protected]>
@lloydmeta lloydmeta requested review from tvernum and Copilot May 21, 2025 08:31
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR implements support for custom SAML attributes in the Elasticsearch X-Pack Identity Provider. Key changes include adding a dedicated class for handling SAML custom attributes, updating request/response objects and parsers to support these attributes, and incorporating new tests for validation, serialization, and integration.

Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/saml/support/SamlInitiateSingleSignOnAttributesTests.java Adds tests for the new attributes class and its functionality.
x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/saml/authn/SuccessfulAuthenticationResponseMessageBuilderTests.java Adds tests validating that custom attributes are correctly embedded in SAML responses.
x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java Introduces tests covering attribute key validations.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/saml/support/SamlInitiateSingleSignOnAttributes.java Implements the new attributes class including JSON serialization, validation, and equality.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/rest/action/RestSamlInitiateSingleSignOnAction.java Updates REST parsing logic to handle custom attributes.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/authn/SuccessfulAuthenticationResponseMessageBuilder.java Integrates custom attributes into SAML response building.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/action/TransportSamlInitiateSingleSignOnAction.java Passes the attributes data from request to response.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnResponse.java Carries attributes in the SAML response.
x-pack/plugin/identity-provider/src/main/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequest.java Adds attribute support and validates attribute keys in incoming requests.
x-pack/plugin/identity-provider/qa/idp-rest-tests/src/javaRestTest/java/org/elasticsearch/xpack/idp/IdentityProviderAuthenticationIT.java Adds integration test for verifying custom attributes in SAML responses.
docs/changelog/128176.yaml Documents the new custom attributes feature in the changelog.

lloydmeta added 2 commits June 2, 2025 11:22
* Make attributes map final in SamlInitiateSingleSignOnAttributes

Signed-off-by: lloydmeta <[email protected]>
@lloydmeta
Copy link
Member Author

I should probably mention that the last set of changes were done manually; didn't have the wherewithal to keep this PR pure AI 😅

Signed-off-by: lloydmeta <[email protected]>
@lloydmeta lloydmeta requested a review from tvernum June 2, 2025 02:45
Copy link
Contributor

@tvernum tvernum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, I'll try to get the transport versioning done tomorrow so we can merge.

Copy link
Contributor

@tvernum tvernum left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Member

@ywangd ywangd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

I reviewed mostly the transport version changes and skimmed through other production code changes. Didn't review tests. I believe those are reviewed by Tim and others.

@tvernum
Copy link
Contributor

tvernum commented Jun 3, 2025

@lloydmeta Because of the transport version change, this will need special effort for backporting. Please open a separate PR for the backport because we'll need to do some tweaks.

@lloydmeta lloydmeta enabled auto-merge (squash) June 3, 2025 01:59
@lloydmeta lloydmeta merged commit 2625200 into elastic:main Jun 3, 2025
22 of 23 checks passed
@lloydmeta lloydmeta deleted the add-arbitrary-attribute-support branch June 3, 2025 02:30
@lloydmeta lloydmeta self-assigned this Jun 3, 2025
lloydmeta added a commit that referenced this pull request Jun 3, 2025
…y Provider (#128796)

* Implement SAML custom attributes support for Identity Provider (#128176)

* Implement SAML custom attributes support for Identity Provider

This commit adds support for custom attributes in SAML single sign-on requests
in the Elasticsearch X-Pack Identity Provider plugin. This feature allows
passage of custom key-value attributes in SAML requests and responses.

Key components:
- Added SamlInitiateSingleSignOnAttributes class for holding attributes
- Added validation for null and empty attribute keys
- Updated request and response objects to handle attributes
- Modified authentication flow to process attributes
- Added test coverage to validate attributes functionality

The implementation follows Elasticsearch patterns with robust validation
and serialization mechanisms, while maintaining backward compatibility.

* Add test for SAML custom attributes in authentication response

This commit adds a comprehensive test that verifies SAML custom attributes
are correctly handled in the authentication response builder. The test ensures:

1. Custom attributes with single and multiple values are properly included
2. The response with custom attributes is still correctly signed
3. The XML schema validation still passes with custom attributes
4. We can locate and verify individual attribute values in the response

This provides critical test coverage for the SAML custom attributes
feature implementation.

* Add backward compatibility overload for SuccessfulAuthenticationResponseMessageBuilder.build

This commit adds an overloaded build method that accepts only two parameters
(user and authenticationState) and forwards the call to the three-parameter
version with null for the customAttributes parameter. This maintains backward
compatibility with existing code that doesn't use custom attributes.

This fixes a compilation error in ServerlessSsoIT.java which was still using
the two-parameter method signature.

Signed-off-by: lloydmeta <[email protected]>

* Add validation for duplicate SAML attribute keys

This commit enhances the SAML attributes implementation by adding validation
for duplicate attribute keys. When the same attribute key appears multiple
times in a request, the validation will now fail with a clear error message.

Signed-off-by: lloydmeta <[email protected]>

* Refactor SAML attributes validation to follow standard patterns

This commit improves the SAML attributes validation by:

1. Adding a dedicated validate() method to SamlInitiateSingleSignOnAttributes
   that centralizes validation logic in one place
2. Moving validation from constructor to dedicated method for better error reporting
3. Checking both for null/empty keys and duplicate keys in the validate() method
4. Updating SamlInitiateSingleSignOnRequest to use the new validation method
5. Adding comprehensive tests for the new validation approach

These changes follow standard Elasticsearch validation patterns, making the
code more maintainable and consistent with the rest of the codebase.

* Update docs/changelog/128176.yaml

* Improve SAML response validation in identity provider tests

Enhanced the testCustomAttributesInIdpInitiatedSso test to properly validate
both SAML response structure and custom attributes using DOM parsing and XPath.

Key improvements:
- Validate SAML Response/Assertion elements exist
- Precisely validate custom attributes (department, region) and their values
- Use namespace-aware XML parsing for resilience to format changes

Signed-off-by: lloydmeta <[email protected]>

* Simplify SAML attributes representation using JSON object/Map structure

Also, replace internal Attribute class list with a simpler Map<String, List<String>>
structure

This change:

- Removes the redundant Attribute class and replaces it with a direct Map
  implementation for storing attribute key-value pairs
- Eliminates the duplicate "attributes" nesting in the JSON structure
- Simplifies attribute validation without needing duplicate key checking

- Updates all related tests and integration points to work with the new structure

Before:

```js
{
  // others
  "attributes": {
    "attributes": [
      {
        "key": "department",
        "values": ["engineering", "product"]
      }
    ]
  }
}

After:

```js
{
  // other
  "attributes": {
    "department": ["engineering", "product"]
  }
}
```

(Verified by spitting out JSON entity in IdentityProviderAuthenticationIT.generateSamlResponseWithAttributes
... saw `{"entity_id":"ec:123456:abcdefg","acs":"https://sp1.test.es.elasticsearch.org/saml/acs","attributes":{"department":["engineering","product"],"region":["APJ"]}}`)

Signed-off-by: lloydmeta <[email protected]>

* * Fix up toString dangling quote.

Signed-off-by: lloydmeta <[email protected]>

* * Remove attributes from Response object.

Signed-off-by: lloydmeta <[email protected]>

* * Remove friendly name.
* Make attributes map final in SamlInitiateSingleSignOnAttributes

Signed-off-by: lloydmeta <[email protected]>

* * Cleanup serdes by using existing utils in the ES codebase

Signed-off-by: lloydmeta <[email protected]>

* Touchup comment

Signed-off-by: lloydmeta <[email protected]>

* Update x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java

Co-authored-by: Tim Vernum <[email protected]>

* Add transport-version checks

---------

Signed-off-by: lloydmeta <[email protected]>
Co-authored-by: Tim Vernum <[email protected]>

* * TV fixups

Signed-off-by: lloydmeta <[email protected]>

---------

Signed-off-by: lloydmeta <[email protected]>
Co-authored-by: Tim Vernum <[email protected]>
tvernum added a commit to tvernum/elasticsearch that referenced this pull request Jun 3, 2025
This extends the change from elastic#128176 to validate the "custom
attributes" on a per Service Provider basis.

Each Service Provider (whether registered or wildcard based) has a
field "attributes.extensions" which is a list of attribute names that
may be provided by the caller of "/_idp/saml/init".

Service Providers that have not be configured with extension
attributes will reject any custom attributes in SAML init.

This necessitates a new field in the service provider index. The
template has been updated, but there is no data migration because the
`saml-service-provider` index does not exist in any of the environments
into which we wish to deploy this change.
mridula-s109 pushed a commit to mridula-s109/elasticsearch that referenced this pull request Jun 3, 2025
…ic#128176)

* Implement SAML custom attributes support for Identity Provider

This commit adds support for custom attributes in SAML single sign-on requests
in the Elasticsearch X-Pack Identity Provider plugin. This feature allows
passage of custom key-value attributes in SAML requests and responses.

Key components:
- Added SamlInitiateSingleSignOnAttributes class for holding attributes
- Added validation for null and empty attribute keys
- Updated request and response objects to handle attributes
- Modified authentication flow to process attributes
- Added test coverage to validate attributes functionality

The implementation follows Elasticsearch patterns with robust validation
and serialization mechanisms, while maintaining backward compatibility.

* Add test for SAML custom attributes in authentication response

This commit adds a comprehensive test that verifies SAML custom attributes
are correctly handled in the authentication response builder. The test ensures:

1. Custom attributes with single and multiple values are properly included
2. The response with custom attributes is still correctly signed
3. The XML schema validation still passes with custom attributes
4. We can locate and verify individual attribute values in the response

This provides critical test coverage for the SAML custom attributes
feature implementation.

* Add backward compatibility overload for SuccessfulAuthenticationResponseMessageBuilder.build

This commit adds an overloaded build method that accepts only two parameters
(user and authenticationState) and forwards the call to the three-parameter
version with null for the customAttributes parameter. This maintains backward
compatibility with existing code that doesn't use custom attributes.

This fixes a compilation error in ServerlessSsoIT.java which was still using
the two-parameter method signature.

Signed-off-by: lloydmeta <[email protected]>

* Add validation for duplicate SAML attribute keys

This commit enhances the SAML attributes implementation by adding validation
for duplicate attribute keys. When the same attribute key appears multiple
times in a request, the validation will now fail with a clear error message.

Signed-off-by: lloydmeta <[email protected]>

* Refactor SAML attributes validation to follow standard patterns

This commit improves the SAML attributes validation by:

1. Adding a dedicated validate() method to SamlInitiateSingleSignOnAttributes
   that centralizes validation logic in one place
2. Moving validation from constructor to dedicated method for better error reporting
3. Checking both for null/empty keys and duplicate keys in the validate() method
4. Updating SamlInitiateSingleSignOnRequest to use the new validation method
5. Adding comprehensive tests for the new validation approach

These changes follow standard Elasticsearch validation patterns, making the
code more maintainable and consistent with the rest of the codebase.

* Update docs/changelog/128176.yaml

* Improve SAML response validation in identity provider tests

Enhanced the testCustomAttributesInIdpInitiatedSso test to properly validate
both SAML response structure and custom attributes using DOM parsing and XPath.

Key improvements:
- Validate SAML Response/Assertion elements exist
- Precisely validate custom attributes (department, region) and their values
- Use namespace-aware XML parsing for resilience to format changes

Signed-off-by: lloydmeta <[email protected]>

* Simplify SAML attributes representation using JSON object/Map structure

Also, replace internal Attribute class list with a simpler Map<String, List<String>>
structure

This change:

- Removes the redundant Attribute class and replaces it with a direct Map
  implementation for storing attribute key-value pairs
- Eliminates the duplicate "attributes" nesting in the JSON structure
- Simplifies attribute validation without needing duplicate key checking

- Updates all related tests and integration points to work with the new structure

Before:

```js
{
  // others
  "attributes": {
    "attributes": [
      {
        "key": "department",
        "values": ["engineering", "product"]
      }
    ]
  }
}

After:

```js
{
  // other
  "attributes": {
    "department": ["engineering", "product"]
  }
}
```

(Verified by spitting out JSON entity in IdentityProviderAuthenticationIT.generateSamlResponseWithAttributes
... saw `{"entity_id":"ec:123456:abcdefg","acs":"https://sp1.test.es.elasticsearch.org/saml/acs","attributes":{"department":["engineering","product"],"region":["APJ"]}}`)

Signed-off-by: lloydmeta <[email protected]>

* * Fix up toString dangling quote.

Signed-off-by: lloydmeta <[email protected]>

* * Remove attributes from Response object.

Signed-off-by: lloydmeta <[email protected]>

* * Remove friendly name.
* Make attributes map final in SamlInitiateSingleSignOnAttributes

Signed-off-by: lloydmeta <[email protected]>

* * Cleanup serdes by using existing utils in the ES codebase

Signed-off-by: lloydmeta <[email protected]>

* Touchup comment

Signed-off-by: lloydmeta <[email protected]>

* Update x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java

Co-authored-by: Tim Vernum <[email protected]>

* Add transport-version checks

---------

Signed-off-by: lloydmeta <[email protected]>
Co-authored-by: Tim Vernum <[email protected]>
joshua-adams-1 pushed a commit to joshua-adams-1/elasticsearch that referenced this pull request Jun 3, 2025
…ic#128176)

* Implement SAML custom attributes support for Identity Provider

This commit adds support for custom attributes in SAML single sign-on requests
in the Elasticsearch X-Pack Identity Provider plugin. This feature allows
passage of custom key-value attributes in SAML requests and responses.

Key components:
- Added SamlInitiateSingleSignOnAttributes class for holding attributes
- Added validation for null and empty attribute keys
- Updated request and response objects to handle attributes
- Modified authentication flow to process attributes
- Added test coverage to validate attributes functionality

The implementation follows Elasticsearch patterns with robust validation
and serialization mechanisms, while maintaining backward compatibility.

* Add test for SAML custom attributes in authentication response

This commit adds a comprehensive test that verifies SAML custom attributes
are correctly handled in the authentication response builder. The test ensures:

1. Custom attributes with single and multiple values are properly included
2. The response with custom attributes is still correctly signed
3. The XML schema validation still passes with custom attributes
4. We can locate and verify individual attribute values in the response

This provides critical test coverage for the SAML custom attributes
feature implementation.

* Add backward compatibility overload for SuccessfulAuthenticationResponseMessageBuilder.build

This commit adds an overloaded build method that accepts only two parameters
(user and authenticationState) and forwards the call to the three-parameter
version with null for the customAttributes parameter. This maintains backward
compatibility with existing code that doesn't use custom attributes.

This fixes a compilation error in ServerlessSsoIT.java which was still using
the two-parameter method signature.

Signed-off-by: lloydmeta <[email protected]>

* Add validation for duplicate SAML attribute keys

This commit enhances the SAML attributes implementation by adding validation
for duplicate attribute keys. When the same attribute key appears multiple
times in a request, the validation will now fail with a clear error message.

Signed-off-by: lloydmeta <[email protected]>

* Refactor SAML attributes validation to follow standard patterns

This commit improves the SAML attributes validation by:

1. Adding a dedicated validate() method to SamlInitiateSingleSignOnAttributes
   that centralizes validation logic in one place
2. Moving validation from constructor to dedicated method for better error reporting
3. Checking both for null/empty keys and duplicate keys in the validate() method
4. Updating SamlInitiateSingleSignOnRequest to use the new validation method
5. Adding comprehensive tests for the new validation approach

These changes follow standard Elasticsearch validation patterns, making the
code more maintainable and consistent with the rest of the codebase.

* Update docs/changelog/128176.yaml

* Improve SAML response validation in identity provider tests

Enhanced the testCustomAttributesInIdpInitiatedSso test to properly validate
both SAML response structure and custom attributes using DOM parsing and XPath.

Key improvements:
- Validate SAML Response/Assertion elements exist
- Precisely validate custom attributes (department, region) and their values
- Use namespace-aware XML parsing for resilience to format changes

Signed-off-by: lloydmeta <[email protected]>

* Simplify SAML attributes representation using JSON object/Map structure

Also, replace internal Attribute class list with a simpler Map<String, List<String>>
structure

This change:

- Removes the redundant Attribute class and replaces it with a direct Map
  implementation for storing attribute key-value pairs
- Eliminates the duplicate "attributes" nesting in the JSON structure
- Simplifies attribute validation without needing duplicate key checking

- Updates all related tests and integration points to work with the new structure

Before:

```js
{
  // others
  "attributes": {
    "attributes": [
      {
        "key": "department",
        "values": ["engineering", "product"]
      }
    ]
  }
}

After:

```js
{
  // other
  "attributes": {
    "department": ["engineering", "product"]
  }
}
```

(Verified by spitting out JSON entity in IdentityProviderAuthenticationIT.generateSamlResponseWithAttributes
... saw `{"entity_id":"ec:123456:abcdefg","acs":"https://sp1.test.es.elasticsearch.org/saml/acs","attributes":{"department":["engineering","product"],"region":["APJ"]}}`)

Signed-off-by: lloydmeta <[email protected]>

* * Fix up toString dangling quote.

Signed-off-by: lloydmeta <[email protected]>

* * Remove attributes from Response object.

Signed-off-by: lloydmeta <[email protected]>

* * Remove friendly name.
* Make attributes map final in SamlInitiateSingleSignOnAttributes

Signed-off-by: lloydmeta <[email protected]>

* * Cleanup serdes by using existing utils in the ES codebase

Signed-off-by: lloydmeta <[email protected]>

* Touchup comment

Signed-off-by: lloydmeta <[email protected]>

* Update x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java

Co-authored-by: Tim Vernum <[email protected]>

* Add transport-version checks

---------

Signed-off-by: lloydmeta <[email protected]>
Co-authored-by: Tim Vernum <[email protected]>
Samiul-TheSoccerFan pushed a commit to Samiul-TheSoccerFan/elasticsearch that referenced this pull request Jun 5, 2025
…ic#128176)

* Implement SAML custom attributes support for Identity Provider

This commit adds support for custom attributes in SAML single sign-on requests
in the Elasticsearch X-Pack Identity Provider plugin. This feature allows
passage of custom key-value attributes in SAML requests and responses.

Key components:
- Added SamlInitiateSingleSignOnAttributes class for holding attributes
- Added validation for null and empty attribute keys
- Updated request and response objects to handle attributes
- Modified authentication flow to process attributes
- Added test coverage to validate attributes functionality

The implementation follows Elasticsearch patterns with robust validation
and serialization mechanisms, while maintaining backward compatibility.

* Add test for SAML custom attributes in authentication response

This commit adds a comprehensive test that verifies SAML custom attributes
are correctly handled in the authentication response builder. The test ensures:

1. Custom attributes with single and multiple values are properly included
2. The response with custom attributes is still correctly signed
3. The XML schema validation still passes with custom attributes
4. We can locate and verify individual attribute values in the response

This provides critical test coverage for the SAML custom attributes
feature implementation.

* Add backward compatibility overload for SuccessfulAuthenticationResponseMessageBuilder.build

This commit adds an overloaded build method that accepts only two parameters
(user and authenticationState) and forwards the call to the three-parameter
version with null for the customAttributes parameter. This maintains backward
compatibility with existing code that doesn't use custom attributes.

This fixes a compilation error in ServerlessSsoIT.java which was still using
the two-parameter method signature.

Signed-off-by: lloydmeta <[email protected]>

* Add validation for duplicate SAML attribute keys

This commit enhances the SAML attributes implementation by adding validation
for duplicate attribute keys. When the same attribute key appears multiple
times in a request, the validation will now fail with a clear error message.

Signed-off-by: lloydmeta <[email protected]>

* Refactor SAML attributes validation to follow standard patterns

This commit improves the SAML attributes validation by:

1. Adding a dedicated validate() method to SamlInitiateSingleSignOnAttributes
   that centralizes validation logic in one place
2. Moving validation from constructor to dedicated method for better error reporting
3. Checking both for null/empty keys and duplicate keys in the validate() method
4. Updating SamlInitiateSingleSignOnRequest to use the new validation method
5. Adding comprehensive tests for the new validation approach

These changes follow standard Elasticsearch validation patterns, making the
code more maintainable and consistent with the rest of the codebase.

* Update docs/changelog/128176.yaml

* Improve SAML response validation in identity provider tests

Enhanced the testCustomAttributesInIdpInitiatedSso test to properly validate
both SAML response structure and custom attributes using DOM parsing and XPath.

Key improvements:
- Validate SAML Response/Assertion elements exist
- Precisely validate custom attributes (department, region) and their values
- Use namespace-aware XML parsing for resilience to format changes

Signed-off-by: lloydmeta <[email protected]>

* Simplify SAML attributes representation using JSON object/Map structure

Also, replace internal Attribute class list with a simpler Map<String, List<String>>
structure

This change:

- Removes the redundant Attribute class and replaces it with a direct Map
  implementation for storing attribute key-value pairs
- Eliminates the duplicate "attributes" nesting in the JSON structure
- Simplifies attribute validation without needing duplicate key checking

- Updates all related tests and integration points to work with the new structure

Before:

```js
{
  // others
  "attributes": {
    "attributes": [
      {
        "key": "department",
        "values": ["engineering", "product"]
      }
    ]
  }
}

After:

```js
{
  // other
  "attributes": {
    "department": ["engineering", "product"]
  }
}
```

(Verified by spitting out JSON entity in IdentityProviderAuthenticationIT.generateSamlResponseWithAttributes
... saw `{"entity_id":"ec:123456:abcdefg","acs":"https://sp1.test.es.elasticsearch.org/saml/acs","attributes":{"department":["engineering","product"],"region":["APJ"]}}`)

Signed-off-by: lloydmeta <[email protected]>

* * Fix up toString dangling quote.

Signed-off-by: lloydmeta <[email protected]>

* * Remove attributes from Response object.

Signed-off-by: lloydmeta <[email protected]>

* * Remove friendly name.
* Make attributes map final in SamlInitiateSingleSignOnAttributes

Signed-off-by: lloydmeta <[email protected]>

* * Cleanup serdes by using existing utils in the ES codebase

Signed-off-by: lloydmeta <[email protected]>

* Touchup comment

Signed-off-by: lloydmeta <[email protected]>

* Update x-pack/plugin/identity-provider/src/test/java/org/elasticsearch/xpack/idp/action/SamlInitiateSingleSignOnRequestTests.java

Co-authored-by: Tim Vernum <[email protected]>

* Add transport-version checks

---------

Signed-off-by: lloydmeta <[email protected]>
Co-authored-by: Tim Vernum <[email protected]>
tvernum added a commit that referenced this pull request Jun 6, 2025
This extends the change from #128176 to validate the "custom
attributes" on a per Service Provider basis.

Each Service Provider (whether registered or wildcard based) has a
field "attributes.extensions" which is a list of attribute names that
may be provided by the caller of "/_idp/saml/init".

Service Providers that have not be configured with extension
attributes will reject any custom attributes in SAML init.

This necessitates a new field in the service provider index (but only
if the new `extensions` attribute is set).
The template has been updated, but there is no data migration because
the `saml-service-provider` index does not exist in any of the
environments into which we wish to deploy this change.
ldematte added a commit to mosche/elasticsearch that referenced this pull request Jun 10, 2025
commit e6b8a64
Author: Lorenzo Dematte <[email protected]>
Date:   Tue Jun 10 12:02:16 2025 +0200

    PR comments

commit ad0902e
Author: Moritz Mack <[email protected]>
Date:   Fri Jun 6 13:33:37 2025 +0200

    Update ReproduceInfoPrinter to correctly print a reproduction for lucene / BC upgrade tests. Relates to ES-12005

commit 78b4168
Author: Alexander Spies <[email protected]>
Date:   Fri Jun 6 11:37:53 2025 +0200

    ESQL: Throw ISE instead of IAE for illegal block in page (elastic#128960)

    IAE gets reported as a 400 status code, but that's inappropriate when
    inconsistent pages are always bugs, and should be reported with a 500.
    Throw ISE instead.

commit 29e68bd
Author: Aurélien FOUCRET <[email protected]>
Date:   Fri Jun 6 11:24:23 2025 +0200

    [ES|QL] Fix test releases for telemetry. (elastic#128971)

commit 1a76bc2
Author: Bogdan Pintea <[email protected]>
Date:   Fri Jun 6 11:01:49 2025 +0200

    ESQL: Workaround for RLike handling of empty lang pattern (elastic#128895)

    Lucene's `org.apache.lucene.util.automaton.Operations#getSingleton` fails with an Automaton for a `REGEXP_EMPTY` `RegExp`. This adds a workaround for that, to check the type of automaton before calling into that failing method.

    Closes elastic#128813

commit e24fd32
Author: Aurélien FOUCRET <[email protected]>
Date:   Fri Jun 6 10:25:28 2025 +0200

    [ES|QL] Enable the completion command as a tech preview feature (elastic#128948)

commit 3f03775
Author: Niels Bauman <[email protected]>
Date:   Fri Jun 6 09:00:24 2025 +0200

    Remove non-test usages of `Metadata.Builder#putCustom` (elastic#128801)

    This removes all non-test usages of
    ```
    Metadata.Builder.putCustom(String type, ProjectCustom custom)
    ```
    And replaces it with appropriate calls to the equivalent method on
    `ProjectMetadata.Builder`.

    In most cases this _does not_ make the code project aware, but does
    reduce the number of deprecated methods in use.

commit 330d127
Author: Niels Bauman <[email protected]>
Date:   Fri Jun 6 08:07:59 2025 +0200

    Make utility methods in `IndexLifecycleTransition` project-aware (elastic#128930)

    Modifies the methods to work with a project scope rather than a cluster
    scope.
    This is part of an iterative process to make ILM project-aware.

commit 1b5720d
Author: Aurélien FOUCRET <[email protected]>
Date:   Fri Jun 6 07:50:52 2025 +0200

    [ES|QL] Fix test releases for LookupJoinTypesIT. (elastic#128985)

commit 40cf2d3
Author: Tim Vernum <[email protected]>
Date:   Fri Jun 6 13:09:31 2025 +1000

    Add "extension" attribute validation to IdP SPs (elastic#128805)

    This extends the change from elastic#128176 to validate the "custom
    attributes" on a per Service Provider basis.

    Each Service Provider (whether registered or wildcard based) has a
    field "attributes.extensions" which is a list of attribute names that
    may be provided by the caller of "/_idp/saml/init".

    Service Providers that have not be configured with extension
    attributes will reject any custom attributes in SAML init.

    This necessitates a new field in the service provider index (but only
    if the new `extensions` attribute is set).
    The template has been updated, but there is no data migration because
    the `saml-service-provider` index does not exist in any of the
    environments into which we wish to deploy this change.

commit 496fb2d
Author: Jordan Powers <[email protected]>
Date:   Thu Jun 5 19:50:09 2025 -0700

    Skip UTF8 to UTF16 conversion during document indexing (elastic#126492)

    When parsing documents, we receive the document as UTF-8 encoded data which
    we then parse and convert the fields to java-native UTF-16 encoded Strings.
    We then convert these strings back to UTF-8 for storage in lucene.

    This patch skips the redundant conversion, instead passing lucene a
    direct reference to the received UTF-8 bytes when possible.

commit c34f8b6
Author: Tim Vernum <[email protected]>
Date:   Fri Jun 6 12:03:25 2025 +1000

    Improve cache invalidation in IdP SP cache (elastic#128890)

    The Identity Provider's Service Provider cache had two issues:

    1. It checked for identity based on sequence numbers, but didn't
       include the `seq_no_primary_term` parameter on searches, which
       means the sequence would always by `-2`
    2. It didn't track whether the index was deleted, which means it
       could be caching values from an old version of the index

    This commit fixes both of these issues.

    In practice neither issue was a problem because there are no
    deployments that use index-based service providers, however the 2nd
    issue did cause some challenges for testing.

commit 923f029
Author: Nhat Nguyen <[email protected]>
Date:   Thu Jun 5 18:09:58 2025 -0700

    Fix block loader with missing ignored source (elastic#129006)

    We miss appending null when ignored_source is not available. Our
    randomized tests already cover this case, but we do not check it when
    loading fields.

    I labelled this non-issue for an unreleased bug.

    Closes elastic#128959
    Relates elastic#119546

commit 0f8178a
Author: Bogdan Pintea <[email protected]>
Date:   Fri Jun 6 02:02:24 2025 +0200

    ESQL: Forward port 8.19 RegexMatch serialization change version (elastic#128979)

    Fwd port ESQL_REGEX_MATCH_WITH_CASE_INSENSITIVITY_8_19.

    Related: elastic#128919.

commit ee716f1
Author: Simon Chase <[email protected]>
Date:   Thu Jun 5 15:20:08 2025 -0700

    transport: edit TransportConnectionListener for close exceptions (elastic#129015)

    The TransportConnectionListener interface has previously included the
    Transport.Connection being closed and unregistered in its onNodeDisconnected
    callback. This is not in use, and can be removed as it is also available in the
    onConnectionClosed callback. It is being replaced with a Nullable exception that
    caused the close. This is being used in pending work (ES-11448) to differentiate
    network issues from node restarts.

    Closes ES-12007

commit aceaf23
Merge: f18f4ee 159c57f
Author: elasticsearchmachine <[email protected]>
Date:   Thu Jun 5 19:27:54 2025 +0000

    Merge patch/serverless-fix into main

commit 159c57f
Author: Rene Groeschke <[email protected]>
Date:   Tue Jun 3 11:56:27 2025 +0200

    Prepare serverless patch including elastic#128784 elastic#128740 (elastic#128807)

    * Change default for vector.rescoring.directio to false (elastic#128784)

    On serverless (and potentially elsewhere), direct IO is not available, which can cause BBQ shards to fail to read with org.apache.lucene.CorruptIndexException when this setting is true.

    * Optimize sparse vector stats collection (elastic#128740)

    This change improves the performance of sparse vector statistics gathering by using the document count of terms directly, rather than relying on the field name field to compute stats.
    By avoiding per-term disk/network reads and instead leveraging statistics already loaded into leaf readers at index opening, we expect to significantly reduce overhead.

    Relates to elastic#128583

    ---------

    Co-authored-by: Dave Pifke <[email protected]>
    Co-authored-by: Jim Ferenczi <[email protected]>
valeriy42 pushed a commit to valeriy42/elasticsearch that referenced this pull request Jun 12, 2025
This extends the change from elastic#128176 to validate the "custom
attributes" on a per Service Provider basis.

Each Service Provider (whether registered or wildcard based) has a
field "attributes.extensions" which is a list of attribute names that
may be provided by the caller of "/_idp/saml/init".

Service Providers that have not be configured with extension
attributes will reject any custom attributes in SAML init.

This necessitates a new field in the service provider index (but only
if the new `extensions` attribute is set).
The template has been updated, but there is no data migration because
the `saml-service-provider` index does not exist in any of the
environments into which we wish to deploy this change.
elasticsearchmachine pushed a commit that referenced this pull request Jun 16, 2025
This extends the change from #128176 to validate the "custom
attributes" on a per Service Provider basis.

Each Service Provider (whether registered or wildcard based) has a
field "attributes.extensions" which is a list of attribute names that
may be provided by the caller of "/_idp/saml/init".

Service Providers that have not be configured with extension
attributes will reject any custom attributes in SAML init.

This necessitates a new field in the service provider index (but only
if the new `extensions` attribute is set).
The template has been updated, but there is no data migration because
the `saml-service-provider` index does not exist in any of the
environments into which we wish to deploy this change.

Backport of: #128805, #129233
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
>enhancement external-contributor Pull request authored by a developer outside the Elasticsearch team :Security/Authentication Logging in, Usernames/passwords, Realms (Native/LDAP/AD/SAML/PKI/etc) Team:Security Meta label for security team v8.19.0 v9.1.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants