blob: 7f2a4c39de38871b0017a638723e4a9075a5bbf1 [file] [log] [blame] [view]
---
title: Apache Mesos - Authentication
layout: documentation
---
# Authentication
Authentication permits only trusted entities to interact with a Mesos cluster. Authentication can be used by Mesos in three ways:
1. To require that frameworks be authenticated in order to register with the master.
2. To require that agents be authenticated in order to register with the master.
3. To require that operators be authenticated to use many [HTTP endpoints](endpoints/index.md).
Authentication is disabled by default. When authentication is enabled, operators
can configure Mesos to either use the default authentication module or to use a
_custom_ authentication module.
The default Mesos authentication module uses the
[Cyrus SASL](http://asg.web.cmu.edu/sasl/) library. SASL is a flexible
framework that allows two endpoints to authenticate with each other using a
variety of methods. By default, Mesos uses
[CRAM-MD5](https://en.wikipedia.org/wiki/CRAM-MD5) authentication.
## Credentials, Principals, and Secrets
When using the default CRAM-MD5 authentication method, an entity that wants to
authenticate with Mesos must provide a *credential*, which consists of a
*principal* and a *secret*. The principal is the identity that the entity would
like to use; the secret is an arbitrary string that is used to verify that
identity. Principals are similar to user names, while secrets are similar to
passwords.
Principals are used primarily for authentication and
[authorization](authorization.md); note that a principal is different from a
framework's *user*, which is the operating system account used by the agent to
run executors, and the framework's *[roles](roles.md)*, which are used to
determine which resources a framework can use.
## Configuration
Authentication is configured by specifying command-line flags when starting the
Mesos master and agent processes. For more information, refer to the
[configuration](configuration.md) documentation.
### Master
* `--[no-]authenticate` - If `true`, only authenticated frameworks are allowed
to register. If `false` (the default), unauthenticated frameworks are also
allowed to register.
* `--[no-]authenticate_http_readonly` - If `true`, authentication is required to
make HTTP requests to the read-only HTTP endpoints that support
authentication. If `false` (the default), these endpoints can be used without
authentication. Read-only endpoints are those which cannot be used to modify
the state of the cluster.
* `--[no-]authenticate_http_readwrite` - If `true`, authentication is required
to make HTTP requests to the read-write HTTP endpoints that support
authentication. If `false` (the default), these endpoints can be used without
authentication. Read-write endpoints are those which can be used to modify the
state of the cluster.
* `--[no-]authenticate_agents` - If `true`, only authenticated agents are
allowed to register. If `false` (the default), unauthenticated agents are also
allowed to register.
* `--authentication_v0_timeout` - The timeout within which an authentication is
expected to complete against a v0 framework or agent. This does not apply to
the v0 or v1 HTTP APIs.(default: `15secs`)
* `--authenticators` - Specifies which authenticator module to use. The default
is `crammd5`, but additional modules can be added using the `--modules`
option.
* `--http_authenticators` - Specifies which HTTP authenticator module to use.
The default is `basic` (basic HTTP authentication), but additional modules can
be added using the `--modules` option.
* `--credentials` - The path to a text file which contains a list of accepted
credentials. This may be optional depending on the authenticator being used.
### Agent
* `--authenticatee` - Analog to the master's `--authenticators` option to
specify what module to use. Defaults to `crammd5`.
* `--credential` - Just like the master's `--credentials` option except that
only one credential is allowed. This credential is used to identify the agent
to the master.
* `--[no-]authenticate_http_readonly` - If `true`, authentication is required to
make HTTP requests to the read-only HTTP endpoints that support
authentication. If `false` (the default), these endpoints can be used without
authentication. Read-only endpoints are those which cannot be used to modify
the state of the agent.
* `--[no-]authenticate_http_readwrite` - If `true`, authentication is required
to make HTTP requests to the read-write HTTP endpoints that support
authentication. If `false` (the default), these endpoints can be used without
authentication. Read-write endpoints are those which can be used to modify the
state of the agent. Note that for backward compatibility reasons, the V1
executor API is not affected by this flag.
* `--[no-]authenticate_http_executors` - If `true`, authentication is required
to make HTTP requests to the V1 executor API. If `false` (the default), that
API can be used without authentication. If this flag is `true` and custom
HTTP authenticators are not specified, then the default `JWT` authenticator is
loaded to handle executor authentication.
* `--http_authenticators` - Specifies which HTTP authenticator module to use.
The default is `basic`, but additional modules can be added using the
`--modules` option.
* `--http_credentials` - The path to a text file which contains a list (in JSON
format) of accepted credentials. This may be optional depending on the
authenticator being used.
* `--authentication_backoff_factor` - The agent will time out its authentication
with the master based on exponential backoff. The timeout will be randomly
chosen within the range `[min, min + factor*2^n]` where `n` is the number of
failed attempts. To tune these parameters, set the
`--authentication_timeout_[min|max|factor]` flags. (default: 1secs)
* `--authentication_timeout_min` - The minimum amount of time the agent waits
before retrying authenticating with the master. See
`--authentication_backoff_factor` for more details. (default: 5secs)
* `--authentication_timeout_max` - The maximum amount of time the agent waits
before retrying authenticating with the master. See
`--authentication_backoff_factor` for more details. (default: 1mins)
### Scheduler Driver
* `--authenticatee` - Analog to the master's `--authenticators` option to
specify what module to use. Defaults to `crammd5`.
* `--authentication_backoff_factor` - The scheduler will time out its
authentication with the master based on exponential backoff. The timeout will
be randomly chosen within the range `[min, min + factor*2^n]` where `n` is
the number of failed attempts. To tune these parameters, set the
`--authentication_timeout_[min|max|factor]` flags. (default: 1secs)
* `--authentication_timeout_min` - The minimum amount of time the scheduler
waits before retrying authenticating with the master. See
`--authentication_backoff_factor` for more details. (default: 5secs)
* `--authentication_timeout_max` - The maximum amount of time the scheduler
waits before retrying authenticating with the master. See
`--authentication_backoff_factor` for more details. (default: 1mins)
### Multiple HTTP Authenticators
Multiple HTTP authenticators may be loaded into the Mesos master and agent. In
order to load multiple authenticators, specify them as a comma-separated list
using the `--http_authenticators` flag. The authenticators will be called
serially, and the result of the first successful authentication attempt will be
returned.
If you wish to specify the default basic HTTP authenticator in addition to
custom authenticator modules, add the name `basic` to your authenticator list.
To specify the default JWT HTTP authenticator in addition to custom
authenticator modules, add the name `jwt` to your authenticator list.
### Executor
If HTTP executor authentication is enabled on the agent, then all requests from
HTTP executors must be authenticated. This includes the default executor, HTTP
command executors, and custom HTTP executors. By default, the agent's JSON web
token (JWT) HTTP authenticator is loaded to handle executor authentication on
both the executor and operator API endpoints. Note that command and custom
executors not using the HTTP API will remain unauthenticated.
When a secret key is loaded via the `--jwt_secret_key` flag, the agent will
generate a default JWT for each executor before it is launched. This token is
passed into the executor's environment via the
`MESOS_EXECUTOR_AUTHENTICATION_TOKEN` environment variable. In order to
authenticate with the agent, the executor should place this token into the
`Authorization` header of all its requests as follows:
Authorization: Bearer MESOS_EXECUTOR_AUTHENTICATION_TOKEN
In order to upgrade an existing cluster to require executor authentication, the
following procedure should be followed:
1. Upgrade all agents, and provide each agent with a cryptographic key via the
`--jwt_secret_key` flag. This key will be used to sign executor
authentication tokens using the HMAC-SHA256 procedure.
2. Before executor authentication can be enabled successfully, all HTTP
executors must have executor authentication tokens in their environment and
support authentication. To accomplish this, executors which were already
running before the upgrade must be restarted. This could either be done all
at once, or the cluster may be left in this intermediate state while
executors gradually turn over.
3. Once all running default/HTTP command executors have been launched by
upgraded agents, and any custom HTTP executors have been upgraded, the agent
processes can be restarted with the `--authenticate_http_executors` flag set.
This will enable required HTTP executor authentication, and since all
executors now have authentication tokens and support authentication, their
requests to the agent will authenticate successfully.
Note that HTTP executors make use of the agent operator API in order to make
nested container calls. This means that authentication of the v1 agent operator
API should not be enabled (via `--authenticate_http_readwrite`) when HTTP
executor authentication is disabled, or HTTP executors will not be able to
function correctly.
### Framework
If framework authentication is enabled, each framework must be configured to
supply authentication credentials when registering with the Mesos master. How to
configure this differs between frameworks; consult your framework's
documentation for more information.
As a framework developer, supporting authentication is straightforward: the
scheduler driver handles the details of authentication when a `Credential`
object is passed to its constructor. To enable [authorization](authorization.md)
based on the authenticated principal, the framework developer should also copy
the `Credential.principal` into `FrameworkInfo.principal` when registering.
## CRAM-MD5 Example
1. Create the master's credentials file with the following content:
{
"credentials" : [
{
"principal": "principal1",
"secret": "secret1"
},
{
"principal": "principal2",
"secret": "secret2"
}
]
}
2. Start the master using the credentials file (assuming the file is `/home/user/credentials`):
./bin/mesos-master.sh --ip=127.0.0.1 --work_dir=/var/lib/mesos --authenticate --authenticate_agents --credentials=/home/user/credentials
3. Create another file with a single credential in it (`/home/user/agent_credential`):
{
"principal": "principal1",
"secret": "secret1"
}
4. Start the agent:
./bin/mesos-agent.sh --master=127.0.0.1:5050 --credential=/home/user/agent_credential
5. Your new agent should have now successfully authenticated with the master.
6. You can test out framework authentication using one of the test frameworks
provided with Mesos as follows:
MESOS_AUTHENTICATE=true DEFAULT_PRINCIPAL=principal2 DEFAULT_SECRET=secret2 ./src/test-framework --master=127.0.0.1:5050