English | 简体中文
Alibaba Cloud Credentials for Go 是帮助 GO 开发者管理凭据的工具。
本文将介绍如何获取和使用 Alibaba Cloud Credentials for Go。
使用 go get 下载安装
go get -u github.com/aliyun/credentials-go
在您开始之前,您需要注册阿里云帐户并获取您的凭证。
当您在初始化凭据客户端不传入任何参数时,Credentials工具会使用默认凭据链方式初始化客户端。默认凭据的读取逻辑请参见默认凭据链。
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main(){
provider, err := credentials.NewCredential(nil)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}
accessKeyId := credential.AccessKeyId
accessSecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
通过[用户信息管理][ak]设置 access_key,它们具有该账户完全的权限,请妥善保管。有时出于安全考虑,您不能把具有完全访问权限的主账户 AccessKey 交于一个项目的开发者使用,您可以[创建RAM子账户][ram]并为子账户[授权][permissions],使用RAM子用户的 AccessKey 来进行API调用。
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main(){
config := new(credentials.Config).
// 设置凭证类型
SetType("access_key").
// 用户 AccessKey Id
SetAccessKeyId("AccessKeyId").
// 用户 AccessKey Secret
SetAccessKeySecret("AccessKeySecret")
provider, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}
accessKeyId := credential.AccessKeyId
accessSecret := credential.AccessKeySecret
credentialType := credential.Type
fmt.Println(accessKeyId, accessSecret, credentialType)
}
通过安全令牌服务(Security Token Service,简称 STS),申请临时安全凭证(Temporary Security Credentials,简称 TSC),创建临时安全凭证。
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
// 设置凭证类型
SetType("sts").
// 临时用户 AccessKey Id
SetAccessKeyId("AccessKeyId").
// 临时用户 AccessKey Secret
SetAccessKeySecret("AccessKeySecret").
// 临时用户 Security Token
SetSecurityToken("SecurityToken")
provider, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}
accessKeyId := credential.AccessKeyId
accessSecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessSecret, securityToken, credentialType)
}
在容器服务 Kubernetes 版中设置了Worker节点RAM角色后,对应节点内的Pod中的应用也就可以像ECS上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的STS Token。但如果容器集群上部署的是不可信的应用(比如部署您的客户提交的应用,代码也没有对您开放),您可能并不希望它们能通过元数据服务获取Worker节点关联实例RAM角色的STS Token。为了避免影响云上资源的安全,同时又能让这些不可信的应用安全地获取所需的 STS Token,实现应用级别的权限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,Credentials工具通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC - OIDC角色SSO时获取扮演角色的临时身份凭证接口换取绑定角色的STS Token。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
package main
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main() {
config := new(credentials.Config).
// 设置凭证类型
SetType("oidc_role_arn").
// OIDC提供商ARN,可以通过环境变量ALIBABA_CLOUD_OIDC_PROVIDER_ARN设置OidcProviderArn
SetOIDCProviderArn("OIDCProviderArn").
// OIDC Token文件路径,可以通过环境变量ALIBABA_CLOUD_OIDC_TOKEN_FILE设置OidcTokenFilePath
SetOIDCTokenFilePath("OIDCTokenFilePath").
// RAM角色名称ARN,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
SetRoleArn("RoleArn").
// 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
SetRoleSessionName("RoleSessionName").
// 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("Policy").
// 设置session过期时间,非必填。
SetRoleSessionExpiration(3600).
// 非必填,默认为sts.aliyuncs.com,建议使用Region化的STS域名,选择地理位置更接近的Region可以保证网络连通性,Region对应的域名请参考:https://api.aliyun.com/product/Sts
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
provider, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}
accessKeyId := credential.AccessKeyId
accessSecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
通过指定[RAM角色][RAM Role],让凭证自动申请维护 STS Token。你可以通过为 Policy 赋值来限制获取到的 STS Token 的权限。
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main(){
config := new(credentials.Config).
// 设置凭证类型
SetType("ram_role_arn").
// 用户 AccessKey Id
SetAccessKeyId("AccessKeyId").
// 用户 AccessKey Secret
SetAccessKeySecret("AccessKeySecret").
// 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
SetRoleArn("RoleArn").
// 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
SetRoleSessionName("RoleSessionName").
// 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("Policy").
// 设置session过期时间,非必填。
SetRoleSessionExpiration(3600).
// 非必填,角色外部 ID,该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题。更多信息请参考:https://help.aliyun.com/zh/ram/use-cases/use-externalid-to-prevent-the-confused-deputy-problem
SetExternalId("ExternalId").
// 非必填,默认为sts.aliyuncs.com,建议使用Region化的STS域名,选择地理位置更接近的Region可以保证网络连通性,Region对应的域名请参考:https://api.aliyun.com/product/Sts
SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
provider, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}
accessKeyId := credential.AccessKeyId
accessSecret := credential.AccessKeySecret
securityToken := credential.SecurityToken
credentialType := credential.Type
fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
}
通过指定提供凭证的自定义网络服务地址,让凭证自动申请维护 STS Token。
import (
"fmt"
"github.com/aliyun/credentials-go/credentials"
)
func main(){
config := new(credentials.Config).
// 设置凭证类型
SetType("credentials_uri").
// 凭证的 URI,格式为http://local_or_remote_uri/,可以通过环境变量ALIBABA_CLOUD_CREDENTIALS_URI设置CredentialsUri
SetURL("http://127.0.0.1")
provider, err := credentials.NewCredential(config)
if err != nil {
return
}
credential, err := provider.GetCredential()
if err != nil {
return
}