管理 Chronograf 安全
为增强安全性,请将 Chronograf 配置为使用 OAuth 2.0 进行身份验证和授权,并使用 TLS/HTTPS。(也提供用户名和密码的基本身份验证。)
配置 Chronograf 使用 OAuth 2.0 进行身份验证
配置 Chronograf 使用 OAuth 2.0 提供商和 JWT(JSON Web Token)来验证用户身份并启用基于角色的访问控制。
(有关 OAuth 和 JWT 的更多详细信息,请参阅 RFC 6749 和 RFC 7519。)
OAuth PKCE
Chronograf 1.9+ 中的 OAuth 配置使用 OAuth PKCE 来降低在 OAuth 令牌交换期间授权代码被截获的风险。目前不支持 PKCE 的 OAuth 集成不受影响。
禁用 OAuth PKCE 并恢复到之前的令牌交换,请使用 --oauth-no-pkce Chronograf 配置选项,或将 OAUTH_NO_PCKE 环境变量设置为 true。
生成 Token Secret
要配置任何支持的 OAuth 2.0 提供商以与 Chronograf 配合使用,您必须配置 TOKEN_SECRET 环境变量(或命令行选项)。Chronograf 将使用此密钥为所有访问令牌生成 JWT 签名。
生成一个高熵的伪随机字符串。
例如,使用 OpenSSL 完成此操作,请运行此命令
openssl rand -base64 256 | tr -d '\n'设置环境变量
TOKEN_SECRET=<mysecret>
InfluxDB Enterprise 集群: 如果您在高可用性配置中运行多个 Chronograf 服务器,请在每台服务器上设置 TOKEN_SECRET 环境变量,以确保用户能够保持登录状态。
JWKS 签名验证(可选)
如果 OAuth 提供商使用 RS256 签名实现 OpenID Connect,您需要使用 USE_ID_TOKEN 变量启用此功能,并提供一个 JSON Web Key Set(JWKS)文档(包含证书链)来验证 RSA 签名。此证书链会定期轮换(证书到期时),因此它会在需要时从 JWKS_URL 获取。
示例
export USE_ID_TOKEN=true
export JWKS_URL=https://example.com/adfs/discovery/keys设置 OAuth 提供商的配置
要在 Chronograf 中启用 OAuth 2.0 授权和身份验证,您必须设置特定于您想要使用的 OAuth 2.0 身份验证提供商的配置选项。
以下各节提供了以下受支持身份验证提供商的配置步骤
如果您还没有这样做,在继续之前,请务必 生成一个 token secret。
配置 GitHub 身份验证
按照步骤在 GitHub 上 注册新的 OAuth 应用程序 来获取您的 Client ID 和 Client Secret。在 GitHub 应用程序注册页面,输入以下值
- Homepage URL:Chronograf 服务器的完整名称和端口。例如,要在本地运行应用程序并使用默认设置,请将此 URL 设置为
https://:8888。 - Authorization callback URL:Homepage URL 加上回调 URL 路径
/oauth/github/callback(例如,https://:8888/oauth/github/callback)。
- Homepage URL:Chronograf 服务器的完整名称和端口。例如,要在本地运行应用程序并使用默认设置,请将此 URL 设置为
使用 GitHub 提供的凭据设置 Chronograf 环境变量
export GH_CLIENT_ID=<github-client-id> export GH_CLIENT_SECRET=<github-client-secret> # If using Github Enterprise export GH_URL=https://github.custom-domain.com如果您还没有这样做,请使用您的 token secret 设置 Chronograf 环境变量
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,使用等效的命令行选项设置环境变量
有关命令行选项和环境变量的详细信息,请参阅 GitHub OAuth 2.0 身份验证选项。
GitHub 组织(可选)
要要求 GitHub 组织成员身份才能验证用户,请使用 GH_ORGS 环境变量设置您的组织名称。
export GH_ORGS=biffs-gang如果用户不是指定 GitHub 组织的成员,则不会授予用户访问权限。要支持多个组织,请使用逗号分隔的列表。
export GH_ORGS=hill-valley-preservation-sociey,the-pinheads首次登录时,请确保授予对已配置组织的访问权限。OAuth 应用程序只能查看已授予访问权限的组织的成员资格。
GitHub OAuth 配置示例
# Github Enterprise base URL
export GH_URL=https://github.mydomain.com
# GitHub Client ID
export GH_CLIENT_ID=b339dd4fddd95abec9aa
# GitHub Client Secret
export GH_CLIENT_SECRET=260041897d3252c146ece6b46ba39bc1e54416dc
# Secret used to generate JWT tokens
export TOKEN_SECRET=Super5uperUdn3verGu355!
# Restrict to specific GitHub organizations
export GH_ORGS=biffs-gang配置 Google 身份验证
按照 获取 OAuth 2.0 凭据 中的步骤,通过以下方式获取所需的 Google OAuth 2.0 凭据,包括 Google Client ID 和 Client Secret:
验证 Chronograf 是否可通过完全限定域名公开访问,以便 Google 可以正确地将用户重定向回应用程序。
设置 Google OAuth 2.0 凭据以及用于访问 Chronograf 的公共 URL 的 Chronograf 环境变量
export GOOGLE_CLIENT_ID=812760930421-kj6rnscmlbv49pmkgr1jq5autblc49kr.apps.googleusercontent.com export GOOGLE_CLIENT_SECRET=wwo0m29iLirM6LzHJWE84GRD export PUBLIC_URL=https://:8888如果您还没有这样做,请使用您的 token secret 设置 Chronograf 环境变量
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,可以使用相应的命令行选项设置上述环境变量
有关 Chronograf 命令行选项和环境变量的详细信息,请参阅 Google OAuth 2.0 身份验证选项。
可选 Google 域名
配置 Google 身份验证以将 Chronograf 的访问限制在特定域名。设置 GOOGLE_DOMAINS 环境变量或 --google-domains 命令行选项。多个域名之间用逗号分隔。例如,要仅允许从 biffspleasurepalace.com 和 savetheclocktower.com 访问,请按如下方式设置环境变量
export GOOGLE_DOMAINS=biffspleasurepalace.com,savetheclocktower.com配置 Auth0 身份验证
有关 Auth0 实现的详细信息,请参阅 OAuth 2.0。
设置您的 Auth0 帐户以获取必要的凭据。
- 在 Auth0 用户仪表板中,单击创建应用程序。
- 选择常规 Web 应用程序作为应用程序类型,然后单击创建。
- 在设置选项卡中,将令牌端点身份验证设置为无。
- 将允许的回调 URL 设置为
https://www.example.com/oauth/auth0/callback(将example.com替换为 Chronograf 实例的PUBLIC_URL)。 - 将允许的注销 URL 设置为
https://www.example.com(将example.com替换为 Chronograf 实例的PUBLIC_URL)。
根据您的 Auth0 客户端凭据设置 Chronograf 环境变量
AUTH0_DOMAIN(Auth0 域名)AUTH0_CLIENT_ID(Auth0 客户端 ID)AUTH0_CLIENT_SECRET(Auth0 客户端密钥)PUBLIC_URL(公共 URL,用于上面的回调 URL 和注销 URL)
如果您还没有这样做,请使用您的 token secret 设置 Chronograf 环境变量
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,可以使用相应的命令行选项设置上述环境变量
Auth0 组织(可选)
Auth0 可根据运算符的需求进行自定义,因此它没有“组织”的官方概念。Chronograf 支持组织,使用一个轻量级的 app_metadata 键,该键可以自动或手动插入到 Auth0 用户配置文件中。
要将用户分配给组织,请在用户的 app_metadata 字段中添加一个 organization 键,其值对应于用户的组织。例如,可以通过将 app_metadata 设置为 {"organization": "time-travelers"} 来将用户 Marty McFly 分配给“time-travelers”组织。这可以由运算符手动完成,也可以通过使用 Auth0 规则或 用户注册前 Auth0 Hook 自动完成。
接下来,您需要将 Chronograf 的 AUTH0_ORGS 环境变量设置为允许组织的逗号分隔列表。例如,如果您有一组用户具有设置为 biffs-gang 的 organization 键,而另一组用户具有设置为 time-travelers 的 organization 键,则您可以使用此环境变量允许两者访问:AUTH0_ORGS=biffs-gang,time-travelers。
还提供了一个 --auth0-organizations 命令行选项,但它仅限于单个组织,并且不像其环境变量对应项那样接受逗号分隔的列表。
配置 Heroku 身份验证
通过遵循 此处发布的指南,获取 Heroku 的客户端 ID 和应用程序密钥。
根据您的 Heroku 客户端凭据设置 Chronograf 环境变量
export HEROKU_CLIENT_ID=<client-id-from-heroku> export HEROKU_SECRET=<client-secret-from-heroku>如果您还没有这样做,请使用您的 token secret 设置 Chronograf 环境变量
export TOKEN_SECRET=Super5uperUdn3verGu355!
Heroku 组织(可选)
要将访问限制为特定 Heroku 组织的成员,请使用 HEROKU_ORGS 环境变量(或关联的命令行选项)。多个值必须用逗号分隔。
例如,要允许来自 hill-valley-preservation-society 组织和 the-pinheads 组织的用户访问,请使用以下环境变量
export HEROKU_ORGS=hill-valley-preservation-sociey,the-pinheads配置 Okta 身份验证
通过遵循 Okta 文档中的步骤创建 Okta Web 应用程序:实现授权码流程。
在常规设置部分,找到允许的授权类型列表,仅选择客户端代表用户:授权码选项。
在登录部分,将*登录重定向 URI*和发起登录 URI设置为
https://:8888/oauth/okta/callback(Chronograf 的默认回调 URL)。设置以下 Chronograf 环境变量
GENERIC_NAME=okta # The client ID is provided in the "Client Credentials" section of the Okta dashboard. GENERIC_CLIENT_ID=<okta_client_ID> # The client secret is in the "Client Credentials" section of the Okta dashboard. GENERIC_CLIENT_SECRET=<okta_client_secret> GENERIC_AUTH_URL=https://dev-553212.oktapreview.com/oauth2/default/v1/authorize GENERIC_TOKEN_URL=https://dev-553212.oktapreview.com/oauth2/default/v1/token GENERIC_API_URL=https://dev-553212.oktapreview.com/oauth2/default/v1/userinfo PUBLIC_URL=https://:8888 TOKEN_SECRET=secretsecretsecret GENERIC_SCOPES=openid,profile,email如果您还没有这样做,请使用您的 token secret 设置 Chronograf 环境变量
export TOKEN_SECRET=Super5uperUdn3verGu355!
配置 GitLab 身份验证
在您的 GitLab 配置文件中,创建一个新的 OAuth2 身份验证服务。
- 为您的应用程序提供一个名称,然后输入您公开可访问的 Chronograf URL,并将
/oauth/gitlab/callback路径作为您的 GitLab 回调 URL。(例如,http://<your_chronograf_server>:8888/oauth/gitlab/callback。) - 单击提交以保存服务详细信息。
- 确保您的应用程序具有 openid 和 read_user 范围。
- 为您的应用程序提供一个名称,然后输入您公开可访问的 Chronograf URL,并将
复制提供的应用程序 ID 和密钥,并设置以下环境变量
在以下示例中,请注意 URL 中使用了
gitlab-server-example.com和chronograf-server-example.com。这些应替换为访问每个服务的实际 URL。GENERIC_NAME="gitlab" GENERIC_CLIENT_ID=<gitlab_application_id> GENERIC_CLIENT_SECRET=<gitlab_secret> GENERIC_AUTH_URL="https://gitlab.com/oauth/authorize" GENERIC_TOKEN_URL="https://gitlab.com/oauth/token" TOKEN_SECRET=<mytokensecret> GENERIC_SCOPES="api,openid,read_user" PUBLIC_URL="http://<chronograf-host>:8888" GENERIC_API_URL="https://gitlab.com/api/v3/user"等效的命令行选项是
--generic-name=gitlab --generic-client-id=<gitlab_application_id> --generic-client-secret=<gitlab_secret> --generic-auth-url=https://gitlab.com/oauth/authorize --generic-token-url=https://gitlab.com/oauth/token --token-secret=<mytokensecret> --generic-scopes=openid,read_user --generic-api-url=https://gitlab.com/api/v3/user --public-url=http://<chronograf-host>:8888/
配置 Azure Active Directory 身份验证
创建 Azure Active Directory 应用程序。请注意以下信息:
<APPLICATION-ID>、<TENANT-ID>和<APPLICATION-KEY>。您将需要这些信息来定义您的 Chronograf 环境。请务必在 Azure 应用程序设置中注册回复 URL。它必须与 Chronograf 的调用 URL 匹配。否则,您将收到一条错误消息,指出未为该应用程序注册回复地址。例如,如果 Chronograf 配置为
GENERIC_NAME值为 AzureAD,则回复 URL 将是https://:8888/oauth/AzureAD/callback。在 Azure AD 中完成应用程序配置后,您现在可以完成 Chronograf 的配置。使用您的 Azure AD 实例的元数据,导出以下环境变量
在
/etc/default/chronograf中设置以下环境变量GENERIC_TOKEN_URL=https://login.microsoftonline.com/<<TENANT-ID>>/oauth2/token TENANT=<<TENANT-ID>> GENERIC_NAME=AzureAD GENERIC_API_KEY=userPrincipalName GENERIC_SCOPES=openid GENERIC_CLIENT_ID=<<APPLICATION-ID>> GENERIC_AUTH_URL=https://login.microsoftonline.com/<<TENANT-ID>>/oauth2/authorize?resource=https://graph.windows.net GENERIC_CLIENT_SECRET=<<APPLICATION-KEY>> TOKEN_SECRET=secret GENERIC_API_URL=https://graph.windows.net/<<TENANT-ID>>/me?api-version=1.6 PUBLIC_URL=https://:8888注意:如果您配置了 TLS/SSL,请修改
PUBLIC_URL以确保您使用的是 HTTPS。
配置 Bitbucket 身份验证
- 按照 在 Bitbucket Cloud 上使用 OAuth 中的说明进行操作,并包含以下信息
- 回调 URL:https://:8888/oauth/bitbucket/callback
- 权限:帐户读取、电子邮件
运行以下命令在
/etc/default/chronograf中为 Bitbucket 设置 Chronograf 环境变量export TOKEN_SECRET=... export GENERIC_CLIENT_ID=... export GENERIC_CLIENT_SECRET=... export GENERIC_AUTH_URL=https://bitbucket.org/site/oauth2/authorize export GENERIC_TOKEN_URL=https://bitbucket.org/site/oauth2/access_token export GENERIC_API_URL=https://api.bitbucket.org/2.0/user export GENERIC_SCOPES=account export PUBLIC_URL=https://:8888 export GENERIC_NAME=bitbucket
配置 Chronograf 使用任何 OAuth 2.0 提供商
Chronograf 可以配置为与任何 OAuth 2.0 提供商(包括上面定义的提供商)配合使用,方法是使用以下通用配置选项。此外,通用提供商实现了 OpenID Connect (OIDC),如 Active Directory Federation Services (AD FS) 中的实现。
使用通用配置时,需要以下部分或全部环境变量(或相应的命令行选项)(取决于您的 OAuth 2.0 提供商)
GENERIC_CLIENT_ID:提供商颁发的应用程序客户端 标识符GENERIC_CLIENT_SECRET:提供商颁发的应用程序客户端 密钥GENERIC_AUTH_URL:提供商的授权 端点 URLGENERIC_TOKEN_URL:Chronograf 客户端用于获取访问令牌的提供商令牌 端点 URLUSE_ID_TOKEN:启用 OpenID id_token 处理JWKS_URL:客户端用于验证 RSA 签名的提供商 JWKS 端点GENERIC_API_URL:Chronograf 用于请求用户数据的提供商 OpenID UserInfo 端点 URLGENERIC_API_KEY:OpenID UserInfo 的 JSON 查找密钥(已知 Microsoft Azure 需要此项,值为userPrincipalName)GENERIC_SCOPES:Chronograf 实例所需的 用户数据范围,例如用户电子邮件和 OAuth 提供商组织- 多个值必须用空格分隔,例如
user:email read:org - 这些可能因 OAuth 2.0 提供商而异
- 默认值:
user:email
- 多个值必须用空格分隔,例如
PUBLIC_URL:从 Web 浏览器访问 Chronograf 的完整公共 URL,即 Chronograf 的托管位置- Chronograf 用它来构造回调 URL 等
TOKEN_SECRET:用于验证 OAuth 状态响应。(见上文)
可选环境变量
以下环境变量(和相应的命令行选项)也可供可选使用
GENERIC_DOMAINS:电子邮件地址必须包含的电子邮件域名。GENERIC_NAME:在回调 URL 中与PUBLIC_URL结合使用的值,例如<PUBLIC_URL>/oauth/<GENERIC_NAME>/callback- 此值也用于 Chronograf 登录按钮的文本
- 默认值为
generic - 因此,例如,如果
PUBLIC_URL是https://:8888并且GENERIC_NAME是其默认值,那么回调 URL 将是https://:8888/oauth/generic/callback,Chronograf 登录按钮将显示Log in with Generic。 - 在使用 Chronograf 时,此值应在添加用户或创建组织映射时,在“提供商”字段中提供。
示例:OIDC 与 AD FS
有关服务器配置的演练,请参阅 使用 AD FS 2016 启用 OpenID Connect。
Chronograf 的导出(例如,在 /etc/default/chronograf 中)
PUBLIC_URL="https://example.com:8888"
GENERIC_CLIENT_ID="chronograf"
GENERIC_CLIENT_SECRET="KW-TkvH7vzYeJMAKj-3T1PdHx5bxrZnoNck2KlX8"
GENERIC_AUTH_URL="https://example.com/adfs/oauth2/authorize"
GENERIC_TOKEN_URL="https://example.com/adfs/oauth2/token"
GENERIC_SCOPES="openid"
GENERIC_API_KEY="upn"
USE_ID_TOKEN="true"
JWKS_URL="https://example.com/adfs/discovery/keys"
TOKEN_SECRET="ZNh2N9toMwUVQxTVEe2ZnnMtgkh3xqKZ"请勿在 GENERIC_CLIENT_ID 中使用特殊字符,因为 AD FS 可能会在特殊字符处拆分字符串,从而导致标识符不匹配。
排查 OAuth 错误
ERRO[0053]
ERRO[0053] 错误表示未找到指定用户的首选电子邮件。用户必须有一个首选电子邮件。
ERRO[0053] Unable to get OAuth Group malformed email address, expected "..." to contain @ symbol配置身份验证时长
默认情况下,使用存储在 Web 浏览器中的 cookie,用户身份验证有效期为 30 天。要配置不同的授权时长,请使用 AUTH_DURATION 环境变量设置时长。
示例
要将身份验证时长设置为 1 小时,请使用以下 shell 命令
export AUTH_DURATION=1h时长使用 Go (golang) 时间格式,因此最大的时间单位是 h(小时)。所以要将其更改为 45 天,请使用
export AUTH_DURATION=1080h要每次关闭浏览器时都要求重新进行身份验证,请将 AUTH_DURATION 设置为 0。这将使 cookie 成为瞬时的(也称为“内存中”)。
配置 Chronograf 使用用户名和密码进行身份验证
Chronograf 可以配置为通过用户名和密码(“基本身份验证”)来验证用户。启用基本身份验证可将 HTTP 请求限制为 Chronograf 的选定用户。
OAuth 2.0 是首选的身份验证方法。仅在无法集成 OAuth 2.0 时使用基本身份验证。
使用基本身份验证时,所有用户都具有 SuperAdmin 状态;Chronograf 授权规则不强制执行。有关更多信息,请参阅 跨组织 SuperAdmin 状态。
要启用基本身份验证,请运行 chronograf 并带上 --htpasswd 标志,或使用 HTPASSWD 环境变量。
chronograf --htpasswd <path to .htpasswd file>.htpasswd 文件包含用户及其密码,应使用密码文件实用工具(如 apache2-utils)创建。有关如何使用基本身份验证限制访问的更多信息,请参阅 NGINX 文档中的 使用 HTTP 基本身份验证限制访问。
配置 TLS(传输层安全)和 HTTPS
Chronograf 支持 TLS(传输层安全)加密协议,用于提供服务器身份验证、数据保密性和数据完整性。使用 TLS 可以保护服务器与 Web 浏览器之间的通信,并启用 HTTPS 的使用。
InfluxData 建议使用 HTTPS 来安全地与 Chronograf 应用程序通信。如果您不使用 TLS 终止代理,则可以运行 Chronograf 服务器并使用 TLS 连接。
Chronograf 包含用于配置 TLS(传输层安全)证书和密钥文件的命令行和环境变量选项。使用 TLS 加密协议可以提供服务器身份验证、数据保密性和数据完整性。配置后,用户可以使用 HTTPS 安全地与您的 Chronograf 应用程序通信。
HTTPS 有助于防止恶意行为者窃取 JWT 并利用其冒充有效用户向服务器发起攻击。
配置 Chronograf 的 TLS
Chronograf 服务器具有指定证书和密钥文件的命令行和环境变量选项。服务器从这些文件中读取并解析公钥/私钥对。文件必须包含 PEM 编码的数据。
所有 Chronograf 命令行选项都有对应的环境变量。
要配置 Chronograf 以支持 TLS,请执行以下操作
使用
TLS_CERTIFICATE环境变量或--certCLI 选项指定证书文件。使用
TLS_PRIVATE_KEY环境变量或--keyCLI 选项指定密钥文件。如果 TLS 证书和密钥都在同一个文件中,请使用
TLS_CERTIFICATE环境变量(或--certCLI 选项)指定它们。(可选) 要指定允许的 TLS 密码套件,请使用
TLS_CIPHERS环境变量或--tls-ciphersCLI 选项。Chronograf 支持 Gocrypto/tls包中的所有密码套件,默认情况下允许所有密码套件。(可选) 要指定允许的最低和最高 TLS 版本,请使用
TLS_MIN_VERSION和TLS_MAX_VERSION环境变量或--tls-min-version和--tls-max-versionCLI 选项。默认情况下,允许的最低 TLS 版本是tls1.2,最高版本不限制。
使用 CLI 选项的示例
chronograf \
--cert=my.crt \
--key=my.key \
--tls-ciphers=TLS_RSA_WITH_AES_256_CBC_SHA,TLS_AES_128_GCM_SHA256 \
--tls-min-version=tls1.2 \
--tls-max-version=tls1.3使用环境变量的示例
TLS_CERTIFICATE=my.crt \
TLS_PRIVATE_KEY=my.key \
TLS_CIPHERS=TLS_RSA_WITH_AES_256_CBC_SHA,TLS_AES_128_GCM_SHA256 \
TLS_MIN_VERSION=tls1.2 \
TLS_MAX_VERSION=tls1.3 \
chronograf使用环境变量的 Docker 示例
docker run \
-v /host/path/to/certs:/certs \
-e TLS_CERTIFICATE=/certs/my.crt \
-e TLS_PRIVATE_KEY=/certs/my.key \
-e TLS_CIPHERS=TLS_RSA_WITH_AES_256_CBC_SHA,TLS_AES_128_GCM_SHA256 \
-e TLS_MIN_VERSION=tls1.2 \
-e TLS_MAX_VERSION=tls1.3 \
chronograf:1.10使用自签名证书进行测试
要测试您的设置,您可以使用自签名证书。
切勿在生产环境中使用自签名证书。
使用 OpenSSL 创建一个包含证书和密钥的单个文件
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout testing.pem -out testing.pem -subj "/CN=localhost" -days 365接下来,设置 TLS_CERTIFICATE 环境变量
export TLS_CERTIFICATE=$PWD/testing.pem运行 Chronograf
./chronograf
INFO[0000] Serving chronograf at https://[::]:8888 component=server在第一个日志消息中,您应该看到 https 而不是 http。
此页面是否有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 Chronograf 和此文档提供反馈和错误报告。要查找支持,请使用以下资源