conjur
Version information
This version is compatible with:
- Puppet Enterprise 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x
- Puppet >= 6.0.0 < 7.0.0
- , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'cyberark-conjur', '3.1.1'
Learn more about managing modules with a PuppetfileDocumentation
conjur
Table of Contents
- Description
- Certification Level
- Setup
- Usage
- Troubleshooting
- Reference
- Limitations
- Contributing
- Support
Table of contents generated with markdown-toc
Description
This is the official Puppet module for Conjur, a robust identity and access management platform. This module simplifies the operations involved in establishing a Conjur host identity and allows authorized Puppet nodes to fetch secrets from Conjur.
You can find our official distributable releases on Puppet Forge under cyberark/conjur
.
Certification level
This repo is a Certified project. It is officially approved to work with Conjur Open Source and Conjur Enterprise as documented. For more detailed information on our certification levels, see our community guidelines.
Setup
Setup requirements
This module requires that you have:
- Puppet v6 or equivalent EE version
- Conjur endpoint available to both the Puppet server and the Puppet nodes using this
module. Supported versions:
- Conjur Open Source v1+
- Conjur Enterprise (formerly DAP) v10+
Deprecations
Puppet v5
Puppet v5 is not supported in v3+ of this module. If you are still using this version,
please use the v2 branch of this
project or a release version <3.0.0
.
Conjur Enterprise v4
Conjur Enterprise v4 is not supported in v3+ of this module. If you are still using this
version, please use the v2 branch
of this project or a release version <3.0.0
.
Use of Host Factory Tokens
Establishment of identity using host factory tokens directly through this module is no
longer supported. Host factory tokens can still be used to create host identities, but
these identities need to be established outside of the module itself. If you are still
using the creation of identities with host factory tokens via this module, please use
the v2 branch of this project or
a release version <3.0.0
.
Installation
To install this module, run the following command on the Puppet server:
puppet module install cyberark-conjur
To install a specific version of this module (e.g. v1.2.3
), run the following
command on the Puppet server:
puppet module install cyberark-conjur --version 1.2.3
Using conjur-puppet with Conjur Open Source
Are you using this project with Conjur Open Source? Then we strongly recommend choosing the version of this project to use from the latest Conjur OSS suite release. Conjur maintainers perform additional testing on the suite release versions to ensure compatibility. When possible, upgrade your Conjur version to match the latest suite release; when using integrations, choose the latest suite release that matches your Conjur version. For any questions, please contact us on Discourse.
Conjur module basics
This module provides a conjur::secret
Deferred
function
that can be used to retrieve secrets from Conjur. Given a Conjur variable identifier and optional
identity parameters, conjur::secret
uses the node’s Conjur identity to resolve and return
the variable’s value as a Sensitive
variable.
Using a pre-provisioned identity:
$dbpass = Deferred(conjur::secret, ['production/postgres/password'])
Using a manifest-provided identity:
$sslcert = @("EOT")
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
|-EOT
$dbpass = Deferred(conjur::secret, ['production/postgres/password', {
appliance_url => "https://my.conjur.org",
account => "myaccount",
authn_login => "host/myhost",
authn_api_key => Sensitive("2z9mndg1950gcx1mcrs6w18bwnp028dqkmc34vj8gh2p500ny1qk8n"),
ssl_certificate => $sslcert
}])
Example usage
node 'server-123' {
$db_password = Deferred(conjur::secret, ['inventory/db-password'])
# Example of writing a secret to a file
file { '/tmp/creds.txt':
ensure => file,
mode => '0600',
content => $db_password,
}
# Example of using a secret in a templated file
file { '/tmp/creds.ini':
ensure => file,
mode => '0600',
content => Deferred('inline_epp', [
'password=<%= $db_password.unwrap %>',
{ 'db_password' => $db_password }
]),
}
}
Deferred
functions
This module requires the use of Puppet v6+
Deferred
functions
to ensure that the credential retrieval is fully handled on the agent. Failure
to use Deferred
around the method will result in an error:
# GOOD: Function `conjur::secret` is wrapped in `Deferred` call
Deferred(conjur::secret, ['production/postgres/password'])
# BAD: This will not work!
conjur::secret('production/postgres/password')
Since the resolution of variables is done also on the agent after the catalog is
compiled, anything that requires the value of the variable during the compilation
step (e.g. template compilation)
must also be wrapped in a Deferred
invocation.
It is also important to note that you should make sure that you invoke the
conjur::secret
function using the proper Deferred
syntax:
# GOOD: Passing the parameters as an array
Deferred(conjur::secret, ['production/postgres/password'])
# BAD: This will not work!
Deferred(conjur::secret('production/postgres/password'))
You can read more about Puppet's Deferred
functions
here.
Sensitive
type
conjur::secret
returns values wrapped in a Sensitive
data type. In
some contexts, such as string interpolation, it might cause surprising results
(interpolating to Sensitive [value redacted]
). This is intentional, as it
makes it more difficult to accidentally mishandle secrets.
To use a Sensitive
value as a string, you need to explicitly request it using
the unwrap
function. If you are setting other Puppet variables to the value of
this secret or if you are creating composite Puppet variables from it, you should
ensure that the resulting value is also wrapped in a Sensitive
type. In
particular, you should not pass unwrapped variables as parameters to Puppet methods
if you can avoid it. Many Puppet resource functions support Sensitive
data type
and handle it correctly.
$dbpass = Deferred(conjur::secret, ['production/postgres/password'])
# Use Sensitive data type to handle anything sensitive
$db_yaml = Sensitive(Deferred('inline_epp', [
'password: <%= $db_password.unwrap %>',
{ 'db_password' => $dbpass }
]))
file { '/etc/someservice/db.yaml':
ensure => file,
mode => '0600',
content => $db_yaml, # This correctly handles both Sensitive and String
}
Note: We only enforce that the API key from the Conjur configuration is marked
Sensitive, but if any other data in the function parameters is also considered
sensitive by your organization you may also wrap the whole Deferred
invocation
in the Sensitive
type to prevent accidental disclosure of the sensitive
information to the logs. Note that if you do this, you will need to unwrap the
output twice.
Usage
This module provides the conjur::secret
function described above and the conjur
class, which can be configured to establish Conjur host identity on the node running
Puppet.
Methods to establish Conjur host identity
Conjur requires an application identity for any applications, machines, or processes that need to interact with Conjur.
Please note that before getting started configuring your Puppet environment, you'll need to load a policy in Conjur to define the application identities that you will be using to authenticate to Conjur. To learn more about creating hosts, please see the Conjur documentation.
In the sections below, we'll outline the different methods of providing this module with your Conjur configuration and credentials. In those sections we'll refer often to the following Conjur configuration variables:
appliance_url
: The URL of the Conjur or Conjur Enterprise instance you are connecting to. If using Conjur Enterprise, this may be the URL of a load balancer for the cluster's Conjur Enterprise follower instances.account
- the account name for the Conjur / Conjur Enterprise instance you are connecting to.authn_login
: The identity you are using to authenticate to the Conjur / Conjur Enterprise instance. For hosts / application identities, the fully qualified path should be prefixed byhost/
, eghost/production/my-app-host
.authn_api_key
: The API key of the identity you are using to authenticate to the Conjur / Conjur Enterprise instance.ssl_certificate
: The raw PEM-encoded x509 CA certificate chain for the Conjur Enterprise instance you are connecting to, provided as a string (including newlines) or using the Puppet file resource type. This value may be obtained by running the command:$ openssl s_client -showcerts -servername [DAP_INSTANCE_DNS_NAME] \ -connect [DAP_INSTANCE_DNS_NAME]:443 < /dev/null 2> /dev/null \ | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
version
(optional): Conjur API version, defaults to 5.
Note that not all variables are required for each method of configuration.
Conjur host identity with API key
The simplest way to get started with a Conjur application identity is to create a host in Conjur and then provide its Conjur credentials to this module. There are a few ways to provide the Conjur Puppet module with these credentials and they are outlined in the following sections.
Updating the Puppet manifest
When you update the Puppet manifest to include the Conjur host identity and API key, you are configuring the Puppet server with the Conjur identity information.
In this example, after you have created a Conjur host named redis001
, you can add
its host identity information and its API key to your Deferred
invocation as an optional
hash like this:
$sslcert = @("EOT")
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
|-EOT
$dbpass = Deferred(conjur::secret, ['production/postgres/password', {
appliance_url => "https://my.conjur.org",
account => "default",
authn_login => "host/redis001",
authn_api_key => Sensitive("2z9mndg1950gcx1mcrs6w18bwnp028dqkmc34vj8gh2p500ny1qk8n"),
ssl_certificate => $sslcert
}])
Using Hiera
You can also add the Conjur identity configuration to Hiera, which provides the Conjur identity information to the Puppet server. You then would use that information to populate the host identity information:
---
lookup_options:
'^conjur::authn_api_key':
convert_to: 'Sensitive'
conjur::account: 'default'
conjur::appliance_url: 'https://my.conjur.org'
conjur::authn_login: 'host/myhost'
conjur::authn_api_key: '<REPLACE_ME>'
conjur::ssl_certificate: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Then in your manifest, you can fetch the secret like this:
$sslkey = Deferred(conjur::secret, ["domains/%{hiera('domain')}/ssl-cert", {
appliance_url => lookup('conjur::appliance_url'),
account => lookup('conjur::account'),
authn_login => lookup('conjur::authn_login'),
authn_api_key => lookup('conjur::authn_api_key'),
ssl_certificate => lookup('conjur::ssl_certificate')
}])
file { '/abslute/path/to/cert.pem':
ensure => file,
content => $sslkey,
}
Using Conjur identity files (Linux agents only)
To configure Linux agents with a Conjur host identity, you can add the Conjur host
and API key to
Conjur identity files
/etc/conjur.conf
and /etc/conjur.identity
.
Using the same redis001
host as above, you would create a conjur.conf
file that
contains:
---
account: myorg
plugins: []
appliance_url: https://conjur.mycompany.com
cert_file: "/absolute/path/to/conjur-ca.pem" # Read from the Puppet agent
# Alternative for providing the SSL cert
# ssl_certificate: |
# -----BEGIN CERTIFICATE-----
# ...
# -----END CERTIFICATE-----
Value Name | Description |
---|---|
account |
`Conjur account specified during Conjur setup. |
appliance_url |
`Conjur API endpoint. |
cert_file |
`Path to a file containing the public Conjur SSL cert on the agent. This value must be an absolute path and not a relative one. |
ssl_certificate |
Raw public Conjur SSL cert. Overwritten by the contents read from cert_file` when it is present. |
version |
Conjur API version. Defaults to 5 . |
Note: use either SslCertificate
or CertFile
but not both as cert_file
overrides the value of ssl_certificate
setting.
You will also need a conjur.identity
file that contains:
machine conjur.mycompany.com
login host/redis001
password f9yykd2r0dajz398rh32xz2fxp1tws1qq2baw4112n4am9x3ncqbk3
NOTE: The conjur.conf
and conjur.identity
files contain sensitive
Conjur connection information. Care must be taken to ensure that
the permissions for these files are set to 600
to
disallow any access to these files by unauthorized (non-root) users
on a Linux Puppet agent node.
The Conjur Puppet Module automatically checks for these files on your node and uses them if they are available.
To then fetch your credential, you would use the default form of conjur::secret
:
$dbpass = Deferred(conjur::secret, ['production/postgres/password'])
Using Windows Registry / Windows Credential Manager (Windows agents only)
To configure Windows agents with a Conjur host identity, you set up the Conjur configuration in the Windows Registry and in the Windows Credential Manager. The Registry contains the connection general information and the Credential Manager is used to store the sensitive authentication credentials.
Connection settings for Conjur are stored in the Windows Registry under the key
HKLM\Software\CyberArk\Conjur
. This is equivalent to /etc/conjur.conf
on Linux. The
values available to set are:
Value Name | Value Type | Description |
---|---|---|
Account |
REG_SZ |
Conjur account specified during Conjur setup. |
ApplianceUrl |
REG_SZ |
Conjur API endpoint. |
CertFile |
REG_SZ |
Path to a file containing the public Conjur SSL cert on the agent. This value must be an absolute path and not a relative one. |
SslCertificate |
REG_SZ |
Raw public Conjur SSL cert. Overwritten by the contents read from CertFile when it is present. |
Version |
REG_DWORD |
Conjur API version. Defaults to 5 . |
These may be set using Powershell:
> reg ADD HKLM\Software\CyberArk\Conjur /v ApplianceUrl /t REG_SZ /d https://conjur.mycompany.com
> reg ADD HKLM\Software\CyberArk\Conjur /v Version /t REG_DWORD /d 5
> reg ADD HKLM\Software\CyberArk\Conjur /v Account /t REG_SZ /d myorg
> reg ADD HKLM\Software\CyberArk\Conjur /v SslCertificate /t REG_SZ /d "-----BEGIN CERTIFICATE-----..."
Or using a .reg
registry file (SslCertificate
value cannot be set this way - you must
set this value via command line):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\CyberArk\Conjur]
"ApplianceUrl"="https://conjur.mycompany.com"
"Version"=dword:00000005
"Account"="myorg"
NOTE: It is important from a security perspective to ensure that
unauthorized, non-administrator users do not have write access to Conjur
connection settings in the Windows Registry. Disabling write access for
unauthorized users to these settings will help to prevent potential malicious
redirection of sensitive Puppet agent messages. Read-only access for
non-administrator users to Conjur connection information can be confirmed via
regedit
on the Windows Desktop, or by running the following command from a
PowerShell to confirm that only the ReadKey
flag is set:
PS C:\> Get-Acl -Path HKLM:SOFTWARE\CyberArk\Conjur | fl * | Out-String -stream | Select-String "BUIL
TIN\\Users"
AccessToString : BUILTIN\Users Allow ReadKey
Credentials for Conjur are stored in the Windows Credential Manager. The credential
Target
is the Conjur appliance URL (e.g. https://conjur.mycompany.com
).
The username is the host ID, with a host/
prefix (e.g. host/redis001
, as in previous
examples) and the credential password is the host's API key. This is equivalent to
/etc/conjur.identity
on Linux.
This may be set using Powershell:
> cmdkey /generic:https://conjur.mycompany.com /user:host/redis001 /pass
Enter the password for 'host/my-host' to connect to 'https://conjur.net/authn': #
{Prompt for API Key}
CMDKEY: Credential added successfully.
To then fetch your credential, you would use the default form of conjur::secret
:
$dbpass = Deferred(conjur::secret, ['production/postgres/password'])
Troubleshooting
For a complete guide on troubleshooting, please see TROUBLESHOOTING.md.
Reference
For a complete reference, please see REFERENCE.md.
Limitations
See metadata.json for supported platforms.
At current, the Conjur Puppet module encrypts and decrypts the Conjur access token using the Puppet server’s private/public key pair. This is known to be incompatible with using multiple compile masters.
Contributing
We welcome contributions of all kinds to this repository. For instructions on how to get started and descriptions of our development workflows, please see our contributing guide.
Support
Please note, that this is a "Partner Supported" module, which means that technical customer support for this module is solely provided by CyberArk.
Puppet does not provide support for any Partner Supported modules. For technical support please visit the Conjur channnel at CyberArk Commons.
Reference
Table of Contents
Resource types
credential
: Manages Credential Manager credentials on Windows systems.
Functions
conjur::secret
: Function to retrieve a Conjur secret
Resource types
credential
Manages Credential Manager credentials on Windows systems.
Properties
The following properties are available in the credential
type.
ensure
Valid values: present
, absent
The basic property that the resource should be in.
Default value: present
username
The identity used to authenticate to the Conjur instance
value
The API key matching the Conjur identity
Parameters
The following parameters are available in the credential
type.
provider
The specific backend to use for this credential
resource. You will seldom need to specify this --- Puppet will usually
discover the appropriate provider for your platform.
target
Conjur URL
Functions
conjur::secret
Type: Ruby 4.x API
Function to retrieve a Conjur secret
Examples
Agent-based identity invocation
Deferred(conjur::secret, ['production/postgres/password'])
Server-based identity invocation
$sslcert = @("EOT")
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
|-EOT
$dbpass = Deferred(conjur::secret, ['production/postgres/password', {
appliance_url => "https://my.conjur.org",
account => "myaccount",
authn_login => "host/myhost",
authn_api_key => Sensitive("2z9mndg1950gcx1mcrs6w18bwnp028dqkmc34vj8gh2p500ny1qk8n"),
ssl_certificate => $sslcert
}])
conjur::secret(String $variable_id, Optional[Hash] $options)
Function to retrieve a Conjur secret
Returns: Sensitive
Value of the Conjur variable.
Examples
Agent-based identity invocation
Deferred(conjur::secret, ['production/postgres/password'])
Server-based identity invocation
$sslcert = @("EOT")
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
|-EOT
$dbpass = Deferred(conjur::secret, ['production/postgres/password', {
appliance_url => "https://my.conjur.org",
account => "myaccount",
authn_login => "host/myhost",
authn_api_key => Sensitive("2z9mndg1950gcx1mcrs6w18bwnp028dqkmc34vj8gh2p500ny1qk8n"),
ssl_certificate => $sslcert
}])
variable_id
Data type: String
Conjur variable ID that you want the value of.
options
Data type: Optional[Hash]
Optional parameter specifying server identity overrides The following keys are supported in the options hash:
- appliance_url: The URL of the Conjur instance.
- account: Name of the Conjur account that contains this variable.
- authn_login: The identity you are using to authenticate to the Conjur instance.
- authn_api_key: The API key of the identity you are using to authenticate with (must be Sensitive type).
- cert_file: The absolute path to CA certificate chain for the Conjur instance on the agent. This variable overrides
ssl_certificate
. - sslcertificate: The _raw PEM-encoded x509 CA certificate chain for the Conjur instance. Overwritten by the contents read from
cert_file
when it is present. - version: Conjur API version, defaults to 5.
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Unreleased
3.1.1 - 2023-08-23
Security
- Upgrade Ruby base image version to 3.3-rc-slim cyberark/conjur-puppet#259
- Upgrade PDK and Ruby base image version to 3.2.2 cyberark/conjur-puppet#256
- Upgrade PDK and Ruby base image version cyberark/conjur-puppet#253
3.1.0 - 2020-10-08
Added
- Module now fully supports the use of
cert_file
parameter, which accepts the path to the PEM-encoded x509 CA certificate chain for Conjur. Users can supply the module with certificate path incert_file
OR with certificate contents inssl_certificate
. cyberark/conjur-puppet#105
Changed
- Conjur server errors now have better descriptions. cyberark/conjur-puppet#241
- If
authn_api_key
is not wrapped inSensitive
class, we now raise a descriptive error as to why we cannot proceed. cyberark/conjur-puppet#232 - Warnings are now logged whenever this module attempts to use a non-HTTPS endpoint. cyberark/conjur-puppet#144
3.0.0 - 2020-09-17
Added
- Secrets are now retrieved by the Puppet agent, instead of the server, using Puppet's deferred function feature. This aligns with Puppet's documented best practices. cyberark/conjur-puppet#13
- Module now follows Puppet development best practices and uses PDK for linting, unit tests, and publishing. cyberark/conjur-puppet#64
Changed
conjur::secret
now must be used as aDeferred
function. Method signature has changed as well, including providing of optional parameters as a Hash. cyberark/conjur-puppet#13 cyberark/conjur-puppet#184- When Conjur configuration cannot be resolved on the agent, we now log a warning that this is potentially a result of misconfiguration. cyberark/conjur-puppet#125
- This module now logs a warning if no certificates are parsed from the provided certificate string. cyberark/conjur-puppet#115
Fixed
- Account names with special characters that require encoding (eg.
+
,conjur::secret
function. cyberark/conjur-puppet#170
Removed
- Support for using the Conjur Puppet module with Conjur Enterprise v4. cyberark/conjur-puppet#66
- Support for using this module with Puppet v5. cyberark/conjur-puppet#104
- Support for using host factory tokens,
conjur
class,cert_file
parameter, and using server-sideconjur
class to pre-populate on-agent info. cyberark/conjur-puppet#104
2.0.6 - 2020-08-10
Deprecated
- Support for using the Conjur Puppet module with Puppet v5 is now deprecated. Support will be removed in the next major release. cyberark/conjur-puppet#180
- Support for configuring this module to exchange host factory tokens for Conjur host identities and API keys is now deprecated. You may still configure your systems to create a host using host factory, however, as long as you provide this module with the Conjur host identity and API key. cyberark/conjur-puppet#180
2.0.5 - 2020-07-28
Added
- Preliminary support for Puppet 6 with Linux agents, now including Ubuntu 18.04 and 20.04, Debian 9 and 10, and Alpine 3.9. Epic cyberark/conjur-puppet#20
Deprecated
- Support for using the Conjur Puppet module with Conjur Enterprise v4 is now
deprecated. Support will be removed in the next major release. The
conjurize
method of providing the Conjur Puppet module with its Conjur identity will also no longer be supported as of the next version. - Support for using the Conjur Puppet module with Windows Server 2008 or Debian 7 agents, since both operating systems have now reached end of life.
2.0.4 - 2020-07-20
Added
- Preliminary support for Puppet 6 with Windows agents (Server 2012 R2, Server 2016, Server 2019). Epic cyberark/conjur-puppet#20
- Support for using
cert_file
in theconjur
class orCertFile
in Windows Registry on Windows as an alternative to using the existingssl_certificate
parameter. cyberark/conjur-puppet#113
Changed
- Updated README to clarify configuration instructions. cyberark/conjur-puppet#128, PR cyberark/conjur-puppet#111, cyberark/conjur-puppet#98, cyberark/conjur-puppet#97, PR cyberark/conjur-puppet#108
Fixed
- Module no longer returns internal server errors when decrypting tokens when used with Puppet 6. cyberark/conjur-puppet#91
- Module no longer relies on Puppet 6-incompatible methods for retrieving Puppet CA chains. cyberark/conjur-puppet#44
- Module no longer reports "identity not found" on subsequent runs for nodes running with HFT-created identities, and is updated with improved logging for Windows-based configuration and credential fetching. cyberark/conjur-puppet#47
- Module no longer fails on the first run when using Conjur Host Factory tokens with Hiera. cyberark/conjur-puppet#112
2.0.3 - 2020-05-10
Changed
- We now encode the variable id before retrieving it from Conjur v5. Spaces are encoded into "%20" and slashes into "%2F". cyberark/conjur-puppet#72
2.0.2 - 2019-12-18
Added
- Update support contact info in README
2.0.1 - 2019-07-15
Added
- Update module manifest to include Puppet 5.x requirement
2.0.0 - 2019-07-08
Removed
- Remove support for Puppet older than 4.6.
Added
- Add support for Windows Puppet agents. See README.md for details.
Changed
- Change default Conjur version to 5. This a breaking change from 1.2.0.
1.2.0 - 2017-09-27
Added
- Support Conjur v5 API.
1.1.0 - 2017-05-24
Changed
- Cleanup and refactor of project files. No behavior change.
1.0.1 - 2017-03-10
Added
- Store Conjur configuration and identity on the node, if not present.
1.0.0 - 2017-03-02
Changed
- v1.0.0 is a complete revamp of the module.
- This release includes several breaking changes.
- See README.md for complete details.
0.0.4 - 2015-05-11
Fixed
- fixed another instance of the same bug
0.0.2 - 2014-09-24
Fixed
- fixed a bug in host identity manifest preventing usage of host factory
Dependencies
- puppetlabs/registry (>= 3.1.0 < 6.0.0)
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright (c) 2020 CyberArk Software Ltd. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.