Pingaccess 50
Pingaccess 50
0
| Copyright | 1
Copyright
© 2018 Ping Identity® Corporation. All rights reserved.
Trademark
Ping Identity, the Ping Identity logo, PingAccess, PingFederate, PingID, and PingOne are registered trademarks of
Ping Identity Corporation (“Ping Identity”). All other trademarks or registered trademarks are the property of their
respective owners.
Disclaimer
The information provided in this document is provided “as is” without warranty of any kind. Ping Identity disclaims
all warranties, either express or implied, including the warranties of merchantability and fitness for a particular
purpose. In no event shall Ping Identity or its suppliers be liable for any damages whatsoever including direct,
indirect, incidental, consequential, loss of business profits or special damages, even if Ping Identity or its suppliers
have been advised of the possibility of such damages. Some states do not allow the exclusion or limitation of liability
for consequential or incidental damages so the foregoing limitation may not apply.
Document lifetime
Ping Identity may occasionally update online documentation between releases of the related software. Consequently,
if this PDF was not downloaded recently, it may not contain the most up-to-date information. Please refer to the
online documentation at docs.pingidentity.com for the most current information.
From the web site, you may also download and refresh this PDF if it has been updated, as indicated by a change on
this date: February 1, 2018.
| Contents | 2
Contents
PingAccess overview............................................................................................... 10
PingAccess overview.......................................................................................................................................... 10
What is PingAccess?.......................................................................................................................................... 10
PingAccess for Azure AD.................................................................................................................................. 10
What can I do with PingAccess?....................................................................................................................... 11
How does PingAccess work?............................................................................................................................. 13
WAM session initiation.......................................................................................................................... 13
Token mediation..................................................................................................................................... 14
What can I configure with PingAccess?............................................................................................................ 15
Download a Certificate...............................................................................................................60
Delete a key pair........................................................................................................................ 60
System................................................................................................................................................................. 60
Admin Authentication.............................................................................................................................60
Configure Basic Authentication................................................................................................. 60
Configure Admin UI SSO Authentication................................................................................. 61
Configure API Authentication....................................................................................................63
Configuration Export/Import.................................................................................................................. 63
Export PingAccess configuration............................................................................................... 63
Import PingAccess configuration............................................................................................... 64
Clustering................................................................................................................................................ 64
Engines........................................................................................................................................ 66
Administrative nodes.................................................................................................................. 67
License.....................................................................................................................................................68
Upload or view a PingAccess license........................................................................................ 68
Token Provider........................................................................................................................................68
Manage Token Provider............................................................................................................. 68
Install PingAccess................................................................................................... 75
Install PingAccess...............................................................................................................................................75
Installation requirements.........................................................................................................................75
System requirements................................................................................................................... 75
Hardware Requirements..............................................................................................................76
Port requirements........................................................................................................................ 77
Install PingAccess on Linux...................................................................................................................78
Install PingAccess on Red Hat Enterprise Linux...................................................................................79
Install PingAccess for Windows............................................................................................................ 79
Start PingAccess................................................................................................................................................. 80
Access the admin console for the first time...................................................................................................... 81
Access the PingAccess administrative API........................................................................................................81
Access the interactive administrative API documentation.....................................................................82
Change configuration database passwords.........................................................................................................82
Stop PingAccess..................................................................................................................................................82
Run PingAccess as a service..............................................................................................................................83
Configure PingAccess to run as a Linux systemv service.....................................................................83
Configure PingAccess to run as a Linux systemd service.....................................................................83
Configure Multiple Instances of PingAccess as Linux services............................................................ 84
Remove the PingAccess Linux service.................................................................................................. 84
Configure PingAccess to run as a Windows service............................................................................. 84
Remove the PingAccess Windows service............................................................................................ 85
Uninstall PingAccess.......................................................................................................................................... 85
Upgrade PingAccess............................................................................................... 86
Upgrade a PingAccess standalone version.........................................................................................................86
Upgrade a PingAccess cluster............................................................................................................................ 87
Upgrade Windows using the installer................................................................................................................ 88
Upgrade RHEL using the installer..................................................................................................................... 88
Complete the upgrade.........................................................................................................................................89
Restore a PingAccess configuration backup...................................................................................................... 95
Configure logging....................................................................................................99
Configure logging............................................................................................................................................... 99
Security audit logging.........................................................................................................................................99
Logging............................................................................................................................................................. 101
Configure log levels......................................................................................................................................... 102
Configure a class or package log level............................................................................................................ 102
Enable cookie logging...................................................................................................................................... 102
Append log messages to syslog and the console............................................................................................. 103
Write logs to other formats.............................................................................................................................. 103
Write logs to databases.........................................................................................................................103
Write audit logs for Splunk..................................................................................................................106
Performance tuning...........................................................................................................................................194
Java tuning........................................................................................................................................................ 194
Configure JVM crash log in Java startup............................................................................................ 194
Configure memory dumps in Java startup........................................................................................... 194
Modify the Java heap size....................................................................................................................195
Operating system tuning...................................................................................................................................195
Linux tuning..........................................................................................................................................195
Windows tuning.................................................................................................................................... 196
Garbage collector configuration....................................................................................................................... 197
Acceptor threads............................................................................................................................................... 197
Worker threads..................................................................................................................................................198
Backend server connections............................................................................................................................. 198
Logging and Auditing.......................................................................................................................................199
Logging................................................................................................................................................. 199
Auditing.................................................................................................................................................199
Agent tuning......................................................................................................................................................199
PingAccess overview
PingAccess overview
This document provides an overview of PingAccess. Use this document to gain an understanding of the product, to
learn about what you can do, and to discover the many features it provides. To get the most from PingAccess, users
should read about and understand the concepts included in this document.
As you learn about PingAccess features and functions, review PingAccess scenario documentation for steps to
configure them. For a comprehensive set of instructions for using the PingAccess interface, see the PingAccess User
Interface Reference Guide.
This document answers the following questions:
• What is PingAccess? on page 10
• What can I do with PingAccess? on page 11
• How does PingAccess work? on page 13
• What can I configure with PingAccess? on page 15
What is PingAccess?
PingAccess is an identity-enabled access management product that protects Web Applications and APIs by applying
security policies to client requests. In simpler terms, PingAccess allows you to protect sites, APIs, and other resources
using rules and other authentication criteria. It works in conjunction with PingFederate or other common token
provider via the OAuth 2.0 and OpenID Connect protocols to integrate identity-based access management policies via
a federated corporate identity store using open standards access protocols.
• Customize configuration of site authenticators and authentication requirements to suit the security needs of your
organization.
• Incorporate legacy authentication mechanisms through Token Mediation.
• Apply policies to define how and when a client can access target resources.
Customize your identity access management configuration with the following features.
Apply policies
Use policies, made up of rules, set of rules, or groups of rule sets applied to an application and its resources, to
define how and when a client can access target sites. Rules are the building blocks for access control and request
processing.
Backup and restore
Backup or restore a PingAccess configuration with just a few clicks.
Configure a token provider
PingAccess can be configured to use PingFederate as the token provider or may be configured to use a common
token provider via the OAuth 2.0 or OpenID Connect protocols.
Configure administrator authentication
Allow administrators to authenticate with a simple username and password, or configure them to authenticate via
SSO or API in conjunction with PingFederate.
Configure advanced network settings
Create an availability profile to determine how you want to classify a target server as having failed, configure
listener ports, define a load balancing strategy, or use HTTP Requests to match a served resource with the
originating client.
Configure logging
Capture several log types, including those for the engine, security auditing, and cookies. Store logs in Splunk, in
an Oracle, PostgreSQL, or SQL Server database, or in a file.
Configure Single Logout
End PingAccess sessions easily when used in conjunction with PingFederate managed sessions or compatible
third party OpenID Connect providers.
Create clusters
Deploy PingAccess in a clustered environment to provide higher scalability and availability for critical services.
Use subclusters to provide better scaling of large PingAccess deployments by allowing multiple engine nodes
in the configuration to share information. Place a load balancer in front of each subcluster in order to distribute
connections to the nodes in the subcluster.
Customize PingAccess look and feel
Customize and localize the PingAccess pages your users will see, including those for error messages and logout
confirmation.
Customize with SDKs
Customize development with SDKs to extend the functionality of the PingAccess server.
Manage certificates and key pairs
Import certificates to establish trust with certificates presented during secure HTTPS sessions. Import or generate
key pairs that include the private key and X.509 certificate required for HTTPS communication.
Manage sessions
Use web sessions to define the policies for web application session creation, lifetime, timeout, and scope. Use
multiple web sessions to scope the session to meet the needs of a target set of applications. Web sessions improve
the security model of the session by preventing unrelated applications from impersonating the end user.
Manually configure runtime parameters
Use a text editor to modify configuration file settings used by PingAccess at runtime.
| PingAccess overview | 13
Processing steps:
1. When a user requests access to a Web resource from PingAccess, PingAccess inspects the request for a
PingAccess Token.
| PingAccess overview | 14
2. If the PA Token is missing, PingAccess redirects the user to an OpenID Connect Provider (OP) for authentication.
Info: When using an OP, an OAuth Client must already be configured in PingAccess. For steps on
configuring an OAuth Client within PingFederate, see the PingFederate Administrator's Manual. To
configure the OAuth Client within PingAccess, see the PingAccess scenario to Configure a Token
Provider.
3. The OP follows the appropriate authentication process, evaluates domain-level policies, and issues an OpenID
Connect (OIDC) ID Token to PingAccess.
4. PingAccess validates the ID Token and issues a PA Token and sends it to the browser in a cookie during a
redirect to the original target resource. Upon gaining access to the resource, PingAccess evaluates application and
resource-level policies and optionally audits the request.
Info: PingAccess can perform Token Mediation by exchanging the PA Token for the appropriate security
token from the PingFederate STS or from a cache (if token mediation occurred recently).
5. PingAccess forwards the request to the target site.
6. PingAccess processes the response from the site to the browser (step not shown).
Info: See the Session Management scenario for more information.
Token mediation
When planning a PingAccess deployment, it is necessary to take inventory of existing applications, and their
authentication requirements and mechanisms. When an existing token-based authentication mechanism is in use,
retrofitting that mechanism may not always be desirable or cost-effective.
Token Mediation allows a PingAccess gateway to use a PingFederate token generator to exchange the PA Token
or an OAuth Bearer Token for a security token used by the foreign authentication system. The access request is
transparent to the user, allowing PingAccess to transparently manage access to systems using those foreign tokens.
The request is also transparent to the protected application, which handles the access request as if it came from the
user directly. Once token mediation has occurred, the token used for accessing the application is cached for continued
use during the session.
The following illustration shows an example of token mediation using PingFederate to exchange a PA Token or
OAuth Bearer Token for a different security token.
Processing steps:
1. A user requests a Resource from PingAccess with a PA Token or OAuth Bearer Token.
| PingAccess overview | 15
Info: This example assumes the user has already obtained a PA Token or OAuth Bearer Token. See the
Session Management scenario for information on how users authenticate with PingFederate and obtain a
PA Token or OAuth Bearer Token.
2. PingAccess evaluates resource-level policies and performs token mediation by acquiring the appropriate security
token from the PingFederate STS specified by the Site Authenticator.
3. PingAccess sends the request to the Site (Web application) with the appropriate token.
4. PingAccess returns the response to the client (not shown).
If multiple targets are specified in a site configuration but a load balancing strategy is not applied, then the
Availability Profile will cause the first listed target in the site configuration to be used unless it fails. Secondary
targets will only be used if the first target is not available.
Certificates
Certificates are used to establish anchors used to define trust to certificates presented during secure HTTPS
connections. Outbound secure HTTPS connections such as communication with PingFederate for OAuth
access token validation, identity mediation, and communication with a target Site require a certificate trusted by
PingAccess. If one does not exist, communication is not allowed.
Certificates used by PingAccess may be issued by a CA or self-signed. CA-issued certificates are recommended
to simplify trust establishment and minimize routine certificate management operations. Implementations of an
X.509-based PKI (PKIX) typically have a set of root CAs that are trusted, and the root certificates are used to
establish chains of trust to certificates presented by a client or a server during communication.
The following formats for X.509 certificates are supported:
• Base64 encoded DER (PEM)
• Binary encoded DER
Clustering
PingAccess can be configured in a clustered environment to provide higher scalability and availability for critical
services.
PingAccess clusters are made up of three types of nodes:
Administrative Console
Provides the administrator with a configuration interface
Replica Administrative Console
Provides the administrator with the ability to recover a failed administrative console using a manual failover
procedure.
Clustered Engine
Handles incoming client requests and evaluates policy decisions based on the configuration replicated from
the administrative console
Any number of clustered engines can be configured in a cluster, but only one administrative console and one
replica administrative console can be configured in a cluster.
Further use of subclusters provides better scaling of very large PingAccess deployments by allowing multiple
engine nodes in the configuration to share certain information.
HTTP requests
HTTP Requests are used to match a served resource with the originating client when one or more reverse proxies
are between the client and the served resource. For example, when a reverse proxy sits between the client and the
PingAccess server or a PingAccess agent, the additional proxy might be identified as the client. Such proxies can
be configured to inject additional headers to relay the originating client address.
Identity Mappings
Identity mappings make user attributes available to back-end sites that use them for authentication. There are
multiple types of identity mappings, each with different behavior and a distinct set of fields to specify the identity
mapping behavior.
Key pairs
Key pairs are required for secure HTTPS communication. A Key Pair includes a private key and an X.509
certificate. The certificate includes a public key and the metadata about the owner of the private key.
PingAccess listens for client requests on the administrative console port and on the PingAccess engine port. To
enable these ports for HTTPS, the first time you start up PingAccess, it generates and assigns a Key Pair for each
port. These generated Key Pairs are assigned on the HTTPS Listeners page.
| PingAccess overview | 17
Additionally, Key Pairs are used by the Mutual TLS Site Authenticator to authenticate PingAccess to a target
Site. When initiating communication, PingAccess presents the client certificate from a Key Pair to the Site during
the mutual TLS transaction. The Site must be able to trust this certificate in order for authentication to succeed.
Listeners
Listeners monitor ports for incoming requests. PingAccess can place listeners on ADMIN, ENGINE, and
AGENT ports.
Load balancing strategies
Load Balancing Strategies are used in a Site configuration to distribute the load between multiple backend target
servers. Load balancing settings are optional, and only available if more than one target is listed for a site. This
functionality can replace a load balancer appliance between the PingAccess engine nodes and the target servers,
allowing for a simpler network architecture.
The Header-Based strategy requires a header be included in the request that defines the target to select from the
Site configuration. This strategy has an option to fall back if the requested target is unavailable, or if the header is
missing from the request.
The Round Robin strategy has a sticky session option that permits a browser session to be pinned to a persistent
backend target. This strategy works in conjunction with the availability profile to select a target based on its
availability, and the load balancer will not select a target that is in a failed state.
Policies
The Policy Manager is a rich drag-and-drop interface where you can manage policies by creating Rules, building
Rule Sets and Rule Set Groups, and applying them to Applications and Resources. Policies are rules, set of rules,
or groups of rule sets applied to an application and its resources. Policies define how and when a client can access
target Sites. When a client attempts to access an application resource identified in one of the policy's Rules, Rule
Sets, or Rule Set Groups, PingAccess uses the information contained in the policy to decide whether the client
can access the application resource and whether any additional actions need to take place prior to granting access.
Rules can restrict access in a number of ways such as testing user attributes, time of day, request IP addresses, or
OAuth access token scopes. Rules can also perform request processing such as modifying headers or rewriting
URLs.
Proxies
Configure settings to authenticate with a forward proxy server when PingAccess makes requests to sites or token
providers.
Rules, Rule sets, and Rule set groups
Rules are the building blocks for access control and request processing. There are many types of rules, each with
different behavior and a distinct set of fields to specify the rule behavior. Rule Sets allow you to group multiple
Rules into re-usable sets which can be applied to applications and resources. Rule set groups can contain rule sets
or other rule set groups, allowing the creation of hierarchies of rules to any level of depth. Rule sets and rule set
groups can be applied to applications and resources as required.
Sites
Sites are the target applications or APIs which PingAccess Gateway is protecting and to which authorized client
requests are ultimately forwarded to.
Site Authenticators
When a client attempts to access a target Web Site, that Site may limit access to only authenticated clients.
PingAccess integrates with those security models using Site Authenticators. PingAccess supports a variety
of Site Authenticators that range from basic username/password authentication to certificate and token-based
authentication. Create a Site Authenticator for the type of authentication the Site requires.
Token provider
Token providers are used as a method of providing credentials for secure access to a given target.
Unknown resources
Unknown resources are resources for which there is no PingAccess definition. You can specify the default and
per-agent handling behavior for unknown resource requests and configure custom error responses.
| PingAccess overview | 18
Virtual Hosts
Virtual Hosts enable PingAccess to protect multiple application domains and hosts. A Virtual Host is defined by
the host name and host port.
Web sessions
Web Sessions define the policy for Web application session creation, lifetime, timeouts, and their scope. Multiple
Web Sessions may be configured to scope the session to meet the needs of a target set of applications. This
improves the security model of the session by preventing unrelated applications from impersonating the end user.
| PingAccess user interface reference guide | 19
Applications
Applications represent the protected web applications and APIs to which client requests are sent. Applications are
composed of one or more resources, have a common Virtual Host and Context Root, and correspond to a single target
site. Applications may also use a common Web Session and Identity Mapping. Access control and request processing
rules can be applied to applications and their resources on the Policy Manager page to protect them. Applications
can be protected by PingAccess Gateway or PingAccess Agent. In a gateway deployment, the target application is
specified as a Site. In an agent deployment, the application destination is an Agent.
There are 3 application types:
• Web
• API
• Web + API
Web + API applications allow administrators to configure both Web and API settings for an application. These
applications are able to switch between web and API processing behaviors on the fly based on whether the inbound
request contains a web session cookie (web) or an OAuth token (API). If the inbound request contains neither,
PingAccess will fallback to the method you specify as the Fallback Type for the application.
Use this page to define the applications which PingAccess protects and to which client requests are ultimately
forwarded. You can use resources to partition the application into areas requiring distinct access control. Each
Application contains at least a Root Resource. The combination of Virtual Server and Context Root must be unique
for each Application.
Manage Applications
This document contains the steps required to:
• Add an application on page 19
• Edit an application on page 20
• Delete an application on page 20
Add an application
1. Navigate to Main > Applications.
2. Click Add Application.
3. Complete the fields on the screen using Manage Applications - Field Descriptions on page 20 as a guide.
4. Click either Save or Save & Go to Resources when finished. The latter option allows you to configure additional
application resources.
| PingAccess user interface reference guide | 20
Note: When you save the application, PingAccess verifies the Redirect URI for the Application's virtual
host is configured in the PingFederate. If PingAccess determines that the Redirect URI is not defined, you
will receive the following warning:
If you see this warning, ensure that there is a Redirect URI that matches configured. If you have a
wildcard in your Virtual Host configuration, ensure the Redirect URI list includes the same wildcard host
definition, otherwise you may have a configuration that is only valid in some circumstances.
This validation is performed if the Application Type is Web or Web + API, a Web Session is selected,
and the PingFederate Administration connection is configured.
Edit an application
1. Navigate to Main > Applications.
2. Expand the application on the Properties tab and click .
3. Make the required changes using Manage Applications - Field Descriptions on page 20 as a guide.
4. Click Save or Save and Go to Resources.
Delete an application
1. Navigate to Main > Applications.
2. Expand the application and click .
3. Click Delete to confirm.
Case Sensitive Path No Indicates whether or not to make request URL path matching case
sensitive.
| PingAccess user interface reference guide | 21
Virtual host(s) Yes Specifies the virtual host for the application. Click Create to create a
virtual host.
Application Type Yes Specifies the application type, either Web, API, or Web + API.
• If the Application Type is Web, select the Web Session if the
application is protected and, if applicable, the Identity Mapping
for the application. Click Create to create a Web Session or
Identity Mapping.
• If the Application Type is API, specify whether or not the
application is Protected by an OAuth Authorization Server
defined in Settings > System > Token Provider and, if
applicable, select the Identity Mapping for the application.
Click Create to create an Identity Mapping.
• If the Application Type is Web + API, select the Fallback
Type to indicate the method to use when a request for a resource
does not contain a web session cookie or OAuth token. Select the
Web Session and, if applicable, the Identity Mappings to use
for each type. In this configuration, the Web Session is required
and the API is protected by default.
Destination Yes Specifies the application destination type, either Site or Agent.
• If the destination is a Site, select the Site requests are sent
to when access is granted. If HTTPS is required to access this
application, and at least one non-secure HTTP listening port is
defined, select the Require HTTPS option. Click Create to
create a Site.
• If the destination is an Agent, select the agent which intercepts
and validates access requests for the Application. Click Create to
create an Agent.
Note: This option is not available for unprotected applications. Web applications types are unprotected
when they do not have an associated web session. API applications are unprotected when they are not
configured to be protected by an authorization server.
8. If the application type is API or Web + API, enter the Methods supported by the Resource. Leave the asterisk
default if the Resource supports all HTTP methods, including custom methods. Defining Methods for a Resource
allows more fine-grained access control policies on API Resources. For example, if you have a server optimized
for writing data (POST, PUT) and a server optimized for reading data (GET), you may want to segment traffic
based on the operation being performed.
9. Select the Audit checkbox to log information about the transaction to the audit store.
10. If the application type is Web + API, indicate whether the application resource should override the fallback type
specified for the main application. If you select Yes for this option, select the method to be used for the application
resource when a request does not contain a web session cookie or OAuth token.
Important: It is important to carefully consider your configuration when making this selection. Changing
the Application Fallback Type can have unexpected effects on Resources that do not override the
Fallback. For example, if you configure a Web + API Application with a Fallback Type of Web along
with several Resources that do not override the Fallback Type, these Resources will emit a 401 response
(rather than a 302 to PingFederate) if you later change the Fallback Type to API on the main application.
The PingAccess runtime uses Fallback Type to determine which processing flow (Web or API) to use
when the request does not contain a web session or an API OAuth Bearer token. When a request does not
contain either of these authentication mechanisms, it will rely on this configuration to determine which
processing flow to use.
11. Select the Enabled check box to enable the resource.
12. Click Save.
Sites
Choose from one of the following sections:
• Sites on page 23
• Site Authenticators on page 24
| PingAccess user interface reference guide | 23
Sites
Sites are the target applications, endpoints, or APIs which PingAccess Gateway is protecting and to which authorized
client requests are ultimately forwarded to.
Manage Sites
This document contains the steps required to:
• Add a site on page 23
• Edit a site on page 23
• Delete a site on page 23
Add a site
1. Navigate to Main > Sites > Sites.
2. Click Add Site.
3. Complete the fields on the screen using Manage Sites - Field Descriptions on page 23 as a guide.
4. To configure advanced settings, click Show Advanced.
5. Click Save.
Note: If the target site cannot be contacted, the site is saved and a warning is displayed indicating the
reason the site was not reachable.
Edit a site
1. Navigate to Main > Sites > Sites.
2. Expand the site you want to edit, then click .
3. Make the required changes.
4. Click Save.
Note: If the target site cannot be contacted, the site is saved and a warning is displayed indicating the
reason the site was not reachable.
Delete a site
1. Navigate to Main > Sites > Sites.
2. Expand the site you want to delete.
3. Click .
4. When prompted, click Delete to confirm.
Site Authenticators No If the Site requires the use of site authenticators, select one or
more authenticators from the list. Click Create to create a Site
Authenticator. Click x to remove a Site Authenticator.
Use Target Host Header No Select the check box to have PingAccess modify the Host header
for the Site's Target Host and Target Port rather than the Virtual Host
configured in the application.
Note: When cleared, PingAccess makes no changes to the
Hostheader. This is often required by target web servers
to ensure they service the HTTP request with the correct
internal virtual server definition.
Site Authenticators
Site Authenticators define the authentication mechanism that target sites require to control access.
Field Description
Username The username required for access to the protected Site.
Password The password required for access to the protected Site.
Field Description
Key Pair The imported/generated key pair for client
authentication. Select the key pair you want to use to
authenticate PingAccess to the target Site. To create a
key pair, see Import an existing key pair on page 58
or Generate a new key pair on page 59.
| PingAccess user interface reference guide | 26
Field Description
Token Generator ID Defines the Instance Name of the Token Generator that
you want to use. The Token Generator is configured in
PingFederate (see PingFederate documentation).
Logged In Cookie Name Defines the cookie name containing the token that the
target site is expecting.
Logged Off Cookie Name Defines the cookie name that the target site responds
with in the event of an invalid or expired token. If the
PA Token is still valid, PingAccess re-obtains a valid
WAM Token and makes the request to the site again. If
the site responds with the cookie set as logged off again,
PingAccess responds to the client with an access denied
page.
Logged Off Cookie Value Defines the value placed in the Logged Off Cookie to
detect an invalid/expired WAM Token event.
Source Token Defines the token type exchanged for a security token
during identity mediation. Select PA Cookie for Web
access or OAuth Bearer Token for API identity
mediation.
Send Cookies to Browser Allows the Token Mediator to send the backend cookie
defined in the Logged In Cookie Name field back to the
browser if the protected application has updated it.
If the set-cookie header isn't in the response from the
protected site, and the Token Mediator Site Authenticator
has a cached token for that session, the Token Mediator
Site Authenticator will create a new set-cookie response
header based on the Cookie Domain, Cookie Max Age,
HTTP-Only Cookie and Secure Cookie fields in the UI.
The admin now can direct the Token Mediator Site
Authenticator to be an active player in returning cookies
to the user's browser, even when the protected site isn't
doing that.
This could be used to enable a seamless SSO experience
for users navigating from PingAccess protected
applications to those protected by a 3rd party Web
Access Management system.
Cookie Domain Enter the domain of the logged in cookie.
Cookie Max Age Define the length of time in minutes, that you want the
generated logged in cookie to be valid.
HTTP-Only Cookie Define the logged in cookie as HTTP-Only. An HTTP-
Only cookie is not accessible using non-HTTP methods,
such as calls via JavaScript (for example, referencing
document.cookie).
Secure Cookie Indicate whether the generated logged in cookie must be
sent using only HTTPS connections.
| PingAccess user interface reference guide | 27
Field Description
Token Processor ID Defines the Instance Name of a Token Processor that
you want to use. The Token Processor is configured
in PingFederate (see PingFederate documentation).
Specify this value if more than one instance of either
the JWT Token Processor or the OAuth Bearer Access
Token Processor is defined in PingFederate.
Agents
Agents are web server plugins that are installed on the web server hosting the target application. Agents intercept
client requests to protected applications and allow or deny the request to proceed by consulting the Policy Manager
or using cached information. Agents communicate with the PingAccess Policy Server via the PingAccess Agent
Protocol (PAAP) which defines in detail the possible interactions between agents and Policy Server. Agents have
a name to identify them and a shared secret to authenticate with to Policy Server. Agents do not need to be unique.
There can be any number of agents using the same name and secret and they are all treated equally by Policy Server.
This is useful in complex deployments where unique agents would be difficult to manage. Agents can be assigned as
the destination for one or more applications by name.
Prior to defining an agent, import or create an Agent listener key pair and assign it to the AGENT Listener by
performing the following steps:
1. Import or Generate a Key Pair. The key pair's subject or subject alternative names list need to include the host or
hosts the agent will use to contact the PingAccess Policy Server.
2. Navigate to Networking > Listeners > HTTPS Listeners.
3. In the AGENT dropdown, select the Key Pair you want to use, and then click Save.
4. Restart PingAccess.
Info: If the environment is clustered, check the pingaccess.log file on each engine to ensure replication
completed before restarting each engine.
Manage Agents
This document contains the steps required to:
• Add an agent on page 27
• Edit an agent on page 28
• Delete an agent on page 28
Add an agent
1. Navigate to Main > Agents > Agents.
2. Click Add Agent.
3. Complete the fields on the screen using Manage Agents - Field Descriptions on page 28 as a guide.
4. To configure advanced settings, click Show Advanced.
5. Click Save & Download to save the configuration and download <agent-name>_agent.properties for
use with the PingAccess Agent.
Note: The Shared Secret is generated by PingAccess server and identified on this page with a timestamp.
Existing secrets can be deleted by clicking the Remove button in the secret field. If an additional secret is
needed, edit the agent and click Save & Download to generate and download a new Shared Secret.
Note: PingAccess can generate additional agent agent.properties files containing the specified
information which can be used to configure the agent plugin. Existing configurations can also be re-
downloaded if necessary.
| PingAccess user interface reference guide | 28
Edit an agent
1. Navigate to Main > Agents > Agents.
2. Expand an existing agent, then click .
3. Make the required changes.
4. To download the Shared Secret, click the Download button. To remove the Shared Secret, click the Remove
button.
5. Click Save & Download to download the file.
Delete an agent
1. Navigate to Main > Agents > Agents.
2. Expand an existing agent, then click .
3. When prompted, click Delete to confirm.
Failover Host No In the Failover Host fields, enter the Hostname and Port of the
PingAccess server where the agent should send requests in the event
of a failover from the PingAccess Host.
Tip: Additional failover hosts may be added via API. For
more information, see the PingAccess API Management
Guide.
Agent Trusted Certificate Yes Specify the Agent Trusted Certificate to export in the agent
properties file. The agent uses the selected certificate to
communicate with the PingAccess engine via SSL/TLS. PingAccess
gathers these certificates from imported certificates. If the
appropriate certificate is not available, it needs to be imported into
the system.
Override Request IP Source No If required, select Yes to Override Request IP Source
Configuration Configuration and enable additional controls that configure the
agent to use different IP Source information.
| PingAccess user interface reference guide | 29
Policies
The Policy Manager is a rich drag-and-drop interface where you can manage policies by creating Rules, building
Rule Sets and Rule Set Groups, and applying them to Applications and Resources. Policies are rules, set of rules, or
groups of rule sets applied to an application and its resources. Policies define how and when a client can access target
Sites. When a client attempts to access an application resource identified in one of the policy's Rules, Rule Sets, or
Rule Set Groups, PingAccess uses the information contained in the policy to decide whether the client can access the
application resource and whether any additional actions need to take place prior to granting access. Access control
rules can restrict access in a number of ways such as testing user attributes, time of day, request IP addresses, or
OAuth access token scopes. Processing rules can perform request processing such as modifying headers or rewriting
URLs.
Note: Rule requests are processed in the order in which they appear in the Administration interface. Rule
responses are processed in reverse order.
Tip: Ensure that any headers used in access control rules (such as X-Forwarded-For, which is used by
Network Range rules) are sanitized and managed exclusively by inline infrastructure that users must be routed
through before reaching PingAccess and the protected applications.
Info: Processing rules cannot be used with Agents.
Manage Rules
This document contains the steps required to:
• Create a rule on page 29
• Edit a rule on page 30
• Delete a rule on page 30
• Configure advanced fields for rules on page 30
Create a rule
1. Navigate to Main > Policies.
| PingAccess user interface reference guide | 30
Edit a rule
1. Navigate to Main > Policies.
2. Expand the rule you want to edit and click .
3. Make the required changes.
4. Click Save.
Delete a rule
1. Navigate to Main > Policies.
2. Expand the rule you want to delete and click .
3. When prompted, click Remove to delete the rule.
Field Description
Error Response Code The HTTP status response code you want to send if Rule
evaluation fails. For example, 403.
Error Response Status Message The HTTP status response message you want to return if
Rule evaluation fails. For example, Forbidden.
Error Response Template File The HTML template page for customizing the error
message that displays if Rule evaluation fails. This
template file is located in the PA_HOME/conf/
template/ directory.
Error Response Content Type The type of content for the error response so the client
can properly display the response.
Tip: When used in a rule set with Any criteria, this rule should be positioned first in the list to ensure step-up
authentication is triggered upon rule set criteria failure.
To configure an Authentication Requirements rule:
1. Select an Authentication Requirements List.
2. Select a Minimum Authentication Requirement.
Note: The possible values for the Minimum Authentication Requirement are derived from the selected
Authentication Requirements list.
https://server1.internalsite.com/content/
For example purposes, let's say this results in a 302 Redirect to an importantContent.html page as well as
setting a domain cookie for .internalsite.com. If you protect this site with PingAccess (using the virtual host
publicsite.com) under the application /importantstuff/, you need to rewrite the content. The information
below discusses an example scenario.
Info: This example assumes that a virtual host, a site, and an application are already configured.
Info: This also works for relative redirects: /content/ is rewritten to /importantstuff/. It also
works for the path beneath the one defined in the URI: /content/news/index.html is rewritten to
importantstuff/news/index.htm.
This rule supports content that is either chunked or streamed from the target server. When sent to the client, the
content is always chunked.
To configure a Content Rewrite rule:
1. Enter a name for the rule.
2. Select Rewrite Content from the list.
3. Enter one or more Response Content-Types to define what type of response data the rewrite rule applies to. The
default values are text/html, text/plain, and application/json. The list is an ordered list.
Info: Only text-based content types are supported. Text-based content types compressed with gzip,
deflate, or compress will be decompressed prior to rewrite rule processing, however the content is not then
re-compressed before being sent to the client.
4. Define one or more set of Find and Replace Criteria. If multiple criteria are specified, each operation is
performed against the original content - effectively applying the rule concurrently.
Important: Changes can affect CSS, Javascript, and other text-based elements served to the client. Be
sure to properly craft the regular expression to avoid modifying content that wasn't intended.
5. If necessary, increase the size of the buffer used to perform the replace operation by clicking Show Advanced and
entering a value in Maximum Buffer Size.
Note: Replacement values cannot be larger than the buffer size. The minimum buffer size that can be
specified is 1024 bytes; there is no maximum value.
6. If the protected application does not return a Content-Type header, select Missing Content-Type Allowed.
7. If Missing Content-Type Allowed is enabled, you must specify the encoding the application returns in the
Missing Content-Type Charset field. For example, this field could contain UTF-8. A list of valid values is
available in this Oracle Java 8 SE Technical Note.
Examples:
| PingAccess user interface reference guide | 34
5. In the Public-Facing Cookie Domain field, enter the domain name you want to display in the response from
PingAccess.
6. Click Save.
Rewrite Cookie Path rule
Converts the cookie path returned by the Site into a public-facing path. This enables the details of exposed
applications to be managed by PingAccess for security and request routing purposes. For example, a Site places a
cookie in a server-facing cookie path such as /content/. Using the information configured in the Rewrite Cookie
Path Rule, PingAccess rewrites the Path portion of the Set-Cookie response header with a public-facing cookie
path such as /importantstuff/.
To configure a Rewrite Cookie Path rule:
1. Name the Rule.
2. Select Rewrite Cookie Path from the list.
3. In the Server-Facing Cookie Path field, enter the path name where the cookie is valid for the back-end Site.
4. In the Public-Facing Cookie Path field, enter the path name you want to display in the response from
PingAccess.
5. Click Save.
Rewrite Response Header rule
Converts the response header value returned by the Site into a public-facing value. This Rule rewrites one of three
response headers: Location, Content-Location, and URI. For example, the server-facing Location
response header includes a path that begins with /test-war/. Using the information configured in the Rewrite
Response Header Rule, PingAccess rewrites http://private/test-war/ with a public-facing path such as
http://public/path/.
To configure a Rewrite Response Header rule:
1. Name the Rule.
2. Select Rewrite Response Header from the list.
3. If the target host needs to be explicitly defined, clear the Any Site Target Host checkbox.
When the Any Site Target Host checkbox is enabled, PingAccess will rewrite the response header URI if it
contains a domain defined in a site's target host list.
4. If Any Site Target Host is cleared, enter the domain name to used by the back-end site in the Server-Facing URI
field.
5. In the Public Path box, enter a valid URI path that you want to write into the URI. This must be a valid URI path
and begin and end with a slash ( /). For example: /importantstuff/ or /
6. Click Save.
Rewrite URL rule
Examines the URL of every request and determines if a pattern matches. For example, you define a regular expression
(regex) in the rule. If a pattern matches, PingAccess uses the information configured in the Rewrite URL Rule and
rewrites that portion of the URL into a path that the Site can understand. The following table displays four example
Rewrite URL Rule configurations:
If more than one Field and Value pair is listed, then all conditions must match in order for the rule to succeed.
To configure an HTTP Request Header rule:
1. In the Field column, enter a Header name you want to match in order to grant or not grant the client access.
2. Enter the Value for the Header you want to match in order to grant or not grant the client access. The wildcard (*)
character is supported.
Tip: If you want to match on the Host header, include both the host and port as the Value, or add a
wildcard after the hostname ( host* or host:*) to match what is in the HTTP request.
3. Select Case Sensitive if the values should be matched only if the value case is an exact match.
4. Select Negate if access should be denied when a match is found.
Info: Ensure that the attribute name entered in the Field field is spelled correctly and exists. If you enter
an attribute that does not exist and you select Negate, the rule will always succeed. The Negate control
applies to the entire set of conditions specified, and passes the rule if any condition is not met.
| PingAccess user interface reference guide | 37
5. If additional Header pairs are needed, click Add Row to add an additional row, then repeat steps 1-4.
6. If you need to configure error handling parameters, click Show Advanced to provide those configuration options.
7. Click Save.
4. Additional advanced fields for handling error responses may also be defined here. See Advanced Fields for more
information about these fields.
5. Click Save.
Access
Choose from one of the following sections:
• Authentication Requirements on page 43
• Identity Mappings on page 43
• Virtual Hosts on page 46
• Web Sessions on page 47
| PingAccess user interface reference guide | 43
Authentication Requirements
Authentication Requirements are policies that dictate how a user must authenticate before access is granted to a
protected Web Application. Authentication methods are string values and ordered in a list by preference. At runtime,
the type of authentication attempted is determined by the order of the authentication methods.
For example, a user attempts to access a PingAccess Web Application configured with an authentication requirement
list containing the values (password, cert). PingAccess redirects the user to PingFederate requesting either password
or certificate user authentication. PingFederate authenticates the user based on the password and issues an OIDC
ID Token to PingAccess (containing the authentication method that was used). PingAccess ensures that the
authentication method matched the requirements and redirects the user to the originally requested Application with
the PA cookie set. The user navigates to the Application and access is granted. When the user attempts to access a
more sensitive Application, configured with an authentication requirement list containing the value (cert), they are
redirected to PingFederate to authenticate with a certificate.
If you configure Applications with authentication requirement lists that have no overlap. For example, one list has
(password), another list (cert), a user navigating between Applications may be required to authenticate each time they
visit an Application. When configuring authentication requirement lists to protect higher value Applications with step-
up authentication, consider including stronger forms of authentication when configuring lower value Applications.
1. Navigate to Settings > Access > Authentication Requirements, and click Add Authentication Requirement.
2. Enter a unique name for the Authentication Requirements list.
3. Enter an authentication method. For example, cert or password.
Info: The values you enter here must match the result values defined for the Requested AuthN Context
Selector configured within PingFederate (see Configuring the Requested AuthN Context Selector).
4. Click Add Authentication Requirement to add additional authentication requirements.
5. Click Save.
Identity Mappings
Identity mappings make user attributes available to back-end sites that use them for authentication. There are multiple
types of identity mappings, each with different behavior and a distinct set of fields to specify the identity mapping
behavior.
{
"address": {
"line1": "123 Any St",
"line2": "Apt 123",
"city": "Anytown",
"state": "CO",
"zip": "12345"
}
}
You can define an identity mapping using the following entries to maintain the structure of the target JWT:
interpreted format. For example, enter the User-Agent browser type identifying header as User-Agent, not
HTTP_USER_AGENT.
3. Select which attribute is used as the Subject.
4. (Optional) In the Certificate to Header Mapping section, enter the header name included in a PEM-
encoded client certificate. The row position correlates to the index in the client certificate chain. For example, the
first row always maps to the leaf certificate. If you are using a certificate chain, click Add Row to add another
row.
5. Click Save.
JWT identity mapping
A JWT Identity Mapping makes user attributes available in a signed JWT (JSON Web Token) sent to the backend site
in a header.
Tip: The JWT issuer and signing configuration is defined in Configure Auth Token Management on page
43.
Tip: PingAccess engines provide a JWKS (JSON Web Key Set) endpoint at /pa/authtoken/JWKS that can be
used by backend sites to validate the signature of the JWT.
Use the following steps to configure JWT identity mapping.
1. Enter the name of the header to use when sending the signed JWT to the target application in the Header Name
field. The HTTP header you specify here is the actual header name over the HTTP protocol, not an environment
variable interpreted format. For example, enter the User-Agent browser type identifying header as User-
Agent, not HTTP_USER_AGENT.
2. Enter the audience to be set as the aud claim in the signed JWT in the Audience field.
3. Enter the name of the attribute to retrieve from the user web session in the User Attribute Name field. For
example, sub.
4. Enter the name of the JWT claim to contain the attribute value in the JWT Claim Name field.
5. Select which attribute is used as the Subject.
6. (Optional) In the Certificate to JWT Claim Mapping field, enter the name of the JWT claim to contain the
client certificate chain array.
7. If you are performing Certificate to JWT Claim Mapping, in the Client Certificate Chain Max Depth field,
specify the maximum number of certificates from the client certificate chain included in the JWT claim array.
8. Optional: Click Show Advanced and select Cache JWT. When enabled, a cached signed JWT will be used for
repeated requests for a given user. If user attributes change or the key used to sign the JWT changes, a new JWT
will be created even if JWT caching is enabled.
9. Click Save.
Virtual Hosts
Virtual Hosts enable PingAccess to protect multiple application domains and hosts. A Virtual Host is defined by the
host name and host port.
A wildcard (*) can be used either to define either any host (*:443, for example) or any host within a domain
(*.example.com, for example).
Note: Prior to availability of SNI in Java 8, an HTTPS port could only present a single certificate. In order
to handle multiple Virtual Hosts you have to use a wildcard name certificate or the Subject Alternative Name
(SAN) extension. With SNI available, Virtual Hosts can present different certificates on a single HTTPS port.
You can assign which certificates (Key Pairs) are used by which Virtual Host on the HTTPS Listeners page.
The Agent Resource Cache TTL advanced field is used to control PingAccess Agent resources for each virtual host.
if(exc?.getSslData()?.getSniServerNames()?.isEmpty())
{
fail();
}
else
{
pass();
}
| PingAccess user interface reference guide | 47
if(exc?.getSslData()?.getClientCertificateChain()?.isEmpty())
{
fail();
}
else
{
pass();
}
Web Sessions
Web Sessions define the policy for Web application session creation, lifetime, timeouts, and their scope. Multiple
Web Sessions may be configured to scope the session to meet the needs of a target set of applications. This improves
the security model of the session by preventing unrelated applications from impersonating the end user. Use the
following tasks to configure secure Web Sessions for use with specific applications and to configure global Web
Session settings.
PingFederate enables flexibility of the attribute contract (and its fulfillment) for that particular application. This
ensures that each application and its associated policies only deal with attributes related to it.
6. Specify the OpenID Connect Login Type that defines how the user’s identity is verified based on authentication
performed by an OpenID Provider and how additional profile claims are obtained. Three login profiles are
supported: Code and POST, and x_post. Select a login profile.
Code
A standard OpenID Connect login flow that provides confidentiality for sensitive user claims. In this profile the
relying party (PingAccess) makes multiple back-channel requests in order to exchange an authorization code for
an ID Token and then exchange an access token for additional profile claims from the UserInfo endpoint at the
provider (PingFederate). This login type is recommended for maximum security and standards interoperability.
POST
A login flow that uses the form_post response mode. This flow follows the OAuth 2.0 Form Post Response
Mode draft specification. This option requires PingFederate 7.3.
A form auto-POST response containing the ID Token (including profile claims) is sent to PingAccess from
PingFederate via the browser after authentication. Back-channel communication between PingAccess and
PingFederate is required for key management in order to validate ID Tokens. This login type is recommended for
maximum performance in cases where the exchanged claims do not contain information that should be hidden
from the end user.
Be sure to select the Implicit grant type when configuring the OAuth Client within PingFederate (see Configuring
a Client). The ID Token Signing Algorithm in PingFederate must be set to either one of the ECDSA algorithms or
one of the RSA algorithms.
x_post
A login flow based on OpenID Connect that passes claims from the provider via the browser. As with the
POST login type, select the Implicit grant type and use either one of the ECDSA algorithms or one of the RSA
algorithms as the ID Token Signing Algorithm.
Info: If PingFederate 7.3 is used in the environment, we recommend using POST rather than x_post, as
x_post was defined by Ping Identity prior to the development of the OAuth 2.0 Form Post Response Mode
draft specification.
7. Specify the Client ID that was assigned when you created the OAuth Relying Party client within PingFederate
(for more information, see Configuring a Client in the PingFederate documentation). Enter the unique identifier
(Client ID).
8. Specify the Client Secret that was assigned when you created the OAuth Relying Party Client within
PingFederate. Required when configuring the Code Login Type. Enter the secret (Client Secret).
Info: The OAuth Client you use with PingAccess Web sessions must have an OpenID Connect
policy specified (for more information see Configuring OpenID Connect Policies in the PingFederate
documentation).
9. Specify an Idle Timeout that defines the amount of time, in minutes, that the PA Token remains active, when no
activity is detected by the user (the default is 60 minutes). Enter, in minutes, the length of time you want the PA
Token to remain active when no activity is detected. Defining an idle expiration protects against unauthorized use
of the resource by limiting the amount of time the session remains active when not being used. For example, idle
expiration is useful when a user is no longer at the computer and does not log out of the session. When the idle
expiration is reached, the session automatically terminates.
Info: If there is an existing valid PingFederate session for the user, an idle time out of the PingAccess
session may result in its re-establishment without forcing the user to log in again.
10. Specify a Max Timeout that defines the maximum amount of time, in minutes, that the PA Token remains active
(the default is 240 minutes). Enter, in minutes, the length of time you want the PA Token to remain active. Once
the PA Token expires, an authenticated user must re-authenticate. This protects against unauthorized use of a
resource, ensuring that a session ends after the specified time and requiring the user to re-authenticate to continue.
Note: This value needs to be set to a smaller value than the PingFederate Access Token Lifetime defined
in the PingFederate Access Token Management instance. See Configuring Reference-Token Management
in the PingFederate Administrator's Manual for more information.
| PingAccess user interface reference guide | 50
Changing this setting may affect existing ongoing sessions, forcing the user to re-authenticate to access protected
resources.
This option is not selected by default.
19. Specify a Consult Server Duration to define the maximum amount of time, in seconds, that a PingAccess Agent
caches policy decisions for the web session before sending a request to the Policy Server. This option only applies
to agents.
Info: The value used for this setting should not be larger than the Idle Timeout value, and ideally, should
be defined to be a value less than half the timeout.
20. Select Request Preservation to specify the type of request data to be preserved if the user is redirected to an
authentication page when submitting information to a protected resource. Available options are None, POST, or
POST and Fragment.
21. Specify the type of Web Storage to be used for request preservation data.
Session Storage is recommended. Use Local Storage if it is common for users to use Internet Explorer with
security zones enabled and PingFederate is in a different zone than PingAccess.
22. Click Save.
Unknown Resources
Unknown resources are those for which there is no associated application. These settings define the error responses to
be generated for requests that don't match the virtual host and context root of an application. Additionally, agents may
be configured to allow unprotected access instead of returning an error response.
5. Specify the Agent Default Mode that determines whether an agent should Deny requests for unknown resources
and generate an error response or allow requests to Pass-Through unfiltered. This default setting may be
overridden by individual agents.
6. Specify the default agent resource Cache TTL (in seconds) to be used for unknown resources if Pass-Through
mode is enabled.
7. Click Save.
Networking
Choose from one of the following sections:
• Availability Profiles on page 52
• HTTP Requests on page 53
• Listeners on page 54
• Load Balancing Strategies on page 55
• Proxies on page 56
Availability Profiles
Availability Profiles are used in a Site configuration to define how PingAccess classifies a backend target server as
failed. Sites require the selection of an availability profile, even if only one target is provided.
A connection failure can be determined based on whether a backend target is not responding, or based on specified
HTTP status codes that should be treated as failures of a specific backend target. For example, if a backend target is
responding to requests with a "500 Server Error" status, it may be desirable to consider that server down even though
the web service is responsive.
If multiple targets are specified in a site configuration but a load balancing strategy is not applied, the Availability
Profile will cause the first listed target in the site configuration to be used unless it fails. Secondary targets will only
be used if the first target is not available.
Currently, the only availability profile type is On-Demand. You may wish to create different profiles for different
sites based on differing site needs for retry counts, retry delays, timeouts, or HTTP status codes.
1. Go to Settings > Networking > Availability Profiles, then click Add Availability Profile.
2. Enter a unique descriptive name for the profile.
3. Select the On-Demand Type.
4. Enter the number of milliseconds to wait for a connection to be established to a backend target in the Connect
Timeout (ms) field.
5. Enter the number in milliseconds the amount of time to wait before timing out the request for a pooled connection
to the target site in the Pooled Connection Timeout (ms) field. Enter -1 for no timeout.
6. Enter the number in milliseconds the amount of time to wait before timing out the read of the response from a
target site in the Read Timeout (ms) field. Enter -1 for no timeout.
7. Enter the number of times to retry a connection to a backend target before considering the target failed in the Max
Retries field.
8. Enter the number of milliseconds to wait between retries in the Retry Delay (ms) field.
9. Enter the number of seconds to wait before trying a failed target again in the Failed Retry Timeout (s) field.
10. Optionally enter a list of HTTP status codes that should be considered as a failure in the Failure HTTP Status
Codes field. The sequence for this list is not important.
11. Click Save.
| PingAccess user interface reference guide | 53
1. Navigate to Settings > Networking > Availability Profiles, expand the desired profile, then click .
2. Make the required changes to the profile.
3. Click Save.
HTTP Requests
The settings for HTTP Requests are used to match a served resource with the originating client when one or more
reverse proxies are between the client and the served resource. For example, when a reverse proxy sits between the
client and the PingAccess server or a PingAccess agent, the additional proxy might be identified as the client. Such
proxies can be configured to inject additional headers to relay the originating client address. The settings on this page
allow PingAccess to be configured to identify the originating client's address using a list of alternative headers. These
settings are used by the PingAccess Policy Server when evaluating network range rules, as well as the inIpRange()
Groovy script matcher.
The list of header names for the IP Source and Host Source sections is an ordered list, with the first header match
being used. By default, X-Forwarded-For is configured for IP Source requests, and both X-Forwarded-Host
and Host are configured for Host Source requests.
Info: The IP Source address settings only affect PingAccess as a Gateway; Agents will use the address for
the first or last hop, as configured.
In addition, the Protocol Source section can be used to define the header that identifies the protocol used for the
original request. The default value is X-Forwarded-Proto.
When the PingAccess Agent is behind a load balancer that is performing HTTPS offload, the load balancer must
inject X-Forwarded-Proto for the redirect_uri to be properly set.
Listeners
The Listeners configuration page is used to assign key pairs to the administrative, agent, and engine listeners, as well
as to define additional listener ports for the PingAccess engine.
HTTPS listeners
Assign a Key Pair to a Listener
Engine listeners
Define an engine listener
Proxies
Where applicable, this page contains the forward proxy configuration used when PingAccess makes requests to Sites
or Token Providers.
Add a proxy
This task allows you to add a forward proxy configuration to be used when PingAccess makes requests to sites or
token providers.
1. Navigate to Settings > Networking > Proxies.
2. Click Add Proxy.
3. Specify a Name for the proxy configuration.
4. Enter an optional Description.
5. Enter the Host name for the forward proxy.
6. Enter the Port number for the forward proxy.
7. If the forward proxy requires authentication, select the Requires Authentication checkbox.
8. If required, enter the Username for the forward proxy.
9. If required, enter the Password for the forward proxy.
10. Click Save.
Edit a proxy
This task allows you to edit a proxy configuration.
Note: If you edit a proxy configuration that is associated with an engine or replica administrative node, you
must download and install a new configuration on those nodes.
1. Navigate to Settings > Networking > Proxies.
2. Expand an existing proxy configuration.
3. Click .
4. Make the required changes.
5. Click Save.
Delete a proxy
Security
Choose from one of the following sections:
• Certificates on page 57
• Key Pairs on page 58
| PingAccess user interface reference guide | 57
Certificates
Administrators import certificates into PingAccess to establish anchors used to define trust to certificates presented
during secure HTTPS connections. Outbound secure HTTPS connections such as communication with PingFederate
for OAuth access token validation, identity mediation, and communication with a target Site require a certificate
trusted by PingAccess. If one does not exist, communication is not allowed.
Certificates used by PingAccess may be issued by a CA or self-signed. CA-issued certificates are recommended to
simplify trust establishment and minimize routine certificate management operations. Implementations of an X.509-
based PKI (PKIX) typically have a set of root CAs that are trusted, and the root certificates are used to establish
chains of trust to certificates presented by a client or a server during communication.
The following formats for X.509 certificates are supported:
• Base64 encoded DER (PEM)
• Binary encoded DER
A Certificate Group is a trusted set of anchor certificates used when authenticating outbound secure HTTPS
connections. The Java Trust Store group contains all the certificates included in the keystore located in the Java
installation at $JAVA_HOME/lib/security/cacerts. This group of certificates contains well-known, trusted
CAs. If you are connecting to Sites that make use of certificates signed by a CA in the Java Trust Store, you do not
need to create an additional Trusted Certificate Group for that CA. You cannot manage the Java Trust Store group
from the PingAccess administrative console. Expand a section for steps to import and manage certificates and create
and manage trusted certificate groups.
Import a certificate
Delete a certificate
7. Click Add.
8. Additional certificates can be added to the new trusted certificate group by dragging them into the group.
1. Expand the Trusted Certificate Group containing the certificate you want to remove.
2. Click on the certificate you want to remove.
Key Pairs
PingAccess provides built-in Key Pairs, which are required for secure HTTPS communication. A Key Pair includes
a private key and an X.509 certificate. The certificate includes a public key and the metadata about the owner of the
private key.
PingAccess listens for client requests on the administrative console port and on the PingAccess engine port. To enable
these ports for HTTPS, the first time you start up PingAccess, it generates and assigns a Key Pair for each port. These
generated Key Pairs are initially assigned on the HTTPS Listeners page.
Additionally, Key Pairs are used by the Mutual TLS Site Authenticator to authenticate PingAccess to a target Site.
When initiating communication, PingAccess presents the client certificate from a Key Pair to the Site during the
mutual TLS transaction. The Site must be able to trust this certificate in order for authentication to succeed..
Info: Ensure that the administrative console node and engines in a cluster have the same cryptographic
configuration. For example, if you generate an elliptic curve Key Pair on the administrative console and the
engines in the cluster are not configured to support elliptic curve Key Pairs, then the engines are not able to
use that Key Pair for the engine HTTPS Listeners or as the Key Pair in a Mutual TLS Site Authenticator.
Cryptographic configuration differences are often caused by having a Java Cryptographic Extension with
limited strength providers installed (see the Oracle Java documentation for more information).
3. In the Alias field, enter a name that identifies the key pair. Special characters and spaces are allowed. This name
identifies the key pair when assigning the key pair to various configurations such as HTTPS Listeners.
4. Enter the Password used to protect the PKCS#12 file. PingAccess uses the password to read the file.
5. Click Choose File to locate the PKCS#12 file.
6. Click Save to import the file.
Note: If the key pair is either expired or not yet valid, PingAccess displays a warning, but the import will
proceed.
Import a CSR Response to replace the self-signed certificate in a key pair. Click CSR Response and fill out the
form.
Note: Before you import the CSR Response, import the signing CA certificate into PingAccess and add it to
a Trusted Certificate Group.
1. Navigate to Settings > Security > Key Pairs.
2. Click CSR Response for the key pair the CSR applies to.
3. Select the Trusted Certificate Group to use for validating that the certificate in the CSR Response is correctly
formed.
4. Choose the CSR Response file.
5. Click Save.
Download a Certificate
Download a certificate when you need to configure a peer to trust a certificate used by PingAccess. For example,
download the certificate for the key pair used by a Mutual TLS Site Authenticator and configure the target Site to
trust the certificate.
1. Navigate to Settings > Security > Key Pairs.
2. Click Download Certificate in the row for the certificate you want to download.
3. Your browser will download the certificate and save it in your local filesystem.
System
Choose from one of the following sections:
• Admin Authentication on page 60
• Configuration Export/Import on page 63
• Clustering on page 64
• License on page 68
• Token Provider on page 68
Admin Authentication
This page controls the PingAccess administrator authentication method. The default PingAccess administrator
authentication method used to protect the administrative console is basic authentication (username and password).
requests send this cookie for authentication rather than the less secure HTTP Authorization header. Basic
Authentication supports one user – Administrator.
To change the Administrator password:
1. Navigate to Settings > System > Admin Authentication > Basic Authentication.
2. Enter the current administrator password.
3. Enter and confirm the new password.
Important: The new password must meet the configured password complexity rules defined in
pa.admin.user.password.regex in run.properties.
4. Click Save
• If you are configuring administrative roles to enable the PingAccess auditor role, the issuance criteria defined
in PingFederate should be defined to allow either an administrator or an auditor to be issued an access token.
The attribute contract defined in the OpenID Connect Policy must include the additional attribute data that will
be used to define the user's role in PingAccess.
5. If you selected the Code login type, enter the Client Secret assigned when you created the OAuth client.
6. Select a defined Authentication Requirements list, if your environment requires it. Click Create to create an
authentication requirements list.
7. If you are enabling Admin SLO and/or using administrator/auditor roles, perform the following steps:
a) Click Show Advanced.
b) In the Validate Session field, select Yes to validate sessions with the configured PingFederate instance during
request processing.
c) In the Refresh User Attributes field, select Yes to periodically refresh user data from the OpenID Connect
Token Provider.
d) Specify the Refresh User Attributes Interval in seconds.
e) Select the Cache User Attributes checkbox to have PingAccess cache user attribute information for use in
policy decisions. When disabled, this data is encoded and stored in the session cookie.
f) Click to select the Use Single Logout checkbox to enable the use of Single Logout if it is configured for the
OIDC Provider.
Note: To prevent session replay with SLO enabled, Check For Valid Authentication Session must
be enabled in PingFederate Access Token Management configuration.
g) Select Enable Roles to enable roles
h) Click Add Required Attribute to define a new attribute that is required for Administrator access
Note: More than one attribute may be defined here; if more than one is defined, all attribute values
must match in order to grant access for the role.
i) Enter the attribute name returned in the access token and the attribute value that defines the user as an
administrator
Note: The attribute name used here is defined in PingFederate under OAuth Settings > OpenID
Connect Policy Management > Your_Policy > Attribute Contact as an extension to the contract.
The value to use depends on the configuration of the Contract Fulfillment tab for the policy.
The attribute named group in your attribute contract may be mapped to an LDAP server attribute source that
contains a groupMembership attribute. A valid group membership for the administrator might be the group
cn=pingaccess-admins,o=myorg. In this example, you would use group as the Attribute Name and
cn=pingaccess-admins,o=myorg as the Attribute Value.
j) If you want to define criteria for an auditor, select Enable Auditor Role
k) Define criteria for the auditor in the same way you did for the administrator role
l) Click Add Required Attribute to add an additional attribute.
8. Click Save when you finish.
Configure Session Properties
9. Specify the Cookie Type, Encrypted JWT or Signed JWT.
10. Specify the unique Audience name the token is applicable to.
11. Specify an Idle Timeout in minutes. This sets the length of time you want the PA Token to remain active when no
activity is detected. When the idle expiration is reached, the session automatically terminates.
12. Specify a Max Timeout in minutes. This sets the length of time you want the PA Token to remain active. Once
the PA Token expires, an authenticated user must re-authenticate.
13. Specify an Expiration Warning in minutes. This specifies the point at which a user will be warned of upcoming
session expiry.
14. Specify the Session Poll Interval in seconds. This sets the length of time between user info poll requests for the
admin UI.
| PingAccess user interface reference guide | 63
Configuration Export/Import
The Configuration Export/Import options create and restore a full PingAccess configuration, allowing it to be backed
up and restored into a test environment for testing, or to be used for disaster recovery. The configuration backup is
stored as a json file, and contains the entire PingAccess configuration.
Caution: As the exported json file contains your complete PingAccess configuration, ensure the file is
stored somewhere with appropriate security controls in place.
Clustering
PingAccess can be configured in a clustered environment to provide higher scalability and availability for critical
services. While it is important to understand that there may be tradeoffs between availability and performance,
PingAccess is designed to operate efficiently in a clustered environment.
PingAccess clusters are made up of three types of nodes:
Administrative Console
Provides the administrator with a configuration interface
Replica Administrative Console
Provides the administrator with the ability to recover a failed administrative console using a manual failover
procedure.
Clustered Engine
Handles incoming client requests and evaluates policy decisions based on the configuration replicated from the
administrative console
Any number of clustered engines can be configured in a cluster, but only one administrative console and one replica
administrative console can be configured in a cluster.
Configuration information is replicated to all of the clustered engine nodes and the replica administrative node from
the administrative console. State information replication is not part of a default cluster configuration, but some state
information can be replicated using PingAccess subclusters.
PingAccess Subclusters
Subclusters are a method to provide better scaling of very large PingAccess deployments by allowing multiple engine
nodes in the configuration to share certain information. A load balancer is placed in front of each subcluster in order
to distribute connections to the nodes in the subcluster.
Subclusters serve three purposes:
• Providing fault-tolerance for mediated tokens if a cluster node is taken offline.
• Reducing the number of STS transactions with PingFederate when the front-end load balancer does not provide a
sticky session.
| PingAccess user interface reference guide | 65
• Ensure rate limits are enforced properly if the front-end load balancer does not provide a sticky session.
If token mediation and rate limiting are not used in your environment, subclustering is not necessary.
Info: This cache can be tuned using the EHCache Configuration Properties listed in the Configuration
Properties documentation.
PingAccess provides clustering features that allow a group of PingAccess servers to appear as a single system. When
deployed appropriately, server clustering can facilitate high availability of critical services. Clustering can also
increase performance and overall system throughput. It is important to understand, however, that availability and
performance are often at opposite ends of the deployment spectrum. Thus, you may need to make some configuration
tradeoffs that balance availability with performance to accommodate specific deployment goals.
In a cluster, you can configure each PingAccess engine, or node, as an administrative console, a replica administrative
console, or a runtime engine in the run.properties file. Runtime engines service client requests, while the
console server administers policy and configuration for the entire cluster (via the administrative console). The replica
administrative console provides a backup copy of the information on the administrative node in the event of a non-
recoverable failure of the administrative console node. A cluster may contain one or more runtime nodes, but only
one console node and only one replica console node. Server-specific configuration data is stored in the PingAccess
administrative console server in the run.properties file. Information needed to bootstrap an engine is stored in the
bootstrap.properties file on each engine.
At startup, a PingAccess engine node in a cluster checks its local configuration and then makes a call to the
administrative console to check for changes. How often each engine in a cluster checks the console for changes is
configurable in the engine run.properties file.
Configuration information is replicated to all engine nodes. By default, engines do not share runtime state. For
increased performance, you can configure engines to share runtime state by configuring cluster interprocess
communication using the run.properties file.
Info: Runtime state clustering consists solely of a shared cache of security tokens acquired from the
PingFederate STS for Token Mediation use cases using the Token Mediator Site Authenticator.
Engine nodes include a status indicator that indicates the health of the node and a Last Updated field that indicates
the date and time of the last update. The status indicator can be green (good status), yellow (degraded status), or red
(failed status).
The status is determined by using the value for admin.polling.delay as an interval to measure health:
| PingAccess user interface reference guide | 66
Engines
Configure an engine
For each engine:
1. Click Settings > System > Clustering
2. Click Add Engine to configure a new engine.
3. Enter a Name for the engine. Special characters and spaces are allowed.
4. Enter a Description of the engine.
5. If applicable, specify an HTTP Proxy for the engine. Click Create to create an HTTP proxy.
6. If applicable, specify an HTTPS Proxy for the engine. Click Create to create an HTTPS proxy.
7. Specify the Engine Trusted Certificate to use for cases where a TLS-terminating network appliance, such as a
load balancer, is placed between the engines and the admin node.
8. Click Save & Download to generate and download a public and private key pair into the
<enginename>_data.zip file for the engine. This file is prepended with the name you give the engine.
Depending on your browser configuration, you may be prompted to save the file.
9. Copy the zip file to the PA_HOME directory of the corresponding engine in the cluster and unzip it. The engine
uses these files to authenticate and communicate with the administrative console.
Info: Generate a new key for an engine at any time by clicking Save & Download and unzipping the
<enginename>_data.zip archive on the engine to replace the files with a new set of configuration
files. When that engine starts up and begins using the new files, PingAccess deletes the old key.
10. Conditional: On Linux systems running the PingAccess engine, change the permissions on the extracted pa.jwk
to mode 400 by executing the command chmod 400 conf/pa.jwk after extracting the zip file.
11. Start each engine.
Info: For information on configuring engine to share information with each other in a cluster, see
Configure a PingAccess Cluster.
Edit an engine
Administrative nodes
Configure the primary administrative node
Define the PingAccess server you want to use as the administrative node.
Warning: If you are promoting a replica admin node to primary, remove the bootstrap properties file from
the replica admin node.
Note: This procedure allows you to specify an HTTP or HTTPS proxy. If proxy configuration is defined in a
properties file (bootstrap.properties or run.properties), it will take precedence over UI or API
configuration.
Note: If a proxy is configured on an replica administrative node, when failing over and before removing the
bootstrap.properties file, the administrative node should have the same proxy configuration.
1. Enter the host and port for the administrative console. The default is localhost:9000.
2. If applicable, specify an HTTP Proxy for the engine. Click Create to create an HTTP proxy.
3. If applicable, specify an HTTPS Proxy for the engine. Click Create to create an HTTPS proxy.
4. Click Save.
Configure the Replica Administrative Node
When using a replica administrative node, it is necessary to define a key pair to use for the CONFIG QUERY listener
that includes both the primary administrative node and the replica administrative node. This can be accomplished
either by using a wildcard certificate or by defining subject alternative names in the key pair that include the replica
administrative node's DNS name. If a replica administrative node is used in your configuration, configure the replica
administrative node before defining the engine nodes, or the bootstrap.properties files generated for the
engine nodes will not include information about the replica administrative node.
In addition to the configuration below, the Replica Administrative node includes a status indicator that indicates the
health of the node and a read-only Last Updated field that indicates the date and time of the last update. The status
indicator can be green (good status), yellow (degraded status), or red (failed status).
The status is determined by using the value for admin.polling.delay as an interval to measure health:
Green (good status):
The replica administrative node contacted the primary administrative node on the last pull request.
Yellow (degraded status):
The replica administrative node contacted the primary administrative node between 2 and 10 intervals.
Red (failed status):
The replica administrative node has either never contacted the primary administrative node, or it has been more
than 10 intervals since the nodes communicated.
Note: If a Replica Administrative Node is being configured in the environment, that must be done prior to
configuring the engines.
1. Go to Settings > System > Clustering > Administrative Nodes.
2. Configure the Host value. This name and port pair must match either a subject alternative name in the key pair or
be considered a match for the wildcard specified if the key pair uses a wildcard in the common name.
3. If applicable, specify an HTTP Proxy for the engine. Click Create to create an HTTP proxy.
4. If applicable, specify an HTTPS Proxy for the engine. Click Create to create an HTTPS proxy.
5. Specify the Replica Administrative Node Trusted Certificate to use for cases where a TLS-terminating network
appliance, such as a load balancer, is placed between the engines and the admin node.
6. Click Save & Download to download the <replicaname>_data.zip file for the replica administrative
node. PingAccess automatically generates and downloads a public and private key pair into the
bootstrap.properties file for the node. The Public Key is indicated on this screen.
7. Copy the downloaded file to the replica administrative node's PA_HOME directory and unzip it.
8. Conditional: If the Replica Administrative Node is running on a Linux host, execute the command chmod 400
conf/pa.jwk.
| PingAccess user interface reference guide | 68
License
View the details of your PingAccess license or upload a new license.
Token Provider
PingAccess can be configured to use PingFederate as the token provider or may be configured to use a common
provider via the OpenID Connect protocol.
PingFederate
• Configure PingFederate runtime on page 69
• Configure PingFederate Administration on page 70
• Configure the OAuth Resource Server on page 70
• Configure PingFederate for PingAccess SSO on page 71
Common Token Provider
• Configure OpenID Connect on page 72
• Configure OAuth Authorization Server on page 73
PingFederate
Configure PingFederate runtime
Before configuring a secure connection to the PingFederate Runtime, it is necessary to export the PingFederate
certificate and import it into a trusted certificate group in PingAccess. Perform the following steps:
1. In PingFederate, export the certificate active for the Runtime Server. See SSL Server Certificates in the
PingFederate Administrator's Manual for more information.
2. Import the Certificate into PingAccess.
3. (Optional) Create a Trusted Certificate Group if one does not already exist.
4. Add the Certificate to a Trusted Certificate Group.
Info: For information on setting PingFederate up as an OAuth Authorization Server, see Enabling the OAuth
AS and Authorization Server Settings in the PingFederate documentation.
Once the PingFederate Runtime connection is saved, PingAccess will test the connection to PingFederate. If
the connection cannot be made, a warning will be displayed in the admin interface.
Configure the connection to the PingFederate Runtime
1. Navigate to Settings > System > Token Provider > Runtime
2. Enter the Host name or IP address for the PingFederate Runtime.
3. Enter the Port number for PingFederate Runtime.
4. Enter the Base Path, if needed, for PingFederate Runtime. This field is optional. It must start with a slash - for
example: /federation.
5. Select Audit Level to log information about the transaction to the audit store. PingAccess audit logs record
a selected subset of transaction log information at runtime and are located in the /logs directory of your
PingAccess installation.
6. Select Secure if PingFederate is expecting HTTPS connections.
7. From the Trusted Certificate Group list, select the certificate group the PingFederate certificate is in. This field
is available only if you select Secure.
8. To configure advanced settings, click Show Advanced.
9. Click Add Back Channel Server.
10. Enter one or more hostname:port pairs in the Back Channel Servers list.
11. Conditional: If the back channel uses HTTPS, enable the Back Channel Secure option. This option becomes
available when at least one Back Channel Server is defined.
12. Conditional: If the back channel uses an alternate base path, enter the path in the Back Chanel Base Path field.
13. Conditional: If hostname verification for secure connections is not required for either the Runtime or the Back
Channel Servers, enable the Skip Hostname Verification option.
14. Conditional: If hostname verification is required, enter the hostname PingAccess should expect in the Expected
Hostname field.
15. To use a configured proxy for back channel requests, select the Use Proxy checkbox.
Note: If the node is not configured with a proxy, requests are made directly to PingFederate.
| PingAccess user interface reference guide | 70
16. Select Use Single-Logout to enable single logout. To use this feature, SLO must be configured on the OIDC
provider.
17. Click Save.
Info: Once you save this configuration and Configure the OAuth Resource Server on page 70, a
PingFederate Access Validator is available for selection when you define OAuth-type rules in Policy
Manager.
Configure PingFederate Administration
For information on the PingFederate Administration API see PingFederate Administrative API in the PingFederate
documentation.
Once the PingFederate Administration configuration is saved, PingAccess will test the connection to PingFederate.
If the connection cannot be made, an error will be displayed in the admin interface, and the configuration will not be
saved.
1. Navigate to Settings > System > Token Provider > Administration.
2. Enter the Host name or IP address for access to the PingFederate Administrative API.
3. Enter the Port number for access to the PingFederate Administrative API.
4. Optional: Optional: Enter the Base Path for the PingFederate Administrative API.
The Base Path must start with a slash (/).
For example: /path
5. Enter the Admin Username.
This username only requires Auditor (read only) permissions in PingFederate.
6. Enter the Admin Password.
7. Select Audit Level to log information about the transaction to the audit store. PingAccess audit logs record
a selected subset of transaction log information at runtime and are located in the /logs directory of your
PingAccess installation.
8. Enable Secure if PingFederate is expecting HTTPS connections.
9. From the Trusted Certificate Group list, select the group of certificates to use when authenticating to
PingFederate. PingAccess requires that the certificate in use by PingFederate anchor to a certificate in the
associated Trusted Certificate Group. This field is available only if you enable Secure.
10. To configure advanced settings, click Show Advanced.
11. To use a configured proxy for API requests, select the Use Proxy checkbox.
Note: If the node is not configured with a proxy, requests are made directly to PingFederate.
12. Click Save to save your changes.
Configure the OAuth Resource Server
Prior to configuring this option, PingFederate Administration Configuration must be completed.
When receiving OAuth-protected API calls, PingAccess acts as an OAuth Resource Server, checking with the
PingFederate OAuth Authorization Server on the validity of the bearer access token it receives from a client. In order
to validate the token, a valid OAuth client must exist within the PingFederate OAuth Authorization Server.
Note: This configuration is optional and needed only if you plan to validate PingFederate OAuth access
tokens.
1. Navigate to Settings > System > Token Provider > OAuth Resource Server
2. Enter the OAuth Client ID you defined when creating the PingAccess OAuth client in PingFederate.
Info: When you configure an OAuth client in PingFederate, be sure to select Access Token Validation
as the allowed grant type. For more information, see Configuring a Client in the PingFederate
Administrator's Manual.
3. Enter the Client Secret you defined when creating the PingAccess OAuth client within PingFederate.
| PingAccess user interface reference guide | 71
4. Select Cache Tokens to retain token details for subsequent requests. This option reduces the communication
between PingAccess and PingFederate.
5. If Cache Tokens is enabled, specify the Token Time To Live by entering the number of seconds to cache the
access token. The default value of -1 means no limit. This value can be -1 or above and must be less than the
PingFederate Token Lifetime.
6. In the Subject Attribute Name field, enter the attribute you want to use from the OAuth access token as the
subject for auditing purposes. For example, username. At runtime, the attribute’s value is used as the Subject
field in audit log entries for API Resources with policies that validate access tokens. The attribute must align with
an attribute in the OAuth access token attribute contract defined within PingFederate.
7. If multiple Access Token Managers are configured in PingFederate, select the Send Audience option to send the
URI the user requested as the aud OAuth parameter to select an Access Token Manager.
Note: Use of this option requires that the Access Token Management instances be configured with
appropriate Resource URIs. Matching of the Resource URI is performed on a most-specific match basis.
8. To enable the use of OAuth 2.0 token introspection select the Use Token Introspection Endpoint option.
Note: This option is only supported with PingFederate 8.2 or later.
9. Click Save to save your changes.
Configure PingFederate for PingAccess SSO
To enable administrator SSO to PingAccess, configure the following settings within the PingFederate AS. Click the
icon ( ) next to each section heading to access additional configuration information. For example, click next
to Roles and Protocols to open a new window and view the Choosing Roles and Protocols page of the PingFederate
documentation.
Note: The information below is an example configuration and does not cover all required steps for each
PingFederate OAuth Settings page discussed, only fields necessary for successful SSO to the PingAccess
administrative console. Fields not mentioned are not necessary for this configuration (see Using OAuth Menu
Selections for configuration details of the PingFederate OAuth Settings pages).
Note: You must complete the configuration for connecting to the PingFederate OAuth AS instance you plan
to use (see Configure PingFederate Administration on page 70).
Adapters
• Create an HTML Form IdP Adapter and specify the PCV you configured.
• Delete all of the attributes that appear in the Extend the Contract section of the Attribute Contract page. The only
required attribute is sub.
• Select Access Token as the Source and Username as the Value on the Contract Fulfillment page.
Client Management
Info: We recommend creating a Client to use specifically for PingAccess administrative console
authentication.
• Select None for Client Authentication.
• Add the location of the PingAccess host as a Redirect URI. For example: https://localhost:9000/*
• Select Implicit as an Allowed Grant Type.
• Select one of the elliptic curve (ECDSA) algorithms as the OpenID Connect ID Token Signing Algorithm and
select the OpenID Connect Policy to use for PingAccess administrative console authentication.
• Use the Azure AD Graph API - If the groups attribute contains more than 200 groups, the id_token contains a
level of indirection that points to a URL in the Azure AD Graph API. Through the creation of a simple purpose-
driven application, you can communicate with the Azure ID Graph API to retrieve the complete list of groups.
• Retrieve group display names - The groups attribute is a list of GUIDs. The groups for a user are only provided
as GUIDs since User-friendly names for AAD groups are not globally unique. Configure the Graph API call to
include the group names along with the GUID for creation of more robust policies.
1. First, Create the Azure AD Graph API application
2. Next, Configure token provider specific options
7. Select the Secure checkbox if OAuth Authorization server is expecting HTTPS connections. When selected,
use the Trusted Certificate Group list to select the group of certificates to use when authenticating to OAuth
Authorization Server. PingAccess requires that the certificate in use by OAuth Authorization Server anchor to a
certificate in the associated Trusted Certificate Group.
8. In the Client ID field, enter the unique identifier assigned when you created the PingAccess OAuth client within
your OAuth Authorization Server.
9. In the Client Secret field, enter the Client Secret associated with the Client ID.
10. Optional: Select the Cache Tokens to retain token details for subsequent requests. This option reduces the
communication between PingAccess and OAuth Authorization Server. When selected, use the Token Time To
Live checkbox to enter the number of seconds to cache the access token. A value of -1 means there is no limit.
This value should be less than the OAuth Authorization Server Token Lifetime.
11. In the Subject Attribute Name field, enter the attribute you want to use from the OAuth access token as the
subject for auditing purposes. At runtime, the attribute's value is used as the Subject field in audit log entries for
API Resources with policies that validate access tokens.
12. Select the Send Audience checkbox to send the URI the user requested as the aud OAuth parameter for
PingAccess to the OAuth 2.0 Authorization Server.
13. To configure advanced settings, click Show Advanced.
14. To use a configured proxy, select the Use Proxy checkbox.
Note: If the node is not configured with a proxy, requests are made directly to the token provider.
15. Click Save.
| Install PingAccess | 75
Install PingAccess
Install PingAccess
This document provides instructions to install PingAccess. PingAccess can be installed on:
• Linux
• Red Hat Enterprise Linux
• Windows
After you install PingAccess, you:
• Start PingAccess on page 80
• Access the admin console for the first time on page 81
• Change configuration database passwords on page 82
You can also:
• Stop PingAccess on page 82
• Run PingAccess as a service on page 83
• Uninstall PingAccess on page 85
Installation requirements
The following sections detail system, hardware, and port requirements for installing PingAccess:
• System requirements on page 75
• Hardware Requirements on page 76
• Port requirements on page 77
System requirements
PingAccess is certified as compatible for deployment and configuration with the minimum system specifications
defined below.
Software requirements
Ping Identity has qualified the following configurations and certified that they are compatible with the product.
Variations of these platforms (for example, differences in operating system version or service pack) are supported up
until the point at which an issue is suspected as being caused by the platform or other required software.
Note: PingAccess supports IPv4 addressing. There is currently no support for IPv6 addressing.
Operating systems
Note: PingAccess has been tested with default configurations of operating system components. If your
organization has customized implementations or has installed third-party plug-ins, deployment of the
PingAccess server may be affected.
• Microsoft Windows Server 2008 R2 SP1
• Microsoft Windows Server 2012 Standard
• Microsoft Windows Server 2012 R2 Datacenter
• Microsoft Windows Server 2016
• Red Hat Enterprise Linux ES 6.8
• Red Hat Enterprise Linux ES 7.2
• Red Hat Enterprise Linux ES 7.3
• SUSE Linux Enterprise 11 SP4
| Install PingAccess | 76
Hardware Requirements
Info: Although it is possible to run PingAccess on less powerful hardware, the following guidelines
accommodate disk space for default logging and auditing profiles and CPU resources for a moderate level of
concurrent request processing.
Minimum hardware requirements
• 4 CPU/Cores
• 2 GB of RAM
• 2.1 GB of available hard drive space
Minimum hardware recommendations
• Multi-CPU/Cores (8 or more)
• 4 GB of RAM
• 2.1 GB of available hard drive space
| Install PingAccess | 77
Port requirements
The following table summarizes the ports and protocols that PingAccess uses to communicate with external
components. This information provides guidance for firewall administrators to ensure the correct ports are available
across network segments.
Info: Direction refers to the direction of requests relative to PingAccess. Inbound requests are requests
received by PingAccess from external components. Outbound requests are requests sent by PingAccess to
external components.
PingAccess Cluster Traffic Protocol: JGroups PingAccess Engine Used by other nodes
in the cluster as part
Transport: TCP of the cluster's failure-
Default port: 7710 detection mechanism.
Configurable using the
Destination: PingAccess run.properties file.
Engine See the Configuration file
Direction:Inbound reference guide for more
information.
PingAccess Cluster Traffic Protocol: JGroups PingAccess Engine Used by other nodes
in the same cluster
Transport: UDP to share information.
Default port: 7500 Configurable using the
run.properties file.
Destination: PingAccess See the Configuration file
Engine reference guide for more
Direction: Inbound information.
1
In addition to port 3000, additional engine listener ports defined in the configuration need to be open as well.
Note: On Linux, we recommend that you install and run PingAccess as a non-root user.
• The 64-bit Oracle JRE must be installed.
• The System or User Environment Variable JAVA_HOME must exist and be set to a value that represents the
location of your Java installation (ie; usr/java/jdk 1.8.0_74).
• The JRE /bin directory (ie; usr/lib64/jvm/jre/bin) path must be added to the PATH variable so it is available for
scripts that depend on it.
• You must have a pingaccess.lic license file. If you do not have one, you can request an evaluation key at
the Request a License Key page (www.pingidentity.com/content/pic/en/products/request-
license-key.html).
1. Download the distribution ZIP file.
2. Extract the distribution ZIP file into your installation directory.
Tip: If you are deploying PingAccess in a cluster configuration, see PingAccess cluster configuration
documentation.
4. To complete the Installation, copy the URL of the PingAccess admin console that is displayed on the final screen
of the PingAccess setup wizard and click Finish.
5. To customize and finalize the PingAccess setup, paste the URL you copied into your web browser and connect to
the admin console of the instance you have just installed.
Start PingAccess
Note: If you installed PingAccess using the Windows installer, the service is installed and started
automatically.
| Install PingAccess | 81
For example, the following cURL command will return a list of all defined applications by sending
a Get request to the applications resource:
Stop PingAccess
1. Press Ctrl+C in the command-prompt or terminal window.
2. Conditional: If PingAccess is running on Windows, press y when prompted to terminate the script.
| Install PingAccess | 83
The command service pingaccess status displays the current status of the running
PingAccess service.
Uninstall PingAccess
1. Stop PingAccess on page 82.
2. Delete the PingAccess installation directory.
| Upgrade PingAccess | 86
Upgrade PingAccess
Use the PingAccess Upgrade Utility to upgrade from PingAccess 2.1 or later to the most recent version.
Attention: Before you upgrade, create a backup of your existing PingAccess configuration. In the event of an
upgrade failure, you can restore the backup configuration.
1. Unpack the upgrade utility zip file.
2. Change to the upgrade utility's bin directory.
3. Run the PingAccess Upgrade Utility:
• On Windows: run.bat [-p <admin_port>] [-i <directory>]
<sourcePingAccessRootDir> <outputDir> <pingaccessZip>
<newPingAccessLicense>
• On Linux: ./run.sh [-p <admin_port>] [-i <directory>]
<sourcePingAccessRootDir> <outputDir> <pingaccessZip>
<newPingAccessLicense>
| Upgrade PingAccess | 87
Note: In the context of an upgrade, "source" refers to the old version of PingAccess, and "target" refers to
the new version.
Note: Administrator credentials are not required when upgrading a cluster node.
10. Allow the upgrade to complete and perform any required post-upgrade tasks.
Path prefix for Resource In a 2.1 setup, it is likely that there will be resource
'ResourceName' contains a '.' names that accidentally contain a '.', assuming it is a
character. This will be treated as a literal '.' rather than part of a regex. For example, any file
literal '.' in the target version. extension type resources will probably not be escaping
the '.'. This message is intended to bring this change in
semantics to the user's attention. This action item will not
show up if the user has correctly escaped the '.' character
with the '\.' sequence.
Resource 'ResourceName' could not be This message indicates that multiple resources that use
migrated to the target version due to the same virtual host, but a different Web Session or Site
Application context root conflicts. must be mapped under the same context root in the same
Manual intervention is required. application to preserve semantics. For example, consider
the following configuration:
• Resource A:
• Path Prefix: /hr
• Virtual Host: internal.example.com
• Web Session: W
• Site: Z
• Resource B:
• Path Prefix: /sales
• Virtual host: internal.example.com
• Web Session: W
• Site: Z
• Resource C:
• Path Prefix: /payroll
• Virtual Host: internal.example.com
• Web Session: V
• Site: Z
This configuration triggers this action item because these
resources cannot be grouped in the same application, but
they would need to be in order to preserve the semantics
in the internal.example.com address space. This issue
could be fixed by using rewrite rules to place Resource C
or Resources A and B under a different namespace. For
example, use /intranet/sales and /intranet/hr on the front-
end and rewrite out the /intranet on the backend.
Application 'ApplicationName' contains 2.1 allows OAuth rules to be attached Resources that
OAuth rules, but authenticates users use a Web Session. While this configuration is likely
with a web session. Unexpected results invalid in the first place, it would be possible to include
may occur. both a PA cookie and OAuth token in requests and PA
would apply policy to the requests as configured. In 3.1,
however, an API application and web application are
mutually exclusive so the semantics of this particular
configuration cannot be preserved.
The resource order for Virtual Host The upgrade utility checks that the resource order is
'VirtualHostName' has changed in the consistent before and after the upgrade. This message
target version. indicates that the resource order from 2.1 does not
match 3.1. This is likely due to how context roots in
applications are ordered in 3.1. For 3.1, applications are
| Upgrade PingAccess | 91
The property 'PropertyName' was New Security Headers properties values are not set
set to a blank value to maintain during an upgrade in order to preserve the behavior from
compatibility. However, it is the source release in the upgrade. If there is no reason not
recommended that this be set to to in your environment, update run.properties with
'PropertyName=PropertyValue the recommended setting.
As a security enhancement, the This message applies to the admin.ssl.ciphers,
default value of 'CipherList' engine.ssl.ciphers, and
has changed with this version of agent.ssl.ciphers lists. This message is displayed
PingAccess. Your existing ciphers if the upgrade source version cipher lists are changed
remain unchanged. However, it is from the defaults. We recommend updating the
recommended to use the default value: configuration with the new default value if possible.
'PropertyName=CipherList'.
The property 'PropertyName' was This message applies to the site.ssl.protocols,
set to a blank value to maintain site.ssl.ciphers, pf.ssl.protocols,
compatibility. However, it is and pf.ssl.ciphers settings. The upgrade utility
recommended that this be set to sets these values as empty values in order to maintain
'PropertyName=CipherList backwards compatibility, but the recommended value
should be used if possible.
The host for VirtualHost If a Virtual Host has more than one key pair associated
VirtualHost:Port already has a KeyPair with it, only one key pair will be associated with it after
associated with it. The KeyPair the upgrade completes. This message is displayed to
previously associated with this indicate which key pair was used.
VirtualHost was removed. Only one
KeyPair can be associated with a given
host.
Application with name If an Application's context root is a reserved PingAccess
'ApplicationName' not migrated as the path, the application will not be migrated. The indicated
context root 'Path' was a reserved application will need to be created with a context root
path. that does not conflict with the reserved path.
Resource with name 'ResourceName' not If an Resource path is a reserved PingAccess path,
migrated as the path 'Path' was a the application will not be migrated. The indicated
reserved path. application will need to be created with a context root
that does not conflict with the reserved path.
The CIDR Rule with name 'RuleName' is With changes in IP Source header handling, additional
associated with an Agent Application options are available to override the headers used to
named 'ApplicationName' and overrides identify the source address. When an Agent is involved,
the IP source configuration. A new the changes in IP source handling may cause the
Agent rule should be created that does specified rule to not behave as expected.
not override the IP source.
Require HTTPS option on Application The upgrade utility attempts to set the Require HTTPS
'ApplicationName' was set to Setting option based on the virtual host associated with an
as Virtual Host had port Port. Please application during an upgrade. This message is an
verify this setting is correct. advisory to just verify that the setting was properly
detected.
VirtualHost 'VirtualHost' was not Virtual Host names are now case-insensitive. During
migrated. An existing VirtualHost the upgrade, after making the names case-insensitive, a
existed with the same logical name duplicate Virtual Host was identified. It will be necessary
'VirtualHost'. to either recreate the virtual host with a new name, or to
modify the configuration so the proper Virtual Host is
migrated to the upgraded system.
| Upgrade PingAccess | 93
Renamed Virtual Host's Hostname from If a Virtual Host name contains an underscore (_)
'VirtualHost' to 'NewVirtualHost' due character, that does not conform to host naming
to virtual host spec compliance issue requirements. In this instance, the underscore will be
renamed to the string a-z. For example, if a Virtual
Host named my_virtual_host is migrated, the new
name will be mya-zvirtuala-zhost.
Removed Http Request Rule with When an HTTP Request Rule is migrated from an earlier
name 'RuleName', this Rule must be release of PingAccess, rules that specify a source of
converted to a groovy script rule. Body are not migrated. A Groovy script rule can be
Manual intervention may be required. used to perform a similar match, but the details of such a
Groovy script require administrator intervention.
A simple Groovy script rule that would perform a similar
function might be:
requestBodyContains('value')
The property 'PropertyName' uses When migrating SSL settings between versions of
a customized value. "Your original PingAccess that use different JVM or JDK versions,
value has not been modified. You custom settings may not be compatible. If the protocols
may encounter startup or connection or ciphers used are not compatible with the target JVM
problems if this value is not or JDK, this message indicates which settings need to be
supported by the JVM. manually updated.
The PropertyName value can be any of the following
values:
• site.ssl.protocols
• site.ssl.ciphers
• pf.ssl.protocols
• pf.ssl.ciphers
• admin.ssl.protocols
• admin.ssl.ciphers
• engine.ssl.protocols
• engine.ssl.ciphers
• agent.ssl.protocols
• agent.ssl.ciphers
Rule with ID RuleId and name These messages may be displayed if the source
'RuleName' was not migrated as matcher PingAccess installation has misconfigured Groovy
was invalid for the Groovy rule type. Rules.
Invalid rules were removed from This indicates that you are not permitted to add an
RuleSet 'RuleSetName' which resulted OAuth rule to an Application of type Web, by editing an
in an empty set. existing Rule Set.
The RuleSet was removed. Please check Groovy or OAuth Groovy rules will not be migrated for
your policy configuration. the following reasons:
Invalid rules were removed from • The OAuth Groovy rule was applied to a Web
RuleSet 'RuleSetName'. Please check application.
your policy configuration.
| Upgrade PingAccess | 94
Invalid Rules were removed from • The Groovy or OAuth Groovy uses a matcher that is
Application 'ApplicationName'. Please not appropriate for the application type.
check your policy configuration.
Check the policy configuration.
Invalid RuleSets were removed from
Application 'ApplicationName'. Please
check your policy configuration.
Invalid Rules were removed from
Resource 'resource name' on
Application 'ApplicationName'. Please
check your policy configuration.
Invalid RuleSets were removed
from Resource 'resource name' on
Application 'ApplicationName'. Please
check your policy configuration.
Rule with name 'RuleName' has been The upgrade utility supports migrating a RuleSet
removed from RuleSet with name containing multiple CORS or Rate Limiting rules with
'RuleSetName'. Multiple Rate Limiting the same Policy Granularity. The upgrade utility will
Rules with the same Policy Granularity generate new action items, indicating that rules were
cannot be included in a RuleSet." removed from a RuleSet.
Rule with name 'RuleName' has been These messages indicate that if both rules exist, there is a
removed from RuleSet with name restriction to a single Rate Limiting or CORS rule. Please
'RuleSetName'. Multiple Cross-Origin check to confirm that you have applied the correct rule to
Request Rules cannot be included in a the policy.
RuleSet."
One or more notifications were issued The new cluster config query port is enabled
while migrating from version SOURCE to by default for new PingAccess 4.0 installations
version TARGET when running in CLUSTERED_CONSOLE or
CLUSTERED_CONSOLE_REPLICA mode.
Setting clusterconfig.enabled to false
During the upgrade process to version 4.0, the new
The new configuration query port
cluster config query port is disabled. Messages are
feature has been disabled for backward
written to upgrade.log and audit.log to indicate
compatibility. Please refer to the
this cluster configuration change was made.
PingAccess clustering documentation
before enabling this feature. Please refer to the PingAccess clustering documentation
before enabling this feature.
One or more notifications were issued During upgrades to release 4.0 and higher,
while migrating from version SOURCE to the Upgrade Utility sets the value of
version TARGET pa.site.tls.sni.legacyMode to true to
maintain compatibility with existing configurations. This
For backward compatibility, when
property is controlled in the run.properties file and
connecting to a protected, TLS SNI-
is not enabled on new installs.
enabled Site, PingAccess will set
the SNI server_name to the configured
target host and not the HTTP request
Host header value. Please refer to
PingAccess' upgrade documentation for
more information.
Localization property '{property This message will appear if new language properties are
name}' was added to pa- added between the source and target PA versions and
you have added additional language files or modified
| Upgrade PingAccess | 95
messages.properties. Any customized the en or en_US files. Update any customized files as
localization files should be updated. required.
Localization property '{property This message will appear if the language properties have
name}' in pa-messages.properties was changed between the source and target PA versions and
modified. Any customized localization you have added additional language files or modified
files should be updated. the en or en_US files. Update any customized files as
required.
Localization property '{property This message will appear if the language properties have
name}' was removed from pa- been removed between the source and target PA versions
messages.properties. This property and you have added additional language files or modified
can be removed from any customized the en or en_US files. Update any customized files as
localization files. required.
Legacy authentication requirements This message will appear on upgrade to release 4.3
policy evaluation has been enabled or higher if you have one or more authentication
to maintain backward compatibility requirements rules. You can make adjustments to
with earlier versions of PingAccess. configured rules so you can remove this property or
To disable this setting, remove the you can maintain the property to leave existing rules
pa.policy.eval.acr.v42 property from unaffected.
run.properties.
Web Sessions
Web Sessions define the policy for Web application session creation, lifetime, timeouts, and their scope. Multiple
Web Sessions may be configured to scope the session to meet the needs of a target set of applications. This improves
the security model of the session by preventing unrelated applications from impersonating the end user. Use the
following tasks to configure secure Web Sessions for use with specific applications and to configure global Web
Session settings.
authenticated to resources protected by PingAccess. In this scenario, the user has explicitly logged out from all of
those protected services.
PingAccess needs to be configured only for the first of these two scenarios. These options are not mutually exclusive,
and can be combined to provide comprehensive session management at the server.
5. Enter the client secret associated with the specified Client ID.
6. Click the Advanced tab.
7. Select Validate Session to enable the server-side session management feature.
8. Click Save.
| Configure logging | 99
Configure logging
Configure logging
This document describes the types of logging performed by PingAccess and provides instructions for configuring
PingAccess logging.
Item Description
%d Transaction time.
exchangeId Identifies the ID for a specific request/response pair.
applicationID Specifies the ID of the requested application. This field is
disabled by default.
applicationName Specifies the name of the requested application.
resourceID Specifies the ID of the requested resource. This field is
disabled by default.
resourceName Specifies the name of the requested resource.
pathPrefix Specifies the path prefix of the requested application or
resource.
AUDIT.authMech Mechanism used for authentication. Engine Auditing -
Cookie (WAM session), OAuth, unknown (for example,
pass-through or static assets). Pass-through assets are
Resources with no policies or Web session configured.
Admin Auditing - Basic, OAuth, Cookie, unknown (
unknown displays only in an authentication failure).
AUDIT.client IP address of the requesting client.
| Configure logging | 100
Item Description
AUDIT.failedRuleName Name of the Rule that failed. If no Rule failure occurred,
this field is blank. This element is applicable only to the
pingaccess_engine_audit.log.
AUDIT.failedRuleType Type of Rule that failed. If no Rule failure occurred,
this field is blank. This element is applicable only to the
pingaccess_engine_audit.log.
AUDIT.failedRuleClass The Java class of Rule that failed. If no Rule failure
occurred, this field is blank. This element is applicable
only to the pingaccess_engine_audit.log.
AUDIT.failedRuleSetName Name of the containing Rule Set that failed. If no Rule
failure occurred, this field is blank. This element is
applicable only to the pingaccess_engine_audit.log.
AUDIT.host PingAccess host name or IP address.
AUDIT.targetHost Backend target that processed the request and generated
a response to the PingAccess engine.
AUDIT.method HTTP method of the request. For example, GET.
AUDIT.resource Name of the Resource used to fulfill the
request. This element is applicable only to the
pingaccess_engine_audit.log.
AUDIT.responseCode HTTP status code of the response. For example, 200.
AUDIT.requestUri Request URI portion of the request (for example, /foo/
bar).
AUDIT.subject Subject of the transaction.
AUDIT.trackingId The PingFederate Tracking ID. This element can be used
to help correlate audit information in the PingAccess
audit log with information recorded in the PingFederate
audit log.
The value of this depends on whether the application
type is Web or API.
If the application type is Web, the value is presented
as tid:<Session_Identifier>. The
<Session_Identifier> can be used by the PingFederate
Session Revocation API to revoke the session without
disabling the user in the identity store.
If the application type is API, the value is presented as
atid:<Hash>. The <Hash> value is derived from the
OAuth Access token for the session, and only serves as
an identifier; it cannot be used for session revocation.
Item Description
AUDIT.respSentMillisec Time in milliseconds (since 1970) that a response was
sent back to the client
AUDIT.roundTripMS The respSentMillisec time minus the
reqReceivedMillisec time. This represents the total
number of milliseconds it took PingAccess to respond to
a client’s request (including the proxyRoundTripMS).
AUDIT.proxyRoundTripMS The respReceivedMillisec time minus the
reqSentMillisec time. This represents the total number of
milliseconds PingAccess was waiting for another entity
to respond to a backchannel call or proxy request.
AUDIT.userInfoReqSentMillisec The time in milliseconds (since 1970) that the engine
sent a request to the token provider's OIDC UserInfo
endpoint.
AUDIT.userInfoRespReceivedMillisec The time in milliseconds (since 1970) that the engine
received a response from the token provider's OIDC
UserInfo endpoint.
AUDIT.userInfoRoundTripMS The userInfoRespReceivedMillisec minus the
userInfoReqSentMillisec time. This represents the total
number of milliseconds it took PingAccess to receive a
response from the token provider's UserInfo endpoint.
Logging
PingAccess logging is handled by the log4j2 asynchronous logging library, configured using conf/log4j2.xml.
Info: Audit logs are also configurable in conf/log4j2.xml. These logs record a selected subset of
transaction log information at runtime plus additional details (see Security Audit Logging).
By default, logging information is output to PA_HOME/logs/pingaccess.log, and file logging uses the rolling
file appender. PingAccess keeps a maximum of 10 log files, each with a maximum size of 100 MB. Once 10 files
accumulate, PingAccess deletes the oldest. These defaults can be changed by locating and modifying the following
properties in the <Appenders> section of log4j2.xml:
• Changing the log file name:
<RollingFile name="File"
fileName="${sys:pa.home}/log/pingaccess.log"
filePattern="${sys:pa.home}/log/pingaccess.log.%i"
ignoreExceptions="false">
• Setting the maximum log size:
<DefaultRolloverStrategy max="10"/>
Tip: The default log level is DEBUG. We recommend that once PingAccess is configured and is in use in a
production environment, logging be configured to use the lowest, most appropriate level for your needs.
In addition to the standard log4j2 items, PingAccess adds the following custom item that can be used in the
log4j2.xml <PatternLayout> configuration:
| Configure logging | 102
Item Description
exchangeId Identifies the ID for a specific request/response pair.
For example, the following line from log4j2.xml incorporates the exchangeId in the output:
Note: The %X conversion character is required for the exchangeId to be displayed properly.
<AsyncLogger
name="com.pingidentity.pa.core.interceptor.CookieLoggingInterceptor"
level="TRACE" additivity="false" includeLocation="false">
<AppenderRef ref="File"/>
</AsyncLogger>
2. Set the level value in the <AsyncLogger> element to one of the following values:
OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE.
For example, to apply TRACE level logging for the com.pingidentity package, locate the following line:
<AsyncLogger
name="com.pingidentity.pa.core.interceptor.CookieLoggingInterceptor"
level="TRACE" additivity="false" includeLocation="false">
<AppenderRef ref="File"/>
</AsyncLogger>
Note: If you have customized logging to enable logging for additional classes, locate the
<AsyncLogger> element that is relevant to the class in question. This class is defined in the
<AsyncLogger> name attribute.
3. Uncomment the <AppenderRef> element that applies to the appender you wish to enable.
Note: PingAccess will rescan the logging configuration within 30 seconds and make the change active
automatically.
4. Save the file.
• For Engine audit logging: Uncomment the <JDBC> element with the name="EngineAuditLog-
Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
• For Agent audit logging: Uncomment the <JDBC> element with the name="AgentAuditLog-
Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
• SQL Server
• For Administrative API audit logging: Uncomment the <JDBC> element with the
name="ApiAuditLog-SQLServer-Database" attribute specified, along with the following
<RollingFile> and <PingAccessFailover> elements.
• For Engine audit logging: Uncomment the <JDBC> element with the name="EngineAuditLog-
SQLServer-Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
• For Agent audit logging: Uncomment the <JDBC> element with the name="AgentAuditLog-
SQLServer-Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
• PostgreSQL
• For Administrative API audit logging: Uncomment the <JDBC> element with the
name="ApiAuditLog-PostgreSQL-Database" attribute specified, along with the following
<RollingFile> and <PingAccessFailover> elements.
• For Engine audit logging: Uncomment the <JDBC> element with the name="EngineAuditLog-
PostgreSQL-Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
• For Agent audit logging: Uncomment the <JDBC> element with the name="AgentAuditLog-
PostgreSQL-Database" attribute specified, along with the following <RollingFile> and
<PingAccessFailover> elements.
Note: The <PingAccessFailover> element is used to define how PingAccess logging fails over if
a connection to the primary database is not accessible. Use the retryIntervalSeconds attribute to
specify the number of seconds that must pass before retrying the primary JDBC appender.
3. In conf/log4j2.db.properties, replace the placeholder parameter values for each enabled appender with
valid values to provide access to the database.
Info: You can obfuscate the password used to access the database by running either obfuscate.sh
or obfuscate.bat, located in PA_HOME/bin. Use the database password as an argument, then
copy the output into the password configuration property for the appender in PA_HOME/conf/
log4j2.db.properties.
4. In conf/log4j2.xml, uncomment the <AppenderRef> elements in each respective <Logger> section as shown
in the following examples:
Oracle:
SQL Server
PostgreSQL
5. Create the database tables. Scripts to create database tables are located in conf/log4j/sql-scripts.
Note: The scripts are written to handle the default list of elements for the relevant database log appender.
Any changes to the list require corresponding changes to the SQL table creation script, or to the table itself
| Configure logging | 106
if it already exists. For more information on working with these scripts, see Oracle, PostgreSQL, or MS
SQL Server documentation.
Important: For PostgreSQL database scripts, use of the default public schema is not recommended. To
run the scripts against a different schema, choose one of the following options:
• Prepend the schema before the table name. For example, api_audit_log would become
my_schema.api_audit_log
• Run the script via psql and specify an options parameter to define the schema. For example:
psql postgresql://<user>@<db_hostname>:5432/<db_name>?options=--
search_path=<schema> -f api-audit-log-postgresql.sql
<!--
<RollingFile name="ApiAudit2Splunk"
fileName="${sys:pa.home}/log/pingaccess_api_audit_splunk.log"
filePattern="${sys:pa.home}/log/pingaccess_api_audit_splunk.
%d{yyyy-MM-dd}.log"
ignoreExceptions="false">
<PatternLayout>
<pattern>%d{ISO8601} exchangeId="%X{exchangeId}"
trackingId="%X{AUDIT.trackingId}" subject="%X{AUDIT.subject}"
authMech="%X{AUDIT.auth
Mech}" client="%X{AUDIT.client}" method="%X{AUDIT.method}"
requestUri="%X{AUDIT.requestUri}" responseCode="%X{AUDIT.responseCode}"
%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
-->
Manage APIs
PingAccess endpoints
The following endpoints provide a means by which external applications can communicate with the PingAccess
server and provide complete administrative capabilities of the product.
Heartbeat Endpoint
A maintenance endpoint is provided for administrators to verify that the server is running.
OpenID Connect Endpoints
Endpoints needed for PingFederate to interface with PingAccess using the OpenID Connect (OIDC) protocol are
also included.
Auth Token Management endpoint on page 110
Endpoints used for Authentication Token Management.
Administrative API Endpoints
The Administrative API endpoints are used by the PingAccess administrative console. These are REST APIs that
can be called from custom applications or using command line tools such as curl.
Heartbeat endpoint
You can use an HTTPS call at any time to verify that the PingAccess server is running. This call can be made to any
active PingAccess listener and on any node in a PingAccess cluster. For example, with default port configurations, a
CLUSTERED_CONSOLE_REPLICA will respond to this endpoint on port 9000, and a CLUSTERED_ENGINE will
respond to it on port 3000.
/pa/heartbeat.ping
This endpoint is configured using the enable.detailed.heartbeat.response parameter in run.properties. If this option is
set to false, then an HTTP 200 status and the text OK is returned.
If the enable.detailed.heartbeat.response parameter is set to true (the default setting), then a configurable status with
more detail is returned. PingAccess must be restarted if this value is changed.
If an error is returned, then the PingAccess instance associated with the endpoint is down. Load balancers can use this
endpoint to determine the status of PingAccess, independent of any other system status checks.
Info: Begin the URL with the server name and the PingAccess runtime port number. For example:
https://hostname:3000/pa/heartbeat.ping.
The detailed response output format is an Apache Velocity template defined in PA_HOME/conf/template/
heartbeat.page.json. The following values are available:
Value Description
$monitor.getTotalJvmMemory('bytes'|'KB'|'MB'|'GB') Returns the total memory in the JVM. Specify 'bytes',
'KB', "MB', or 'GB' to specify the units. 'bytes' is the
default if not specified.
$monitor.getUsedJvmMemory('bytes'|'KB'|'MB'|'GB') Returns the used memory in the JVM. Specify 'bytes',
'KB', "MB', or 'GB' to specify the units. 'bytes' is the
default if not specified.
| Manage APIs | 109
Value Description
$monitor.getFreeJvmMemory('bytes'|'KB'|'MB'|'GB') Returns the free memory in the JVM. Specify 'bytes',
'KB', "MB', or 'GB' to specify the units. 'bytes' is the
default if not specified.
$monitor.getTotalPhysicalSystemMemory('bytes'|'KB'|'MB'|'GB')
Returns the total system memory. Specify 'bytes', 'KB',
"MB', or 'GB' to specify the units. 'bytes' is the default if
not specified.
$monitor.getTotalUsedPhysicalSystemMemory('bytes'|'KB'|'MB'|'GB')
Returns the used system memory. Specify 'bytes', 'KB',
"MB', or 'GB' to specify the units. 'bytes' is the default if
not specified.
$monitor.getTotalFreePhysicalSystemMemory('bytes'|'KB'|'MB'|'GB')
Returns the free system memory. Specify 'bytes', 'KB',
"MB', or 'GB' to specify the units. 'bytes' is the default if
not specified.
$monitor.getHostname() Returns the hostname for the system running
PingAccess.
$monitor.getNumberOfCpus() Returns the number of CPU cores in the system.
$monitor.getCpuLoad('###.##') Returns the current CPU utilization. The parameter
contains an optional format value. If the format is
specified, the value returned is returned as a percentage
value from 0%-100%, formatted using the Java
DecimalFormat specification. If no format value is
specified, then the value returned is a real number from 0
to 1 which represents the CPU utilization percentage. For
example, a format value of "###.##" will return a value
similar to "56.12", but no specified format would result
in the value being returned as "0.5612".
$monitor.getOpenClientConnections() Returns the current number of clients connected to
PingAccess.
$monitor.getNumberOfVirtualHosts() Returns the current number of configured virtual hosts in
PingAccess.
$monitor.getNumberOfApplications() Returns the current number of configured applications in
PingAccess.
$monitor.getNumberOfSites() Returns the current number of configured sites in the
PingAccess configuration database. In a clustered
environment, on the engine nodes, this number will
reflect the number of sites associated with applications
rather than the number of configured sites that show
on the admin node. For more information, see Server
Clustering documentation. This value is not included
in the default template, but can be added by the system
administrator if desired.
$monitor.getLastRefreshTime('yyyy/MM/dd HH:mm:ss') Returns the time the PingAccess configuration was last
refreshed. The parameter specifies the date format to use;
if no value is specified, the ISO 8601 date format is used.
If the parameter is specified, the format used comes from
the Joda DateTimeFormat specification.
The default content type is application/json, however this can be overridden by modifying the
$monitor.setContentType() line in the template to specify the desired content-type header.
/pa/oidc/logout
Clears the cookie containing the PA Token. This endpoint enables end users to trigger the removal of their own PA
Cookie from the browser they are using. The Logged Out page is a template that can be modified.
Info: This endpoint simply clears the PA Token from the browser cookie. It does not retain any server-side
state to denote log off. Additionally, this endpoint clears the cookie only from the requested host/domain and
may still exist in requests bound for other hosts/domains.
Note: If logout is being performed across multiple domains, use the PingFederate /idp/startSLO.ping
endpoint instead. See PingFederate documentation for more information about this endpoint.
/pa/oidc/cb
The OIDC callback endpoint that receives the ID Token from PingFederate.
/pa/oidc/JWKS
The JSON Web Key endpoint used by the PingFederate JWT Token Processor for signature verification. This
endpoint must be used in conjunction with the configuration of a JWT token processor instance in PingFederate. For
more information on configuring a JWT, see PingFederate documentation.
/pa/oidc/logout.png
Used by PingFederate to initiate a logout from PingAccess in conjunction with the single logout functionality. This
endpoint terminates the PA tokens across domains.
/pa/authtoken/JWKS
This endpoint is used by backend sites to validate the signature of a JWT. For more information on the use of JWT,
see the OpenID Connect 1.0 Developers Guide.
Note: For enhanced API security, you must include X-XSRF-Header: PingAccess in all requests and
use the application/json content type for PUT/POST requests.
| Perform a zero downtime upgrade | 112
Introduction
This document describes the steps required to perform a zero downtime upgrade of a PingAccess cluster to version
5.0 or higher. A zero downtime upgrade allows you to upgrade your environment with no impact to resource
availability or existing user sessions.
Though this procedure is applicable to any PingAccess cluster upgrade to version 5.0 or higher, there are minor
variations depending on your PingAccess source version. Those variations are clearly described where applicable.
Note that there are some steps, particularly those related to working with a load balancer, that are dependent on
your environment. It is expected that you are familiar with the tasks required by these steps and, accordingly, this
document does not attempt to offer detailed instruction on performing these tasks.
Important: In order to achieve a successful upgrade, perform the steps in this document in the order that
they are presented. Deviation from these steps may result in a failed upgrade and/or system downtime.
To begin the upgrade process, Disable key rolling to prevent active sessions from being invalidated.
3. Click Save.
4. Navigate to Settings > Access > Web Sessions.
5. In the Web Session Management section, specify a Key Roll interval of 240 (10 days).
6. Click Save.
Next, you will upgrade the Admin node.
Prerequisites
Prior to beginning the upgrade process, make sure you have:
• Ensured PingAccess is running
• Downloaded and unpacked the PingAccess Upgrade Utility
• Downloaded the PingAccess distribution ZIP file
• The PingAccess license
• Administrator credentials
• Basic Authentication enabled
Warning: Failure to enable basic authentication can result in losing access to the Administration console.
cd /pa-upgrade-5.0.1/bin
2. Run the Upgrade Utility:
• Linux: ./run.sh -r <sourcePingAccessRootDir> <outputDir> <pingaccessZip>
<newPingAccessLicense>
For example:
For example:
Important: The -r switch will disable configuration replication on the Admin node. You will re-enable
configuration replication after the Admin and all engine nodes have been upgraded.
3. Stop the existing PingAccess admin instance.
4. Start the new PingAccess admin instance.
5. Upgrade the Admin Replica node using the same steps, but omitting the -r switch.
Important: If PingAccess is running as a service:
• In Linux, update PA_HOME in /etc/systemd/system/pingaccess.service to point to the
new installation.
• In Windows, remove the existing PingAccess service (<OLD_PA_HOME>\sbin\Windows
\uninstall-service.bat) and add the new service (<NEW_PA_HOME>\sbin\Windows
\install-service.bat).
After you have upgraded the Admin and Replica Admin nodes, you can begin upgrading the engines.
Prerequisites
Prior to beginning the upgrade process, make sure you have:
• Ensured the PingAccess engine is running
• Downloaded and unpacked the PingAccess Upgrade Utility
• Downloaded the PingAccess distribution ZIP file
• The PingAccess license
Upgrade the PingAccess engine
1. To run the Upgrade Utility, use a command line to change to the Upgrade Utility's /bin directory. For example:
cd /pa-upgrade-5.0.1/bin
2. Run the Upgrade Utility:
| Perform a zero downtime upgrade | 116
5. In the Web Session Management section, specify a Key Roll interval of your choosing. The default value is 24
(1 day).
6. Click Save.
Important:
1. These steps assume you have installed PingFederate. The example assumes that your PingFederate
instance is available at https://mypingfedserver, using ports 9031 and 9999 respectively for
the runtime and administration functions.
2. These steps assume you have installed PingAccess. This example assumes that your PingAccess instance
is available at https://mypingaccessserver and that 3000 is the default listening port.
6. In the Password Credential Validator Instance list, select the password credential validator you created
(Example: My_PCV) and click Update.
7. On the Adapter Attributes page, next to the username attribute, click to select the Pseudonym checkbox
8. On the Summary page, click Done.
9. Click Save.
GeneralAccessToken
4. Click Add Mapping.
5. On the Contract Fulfillment page, in the Source list, select Persistent Grant.
6. In the Value list, select USER_KEY.
7. On the Summary page, click Save.
GeneralAccessToken
6. On the Attribute Contract page, delete all items beneath Extend the Contract.
7. On the Contract Fulfillment page, in the Source list, select Access Token.
8. In the Value list, select UserName.
9. On the Summary page, click Done.
10. Click Save.
11. Beside the policy you created, click Set as Default.
12. Click Save.
pa_rs
4. Specify a Name. For example:
PingAccessResourceServer
5. Select Client Secret.
6. Generate a secret by clicking Generate Secret. Copy this secret to a secure location so that you can use it in
PingAccess configuration.
7. In the Redirection URIs field, add the OIDC callback redirect to the PingAccess server. For example:
https://mypingaccessserver:3000/pa/oidc/cb
| Protect a web-based application using PingFederate and PingAccess in a proxy deployment | 124
8. Click Add.
9. For the Allowed Grant Type setting, select the Access Token Validation (Client is a Resource Server) check
box.
10. Click Save.
11. Click Save.
pa_wam
4. Specify a Name. For example:
PingAccessWebAccessManagement
5. Select Client Secret.
6. Generate a secret by clicking Generate Secret. Copy this secret to a secure location so that you can use it in
PingAccess configuration.
7. In the Redirection URIs field, add the OIDC callback redirect to the PingAccess server, for example:
https://mypingaccessserver:3000/pa/oidc/cb
8. Click Add.
9. Select the Bypass Authorization Approval check box.
10. For the Allowed Grant Type setting, select the Authorization Code check box.
11. Click Save.
12. Click Save.
mypingfedserver
4. Complete the remaining fields as required.
5. Click Next
6. Click Done.
7. Under the Action heading, click Activate for Runtime Server.
8. Export the certificate only.
9. Click Save.
Next, Connect to PingFederate and configure an application in PingAccess on page 125.
| Protect a web-based application using PingFederate and PingAccess in a proxy deployment | 125
https://mypingfedserver:9031/PingAccessQuickStart
PingFed
4. Click Choose File to select the certificate.
5. Click Add to import the certificate. A new certificate row appears on the Certificates page.
6. Click + to the right of the Trusted Certificate Groups heading.
7. Drag a certificate onto the box that appears.
8. Enter a Name for the group in the box that appears. For example:
PingFed
9. Click Add.
mypingfedserver
3. Enter the Port number for PingFederate Runtime. For example:
9031
4. Select Secure.
5. From the Trusted Certificate Group list, select the PingFed certificate group.
6. Click Save.
7. Navigate to Settings > System > Token Provider > Administration.
| Protect a web-based application using PingFederate and PingAccess in a proxy deployment | 126
8. Enter the Host name or IP address for access to the PingFederate Administrative API. For example:
mypingfedserver
9. Enter the Port number for access to the PingFederate Administrative API. For example:
9999
10. Enter the PingFederate Admin Username.
11. Enter the Admin Password.
12. Select Secure.
13. From the Trusted Certificate Group list, select the PingFed certificate group.
14. Click Save.
15. Navigate to Settings > System > Token Provider > OAuth Resource Server
16. Enter the OAuth Client ID you defined when creating the PingAccess OAuth client in PingFederate. For example:
pa_rs
17. Enter the Client Secret you defined when creating the PingAccess OAuth client within PingFederate.
18. In the Subject Attribute Name field, enter the attribute you want to use from the OAuth access token as the
subject for auditing purposes. For example:
username
19. Click Save.
PF_WAM
4. Select Encrypted JWT for Cookie Type.
5. Specify the Audience that the PA Token is applicable to, represented as a short, unique identifier between 1 and
32 characters. For example:
global
6. Specify the OpenID Connect Login Type CODE.
7. Specify the Client ID. For example:
pa_wam
8. Specify the Client Secret
9. Click Save.
3. Enter the Host name for the Virtual Host. For example:
mypingaccessserver
4. Enter the Port number for the Virtual Host. For example:
3000
5. Click Save.
Create a site
Create a site to define the location of the application that PingAccess is protecting. For more information, see Sites.
1. Navigate to Main > Sites > Sites.
2. Click Add Site.
3. Specify a Name. For example:
QuickStart
4. Specify the Target. The format for this is hostname:port. For example:
mypingfedserver:9031
5. Select Secure and choose the PingFed Trusted Certificate Group.
6. Click Save.
Note: If the target site cannot be contacted, the site is saved and a warning is displayed indicating the
reason the site was not reachable.
Create an application
Create an application to define the resource that PingAccess is protecting. For more information, see Applications.
1. Navigate to Main > Applications.
2. Click Add Application.
3. Provide a unique name for the application. For example:
QuickStart
4. Specify the context at which the application is accessed at the site. For example:
/PingAccessQuickStart
5. Specify the virtual host for the application. For example:
mypingaccessserver:3000
6. Specify the application type Web and select the Web Session for the application. For example:
PF_WAM
7. Specify the application destination type Site and select the Site requests are sent to when access is granted. For
example:
PingAccessQuickStart
8. Select the Require HTTPS option.
9. Select the Enabled checkbox.
10. Click Save.
| Protect a web-based application using PingFederate and PingAccess in a proxy deployment | 128
https://mypingaccessserver:3000/PingAccessQuickStart
3. Login using the credentials you created for the PingFederate password credential validator.
| Customize and localize PingAccess | 129
Variable Description
title The browser tab title for the message. For example, Not
Found.
header The header for the message. For example, Not Found.
info The information for the message. For example, No
Resource configured for request.
exchangeId A value that identifies the request/response pair. This can
be used to locate messages in the PingAccess logs.
trackingId A value that identifies either the tracking ID (identified
with a tid: prefix) or an Access Token ID (identified
with a atid: prefix). This can be used to identify the
session in the PingAccess and PingFederate logs.
At runtime, the user's browser is directed to the appropriate page, depending on the operation being performed and
where the related condition occurs (see the table below). For example, if Rule evaluation fails, the user's browser is
directed to the Policy error-handling page. The following table describes each template.
Note: The templates stored in PA_HOME/conf/template/system are system templates, and should
not be modified.
pa.response.status.service.unavailable
The order in which PingAccess searches for the string to display is:
1. pa-messages_fr_CA.properties
2. pa-messages_en_US.properties
3. pa-messages_fr.properties
4. pa-messages_en.properties
5. pa-messages.properties
If the ping-accept-language cookie is set by the protected application to the value en-US, then the above list
would be ignored, and PingAccess would search for the string in:
1. pa-messages_en_US.properties
| Customize and localize PingAccess | 131
2. pa-messages_en.properties
3. pa-messages.properties
Important: Most browsers support the use of an ordered list of languages, however, Safari is an exception to
this. Even though the system supports an ordered list of languages, only the preferred language is sent with its
requests.
| Groovy development guide | 132
Groovy
PingAccess provides the Groovy Script and OAuth Groovy Script Rule types that enable the use of Groovy, a
dynamic programming language for the Java Virtual Machine (see the Groovy documentation). Groovy scripts
provide advanced rule logic that extends PingAccess rule development beyond the capabilities of the packaged rules.
Groovy scripts have access to important PingAccess runtime objects such as the Exchange and PolicyContext objects,
which the scripts can interrogate and modify. Groovy Script Rules are invoked during the request processing phase
of an exchange, allowing the script to modify the request before it is sent to the server. Groovy Script Rules are also
invoked during the response, allowing the script to modify the response before it is returned to the client. The diagram
below highlights the flow of Rule processing.
• During request processing, Rules associated with the application are evaluated.
• The request passes through each of the Rules sequentially until it is sent to the site.
• When the response from the site returns to PingAccess, the Groovy Rules are evaluated.
| Groovy development guide | 133
Groovy scripts
Groovy scripts provide advanced Rule logic that extends PingAccess Rule development beyond the capabilities of
the packaged rules. Groovy scripts have access to important PingAccess runtime objects such as the Exchange and
PolicyContext objects, which the scripts can interrogate and modify. Groovy Script Rules are invoked during the
request processing phase of an exchange, allowing the script to modify the request before it is sent to the server.
Groovy Script Rules are also invoked during the response, allowing the script to modify the response before it is
returned to the client. See Groovy for more info about Groovy.
Note: Through Groovy scripts, PingAccess administrators can perform sensitive operations that could affect
system behavior and security.
Matchers
Groovy scripts must end execution with a Matcher instance. Matchers provide a framework for establishing
declarative Rule matching objects. You can use a Matcher from the list of PingAccess matchers or from the Hamcrest
library.
The following are Hamcrest method examples for constructing access control policies with the Web Session Attribute
Rule using evaluations such as an OR group membership evaluation.
allOf - Matches if the examined object matches ALL of the specified matchers. In this example, the user needs to be
in both the sales and managers groups for this rule to pass.
allOf(containsWebSessionAttribute("group","sales"),
containsWebSessionAttribute("group","managers"))
anyOf - Matches any of the specified matchers. In this example, the rule passes if the user is in any of the specified
groups.
anyOf(containsWebSessionAttribute("group","sales"),
containsWebSessionAttribute("group","managers"),
containsWebSessionAttribute("group","execs"))
not - Inverts the logic of a matcher to not match. In this example, the rule fails if the user is in both the sales and the
managers groups.
not(allOf(containsWebSessionAttribute("group", "sales"),
containsWebSessionAttribute("group", "managers")))
Objects
The following objects are available in Groovy. Click a link for more information on that object.
Exchange Object
Contains the HTTP request and the HTTP response for the transaction processed by PingAccess.
PolicyContext Object
Contains a map of objects needed to perform policy decisions. The contents of the map vary based on the context
of the current user flow.
Request Object
Contains all information related to the HTTP request made to a Application.
Response Object
Contains all information related to the site HTTP response.
| Groovy development guide | 134
Method Object
Contains the HTTP method name from the request made to a Application.
Header Object
Contains the HTTP header information from the request made to a Application or the HTTP header from a Site
response.
Body Object
Contains the HTTP body from the Application request or the HTTP body from the Site response.
OAuthToken Object
Contains the OAuth access token and related identity attributes.
Logger Object
Configure and view the state of logging.
MediaType Object
Contains information related to the media type.
Debugging/troubleshooting
Groovy Script Rules are evaluated when saved to ensure that they are syntactically valid. If a Groovy Script Rule fails
to save, check the log for output with the exception javax.script.ScriptException. For example, if you
are trying to save a Groovy Script Rule that references the missing method foo(), the following output would be
logged:
DEBUG com.pingidentity.synapse.adminui.AdminAPIInterceptor:1585 -
javax.script.ScriptException:
javax.script.ScriptException: groovy.lang.MissingMethodException: No
signature of method:
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.foo() is applicable for
argument types: () values: []
Possible solutions: find(), any(), get(java.lang.String),
use([Ljava.lang.Object;), is(java.lang.Object), find(groovy.lang.Closure)
DEBUG com.pingidentity.synapse.adminui.AdminAPIInterceptor:1399 - Returning
error to UI: [[Error occurred validating policy.], {}]
Info: These error messages are only logged if the DEBUG level output is enabled for the
com.pingidentity logger.
Body object
Purpose
Accesses the Body object in Groovy exc?.request?.body or exc?.response?.body
The Body object contains the HTTP body from the application request or the HTTP body from the site response. The
request HTTP body is sent on to the site after the rules are evaluated. The response HTTP body is sent on to the User-
Agent after the response rules are evaluated.
Groovy sample
//Checks the actual length of the body content and set the Content-Length
response header
def body = exc?.response?.body;
def header = exc?.response?.header;
header?.setContentLength(body?.getLength());
anything("Content-Length header set");
| Groovy development guide | 135
Method summary
Method Description
byte[] getContent() Returns the body content of the request or response.
int getLength() Returns the length of the body content.
Exchange object
Purpose
Accesses the Exchange object in Groovy - exc
The Exchange object is available to both the OAuth Groovy Script Rule and the regular Groovy Script Rule.
PingAccess makes the Exchange object available to Groovy Script developers to provide request and response
information for custom Groovy Rules.
The Exchange object contains both the HTTP request and the HTTP response for the transaction processed by
PingAccess. You can use this object to manipulate the request prior to it being sent to the site. You can also use this
object to manipulate the response from the site before it is sent to the client.
An instance of the Exchange object lasts for the lifetime of a single Application request. The Exchange object can be
used to store additional information determined by the developer.
Some fields and methods for the Response Object are not available in scripts used with an Agent. See the Field
Summary and Method Summary tables below for more information.
Groovy sample
Method summary
Method Description
Identity getIdentity() Obtains the PingAccess representation of the identity
associated with the request. This object will be null
for requests to an unprotected application or an
unauthenticated request to an anonymous resource.
Request getRequest() Obtains the PingAccess representation of the request.
This request is sent to the site with any changes that
might be made in a Groovy script.
Response getResponse() Obtains the PingAccess representation of the response.
If the site has not been called, the response is null. This
field is not available in scripts used with an Agent.
| Groovy development guide | 136
Method Description
long getTimeReqSent() Obtains the time, in milliseconds, when the request was
sent to the site. This field is not available in scripts used
with an Agent.
long getTimeResReceived() Obtains the time, in milliseconds, when the response
was received from the site. This field is not available in
scripts used with an Agent.
String getRequestURI() Returns the PingAccess URI that received the request.
String getRequestScheme() Obtains the scheme used by the browser or other user
agent that made the request.
Object getProperty(String key) Returns the value of a custom property.
void setProperty(String key, Object value) Sets a custom property.
SslData getSslData() Obtains information established in the TLS handshake
made with PingAccess.
Headers object
Purpose
Accesses the Headers object in Groovy exc?.request?.header or exc?.response?.header
The Headers object contains the HTTP Header information from the request made to an application or the HTTP
Header from a site response. The Request HTTP Header is sent on to the site after the Rules are evaluated. The
Response HTTP Header is returned to the client after the response Rules are evaluated.
Use the Headers object to add custom HTTP headers for site.
Groovy sample
Method summary
Method Description
void add(String key, String val) Adds HTTP header fields for the request.
Info: Note that if Groovy Rules are used to
inject HTTP headers for the backend protected
application, the script must sanitize the same
headers from the original client request.
Method Description
void setAuthorization(String value) Sets authentication credentials for HTTP Authentication.
String getConnection() Returns the connection type preferred by the User-Agent.
void setConnection(List<String> values) Sets the connection type preferred by the User-Agent.
int getContentLength() Returns the request body content length.
void setContentLength(int length) Sets the request body content length.
MediaType getContentType() Returns media type of Header with Content type
void setContentType(String) Sets the request body MIME type.
Map <String, String[]> getCookies() Returns all cookies sent with the request.
void setCookie(String) Sets a cookie.
String getFirstCookieValue(String) Returns the first cookie in the Cookie header.
String getFirstValue(String) Returns the first value of the HTTP header specified by
the name.
void setDate(Date date) Sets the date of the message in the Date HTTP header.
String getHost() Returns the hostname specified in the request.
void setHost(String value) Sets the hostname for the request to the Site.
String getLocation() Gets the redirect location URL for the response.
void setLocation(String value) Sets the redirect location URL for the response.
String getProxyAuthorization() Returns the proxy credentials.
void setProxyAuthorization(String value) Sets the request proxy credentials.
void setServer(String value) Sets the server name for the response.
String getXForwardedFor() Returns the originating IP address of the client and the
proxies, if set.
void setXForwardedFor(String value) Sets the IP Address for the client and the proxies.
boolean removeContentEncoding() Removes the Content-Encoding header value. Returns
true if the value has been removed.
boolean removeContentLength() Removes the Content-Length header value. Returns true
if the value has been removed.
boolean removeContentType() Removes the Content-Type header value. Returns true if
the value has been removed.
boolean removeExpect() Removes the Expect header value. Returns true if the
value has been removed.
boolean removeFields(String name) Removes the header value specified by the name
parameter. Returns true if the value has been removed.
boolean removeTransferEncoding() Removes the Transfer-Encoding header value. Returns
true if the value has been removed.
| Groovy development guide | 138
Identity object
Purpose
The Identity object contains information about the authenticated identity associated with the current HTTP request.
Groovy sample
if ("user".equals(subject)) {
pass()
} else {
fail()
}
Method summary
Method Description
String getSubject() Returns the subject of the identity.
String getMappedSubject() Returns the subject set by the identity mapping. If there
is no identity mapping associated with the application,
the return value will be null. If there is an identity
mapping associated with the application, but the identity
mapping did not determine a subject to map, the returned
value may be the empty string.
String getTrackingId() Returns the tracking identifier used in PingAccess logs.
This value is not guaranteed to be globally unique and
should be used for diagnostic purposes only
String getTokenId() Returns the unique ID for the associated authentication
token. This value may change when new tokens are
issued for the same identity.
Date getTokenExpiration() Returns a Date object representing the time at which
the authentication token expires. This may be null if the
authentication provider did not indicate an expiry.
JsonNode getAttributes() Returns a JsonNode object representing the attributes of
the identity.
JsonNode object
Purpose
The JsonNode object represents the attributes of an identity.
Groovy sample
if (foundGroup) {
pass()
} else {
fail()
}
Method summary
Method Description
JsonNode get(String fieldName) Gets the JsonNode representing a field of this JsonNode.
This method will return null if no field exists with the
specified name.
boolean has(String fieldName) Returns true if this JsonNode has a field with the
specified name.
java.util.Iterator<String> fieldNames() Returns an java.util.Iterator providing access to the
names of all the fields of this JsonNode.
boolean isTextual() Returns true if this JsonNode represents a string value.
String asText() Returns a string representation of this JsonNode. If this
JsonNode is an array or object, this will return an empty
string.
int intValue() Returns an integer representation of this JsonNode. If
this JsonNode does not represent a number, 0 is returned.
boolean isArray() Returns true if this JsonNode is an array.
boolean isObject() Returns true if this JsonNode is an object.
int size() For an array JsonNode, returns the number of elements
in the array. For an object JsonNode, returns the number
of fields in the object. 0 otherwise.
java.util.Iterator<JsonNode> iterator() Returns an java.util.Iterator over all JsonNode objects
contained in this JsonNode. For an array JsonNode,
the returned java.util.Iterator will iterate over all the
elements in the array. For an object JsonNode, the
returned java.util.Iterator will iterate over all field values
in the object.
Remarks
A JsonNode implements java.lang.Iterable<JsonNode> so a for loop can be used to iterate over all the elements in an
array JsonNode or the field values in an object JsonNode.
| Groovy development guide | 140
Logger object
Purpose
Accesses the Logger object.
Method summary
Method Description
void trace(String format, Object... arguments) Logs a TRACE level message based on the specified
format and arguments.
void debug(String format, Object... arguments) Logs a DEBUG level message based on the specified
format and arguments.
void info(String format, Object... arguments) Logs an INFO level message based on the specified
format and arguments.
void warn(String format, Object... arguments) Logs a WARN level message based on the specified
format and arguments.
void error(String format, Object... arguments) Logs an ERROR level message based on the specified
format and arguments.
boolean isTraceEnabled() Checks if the logger instance is enabled for the TRACE
level.
boolean isDebugEnabled() Checks if the logger instance is enabled for the DEBUG
level.
boolean isInfoEnabled() Checks if the logger instance is enabled for the INFO
level.
boolean isWarnEnabled() Checks if the logger instance is enabled for the WARN
level.
boolean isErrorEnabled() Checks if the logger instance is enabled for the ERROR
level.
MediaType object
Purpose
Accesses the MediaType object.
Method summary
Method Description
Map getParameters() Returns a list of parameters.
String getBaseType() Returns the media base type.
String getSubType() Returns the media sub type.
String getParameter(String) Returns a string containing the value of the request
parameter.
String getPrimaryType() Returns the primary media type.
| Groovy development guide | 141
Method object
Purpose
Accesses the Method object in Groovy exc?.request?.method
The Method object contains the HTTP Method name from the request made to an application. The HTTP Method is
sent on to the Site after the Rules are evaluated.
Groovy sample
//Retrieve the HTTP Method name and make different decisions based on the
method name
def method = exc?.request?.method?.methodName
switch (method) {
case "GET":
println("GET")
break;
case "POST":
println("POST")
break;
case "PUT":
println("PUT")
break;
case "DELETE":
println("DELETE")
break;
default:
println("DEFAULT")
pass()
}
Method summary
Method Description
String getMethodName() Returns the name of the HTTP Method ( GET, PUT,
POST, DELETE, HEAD).
Purpose
Accesses the OAuth Token object in Groovy
exc?.user?.policyContext?.context?.get("oauth_token")
The OAuthToken object contains the OAuth access token and related identity attributes. The OAuthToken instance is
available only for OAuth Groovy Script Rules.
Groovy sample
exc?.request?.header?.add("x-username", "$username")
anything()
Method summary
Method Description
Instant getExpiresAt() Contains the expiration instant of the OAuth access
token.
Instant getRetrievedAt() Contains the instant that the OAuth access token was
retrieved from PingFederate.
String getTokenType() Contains the type of OAuth access token. (Bearer, JWT).
String getClientId() Contains the client ID associated with the OAuth access
token.
Set getScopes() Contains the set of scopes associated with the OAuth
access token.
Map<String, List<String>> getAttributes() Contains a map of identity attributes specific to the user.
PolicyContext object
Purpose
Accesses the Policy Context object in Groovy policyCtx
The PolicyContext object is a map of objects needed to perform policy decisions. The contents of the map vary based
on the context of the current user flow. A common example is OAuth token information stored in an OAuthToken
object contained within the context map. In this example, an OAuthToken object is retrieved from the policy context
by using the oauth_token key. The OAuthToken object is available only for the OAuth Groovy Script Rule.
Groovy sample
Method summary
Method Description
Map<String, Object> getContext() Container for the OAuthToken object.
Exchange getExchange() Returns the exchange a message relates to.
Request object
Purpose
Accesses the Request object in Groovy exc?.request
The Request object contains all information related to the HTTP request made to an application. The request instance
is sent on to the site after the Rules are evaluated.
Some fields and methods for the Response Object are not available in scripts used with an Agent. See the Field
Summary and Method Summary tables below for more information.
| Groovy development guide | 143
Groovy sample
Field summary
Field Description
String uri Returns the PingAccess URI that received the request.
void setUri(String) Sets the PingAccess URI.
Method summary
Method Description
Method getMethod Contains the HTTP method information from the request
sent to the application.
Header getHeader Contains the HTTP header information from the request
sent to the application.
Warning: Warning: Previously executed
custom Rules can modify these values.
Body getBody Contains the HTTP body information from the request
sent to the application. This field is not available in
scripts used with an Agent.
Warning: Warning: Previously executed
custom Rules can modify these values.
Map<String, String[]> getRequestParams() throws Parses the query string parameters from the request.
java.net.URISyntaxException If the query string parameters cannot be parsed
due to formatting errors, this method will throw a
java.net.URISyntaxException. Groovy scripts that use
this method are not required to catch this exception.
Scripts that choose not to catch this exception will fail if
the query string parameters are invalid.
Map<String, String[]> getPostParams() Parse the form parameters from the body content of
the request, assuming the content is encoded using
the encoding defined by the application/x-www-form-
urlencoded content type.
void setBodyContent(byte[] content) Replaces the body content of the request. This method
will also adjust the Content-Length header field to align
with the length of the specified content.
| Groovy development guide | 144
Response object
Purpose
Accesses the Response object in Groovy exc?.response
The Response object contains all information related to the Service HTTP response. The response instance is sent on
to the User-Agent after the Rules are evaluated.
The fields and methods for the Response Object are not available in scripts used with an Agent.
Groovy sample
Field summary
Field Description
int getStatusCode() Contains the HTTP response status code.
void setStatusCode(int) Sets the status code from an integer.
String getStatusMessage() Contains the HTTP response status message.
void setStatusMessage(String) Sets the status message from a string.
Method summary
Method Description
boolean isRedirect() Returns true if the status code is in the 300’s.
Header getHeader Contains the HTTP header information from the
response.
Warning: Previously executed custom Rules
can modify these values.
Body getBody Contains the HTTP body information from the response.
Warning: Previously executed custom Rules
can modify these values.
void setBodyContent(byte[] content) Replaces the body content of the response. This method
will also adjust the Content-Length header field to align
with the length of the specified content.
| Groovy development guide | 145
SslData object
Purpose
The SslData object provides access to information established in the TLS handshake with PingAccess.
Groovy sample
Method summary
Method Description
List<String> getSniServerNames() Returns a list of SNI server_names sent by the user agent
in the TLS handshake. Empty if the user agent did not
utilize the SNI TLS extension.
List<java.security.cert.X509Certificate> Returns the certificate chain presented by the user agent
getClientCertificateChain() in the TLS handshake. Empty if the user agent did not
utilize TLS client authentication.
user=policyCtx?.context.get("oauth_token")?.attributes?.get("user")?.get(0)
exc?.request?.header?.add("User", "$user")
anything()
test = exc?.request?.header?.getFirstValue("test");
if(test != null && test.equals("foo"))
{
//rule will fail evaluation if Test header has value 'foo'
not(anything("Test header is foo"))
}
else
{
//rule will pass evaluation is Test header has value of anything else
| Groovy development guide | 146
Set an exchange property named "com.pingidentity.policy.error.info" so the value will be available in $info variable
in policy.error.page.template.html for Web applications.
if (!exc?.request?.uri?.matches("[\\p{Po}\\p{N}\\p{Z}\\p{L}\\p{M}\\p{Zs}\\./
_\\-\\()\\{\\}\\[\\]]*"))
{
fail()
}
else
{
pass()
}
if ((anyOf(containsWebSessionAttribute("engineering",
"true"), containsWebSessionAttribute("marketing", "true")) &&
(containsWebSessionAttribute("manager", "true")))
{pass()
}
else{
fail()
}
Matchers
The Groovy Script Rule and the OAuth Groovy Script Rule must end execution with a Matcher instance. This could
either be a Matcher from the list of PingAccess matchers or from the Hamcrest library (for more information on
Hamcrest, see the Hamcrest Tutorial).
Example 1 - Simple Groovy Rule Inserts a Custom HTTP Header
exc?.response?.header?.add("X-Groovy", "$test")
anything()
In the sample rule above, the script ends with a call to the Matcher anything(). The anything() Matcher
signals that the rule has passed.
Example 2 - OAuth Groovy Rule Checks the HTTP Method and Confirms the OAuth Scope
In the sample rule above, a Matcher is evaluated at the end of each line of execution. The first Matcher used is the
hasScope() Matcher that confirms if the OAuth Access token has the WRITE scope. If this is true, the rule passes.
The not(anything()) Matcher combination is evaluated when the methodName does not equal POST. This
Matcher combination evaluates to false.
PingAccess Matchers
The following table lists the Matchers available for the Groovy Script Rule and the OAuth Groovy Script Rule.
Matcher Description
inIpRange(String cidr) Validates the source IP address of the request against the
cidrString parameter in CIDR notation. When Source
IP headers defined in the HTTP Requests page are found,
the source IP address determined from those headers is
used as the source address.
For agents, this value is also potentially controlled by the
override options on the Agent settings.
Example: inIpRange("127.0.0.1/8")
inIpRange(String cidr, String Validates the source IP address in the first of the
listValueLocation, boolean specified headerNames using the cidr value. Can
fallBackToLastHopIp, String... be specified as part of a Groovy Script as a means of
headerNames) overriding the configuration stored in PingAccess for a
specific Groovy Script rule.
Valid values for the listValueLocation parameter
are FIRST, LAST, and ANY. This parameter controls
where, in a multivalued list of source IP addresses, the
last source should be taken from. If ANY is used, if any
| Groovy development guide | 148
Matcher Description
of the source IP addresses in a matching header match
the CIDR value, the matcher evaluates to true.
Example: inIpRange("127.0.0.1/8",
"LAST", true, "X-Forwarded-For",
"Custom-Source-IP")
inTimeRange(String startTime, String Validates that the current server time is between the
endTime) startTime and endTime parameters.
Example: inTimeRange("9:00 am","5:00
pm")
inTimeRange24(String startTime, String Validates that the current server time is between the
endTime) specified 24-hour formatted time range between the
startTime and endTime parameters.
Example: inTimeRange24("09:00","17:00")
requestHeaderContains(String field, Validates that the HTTP header field value is equal to the
String value) value parameter.
Example: requestHeaderContains("User-
Agent", "Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_8_3)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/27.0.1453.93 Safari/537.36")
Matcher Description
If multiple pairs of strings are present in the
fieldValuesMap parameter, then all conditions must
be met in order for the matcher to pass.
Example: requestHeaderContains(['User-
Agent':'Mozilla/5.0',
'Cookie':'JSESSIONID'], false)
requestPostFormContains(Map<String, Validates that all of the HTTP form fields maps to the
String> fieldValuesMap, boolean associated value. The first fieldValuesMap string
caseSensitive) contains the form header name, and the second string
contains the value to compare the incoming request
header value with.
The caseSensitive parameter determines whether a
case-sensitive comparison is performed on the value.
Note: This matcher determines whether to
use fields passed in the URL or forms with a
content-type header of application/
x-www-form-urlencoded.
The second string in the fieldValuesMap supports
Java Regular Expressions.
If multiple pairs of strings are present in the
fieldValuesMap parameter, then all conditions must
be met in order for the matcher to pass.
Example:
requestPostFormContains(['email':'@example.com',
'phonenumber':'720'], false)
requestHeaderDoesntContain(String Validates that the HTTP header field value is not equal to
field, String value) the value parameter.
Example:
requestHeaderDoesntContain("User-
Agent", "InternetExplorer")
requestBodyContains(String value) Validates that the HTTP body contains the value
parameter.
Example:
requestBodyContains("production")
requestBodyDoesntContain(String value) Validates that the HTTP body does not contain the value
parameter.
Example:
requestBodyDoesntContain("test")
The following table lists the matchers available to only the OAuth Groovy Rule.
Matcher Description
hasScope(String scope) Validates that the OAuth access token contains the scope
parameter.
Example: hasScope("access")
hasScopes(String... scopes) Validates that the OAuth access token contains the list of
scopes.
Example: hasScopes("access","portfolio")
hasAttribute(String attributeName, Checks for an attribute value within the current OAuth2
String attributeValue) policy context.
Example: hasAttribute("account","joe")
| Addon SDK for Java | 151
Preface
This document provides technical guidance for using the PingAccess Add-on SDK. Developers can use this guide, in
conjunction with the installed Javadocs, to extend the functionality of the PingAccess server.
Important: A restart of PingAccess is required after the deployment of any custom plugins written in Java.
Intended audience
This guide is intended for application developers and system administrators responsible for extending PingAccess.
The reader should be familiar with Java software-development principles and practices. It describes the development
of:
• SiteAuthenticators
• Rules
• Identity mappings
• Load balancing strategies
• Locale override service
Additional documentation
• The PingAccess Javadocs provide detailed reference information for developers. The Javadocs can be accessed
with a web browser by viewing the file PA_HOME/sdk/apidocs/index.html.
Introduction
The PingAccess Add-on SDK provides the following extension points:
RuleInterceptor
An interface for developing custom Rule implementations to control authorization logic in policies.
SiteAuthenticatorInterceptor
An interface for developing custom Site Authenticators to control how PingAccess (operating as a proxy) is able
to integrate with web servers or services it is protecting.
IdentityMappingPlugin
An interface for developing custom Identity Mappings to provide user identity information to an Application
within PingAccess.
LoadBalancingPlugin
An interface for developing custom Load Balancing strategies that provide the logic for load balancing requests
to Target Hosts configured for a Site.
LocaleOverrideService
An interface for developing custom logic for resolving the locale of a request used for localization.
These extension points allow users to customize certain behaviors of PingAccess to suit an organization’s needs. This
SDK provides the means to develop, compile, and deploy custom extensions to PingAccess.
If you need assistance using the SDK, visit the Ping Identity Support Center (ping.force.com/Support) to see how we
can help you with your application. You may also engage the Ping Identity Global Client Services team for assistance
with developing customizations.
| Addon SDK for Java | 152
SDK prerequisites
Before you start, ensure you have the Java SDK and Apache Maven installed. The samples use Apache Maven and
assume that the PingAccess SDK can be referenced as a dependency. They reference Ping Identity’s public maven
repository, located at:
http://maven.pingidentity.com/release
If Internet access is unavailable, update the pingaccess-sdk dependency in your pom.xml to point to the local
installation.
<dependency>
<groupId>com.pingidentity.pingaccess</groupId>
<artifactId>pingaccess-sdk</artifactId>
<version>4.0.1.3</version>
<scope>system</scope>
<systemPath><PA_HOME>/lib/pingaccess-sdk-4.2.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<scope>system</scope>
<systemPath>PA_HOME/lib/validation-api-1.0.0.GA.jar</systemPath>
</dependency>
<dependency>
| Addon SDK for Java | 153
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.4</version>
<scope>system</scope>
<systemPath>PA_HOME/lib/slf4j-api-1.7.4.jar</systemPath>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.4</version>
<scope>system</scope>
<systemPath>PA_HOME/lib/slf4j-log4j12-1.7.4.jar</systemPath>
</dependency>
com.pingidentity.pa.sdk.identitymapping.header.HeaderIdentityMappingPlugin are
available to simplify implementing an IdentityMapping.
• Add the class name of the new class to /sdk/samples/IdentityMappings/src/main/resources/
META-INF/services/
com.pingidentity.pa.sdk.identitymapping.IdentityMappingPlugin. Execute maven
install on the IdentityMappings sample pom.
Create a rule
• For details on how to create a Rule, reference the javadoc at: PA_HOME/sdk/apidocs/com/
pingidentity/pa/sdk/policy/RuleInterceptor.html
• Add a Java class to /sdk/samples/Rules/src that implements
com.pingidentity.pa.sdk.policy.RuleInterceptor and is
annotated by com.pingidentity.pa.sdk.policy.Rule. A base class
com.pingidentity.pa.sdk.policy.RuleInterceptorBase is available to simplify implementing a
Rule.
• Add the class name of the new class to /sdk/samples/Rules/src/main/resources/META-INF/
services/com.pingidentity.pa.sdk.policy.RuleInterceptor. Execute maven install
on the Rules sample pom.
Implementation guidelines
The following sections provide specific programming guidance for developing custom interfaces. Note that the
information is not exhaustive – consult the Javadocs to find more details about interfaces discussed here as well as
additional functionality.
Important: A restart of PingAccess is required after the deployment of any custom plugins written in Java.
Logging
Use the SLF4j API for logging activities in your module. Documentation on using SLF4j is available on the SLF4j
website.
Lifecycle
The plugins and the implementation of a PluginConfiguration can be instantiated for a number of reasons and at many
times. For example, with a RuleInterceptor here is what happens before the RuleInterceptor is available to process
user requests:
• The Rule annotation on the implementation class of the RuleInterceptor is interrogated to determine which
PluginConfiguration instance will be instantiated.
• The following is performed on RuleInterceptor and PluginConfiguration. Which of these is handled first is not
defined.
• The bean will be provided to Spring for Autowiring.
• The bean will be provided to Spring for post construction initialization. (See PostConstruct)
• PluginConfiguration.setName(String) is called.
• PA attempts to map the incoming JSON configuration to the PluginConfiguration instance.
• ConfigurablePlugin.configure(PluginConfiguration) is called.
• Validator.validate(Object, Class[]) method is invoked and provided to the RuleInterceptor.
• The instance is then made available to service end user requests, such as
RequestInterceptor.handleRequest(com.pingidentity.pa.sdk.http.Exchange) and
ResponseInterceptor.handleResponse(com.pingidentity.pa.sdk.http.Exchange)
Injection
Before they are put into use, Rules, SiteAuthenticators, and their defined PluginConfigurations are passed through
Spring's Autowiring and initialization. To future-proof any code against changes in PingAccess, we recommend that
Spring not be used as a dependency. Use the annotation javax.inject.Inject for any injection.
Classes available for injection
Currently, injection is available for the following classes:
• com.pingidentity.pa.sdk.util.TemplateRenderer
Differences between Rules for Agents and Sites
Rules may be applied to applications associated with Agents or Sites. Some features of the SDK are not
available to rules that are applied to agents. Rules that use features only available to sites should be marked
as only applying to sites. This is done by setting the destination element of the rule annotation to the value
{RuleInterceptorSupportedDestination.Site}
Rules that apply only to agents are limited in the following ways:
• The handleResponse method is not called.
• The request body is not present.
• The Exchange.getDestinations list is empty and modifying the destination list has no effect.
| Addon SDK for Java | 157
As with rules that use features only available to sites, rules that only apply to agents should be marked
as only applying to agents. To do this, set the destination element of the rule annotation to the value
{RuleInterceptorSupportedDestination.Agent}.
| Agent SDK for Java | 158
Preface
This document provides technical guidance for using the PingAccess Agent SDK for Java. Developers can use this
guide along with the Javadocs for the Java Agent API and sample source code to implement the PingAccess Agent
Protocol in custom agents.
Intended audience
This guide is intended for application developers and system administrators responsible for implementing a Java
PingAccess Agent. The reader should be familiar with Java software-development principles and practices. It
describes the use of the SDK within a sample Java Servlet Filter.
Additional documentation
The Java Agent API Javadocs provide detailed reference information for developers. After unzipping the
pingaccess-agent-java-sdk-1.1.2.zip package, the Javadocs can be accessed with a web browser by
viewing the file <AGENT_SDK_JAVA_HOME>/apidocs/index.html.
Introduction
The PingAccess Agent SDK for Java provides an API and sample code to enable developers to build agents for Java-
based application and web servers. Agents provide access management features to their containing server by relying
on central PingAccess servers over the PingAccess Agent Protocol. The PingAccess Agent Protocol Specification is
available from the Ping Identity support portal.
The process used when a PingAccess Agent is added to the policy decision process is as follows:
1. The client accesses a resource. If the user is already authenticated, this process continues with step 5.
2. The agent asks PingAccess for instructions. PingAccess checks the URL policy and determines that it is a
protected resource. PingAccess then redirects the client to PingFederate to establish a session.
3. The user logs in, and PingFederate creates the session.
4. The client is then redirected back to the resource.
5. The agent asks PingAccess for instructions. PingAccess checks the URL policy and determines that it is a
protected resource. PingAccess then checks the session token and determines that it is valid.
6. If session revocation is enabled, PingAccess checks and updates the central session revocation list. If the session is
valid, the agent is instructed to set identity HTTP headers.
| Agent SDK for Java | 159
The PingAccess Agent SDK for Java consists of the following components:
Java Agent API (Java Agent)
pingaccess-agent-java-api-1.1.2.0.jar : The Java Agent API is a set of classes that implement
the PingAccess Agent Protocol.
PingAccess Agent SDK for Java
pingaccess-agent-java-sdk-1.1.2.zip : The PingAccess Agent SDK for Java package.
Servlet Filter Sample
<AGENT_SDK_FOR_JAVA_HOME>/sample : The Servlet Filter Sample demonstrates how the Java Agent
API integrates into a Java Servlet container. The provided source code, logging configuration and deployment
descriptor provide a functional example for how to integrate the Java Agent API into an existing web application.
The sample can be modified in place and recompiled using Maven to test customizations to the Servlet Filter
Sample code for your environment.
Note: This sample code demonstrates how to implement a servlet filter and has been qualified on
Apache Tomcat 7. The filter itself is production quality and can be used either as-is or as a starting point
for further development. Application configuration within the sample demonstrates how to associate
the filter with a servlet (namely, in web.xml). Further hardening of this file or the application server
configuration may be required.
If you need assistance using the PingAccess Agent SDK for Java, visit the Ping Identity Support Center
(ping.force.com/Support) to see how we can help you with your application. You may also engage the Ping Identity
Global Client Services team for assistance with developing customizations.
http://maven.pingidentity.com/release
If Internet access is unavailable, there are two other ways to reference the Java Agent API. First, once Apache Maven
is installed, install the Java Agent API into your local dependency repository by executing the following command:
Alternatively, update the dependency in your pom.xml to point to the local installation:
<dependency>
<groupId>com.pingidentity</groupId>
<artifactId>pingaccess-agent-java-api</artifactId>
<version>1.1.2.0</version>
<scope>system</scope>
<systemPath><AGENT_SDK_JAVA_HOME>/dist/pingaccess-agent-java-
api-1.1.2.0.jar</systemPath>
</dependency>
With either of these options, replace <AGENT_SDK_JAVA_HOME> with the absolute path to the unzipped
pingaccess-agent-java-sdk-1.1.2.0 directory.
export CATALINA_OPTS="-Dlog4j.configurationFile=<PATH_TO_TOMCAT_ROOT>/
webapps/ROOT/WEB-INF/logs/log4j2.xml -
Dserver.log.file=<PATH_TO_TOMCAT_ROOT>/webapps/ROOT/WEB-INF/logs/
server.log"
• For Windows:
set CATALINA_OPTS=="-Dlog4j.configurationFile=<PATH_TO_TOMCAT_ROOT>/
webapps/ROOT/WEB-INF/logs/log4j2.xml -
| Agent SDK for Java | 161
Dserver.log.file=<PATH_TO_TOMCAT_ROOT>/webapps/ROOT/WEB-INF/logs/
server.log"
Preface
This documentation provides technical guidance for using the PingAccess Agent SDK for C. Developers can use this
guide along with the API documentation for the SDK and sample source code to implement custom agents that use
the PingAccess Agent Protocol to integrate with a PingAccess policy server.
Intended Audience
This guide is intended for application developers and system administrators responsible for implementing a C-based
PingAccess agent. The reader should be familiar with C software development principles and practices. It describes
the use of the SDK within a sample Agent for Apache.
Additional documentation
The SDK documentation provides detailed reference information for developers. After unzipping the pingaccess-
agent-c-sdk-version.zip package, the API documentation can be accessed with a web browser by viewing
the file AGENT_SDK_C_HOME/apidocs/index.html. The current version of the API documentation may also
be found online at https://developer.pingidentity.com/content/dam/developer/documentation/pingaccess/agent-c-sdk/
latest/index.html
Introduction
The PingAccess Agent SDK for C provides an API and sample code to enable developers to build agents for C or C+
+-based application and web servers.
Supported platforms
• RedHat Enterprise Linux Server 6 (32 bit)
• RedHat Enterprise Linux Server 6 (64 bit)
• RedHat Enterprise Linux Server 7 (32 bit)
• RedHat Enterprise Linux Server 7 (64 bit)
• SUSE Linux Enterprise Server 11 SP4 (64 bit)
• SUSE Linux Enterprise Server 12 SP2 (64 bit)
The PingAccess Agent SDK for C provides an API and sample code to enable developers to build agents for C-based
application and web servers. Agents provide access management features to their containing server by relying on
central PingAccess servers over the PingAccess Agent Protocol. The PingAccess Agent Protocol Specification is
available from the Ping Identity support portal.
The process used when a PingAccess Agent is added to the policy decision process is as follows:
1. The client accesses a resource. If the user is already authenticated, this process continues with step 5.
2. The agent asks PingAccess for instructions. PingAccess checks the URL policy and determines that it is a
protected resource. PingAccess then redirects the client to PingFederate to establish a session.
3. The user logs in, and PingFederate creates the session.
4. The client is then redirected back to the resource.
5. The agent asks PingAccess for instructions. PingAccess checks the URL policy and determines that it is a
protected resource. PingAccess then checks the session token and determines that it is valid.
| Agent SDK for C | 163
6. If session revocation is enabled, PingAccess checks and updates the central session revocation list. If the session is
valid, the agent is instructed to set identity HTTP headers.
The PingAccess Agent SDK for C consists of the following components:
SDK (C Agent)
The SDK is a set of C header files that represent the interface to the library that implements the PingAccess
Agent Protocol.
C Agent libraries
The C libraries implement the PingAccess Agent Protocol. There are binaries for Red Hat Enterprise Linux 6/7 as
well as for Windows.
PingAccess Agent SDK for C API documentation
Each of the interfaces defined in the header files is fully documented.
Apache Agent Sample
<AGENT_SDK_FOR_C_HOME>/sample : The Apache Agent Sample demonstrates how the SDK integrates
into Apache as an Apache module that is integrated with the Apache request processing workflow. The provided
source code and module configuration provide a functional example for how to integrate the SDK into an existing
web application. The sample can be modified in-place and recompiled using make to test customizations to the
Sample code for your environment.
Note: This sample code demonstrates how to implement the PingAccess Agent as an Apache module
and has been qualified in the following environments:
• Red Hat Enterprise Linux 6 (RHEL6), 64-bit
• Red Hat Enterprise Linux 7 (RHEL7), 64-bit
The Apache Agent itself is production-quality and can be used either as-is or as a starting point for further
development. While Ping Identity provides this as a sample, the only versions that are fully supported in
production are the precompiled versions available from the Ping Identity download site.
The sample includes instructions for how to configure the sample as a PingAccess Agent to protect websites
within its scope. Note that further hardening of the Apache server configuration or of the sample configuration
file may be required.
If you need assistance using the PingAccess Agent SDK for C, visit the Ping Identity Support Center (ping.force.com/
Support) to see how we can help you with your application. You may also engage the Ping Identity Professional
Services team for assistance with developing customizations.
/sample
Sample source code for an agent for Apache. This sample agent uses the SDK, and includes a sample
configuration file for Apache to use the sample agent to enforce authentication and access control policies.
General changes
Prevent modification to Request in Response chain
Starting in PingAccess 5.0, any modifications made to a Request or its header fields during response processing will
now result in a warning log message and the modification operation being ignored. Previously, PingAccess would log
a warning message about the modification but still allow the modification operation to complete.
Retrieving Key Pair and Trusted Certificate Group configuration data
In the previous version of the SDK, a SDK plugin accessed the configuration data of a Key Pair or Trusted Certificate
Group configured via the Administrative API by annotating a field in the plugin's PluginConfiguration class with a
JsonDeserialize annotation, specifying the appropriate custom deserializer from the SDK. For example:
@JsonDeserialize(using = TrustedCertificateGroupDeserializer.class)
Collection<X509Certificate> certificateGroup;
}
In the current version of the SDK, this mechanism has changed to be less error-prone as well as to provide access to
more properties of the Key Pairs and Trusted Certificate Groups. The previous Configuration class should be ported
to the following:
TrustedCertificateGroupModel certificateGroup;
}
| Addon SDK for Java migration guide | 166
The KeyPairModel#getPrivateKeyEntry method provides access to the KeyStore.PrivateKeyEntry object for the
corresponding Key Pair in the administrative configuration. The TrustedCertificateGroupModel#getCertificates
method provides access to the Collection of X509Certificate objects in the corresponding Trusted Certificate Group in
the administrative configuration. Refer to the JavaDoc for each of these classes for more information.
Related to this change, the provided implementations of ConfigurationModelAccessor, PrivateKeyAccessor and
TrustedCertificateGroupAccessor, have been updated to use these new classes. Both classes have also been moved to
new packages. PrivateKeyAccessor has also been renamed to KeyPairAccessor.
BEFORE:
import com.pingidentity.pa.sdk.accessor.PrivateKeyAccessor;
import com.pingidentity.pa.sdk.accessor.TrustedCertificateGroupAccessor;
AFTER:
import
com.pingidentity.pa.sdk.accessor.certgroup.TrustedCertificateGroupModel;
import com.pingidentity.pa.sdk.accessor.keypair.KeyPairAccessor;
.map(KeyPairModel::getPrivateKeyEntry)
.orElse(null);
}
If setup correctly, this logic allows javax.validation.Constraint annotations to be used to declare the validation to be
applied to fields in a PluginConfiguration implementation, ensuring the configuration was valid as well as providing
validation error message to PingAccess to provide to administrators using the Administrative API or UI.
However, if the ConfigurablePlugin#configure method needed to post-process the specified PluginConfiguration
instance, the method needed to duplicate all the validation declared on the fields of the PluginConfiguration.
To remove the need for this duplication of validation logic, PingAccess will now validate the PluginConfiguration
instance with a javax.validation.Validator prior to passing the instance to the ConfigurablePlugin#configure method.
Further, the ConfigurablePlugin no longer needs to annotate the field used to hold the PluginConfiguration instance.
The field is still necessary to implement the ConfigurablePlugin#getConfiguration method.
The following example ConfigurablePlugin implementation demonstrates this change:
@Override
public void configure(Configuration configuration) throws
ValidationException
{
this.configuration = configuration;
// With the previous version of the SDK, these assertions were not
// guaranteed to be true, despite the javax.validation.Constraint
// annotations enforcing these conditions.
//
// In the current version of the SDK, these assertions are guaranteed
// to be true because they are enforced by the
javax.validation.Constraint
// annotations on the fields in the PluginConfiguration class, and
the
// PluginConfiguration validation is performed before invoking the
// configure method.
//
// The end result is that plugins can remove duplicated validation
// logic from the configure method if further post-processing of the
// configuration needs to be performed.
assert(configuration.getAttributeName() != null);
assert(configuration.getAttributeName().length() > 0);
assert(configuration.getAttributeName().length() <= 16);
assert(configuration.getAttributeValue() != null);
@Override
public Configuration getConfiguration()
{
return configuration;
}
@NotNull
private String attributeValue;
com.pingidentity.pa.sdk.http
com.pingidentity.pa.sdk.http.Body
The Body interface has changed to require an explicit read of data before invoking methods to obtain that data.
Previously, methods to obtain the data would result in an implicit read of the data. The following code examples
illustrate this change in semantics.
As the updated JavaDoc for the Body interface indicates, plugins should avoid interrogating a Body object unless
absolutely necessary because reading a Body object's data into memory can impact the scalability of PingAccess.
As plugin code is updated, evaluate whether the Body object needs to be used by the plugin.
Using the Body#read method
BEFORE:
AFTER:
BEFORE:
AFTER:
AFTER:
body.write(bodyTransferrer);
AFTER:
This functionality is no longer supported. To obtain the content of the Body, read the content into memory using
the Body#read method and then invoke Body#getContent or Body#newInputStream.
Using the Body#getLength method
BEFORE:
AFTER:
AFTER:
This functionality is no longer supported. This method used to provide access to the content as it appeared on
the wire, which required complicated handling if the body content used a chunked Transfer-Encoding. Use
Body#getContent instead.
com.pingidentity.pa.sdk.http.BodyFactory
Using the BodyFactory#continuousBody method
BEFORE:
AFTER:
BEFORE:
AFTER:
A Body instance can no longer be created from an InputStream using the BodyFactory class. Instead,
a plugin should read the contents of the InputStream into a byte array and provide the byte array to
BodyFactory#createInMemoryBody.
com.pingidentity.pa.sdk.http.Constants
The constants available from this class have been removed from the SDK. Plugins using these constants should
maintain their own constants with the needed values.
| Addon SDK for Java migration guide | 171
com.pingidentity.pa.sdk.http.Exchange
A handful of methods have been removed from the Exchange.
Further, the mechanism for storing data on the Exchange via properties has been enhanced to make it easier to
write type-safe code when working with Exchange properties.
Using the Exchange#getCreationTime method
BEFORE:
AFTER:
NOTE: If a Calendar object is not required, consider using the Instant object returned from the getCreationTime
method directly instead of converting it into a Calendar object.
Using the Exchange#getDestinations method
BEFORE:
AFTER:
This functionality is no longer supported. Consider using the Exchange#getTargetHosts method to obtain similar
information from the Exchange.
Using the Exchange#getOriginalHostHeader method
BEFORE:
AFTER:
This functionality is no longer supported. Consider using the Exchange#getUserAgentHost method to obtain
similar information from the Exchange. The getUserAgentHost method leverages the PingAccess HTTP requests
configuration to determine the Host header value sent by the user agent.
Using the Exchange#getOriginalHostHeaderHost method
BEFORE:
AFTER:
This functionality is no longer supported. Consider using the Exchange#getUserAgentHost method to obtain
similar information from the Exchange. The getUserAgentHost method leverages the PingAccess HTTP requests
configuration to determine the Host header value sent by the user agent.
Using the Exchange#getOriginalHostHeaderPort method
BEFORE:
AFTER:
| Addon SDK for Java migration guide | 172
This functionality is no longer supported. Consider using the Exchange#getUserAgentHost method to obtain
similar information from the Exchange. The getUserAgentHost method leverages the PingAccess HTTP requests
configuration to determine the Host header value sent by the user agent.
Using the Exchange#getOriginalRequestBaseUri method
BEFORE:
AFTER:
This functionality is no longer supported. A possible replacement is as follows:
AFTER:
This functionality is no longer supported. Properties should be obtained individually from the Exchange.
Using the Exchange#getRequestBaseUri method
BEFORE:
AFTER:
This functionality is no longer supported. A possible replacement is as follows:
AFTER:
This functionality is no longer supported. A possible replacement is as follows:
AFTER:
| Addon SDK for Java migration guide | 173
The User interface is no longer supported. Use the Identity interface instead. It can be retrieved via the
Exchange#getIdentity method.
Using the Exchange#setUser method
BEFORE:
AFTER:
This functionality is no longer supported. The identity associated with an Exchange cannot be replaced.
Using the Exchange#setSourceIp method
BEFORE:
AFTER:
This functionality is no longer supported. This value cannot be changed.
Using the Exchange#setProperty method
BEFORE:
AFTER:
See the JavaDoc for ExchangeProperty for instructions on creating an ExchangeProperty object.
Using the Exchange#getProperty method
BEFORE:
AFTER:
NOTE: Exchange#getProperty now returns an Optional object instead of the Object directly.
com.pingidentity.pa.sdk.http.Header
This deprecated class has been replaced by the Headers interface. A Headers object can be created via a
HeadersFactory obtained from the ServiceFactory#headersFactory method. The majority of methods on Header
have counterparts on the Headers interface. See the JavaDoc for the Headers interface for more information.
com.pingidentity.pa.sdk.http.HeaderField
This class is now final and cannot be extended.
Constructing a HeaderField
BEFORE:
AFTER:
NOTE: Parsing an HTTP header field line can be error prone, consider if the plugin can be avoid having to parse
an HTTP header field line.
Using the HeaderField#setHeaderName method:
BEFORE:
AFTER:
This functionality is no longer supported. A HeaderField's name is set upon construction and cannot be changed.
Using the HeaderField#getApproximateSize method:
BEFORE:
AFTER:
| Addon SDK for Java migration guide | 175
This method has been removed. The value returned by the method can still be computed:
int approximateSize = 2 * (4 +
field.getHeaderName().toString().length() +
field.getValue().length());
com.pingidentity.pa.sdk.http.Headers
A few methods on the Headers interface have been updated to use the Instant class, instead of Date.
Using the Headers#getDate method
BEFORE:
AFTER:
AFTER:
AFTER:
Locale.ENGLISH);
headers.setLastModified(format.format(date));
}
AFTER:
com.pingidentity.pa.sdk.http.HeadersFactory
Using the HeadersFactory#createFromRawHeaderFields method
BEFORE:
AFTER:
This functionality is no longer supported. Consider if the plugin can create HeaderFields directly and utilize the
HeadersFactory#create method.
com.pingidentity.pa.sdk.http.HttpStatus
The HttpStatus enum was converted to a final class. Common HttpStatus instances are defined as constants on
HttpStatus.
Using the HttpStatus#getLocalizationKey method
BEFORE:
AFTER:
This functionality is no longer supported. Instead, a HttpStatus contains a LocalizedMessage instance that
encapsulates the localization of the status message for use in error templates.
com.pingidentity.pa.sdk.http.MimeType
The constants available in this class are now available as constant MediaType instances in the class
com.pingidentity.pa.sdk.http.CommonMediaTypes.
com.pingidentity.pa.sdk.http.MediaType
This class is now final and cannot be extended.
Constructing a MediaType
BEFORE:
AFTER:
com.pingidentity.pa.sdk.http.Message
A number of methods have been removed from the Message interface.
Using the Message#getBodyAsStream method
BEFORE:
AFTER:
This functionality is no longer supported. However, the following code snippet could be used to maintain
semantics of the old method.
While this snippet maintains semantics, it is recommended that a plugin propagate errors as an AccessException
instead of a RuntimeException.
Using the Message#getCharset method
BEFORE:
AFTER:
This functionality is no longer supported. However, the following code snippet could be used to maintain
semantics of the old method.
While this snippet maintains semantics, a plugin should consider how to handle the case where a Charset is not
specified by a Message's header fields. Assuming a Charset of UTF-8 could lead to issues in some cases.
Using the Message#getHeader method
BEFORE:
AFTER:
This functionality is no longer supported. Instead, use Message#getHeaders and the Headers interface instead of
Header.
Using the Message#setHeader method
BEFORE:
AFTER:
This functionality is no longer supported. Instead, use Message#setHeaders and the Headers interface instead of
Header.
Using the Message#isDeflate method
BEFORE:
AFTER:
This method has been removed. However, the value can still be computed with the following code snippet:
List<String> contentEncodingValues =
message.getHeaders().getContentEncoding();
boolean deflate = contentEncodingValues.stream().anyMatch(v ->
v.equalsIgnoreCase("deflate"))
&& contentEncodingValues.size() == 1;
AFTER:
This method has been removed. However, the value can still be computed with the following code snippet:
List<String> contentEncodingValues =
message.getHeaders().getContentEncoding();
boolean gzip = contentEncodingValues.stream().anyMatch(v ->
v.equalsIgnoreCase("gzip"))
&& contentEncodingValues.size() == 1;
AFTER:
This method has been removed. However, the value can still be computed with the following code snippet:
BEFORE:
AFTER:
The method has been removed. However, the value can still be computed with the following code snippet:
AFTER:
This functionality is no longer supported. A Request attached to an Exchange can no longer be completely
replaced, but individual components can be replaced, such as the method, uri, headers and body. A Response
attached to an Exchange can be replaced by using Exchange#setResponse.
Using the Message#setVersion method
BEFORE:
AFTER:
This functionality is no longer supported. The version of a Message cannot be changed.
Using the Message#write method
BEFORE:
AFTER:
This functionality is no longer supported. However, the following code snippet can be used to perform the
equivalent operation:
output.write(message.getStartLine().getBytes(StandardCharsets.ISO_8859_1));
| Addon SDK for Java migration guide | 180
output.write(message.getHeaders().toString().getBytes(StandardCharsets.ISO_8859_1));
output.write("\r\n".getBytes(StandardCharsets.ISO_8859_1));
output.write(body.getContent());
output.flush();
}
com.pingidentity.pa.sdk.http.Method
The Method interface has been converted to a final class. Additionally, the related Methods enum has been
merged into the Method class. The Method class provides common Method instances as class-level constants.
Obtaining a common Method instance
BEFORE:
AFTER:
AFTER:
com.pingidentity.pa.sdk.http.Request
A few methods have been removed from the Request interface.
Using the Request#getPostParams method
BEFORE:
AFTER:
AFTER:
This method has been removed from the Request interface. However, the value can still be calculated using the
following code snippet:
boolean multipartFormPost =
request.getMethod() == Method.POST
&& headers.getContentType() != null
&& headers.getContentType().getBaseType().equals("multipart/form-
data")
&& headers.getContentType().getParameter("boundary") != null;
com.pingidentity.pa.sdk.http.ResponseBuilder
A handful of methods were removed from ResponseBuilder. Additionally, a handful of methods have changed
their semantics, particularly those that included an HTML message payload. See the updated JavaDoc for
ResponseBuilder for more info.
Using the ResponseBuilder#badRequestText method
BEFORE:
AFTER:
.contentType(CommonMediaTypes.TEXT_PLAIN)
.body(message)
.build();
NOTE: This approach does not localize the response body. Using a TemplateRenderer is recommended instead.
Using the ResponseBuilder#contentLength method
BEFORE:
Response response =
ResponseBuilder.newInstance().contentLength(length).build();
AFTER:
This functionality is no longer supported. Consider using one of the ResponseBuilder#body methods instead of
explicitly setting the content length. This ensures that the body content of the Response aligns with the Content-
Length header field.
Using the ResponseBuilder#continue100 method
BEFORE:
AFTER:
Response response =
ResponseBuilder.newInstance(HttpStatus.CONTINUE).build();
AFTER:
.contentType(CommonMediaTypes.TEXT_PLAIN)
.body(HttpStatus.FORBIDDEN.getMessage())
.build();
NOTE: This approach does not localize the response body. Using a TemplateRenderer is recommended instead.
Using the ResponseBuilder#forbiddenWithoutBody method
BEFORE:
AFTER:
Response response =
ResponseBuilder.newInstance(HttpStatus.FORBIDDEN).build();
BEFORE:
AFTER:
Response response =
ResponseBuilder.newInstance(HttpStatus.FORBIDDEN).build();
NOTE: In the original method, the String message parameter was not used.
Using the ResponseBuilder#htmlMessage method
BEFORE:
AFTER:
This functionality is no longer supported. Plugins that used this method will need to construct the HTML message
without this method. Consider using the TemplateRenderer utility class in place of this method.
Using the ResponseBuilder#internalServerError method
BEFORE:
AFTER:
Response response =
ResponseBuilder.internalServerError().body(message).build();
NOTE: This approach does not localize the response body. Using a TemplateRenderer is recommended instead.
Using the ResponseBuilder#internalServerErrorWithoutBody method
BEFORE:
Response response =
ResponseBuilder.internalServerErrorWithoutBody().build();
AFTER:
AFTER:
Response response =
ResponseBuilder.newInstance(HttpStatus.INTERNAL_SERVER_ERROR).build();
AFTER:
Response response =
ResponseBuilder.newInstance(HttpStatus.NO_CONTENT).build();
AFTER:
AFTER:
Response response =
ResponseBuilder.serviceUnavailable().body(message).build();
NOTE: This approach does not localize the response body. Using a TemplateRenderer is recommended instead.
Using the ResponseBuilder#serviceUnavailableWithoutBody method
BEFORE:
Response response =
ResponseBuilder.serverUnavailableWithoutBody().build();
AFTER:
Response response =
ResponseBuilder.newInstance().status(HttpStatus.OK).build();
AFTER:
AFTER:
com.pingidentity.pa.sdk.http.Response
A few methods were removed from the Response interface.
Using the Response#isRedirect method
BEFORE:
AFTER:
response.setStatusCode(HttpStatus.OK.getCode());
| Addon SDK for Java migration guide | 185
AFTER:
response.setStatus(HttpStatus.OK);
response.setStatusMessage(HttpStatus.OK.getMessage());
AFTER:
response.setStatus(HttpStatus.OK);
com.pingidentity.pa.sdk.identity
com.pingidentity.pa.sdk.identity.Identity
The getTokenExpiration method was updated to use an Instant instead of Date.
Using the Identity#getTokenExpiration method
BEFORE:
AFTER:
com.pingidentity.pa.sdk.identity.OAuthTokenMetadata
The OAuthTokenMetadata methods now use an Instant instead of a Date.
Using the OAuthTokenMetadata#getExpiresAt method:
BEFORE:
AFTER:
AFTER:
com.pingidentity.pa.sdk.identitymapping.header
ClientCertificateMapping has been removed from the SDK, as it was not required to create an IdentityMappingPlugin
implementation.
Plugins utilizing this class should create their own version of this class.
| Addon SDK for Java migration guide | 186
com.pingidentity.pa.sdk.policy
com.pingidentity.pa.sdk.policy.AccessExceptionContext
The nested Builder class has been removed from AccessExceptionContext and instead AccessExceptionContext
is a builder, that can be initially created with the new AccessExceptionContext#create method.
The LocalizedMessage interface has been introduced to simplify the configuration of a localized message for
use in an error template. A LocalizedMessage has three implementations provided in the SDK: FixedMessage,
BasicLocalizedMessage and ParameterizedLocalizedMessage. See the following code examples for more
information on using these new classes.
Constructing an AccessExceptionContext:
BEFORE:
{
return AccessExceptionContext.builder()
.cause(cause)
.httpStatus(httpStatus)
.exceptionMessage(httpStatus.getMessage())
.errorDescription(httpStatus.getLocalizationKey())
.errorDescriptionIsKey(true)
.errorDescriptionSubstitutions(new
String[0])
.build();
}
AFTER:
.exceptionMessage(httpStatus.getMessage())
.errorDescription(httpStatus.getLocalizedMessage());
}
BEFORE:
.errorDescriptionSubstitutions(substitutions)
.build();
}
AFTER:
return AccessExceptionContext.create(httpStatus)
.errorDescription(localizedMessage);
}
BEFORE:
AFTER:
BEFORE:
.httpStatusDescription(httpStatus.getLocalizationKey())
.httpStatusDescriptionIsKey(true)
.templateFile("template.html")
.contentType("text/html");
| Addon SDK for Java migration guide | 188
AFTER:
.errorDescription(httpStatus.getLocalizedMessage());
}
NOTE: this example demonstrates that it is no longer possible to set a template file and its associated
content type on an AccessExceptionContext. To generate an error response from a template file, use the
TemplateRenderer class. See the JavaDoc for the TemplateRenderer class for more information.
com.pingidentity.pa.sdk.policy.AccessException
The changes to AccessExceptionContext apply to the creation of AccessException because the creation of an
AccessException requires an AccessExceptionContext.
In addition to these changes, obtaining information from AccessException has also changed. See the code
examples below for more information.
Finally, AccessException no longer derives from IOException and derives directly from Exception instead.
Constructing an AccessException:
BEFORE:
AFTER:
.exceptionMessage(errorDescription)
.cause(throwable)
.errorDescription(templateMessaage));
}
BEFORE:
AFTER:
.exceptionMessage(errorDescription)
.errorDescription(templateMessage));
}
BEFORE:
AFTER:
.exceptionMessage(errorDescription)
.errorDescription(templateMessage));
}
BEFORE:
AFTER:
.exceptionMessage(errorDescription)
.errorDescription(templateMessage)
.cause(throwable));
}
BEFORE:
.httpStatusMessage("Forbidden")
.build());
}
AFTER:
AFTER:
This functionality is no longer supported. The information that used to be provided by the
AccessExceptionContext is now provided directly by an AccessException.
Using the AccessException#getHttpStatusCode method
BEFORE:
AFTER:
AFTER:
BEFORE:
accessException.setHttpStatusCode(statusCode);
AFTER:
This functionality is no longer supported. The status code associated with an AccessException is fixed once it is
constructed.
Using the AccessException#setHttpStatusMessage method
BEFORE:
accessException.setHttpStatusMessage(statusMessage);
AFTER:
This functionality is no longer supported. The status message associated with an AccessException is fixed once it
is constructed.
com.pingidentity.pa.sdk.policy.RuleInterceptor
The handleRequest and handleResponse methods on a RuleInterceptor no longer throw an IOException. Instead,
they throw an AccessException, which no longer derives from IOException.
Accounting for the RuleInterceptor#handleRequest method signature change
BEFORE:
@Override
public Outcome handleRequest(Exchange exchange) throws IOException
{
Outcome outcome = applyPolicy(exchange);
return outcome;
}
AFTER:
@Override
public Outcome handleRequest(Exchange exchange) throws AccessException
{
Outcome outcome = applyPolicy(exchange);
return outcome;
}
@Override
applyPolicyToResponse(exchange.getResponse());
AFTER:
@Override
| Addon SDK for Java migration guide | 192
com.pingidentity.pa.sdk.policy.error.InternalServerErrorCallback
This class has been removed. Use LocalizedInternalServerErrorCallback instead.
com.pingidentity.pa.sdk.services
com.pingidentity.pa.sdk.services.ServiceFactory
This class is now final and cannot be extended.
com.pingidentity.pa.sdk.siteauthenticator
com.pingidentity.pa.sdk.siteauthenticator.SiteAuthenticatorInterceptor
This interface is no longer a RequestInterceptor or ResponseInterceptor, but it still defines the handleRequest and
handleResponse methods:
@Override
public Outcome handleRequest(Exchange exc)
throws RuntimeException, IOException, InterruptedException
{
// Site authenticator implementation //
return Outcome.CONTINUE;
}
AFTER:
@Override
public void handleRequest(Exchange exc) throws AccessException
{
// Site authenticator implementation //
}
@Override
public void handleResponse(Exchange exc) throws IOException
{
// Site authenticator response implementation //
}
| Addon SDK for Java migration guide | 193
AFTER:
@Override
public void handleResponse(Exchange exc) throws AccessException
{
// Site authenticator response implementation //
}
com.pingidentity.pa.sdk.ui
com.pingidentity.pa.sdk.ui.ConfigurationType
The deprecated PRIVATEKEY enum value has been removed. Instead use a ConfigurationType
of ConfigurationType#SELECT and specify the PrivateKeyAccessor.class instance to
ConfigurationBuilder#dynamicOptions or UIElement#modelAccessor.
com.pingidentity.pa.sdk.user
com.pingidentity.pa.sdk.user.User
This class has been removed from the SDK. Use the Identity interface instead. An instance of Identity can be
retrieved from the Exchange, similar to the User interface.
com.pingidentity.pa.sdk.util
com.pingidentity.pa.sdk.util.TemplateRenderer
The semantics of the renderResponse method have changed so it produces a Response and does not have any
side-effects on the specified parameters.
Using the TemplateRenderer#renderResponse method:
BEFORE:
AFTER:
Performance tuning
While PingAccess has been engineered as a high performance engine, its default configuration may not match your
deployment goals nor the hardware you have available. Consult the following sections to optimize various aspects of
a PingAccess deployment for maximum performance.
Info: An additional document related to performance, the PingAccess Capacity Planning Guide, is also
available to customers as a performance data reference. This document is available from the Customer Portal
(ping.force.com/Support).
Java tuning
Tuning the Java heap
One of the most important tuning options you can apply to the Java Virtual Machine (JVM) is to configure how
much heap (memory for runtime objects) to use. The JVM grows the heap from a specified minimum to a specified
maximum. If you have sufficient memory, best practice is to “fix” the size of the heap by setting minimum and
maximum to the same value. This allows the JVM to reserve its entire heap at startup, optimizing organization and
eliminating potentially expensive resizing.
By default, PingAccess fixes the Java heap at 512 megabytes (MB). This is a fairly small footprint and not optimal
for supporting higher concurrent user loads over extended periods of activity. If you expect your deployment of
PingAccess to serve more than 50 concurrent users (per PingAccess node if deploying a cluster), we recommend that
you increase the heap size.
Linux tuning
This section describes tuning recommendations for the Linux operating system environment. Implement these
recommendations to prevent deployment issues, particularly in high capacity environments. The following settings
will increase the performance and capacity of the networking (particularly TCP) stack and file descriptor usage,
respectively, enabling PingAccess to handle a high volume of concurrent requests.
Network/TCP tuning:
Add/Modify the following entries in /etc/sysctl.conf
##TCP Tuning##
# Controls the use of TCP syncookies (default is 1)
# and increase the number of outstanding syn requests allowed.
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=8192
where pingAccessAccount is the user account used to run the PingAccess java process (or * for all users).
Windows tuning
This section describes tuning recommendations for the Windows (version 7 and up) operating system environment.
Implement these recommendations to prevent deployment issues, particularly in high capacity environments. The
following settings will increase the performance and capacity of network (specifically the TCP socket) connectivity,
enabling PingAccess to handle a high volume of concurrent requests.
Increase the number of available ephemeral ports
1. View ephemeral ports: netsh int ipv4 show dynamicportrange tcp
2. Increase ephemeral ports: netsh int ipv4 set dynamicport tcp start=1025 num=64510
3. Reboot the machine.
4. View and confirm updated port range: netsh int ipv4 show dynamicportrange tcp
Reduce socket TIME_WAIT delay
1. Click Start > Run, type regedit and click OK to open the Registry Editor.
2. Navigate to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip
\Parameters.
3. Create a new DWORD value (32 bit) and provide the name TcpTimedWaitDelay.
4. Set a decimal value of 30.
5. Reboot the machine.
| Performance tuning guide | 197
Concurrent Mark Sweep (CMS) • Best for heaps larger than 4GB Set to ‑XX:
with at least 8 CPU cores +UseConcMarkSweepGC in jvm-
• Mostly a concurrent collector memory.options.
• Some stop-the-world phases
• Non-Compacting
• Can experience expensive, single
threaded, full collections due to
heap fragmentation
Garbage First (G1) • Best for heaps larger than 6GB Set to ‑XX:+UseG1GC in jvm-
with at least 8 CPU cores memory.options. Also disable
• Combination concurrent and #Minimim heap size and
parallel collector with small stop- #Maximum heap size tuning.
the-world phases Explicit sizing adversely affects
pause time goal. To disable,
• Long-term replacement for CMS
comment the lines out in the script.
collector (does not suffer heap
fragmentation like CMS)
Acceptor threads
PingAccess uses a pool of threads to respond to HTTP/S requests made to the TCP port(s) in use. This applies to
both administrative and runtime engine listening ports. Acceptor threads read user requests from the administrative or
runtime port and pass the requests to worker threads for processing. For performance, only one acceptor thread need
be used in most situations. On larger multiple CPU core machines, more acceptors may be used.
To modify, open the run.properties file located in the conf directory of your PingAccess deployment and
specify the number of acceptors you want to use on the following lines:
admin.acceptors=N
engine.http.acceptors=N
agent.http.acceptors=N
Where N represents the number of acceptor threads.
| Performance tuning guide | 198
Worker threads
PingAccess uses a pool of worker threads to process user requests and a separate pool to process agent requests.
Worker threads receive user requests from Acceptor threads, process them, respond back to the client and then return
to the pool for reuse. By default, PingAccess starts with a minimum of five worker threads and grows as needed
(unbounded by default). You can define the minimum and maximum number of Worker threads in each pool by
adding and/or modifying properties found in the run.properties file.
To set values, open the run.properties file located in the conf directory of your PingAccess deployment. If the
properties do not exist in the file add them.
engine.httptransport.coreThreadPoolSize=N
engine.httptransport.maxThreadPoolSize=N
and
agent.httptransport.coreThreadPoolSize=N
agent.httptransport.maxThreadPoolSize=N
Info: We strongly recommended that you understand the limits and tuning of the server application being
proxied. Setting the Max Connections value too low may create a bottleneck to the proxied site, setting the
value too high (or unlimited) may cause PingAccess to overload the server.
See Sites documentation for information on setting Max Connections.
Logging
Although logging is handled by a high performance, asynchronous logging framework, it is more efficient to the
system overall to log the minimum amount of information required. We highly recommend that you review the
section of the documentation for logging and adjust the level to the lowest, most appropriate level to suit your needs.
Auditing
As with logging, auditing is provided by the same high performance, asynchronous logging framework. Furthermore,
auditing messages can be written to a database instead of flat files, decreasing file I/O. If you do not require auditing
for interactions with a Resource or between PingAccess and PingFederate, it is more efficient to disable audit
logging. However, if you do require auditing services and have access to a Relational Database Management System
(RDBMS), we recommend auditing to a database. You will see a decrease in disk I/O, which may result in increased
performance depending on database resources.
Agent tuning
Several properties in the agent.properties file can be configured for increased performance. See the agent
documentation for Apache or IIS for more information on agent configuration and setting properties.
Max Connections
Connections from the agent to PingAccess are limited by
agent.engine.configuration.maxConnections. The default is set to 10. In certain situations it can
be advantageous to increase the number of connections. In the event that all connections in the pool are in use, a
requesting thread waits for one to become available. Assuming that response time to PingAccess is sufficiently fast,
the time spent waiting for a connection is likely to be less than if the system becomes overloaded. Note that this is
the maximum number of connections per worker process, and not simply the total number of workers the agent has
access to. Setting agent.engine.configuration.maxConnections value too low may create a bottleneck
to PingAccess, and setting the value too high may cause PingAccess to become overloaded.
Max Tokens
By default, the maximum number of cached tokens in an agent is unlimited. In certain situations it can be
advantageous to limit the size of the cache for the agent, as a smaller cache has a smaller memory footprint, freeing
up memory available to the application for servicing requests. However, when the token cache limit is reached, the
least recently used token-policy mapping will be removed from the cache. If that token-policy mapping happens to
be needed again, the agent will have a cache miss, resulting in the need to obtain a new token-policy mapping from
PingAccess.
| Clustering reference guide | 200
Clustering
PingAccess can be configured in a clustered environment to provide higher scalability and availability for critical
services. While it is important to understand that there may be tradeoffs between availability and performance,
PingAccess is designed to operate efficiently in a clustered environment.
PingAccess clusters are made up of three types of nodes:
Administrative Console
Provides the administrator with a configuration interface
Replica Administrative Console
Provides the administrator with the ability to recover a failed administrative console using a manual failover
procedure.
Clustered Engine
Handles incoming client requests and evaluates policy decisions based on the configuration replicated from the
administrative console
Any number of clustered engines can be configured in a cluster, but only one administrative console and one replica
administrative console can be configured in a cluster.
Configuration information is replicated to all of the clustered engine nodes and the replica administrative node from
the administrative console. State information replication is not part of a default cluster configuration, but some state
information can be replicated using PingAccess subclusters.
PingAccess Subclusters
Subclusters are a method to provide better scaling of very large PingAccess deployments by allowing multiple engine
nodes in the configuration to share certain information. A load balancer is placed in front of each subcluster in order
to distribute connections to the nodes in the subcluster.
Subclusters serve three purposes:
• Providing fault-tolerance for mediated tokens if a cluster node is taken offline.
• Reducing the number of STS transactions with PingFederate when the front-end load balancer does not provide a
sticky session.
• Ensure rate limits are enforced properly if the front-end load balancer does not provide a sticky session.
If token mediation and rate limiting are not used in your environment, subclustering is not necessary.
Info: This cache can be tuned using the EHCache Configuration Properties listed in the Configuration
Properties documentation.
| Clustering reference guide | 201
PingAccess provides clustering features that allow a group of PingAccess servers to appear as a single system. When
deployed appropriately, server clustering can facilitate high availability of critical services. Clustering can also
increase performance and overall system throughput. It is important to understand, however, that availability and
performance are often at opposite ends of the deployment spectrum. Thus, you may need to make some configuration
tradeoffs that balance availability with performance to accommodate specific deployment goals.
In a cluster, you can configure each PingAccess engine, or node, as an administrative console, a replica administrative
console, or a runtime engine in the run.properties file. Runtime engines service client requests, while the
console server administers policy and configuration for the entire cluster (via the administrative console). The replica
administrative console provides a backup copy of the information on the administrative node in the event of a non-
recoverable failure of the administrative console node. A cluster may contain one or more runtime nodes, but only
one console node and only one replica console node. Server-specific configuration data is stored in the PingAccess
administrative console server in the run.properties file. Information needed to bootstrap an engine is stored in the
bootstrap.properties file on each engine.
Table 1: bootstrap.properties
At startup, a PingAccess engine node in a cluster checks its local configuration and then makes a call to the
administrative console to check for changes. How often each engine in a cluster checks the console for changes is
configurable in the engine run.properties file.
Configuration information is replicated to all engine nodes. By default, engines do not share runtime state. For
increased performance, you can configure engines to share runtime state by configuring cluster interprocess
communication using the run.properties file.
| Clustering reference guide | 202
Info: Runtime state clustering consists solely of a shared cache of security tokens acquired from the
PingFederate STS for Token Mediation use cases using the Token Mediator Site Authenticator.
Engine nodes include a status indicator that indicates the health of the node and a Last Updated field that indicates
the date and time of the last update. The status indicator can be green (good status), yellow (degraded status), or red
(failed status).
The status is determined by using the value for admin.polling.delay as an interval to measure health:
Green (good status):
The replica administrative node contacted the primary administrative node on the last pull request.
Yellow (degraded status):
The replica administrative node contacted the primary administrative node between 2 and 10 intervals.
Red (failed status):
The replica administrative node has either never contacted the primary administrative node, or it has been more
than 10 intervals since the nodes communicated.
Note: If a replica administrative node is added after the cluster has been deployed, it will be necessary to
update the configuration for each engine node when the replica administrative node is added.
4. Navigate to Settings > Security > Key Pairs and create a new key pair to assign to the ADMIN listener. The key
pair needs to be valid for both the primary and replica administrative nodes.
Tip: If a replica administrative node is not defined during the initial cluster configuration, you might still
opt to define a subject alternative name for a future replica administrative node. This avoids having to
reissue the keys when adding the replica administrative node in the future.
5. Open conf/run.properties in an editor and change the pa.operational.mode value to
CLUSTERED_CONSOLE.
6. Navigate to Settings > Networking > Listeners and assign the newly created key pair to the CONFIG QUERY
listener.
Note: If clusterconfig.enabled is set to false in run.properties, the key pair needs to be
assigned to the ADMIN listener instead. This property is set to false when a cluster has been upgraded
from PingAccess 3.2 or earlier.
7. Restart PingAccess on the administrative node.
Perform steps 8-10 on the replica administrative node, if one has been configured.
8. Unzip replica1_data.zip in the PA_HOME directory.
9. Open conf/run.properties in an editor and change the pa.operational.mode value to
CLUSTERED_CONSOLE_REPLICA
10. Start PingAccess on the replica administrative node.
For each engine node, perform steps 11-16.
11. Navigate to Settings > System > Clustering and click Add Engine.
12. After defining the engine's parameters, click Save & Download to download the engine configuration zip file.
13. Copy engine_name_data.zip to the engine node.
14. On the engine node, unzip engine_name_data.zip in the PA_HOME directory.
15. On the engine node, open conf/run.properties in an editor and change the pa.operational.mode
value to CLUSTERED_ENGINE.
16. Start PingAccess on the engine node.
Navigate to Settings > System > Clustering to check your cluster's status. If everything is configured properly, the
cluster engine nodes and optional replica administrative node should show a green status icon, indicating that the
cluster is operational.
You can optionally configure each node to run PingAccess as a service set to automatically run when the node is
started. For more information about configuring PingAccess as a service, see installation documentation for more
information.
3. If applicable, specify an HTTPS Proxy for the engine. Click Create to create an HTTPS proxy.
4. Click Save.
5. Specify the Replica Administrative Node Trusted Certificate to use for cases where a TLS-terminating network
appliance, such as a load balancer, is placed between the engines and the admin node.
6. Click Save & Download to download the <replicaname>_data.zip file for the replica administrative
node. PingAccess automatically generates and downloads a public and private key pair into the
bootstrap.properties file for the node. The Public Key is indicated on this screen.
7. Copy the downloaded file to the replica administrative node's PA_HOME directory and unzip it.
8. Conditional: If the Replica Administrative Node is running on a Linux host, execute the command chmod 400
conf/pa.jwk.
9. Edit PA_HOME/conf/run.properties on the replica administrative node and change the
pa.operational.mode value to CLUSTERED_CONSOLE_REPLICA .
10. Start the replica node.
11. You can verify replication has completed by monitoring the PA_HOME/log/pingaccess.log file and
looking for the message "Configuration successfully synchronized with administrative node".
Configure an engine
For each engine:
1. Click Settings > System > Clustering
2. Click Add Engine to configure a new engine.
3. Enter a Name for the engine. Special characters and spaces are allowed.
4. Enter a Description of the engine.
5. If applicable, specify an HTTP Proxy for the engine. Click Create to create an HTTP proxy.
6. If applicable, specify an HTTPS Proxy for the engine. Click Create to create an HTTPS proxy.
7. Specify the Engine Trusted Certificate to use for cases where a TLS-terminating network appliance, such as a
load balancer, is placed between the engines and the admin node.
8. Click Save & Download to generate and download a public and private key pair into the
<enginename>_data.zip file for the engine. This file is prepended with the name you give the engine.
Depending on your browser configuration, you may be prompted to save the file.
9. Copy the zip file to the PA_HOME directory of the corresponding engine in the cluster and unzip it. The engine
uses these files to authenticate and communicate with the administrative console.
Info: Generate a new key for an engine at any time by clicking Save & Download and unzipping the
<enginename>_data.zip archive on the engine to replace the files with a new set of configuration
files. When that engine starts up and begins using the new files, PingAccess deletes the old key.
10. Conditional: On Linux systems running the PingAccess engine, change the permissions on the extracted pa.jwk
to mode 400 by executing the command chmod 400 conf/pa.jwk after extracting the zip file.
11. Start each engine.
Info: For information on configuring engine to share information with each other in a cluster, see
Configure a PingAccess cluster on page 202.
Edit an engine
1. Navigate to Settings > System > Clustering.
2. Expand the engine you want to edit, then click .
3. Edit the engine Name or Description, as appropriate.
4. If a new public key is needed, click Save & Download
5. If a new public key is not needed, click Save.
Remove an engine
| Clustering reference guide | 207
Deployment guide
Deployed at the perimeter of a protected network between browsers and protected Web-based applications,
PingAccess Gateway performs the following actions:
• Receives inbound calls requesting access to Web applications. Web Session protected requests contain a
previously-obtained PA token in a cookie derived from the user's profile during an OpenID Connect based login at
PingFederate.
• Evaluates application and resource-level policies and validates the tokens in conjunction with an OpenID Connect
Policy configured within PingFederate.
• Acquires the appropriate target security token (Site Authenticators) from the PingFederate STS or from a cache
(including attributes and authorized scopes) should a Web application require identity mediation.
• Makes authorized requests to the sites where the Web applications reside and responses are received and
processed.
• Relays the responses on to the browsers.
The following sections describe sample Proof of Concept and Production architectures for a WAM use case
deployment.
• WAM Gateway POC Deployment Architecture
• WAM Gateway Production Deployment Architecture
infrastructure. Pressure from an ever-expanding mobile device and API economy can lead developers to hastily
design and expose APIs outside the network perimeter. Standardized API access management leads to a more
consistent, centrally-controlled model that ensures existing infrastructure and security policies are followed, thereby
safeguarding an organization’s assets.
PingAccess Gateway sits at the perimeter of a protected network between mobile, in-browser, or server-based client
applications and protected APIs and performs the following actions:
• Receives inbound API calls requesting protected applications. OAuth-protected API calls contain previously-
obtained access tokens retrieved from PingFederate acting as an OAuth Authorization Server.
• Evaluates application and resource-level policies and validates access tokens in conjunction with PingFederate.
• Acquires the appropriate target site security token (Site Authenticators) from the PingFederate STS or from a
cache (including attributes and authorized scopes) should an API require identity mediation.
• Makes authorized requests to the APIs and responses are received and processed.
• Relays the responses on to the clients.
The following sections describe sample Proof of Concept and Production architectures for an API access management
use case deployment.
• API Access Management POC Deployment Architecture
• API Access Management Production Deployment Architecture
Next steps
Once you complete the above configuration settings, your next steps are similar for all use cases:
| Deployment guide | 211
• Configure Sites and Agents to define the target applications to be protected. Sites may need Site Authenticators to
define the credentials the site expects for access control.
• Configure Applications and Resources to define the assets you wish to allow clients to access.
• Create Policies for the defined applications and resources to protect them.
Step Description
Configure the connection to the PingFederate. PingAccess uses PingFederate to manage web session
and authentication.
Configure the OpenID Connect Relying Party Client for The client must be registered with PingFederate and the
PingAccess. client credentials configured in PingAccess to identify
PingAccess when requesting authentication for users
trying to access Web applications.
Configure Web session details to enable protection of Configures settings for secure Web sessions such as
Web Resources. timeout values, cookie parameters, and cryptographic
algorithms.
Generate or Import Key Pairs and configure HTTP Defines the certificates and keys used to secure access
Listeners. to the PingAccess administrative console and secure
incoming HTTPS requests at runtime.
Set up your cluster for high availability. Facilitates high availability of critical services, and
increases performance and overall system throughput.
Add trusted CA certificates. Defines trust to certificates presented during outbound
secure HTTPS connections.
Create a trusted certificate group. Provides a trusted set of anchor certificates for use when
authenticating outbound secure HTTPS connections.
Define virtual servers for protected Resources. Allows one server to share PingAccess Resources
without requiring all Sites on the server to use the same
host name. If SNI is available (Java 8), specific key pairs
can be assigned to virtual hosts.
Step Description
Configure the connection to the PingFederate. PingAccess uses PingFederate to manage web session
and authentication.
| Deployment guide | 212
Step Description
Configure the OpenID Connect Relying Party Client for The client must be registered with PingFederate and the
PingAccess. client credentials configured in PingAccess to identify
PingAccess when requesting authentication for users
trying to access Web applications.
Configure Web session details to enable protection of Configures settings for secure Web sessions such as
Web Resources. timeout values, cookie parameters, and cryptographic
algorithms.
Generate or Import Key Pairs and configure HTTP Defines the certificates and keys used to secure access
Listeners. to the PingAccess administrative console and secure
incoming HTTPS requests at runtime.
Set up your cluster for high availability. Facilitates high availability of critical services, and
increases performance and overall system throughput.
Add trusted CA certificates. Defines trust to certificates presented during outbound
secure HTTPS connections.
Create a trusted certificate group. Provides a trusted set of anchor certificates for use when
authenticating outbound secure HTTPS connections.
Define virtual servers for protected Resources. Allows one server to share PingAccess Resources
without requiring all Sites on the server to use the same
host name. If SNI is available (Java 8), specific key pairs
can be assigned to virtual hosts.
Step Description
Configure the connection to the PingFederate OAuth PingAccess uses this connection and credentials to
Authorization Server. validate incoming Access Tokens for securing API calls.
Configure the Resource Server OAuth Client. The client must be registered with PingFederate and
the client credentials configured in PingAccess to
authenticate PingAccess when validating incoming
Access Tokens.
Generate or Import Key Pairs and configure HTTP Defines the certificates and keys used to secure access
Listeners. to the PingAccess administrative console and secure
incoming HTTPS requests at runtime.
Set up your cluster for high availability. Facilitates high availability of critical services, and
increases performance and overall system throughput.
Add trusted CA certificates. Defines trust to certificates presented during outbound
secure HTTPS connections.
Create a trusted certificate group. Provides a trusted set of anchor certificates for use when
authenticating outbound secure HTTPS connections.
Define virtual servers for protected applications. Allows one server to share PingAccess Resources
without requiring all Sites on the server to use the same
host name. If SNI is available (Java 8), specific key pairs
can be assigned to virtual hosts
| Deployment guide | 213
Step Description
Generate or Import Key Pairs and configure HTTP Defines the certificates and keys used to secure access
Listeners. to the PingAccess administrative console and secure
incoming HTTPS requests at runtime.
Set up your cluster for high availability. Facilitates high availability of critical services, and
increases performance and overall system throughput.
Add trusted CA certificates. Defines trust to certificates presented during outbound
secure HTTPS connections.
Create a trusted certificate group. Provides a trusted set of anchor certificates for use when
authenticating outbound secure HTTPS connections.
Define virtual servers for protected Resources. Allows one server to share PingAccess Resources
without requiring all Sites on the server to use the same
host name.
PingAccess can be deployed using Agents, as a Gateway (or reverse proxy), or using a combination of both. Before
deciding on a deployment, it is important to understand the pros and cons of each deployment scenario and determine
how they impact your strategy.
Gateway
Pros:
• Fewer number of deployed components that require maintenance
• Independent of target application platform
• No impact on web/app server processing and performance
• Able to work with existing security token types (such as creating 3rd party WAM tokens)
Cons:
• Requires networking changes
• Requires strategy for securing direct access to backend web/app servers (network routing or service level
authentication)
| Deployment guide | 214
The following table describes the three zones within this proposed architecture.
| Deployment guide | 215
Zone Description
External Zone External network where incoming requests for Web
applications originate.
DMZ Externally exposing segment where PingAccess is
accessible to Web browsers. PingAccess is a standalone
instance in this environment, serving as both a runtime
and an administrative port.
Protected Zone Back-end controlled zone in which Sites hosting the
protected Web applications are located. All requests
to these Web applications must be designed to pass
through PingAccess. PingFederate is accessible to
Web browsers in this zone and is a standalone instance
in this environment, serving as both a runtime and
an administrative port. PingFederate requires access
to identity management infrastructure in order to
authenticate users (depicted by the icon in the diagram).
The following table describes the three zones within this proposed architecture.
Zone Description
External Zone External network where incoming requests for Web
applications originate.
DMZ Externally exposing segment where PingAccess is
accessible to Web browsers. A minimum of two
PingAccess engine nodes will be deployed in the
DMZ to achieve high availability. Depending on your
scalability requirements, more nodes may be required.
Protected Zone Back-end controlled zone in which Sites hosting the
protected Web applications are located. All requests
to these Web applications must be designed to pass
through PingAccess. PingFederate is accessible to Web
browsers in this zone and requires access to identity
management infrastructure in order to authenticate
users (depicted by the icon in the diagram). A minimum
of two PingFederate engine nodes will be deployed
in the protected zone. Administrative nodes for both
PingAccess and PingFederate may be co-located on a
single machine to reduce hardware requirements.
| Deployment guide | 217
The following table describes the three zones within this proposed architecture.
Zone Description
External Zone External network where incoming requests for Web
applications originate.
DMZ Externally exposed segment where application Web
server is accessible to Web clients. PingAccess Agent
is deployed as a plugin on this Web server. The agent
interacts with PingAccess Policy Server in the Protected
Zone. PingFederate is deployed as a standalone instance
in this environment because during user authentication
clients interact with PingFederate. PingFederate requires
access to Identity Management Infrastructure in order to
authenticate users.
Protected Zone Back-end controlled zone with no direct access by
Web clients. PingAccess Policy Server is deployed in
this zone. PingAccess interacts with PingFederate in
the DMZ Zone. Identity Management Infrastructure is
deployed in this zone.
| Deployment guide | 218
The following table describes the three zones within this proposed architecture.
Zone Description
External Zone External network where incoming requests for Web
applications originate.
DMZ Externally exposed segment where (possibly multiple)
application Web servers are accessible to Web clients.
PingAccess Agent is deployed as a plugin on these Web
servers. Agents interact with PingAccess Policy Server in
the Protected Zone.
Protected Zone Back-end controlled zone with no direct access by
Web clients. PingAccess Policy Server is deployed in
a cluster in this zone with a separate administrative
engine. PingFederate is also deployed in this zone in
a cluster with its own separate administrative engine.
PingFederate needs access to the Identity Management
Infrastructure in order to authenticate users. Since
during user authentication Web clients need to interact
with PingFederate directly, a reverse proxy such as
| Deployment guide | 219
Zone Description
PingAccess Gateway is required to forward client
requests through the DMZ. This aspect is not shown in
the diagram.
The following table describes the three zones within this proposed architecture.
Zone Description
External Zone External network where incoming API requests
originate.
DMZ Externally exposing segment where PingAccess is
accessible to API clients. PingAccess is a standalone
instance in this environment, serving as both a runtime
and an administrative port.
Protected Zone Back-end controlled zone in which Sites hosting
the protected APIs are located. All requests to these
APIs must be designed to pass through PingAccess.
PingFederate is accessible to API clients in this zone and
| Deployment guide | 220
Zone Description
is a standalone instance, serving as both a runtime and an
administrative port.
The following table describes the three zones within this proposed architecture.
The following table describes the three zones within this proposed architecture.
Zone Description
External Zone External network where incoming requests originate.
DMZ Externally exposing segment where PingAccess is
accessible to clients. PingFederate and PingAccess are
standalone instances in this environment, serving as both
runtime and administrative ports.
| Deployment guide | 222
Zone Description
Protected Zone Contains back-end Sites audited and proxied through
PingAccess. Audit results are sent to an audit repository
or digested by reporting tools. Many types of audit
repository/tools are supported such as SIEM/GRC,
Splunk, database, and flat files.
The following table describes the three zones within this proposed architecture.
Tip: When storing passwords in run.properties, we strongly recommend you obfuscate them using the
obfuscate.bat or obfuscate.sh utility to mask the password value. This utility is located in the
PA_HOME/bin folder.
account.locking.max.consecutive.failures
Defines the maximum number of failed login attempts before locking the account when using basic authentication
in the administrative UI or administrative REST APIs. The default value is 3.
account.locking.max.lockout.period
Defines, in minutes, the amount of time to lock an account out from the administrative interfaces after exceeding
the account.locking.max.consecutive.failures. The default value is 1.
admin.acceptors
Defines the number of admin acceptor threads used to establish connections. The default value is 1.
admin.auth
Overrides the administrator authentication method. For example, if SSO Authentication is enabled and is
somehow misconfigured, this property can be used to bypass the database configuration and force the use of
Basic Authentication. Default value is default.
admin.backlog
Defines the maximum queue length for incoming admin connection indications. The default value is 512.
admin.bindAddress
Defines the IP address that admin.port will bind to. This is typically required on multihomed servers having
multiple IP addresses. The default value of 0.0.0.0 means that the port will bind to all of the server's IP
addresses.
admin.header.Strict-Transport-Security
Sets the parameters for the Strict-Transport-Security response header sent to the browser when an administrator is
interacting with the Admin UI.
admin.header.X-Content-Type-Options
Sets the parameters for the X-Content-Type-Options response header sent to the browser when an admin is
interacting with the Admin UI.
admin.header.X-Frame-Options
Sets the parameters for the X-Frame-Options HTTP response header sent to the browser when an admin is
interacting with the Admin UI.
admin.header.X-XSS-Protection
Sets the parameters for the X-XSS-Protection HTTP response header sent to the browser when an admin is
interacting with the Admin UI.
admin.headers
Additional headers added to responses from the PingAccess Administrator Console and the Administrator API
interface. Header values are defined using the admin.header prefix.
admin.httptransport.coreThreadPoolSize
Defines the number of threads to keep in the admin transport pool, even if they are idle. The default value is 5.
| Configuration file reference guide | 225
admin.httptransport.ioThreads
Defines the number of I/O threads for the admin host. A value of 0 is used to denote that PingAccess should
automatically calculate the appropriate number of I/O threads for the host. The default value is 0.
admin.httptransport.maxThreadPoolSize
Defines the maximum number of threads for the admin transport pool. The default value is -1, which denotes no
limit.
admin.httptransport.socketTimeout
Defines, in milliseconds, the admin socket timeout. The default value is 30000.
admin.max.request.bodylength
Defines, in megabytes, the maximum body length for a request to the administrative API endpoint. The default
value is 15.
admin.polling.delay
Defines, in milliseconds, how long after the initial query to the administrative console that the replica
administrative node begins querying for configuration information. The default is every 2000 milliseconds.
admin.polling.initialdelay
Defines, in milliseconds, how long after the replica administrative node starts up before it begins to poll the
administrative console for configuration information. The default is 500.
admin.port
Defines the TCP port on which the PingAccess administrative console runs. Default is 9000.
admin.reuseAddress
When enabled, allows a process to bind to a port which remains in a TIME_WAIT state for the admin transport.
The default value is true.
admin.ssl.ciphers
Defines the type of cryptographic ciphers available for use with administrative HTTPS ports.
admin.ssl.protocols
Defines the protocols for use with administrative HTTPS ports.
admin.ui.max.sessions
Defines the maximum number of sessions for the admin UI when admin SLO is not enabled.
agent.assets.header.X-Frame-Options
Sets the parameters for the X-Frame-Options HTTP response header sent to the browser via the agent when
responding to a request for an asset used by a PingAccess template.
agent.assets.headers
Additional headers added to responses from PingAccess Agents. Header values are defined using the
agent.assets.header prefix.
agent.authz.header.required
Defines whether PingAccess server should authenticate agent requests using agent name and shared secret in the
vnd-pi-authz header. Default value is true. Setting this to false is useful for POCs and/or debugging.
agent.cache.invalidated.response.duration
Defines the duration in seconds that application configuration changes are sent by PingAccess server to agents
using the vnd-pi-cache-invalidated header in agent responses for the changed application. Default value is 900.
agent.default.token.cache.ttl
Defines, in seconds, the time to live for cached agent tokens.
agent.error.header.X-Frame-Options
Sets the parameters for the X-Frame-Options HTTP response header sent to the browser via the agent when
responding with a PingAccess error template.
| Configuration file reference guide | 226
agent.error.headers
Additional headers added to error responses from PingAccess Agents. Header values are defined using the
agent.error.header prefix.
agent.http.backlog
Defines the maximum queue length for incoming admin connection indications. The default value is 512.
agent.http.bindAddress
Defines the address from which an engine listens for agent requests.
agent.http.enabled
Defines whether a STANDALONE or CLUSTERED_ENGINE node listens for agent requests on the port
defined by the agent.http.port setting. Default is true.
agent.http.port
Defines the TCP port on which the engine listens for agent requests. Default is 3030.
agent.http.reuseAddress
When enabled, allows a process to bind to a port which remains in a TIME_WAIT state for the agent transport.
The default value is true.
agent.http.secure
Defines whether the engine is using HTTPS for agent requests. Default is true.
agent.httptransport.coreThreadPoolSize
Defines the number of threads to keep in the agent transport pool, even if they are idle. The default value is 5.
agent.httptransport.ioThreads
Defines the number of I/O threads for the agent host. A value of 0 is used to denote that PingAccess should
automatically calculate the appropriate number of I/O threads for the host. The default value is 0.
agent.httptransport.maxThreadPoolSize
Defines the maximum number of threads for the agent transport pool. The default value is -1, which denotes no
limit.
agent.httptransport.socketTimeout
Defines, in milliseconds, the agent socket timeout. The default value is 30000.
agent.ssl.ciphers
Defines the type of cryptographic ciphers available for use with agent HTTPS ports.
agent.ssl.protocols
Defines the protocols used for communication with agent HTTPS ports.
as.ssl.ciphers
Defines the type of cryptographic ciphers available for use with authorization server HTTPS ports.
as.ssl.protocols
Defines the protocols used for communication with authorization server HTTPS ports.
client.ioThreads
Defines the number of threads for client connections to backend sites. A value of 0 means there is no limit. The
default value is 0.
clusterconfig.acceptors
Defines the number of cluster configuration acceptor threads used to establish connections. The default value is
1.
clusterconfig.backlog
Defines the maximum queue length for incoming cluster configuration connection indications. The default value
is 512.
clusterconfig.bindAddress
Defines the optional address used for cluster configuration.
| Configuration file reference guide | 227
clusterconfig.enabled
When enabled, uses the cluster coonfiguration port for cluster replication. When disabled, the admin port is used
for cluster configuration replication. The default value is true.
Note: This parameter is set to false by the PingAccess Upgrade Utility after a PingAccess cluster is
upgraded from a version earlier than 4.0.
clusterconfig.httptransport.coreThreadPoolSize
Defines the number of threads to keep in the cluster configuration transport pool, even if they are idle. The default
value is 5.
clusterconfig.httptransport.ioThreads
Defines the number of I/O threads for the cluster configuration host. A value of 0 is used to denote that
PingAccess should automatically calculate the appropriate number of I/O threads for the host. The default value is
0.
clusterconfig.httptransport.maxThreadPoolSize
Defines the maximum number of threads for the cluster configuration transport pool. The default value is -1,
which denotes no limit.
clusterconfig.httptransport.socketTimeout
Defines, in milliseconds, the cluster configuration socket timeout. The default value is 30000.
clusterconfig.port
Defines the optional port used for cluster configuration.
clusterconfig.reuseAddress
When enabled, allows a process to bind to a port which remains in a TIME_WAIT state for the cluster
configuration transport. The default value is true.
clusterconfig.secure
When enabled, enables SSL communications for the cluster configuration port. The default value is true.
clusterconfig.ssl.ciphers
Defines the type of cryptographic ciphers available for use with HTTPS ports in a clustered configuration.
clusterconfig.ssl.protocols
Defines the protocols used for communication with HTTPS ports in a clustered configuration.
enable.detailed.heartbeat.response
When enabled, this setting enables a customizable heartbeat response to be returned. When disabled, the heartbeat
endpoint returns a 200 OK response. The default value is false.
engine.admin.configuration.audience
Defines the audience used for cluster authentication. This property must be set to the same value on all nodes in a
PingAccess cluster. The default value is PingAccessAdminServer.
engine.assets.header.X-Frame-Options
Sets the parameters for the X-Frame-Options HTTP response header sent to the browser via the engine when
responding to a request for an asset used by a PingAccess template.
engine.assets.headers
Additional headers added to responses from the PingAccess Engine. Header values are defined using the
engine.assets.header prefix.
engine.error.header.X-Frame-Options
Sets the parameters for the X-Frame-Options HTTP response header sent to the browser via the engine when
responding with a PingAccess error template.
engine.error.headers
Additional headers added to error responses from the PingAccess Engine. Header values are defined using the
engine.error.header prefix.
| Configuration file reference guide | 228
engine.http.acceptors
Defines the number of engine acceptor threads used to establish connections. The default value is 1.
engine.http.backlog
Defines the maximum queue length for incoming engine connection indications. The default value is 512.
engine.http.bindAddress
Defines the address for an engine in a clustered environment.
engine.http.enabled
Defines whether a STANDALONE or CLUSTERED_ENGINE node listens for requests on the ports defined by
the Engine Listeners. Default is true.
engine.http.reuseAddress
When enabled, allows a process to bind to a port which remains in a TIME_WAIT state for the engine transport.
The default value is true.
engine.httptransport.coreThreadPoolSize
Defines the number of threads to keep in the engine transport pool, even if they are idle. The default value is 5.
engine.httptransport.ioThreads
Defines the number of I/O threads for the engine host. A value of 0 is used to denote that PingAccess should
automatically calculate the appropriate number of I/O threads for the host. The default value is 0.
engine.httptransport.maxThreadPoolSize
Defines the maximum number of threads for the engine transport pool. The default value is -1, which denotes no
limit.
engine.httptransport.socketTimeout
Defines, in milliseconds, the engine socket timeout. The default value is 30000.
engine.polling.delay
Defines, in milliseconds, how long after the initial query to the administrative console that the engine begins
querying for configuration information. The default is every 2000 milliseconds.
engine.polling.initialdelay
Defines, in milliseconds, how long after the engine starts up before it begins to poll the administrative console for
configuration information. The default is 500.
engine.ssl.ciphers
Defines the type of cryptographic ciphers available for use with engine HTTPS ports.
engine.ssl.protocols
Defines the protocols used with engine HTTPS ports.
engine.websocket.maxConnections
Sets the maximum number of allowed web socket connections. Default is -1 (unlimited).
pa.admin.test.connections
A boolean property that allows the PingAccess admin UI to make HTTP calls to validate that it can reach
PingFederate and sites when the user configures them.
pa.admin.user.password.error.message
Defines the message returned when password complexity is not satisfied. The default value is Password
must be at least 8 characters in length, contain one upper-case letter, one
lower-case letter and one digit..
pa.admin.user.password.regex
Defines the regex that controls password complexity for the Administration Console. The default value is
((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,20})
| Configuration file reference guide | 229
pa.auditing.unknown.resource
When set to true, this setting causes PingAccess to audit requests for resources that are requested but not
mapped to an Application or Resource. This setting can be used to help troubleshoot resource definition issues.
The default is false.
pa.backup.filesToKeep
Defines the number of backup files to preserve when the Administrator authenticates to PingAccess. The default
value is 25.
pa.cluster.auth.pwd
Sets the key that each engine in the cluster must use to authenticate when joining the group. This prevents
unauthorized engines from joining a cluster. This key should be treated as a strong key rather than as a human-
readable password value. (Values: any string or blank)
Important: If pa.cluster.encrypt is true, pa.cluster.auth.pwd must not be blank.
pa.cluster.bind.address
Defines the IP address to which you bind the TCP or UDP listener. The default is 127.0.0.1.
pa.cluster.bind.port
The port associated with the bind-address property above. The default is 7610. Whether this is a TCP or UPD
port depends on the value configured for the pa.cluster.interprocess.communication property
(see above).
pa.cluster.encrypt
Indicates whether to encrypt network traffic sent between engines in a cluster. (Values: true or false
[default])
Important: If pa.cluster.encrypt is true, pa.cluster.auth.pwd must not be blank.
pa.cluster.failure.detection.bind.port
Indicates the bind port of a server socket that is opened on the given engine and used by other engines as
part of one of the cluster's failure-detection mechanisms. This port is bound to the address determined by
pa.cluster.bind.address. The default is 7710. Whether this is a TCP or UDP port depends on the value
configured for the pa.cluster.interprocess.communication property (see above).
pa.cluster.interprocess.communication
Defines how the JGroups cluster communicates. none (the default): Indicates that no communication is
configured between servers in the cluster. udp: Indicates that the cluster uses Multicast communications to
send and receive information to and from multiple servers at once. tcp: Indicates that the cluster uses Unicast
communications to send and receive information to and from individual servers one at a time.
pa.cluster.mcast.group.address
Defines the IP address shared among engines in the same cluster for UDP multicast communication; required
when the interprocess communication mode is set to udp. (Range: 224.0.0.0 to 239.255.255.255;
note that some addresses in this range are reserved for other purposes.) This property is not used for TCP. All
engines in a cluster must use the same address for this property and the port property below. The default value is
239.16.96.69.
pa.cluster.mcast.group.port
Defines the UDP port associated with the pa.cluster.mcast.group.address property above. The
default value is 7611.
pa.cluster.serverstate.replicationIntervalMilliseconds
Defines, in milliseconds, how often Rate Limiting metadata is replicated within a subcluster. The default value is
1000.
pa.cluster.serverstate.staleEntryEvictionIntervalSeconds
Defines, in seconds, how often a PingAccess engine scans the Rate Limiting metadata to evaluate metadata to be
removed from the cache, based on the pa.cluster.serverstate.timeToIdleSeconds value. The
default value is 60.
| Configuration file reference guide | 230
pa.cluster.serverstate.timeToIdleSeconds
Defines, in seconds, how long metadata for the Rate Limiting rule is maintained by a PingAccess Engine after its
last use. The default value is 86400.
pa.cluster.tcp.discovery.initial.hosts
Designates the initial hosts to be contacted for group membership information when discovering and joining the
group; required when the interprocess communication mode is set to tcp. The value is a comma-separated list of
host names (or IP addresses) and ports. For example, 127.0.0.1[7602].
pa.default.availability.ondemand.connectTimeout
Defines, in milliseconds, the amount of time to wait before trying to connect to the remote host. The default is
10000.
pa.default.availability.ondemand.failedRetryTimeout
Defines, in seconds, the amount of time to wait before retrying a failed host. The default is 60.
pa.default.availability.ondemand.maxRetries
Defines the maximum number of retries before marking the target system down. The default is 2.
pa.default.availability.ondemand.pooledConnectionTimeout
Defines, in milliseconds, the amount of time to wait before timing out the request for a pooled connection to the
target site. The default is -1.
pa.default.availability.ondemand.readTimeout
Defines, in milliseconds, the amount of time to wait before timing out the read response for a target site. The
default is -1.
pa.default.availability.ondemand.retryDelay
Defines, in milliseconds, the amount of time to wait after a timeout before retrying the host. The default is 250.
pa.default.contentRewrite.buffer.default
Defines, in bytes, the default buffer size when using a Rewrite Content rule to do a search and replace of content.
The default value is 2048.
pa.default.contentRewrite.buffer.min
Defines, in bytes, the minimum buffer size used when using a Rewrite content rule. The default value is 1024.
pa.default.limitRequestLine
Defines the maximum number of bytes to read from the request line. The default value is 8192.
pa.default.maxConnectionsPerSite
Defines the maximum number of connections PingAccess will open to the PingFederate Admin or Engine. A
value of -1 means there is no limit. The default is -1.
pa.default.maxHeaderCount
Defines the maximum number of headers to read from a request. The default value is 100.
pa.default.maxHttpHeaderSize
Defines the maximum number of bytes to read when reading headers. The default value is 8192.
pa.default.maxRequestBodySize
Defines the maximum number of bytes to read from a request body. The default value is 204800.
pa.default.session.cookie.attributes.httponly
Defines the default setting for the HTTP-Only Cookie setting for newly-created web sessions. The default value
is true.
pa.default.session.cookie.attributes.secure
Defines the default setting for the Secure Cookie setting for newly-created web sessions. The default value is
true.
pa.default.session.cookie.size.threshold
Defines, in bytes, the default maximum session cookie size. The default value is 4093.
| Configuration file reference guide | 231
pa.ehcache.AuthTokenCache.maxEntriesLocalHeap
Defines the maximum size of the JWT identity mapping token cache used when sending tokens to a protected
site. Default is 10000.
pa.ehcache.PATokenValidationCache.maxEntriesLocalHeap
Defines the maximum number of entries in the local heap for decryption of signed or encrypted PingAccess
tokens. The default is 10000.
pa.ehcache.PATokenValidationCache.timeToIdleSeconds
Defines, in seconds, the time an entry in the token validation cache can be idle before it is expired. The default is
120 seconds.
pa.ehcache.PATokenValidationCache.timeToLiveSeconds
Defines, in seconds, the maximum time an entry can be in the token validation cache. The default is 300 seconds.
pa.ehcache.PAWamUserAttributesCache.maxEntriesLocalHeap
Defines the maximum number of entries in the local heap for the PA WAM user attribute cache. The default is
10000.
pa.ehcache.PAWamUserAttributesCache.timeToIdleSeconds
Defines, in seconds, the time an entry in the PA WAM user attribute cache can be idle before it is expired. The
default is 120 seconds.
pa.ehcache.PAWamUserAttributesCache.timeToLiveSeconds
Defines, in seconds, the maximum time an entry can be in the PA WAM user attribute cache. The default is 300
seconds.
pa.ehcache.PFSessionValidationCache.maxEntriesLocalHeap
Defines the maximum number of entries in the local heap for the session validation cache. The default is 10000.
pa.ehcache.PFSessionValidationCache.timeToIdleSeconds
Defines, in seconds, the time an entry in the session validation cache can be idle before it is expired. The default
is 120 seconds.
pa.ehcache.PFSessionValidationCache.timeToLiveSeconds
Defines, in seconds, the maximum time an entry can be in the session validation cache. The default is 300
seconds.
pa.ehcache.PingFederateReferenceTokenCache.maxEntriesLocalHeap
Defines the maximum number of entries in the local heap for OAuth tokens. The default is 10000.
pa.ehcache.ServiceTokenCache.maxEntriesLocalHeap
Defines the maximum number of entries in the local heap for token mediation. The default is 10000.
pa.ehcache.ServiceTokenCache.timeToIdleSeconds
Defines, in seconds, the time an entry in the token mediation cache can be idle before it is expired. The default is
1800 seconds.
pa.ehcache.ServiceTokenCache.timeToLiveSeconds
Defines, in seconds, the maximum time an entry can be in the token mediation cache. The default is 14400
seconds.
pa.ehcache.SessionStateCache.maxEntriesLocalHeap
Defines the maximum size of the identity attribute entry cache when the user's attributes are stored on the server
rather than as a cookie. Default is 10000.
pa.interceptors.relativepath.decode.count
Number of times the URL is decoded to check for path traversal characters. The default is 3.
| Configuration file reference guide | 232
pa.interceptors.relativepath.decode.regex
Defines the accepted URL regex pattern that administrators can customize based on their needs. The default value
is:Defines the regular expression to use when checking for a valid path in an incoming request. The default value
is
[\\p{Po}\\p{N}\\p{Z}\\p{L}\\p{M}\\p{Zs}\\./_\\-\\\\~()\\{\\}\\[\\]]*
pa.interceptors.relativepath.strict
When this property is set to true, the incoming URL is matched with the whitelist pattern defined in
pa.interceptors.relativepath.decode.regex. All other request URLs are rejected. The default
value is false.
pa.jdbc.filepassword
Defines the password used to encrypt the PingAccess configuration database. Default is 2Access.
pa.jdbc.password
Defines the password for the database user of the PingAccess configuration database. Default is 2Access.
pa.jdbc.username
Defines the username for accessing the PingAccess configuration database. Default is sa.
pa.keystore.pw
Defines the password for the $JAVA_HOME/lib/security/cacerts keystore.
pa.localization.missing.message.placeholder
Defines the message used when an error message is unresolvable. An error will be logged.
pa.localization.resource.bundle.cache.enable
When set to false, allows language files in /conf/localization to be added or modified. When true, enables
caching of language files and properties.
pa.oidc.logout.redirect
A boolean property that defines whether or not to redirect the user to the token provider on logout. If true, the
user is redirected to the token provider.
pa.oidc.logout.redirectURI
The URI that a user gets sent to when they log out.
pa.oidc.post.preservation.encrypt
When enabled, POST data preserved through a redirection to PingFederate for authentication is encrypted on the
client to be used after the authentication is successful. The default value is false.
pa.oidc.post.preservation.maxRequestBodySize
Defines, in bytes, the maximum size of the post body for POST preservation. The default value is 8192.
pa.oidc.post.preservation.paramsAttributeName
Used to store the encoded or encrypted POST payload in the browser session storage during POST preservation.
pa.operational.mode
Controls the operational mode of the PingAccess server in a cluster. Valid values are:
• STANDALONE - Use this value for a standalone (unclustered) PingAccess instance that runs both the
administrative console and the engine. This is the default.
• CLUSTERED_CONSOLE - Use this value for the server instance you want to use as the administrative
console server.
Info: Only one engine in a cluster can run the administrative console.
• CLUSTERED_CONSOLE_REPLICA - Use this value for the server instance you want to use as the backup
administrative console server.
• CLUSTERED_ENGINE - Use this value to indicate a server engine.
| Configuration file reference guide | 233
Note:
Define the following Engine and Admin properties depending on what operational mode an engine is
using.
• Define all of the following Engine and Admin properties when pa.operational.mode is set to
STANDALONE.
• Define only the Admin properties when using CLUSTERED_CONSOLE or
CLUSTERED_CONSOLE_REPLICA mode.
• Define only the Engine properties when using CLUSTERED_ENGINE mode.
pa.uri.strict
When enabled, this setting requires the raw input URI be in strict compliance with the URI spec implemented by
java.net.URI when generating URIs. The default value is false.
pf.api.keepAliveTimeout
Defines, in milliseconds, the keep alive timeout for the PingFederate API. The default value is 30000.
pf.api.maxConnections
Defines the maximum number of connections PingAccess will establish to the PingFederate API endpoint. A
value of -1 means there is no limit. The default value is -1.
pf.api.maxRetries
Defines the maximum number of retries PingAccess attempts to make to the PingFederate server before delcaring
the server unavailable. The default value is 0.
pf.api.readTimeout
Defines, in milliseconds, how long the API will wait for responses from PingFederate when making calls to the
PingFederate Admin API. The default value is -1.
pf.api.socketTimeout
Defines, in milliseconds, the socket timeout for the PingFederate API endpoint. The default value is 5000.
pf.redirect.header.X-Frame-Options
Sets the parameters for the X-Frame-Options value that is sent when the user is redirected to PingFederate to
authenticate.
pf.redirect.headers
Additional headers added to the redirection response that sends the client to PingFederate for authentication.
Header values are defined using the pf.redirect.header prefix.
pf.ssl.ciphers
Defines the type of cryptographic ciphers available for use with PingFederate HTTPS ports.
pf.ssl.protocols
Defines the protocols used for communication with PingFederate HTTPS ports.
provider.ssl.ciphers
Defines the type of cryptographic ciphers available for use with Provider HTTPS ports.
provider.ssl.protocols
Defines the protocols used for communication with Provider HTTPS ports.
rule.error.headers
Additional headers added to responses that result from policy rule results. Header values are defined using the
rule.error.header prefix.
site.ssl.ciphers
Defines the type of cryptographic ciphers available for use with Site HTTPS ports.
site.ssl.protocols
Defines the protocols used for communication with Site HTTPS ports.
| Configuration file reference guide | 234
tls.default.cipherSuites
Defines the default set of ciphers used for HTTPS communication.
tls.default.protocols
Defines the default protocols used for HTTPS communication.
| PingAccess for AWS: Solution setup guide | 235
Introduction
This document provides the steps required to perform a variety of tasks related to setting up and configuring the
PingAccess for AWS solution. You can choose to deploy this solution in a demonstration environment that includes a
basic PingFederate instance or you can choose to deploy with an existing PingFederate instance.
Review the prerequisites prior to setting up this solution.
After you have deployed the solution, you can configure an application.
AWS prerequisites
Prior to beginning the setup of this solution, you must first satisfy some prerequisites. These prerequisites will ensure
that you have details and resources that are required for use in the setup phase. You may have one or more of these
items available as part of an existing deployment. Create the items you require.
Prerequisites include the following items:
1. Create an Amazon Web Services account on page 235
2. Choose your AMIs
3. Register domain name with Route53
4. Create a certificate
Create a certificate
During configuration, you will be asked to specify a Certificate ID. The certificate ID will map to a certificate issued
for the domain you will use, as specified by the Public hosted zone ID.
You can request a certificate or you can import a certificate using the AWS Certificate Manager.
To learn more about AWS Certificate Manager, including how to request or import a certificate, see AWS Certificate
Manager documentation.
| PingAccess for AWS: Solution setup guide | 237
Tip: When your certificate is available in Certificate Manager, make note of the associated ARN for the
certificate so you can use it during configuration.
Prerequisite: This procedure assumes you have downloaded and unzipped the automation ZIP file.
To create the PingAccess S3 bucket stack and required policies:
1. In the AWS console, navigate to Services > Management Tools > CloudFormation.
2. In the CloudFormation console, click Create Stack.
3. On the Select Template screen, click to select Upload a template to Amazon S3.
4. Click Choose File.
5. Navigate to the root of the unzipped archive, select the create-repo.yaml template, and click Open.
6. Click Next.
7. On the Specify Details screen, specify the Stack Name. For example, pingaccess-s3-stack.
8. Specify the Bucket Name. For example, pingaccess-s3-bucket.
Important: Bucket names must be unique across all of AWS. If your chosen bucket name is in use, the
template will fail.
9. Click Next.
10. On the Options screen, click Next.
11. On the Review screen, click to select the I acknowledge that AWS CloudFormation might create IAM
resources check box.
12. Click Create.
13. When stack creation is complete, view your S3 bucket at Services > Storage > S3.
• The PingAccess license file - Copy the PingAccess license file to s3-bucket-root/pingaccess/
licenses/pingaccess.lic.
• The PingFederate distribution package (Optional) - Copy the PingFederate 8.4.1 distribution package to s3-
bucket-root/pingfederate/dist/pingfederate-8.4.1.zip if you are deploying the basic
PingFederate instance for a demonstration environment.
• The PingFederate license file (Optional) - Copy the PingFederate license file to s3-bucket-root/
pingfederate/licenses/pingfederate.lic if you are deploying the basic PingFederate instance for
a demonstration environment.
• Additional library JAR files (Optional) - Copy any additional library JAR files (e.g. plugins) that should be
included with the installation to s3-bucket-root/automation-artifacts/<export-prefix>/
pingaccess/lib, where <export-prefix> is the Export name prefix you will supply to the automation
template.
Upload the directory structure to S3
1. In the AWS console, navigate to Services > Storage > S3.
2. Select the bucket you created.
3. Click Upload.
4. In a file window, select the contents of the s3-bucket-root folder. The contents include the following folders
and their contents:
• automation-artifacts
• instance-init-util
• internal-ca
• jre
• pingaccess
• pingfederate
5. Drag and drop the folders into the AWS Upload window.
6. Click Next (x3).
7. On the final screen, click Upload.
Configuration options
Number of public subnets specified The number of public subnet CIDR blocks to be
specified.
Public subnet CIDR blocks A comma-delimited list of public subnet CIDR blocks.
Must be unique subnets of VPC CIDR block.
Availability zones for public subnets A comma-delimited list of Availability Zones per
public subnet. At least two subnets must be in separate
Availability Zones.
Number of private subnets specified The number of private subnet CIDR blocks to be
specified.
Private subnet CIDR blocks A comma-delimited list of private subnet CIDR blocks.
Must be unique subnets of VPC CIDR block.
Availability zones for private subnets A comma-delimited list of Availability Zones per
private subnet. At least two subnets must be in separate
Availability Zones.
The allowed tenancy of instances launched into the The allowed tenancy of instances launched into the VPC.
VPC
Admin Node Private Host Name The admin node host name to associate with the internal
ELB.
Internal private domain name The domain name to use for the private hosted zone for
Ping Identity infrastructure internal DNS names. For
example: pingaccess.aws.
Public hosted zone ID The public hosted zone for use with external Route 53
DNS. You must have a public domain name registered
with Amazon Route53. For more information, see
Route53 documentation.
For example: my-aws-domain.com.
Admin public host name The fully qualified domain name to associate with the
internet facing ELB for the admin API. This should be
a unique subdomain of the specified Public hosted zone
ID. This entry must be followed by a period.
For example: admin.my-aws-domain.com.
Applications public host name The fully qualified domain name to associate with the
internet facing ELB for the engines. This should be a
unique subdomain of the specified Public hosted zone
ID. This entry must be followed by a period.
For example: app.my-aws-domain.com.
PingAccess Admin API port The TCP/IP port of the PingAccess Admin API listener.
Use the default of 9000.
PingAccess configuration query port The TCP/IP port of the Admin Config Query listener.
Use the default of 9090.
SSH port The TCP/IP port for the VPC bastion host and
PingAccess instance SSH access. Use the default of 22.
| PingAccess for AWS: Solution setup guide | 241
EC2 keypair name The EC2 Key Pair for SSH access to the VPC bastion
host and PingAccess instances. Use the key pair you
created or imported.
Bastion host AMI ID The Amazon Linux AMI ID for the bastion host.
Bastion host instance type The EC2 instance type for the bastion host. Use the
default of t2.micro or higher.
Admin AMI ID The Amazon Linux or RHEL 7.4 AMI ID for Admin
instances.
Admin instance type The EC2 instance type for Admin nodes. Use the default
of m3.large or higher.
Administrative node root volume name The root volume device name for the specified Admin
AMI. Commonly, Amazon Linux uses /dev/xvda and
RHEL 7.4 uses /dev/sda1.
Administrative node root volume size The size, in GB, for the root volume on the Admin
instance. Use the default of 15 or higher.
Engine AMI ID The Amazon Linux or RHEL 7.4 AMI ID for Engine
node instances.
Engine instance type The EC2 instance type for Engine nodes. Use the default
of m3.large or higher.
Engine node root volume name The root volume device name for the specified Engine
AMI. Commonly, Amazon Linux uses /dev/xvda and
RHEL 7.4 uses /dev/sda1.
Engine node root volume size The size, in GB, for the root volume on Engine
instances. Use the default of 16 or higher.
Engine node root volume IOPS The provisioned IOPS for the root volume on Engine
instances. The maximum ratio of IOPS to volume size is
50:1.
Admin API certificate ID (ARN) The ARN of the certificate to use with Admin API ELB
listener. Use the certificate you created or imported.
Engines application certificate ID (ARN) The ARN of the certificate to use with Engine API ELB
listener. Use the certificate you created or imported.
Internal CA hostname The unqualified hostname for the Internal CA within the
private hosted zone.
Root CA Certificate TTL The amount of time that the Root CA certificate will be
valid before it expires. The default is 20 years (20y).
Certificate Generation Token TTL Time to live for Vault tokens issued for certificate
generation. The default is 1 year (1y).
Leaf Certificate Default TTL The default time to live for generated leaf certificates
before they expire. The default is 30 days (30d).
Leaf Certificate Max TTL The maximum time to live allowed for leaf certificate
generation requests.
Certificate Renewal Threshold The number of days before a certificate expires that it
should be renewed.
| PingAccess for AWS: Solution setup guide | 242
Certificate Renewal Schedule The schedule expression that determines how often
checks for certificate renewal should occur. For more
information, see AWS documentation for scheduled
events.
Provision PingFederate Specify whether or not you want to provision a
PingFederate instance.
• Select True to provision a PingFederate instance in
the demonstration environment.
• Select False to use an existing PingFederate
instance. If you select False, you must ensure your
PingFederate configuration meets the requirements
expected by the automation. To review the required
PingFederate setup, see PingAccess for AWS:
PingFederate environment requirements.
PingFederate DNS Name The fully qualified domain name to associate with the
internet facing PingFederate instance. This should be a
unique subdomain of the specified Public hosted zone
ID. This entry must be followed by a period.
For example: pf.my-aws-domain.com.
This field is ignored if Provision PingFederate is set to
False.
PingFederate Admin API Port The PingFederate Admin API port. Use the default of
9999.
This field is ignored if Provision PingFederate is set to
False.
PingFederate Runtime Port The PingFederate Runtime port. Use the default of
9031.
This field is ignored if Provision PingFederate is set to
False.
PingAccess Audit Logs Retention The number of days to retain CloudWatch audit logs.
PingAccess Server Logs Retention The number of days to retain CloudWatch server logs.
Lambda Logs Retention The number of days to retain CloudWatch Lambda logs.
Java version Indicates the Java JRE version expected in the S3
repository file name server-jre-8u<JavaVersion>-
linux-x64.tar.gz. For example, server-jre-8u151-linux-
x64.tar.gz.
PingAccess Version Indicates the PingAccess version
expected in the S3 repository file name
| PingAccess for AWS: Solution setup guide | 243
pingaccess-<PingAccessVersion>.zip. For
example, pingaccess-5.0.0.zip.
Note: Configuration of PingFederate Security Groups is only required if you are choosing to deploy with
a demonstration PingFederate instance by selecting "True" for the ProvisionPingFederate parameter in the
PingAccess for AWS CloudFormation template.
Create a new Security Group:
1. In AWS, navigate to Services > Compute > EC2.
2. Create a Security Group and assign it to the VPC that will include the PingAccess and PingFederate installations.
3. Add 3 Custom TCP rules and one SSH rule:
• Port Range: 9000, Source: My IP
• Port Range: 9999, Source: My IP
• Port Range: 9031, Source: My IP
• Post Range: 22, Source My IP
4. Click Create.
Important: The PingAccess for AWS solution protects your admin node availability by ensuring a new
instance of the admin node is created automatically in the event of a failure. This automated process deploys
an instance of the PingAccess admin node based on the settings specified in automation-artifacts/
<export_prefix>/pingaccess/conf/pingaccess.json.
For this reason, it is critical to your deployment that you maintain this file. Any time changes are made
to the PingAccess configuration, you must export the new configuration and replace the existing file at
automation-artifacts/<export_prefix>/pingaccess/conf/pingaccess.json. Failure
to synchronize this file could lead to unexpected results if your admin node should fail for any reason.
Access the PingAccess Administration console
To access the PingAccess Administration console in your browser, use a combination of the Admin public host name
and the PingAccess Administration port.
For example: https://pa-admin.mypublichostname.com:9000
For the demonstration environment, use the following credentials:
Username: joe
Password: 2Federate
If you are using an existing PingFederate instance, login with the credentials you created for use with the Simple
Password Credential Validator in PingAccess for AWS: PingFederate environment requirements.
Username: Administrator
Password: 2Federate
• The Private DNS hostname used by the PingAccess Admin Console and/or Engines. Obtain this in EC2 by
selecting the desired instance and viewing the Description tab.
Configure SSH connectivity
1. Add the PingAccess private key to the SSH authentication agent. Run this command from the directory containing
the private key. For example:
ssh-add -K ~/.ssh/mypingaccesskeypair.pem
2. Add a host entry to your SSH configuration for the Bastion host. You will provide a name for the entry, the public
DNS host name, and the user name used to access the host. For example, use the GNU nano editor to edit the host
file with the following command:
nano ~/.ssh/config
Host aws-bastion
Hostname mypublicbastiondns.compute.amazonaws.com
User ec2-user
ssh aws-bastion
4. Add one of more SSH host entries for the Administration or Engine nodes, as required. Use the ProxyCommand
function to route the connection through the Bastion host. For example:
Host aws-console
Hostname myinternaladmindns.compute.internal
ProxyCommand ssh -q aws-bastion nc %h 22
User ec2-user
ssh aws-console
cd /usr/local/pingaccess/log
| PingAccess for AWS: Solution setup guide | 246
nano pingaccess.log
Introduction
In addition to deploying a demonstration environment that includes a basic PingFederate instance, you can configure
the PingAccess for AWS solution to deploy with support for an existing PingFederate environment. You may choose
this installation method for test or production deployments with a PingFederate environment that is external to your
AWS VPC.
This document is a guide for administrators that describes the components the automation process is expecting to be
configured in your PingFederate environment, how to configure those components, and how to include information
about your environment to the automation.
While variations to these PingFederate requirements do exist, and while it is possible to deviate from these
instructions in some cases, this document is intended to describe a minimum configuration and, as such, these
instructions would be outside the scope of this document at this time.
At a minimum, your PingFederate environment requires the following components:
1. Install the AWS Password Credential Validator
2. Configure the AWS PCV instance
3. Configure a Simple Password Credential Validator Instance
4. Create an IdP adapter
5. Add a Persistent Grant Extended Attribute
6. Configure default scope values
7. Configure an Access Token Manager instance
8. Configure an AWS PCV Resource Owner Credentials Mapping
9. Configure an IdP adapter mapping
10. Configure an IdP Adapter Access Token mapping
11. Configure an AWS PCV Access Token mapping
12. Create an OpenID Connect policy
13. Configure the PingAccess Admin SSO OAuth client
14. Configure the Resource Owner API Client OAuth client
15. Create and (optionally) export a PingFederate certificate
10. On the Export & Summary screen, click Export to download the certificate.
11. Click Done.
12. Locate the certificate file and open in a text editor.
13. Copy and save the certificate data between the first and last lines. Do not copy the first and last lines that identify
the certificate file. You will add this data to the api.json file used by the automation.
"pingFederateCertificate": {
"alias": "PingFederate",
"fileData": "<certificate_data>"
}
Replace <certificate_data> with the data you copied and saved in Create and (optionally) export a
PingFederate certificate on page 253.
Introduction
You can configure a protected application in the PingAccess for AWS environment. This document will provide
instructions for configuring an application. These instructions are applicable for deployments that include a basic
PingFederate instance, as well as deployments that make use of an existing PingFederate environment.
These instructions assume you have successfully deployed your environment and are able to access the PingAccess
and PingFederate administration consoles.
Important: The PingAccess for AWS solution protects your admin node availability by ensuring a new
instance of the admin node is created automatically in the event of a failure. This automated process deploys
an instance of the PingAccess admin node based on the settings specified in automation-artifacts/
<export_prefix>/pingaccess/conf/pingaccess.json.
For this reason, it is critical to your deployment that you maintain this file. Any time changes are made
to the PingAccess configuration, you must export the new configuration and replace the existing file at
automation-artifacts/<export_prefix>/pingaccess/conf/pingaccess.json. Failure
to synchronize this file could lead to unexpected results if your admin node should fail for any reason.
Protect an application
This document provides the steps required to protect an application using PingAccess and PingFederate in the AWS
environment.
To protect an application, complete the following steps:
1. Configure PingFederate on page 256
2. Configure a PingAccess web application on page 256
3. Configure a PingAccess API application on page 258
4. Test the web application on page 259
5. Test the API application on page 259
Configure PingFederate
If you have deployed a basic PingFederate instance as part of the automation process, most of the configuration
is complete. Likewise, if you have deployed with an existing PingFederate instance, and meet the PingFederate
environment requirements, most of the required configuration is complete.
This document describes the steps required to create a client that will be used for the PingAccess Web Session you
will assign to a web based application in PingAccess.
To create the web session client in PingFederate:
1. Log in to the PingFederate administration console.
2. Navigate to Main > OAuth Settings > Clients and click Manage All.
3. Click Add Client.
4. Specify a Client ID. For example:
pa_wam
5. Specify a Name. For example:
PingAccessWebAccessManagement
6. Select Client Secret.
7. Generate a secret by clicking Generate Secret. Copy this secret to a secure location so that you can use it in
PingAccess configuration.
8. In the Redirection URIs field, add the OIDC callback redirect to the PingAccess server, for example:
https://mypingaccessserver.my-aws-domain.com/pa/oidc/cb
9. Click Add.
10. Select the Bypass Authorization Approval check box.
11. For the Allowed Grant Type setting, select the Authorization Code check box.
12. Click Save (x2).
PF_WAM
4. Select Encrypted JWT for Cookie Type.
5. Specify the Audience that the PA Token is applicable to, represented as a short, unique identifier between 1 and
32 characters. For example:
global
6. Specify the OpenID Connect Login Type CODE.
7. Specify the Client ID. For example, the Client ID you created is:
pa_wam
8. Specify the Client Secret you copied in Configure PingFederate on page 256.
9. Click Save.
443
5. Click Save.
Create a site
Create a site to define the location of the application that PingAccess is protecting. For more information, see Sites.
1. Navigate to Main > Sites > Sites.
2. Click Add Site.
3. Specify a Name. For example:
QuickStart
4. Specify the Target. The format for this is hostname:port. For example:
pf.my-pf-instance.com:9031
5. Select Secure and choose the Trust Any Trusted Certificate Group.
6. Click Save.
Note: If the target site cannot be contacted, the site is saved and a warning is displayed indicating the
reason the site was not reachable.
Create an application
Create an application to define the resource that PingAccess is protecting. For more information, see Applications.
1. Navigate to Main > Applications.
| PingAccess for AWS: Configure an application | 258
QuickStart
4. Specify the context at which the application is accessed at the site. For example:
/PingAccessQuickStart
5. Specify the virtual host for the application. For example:
*:443
6. Specify the application type Web and select the Web Session for the application. For example:
PF_WAM
7. Specify the application destination type Site and select the Site requests are sent to when access is granted. For
example:
QuickStart
8. Select the Require HTTPS option.
9. Select the Enabled checkbox.
10. Click Save.
Configure resources
Note: This step is only required for the demonstration environment. Your resource access requirements may
differ.
Configure application resources to allow anonymous access to the root resource and authenticated access to the /
headers resource.
1. Navigate to Main > Applications.
2. Expand the QuickStart application and click the edit button.
3. Select the Resources tab.
4. Expand the Root Resource and click the edit button.
5. Select the Anonymous checkbox and click Save.
6. Click Add Resource.
7. Enter a Name for the resource. For example: headers.
8. Enter the Path Prefix of /headers.
9. Click Save.
Create an application
Create an application to define the resource that PingAccess is protecting. For more information, see Applications.
1. Navigate to Main > Applications.
2. Click Add Application.
3. Provide a unique name for the application. For example:
QuickStart
4. Specify the context at which the application is accessed at the site. For example:
/PingAccessQuickStart/api
5. Specify the virtual host for the application. For example:
*:443
6. Specify the application type API and ensure the Protected option is selected.
7. Specify the application destination type Site and select the Site requests are sent to when access is granted. For
example:
QuickStart
8. Select the Require HTTPS option.
9. Select the Enabled checkbox.
10. Click Save.
https://app.my-aws-domain.com/PingAccessQuickStart
2. On the Web Access Management application, click Try it Now.
3. You will be prompted to authenticate. Enter the Username and Password combination included with the
QuickStart demo application: joe/2Federate.
The headers page is displayed.
https://app.my-aws-domain.com/PingAccessQuickStart
2. On the API Access Management application, click Try it Now.
| PingAccess for AWS: Configure an application | 260
Release Notes
PingAccess is a centralized point of security and access control for Web applications and APIs, serving applications
and other resources to clients outside an organization while still protecting internal interfaces from unauthorized
access. PingAccess protects applications and APIs, enabling access control and identity-based auditing on incoming
requests. Featuring a lightweight, highly scalable architecture, PingAccess complements PingFederate with
centralized session management and URL-level authorization.
These release notes summarize the changes in current and previous product updates.
Resolved issues
Ticket ID Description
PA-8706 Fixed a performance issue that is encountered when you create and assign a large
number of virtual hosts to an application.
PA-7936 Fixed an issue in the Upgrade Utility.
• Use of TLSv1.0 has been maintained for use by legacy versions of Internet Explorer. Since continued use
of TLSv1.0 is not recommended for security reasons, users should upgrade to the latest version of Internet
Explorer to make use of the more secure TLSv1.1 or TLSv1.2.
• Reverse DNS lookup on localhost fails when making back-channel calls to PingFederate.
• Engines and admin replicas do not connect to admin console if a combination of IP addresses and DNS names
are used.
• The token processor can't connect to a JWKS endpoint via SSL when an IP is used rather than a hostname. To
workaround this issue, add the hostname as the subject alt name on the key pair.
• In some cases, a session may not be invalidated when the WebSessionManagement issuer is changed.
| PingAccess release notes | 262
• When using Internet Explorer 11, you may not be able to view the full application or resource policy because
the scroll bar is missing.
• The Linux installer does not accept a configuration zip file with a space in the file name. To work around this
issue, remove the space from the file name.
Known limitations
• The PingAccess for AWS solution cannot yet support agent deployments due to a limitation in the Amazon
Elastic Load Balancer implementation.
• Internet Explorer and Firefox do not correctly support the HTML5 time tag. When using the Time Range rule,
enter time in 24-hour format.
• When installing PingAccess as a Windows service using Windows PowerShell and Java 8, the error message
"Could not find or load main class" can be safely ignored.
• POST Preservation is not supported with Safari Private Browsing.
• When using IE 11 to access the PingAccess admin console remotely, a fully qualified domain name
or IP address must be specified. For example, https://console.site.com:9000 and
https://172.17.8.252:9000 will work, while specifying only the host name, https://
console:9000, will not.
• Incorrect handling for IPv6 literals in Host header. Note that IPv6 is not currently supported.
Previous releases
To access previous release notes, select the applicable version from the table of contents.
Enhancements
PingIdentity Cloud Automation Repo
An automated cloud deployment of PingAccess for Amazon Web Services. This solution, both for customers
with and without existing AWS resources, allows administrators to easily configure a functioning environment
using PingAccess and an optional basic PingFederate deployment. The templates included with the package will
guide you through the setup of all necessary components, including the S3 bucket, EC2 instances, routing and
security parameters, and naming conventions.
For more information on deploying this solution, see the PingAccess for AWS: Solution setup guide.
Note: The PingAccess for AWS solution does not yet support agent deployments. For more
information, see Known limitations.
Zero downtime upgrades
Upgrade a cluster to PingAccess 5.0 with no downtime. This updated procedure takes advantage of new
functionality that ensures availability during the entire upgrade process without impacting existing user sessions.
To learn about the updated Zero Downtime Upgrade process, see PingAccess: Zero Downtime Upgrade.
Web + API applications
PingAccess now supports the concept of a heterogeneous application that allows configuration of both Web and
API settings. The PingAccess runtime inspects the inbound request for the presence of a web session cookie or
an OAuth token and applies the access control policy defined for the type of authentication token in the request.
Administrators can specify a default fallback type for application requests that do not include a web session
cookie or OAuth token.
in order to support export/import of configuration data across clusters with different host keys. Administrators
still have the less secure option of including a generated encryption key in the exported data. This feature can be
configured using the admin.export.encryption.mode property in run.properties.
Configurable values for this property are:
• MASTER_KEY - The host key is encrypted and included in exported data. This option requires that you
have a master key encryptor configured to encrypt and decrypt the necessary data. Customers using this
option must supply and configure the master key encryptor.
• PORTABLE_INSECURE - The encrypted host key is included in exported data. In this case, the host key
should be manually removed from data and stored safely to prevent unauthorized usage of the host key.
Resolved issues
Ticket ID Description
PA-6272 Fixed an issue where the installers did not validate administrator credentials before
continuing.
| PingAccess release notes | 264
Ticket ID Description
PA-6975 Fixed an issue where, during active sessions, PingAccess did not enforce the presence
of an access token in the PingAccess cookie when a web session configuration was
modified to require the access token.
PA-7618 Fixed an issue where the Windows installer failed to install PingAccess as a service
during an upgrade.
PA-7629 Fixed an issue where, during an upgrade, the Linux installer showed a status of
FAILED if you chose not to replace the existing service.
PA-7931 Fixed an issue where PingAccess X-Forwarded-For IP address validation was not
allowing port numbers.
PA-7958 Fixed an issue where a race condition would cause the engine to miss the auth token
key roll.
PA-7971 Fixed an issue where, during an upgrade on RHEL 7 using the Linux installer, the
install may show as FAILED due to an error starting the systemd PingAccess service.
PA-7975 Fixed an issue where Auth token management settings were not being properly
migrated during an upgrade.
PA-8056 Fixed an issue where a race condition would cause the engine to miss configuration
updates.
PA-8250 Fixed an issue where PingAccess was failing on a call to retrieve a token from the
token provider.
PA-8380 Fixed a potential security issue.
PA-8382 Fixed an issue where the upgrade would fail if a third party token provider was
enabled but not configured.
PA-8477 Fixed an issue where a disabled Site send token would cause the replaced
Authorization header field to be removed.
{
...
"policy": {
"Web": [
{
"type": "Rule",
"id": 20
}
],
"API": []
}
...
}
{
...
"policy": {
"Web": [
{
"type": "Rule",
"id": 20
}
],
"API": []
}
...
}
/adminConfig/replicaAdmins For all GET, PUT, and POST operations that return a
ReplicaAdmin or an Engine entity, the PublicKey objects
and
contained in the keys field no longer contain an id
/engines field.
In addition, the value field of PublicKey has been
renamed to jwk to better represent the fact that the
data is a JSON Web Key. The field type has also been
changed from a string to a JSON object.
Resolved issues
Ticket ID Description
PA-8706 Fixed a performance issue that is encountered when you create and assign a large
number of virtual hosts to an application.
PA-7936 Fixed an issue in the Upgrade Utility.
Resolved issues
Ticket ID Description
PA-8380 Fixed a potential security issue.
Resolved issues
| PingAccess release notes | 268
Ticket ID Description
PA-7629 Fixed an issue where, during an upgrade, the Linux installer showed a status of
FAILED if you chose not to replace the existing service.
PA-8205 Fixed a potential security issue.
PA-8248 Fixed an issue where dbuserpasswd and dbfilepasswd .sh and .bat files would fail.
PA-8253 Fixed an issue where a race condition would cause the engine or admin replica to miss
an auth token key roll or a web session key roll
PA-8254 Fixed an issue where a race condition would cause the engine to miss configuration
updates.
PA-8255 Fixed an issue where an engine data.zip could not be downloaded after a configuration
import.
Resolved issues
Ticket ID Description
PA-7632 Fixed an issue where, during an upgrade on RHEL 7 using the Linux installer, the
install may show as FAILED due to an error starting the systemd PingAccess service.
PA-7931 Fixed an issue where PingAccess X-Forwarded-For IP address validation was not
allowing port numbers.
PA-7975 Fixed an issue where Auth token management settings were not being properly
migrated during an upgrade.
Enhancements
PingAccess for Azure AD
A version of the PingAccess license is available for premium users of Microsoft's Azure AD. This license permits
the use of a limited feature set supporting integration with the Azure AD Application Proxy and provides secure
access for up to 20 legacy on-premises applications. Users are able to take advantage of the full PingAccess
feature set by purchasing a full license. To learn more, see:
• PingAccess for Azure AD overview
• Getting started with PingAccess for Azure AD
Token provider specific attribute transformation
PingAccess provides a mechanism that transforms incompatible attribute payload data received from Azure AD's
OIDC UserInfo endpoint and retrieves the display names for groups from the Azure AD Graph API.
Client certificate authentication
PingAccess now facilitates client certificate authentication with protected applications that accept client
certificates as HTTP headers. This feature works by retrieving client certificates sent by the browser during the
SSL/TLS handshake with PingAccess and adding them, through the use of identity mappings, (JWT and Header),
to the HTTP request headers sent to a site. An example scenario is using PingAccess to protect the public
interfaces of PingFederate when user authentication requires a certificate to authenticate. For more information on
PingFederate configuration, see Defining Proxy Options.
| PingAccess release notes | 269
Resolved issues
Ticket ID Description
Various This release contains multiple UI improvements and enhancements.
PA-5208 Fixed an issue where reverse DNS lookup was failing on PingAccess startup.
PA-5683 Fixed an issue where authentication requirements rules were not processing in the
correct order.
PA-6332 Fixed an issue where an OAuth scope and attribute policy would succeed on an
unprotected application when negate is set to true.
PA-6396 Fixed an issue where logouts were not being handled correctly when using a third
party token provider.
PA-6582 Fixed an issue where a warning was not issued when a rule that requires an identity
was assigned to an unprotected application.
PA-6585 Fixed an issue where nonce cookies were not being removed after unsuccessful
requests.
PA-6776 Fixed an issue where an admin was taken to the basic authentication page after their
session expired if using admin SSO.
| PingAccess release notes | 270
Ticket ID Description
PA-6884 Fixed an issue where the policy screen did not allow scrolling when using Internet
Explorer 11.
PA-6900 Fixed an issue where a value of 0 was not accepted as a valid Session Poll Interval.
PA-6965 Fixed an issue where the upgrade utility was failing when there are spaces in the path.
PA-6973 Fixed an issue where PingAccess was calculating the agent token cache TTL for a web
session incorrectly which may have resulted in an agent not consulting the PingAccess
policy server when either the PingFederate Session State Cache Interval or the Refresh
User Attributes Interval as configured for the web session had elapsed.
PA-6981 Fixed an issue where sessions were not being invalidated after changing the Web
Session Issuer.
PA-7033 Fixed an issue where no warning was displayed when modifying the Admin SSO
configuration that may have resulted in unexpected lockout.
PA-7040 Fixed an issue where a JWT identity mapping attribute with a period in its name was
not being mapped into a claim.
PA-7151, PA-7190 Fixed issues with the encoding of special characters used in searches.
PA-7350 Fixed an issue where a Client Certificate JWT claim name didn't support nested (dot
notated) formatting.
PA-7603 Fixed an issue where the installer was hanging during upgrade because the service had
not yet stopped.
Resolved issues
Ticket ID Description
PA-6929 Fixed an issue where multiple nonce cookies were created during abandoned
authentication attempts.
PA-6943 Fixed an issue where PingAccess was not encoding some data correctly when
communicating with the token endpoint.
PA-6978 Fixed an issue where rate limiting rules were not correctly enforcing the application
scoped rate limit.
PA-7035 Fixed an issue where identities were being associated with authentication requests to
anonymous resources.
PA-7038 Fixed an issue where there was no redirect or success banner following successful
object creation.
PA-7042 Fixed an issue where warnings were being included in logs when an HTTP response
write error occurs.
failover, unknown resource handling, forward proxy handling, and installer support for upgrades. For more
information, see the release notes for PingAccess 4.2.
Resolved issues
Ticket ID Description
PA-6437 Fixed an issue where some velocity variables were not present in some conditions.
PA-6551 Fixed an issue where ID Token attributes were incorrectly included in the PingAccess
cookie if Include User Info in ID Token was enabled and Cache User
Attributes is enabled in the web session.
PA-6577 Fixed an issue in Basic Administrator Authentication where the "Password change
failed" message was being displayed even when the password change succeeded.
PA-6602 Fixed an issue where some Warning messages were not being displayed on the
Policies page.
PA-6695 Fixed an issue where PingAccess was using the incorrect proxy to communicate with
PingFederate.
PA-6877 Fixed an issue where a PingAccess upgrade from release 4.0 to release 4.2.1 was
failing.
Resolved issues
Ticket ID Description
PA-6436 Fixed an issue where configured sites were unreachable after upgrade to PingAccess
4.2, build 4.2.0.6.
PA-6317 Fixed an issue where, in a clustered environment using admin SSO, if the admin
console is configured to use a proxy, and if the admin replica is not configured to use a
proxy, admin SSO would not succeed in a failover situation.
PA-6408 Fixed an issue where you could not add a new row to a content rewrite rule via the UI.
Enhancements
Improved Admin UI workflow
Improved configuration workflow that allows you to easily configure required elements without navigating away
from a page or losing information.
Certificate trust chains
This feature allows you to add or modify a certificate chain by adding or removing intermediate and root
certificates.
Audit event storage in MS SQL 2012 & 2016
Configure PingAccess to store logs in MS SQL Server 2012 & 2016.
| PingAccess release notes | 272
Resolved issues
Ticket ID Description
PA-3407 Fixed an issue that caused poor performance on reload when there are applications
with many groovy script rules.
PA-4671 Improved handling of unsupported Content-Types during POST preservation.
PA-5400 Fixed an issue where an exception was incorrectly added to logs during evaluation of
an OAuth Attribute Rule on an unprotected API application.
PA-5405 Fixed an issue where an exception was encountered by the error response handler if the
connection to PingFederate is misconfigured.
PA-5448 Fixed an issue where a session cookie was not reissued if a transaction failed.
PA-5500 Fixed an issue with the display of values when viewing an Identity Mapping in
expanded view.
PA-5502 Fixed an issue that caused upgrades to fail under certain conditions.
PA-5538 Fixed an issue where Save and Discard Changes buttons were not visible when adding
or making changes to IP Source or Host Source settings on the HTTP Requests page.
PA-5644 Fixed an issue where expired tokens were logging incorrect error messages.
PA-5791 Improved handling of errors that were occurring when trying to decrypt a state
parameter with a key that no longer exists.
PA-6027 Fixed an issue where warning messages weren't being parsed correctly.
PA-6271 Fixed an issue where upgrades were failing because the target instance admin console
was not responding.
PA-6273 Fixed an issue where runtime requests were failing when using Internet Explorer 9 or
10.
Resolved issues
| PingAccess release notes | 273
Ticket ID Description
PA-6014 Fixed an issue where the Upgrade Utility was not migrating the configuration for 3rd
party OAuth server or 3rd party OIDC provider.
PA-6213 Fixed a potential security issue.
Resolved issues
Ticket ID Description
PA-5681 Fixed an issue where Heartbeat URL displays a blank page when Detailed Response is
disabled.
PA-5828 Fixed an issue where agents using the same agent certificate would generate an
IllegalStateException when replicating to a cluster of engines.
PA-5830 Fixed an issue where Identity Mappings no longer shows multiple attributes with the
same name when there is a only difference in case.
PA-5876 Fixed an issue where the agentCacheInvalidatedResponseDuration field is incorrectly
set to 0, causing the vnd-pi-cache-invalidated header to be missing from the agent
response.
PA-5879 Fixed an issue where the vnd-pi-sub header is missing from the agent response.
Resolved issues
Ticket ID Description
PA-5665 Fixed an issue where you could not save changes to a Trusted Certificate Group.
PA-5654 Fixed an issue where upgrade would fail to migrate Authentication Requirements
Rules.
PA-5651 Fixed an issue where a new Authentication Requirements Rule could not be created
after upgrading to version 4.1.
PA-5646 Fixed an issue where RuleSets were always evaluated before Rules.
PA-5563 Fixed an issue where Admin API transaction logs were appearing in agent_audit_log
and engine_audit_log tables when using the Log4j2 JDBCAppender.
PA-5556 Fixed an issue with Log4j2 JDBCAppender where a memory leak would create out of
memory issues and log events were not added to the failover log file.
PA-5547 Fixed an issue with Engine and Agent Audit Logging where FailedRule entries were
not appearing in logs.
| PingAccess release notes | 274
Ticket ID Description
PA-5451 Fixed an issue where a change to enable Skip Hostname Verification would not take
effect until a restart of PingAccess.
Enhancements
Support for standards-based OpenID Connect provider login
PingAccess 4.1 introduces support for the use of a standards-based OpenID Connect provider as a source for
authentication tokens.
There are several requirements and prerequisites that must be fulfilled before enabling this feature, including:
• All existing applications must be disabled prior to changing the token provider
• Only Basic Authentication for the administrator console must be enabled. Administrator SSO must be
disabled.
• The third-party OpenID Connect token provider must support OpenID Connect issuer discovery
Once the token provider is switched, applications can be re-enabled, and Administrator SSO can be re-enabled.
We recommend that if Administrator SSO is provided, you enable administrative roles on the Single Sign-On tab
of the Admin Authentication configuration page and configure required Administrator Attributes to ensure
that only administrators are permitted access to the administrative console.
To change the token provider type, navigate to Settings > System > Token Provider, then click Change Token
Provider Type.
Note: This feature only works with web applications protected by PingAccess; API applications are not
supported, and cannot be enabled if they exist in the configuration.
Enable Token Introspection by navigating to Settings > System > Token Provider > OAuth Resource Server >
Use Token Introspection Endpoint.
PingFederate session timeouts can be synchronized with PingAccess
PingAccess now provides a means for PingFederate 8.2 to synchronize its session timeouts with PingAccess.
Resolved issues
Ticket ID Description
PA-4886 Fixed an issue when trying to generate a CSR for a certificate that includes a DNS
name subject alternative name that starts with a wildcard (*).
PA-4230 Fixed an issue where Agent name can be invalid Unicode characters in HTTP headers.
PA-5306 Fixed an issue when configuring sites with MutualTlsSiteAuthenticator.
| PingAccess release notes | 275
Ticket ID Description
PA-5303 Fixed an issue where the status icon no longer appears for the replica administrative
node.
PA-4892 Fixed an issue where a socket is not properly closed on error.
PA-4891 Fixed an issue where a socket is not properly closed on error.
PA-4882 Fixed an issue where the callback endpoint always returns a Forbidden when
combining a Code WebSession and the use of X-Forwarded-Host.
PA-4878 Removed libraries that are no longer in use.
PA-4866 Fixed an issue where some plugin fields were not accepting input.
PA-4610 Modified run scripts to use /dev/random for cryptographic processing.
PA-4581 Fixed an issue where a slow backend site causes PingAccess to throw an OOM (Out of
memory) exception.
PA-3429 Fixed an issue where local DB was not being set to a known state before applying
replicated configuration.
Resolved issues
Ticket ID Description
PA-5115 Resolved an issue with the automatic creation of configuration archives when the
administrator logged in if the admininstrator authentication used Admin SSO.
PA-5189 The PingAccess Upgrade Utility no longer overwrites the certificate alias attribute
with a GUID during an upgrade.
Resolved issues
Ticket ID Description
PA-4862 Corrected an issue where upgrading an environment that has Admin SSO enabled
could result in an admin authentication loop.
PA-4867 Addressed a potential security issue.
PA-4875 Fixed an issue where paginated collections of entities (sites, applications, etc.) could
cause the administrative UI to hang while reloading.
PA-4877 Addressed an issue in the Windows service configuration that could impact
performance.
PA-4889 Resolved a conflict between using the code OpenID Connect Login Type setting and
the use of X-Forwarded-Host headers. In this situation, the X-Forwarded-
| PingAccess release notes | 276
Ticket ID Description
Host value was not matching the PingFederate redirect_uri tied to the
authorization code, and authentication would fail.
Resolved issues
Ticket ID Description
PA-4639 Fixed a defect that prevented database audit logging from working.
PA-4635 Corrected an issue where changes to the Update Token Window(s) setting in the web
sessions configuration did not persist.
PA-4627 Addressed an issue that could cause the logging buffer to fill, preventing PingAccess
from processing requests.
PA-4604 For backchannel OAuth validation requests to PingFederate, the effective URL of the
request is used. This effective URL now includes the URL scheme.
PA-4423 When parsing Set-Cookie header values, PingAccess now uses the pa.uri.strict
property in run.properties in determining whether to allow or deny invalid
characters in the query.
Resolved issues
Ticket ID Description
PA-4602 Fixed an issue where editing a resource would remove policies assigned to that
resource.
PA-4598 Addressed an issue where the PingAccess Upgrade Utility would reset agent shared
secrets.
PA-4416 Modified logging so expired tokens do not generate ERROR or WARN level log
messages, since token expiration is an expected and normal operational condition.
PA-4415 Modified logging so responses from the Token Mediator Site Authenticator do not
generate an INFO level message for every transaction.
PA-4232 When a % character appears in a URI processed in some way by PingAccess, if the
character is not clearly part of a URL-encoded string, PingAccess treats it as a literal %
character, and URL-encodes it as %25 for processing.
| PingAccess release notes | 277
Enhancements
Contextual authentication
PingAccess 4.0 introduces the Authentication Requirements rule type. Authentication Requirements rules define
the type of authentication required to gain access to a web application, allowing for step-up authentication for
access to more sensitive parts of an application. Additionally, requirements can be combined with other access
control criteria to enable contextual authentication use cases, such as re-evaluating a user's authentication status
if they move to an untrusted network, or using attribute values to trigger a requirement for a stronger form of
authentication.
WebSocket security
Applications that use the WebSocket protocol can now be protected by PingAccess, allowing PingAccess access
control policies and processing rules to be used to enhance security. WebSocket-based applications are supported
by PingAccess as a gateway or when using PingAccess agents.
New administrative user interface
PingAccess 4.0 includes a completely redesigned administrative user interface, providing a uniform
administration experience for PingAccess, PingFederate, and PingOne administrators..
Auditor and administrator roles
PingAccess 4.0 introduces role-based access control for administrative interfaces. Users can be assigned to
the Administrator role, allowing full access to view and change the PingAccess configuration, or they can be
assigned to the Auditor role, which allows read-only access to the configuration. Role-based access control is
applied for both Admin SSO to the administrative UI or OAuth authentication to access the administrative API.
New REST API version
The PingAccess REST APIs have been updated to version 2, bringing a number of enhancements to that
administrative interface. See Administrative API updates on page 280 for detailed information about these
changes and how to migrate to the new API version.
New logging system
PingAccess now uses log4j2 as the logging engine. As a consequence, you will need to migrate your existing
blitz4j configuration to log4j2.
This change also brings several other enhancements, such as failover logging capabilities, improved logging
performance, and the ability to have changes to the log level applied without requiring a restart of PingAccess.
Oracle JRE support
PingAccess 4.0 removes the need to deploy the full Oracle JDK on runtime servers. Oracle JRE provides all
required services.
Windows and RHEL installers
We've now created an MSI-based installer for Windows and a CLI-based installation script for RedHat Enterprise
Linux to simplify the installation of PingAccess.
Both installers guide you through the installation decision points with a wizard-style interface, and update the
PingAccess configuration based on those decisions.
Upgrade utility
The Upgrade Utility is now the only tool required for performing upgrades, regardless of the source and target
versions of PingAccess.
The PingAccess Upgrade Utility has also been enhanced to support migrating plugins developed with the Addon
SDK.
| PingAccess release notes | 278
Other enhancements
There are numerous other usability and functionality enhancements in this release of PingAccess, including:
• In the PingAccess administrative user interface, Description fields have been added or modified such that
they are now available and consistent across agent, engine, and application entities. These fields all support
multi-line values, and entering their values is optional.
• In the PingAccess administrative console UI, the Use Target Host Header field is now cleared by default.
The recommended practice is to send the public host header to the backend site.
• The administrator is now notified in the administrative user interface when PingAccess needs to be restarted
after certain configuration changes.
• The Windows service name and description properties in PA_HOME/sbin/windows/
PingAccessService.conf is now in the following format:
Resolved issues
Ticket ID Description
PA-242 Validation for Groovy Rules that use inapplicable matchers
PA-1099 Fixed Database decryption bug
PA-1900 Fixed PingAccess Agent Protocol compliance issue
PA-1903 Scripts not using JAVA_HOME to locate Java installation
PA-2362 Token Mediation deleting 3rd party cookies
PA-2419 Fixed session expiration response
PA-2430 Fixed upgrade utility NPE when target PingAccess fails to start
PA-2696 OAuth Groovy Script Rule Is Not Executing During Response Processing
PA-2727 Improved PingAccess core processing to increase server stability.
| PingAccess release notes | 279
Ticket ID Description
PA-2815 Fixed Admin API validation issue
PA-2897 Stale post preservation cookie results in Internal Server Error from PA
PA-2899 Backup on authentication not created when using Admin SSO
PA-2900 Improved behavior when empty post body is sent to agent
PA-2907 Fixed error when OIDC token is revoked
PA-2926 Fixed admin re-authentication handling
PA-2950 Fixed NPE caused by specific Admin API call
PA-2972 Fixed NPE caused by specific Admin API call
PA-2974 PingAccess fails to start (on first attempt) on Windows
PA-2979 Fixed Admin UI NPE when importing CSR
PA-3008 Enhanced handling of values in imported keypairs to handle non-string SANs.
PA-3039 POST preservation fails with exception if *:3000 virtual host not defined
PA-3053 PingAccess linux service script doesn't work with non-root user
PA-3054 ehcache WARN level log messages in pingaccess.log on startup
PA-3101 PingFederate authorization server showing up as blank in admin UI
PA-3205 PUT requests where the request body is no longer available after an initial failure are
no longer retried.
PA-3217 Admin replica failover does not take effect until after replica restart
PA-3224 OAuth Rule Deny Returns 401 to Client but Logs in Audit Log as 403
PA-3227 Unauthenticated response connection is not closed properly
PA-3253 Web session cookie domain needs validation against associated application / virtual
hosts
PA-3293 The PingAccess Upgrade Utility now uses the address defined in the source
PingAccess server's admin.bindAddress configuration.
PA-3329 Web Session edit requires re-entry of Client Secret
PA-3359 Secrets in /sharedSecrets not obfuscated by Admin API
PA-3398 Improvements have been made to the API responses so that they're not HTML-
escaped, resolving occasional issues encountered with the configuration import and
export functionality.
PA-3454 Web Session Data integrity violation when trying to change a web session name with
one that already exists
PA-3469 500 internal server error returned if Protocol Source Header Name too long
PA-3480 Editing Rule Sets allows OAuth rules to be applied to Web Application
PA-3509 vnd-pi-resource cache grows unbounded
PA-3574 Reload race condition causes intermittent failure of reload
PA-3635 Off-by-one errors in header size and count limits
PA-3663 NPE if you try to save Rule with empty error response code
PA-3669 Introduced the pa.site.tls.sni.legacyMode configuration parameter to give the
administrator control over how SNI server_name is set.
| PingAccess release notes | 280
Ticket ID Description
PA-3692 PingAccess no longer throws an exception when POST preservation data cannot be
retrieved.
PA-4160 User is able to add the same cert multiple times to same Trusted Cert Group
PA-4197 Inline field error message not displayed
PA-4215 NPE when trying to Import CSR Response
PA-4219 Resolved an issue where POST Preservation used in conjunction with the Rewrite
Content rule, a null pointer exception could occur.
PA-4234 RuleSet allows SuccessCriteria of SuccessIfAnyOneSucceedsLastHandlesError
PA-4244 Network Range Plugin: Error Response Content-Type should be required
PA-4453 PostPreservation pi.postsrv claim is not being cleared after encoded post
PA-4504 On startup, PF back-channel failover is broken
The JWT has no signature but the JWT Consumer is configured to require one
After Admin Console cookie expiration, the administrator is prompted for basic authentication instead of SSO
The problem occurs when Admin SSO is enabled and the administrator is logged into the Admin Console, but the
access cookie has expired, for example, due to no user activity for a certain time period. In this case, the Admin
Console directs the user to the basic login prompt instead of to PingFederate for reauthentication using SSO.
Concealed plugin fields are not handled correctly in the PingAccess UI
When entering values in the Basic Authentication Site Authenticator form, if username and password values are
filled and then the username is edited again, the password value is saved as null rather than the password value
entered. This issue affects any plugin with a concealed field such as a password field.
| PingAccess release notes | 284
New login required after change to the Admin SSO page even though SSO is disabled
If the administrator changes the Client ID value in the Admin SSO page, but does not select the Enabled
checkbox, the administrator is required to authenticate again. A new login should be required only if Admin SSO
is enabled.
Admin SSO authentication fails when PingAccess 3.2 is installed with PingFederate 7.2
When PingAccess 3.2 is used with PingFederate 7.2, Admin SSO does not work.
PingAccess load balancing not enforcing stickiness
In some cases, PingAccess sticky sessions do not work with PingAccess load balancing.
Corrected a potential security vulnerability
Refer to the Security Advisory SECADV010 on the Customer Portal for more information.
Engine Enhancements
HTTP and HTTPS Engine Listeners
When multiple engine listeners are defined, PingAccess now allows the administrator to define, on a per-engine
listener basis, whether the listener uses HTTP or HTTPS.
Multiple Access Token Manager Support
In instances where multiple Access Token Managers are configured in PingFederate to provide OAuth access
tokens for API applications, the aud OAuth parameter is populated with the user-requested URI to enable
PingFederate to select the proper Access Token Manager when PingAccess makes a validation request to
PingFederate.
POST Preservation
When a user submits a POST form and the authentication session has timed out, the user is redirected to
PingFederate in order to re-authenticate. The POST form data is now preserved through this redirection, and the
| PingAccess release notes | 285
submitted form is automatically resubmitted after successful authentication. The preserved POST form data can
optionally be encrypted in the user's browser with this feature.
HTTP Header-Based Load Balancing
In addition to the Round Robin load balancing strategy, PingAccess now includes a header-based load balancing
strategy. This feature allows an external load balancer in the infrastructure to inject a header (such as X-
Target-Host) with a value for a hostname or IP address (defined as a target in the Site configuration) where
the request should be routed after PingAccess processes it.
Improvements to HTTP Security Headers Set for PingAccess Admin/Engine/Agent Listeners
PingAccess now includes a number of HTTP Security Headers for connections to the Administrative User
Interface, Engine, and Agents. These headers are defined using options in run.properties, and additional
headers can be added if desired.
Auditing Enhancements
Auditing of Unknown Resource Requests
When a client requests a resource that is not known, PingAccess does not record the request in
the audit log for performance reasons. In PingAccess 3.2, the optional configuration property
pa.auditing.unknown.resource can be enabled in order to help troubleshoot resource definition issues.
Request Tracking
Audit logging now includes a default option to include either a Tracking ID or an Access Token ID along with
an Exchange ID to make it easier to follow the audit information for a particular session and exchange in the log
files.
Administrative Enhancements
JSON-Based Export/Import of PingAccess Configuration
The existing Backup section for the administrative user interface has been replaced with a JSON-based export/
import capability, making it simpler to duplicate an environment for development purposes. The JSON-
based import functionality also simplifies the procedure to restore an environment's backup by allowing the
administrator to use the administrative user interface.
Support for Wildcards in Virtual Hosts
Earlier releases of PingAccess permitted the use of a wildcard virtual host that would match any host (for
example, *:443), but wildcards used in conjunction with an existing domain name were not supported. This
feature adds the ability to specify a wildcard host with a domain (for example, *.example.com:443).
Usability Enhancements
Several administrative interface usability enhancements are in this release, including:
• Moved Options to Advanced Sections on Some Configuration Pages
• Restructured the Settings Page
• Added Pagination, List View, and Filtering Options to Improve Administrative UI Scalability
• Test Connections to Sites and PingFederate When Saving Related Configuration
• Added Cluster Status Display Information to Clustering Configuration Page
Administrative API Name-Based Search
When using the Administrative API at /pa-admin-api/v1/ to retrieve information about named objects
(for example, Agents or Engines), a name parameter can be specified to retrieve the object with the exact name
specified.
Session Management
Session Attribute Updates and Revocation
Administrators can now configure PingAccess to periodically query PingFederate to update attributes associated
with the session, and to terminate the session based on a determination by PingFederate that the user no longer
meets the criteria used to issue a token. For example, if PingFederate is configured to return the user's attributes
only if the user account is enabled, disabling the user account can now trigger a session revocation. Additionally,
if a user is removed from a group that grants them access to an application, access can be denied for a current
session.
Support for Large Attribute Data
PingAccess now has the ability to cache user attribute data that previously was limited to the browser maximum
cookie size. When this feature is enabled, potentially large attribute values - such as group memberships - can be
used in policy decisions.
OpenID Connect / OAuth 2.0 Form Post Response Mode
Support has been added for the emerging OAuth V2 Form Post Response Mode standard. If you are upgrading
from an earlier release of PingAccess, web sessions using the existing POST method will be migrated to
x_post.
Engine
HTTP Request Configuration Source Handling
To better integrate PingAccess with configurations using reverse proxies and external load balancers, support has
been added to support arbitrary IP Source, Host Source, and Protocol Source headers. This allows headers such
as the X-Forwarded-For header to be injected by those reverse proxies in order to preserve information about
the originating host IP address, hostname, and protocol source, in order to be able to use that information to make
policy decisions. In addition, the originating host IP address is recorded in the audit logs.
HTTP Response Body Content Rewriting
The new Rewrite Content Rule allows arbitrary content rewriting to be performed on outbound content. The
content rewriting functionality can be used, for example, to rewrite URL text in HTTP responses so links a user
might click on will use the external hostname for the Application rather than an internal name. This feature can
also be constrained to particular content-types, allowing different rules to be tailored to the response Content-
Type header.
Multiple Engine Ports
The PingAccess Engine listener can now listen on multiple ports, providing greater configuration flexibility.
Specify Different PingFederate Runtime Engines for Backchannel Calls
PingAccess can now use separate hostnames and ports to perform behind-the-scenes communication with
PingFederate, providing greater flexibility in managing traffic between the two products. If more than one
backchannel communication is set up, a built-in availability profile is used to provide failover.
Administration
Configurable Signature Algorithm Generated Key Pairs
When generating a key pair, the Signature Algorithm can now be selected, and the options available are based
on the chosen Key Algorithm.
Remove Resource Ordering
The determination of the "most specific" match of an application resource path has been simplified, removing the
need for manual ordering of resources within an application. PingAccess now evaluates this based on the length
of the path requested and matching that to the Path Prefixes defined in the Application. This change also removes
the PATCH method from the /applications/{id}/resources Administrative API endpoint, since that
method was used to update the order of Resources in an Application.
Authentication Requirements for Admin SSO
Authentication Requirements can now be specified for administrator Single Sign-On. This can be used to ensure
administrative users log in with stronger forms of authentication than just a username and password.
| PingAccess release notes | 287