This is an automated email from the ASF dual-hosted git repository.
rlevas pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push:
new b90128b [AMBARI-23530] Document enabling SSO via CLI
b90128b is described below
commit b90128bca4e8c47101c95541b500e3753f5b70a5
Author: Robert Levas <[email protected]>
AuthorDate: Mon Apr 30 07:08:57 2018 -0400
[AMBARI-23530] Document enabling SSO via CLI
---
ambari-server/docs/security/sso/index.md | 541 +++++++++++++++++++++++++++++++
1 file changed, 541 insertions(+)
diff --git a/ambari-server/docs/security/sso/index.md
b/ambari-server/docs/security/sso/index.md
new file mode 100644
index 0000000..9e3a5bc
--- /dev/null
+++ b/ambari-server/docs/security/sso/index.md
@@ -0,0 +1,541 @@
+<!--
+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.
+-->
+
+Ambari Single Sign-on Configuration
+=========
+
+- [Introduction](#introduction)
+- [How it Works](#how-it-works)
+- [Setting SSO Configuration Using the CLI](#setup-using-cli)
+ - [Silent Mode](#setup-using-cli-silent)
+ - [Interactive Mode](#setup-using-cli-interactive)
+- [Managing SSO Configuration Using the REST API](#setup-using-api)
+ - [Getting the SSO Configuration](#setup-using-api-get)
+ - [Setting the SSO Configuration](#setup-using-api-post)
+ - [Updating the SSO Configuration](#setup-using-api-put)
+ - [Deleting the SSO Configuration](#setup-using-api-delete)
+- [Implementation Details](#implementation-details)
+ - [Configuration Data](#implementation-details-data)
+ - [Stack Advisor](#implementation-details-stack-advisor)
+ - [AmbariConfiguration
class](#implementation-details-stack-advisor-ambariconfiguration)
+ - [AmbariSSODetails
class](#implementation-details-stack-advisor-ambarissodetails)
+ - [Example](#implementation-details-stack-advisor-example)
+
+<a name="introduction"></a>
+## Introduction
+
+Ambari has a feature to integrate with [Apache Knox](https://knox.apache.org/)
to
+provide single sign-on (SSO) services. To set this up, the Ambari Server CLI
may be used by executing
+the following on the command line:
+
+```
+ambari-server setup-sso
+```
+
+After answering a few prompts, the CLI utility would update the
`/etc/ambari-server/conf/ambari.properties`
+file with the appropriate properties so that when Ambari was restarted, it
would rely on Knox for
+authentication. One caveat is that both Ambari and Knox would need to know
about the same set of users.
+This is typically done by having both Ambari and Knox sync with the same LDAP
server.
+
+See [Setting up Knox SSO for
Ambari](https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.1/bk_security/content/setting_up_knox_sso_for_ambari.html)
+for more details on how it *used* to work.
+
+One issue with this feature is that it only sets up Ambari to use Knox.
However, other services have
+the ability to integrate with Knox and each requires the user to configure
separately. This is
+inconvenient and error prone for the user.
+
+As of Ambari 2.7.0, Ambari has the ability to collect SSO configuration
details and configure itself,
+as well as, any eligible services for SSO. This is done using the Ambari
Server CLI, as before; however,
+once complete, the collected information is stored in the Ambari database and
then used to configure
+selected service. Any altered configurations would cause the relevant services
to request to be
+restarted. Ambari, on the other hand, will load the SSO configuration
automatically and change its
+behavior without needing to be restarted.
+
+<a name="how-it-works"></a>
+## How it works
+
+Ambari, by default, is eligible to be configured for SSO. Any other service
that is to be eligible
+for SSO configuration by Ambari needs to declare this by adding an "sso"
declaration in its service
+definition's `metainfo.xml` file. The declaration is as follows:
+
+```
+<metainfo>
+ ...
+ <services>
+ <service>
+ ...
+ <sso>
+ <supported>true</supported>
+ <enabledConfiguration>config-type/property_name</enabledConfiguration>
+ </sso>
+ ...
+ </service>
+ </services>
+</metainfo>
+```
+
+Inside the `<sso>` block, the `<supported>` element with the value of "true"
tells Ambari that this
+service is eligible to be configured for SSO. The `enabledConfiguration` is a
property specification
+that indicates a boolean property to check to tell whether the service has
been configured for SSO
+or not.
+
+For example, in the `metainfo.xml` file for Atlas:
+
+```
+ <sso>
+ <supported>true</supported>
+
<enabledConfiguration>application-properties/atlas.sso.knox.enabled</enabledConfiguration>
+ </sso>
+```
+
+Support is enabled and the property value for `atlas.sso.knox.enabled` in the
`application-properties`
+configuration type is used to tell if SSO has been enabled for Atlas or not.
+
+Once support is declared by a service **and** it is installed, it will be
listed as an eligible service
+while selecting services for which to enable SSO via the Ambari Server CLI.
+
+Example:
+```
+# ambari-server setup-sso
+...
+Manage SSO configurations for eligible services [y/n] (n)? y
+ Use SSO for all services [y/n] (n)? n
+ Use SSO for ATLAS [y/n] (n)? y
+...
+```
+
+When the Ambari CLI is complete, the SSO configuration data will be stored in
the Ambari database and
+then the relevant service configurations will be updated. Service
configurations are updated using
+the stack advisor. Any SSO-specific recommendations generated by the stack
advisor are silently
+and automatically applied. If changes are detected, the relevant services
will request to be restarted.
+
+To indicate SSO-specific changes via the stack advisor. The stack's stack
advisor or the service's
+service advisor needs to override the
`ServiceAdvisor.getServiceConfigurationRecommendationsForSSO`
+function:
+
+```
+ def getServiceConfigurationRecommendationsForSSO(self, configurations,
clusterData, services, hosts):
+ ...
+
+```
+
+<a name="setup-using-cli"></a>
+## Setting SSO Configuration Using the CLI
+
+To enable or disable SSO configuration via the Ambari Server CLI, use the
following command:
+
+```
+ambari-server setup-sso
+```
+
+This command works in a silent or an interactive mode.
+
+<a name="setup-using-cli-silent"></a>
+### Silent Mode
+
+In silent mode all configuration details may be set on the command line via
arguments. However, one
+argument is a password that is needed for authentication to use Ambari's REST
API. This argument
+may be left off of the command causing the CLI to prompt for it.
+
+For example:
+```
+# ambari-server setup-sso --ambari-admin-username=admin ...
+Using python /usr/bin/python
+Setting up SSO authentication properties...
+Enter Ambari Admin password:
+```
+
+The following arguments must be supplied when **enabling** SSO:
+
+```
+ --sso-enabled=true
+ Indicates whether to enable/disable SSO
+ --sso-enabled-ambari=<true|false>
+ Indicates whether to enable/disable SSO authentication
+ for Ambari, itself
+ --sso-manage-services=<true|false>
+ Indicates whether Ambari should manage the SSO
+ configurations for specified services
+ --sso-enabled-services=<service list>
+ A comma separated list of services that are expected
+ to be configured for SSO (you are allowed to use '*'
+ to indicate ALL services)
+ --sso-provider-url=<URL>
+ The URL of SSO provider; this must be provided when
+ --sso-enabled is set to 'true'
+ --sso-public-cert-file=SSO_PUBLIC_CERT_FILE
+ The path where the public certificate PEM is located;
+ this must be provided when --sso-enabled is set to
+ 'true'
+ --ambari-admin-username=<username>
+ Ambari administrator username for accessing Ambari's
+ REST API
+```
+
+Optionally, the following arguments may be set:
+
+```
+ --sso-jwt-cookie-name=<cookie name>
+ The name of the JWT cookie
+ Default value: hadoop-jwt
+ --sso-jwt-audience-list=<audience list>
+ A comma separated list of JWT audience(s)
+ Default value <empty>
+ --ambari-admin-password=<password>
+ Ambari administrator password for accessing Ambari's
+ REST API
+```
+
+The following arguments must be supplied when **disabling** SSO:
+
+```
+ --sso-enabled=false
+ Indicates whether to enable/disable SSO
+ --ambari-admin-username=AMBARI_ADMIN_USERNAME
+ Ambari administrator username for accessing Ambari's
+ REST API
+```
+
+Optionally, the following arguments may be set:
+
+```
+ --ambari-admin-password=<password>
+ Ambari administrator password for accessing Ambari's
+ REST API
+```
+
+For more options and up-to-date information, execute the following command:
+```
+ambari-server setup-sso --help
+```
+
+<a name="setup-using-cli-interactive"></a>
+### Interactive Mode
+
+In interactive mode some configuration details may be set on the command line
via arguments and the
+CLI will prompt for the rest.
+
+```
+# ambari-server setup-sso
+Using python /usr/bin/python
+Setting up SSO authentication properties...
+Enter Ambari Admin login: admin
+Enter Ambari Admin password:
+
+SSO is currently not configured
+Do you want to configure SSO authentication [y/n] (y)? y
+Provider URL (https://knox.example.com:8443/gateway/knoxsso/api/v1/websso):
+Public Certificate PEM (empty line to finish input):
+MIICVTCCAb6gAwIBAgIIKwH4/V7SjxEwDQYJKoZIhvcNAQEFBQAwbTELMAkGA1UE
+...
+6fSqZSwbBXwFKf0gIBttufyldePpAsM7Yg==
+
+Use SSO for Ambari [y/n] (n)? y
+Manage SSO configurations for eligible services [y/n] (n)? y
+ Use SSO for all services [y/n] (n)? n
+ Use SSO for ATLAS [y/n] (n)? y
+JWT Cookie name (hadoop-jwt):
+JWT audiences list (comma-separated), empty for any ():
+Ambari Server 'setup-sso' completed successfully.
+```
+
+In either case, the CLI collects the data and submits it to Ambari via the
REST API. This then
+triggers processes in Ambari to enable or disable SSO as needed.
+
+<a name="setup-using-api"></a>
+## Managing SSO Configuration Using the REST API
+
+The SSO configuration may be managed using Ambari's REST API, via the
following entry point:
+
+```
+/api/v1/services/AMBARI/components/AMBARI_SERVER/configurations
+```
+
+This entry point supports the following request types:
+- GET - retrieve the SSO configuration data
+- POST - explicitly set the SSO configuration data, replacing all properties
+- PUT - update the SSO configuration data, only the specified properties are
updated
+- DELETE - removes the SSO configuration data
+
+<a name="setup-using-api-get"></a>
+### Getting the SSO Configuration
+To retrieve the SSO configuration data:
+```
+GET
/api/v1/services/AMBARI/components/AMBARI_SERVER/configurations/sso-configuration
+```
+Example 404 response:
+```
+{
+ "status" : 404,
+ "message" : "The requested resource doesn't exist:
RootServiceComponentConfiguration not found where
Configuration/service_name=AMBARI AND
Configuration/component_name=AMBARI_SERVER AND
Configuration/category=sso-configuration."
+}
+```
+
+Example 200 response:
+```
+{
+ "href" :
"http://ambari_server.host:8080/api/v1/services/AMBARI/components/AMBARI_SERVER/configurations/sso-configuration",
+ "Configuration" : {
+ "category" : "sso-configuration",
+ "component_name" : "AMBARI_SERVER",
+ "service_name" : "AMBARI",
+ "properties" : {
+ "ambari.sso.authentication.enabled" : "false",
+ "ambari.sso.enabled_services" : "AMBARI, ATLAS",
+ "ambari.sso.jwt.audiences" : "",
+ "ambari.sso.jwt.cookieName" : "hadoop-jwt",
+ "ambari.sso.manage_services" : "true",
+ "ambari.sso.provider.certificate" : "-----BEGIN
CERTIFICATE-----\nMIIC...TYptEVg==\n-----END CERTIFICATE-----",
+ "ambari.sso.provider.originalUrlParamName" : "originalUrl",
+ "ambari.sso.provider.url" :
"https://knox.host:8443/gateway/knoxsso/api/v1/websso"
+ },
+ "property_types" : {
+ "ambari.sso.authentication.enabled" : "PLAINTEXT",
+ "ambari.sso.enabled_services" : "PLAINTEXT",
+ "ambari.sso.jwt.audiences" : "PLAINTEXT",
+ "ambari.sso.jwt.cookieName" : "PLAINTEXT",
+ "ambari.sso.manage_services" : "PLAINTEXT",
+ "ambari.sso.provider.certificate" : "PLAINTEXT",
+ "ambari.sso.provider.originalUrlParamName" : "PLAINTEXT",
+ "ambari.sso.provider.url" : "PLAINTEXT"
+ }
+ }
+}
+```
+
+<a name="setup-using-api-post"></a>
+### Setting the SSO Configuration
+To set the SSO configuration data, replacing any previously existing data:
+```
+POST /api/v1/services/AMBARI/components/AMBARI_SERVER/configurations
+```
+Example payload:
+```
+{
+ "Configuration": {
+ "category" : "sso-configuration",
+ "properties": {
+ "ambari.sso.manage_services" : "true",
+ "ambari.sso.enabled_services": "AMBARI, ATLAS",
+ "ambari.sso.provider.url":
"https://knox.host:8443/gateway/knoxsso/api/v1/websso",
+ "ambari.sso.provider.certificate": "-----BEGIN
CERTIFICATE-----\nMIIC...TYptEVg==\n-----END CERTIFICATE-----",
+ "ambari.sso.authentication.enabled": "true",
+ "ambari.sso.jwt.audiences": "",
+ "ambari.sso.jwt.cookieName": "hadoop-jwt",
+ "ambari.sso.provider.originalUrlParamName": "originalUrl"
+ }
+ }
+}
+```
+
+<a name="setup-using-api-put"></a>
+### Updating the SSO Configuration
+To update the SSO configuration data, only replacing or adding specific
properties:
+```
+PUT
/api/v1/services/AMBARI/components/AMBARI_SERVER/configurations/sso-configuration
+```
+Example payload:
+```
+{
+ "Configuration": {
+ "properties": {
+ "ambari.sso.manage_services" : "true",
+ "ambari.sso.enabled_services": "AMBARI, ATLAS, RANGER",
+ "ambari.sso.authentication.enabled": "false"
+ }
+ }
+}
+```
+
+<a name="setup-using-api-delete"></a>
+### Deleting the SSO Configuration
+To delete the SSO configuration data, removing all properties:
+```
+DELETE
/api/v1/services/AMBARI/components/AMBARI_SERVER/configurations/sso-configuration
+```
+
+<a name="implementation-details"></a>
+## Implementation Details
+
+<a name="implementation-details-data"></a>
+### Configuration Data
+
+The SSO configuration data is stored in the `ambari_configuration` table of
the Ambari database.
+This table contains a set of property names and their values, grouped by a
_category_ name. For the
+SSO configuration data, the properties are stored using the category name
"sso-configuration".
+
+The following properties are available for the sso-configuration category:
+- `ambari.sso.manage_services`
+ - A Boolean value indicating whether Ambari is to manage the SSO
configuration for services or not.
+ - Default value: "false"
+- `ambari.sso.enabled_services`
+ - A comma-delimited list of services that are expected to be configured for
SSO. A "*" indicates all services.
+- `ambari.sso.provider.url`
+ - The URL of the SSO provider.
+- `ambari.sso.provider.certificate`
+ - The PEM-encoded x509 certificate containing the public key to use when
verifying the authenticity of a JWT token from the SSO provider.
+ - The PEM file header and footer lines are optional, but recommended.
+- `ambari.sso.provider.originalUrlParamName`
+ - The original URL to use when constructing the URL for SSO provider.
+ - Default value: "originalUrl"
+- `ambari.sso.jwt.audiences`
+ - A list of the JWT audiences expected. Leaving this blank will allow for
any audience.
+ - Default value: ""
+- `ambari.sso.jwt.cookieName`
+ - The name of the cookie which will be used to extract the JWT token from
the request.
+ - Default value: "hadoop-jwt"
+- `ambari.sso.authentication.enabled`
+ - Determines whether to use JWT authentication when logging into Ambari.
+ - Default value: "false"
+
+
+<a name="implementation-details-stack-advisor"></a>
+### Stack Advisor
+
+After updating the SSO configuration data via the CLI (which invokes the REST
API) or the REST API,
+Ambari triggers a process to reconfigure services as needed. This happens in
the background where
+as the only indication that something has changed is that services may request
to be restarted.
+
+The process that is triggered in the background invokes the Stack Advisor,
requesting SSO-specific
+recommendations. It is expected that a service supporting this feature
overrides the
+`getServiceConfigurationRecommendationsForSSO` function and adheres to the
convention that only
+the SSO-relevant configurations are altered.
+
+ ```
+def getServiceConfigurationRecommendationsForSSO(self, configurations,
clusterData, services, hosts):
+ ...
+
+ ```
+
+To help determine how this function should behave, the following classes are
available:
+
+ - `AmbariConfiguration`
+ - `AmbariSSODetails`
+
+<a name="implementation-details-stack-advisor-ambariconfiguration"></a>
+#### AmbariConfiguration class
+
+`AmbariConfiguration` is an entry point into configuration-specific
information about Ambari. It
+uses data from the `ambari-server-configuration` section of the
`services.json` file to build
+_category_-specific utility classes. An instance of this object is created
using the base StackAdvisor
+class's `get_ambari_configuration` function. For example:
+
+```
+ambari_configuration = self.get_ambari_configuration(services)
+```
+
+<a name="implementation-details-stack-advisor-ambarissodetails"></a>
+#### AmbariSSODetails class
+
+The `AmbariSSODetails` class contains utility functions to get and interpret
data from the
+`sso-configiration` data parsed from the `ambari-server-configuration` section
of the `services.json`
+file. To create an instance of this class, the
`AmbariSSODetails.get_ambari_sso_detail` function is
+used. For example:
+
+```
+ambari_sso_details = ambari_configuration.get_ambari_sso_details() if
ambari_configuration else None
+```
+
+The following functions are available:
+
+- `is_managing_services()`
+ - Tests the configuration data to determine if Ambari should be configuring
servcies to enable SSO
+ integration.
+ - The relevant property is "sso-configuration/ambari.sso.manage_services",
which is expected to be
+ a "true" or "false".
+
+- `get_services_to_enable()`
+ - Safely gets the list of services that Ambari should enabled for SSO.
+ - The returned value is a list of the relevant service names converted to
lowercase.
+
+- `should_enable_sso(service_name)`
+ - Tests the configuration data to determine if the specified service should
be configured by
+ Ambari to enable SSO integration.
+ - The relevant property is "sso-configuration/ambari.sso.enabled_services",
which is expected to
+ be a comma-delimited list of services to be enabled.
+
+- `should_disable_sso(service_name)`
+ - Tests the configuration data to determine if the specified service should
be configured by
+ Ambari to disable SSO integration.
+ - The relevant property is "sso-configuration/ambari.sso.enabled_services",
which is expected
+ to be a comma-delimited list of services to be enabled.
+
+- `get_jwt_audiences()`
+ - Gets the configured JWT audiences list
+ - The relevant property is "sso-configuration/ambari.sso.jwt.audiences",
which is expected
+ to be a comma-delimited list of audience names.
+
+- `get_jwt_cookie_name()`:
+ - Gets the configured JWT cookie name
+ - The relevant property is "sso-configuration/ambari.sso.jwt.cookieName",
which is expected
+ to be a string.
+
+- `get_sso_provider_url()`
+ - Gets the configured SSO provider URL
+ - The relevant property is "sso-configuration/ambari.sso.provider.url",
which is expected
+ to be a string.
+
+- `get_sso_provider_original_parameter_name()`
+ - Gets the configured SSO provider's original URL parameter name
+ - The relevant property is
"sso-configuration/ambari.sso.provider.originalUrlParamName", which is
+ expected to be a string.
+
+- `get_sso_provider_certificate(include_header_and_footer=False,
remove_line_breaks=True)`
+ - Retrieves, formats, and returns the PEM data from the stored 509
certificate.
+ - The relevant property is
"sso-configuration/ambari.sso.provider.certificate", which is expected
+ to be a PEM-encoded x509 certificate, including the header and footer.
+ - If the header and footer need to exist, and do not, the will be added. If
they need to be removed,
+ they will be removed if they exist. Any line break characters will be
left alone unless the
+ caller specifies them to be removed. Line break characters will not be
added if missing.
+
+ <a name="implementation-details-stack-advisor-example"></a>
+ #### Example
+
+```
+ def recommendConfigurationsForSSO(self, configurations, clusterData,
services, hosts):
+1 ambari_configuration = self.get_ambari_configuration(services)
+2 ambari_sso_details = ambari_configuration.get_ambari_sso_details() if
ambari_configuration else None
+
+3 if ambari_sso_details and ambari_sso_details.is_managing_services():
+ putProperty = self.putProperty(configurations, "service-site", services)
+
+ # If SSO should be enabled for this service
+4 if ambari_sso_details.should_enable_sso('MY_SERVICE'):
+ putProperty('sso.knox.enabled', "true")
+ putProperty('sso.knox.providerurl',
ambari_sso_details.get_sso_provider_url())
+ putProperty('sso.knox.publicKey',
ambari_sso_details.get_sso_provider_certificate(False, True))
+
+ # If SSO should be disabled for this service
+5 elif ambari_sso_details.should_disable_sso('MY_SERVICE'):
+ putProperty('atlas.sso.knox.enabled', "false")
+```
+
+Explanations:
+1. Obtain an instance of the `AmbariConfiguration` object using data from the
`services` dictionary.
+2. Retrieve the `AmbariSSODetails` object by calling the
`AmbariConfiguration`'s `get_ambari_sso_details`
+function.
+3. Test to see if Ambari should be managing the SSO configuration for
installed services. If so,
+continue; else, there is nothing left to do but exit the function.
+4. Test to see if Ambari should **enable** SSO for the service with the name
of "MY_SERVICE". If so,
+set the relevant properties using values from the `AmbariSSODetails` object.
+5. Test to see if Ambari should **disable** SSO for the service with the name
of "MY_SERVICE". If so,
+set or unset the relevant properties.
+
+**Note:** Both `should_enable_sso` and `should_disable_sso` should be called
to determine what action
+to take. This is because even though Ambari is managing the SSO configuration
for installed services,
+it may not be managing the SSO-configuration for the particular service. So
one of the following
+actions are to be performed: enable, disable, or ignore.
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
[email protected].