管理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。
生成令牌密钥
要配置任何受支持的OAuth 2.0提供者以与Chronograf一起工作,您必须配置TOKEN_SECRET环境变量(或命令行选项)。Chronograf将使用此密钥为所有访问令牌生成JWT签名。
生成一个高熵伪随机字符串。
例如,使用OpenSSL执行此操作,请运行以下命令:
openssl rand -base64 256 | tr -d '\n'设置环境变量:
TOKEN_SECRET=<mysecret>
InfluxDB 企业集群: 如果您在高可用性配置中运行多个 Chronograf 服务器,请在每个服务器上设置 TOKEN_SECRET 环境变量,以确保用户可以保持登录状态。
JWKS 签名验证(可选)
如果OAuth提供者使用RS256签名实现OpenID连接,您需要通过USE_ID_TOKEN变量启用此功能,并提供一个JSON Web密钥集(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身份验证提供程序的配置选项。
以下支持的认证提供者的配置步骤在下面的各节中提供:
如果您还没有,您必须先生成一个令牌密钥然后再继续。
配置 GitHub 认证
按照以下步骤注册一个新的OAuth应用在GitHub上获取你的客户端ID和客户端密钥。在GitHub应用注册页面,输入以下值:
- 主页 URL: 完整的 Chronograf 服务器名称和端口。
例如,要以默认设置在本地运行应用程序,将此 URL 设置为
http://localhost:8888. - 授权回调 URL: 主页 URL 加上回调 URL 路径
/oauth/github/callback(例如,http://localhost:8888/oauth/github/callback).
- 主页 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如果您还没有,请使用您的令牌密钥设置Chronograf环境:
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,使用等效的命令行选项设置环境变量:
有关命令行选项和环境变量的详细信息,请参见 GitHub OAuth 2.0 authentication options。
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客户端ID和客户端密钥,
验证 Chronograf 是否可以通过完全合格的域名公开访问,以便 Google 可以正确地将用户重定向回应用程序。
设置用于访问 Chronograf 的 Google OAuth 2.0 凭据和 公共网址 的 Chronograf 环境变量:
export GOOGLE_CLIENT_ID=812760930421-kj6rnscmlbv49pmkgr1jq5autblc49kr.apps.googleusercontent.com export GOOGLE_CLIENT_SECRET=wwo0m29iLirM6LzHJWE84GRD export PUBLIC_URL=http://localhost:8888如果您还没有,请使用您的令牌密钥设置Chronograf环境:
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,可以使用相应的命令行选项设置上述讨论的环境变量:
有关Chronograf命令行选项和环境变量的详细信息,请参见 Google OAuth 2.0 authentication options。
可选的 Google 域名
配置Google身份验证以限制对Chronograf的访问,仅限特定域名。 设置GOOGLE_DOMAINS环境变量或--google-domains命令行选项。 使用逗号分隔多个域名。 例如,要仅允许来自biffspleasurepalace.com和savetheclocktower.com的访问,请按如下方式设置环境变量:
export GOOGLE_DOMAINS=biffspleasurepalace.com,savetheclocktower.com
配置Auth0身份验证
有关Auth0实现的详细信息,请参见 OAuth 2.0。
设置您的 Auth0 账户以获取所需的凭据。
- From the Auth0 user dashboard, click Create Application.
- Choose Regular Web Applications as the type of application and click Create.
- In the Settings tab, set Token Endpoint Authentication to None.
- Set Allowed Callback URLs to
https://www.example.com/oauth/auth0/callback(substitutingexample.comwith thePUBLIC_URLof your Chronograf instance) - Set Allowed Logout URLs to
https://www.example.com(substitutingexample.comwith thePUBLIC_URLof your Chronograf instance)
根据您的 Auth0 客户端凭据设置 Chronograf 环境变量:
AUTH0_DOMAIN(Auth0 域名)AUTH0_CLIENT_ID(Auth0 客户端 ID)AUTH0_CLIENT_SECRET(Auth0 客户端密钥)PUBLIC_URL(公共网址,用于上面的回调网址和登出网址)
如果您还没有,请使用您的令牌密钥设置Chronograf环境:
export TOKEN_SECRET=Super5uperUdn3verGu355!
或者,可以使用相应的命令行选项设置上述讨论的环境变量:
Auth0 组织(可选)
Auth0 可以根据运营商的要求进行自定义,因此它没有“组织”的官方概念。 组织在 Chronograf 中通过一个轻量级的 app_metadata 键进行支持,该键可以自动或手动插入到 Auth0 用户配置文件中。
要将用户分配到一个组织,请在用户的 app_metadata 字段中添加一个 organization 键,其值对应于用户所属的组织。
例如,您可以通过将 app_metadata 设置为 {"organization": "time-travelers"} 来将用户 Marty McFly 分配到“time-travelers”组织。
这可以通过操作员手动完成,也可以通过使用 Auth0 Rule 或 pre-user registration Auth0 Hook 自动完成。
接下来,您需要将 Chronograf AUTH0_ORGS 环境变量设置为允许的组织的以逗号分隔的列表。例如,如果您有一组用户,其 organization 键设置为 biffs-gang,还有另一组用户,其 organization 键设置为 time-travelers,您可以通过这个环境变量允许对两个组织的访问:AUTH0_ORGS=biffs-gang,time-travelers。
一个 --auth0-organizations 命令行选项也可用,但它仅限于单个组织,并且不接受像其环境变量等价物那样的以逗号分隔的列表。
配置 Heroku 认证
通过按照发布的指南获取Heroku的客户端ID和应用程序密钥 here。
根据您的Heroku客户端凭据设置Chronograf环境变量:
export HEROKU_CLIENT_ID=<client-id-from-heroku> export HEROKU_SECRET=<client-secret-from-heroku>如果您还没有,请使用您的令牌密钥设置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网络应用程序: 实现授权码流程。
在常规设置部分,找到允许的授权类型列表,只选择代表用户的客户端: 授权码选项。
在登录部分,设置 *登录重定向 URI 和 初始化登录 URI 为
http://localhost: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=http://localhost:8888 TOKEN_SECRET=secretsecretsecret GENERIC_SCOPES=openid,profile,email如果您还没有,请使用您的令牌密钥设置Chronograf环境:
export TOKEN_SECRET=Super5uperUdn3verGu355!
配置 GitLab 认证
在您的 GitLab 个人资料中, 创建一个新的 OAuth2 认证服务。
- Provide a name for your application, then enter your publicly accessible Chronograf URL with the
/oauth/gitlab/callbackpath as your GitLab callback URL. (For example,http://<your_chronograf_server>:8888/oauth/gitlab/callback.) - Click Submit to save the service details.
- Make sure your application has openid and read_user scopes.
- Provide a name for your application, then enter your publicly accessible Chronograf URL with the
复制提供的 应用程序ID 和 密钥 并设置以下环境变量:
在下面的例子中,请注意在网址中使用了
gitlab-server-example.com和chronograf-server-example.com。 这些应该被替换为访问每个服务时使用的实际网址。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 应用。 注意以下信息:
,,和。 您将需要这些来定义您的 Chronograf 环境。请确保在您的Azure应用程序设置中注册一个回复网址。 这应该与来自Chronograf的调用网址匹配。 否则,您将收到一条错误消息,说明该应用程序未注册任何回复地址。 例如,如果Chronograf的
GENERIC_NAME值配置为AzureAD,则回复网址将是http://localhost: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=http://localhost:8888注意:如果您已经配置了TLS/SSL,请修改
PUBLIC_URL以确保您正在使用HTTPS。
配置 Bitbucket 认证
- 完成指示以 在 Bitbucket Cloud 上使用 OAuth,并包含以下信息:
- 回调 URL: http://localhost:8888/oauth/bitbucket/callback
- 权限: 账户读取,电子邮件
运行以下命令为 Bitbucket 设置 Chronograf 环境变量在
/etc/default/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=http://localhost:8888 export GENERIC_NAME=bitbucket
配置Chronograf以使用任何OAuth 2.0提供者
Chronograf 可以配置为与任何 OAuth 2.0 提供者协同工作,包括上述定义的提供者,通过使用下面的通用配置选项。此外,通用提供者实现了由 Active Directory Federation Services (AD FS) 实现的 OpenID Connect (OIDC)。
在使用通用配置时,根据你的OAuth 2.0提供者,一些或所有以下环境变量(或相应的命令行选项)是必需的:
GENERIC_CLIENT_ID: 由提供者发放的应用客户端 标识符GENERIC_CLIENT_SECRET: 由提供商发出的应用程序客户端 secretGENERIC_AUTH_URL: 供应商的授权 endpoint URLGENERIC_TOKEN_URL: 提供者的令牌 端点 URL,供 Chronograf 客户端获取访问令牌使用USE_ID_TOKEN: 启用 OpenID id_token 处理JWKS_URL: 提供者的 JWKS 端点,客户端用于验证 RSA 签名GENERIC_API_URL: 提供者的 OpenID 用户信息端点 URL,供 Chronograf 请求用户数据使用GENERIC_API_KEY:OpenID UserInfo 的 JSON 查找键(已知在 Microsoft Azure 中是必需的,值为userPrincipalName)GENERIC_SCOPES: 范围 用户数据所需的,用于您的 Chronograf 实例,例如用户邮箱和 OAuth 提供者组织- 多个值必须以空格分隔,例如
user:email read:org - 这些可能因 OAuth 2.0 提供者而异
- 默认值:
user:email
- 多个值必须以空格分隔,例如
PUBLIC_URL: 用于从网页浏览器访问Chronograf的完整公共URL,即Chronograf托管的位置- 被Chronograf使用,例如,用于构建回调URL
TOKEN_SECRET: 用于验证OAuth state 响应。 (见上文)
可选环境变量
以下环境变量(及相应的命令行选项)也可供选择使用:
GENERIC_DOMAINS: 电子邮件地址必须包含的邮箱域名。GENERIC_NAME: 在回调 URL 中与PUBLIC_URL一起使用的值,例如/oauth/ /callback - 此值还用于 Chronograf 登录按钮的文本
- 默认值为
generic - 因此,例如,如果
PUBLIC_URL是https://localhost:8888并且GENERIC_NAME是其默认值,则回调 URL 将是https://localhost:8888/oauth/generic/callback,而 Chronograf 登录按钮将显示为Log in with Generic - 在使用 Chronograf 时,此值应在添加用户或创建组织映射时提供在
Provider字段中。
示例:与 AD FS 的 OIDC
请参阅 Enabling OpenID Connect with AD FS 2016 以了解服务器配置的详细步骤。
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 错误
错误[0053]
A ERRO[0053] 错误表示未找到指定用户的主要电子邮件。 用户必须拥有一个主要电子邮件。
ERRO[0053] Unable to get OAuth Group malformed email address, expected "..." to contain @ symbol
配置身份验证持续时间
默认情况下,用户身份验证有效期为 30 天,使用存储在网页浏览器中的 cookie。要配置不同的授权持续时间,请使用 AUTH_DURATION 环境变量设置持续时间。
示例:
要将认证持续时间设置为1小时,请使用以下shell命令:
export AUTH_DURATION=1h
持续时间使用 Go (golang) 时间持续时间格式,因此最大的时间单位是 h(小时)。所以要将其更改为 45 天,使用:
export AUTH_DURATION=1080h
要在每次关闭浏览器时要求重新验证,请将 AUTH_DURATION 设置为 0。这会使 cookie 变为短暂的(即“在内存中”)。
配置Chronograf以使用用户名和密码进行身份验证
Chronograf可以配置为通过用户名和密码进行身份验证(“基本认证”)。
开启基本认证访问以限制对Chronograf的HTTP请求只允许选定用户。
OAuth 2.0 是首选的身份验证方法。只有在无法使用 OAuth 2.0 集成的情况下,才使用基本身份验证。
使用基本身份验证时,所有用户均具有超级管理员权限;不执行Chronograf授权规则。有关更多信息,请参见跨组织超级管理员权限。
要启用基本身份验证,请使用 --htpasswd 标志运行 chronograf 或使用 HTPASSWD 环境变量。
chronograf --htpasswd <path to .htpasswd file>
..htpasswd文件包含用户及其密码,应该使用密码文件工具如apache2-utils创建。有关如何使用基本身份验证限制访问的更多信息,请参阅NGINX文档中的使用HTTP基本身份验证限制访问。
配置 TLS(传输层安全性)和 HTTPS
TLS(传输层安全)加密协议在Chronograf中得到支持,以提供服务器身份验证、数据机密性和数据完整性。 使用TLS可以保护服务器与Web浏览器之间的流量,并启用HTTPS的使用。
InfluxData 建议使用 HTTPS 与 Chronograf 应用程序安全地进行通信。如果您没有使用 TLS 终止代理,您可以使用 TLS 连接运行 Chronograf 服务器。
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。