v0.18.5
Release 0.18.5
What's New
- Update go-openapi libraries
- xgress_edge refactor, should fix 'failed to dipsatch to fabric' errors
- Update
ziti use
command to work with main branch - MFA Support
- Fix deadlock on session close in router when connection is at capacity
- Fix issue where end of session didn't get sent in some scenarios
MFA Support
Endpoint MFA is available that is based on RFC 4226 (HOTP: An HMAC-Based One-Time Password
Algorithm) and RFC 6238 (TOTP: Time-Based One-Time Password Algorithm). These standards are
compatible with standard "Authenticator" apps such as Google Authenticator and Authy. MFA is
suggested to be used in situations where human operators are involved and additional security is
desired.
Restricting Service Access
Services can now have a Posture Check of type MFA that can be created and associated with a Service
Policy. Service Policies that are associated with an MFA Posture Check will restrict access to
services if a client has not enrolled in MFA and passed an MFA check on each login.
MFA Posture Checks support only the basic Posture Check fields:
- name - a name for the posture check
- typeId - should be "MFA"
- tags - any tags desired for this object
- roleAttributes - role attributes used to select this object from Service Policies
Example:
POST /posture-checks
{
"name": "Any MFA",
"typeId": "MFA",
"roleAttributes": ["mfa"]
}
Admin MFA Management
Admins of the Ziti Edge API can remove MFA from any user. However, they cannot enroll on behalf of
the client. The client will have to initiate MFA enrollment via their client.
Endpoints:
DELETE /identities/<id>/mfa
- remove MFA from an identityGET /identities
- has a new fieldisMfaEnabled
that is true/false based on the identity's MFA
enrollmentGET /identities/<id>/posture-data
- now includes asessionPostureData
field which is a map of
sessionId -> session posture data (including MFA status)
Example Posture Data:
{
"mac": ["03092ac3bc69", "2b6df1dc52d9"],
"domain": "mycorp.com",
"os": {
...
},
processes: [
...
],
sessionPostureData: {
"xV1442s": {
"mfa": {
"passedMfa": true
}
}
}
}
Client MFA Enrollment
Clients must individually enroll in MFA as the enrollment process includes exchanging a symmetric
key. During MFA enrollment the related MFA endpoints will return different data and HTTP status
codes based upon the state of MFA enrollment (enrollment not started, enrollment started, enrolled).
The general MFA enrollment flow is:
- Authenticate as the identity via
POST /authenticate
- Start MFA enrollment via
POST /current-identity/mfa
- Retrieve the MFA provisioning URL or QR code
GET /current-identity/mfa
GET /current-identity/mfa/qr-code
- Use the provisioning URL or QR code with an authentication app such as Google Authenticator,
Authy, etc. - Use a current code from the authenticator to
POST /current-identity/mfa/verify
with the code in
thecode
field{"code": "someCode"}
MFA Endpoints Overview:
This section is an overview for the endpoints. Each endpoint may return errors depending on in input
and MFA status.
GET /current-identity/mfa
- returns the current state of MFA enrollment or 404 Not FoundPOST /current-identity/mfa
- initiates MFA enrollment or 409 ConflictDELETE /current-identity/mfa
- remove MFA enrollment, requires a valid TOTP or recovery codeGET /current-identity/mfa/recovery-codes
- returns the current recovery codes, requires a valid
TOTP CodePOST /current-identity/mfa/recovery-codes
- regenerates recovery codes, requires a valid TOTP
codePOST /current-identity/mfa/verify
- allows MFA enrollment to be completed, requires a valid TOTP
codeGET /current-identity/mfa/qr-code
- returns a QR code for use with QR code scanner, MFA
enrollment must be startedPOST /authenticate/mfa
- allows MFA authentication checks to be completed, requires a valid TOTP
or recovery code
MFA Enrollment Not Started:
GET /current-identity/mfa
- returns HTTP status 404POST /current-identity/mfa
- start MFA enrollment, 200 OkDELETE /current-identity/mfa
- returns 404 Not FoundGET /current-identity/mfa/recovery-codes
- returns 404 Not FoundPOST /current-identity/mfa
- returns 404 Not FoundPOST /current-identity/mfa/verify
- returns 404 Not FoundGET /current-identity/mfa/qr-code
- returns 404 Not Found
MFA Enrollment Started:
GET /current-identity/mfa
- returns the current MFA enrollment and recovery codesPOST /current-identity/mfa
- returns 409 ConflictDELETE /current-identity/mfa
- aborts the current enrollment, a blankcode
may be suppliedGET /current-identity/mfa/recovery-codes
- returns 404 Not FoundPOST /current-identity/mfa
- returns HTTP status 409 ConflictPOST /current-identity/mfa/verify
- validates the suppliedcode
GET /current-identity/mfa/qr-code
- returns a QR code for use with QR code scanner in PNG format
MFA Completed:
GET /current-identity/mfa
- returns the current MFA enrollment, but not recovery codesPOST /current-identity/mfa
- returns 409 ConflictDELETE /current-identity/mfa
- removes MFA, a valid TOTP or recovery code must be suppliedGET /current-identity/mfa/recovery-codes
- shows the current recovery codes, a valid TOTP code
must be suppliedPOST /current-identity/mfa
- returns HTTP status 409 ConflictPOST /current-identity/mfa/verify
- returns HTTP status 409 ConflictGET /current-identity/mfa/qr-code
- returns 404 Not Found
Client MFA Recovery Codes
Client MFA recovery codes are generated during enrollment and can be regenerated at any time with a
valid TOTP code. Twenty codes are generated and are one time use only. Generating new codes replaces
all existing recovery codes.
To view:
GET /current-identity/mfa/recovery-codes
{
"code": "123456"
}
To Generate new codes:
POST /current-identity/mfa/recovery-codes
{
"code": "123456"
}
Authentication
During API Session authentication a new authQuery
field is returned. This field will indicate if
there are any outstanding authentication Posture Queries that need to be fulfilled before
authentication is considered complete.
When MFA authentication is required a field will now appear as an
authQuery
with the following format:
{
...
"token": "c68a187a-f4af-490c-a9dd-a09076511419",
"authQueries": [
...,
{
"typeId": "MFA",
"provider": "ZITI",
"httpMethod": "POST",
"httpUrl": "./authenticate/mfa",
"minLength": 4,
"maxLength": 6,
"format": "alphaNumeric"
},
...
]
}